public override bool Execute() { #if DEBUG if (System.Environment.GetEnvironmentVariable("DEBUG_TASKS") == "1") { System.Diagnostics.Debugger.Launch(); } #endif string[] idls = GetIdls(); if (idls.Length == 0) { return(true); } Directory.CreateDirectory(this.ObjDir); Directory.CreateDirectory(this.CompiledHeadersDir); Log.LogMessage($"Compiling idls..."); string vcPath = TaskUtils.GetVcDirPath(this.ScriptsDir, this.Log); if (string.IsNullOrEmpty(vcPath)) { return(false); } vcPath = vcPath.Trim(); string scriptPath = Path.Combine(this.ScriptsDir, "ConvertMidlAttributesToSalAnnotations.ps1"); string midlPath = Path.Combine(this.SdkBinDir, "x86", "midl.exe"); string umDir = Path.Combine(this.SdkIncRoot, "um"); string sharedDir = Path.Combine(this.SdkIncRoot, "shared"); string winrtDir = Path.Combine(this.SdkIncRoot, "winrt"); string commonMidlArgs = $"/out \"{this.ObjDir}\" /no_warn /DUNICODE /D_UNICODE /DWINVER=0x0A00 -D_APISET_MINWIN_VERSION=0x010F /DNTDDI_VERSION=0x0A00000B /DBUILD_UMS_ENABLED=0 /DBUILD_WOW64_ENABLED=0 /DBUILD_ARM64X_ENABLED=0 /DEXECUTABLE_WRITES_SUPPORT=0 -D_USE_DECLSPECS_FOR_SAL=1 -D_CONTROL_FLOW_GUARD_SVCTAB=1 /Di386 /D_X86_ /D_WCHAR_T_DEFINED /no_stamp /nologo /no_settings_comment /lcid 1033 -sal /win32 -target NT100 /Zp8 /I\"{umDir}\" /I\"{sharedDir}\" /I\"{winrtDir}\""; if (!string.IsNullOrEmpty(this.AdditionalIncludes)) { commonMidlArgs += $" /I\"{this.AdditionalIncludes}\""; } foreach (var idl in idls) { string fixedIdlFile = Path.Combine(this.ObjDir, Path.GetFileName(idl)); string scriptArgs = $"-File \"{scriptPath}\" -inputFileName \"{idl}\" -outputFileName \"{fixedIdlFile}\""; if (File.Exists(fixedIdlFile)) { File.Delete(fixedIdlFile); } int ret = TaskUtils.ExecuteCmd("powershell.exe", scriptArgs, out var scriptOutput, this.Log); if (ret != 0) { Log.LogError($"ClangSharpSourceToWinmd.dll failed: {scriptOutput}"); return(false); } string compiledHeader = Path.Combine(this.CompiledHeadersDir, Path.ChangeExtension(Path.GetFileName(idl), ".h")); string midlArgs = $"\"{fixedIdlFile}\" /header \"{compiledHeader}\" {commonMidlArgs}"; ret = TaskUtils.ExecuteCmd(midlPath, midlArgs, out var midlOutput, this.Log, vcPath); if (ret != 0) { Log.LogError($"midl.exe failed: {midlOutput}"); return(false); } Log.LogMessage(midlOutput); } return(true); }
public bool IsUpToDate(string markerFile) { return(!this.ForceOutOfDate && TaskUtils.IsUpToDate(this.AllFiles, markerFile)); }
private bool ProcessPartitionItem(ITaskItem partitionItem) { // TODO: Do we want to do this for all architectures? string arch = "x64"; string[] traverseFiles = GetTraverseFiles(partitionItem); string ns = partitionItem.GetMetadata("Namespace"); string partitionName = partitionItem.GetMetadata("Name"); if (string.IsNullOrEmpty(partitionName)) { partitionName = ns.Split('.').Last(); } Log.LogMessage($"Scanning partition {partitionName}..."); string partitionDir = Path.Combine(this.partitionsDir, partitionName); if (!Directory.Exists(partitionDir)) { Directory.CreateDirectory(partitionDir); } string file = partitionItem.ItemSpec; string settingsRsp = Path.Combine(partitionDir, "settings.rsp"); string currentGeneratedDir = Path.Combine(this.generatedDir, arch); if (!Directory.Exists(currentGeneratedDir)) { Directory.CreateDirectory(currentGeneratedDir); } string outputFile = Path.Combine(currentGeneratedDir, $"{partitionName}.cs"); if (File.Exists(outputFile)) { File.Delete(outputFile); } HashSet <string> includeDirHash = new HashSet <string>(); List <string> includeDirs = new List <string>(); // For sal.h, etc. includeDirs.Add(this.Win32MetadataScraperAssetsDir); if (this.AdditionalIncludes != null) { string[] dirs = this.AdditionalIncludes.Split(';'); foreach (var dir in dirs) { if (!includeDirHash.Contains(dir)) { includeDirHash.Add(dir); includeDirs.Add(dir); } } } foreach (var traverseFile in traverseFiles) { string dir = Path.GetDirectoryName(traverseFile); if (!includeDirHash.Contains(dir)) { includeDirHash.Add(dir); includeDirs.Add(dir); } } includeDirs.Add($"{this.SdkIncRoot}/shared"); includeDirs.Add($"{this.SdkIncRoot}/um"); includeDirs.Add($"{this.SdkIncRoot}/winrt"); string headerTextFile = Path.Combine(this.Win32MetadataScraperAssetsDir, "header.txt"); using (StreamWriter rspWriter = new StreamWriter(settingsRsp)) { rspWriter.WriteLine( $@"--file {file} --output {outputFile} --namespace {ns} --headerFile {headerTextFile} --include-directory"); foreach (var include in includeDirs) { rspWriter.WriteLine(include); } rspWriter.WriteLine("--traverse"); foreach (var traverseFile in traverseFiles) { rspWriter.WriteLine(traverseFile); } var exclusions = this.GetExclusions(partitionItem); if (exclusions.Any()) { rspWriter.WriteLine("--exclude"); foreach (var exclude in exclusions) { rspWriter.WriteLine(exclude); } } var remaps = this.GetRemaps(partitionItem); if (remaps.Any()) { rspWriter.WriteLine("--remap"); foreach (var remap in remaps) { rspWriter.WriteLine(remap); } } } string currentScraperOutputDir = Path.Combine(this.scraperDir, $"obj\\{arch}"); if (!Directory.Exists(currentScraperOutputDir)) { Directory.CreateDirectory(currentScraperOutputDir); } string scrapeToolOutput = Path.Combine(currentScraperOutputDir, $"{partitionName}.generation.output.txt"); StringBuilder args = new StringBuilder($"\"@{settingsRsp}\""); AddWin32Rsp(args, "baseRemap.rsp"); AddWin32Rsp(args, "baseSettings.64.rsp"); AddWin32Rsp(args, "baseSettings.rsp"); AddWin32GeneratedRsp(args, "autoTypes.generated.rsp"); AddWin32GeneratedRsp(args, "functionPointerFixups.generated.rsp"); if (this.Rsps != null) { foreach (var rspItem in this.Rsps) { var rspPath = rspItem.ItemSpec; if (!Path.IsPathRooted(rspPath)) { rspPath = Path.Combine(this.MSBuildProjectDirectory, rspPath); } args.Append($" \"@{rspPath}\""); } } int exitCode = TaskUtils.ExecuteCmd("ClangSharpPInvokeGenerator", args.ToString(), out var output, this.Log); if (output == null) { output = string.Empty; } File.WriteAllText(scrapeToolOutput, output); if (exitCode < 0 || !File.Exists(outputFile)) { Log.LogError($"ClangSharpPInvokeGenerator.exe failed, full output at {scrapeToolOutput}."); return(false); // TODO: Output errors } CopyManualItems(partitionItem, partitionName); return(true); }