Commit 6ad69935 authored by Fred Baksik's avatar Fred Baksik
Browse files

cmake: --build -j <jobs> should not accept 0.

Fixes #19059
parent 955f7f41
...@@ -280,6 +280,9 @@ following options: ...@@ -280,6 +280,9 @@ following options:
The :envvar:`CMAKE_BUILD_PARALLEL_LEVEL` environment variable, if set, The :envvar:`CMAKE_BUILD_PARALLEL_LEVEL` environment variable, if set,
specifies a default parallel level when this option is not given. specifies a default parallel level when this option is not given.
Some native build tools always build in parallel. The use of ``<jobs>``
value of ``1`` can be used to limit to a single job.
``--target <tgt>..., -t <tgt>...`` ``--target <tgt>..., -t <tgt>...``
Build ``<tgt>`` instead of default targets. May be specified multiple times. Build ``<tgt>`` instead of default targets. May be specified multiple times.
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#endif #endif
#include <cassert> #include <cassert>
#include <climits>
#include <ctype.h> #include <ctype.h>
#include <iostream> #include <iostream>
#include <string.h> #include <string.h>
...@@ -69,7 +70,7 @@ static const char* cmDocumentationUsageNote[][2] = { ...@@ -69,7 +70,7 @@ static const char* cmDocumentationUsageNote[][2] = {
" --config <cfg> = For multi-configuration tools, choose <cfg>.\n" \ " --config <cfg> = For multi-configuration tools, choose <cfg>.\n" \
" --clean-first = Build target 'clean' first, then build.\n" \ " --clean-first = Build target 'clean' first, then build.\n" \
" (To clean only, use --target 'clean'.)\n" \ " (To clean only, use --target 'clean'.)\n" \
" --verbose, -v = Enable verbose output - if supported - including\n" \ " --verbose, -v = Enable verbose output - if supported - including\n" \
" the build commands to be executed. \n" \ " the build commands to be executed. \n" \
" -- = Pass remaining options to the native tool.\n" " -- = Pass remaining options to the native tool.\n"
...@@ -393,7 +394,14 @@ int extract_job_number(int& index, char const* current, char const* next, ...@@ -393,7 +394,14 @@ int extract_job_number(int& index, char const* current, char const* next,
if (jobString.empty()) { if (jobString.empty()) {
jobs = cmake::DEFAULT_BUILD_PARALLEL_LEVEL; jobs = cmake::DEFAULT_BUILD_PARALLEL_LEVEL;
} else if (cmSystemTools::StringToULong(jobString.c_str(), &numJobs)) { } else if (cmSystemTools::StringToULong(jobString.c_str(), &numJobs)) {
jobs = int(numJobs); if (numJobs == 0) {
std::cerr
<< "The <jobs> value requires a positive integer argument.\n\n";
} else if (numJobs > INT_MAX) {
std::cerr << "The <jobs> value is too large.\n\n";
} else {
jobs = int(numJobs);
}
} else { } else {
std::cerr << "'" << command.substr(0, len_of_flag) << "' invalid number '" std::cerr << "'" << command.substr(0, len_of_flag) << "' invalid number '"
<< jobString << "' given.\n\n"; << jobString << "' given.\n\n";
...@@ -505,7 +513,17 @@ static int do_build(int ac, char const* const* av) ...@@ -505,7 +513,17 @@ static int do_build(int ac, char const* const* av)
} else { } else {
unsigned long numJobs = 0; unsigned long numJobs = 0;
if (cmSystemTools::StringToULong(parallel.c_str(), &numJobs)) { if (cmSystemTools::StringToULong(parallel.c_str(), &numJobs)) {
jobs = int(numJobs); if (numJobs == 0) {
std::cerr << "The CMAKE_BUILD_PARALLEL_LEVEL environment variable "
"requires a positive integer argument.\n\n";
dir.clear();
} else if (numJobs > INT_MAX) {
std::cerr << "The CMAKE_BUILD_PARALLEL_LEVEL environment variable "
"is too large.\n\n";
dir.clear();
} else {
jobs = int(numJobs);
}
} else { } else {
std::cerr << "'CMAKE_BUILD_PARALLEL_LEVEL' environment variable\n" std::cerr << "'CMAKE_BUILD_PARALLEL_LEVEL' environment variable\n"
<< "invalid number '" << parallel << "' given.\n\n"; << "invalid number '" << parallel << "' given.\n\n";
......
^The <jobs> value is too large\.
+
Usage: cmake --build <dir> \[options\] \[-- \[native-options\]\]
^The <jobs> value requires a positive integer argument\.
+
Usage: cmake --build <dir> \[options\] \[-- \[native-options\]\]
^The <jobs> value is too large\.
+
Usage: cmake --build <dir> \[options\] \[-- \[native-options\]\]
^The <jobs> value requires a positive integer argument\.
+
Usage: cmake --build <dir> \[options\] \[-- \[native-options\]\]
...@@ -149,6 +149,14 @@ function(run_BuildDir) ...@@ -149,6 +149,14 @@ function(run_BuildDir)
${CMAKE_COMMAND} --build BuildDir-build --parallel2) ${CMAKE_COMMAND} --build BuildDir-build --parallel2)
run_cmake_command(BuildDir--build--parallel-no-space-good-number-trailing--target ${CMAKE_COMMAND} -E chdir .. run_cmake_command(BuildDir--build--parallel-no-space-good-number-trailing--target ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --parallel2 --target CustomTarget) ${CMAKE_COMMAND} --build BuildDir-build --parallel2 --target CustomTarget)
run_cmake_command(BuildDir--build-jobs-zero ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build -j 0)
run_cmake_command(BuildDir--build--parallel-zero ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --parallel 0)
run_cmake_command(BuildDir--build-jobs-large ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build -j 4294967293)
run_cmake_command(BuildDir--build--parallel-large ${CMAKE_COMMAND} -E chdir ..
${CMAKE_COMMAND} --build BuildDir-build --parallel 4294967293)
# 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")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment