1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-19 19:43:23 +08:00

cmake: --build supports '-jN'

This commit is contained in:
Robert Maynard
2019-01-17 09:15:09 -06:00
committed by Brad King
parent e463133cd2
commit f2fca92686
10 changed files with 61 additions and 19 deletions

View File

@@ -360,6 +360,31 @@ int do_cmake(int ac, char const* const* av)
return 0; return 0;
} }
namespace {
int extract_job_number(int& index, char const* current, char const* next,
int len_of_flag)
{
std::string command(current);
std::string jobString = command.substr(len_of_flag);
if (jobString.empty() && next && isdigit(next[0])) {
++index; // skip parsing the job number
jobString = std::string(next);
}
int jobs = -1;
unsigned long numJobs = 0;
if (jobString.empty()) {
jobs = cmake::DEFAULT_BUILD_PARALLEL_LEVEL;
} else if (cmSystemTools::StringToULong(jobString.c_str(), &numJobs)) {
jobs = int(numJobs);
} else {
std::cerr << "'" << command.substr(0, len_of_flag) << "' invalid number '"
<< jobString << "' given.\n\n";
}
return jobs;
}
}
static int do_build(int ac, char const* const* av) static int do_build(int ac, char const* const* av)
{ {
#ifndef CMAKE_BUILD_WITH_CMAKE #ifndef CMAKE_BUILD_WITH_CMAKE
@@ -377,7 +402,6 @@ static int do_build(int ac, char const* const* av)
enum Doing enum Doing
{ {
DoingNone, DoingNone,
DoingJobs,
DoingDir, DoingDir,
DoingTarget, DoingTarget,
DoingConfig, DoingConfig,
@@ -387,12 +411,17 @@ static int do_build(int ac, char const* const* av)
for (int i = 2; i < ac; ++i) { for (int i = 2; i < ac; ++i) {
if (doing == DoingNative) { if (doing == DoingNative) {
nativeOptions.emplace_back(av[i]); nativeOptions.emplace_back(av[i]);
} else if ((strcmp(av[i], "-j") == 0) || } else if (cmHasLiteralPrefix(av[i], "-j")) {
(strcmp(av[i], "--parallel") == 0)) { const char* nextArg = ((i + 1 < ac) ? av[i + 1] : nullptr);
jobs = cmake::DEFAULT_BUILD_PARALLEL_LEVEL; jobs = extract_job_number(i, av[i], nextArg, sizeof("-j") - 1);
/* does the next argument start with a number? */ if (jobs < 0) {
if ((i + 1 < ac) && (isdigit(*av[i + 1]))) { dir.clear();
doing = DoingJobs; }
} else if (cmHasLiteralPrefix(av[i], "--parallel")) {
const char* nextArg = ((i + 1 < ac) ? av[i + 1] : nullptr);
jobs = extract_job_number(i, av[i], nextArg, sizeof("--parallel") - 1);
if (jobs < 0) {
dir.clear();
} }
} else if (strcmp(av[i], "--target") == 0) { } else if (strcmp(av[i], "--target") == 0) {
if (!hasTarget) { if (!hasTarget) {
@@ -414,18 +443,6 @@ static int do_build(int ac, char const* const* av)
doing = DoingNative; doing = DoingNative;
} else { } else {
switch (doing) { switch (doing) {
case DoingJobs: {
unsigned long numJobs = 0;
if (cmSystemTools::StringToULong(av[i], &numJobs)) {
jobs = int(numJobs);
doing = DoingNone;
} else {
std::cerr << "'" << av[i - 1] << "' invalid number '" << av[i]
<< "' given.\n\n";
dir.clear();
break;
}
} break;
case DoingDir: case DoingDir:
dir = cmSystemTools::CollapseFullPath(av[i]); dir = cmSystemTools::CollapseFullPath(av[i]);
doing = DoingNone; doing = DoingNone;

View File

@@ -0,0 +1,3 @@
^'--parallel' invalid number '12ab' given\.
+
Usage: cmake --build <dir> \[options\] \[-- \[native-options\]\]

View File

@@ -0,0 +1 @@
(^$|^Warning: .* does not support parallel builds\. Ignoring parallel build command line option\.)

View File

@@ -0,0 +1 @@
(^$|^Warning: .* does not support parallel builds\. Ignoring parallel build command line option\.)

View File

@@ -0,0 +1,3 @@
^'-j' invalid number '12ab' given\.
+
Usage: cmake --build <dir> \[options\] \[-- \[native-options\]\]

View File

@@ -0,0 +1 @@
(^$|^Warning: .* does not support parallel builds\. Ignoring parallel build command line option\.)

View File

@@ -0,0 +1 @@
(^$|^Warning: .* does not support parallel builds\. Ignoring parallel build command line option\.)

View File

@@ -105,6 +105,19 @@ function(run_BuildDir)
${CMAKE_COMMAND} --build BuildDir-build --parallel 2) ${CMAKE_COMMAND} --build BuildDir-build --parallel 2)
run_cmake_command(BuildDir--build--parallel-good-number-trailing--target ${CMAKE_COMMAND} -E chdir .. run_cmake_command(BuildDir--build--parallel-good-number-trailing--target ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --parallel 2 --target CustomTarget) ${CMAKE_COMMAND} --build BuildDir-build --parallel 2 --target CustomTarget)
run_cmake_command(BuildDir--build-jobs-no-space-bad-number ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build -j12ab)
run_cmake_command(BuildDir--build-jobs-no-space-good-number ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build -j2)
run_cmake_command(BuildDir--build-jobs-no-space-good-number-trailing--target ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build -j2 --target CustomTarget)
run_cmake_command(BuildDir--build--parallel-no-space-bad-number ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --parallel12ab)
run_cmake_command(BuildDir--build--parallel-no-space-good-number ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --parallel2)
run_cmake_command(BuildDir--build--parallel-no-space-good-number-trailing--target ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --parallel2 --target CustomTarget)
# No default jobs for Xcode and FreeBSD build command # No default jobs for Xcode and FreeBSD build command
if(NOT RunCMake_GENERATOR MATCHES "Xcode" AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD") if(NOT RunCMake_GENERATOR MATCHES "Xcode" AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
run_cmake_command(BuildDir--build-jobs-no-number ${CMAKE_COMMAND} -E chdir .. run_cmake_command(BuildDir--build-jobs-no-number ${CMAKE_COMMAND} -E chdir ..