public static string BuildOneStepBuildString(DProject prj, IEnumerable <string> builtObjects, ConfigurationSelector sel) { var cfg = prj.GetConfiguration(sel) as DProjectConfiguration; var target = prj.GetOutputFileName(sel); var rawArgumentString = new StringBuilder(); var s = GenAdditionalAttributes(prj.Compiler, cfg); if (!string.IsNullOrWhiteSpace(s)) { rawArgumentString.Append(s.Trim()).Append(' '); } rawArgumentString.Append(BuildArguments(cfg).OneStepBuildArguments.Trim()); if (!string.IsNullOrEmpty(cfg.ExtraCompilerArguments)) { rawArgumentString.Append(' ').Append(cfg.ExtraCompilerArguments.Trim()); } if (!string.IsNullOrEmpty(cfg.ExtraLinkerArguments)) { rawArgumentString.Append(' ').Append(PrefixedExtraLinkerFlags(cfg)); } var commonMacros = new PrjPathMacroProvider { slnPath = prj.ParentSolution != null?EnsureCorrectPathSeparators(prj.ParentSolution.BaseDirectory) : "" }; var res = FillInMacros(rawArgumentString.ToString(), new OneStepBuildArgumentMacroProvider { ObjectsStringPattern = prj.Compiler.ArgumentPatterns.ObjectFileLinkPattern, IncludesStringPattern = prj.Compiler.ArgumentPatterns.IncludePathPattern, SourceFiles = builtObjects, Includes = FillInMacros(prj.IncludePaths, commonMacros), Libraries = GetLibraries(cfg, prj.Compiler), RelativeTargetDirectory = cfg.OutputDirectory.ToRelative(prj.BaseDirectory), ObjectsDirectory = ObjectDirectory(cfg), TargetFile = target, }, commonMacros); return(res); }
BuildResult DoOneStepBuild() { var br = new BuildResult(); bool filesModified = false; // Enum files & build resource files foreach (var pf in Project.Files) { if (pf.BuildAction != BuildAction.Compile || pf.Subtype == Subtype.Directory) { continue; } DateTime dt; if (Project.LastModificationTimes.TryGetValue(pf, out dt)) { filesModified |= File.GetLastWriteTime(pf.FilePath) != dt; } else { filesModified = true; } Project.LastModificationTimes[pf] = File.GetLastWriteTime(pf.FilePath); if (pf.FilePath.Extension.EndsWith(".rc", StringComparison.OrdinalIgnoreCase)) { if (!CompileResourceScript(br, pf)) { return(br); } } else { BuiltObjects.Add(MakeRelativeToPrjBase(pf.FilePath)); } } // Build argument string var target = Project.GetOutputFileName(BuildConfig.Selector); if (!filesModified && Project.EnableIncrementalLinking && File.Exists(target)) { monitor.ReportSuccess("Build successful! - No new linkage needed"); monitor.Step(1); return(br); } var rawArgumentString = new StringBuilder(); if (!string.IsNullOrEmpty(AdditionalCompilerAttributes)) { rawArgumentString.Append(AdditionalCompilerAttributes.Trim()).Append(' '); } rawArgumentString.Append(BuildArguments.OneStepBuildArguments.Trim()); if (!string.IsNullOrEmpty(BuildConfig.ExtraCompilerArguments)) { rawArgumentString.Append(' ').Append(BuildConfig.ExtraCompilerArguments.Trim()); } if (!string.IsNullOrEmpty(BuildConfig.ExtraLinkerArguments)) { rawArgumentString.Append(' ').Append(PrefixedExtraLinkerFlags); } var argumentString = FillInMacros(rawArgumentString.ToString(), new OneStepBuildArgumentMacroProvider { ObjectsStringPattern = Compiler.ArgumentPatterns.ObjectFileLinkPattern, IncludesStringPattern = Compiler.ArgumentPatterns.IncludePathPattern, SourceFiles = BuiltObjects, Includes = FillCommonMacros(Project.IncludePaths), Libraries = GetLibraries(BuildConfig, Compiler), RelativeTargetDirectory = BuildConfig.OutputDirectory, ObjectsDirectory = ObjectDirectory, TargetFile = target, }, commonMacros); // Execute the compiler var stdOut = ""; var stdError = ""; var linkerExecutable = Compiler.SourceCompilerCommand; if (!Path.IsPathRooted(linkerExecutable) && !string.IsNullOrEmpty(Compiler.BinPath)) { linkerExecutable = Path.Combine(Compiler.BinPath, LinkTargetCfg.Linker); if (!File.Exists(linkerExecutable)) { linkerExecutable = LinkTargetCfg.Linker; } } monitor.Log.WriteLine("Current dictionary: " + Project.BaseDirectory); string cmdLineFile; HandleOverLongArgumentStrings(Compiler, true, ref argumentString, out cmdLineFile); int exitCode = ExecuteCommand(linkerExecutable, argumentString, Project.BaseDirectory, monitor, out stdError, out stdOut); ErrorExtracting.HandleCompilerOutput(Project, br, stdError); ErrorExtracting.HandleCompilerOutput(Project, br, stdOut); ErrorExtracting.HandleOptLinkOutput(Project, br, stdOut); ErrorExtracting.HandleReturnCode(monitor, br, exitCode); if (cmdLineFile != null) { File.Delete(cmdLineFile); } return(br); }
BuildResult DoOneStepBuild() { var br = new BuildResult(); bool filesModified = false; // Enum files & build resource files foreach (var pf in Project.Files) { if (pf.BuildAction != BuildAction.Compile || pf.Subtype == Subtype.Directory) { continue; } DateTime dt; if (Project.LastModificationTimes.TryGetValue(pf, out dt)) { filesModified |= File.GetLastWriteTime(pf.FilePath) != dt; } else { filesModified = true; } Project.LastModificationTimes[pf] = File.GetLastWriteTime(pf.FilePath); if (pf.FilePath.Extension.EndsWith(".rc", StringComparison.OrdinalIgnoreCase)) { if (!CompileResourceScript(br, pf)) { return(br); } } else { BuiltObjects.Add(MakeRelativeToPrjBase(Project, pf.FilePath)); } } // Build argument string var target = Project.GetOutputFileName(BuildConfig.Selector); if (!Project.NeedsFullRebuild && !filesModified && Project.EnableIncrementalLinking && File.Exists(target)) { monitor.ReportSuccess("Build successful! - No new linkage needed"); monitor.Step(1); return(br); } var argumentString = BuildOneStepBuildString(Project, BuiltObjects, BuildConfig.Selector); // Execute the compiler var stdOut = ""; var stdError = ""; var linkCfg = LinkTargetCfg(BuildConfig); var linkerExecutable = Compiler.SourceCompilerCommand; if (!Path.IsPathRooted(linkerExecutable) && !string.IsNullOrEmpty(Compiler.BinPath)) { linkerExecutable = Path.Combine(Compiler.BinPath, linkCfg.Linker); if (!File.Exists(linkerExecutable)) { linkerExecutable = linkCfg.Linker; } } monitor.Log.WriteLine("Current dictionary: " + Project.BaseDirectory); string cmdLineFile; HandleOverLongArgumentStrings(monitor, Compiler, true, ref argumentString, out cmdLineFile); int exitCode = ExecuteCommand(linkerExecutable, argumentString, Project.BaseDirectory, monitor, out stdError, out stdOut); ErrorExtracting.HandleCompilerOutput(Project, br, stdError); ErrorExtracting.HandleCompilerOutput(Project, br, stdOut); ErrorExtracting.HandleOptLinkOutput(Project, br, stdOut); ErrorExtracting.HandleLdOutput(Project, br, stdOut); ErrorExtracting.HandleReturnCode(monitor, br, exitCode); if (cmdLineFile != null) { File.Delete(cmdLineFile); } if (!br.Failed) { Project.CopySupportFiles(monitor, this.BuildConfig.Selector); Project.NeedsFullRebuild = false; } return(br); }
BuildResult DoOneStepBuild() { var br = new BuildResult(); // Enum files & build resource files foreach (var pf in Project.Files) { if (pf.BuildAction != BuildAction.Compile || pf.Subtype == Subtype.Directory) { continue; } if (pf.FilePath.Extension.EndsWith(".rc", StringComparison.OrdinalIgnoreCase)) { if (!CompileResourceScript(br, pf)) { return(br); } } else { BuiltObjects.Add(GetRelObjFilename(pf.FilePath)); } } // Build argument string var target = Project.GetOutputFileName(BuildConfig.Selector); var argumentString = FillInMacros( Arguments.OneStepBuildArguments.Trim() + " " + BuildConfig.ExtraCompilerArguments.Trim() + " " + BuildConfig.ExtraLinkerArguments.Trim(), new OneStepBuildArgumentMacroProvider { ObjectsStringPattern = Commands.ObjectFileLinkPattern, IncludesStringPattern = Commands.IncludePathPattern, SourceFiles = BuiltObjects, Includes = Project.IncludePaths, Libraries = BuildConfig.ReferencedLibraries, RelativeTargetDirectory = BuildConfig.OutputDirectory, ObjectsDirectory = BuildConfig.ObjectDirectory, TargetFile = target, }); // Execute the compiler var stdOut = ""; var stdError = ""; var linkerExecutable = Commands.Compiler; if (!Path.IsPathRooted(linkerExecutable)) { linkerExecutable = Path.Combine(Compiler.BinPath, Commands.Linker); if (!File.Exists(linkerExecutable)) { linkerExecutable = Commands.Linker; } } monitor.Log.WriteLine("Current dictionary: " + Project.BaseDirectory); int exitCode = ExecuteCommand(linkerExecutable, argumentString, Project.BaseDirectory, monitor, out stdError, out stdOut); HandleCompilerOutput(br, stdError); HandleCompilerOutput(br, stdOut); HandleOptLinkOutput(br, stdOut); HandleReturnCode(br, linkerExecutable, exitCode); return(br); }