示例#1
0
        protected override string GenerateCommandLineCommands()
        {
            var prefixes     = BundleResource.SplitResourcePrefixes(ResourcePrefix);
            var intermediate = Path.Combine(IntermediateOutputPath, ToolName);
            var logicalName  = BundleResource.GetLogicalName(ProjectDir, prefixes, SourceFile, !string.IsNullOrEmpty(SessionId));
            var path         = Path.Combine(intermediate, logicalName);
            var args         = new CommandLineArgumentBuilder();
            var dir          = Path.GetDirectoryName(path);

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            OutputFile = new TaskItem(Path.ChangeExtension(path, ".air"));
            OutputFile.SetMetadata("LogicalName", Path.ChangeExtension(logicalName, ".air"));

            args.Add("-arch", "air64");
            args.Add("-emit-llvm");
            args.Add("-c");
            args.Add("-gline-tables-only");
            args.Add("-ffast-math");

            args.Add("-serialize-diagnostics");
            args.AddQuoted(Path.ChangeExtension(path, ".dia"));

            args.Add("-o");
            args.AddQuoted(Path.ChangeExtension(path, ".air"));

            args.Add(PlatformFrameworkHelper.GetMinimumVersionArgument(TargetFrameworkMoniker, SdkIsSimulator, MinimumOSVersion));

            args.AddQuoted(SourceFile.ItemSpec);

            return(args.ToString());
        }
示例#2
0
        public override bool Execute()
        {
            var processes   = new Task <Execution> [CompileInfo.Length];
            var objectFiles = new List <ITaskItem> ();

            if (ObjectFiles != null)
            {
                objectFiles.AddRange(ObjectFiles);
            }

            for (var i = 0; i < CompileInfo.Length; i++)
            {
                var info      = CompileInfo [i];
                var src       = Path.GetFullPath(info.ItemSpec);
                var arguments = new List <string> ();

                arguments.Add("clang");

                arguments.Add(PlatformFrameworkHelper.GetMinimumVersionArgument(TargetFrameworkMoniker, SdkIsSimulator, MinimumOSVersion));

                arguments.Add("-isysroot");
                arguments.Add(SdkRoot);

                if (IncludeDirectories != null)
                {
                    foreach (var inc in IncludeDirectories)
                    {
                        arguments.Add("-I" + Path.GetFullPath(inc.ItemSpec));
                    }
                }

                var args = info.GetMetadata("Arguments");
                if (!StringUtils.TryParseArguments(args, out var parsed_args, out var ex))
                {
                    Log.LogError("Could not parse the arguments '{0}': {1}", args, ex.Message);
                    return(false);
                }
                arguments.AddRange(parsed_args);

                var arch = info.GetMetadata("Arch");
                if (!string.IsNullOrEmpty(arch))
                {
                    arguments.Add("-arch");
                    arguments.Add(arch);
                }

                var outputFile = info.GetMetadata("OutputFile");
                if (string.IsNullOrEmpty(outputFile))
                {
                    outputFile = Path.ChangeExtension(src, ".o");
                }
                outputFile = Path.GetFullPath(outputFile);
                arguments.Add("-o");
                arguments.Add(outputFile);
                objectFiles.Add(new TaskItem(outputFile));

                arguments.Add("-c");
                arguments.Add(src);

                processes [i] = ExecuteAsync("xcrun", arguments, sdkDevPath: SdkDevPath);
            }

            System.Threading.Tasks.Task.WaitAll(processes);

            ObjectFiles = objectFiles.ToArray();

            return(!Log.HasLoggedErrors);
        }
