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