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()); }
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); }
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); }
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); }