示例#3
0
        public override bool Execute()
        {
            if (!Enum.TryParse(TargetArchitectures, out architectures))
            {
                Log.LogError(12, null, MSBStrings.E0012, TargetArchitectures);
                return(false);
            }

            var abis = architectures.ToArray();

            if (abis.Count != 1)
            {
                Log.LogError(7070, null, MSBStrings.E7070, /* Invalid architecture ({0}): can't link more than one architecture at a time. */ TargetArchitectures);
                return(false);
            }
            var abi = abis [0].ToNativeArchitecture();

            var arguments = new List <string> ();

            arguments.Add("clang");

            switch (Platform)
            {
            case ApplePlatform.iOS:
            case ApplePlatform.WatchOS:
            case ApplePlatform.TVOS:
            case ApplePlatform.MacOSX:
                arguments.Add(PlatformFrameworkHelper.GetMinimumVersionArgument(TargetFrameworkMoniker, SdkIsSimulator, MinimumOSVersion));
                arguments.Add("-isysroot");
                arguments.Add(SdkRoot);

                arguments.Add("-arch");
                arguments.Add(abi);

                break;

            case ApplePlatform.MacCatalyst:
                arguments.Add($"-target");
                arguments.Add($"{abi}-apple-ios{MinimumOSVersion}-macabi");
                arguments.Add("-isysroot");
                arguments.Add(SdkRoot);
                arguments.Add("-iframework");
                arguments.Add(Path.Combine(SdkRoot, "System", "iOSSupport", "System", "Library", "Frameworks"));
                arguments.Add($"-L{Path.Combine (SdkRoot, "System", "iOSSupport", "usr", "lib")}");
                break;

            default:
                throw new InvalidOperationException(string.Format(MSBStrings.InvalidPlatform, Platform));
            }

            bool hasDylibs = false;

            if (LinkWithLibraries != null)
            {
                foreach (var libSpec in LinkWithLibraries)
                {
                    var lib          = Path.GetFullPath(libSpec.ItemSpec);
                    var libExtension = Path.GetExtension(lib).ToLowerInvariant();
                    switch (libExtension)
                    {
                    case ".a":
                    case ".o":
                        var forceLoad = string.Equals(libSpec.GetMetadata("ForceLoad"), "true", StringComparison.OrdinalIgnoreCase);
                        if (forceLoad)
                        {
                            arguments.Add("-force_load");
                        }
                        arguments.Add(lib);
                        break;

                    case ".dylib":
                        arguments.Add("-L" + Path.GetDirectoryName(lib));
                        var libName = Path.GetFileNameWithoutExtension(lib);
                        if (libName.StartsWith("lib", StringComparison.Ordinal))
                        {
                            libName = libName.Substring(3);
                        }
                        arguments.Add("-l" + libName);
                        hasDylibs = true;
                        break;

                    case ".framework":
                        arguments.Add("-F" + Path.GetDirectoryName(lib));
                        arguments.Add("-framework");
                        arguments.Add(Path.GetFileNameWithoutExtension(lib));
                        break;

                    default:
                        Log.LogError($"Unknown library extension {libExtension} to link with for {lib}.");
                        return(false);
                    }
                }
            }

            if (hasDylibs)
            {
                arguments.Add("-rpath");
                arguments.Add(DylibRPath ?? "@executable_path");
            }

            if (Frameworks != null)
            {
                foreach (var fw in Frameworks)
                {
                    var is_weak   = fw.GetMetadata("IsWeak") == "true";
                    var framework = fw.ItemSpec;
                    if (framework.EndsWith(".framework", StringComparison.Ordinal))
                    {
                        // user framework, we need to pass -F to the linker so that the linker finds the user framework.
                        arguments.Add("-F");
                        arguments.Add(Path.GetDirectoryName(Path.GetFullPath(framework)));
                        framework = Path.GetFileNameWithoutExtension(framework);
                    }
                    arguments.Add(is_weak ? "-weak_framework" : "-framework");
                    arguments.Add(framework);
                }
            }

            if (ObjectFiles != null)
            {
                foreach (var obj in ObjectFiles)
                {
                    arguments.Add(Path.GetFullPath(obj.ItemSpec));
                }
            }

            arguments.AddRange(GetEmbedEntitlementsInExecutableLinkerFlags(EntitlementsInExecutable));

            arguments.Add("-o");
            arguments.Add(Path.GetFullPath(OutputFile));

            if (LinkerFlags != null)
            {
                foreach (var flag in LinkerFlags)
                {
                    arguments.Add(flag.ItemSpec);
                }
            }

            ExecuteAsync("xcrun", arguments, sdkDevPath: SdkDevPath).Wait();

            return(!Log.HasLoggedErrors);
        }
