コード例 #1
0
        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);
        }
コード例 #2
0
 public bool IsUpToDate(string markerFile)
 {
     return(!this.ForceOutOfDate && TaskUtils.IsUpToDate(this.AllFiles, markerFile));
 }
コード例 #3
0
        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);
        }