From 55ba4fa4c2f30002b018f0aad768dee912e83f44 Mon Sep 17 00:00:00 2001 From: Jacob Pedersen Date: Wed, 17 Jun 2026 14:07:45 +0200 Subject: [PATCH] Added --no-deps flag to fix Rebuild race conditions causing extended build times and errors. --- CPPBuild/CPPBuild.cpp | 20 ++++++++++++-------- CPPBuild/CPPBuild.h | 8 ++++---- CPPBuild/Main.cpp | 22 +++++++++++++++------- CPPBuild/VSWorkspace.cpp | 14 +++++++------- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/CPPBuild/CPPBuild.cpp b/CPPBuild/CPPBuild.cpp index 5573fae..3adb590 100644 --- a/CPPBuild/CPPBuild.cpp +++ b/CPPBuild/CPPBuild.cpp @@ -206,11 +206,12 @@ void CPPBuild::generateWorkspace(const JsonValue& properties) #endif } -int CPPBuild::postBuild(std::string targetName, std::string configuration) +int CPPBuild::postBuild(std::string targetName, std::string configuration, bool nodeps) { BuildSetup setup = loadBuildSetup(); PackageManager packages(workDir); - for (std::string name : getBuildOrder(setup, targetName, configuration)) + std::vector order = nodeps ? std::vector{ targetName } : getBuildOrder(setup, targetName, configuration); + for (std::string name : order) { Target target(setup, &packages, workDir, name, configuration); int result = target.postBuild(); @@ -220,11 +221,12 @@ int CPPBuild::postBuild(std::string targetName, std::string configuration) return 0; } -int CPPBuild::build(std::string targetName, std::string configuration) +int CPPBuild::build(std::string targetName, std::string configuration, bool nodeps) { BuildSetup setup = loadBuildSetup(); PackageManager packages(workDir); - for (std::string name : getBuildOrder(setup, targetName, configuration)) + std::vector order = nodeps ? std::vector{ targetName } : getBuildOrder(setup, targetName, configuration); + for (std::string name : order) { Target target(setup, &packages, workDir, name, configuration); int result = target.build(); @@ -234,22 +236,24 @@ int CPPBuild::build(std::string targetName, std::string configuration) return 0; } -void CPPBuild::clean(std::string targetName, std::string configuration) +void CPPBuild::clean(std::string targetName, std::string configuration, bool nodeps) { BuildSetup setup = loadBuildSetup(); PackageManager packages(workDir); - for (std::string name : getBuildOrder(setup, targetName, configuration)) + std::vector order = nodeps ? std::vector{ targetName } : getBuildOrder(setup, targetName, configuration); + for (std::string name : order) { Target target(setup, &packages, workDir, name, configuration); target.clean(); } } -int CPPBuild::rebuild(std::string targetName, std::string configuration) +int CPPBuild::rebuild(std::string targetName, std::string configuration, bool nodeps) { BuildSetup setup = loadBuildSetup(); PackageManager packages(workDir); - for (std::string name : getBuildOrder(setup, targetName, configuration)) + std::vector order = nodeps ? std::vector{ targetName } : getBuildOrder(setup, targetName, configuration); + for (std::string name : order) { Target target(setup, &packages, workDir, name, configuration); int result = target.rebuild(); diff --git a/CPPBuild/CPPBuild.h b/CPPBuild/CPPBuild.h index e15cdac..1aeb668 100644 --- a/CPPBuild/CPPBuild.h +++ b/CPPBuild/CPPBuild.h @@ -14,10 +14,10 @@ class CPPBuild void configure(std::string sourcePath); void checkMakefile(); - int build(std::string target, std::string configuration); - int rebuild(std::string target, std::string configuration); - int postBuild(std::string target, std::string configuration); - void clean(std::string target, std::string configuration); + int build(std::string target, std::string configuration, bool nodeps = false); + int rebuild(std::string target, std::string configuration, bool nodeps = false); + int postBuild(std::string target, std::string configuration, bool nodeps = false); + void clean(std::string target, std::string configuration, bool nodeps = false); void createInstaller(); void createPackage(); void setProperty(std::string name, std::string value, bool global); diff --git a/CPPBuild/Main.cpp b/CPPBuild/Main.cpp index 6def870..4850738 100644 --- a/CPPBuild/Main.cpp +++ b/CPPBuild/Main.cpp @@ -25,6 +25,14 @@ int main(int argc, char** argv) } CPPBuild app(workdir); + + bool nodeps = false; + if (args.size() > 2 && args[2] == "--no-deps") + { + nodeps = true; + args.erase(args.begin() + 2); + } + if ((args.size() == 2 || args.size() == 3) && args[1] == "configure") { std::string sourcePath; @@ -40,16 +48,16 @@ int main(int argc, char** argv) } else if (args.size() == 4 && args[1] == "build") { - return app.build(args[2], args[3]); + return app.build(args[2], args[3], nodeps); } else if (args.size() == 4 && args[1] == "clean") { - app.clean(args[2], args[3]); + app.clean(args[2], args[3], nodeps); return 0; } else if (args.size() == 4 && args[1] == "rebuild") { - return app.rebuild(args[2], args[3]); + return app.rebuild(args[2], args[3], nodeps); } else if (args.size() == 2 && args[1] == "create-installer") { @@ -82,10 +90,10 @@ int main(int argc, char** argv) std::cout << "cppbuild configure [source path]" << std::endl; std::cout << "cppbuild set [--global] " << std::endl; std::cout << "cppbuild list" << std::endl; - std::cout << "cppbuild [--workdir ] build " << std::endl; - std::cout << "cppbuild [--workdir ] clean " << std::endl; - std::cout << "cppbuild [--workdir ] rebuild " << std::endl; - std::cout << "cppbuild [--workdir ] postbuild " << std::endl; + std::cout << "cppbuild [--workdir ] build [--no-deps] " << std::endl; + std::cout << "cppbuild [--workdir ] clean [--no-deps] " << std::endl; + std::cout << "cppbuild [--workdir ] rebuild [--no-deps] " << std::endl; + std::cout << "cppbuild [--workdir ] postbuild [--no-deps] " << std::endl; std::cout << "cppbuild [--workdir ] create-installer" << std::endl; std::cout << "cppbuild [--workdir ] create-package" << std::endl; return 1; diff --git a/CPPBuild/VSWorkspace.cpp b/CPPBuild/VSWorkspace.cpp index 70088b3..053ea9a 100644 --- a/CPPBuild/VSWorkspace.cpp +++ b/CPPBuild/VSWorkspace.cpp @@ -712,9 +712,9 @@ void VSWorkspace::addTargetProject(const BuildTarget& targetDef) projConfig->general.nmakePreprocessorDefinitions = configDefines; projConfig->general.nmakeIncludeSearchPath = configIncludes; projConfig->general.nmakeOutput = outputFile; - projConfig->general.nmakeBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) build " + projectName + " " + configName; - projConfig->general.nmakeCleanCommandLine = cppbuildexe + " --workdir $(SolutionDir) clean " + projectName + " " + configName; - projConfig->general.nmakeReBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) rebuild " + projectName + " " + configName; + projConfig->general.nmakeBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) build --no-deps " + projectName + " " + configName; + projConfig->general.nmakeCleanCommandLine = cppbuildexe + " --workdir $(SolutionDir) clean --no-deps " + projectName + " " + configName; + projConfig->general.nmakeReBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) rebuild --no-deps " + projectName + " " + configName; } else if (projectType == "custom") { @@ -722,9 +722,9 @@ void VSWorkspace::addTargetProject(const BuildTarget& targetDef) projConfig->general.nmakePreprocessorDefinitions = configDefines; projConfig->general.nmakeIncludeSearchPath = configIncludes; projConfig->general.nmakeOutput = outputFile; - projConfig->general.nmakeBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) build " + projectName + " " + configName; - projConfig->general.nmakeCleanCommandLine = cppbuildexe + " --workdir $(SolutionDir) clean " + projectName + " " + configName; - projConfig->general.nmakeReBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) rebuild " + projectName + " " + configName; + projConfig->general.nmakeBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) build --no-deps " + projectName + " " + configName; + projConfig->general.nmakeCleanCommandLine = cppbuildexe + " --workdir $(SolutionDir) clean --no-deps " + projectName + " " + configName; + projConfig->general.nmakeReBuildCommandLine = cppbuildexe + " --workdir $(SolutionDir) rebuild --no-deps " + projectName + " " + configName; } else if (projectType == "utility") { @@ -751,7 +751,7 @@ void VSWorkspace::addTargetProject(const BuildTarget& targetDef) projConfig->link.subSystem = "Windows"; } - projConfig->postBuild.command = cppbuildexe + " --workdir $(SolutionDir) postbuild " + projectName + " " + configName; + projConfig->postBuild.command = cppbuildexe + " --workdir $(SolutionDir) postbuild --no-deps " + projectName + " " + configName; if (!configDefines.empty()) configDefines.push_back("%(PreprocessorDefinitions)");