示例#4
0
        public override bool Execute()
        {
            var processes   = new Task <Execution> [CompileInfo.Length];
            var objectFiles = new List <ITaskItem> ();

            if (ObjectFiles != null)
            {
                objectFiles.AddRange(ObjectFiles);
            }

            for (var i = 0; i < CompileInfo.Length; i++)
            {
                var info      = CompileInfo [i];
                var src       = Path.GetFullPath(info.ItemSpec);
                var arguments = new List <string> ();

                arguments.Add("clang");
                arguments.Add("-g");

                var arch = info.GetMetadata("Arch");

                switch (Platform)
                {
                case ApplePlatform.iOS:
                case ApplePlatform.WatchOS:
                case ApplePlatform.TVOS:
                case ApplePlatform.MacOSX:
                    arguments.Add(PlatformFrameworkHelper.GetMinimumVersionArgument(TargetFrameworkMoniker, SdkIsSimulator, MinimumOSVersion));
                    arguments.Add("-isysroot");
                    arguments.Add(SdkRoot);

                    if (!string.IsNullOrEmpty(arch))
                    {
                        arguments.Add("-arch");
                        arguments.Add(arch);
                    }

                    break;

                case ApplePlatform.MacCatalyst:
                    arguments.Add($"-target");
                    arguments.Add($"{arch}-apple-ios{MinimumOSVersion}-macabi");
                    arguments.Add("-isystem");
                    arguments.Add(Path.Combine(SdkRoot, "System", "iOSSupport", "usr", "include"));
                    arguments.Add("-iframework");
                    arguments.Add(Path.Combine(SdkRoot, "System", "iOSSupport", "System", "Library", "Frameworks"));
                    break;

                default:
                    throw new InvalidOperationException(string.Format(MSBStrings.InvalidPlatform, Platform));
                }

                if (IncludeDirectories != null)
                {
                    foreach (var inc in IncludeDirectories)
                    {
                        arguments.Add("-I" + Path.GetFullPath(inc.ItemSpec));
                    }
                }

                var args = info.GetMetadata("Arguments");
                if (!StringUtils.TryParseArguments(args, out var parsed_args, out var ex))
                {
                    Log.LogError("Could not parse the arguments '{0}': {1}", args, ex.Message);
                    return(false);
                }
                arguments.AddRange(parsed_args);


                var outputFile = info.GetMetadata("OutputFile");
                if (string.IsNullOrEmpty(outputFile))
                {
                    outputFile = Path.ChangeExtension(src, ".o");
                }
                outputFile = Path.GetFullPath(outputFile);
                arguments.Add("-o");
                arguments.Add(outputFile);
                objectFiles.Add(new TaskItem(outputFile));

                arguments.Add("-c");
                arguments.Add(src);

                processes [i] = ExecuteAsync("xcrun", arguments, sdkDevPath: SdkDevPath);
            }

            System.Threading.Tasks.Task.WaitAll(processes);

            ObjectFiles = objectFiles.ToArray();

            return(!Log.HasLoggedErrors);
        }
        public override bool Execute()
        {
            var arguments = new List <string> ();

            arguments.Add("clang");

            arguments.Add(PlatformFrameworkHelper.GetMinimumVersionArgument(TargetFrameworkMoniker, SdkIsSimulator, MinimumOSVersion));

            arguments.Add("-isysroot");
            arguments.Add(SdkRoot);

            bool hasDylibs = false;

            if (LinkWithLibraries != null)
            {
                foreach (var libSpec in LinkWithLibraries)
                {
                    var lib          = Path.GetFullPath(libSpec.ItemSpec);
                    var libExtension = Path.GetExtension(lib).ToLowerInvariant();
                    switch (libExtension)
                    {
                    case ".a":
                        arguments.Add(lib);
                        break;

                    case ".dylib":
                        arguments.Add("-L" + Path.GetDirectoryName(lib));
                        var libName = Path.GetFileNameWithoutExtension(lib);
                        if (libName.StartsWith("lib", StringComparison.Ordinal))
                        {
                            libName = libName.Substring(3);
                        }
                        arguments.Add("-l" + libName);
                        hasDylibs = true;
                        break;

                    case ".framework":
                        arguments.Add("-F" + Path.GetDirectoryName(lib));
                        arguments.Add("-framework");
                        arguments.Add(Path.GetFileNameWithoutExtension(lib));
                        break;

                    default:
                        Log.LogError($"Unknown library extension {libExtension} to link with for {lib}.");
                        return(false);
                    }
                }
            }

            if (hasDylibs)
            {
                arguments.Add("-rpath");
                arguments.Add("@executable_path");
            }

            if (Frameworks != null)
            {
                foreach (var fw in Frameworks)
                {
                    var is_weak = fw.GetMetadata("IsWeak") == "true";
                    arguments.Add(is_weak ? "-weak_framework" : "-framework");
                    arguments.Add(fw.ItemSpec);
                }
            }

            if (ObjectFiles != null)
            {
                foreach (var obj in ObjectFiles)
                {
                    arguments.Add(Path.GetFullPath(obj.ItemSpec));
                }
            }

            arguments.Add("-o");
            arguments.Add(OutputFile);

            ExecuteAsync("xcrun", arguments, sdkDevPath: SdkDevPath).Wait();

            return(!Log.HasLoggedErrors);
        }
        public override bool Execute()
        {
            var arguments = new List <string> ();

            arguments.Add("clang");

            arguments.Add(PlatformFrameworkHelper.GetMinimumVersionArgument(TargetFrameworkMoniker, SdkIsSimulator, MinimumOSVersion));

            arguments.Add("-isysroot");
            arguments.Add(SdkRoot);

            bool hasDylibs = false;

            if (LinkWithLibraries != null)
            {
                foreach (var libSpec in LinkWithLibraries)
                {
                    var lib          = Path.GetFullPath(libSpec.ItemSpec);
                    var libExtension = Path.GetExtension(lib).ToLowerInvariant();
                    switch (libExtension)
                    {
                    case ".a":
                        var forceLoad = string.Equals(libSpec.GetMetadata("ForceLoad"), "true", StringComparison.OrdinalIgnoreCase);
                        if (forceLoad)
                        {
                            arguments.Add("-force_load");
                        }
                        arguments.Add(lib);
                        break;

                    case ".dylib":
                        arguments.Add("-L" + Path.GetDirectoryName(lib));
                        var libName = Path.GetFileNameWithoutExtension(lib);
                        if (libName.StartsWith("lib", StringComparison.Ordinal))
                        {
                            libName = libName.Substring(3);
                        }
                        arguments.Add("-l" + libName);
                        hasDylibs = true;
                        break;

                    case ".framework":
                        arguments.Add("-F" + Path.GetDirectoryName(lib));
                        arguments.Add("-framework");
                        arguments.Add(Path.GetFileNameWithoutExtension(lib));
                        break;

                    default:
                        Log.LogError($"Unknown library extension {libExtension} to link with for {lib}.");
                        return(false);
                    }
                }
            }

            if (hasDylibs)
            {
                arguments.Add("-rpath");
                arguments.Add("@executable_path");
            }

            if (Frameworks != null)
            {
                foreach (var fw in Frameworks)
                {
                    var is_weak   = fw.GetMetadata("IsWeak") == "true";
                    var framework = fw.ItemSpec;
                    if (framework.EndsWith(".framework", StringComparison.Ordinal))
                    {
                        // user framework, we need to pass -F to the linker so that the linker finds the user framework.
                        arguments.Add("-F");
                        arguments.Add(Path.GetDirectoryName(Path.GetFullPath(framework)));
                        framework = Path.GetFileNameWithoutExtension(framework);
                    }
                    arguments.Add(is_weak ? "-weak_framework" : "-framework");
                    arguments.Add(framework);
                }
            }

            if (ObjectFiles != null)
            {
                foreach (var obj in ObjectFiles)
                {
                    arguments.Add(Path.GetFullPath(obj.ItemSpec));
                }
            }

            arguments.AddRange(GetEmbedEntitlementsInExecutableLinkerFlags(EntitlementsInExecutable));

            arguments.Add("-o");
            arguments.Add(Path.GetFullPath(OutputFile));

            if (LinkerFlags != null)
            {
                foreach (var flag in LinkerFlags)
                {
                    arguments.Add(flag.ItemSpec);
                }
            }

            ExecuteAsync("xcrun", arguments, sdkDevPath: SdkDevPath).Wait();

            return(!Log.HasLoggedErrors);
        }