cmake: Teach --build to reject multiple --target options
Previously we did not clearly document that `--target` is only supported to be specified once. Even worse, specifying it multiple times would silently ignore any previously specified targets and only build the last target. Update the documentation to specify this. Update the implementation to reject multiple `--target` options to prevent user errors.
This commit is contained in:
parent
886acd80f0
commit
497cad7c88
|
@ -58,6 +58,7 @@ Options
|
|||
|
||||
<dir> = Project binary directory to be built.
|
||||
--target <tgt> = Build <tgt> instead of default targets.
|
||||
May only be specified once.
|
||||
--config <cfg> = For multi-configuration tools, choose <cfg>.
|
||||
--clean-first = Build target 'clean' first, then build.
|
||||
(To clean only, use --target 'clean'.)
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
error-multiple-targets
|
||||
----------------------
|
||||
|
||||
* The :manual:`cmake(1)` ``--build`` command-line tool now rejects multiple
|
||||
``--target`` options with an error instead of silently ignoring all but the
|
||||
last one.
|
|
@ -60,6 +60,7 @@ static const char * cmDocumentationUsageNote[][2] =
|
|||
#define CMAKE_BUILD_OPTIONS \
|
||||
" <dir> = Project binary directory to be built.\n" \
|
||||
" --target <tgt> = Build <tgt> instead of default targets.\n" \
|
||||
" May only be specified once.\n" \
|
||||
" --config <cfg> = For multi-configuration tools, choose <cfg>.\n" \
|
||||
" --clean-first = Build target 'clean' first, then build.\n" \
|
||||
" (To clean only, use --target 'clean'.)\n" \
|
||||
|
@ -386,6 +387,7 @@ static int do_build(int ac, char const* const* av)
|
|||
std::string dir;
|
||||
std::vector<std::string> nativeOptions;
|
||||
bool clean = false;
|
||||
bool hasTarget = false;
|
||||
|
||||
enum Doing { DoingNone, DoingDir, DoingTarget, DoingConfig, DoingNative};
|
||||
Doing doing = DoingDir;
|
||||
|
@ -396,8 +398,18 @@ static int do_build(int ac, char const* const* av)
|
|||
nativeOptions.push_back(av[i]);
|
||||
}
|
||||
else if(strcmp(av[i], "--target") == 0)
|
||||
{
|
||||
if (!hasTarget)
|
||||
{
|
||||
doing = DoingTarget;
|
||||
hasTarget = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cerr << "'--target' may not be specified more than once.\n\n";
|
||||
dir = "";
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(strcmp(av[i], "--config") == 0)
|
||||
{
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
^'--target' may not be specified more than once\.
|
||||
+
|
||||
Usage: cmake --build <dir> \[options\] \[-- \[native-options\]\]
|
|
@ -3,3 +3,5 @@ add_custom_command(
|
|||
COMMAND ${CMAKE_COMMAND} -E echo CustomCommand > output.txt
|
||||
)
|
||||
add_custom_target(CustomTarget ALL DEPENDS output.txt)
|
||||
add_custom_target(CustomTarget2 ALL DEPENDS output.txt)
|
||||
add_custom_target(CustomTarget3 ALL DEPENDS output.txt)
|
||||
|
|
|
@ -51,6 +51,8 @@ function(run_BuildDir)
|
|||
run_cmake(BuildDir)
|
||||
run_cmake_command(BuildDir--build ${CMAKE_COMMAND} -E chdir ..
|
||||
${CMAKE_COMMAND} --build BuildDir-build --target CustomTarget)
|
||||
run_cmake_command(BuildDir--build-multiple-targets ${CMAKE_COMMAND} -E chdir ..
|
||||
${CMAKE_COMMAND} --build BuildDir-build --target CustomTarget2 --target CustomTarget3)
|
||||
endfunction()
|
||||
run_BuildDir()
|
||||
|
||||
|
|
Loading…
Reference in New Issue