diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 17a252f..f2b9b19 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -508,6 +508,7 @@ bool m_run = false; bool m_force = false; bool m_combined = false; + bool m_parallel = false; bool m_printPlatform, m_printBuilds, m_printConfigs; } @@ -545,6 +546,9 @@ args.getopt("print-platform", &m_printPlatform, [ "Prints the identifiers for the current build platform as used for the build fields in dub.json" ]); + args.getopt("parallel", &m_parallel, [ + "Runs multiple compiler instances in parallel, if possible." + ]); } override int execute(Dub dub, string[] free_args, string[] app_args) @@ -589,6 +593,7 @@ gensettings.force = m_force; gensettings.rdmd = m_rdmd; gensettings.tempBuild = m_tempBuild; + gensettings.parallelBuild = m_parallel; logDiagnostic("Generating using %s", m_generator); if (m_generator == "visuald-combined") { diff --git a/source/dub/generators/build.d b/source/dub/generators/build.d index 685b34c..115341f 100644 --- a/source/dub/generators/build.d +++ b/source/dub/generators/build.d @@ -389,11 +389,18 @@ auto srcs = buildsettings.sourceFiles.filter!(f => !isLinkerFile(f)); auto objs = new string[](srcs.walkLength); logInfo("Compiling using %s...", settings.platform.compilerBinary); - foreach (i, src; srcs.parallel(1)) { + + void compileSource(size_t i, string src) { logInfo("Compiling %s...", src); objs[i] = compileUnit(src, pathToObjName(src), buildsettings, settings); } + if (settings.parallelBuild) { + foreach (i, src; srcs.parallel(1)) compileSource(i, src); + } else { + foreach (i, src; srcs.array) compileSource(i, src); + } + logInfo("Linking..."); lbuildsettings.sourceFiles = is_static_library ? [] : lbuildsettings.sourceFiles.filter!(f=> f.isLinkerFile()).array; settings.compiler.setTarget(lbuildsettings, settings.platform); diff --git a/source/dub/generators/generator.d b/source/dub/generators/generator.d index 4b96cb8..5228555 100644 --- a/source/dub/generators/generator.d +++ b/source/dub/generators/generator.d @@ -276,7 +276,7 @@ bool combined; // compile all in one go instead of each dependency separately // only used for generator "build" - bool run, force, direct, clean, rdmd, tempBuild; + bool run, force, direct, clean, rdmd, tempBuild, parallelBuild; string[] runArgs; void delegate(int status, string output) compileCallback; void delegate(int status, string output) linkCallback;