Browse Source

cmake: Allow arbitrary args passed to CMake script

pull/334/head
Alex Turbov 5 years ago
committed by Craig Scott
parent
commit
e4f1b301fe
  1. 6
      Help/manual/cmake.1.rst
  2. 8
      Source/cmake.cxx
  3. 3
      Tests/RunCMake/CommandLine/P_arbitrary_args.cmake
  4. 1
      Tests/RunCMake/CommandLine/RunCMakeTest.cmake

6
Help/manual/cmake.1.rst

@ -481,13 +481,17 @@ Run a Script
.. code-block:: shell
cmake [{-D <var>=<value>}...] -P <cmake-script-file>
cmake [{-D <var>=<value>}...] -P <cmake-script-file> [-- <unparsed-options>...]
Process the given cmake file as a script written in the CMake
language. No configure or generate step is performed and the cache
is not modified. If variables are defined using ``-D``, this must be
done before the ``-P`` argument.
Any options after ``--`` are not parsed by CMake, but they are still included
in the set of :variable:`CMAKE_ARGV<n> <CMAKE_ARGV0>` variables passed to the
script (including the ``--`` itself).
Run a Command-Line Tool
=======================

8
Source/cmake.cxx

@ -289,7 +289,8 @@ void cmake::CleanupCommandsAndMacros()
// Parse the args
bool cmake::SetCacheArgs(const std::vector<std::string>& args)
{
bool findPackageMode = false;
auto findPackageMode = false;
auto seenScriptOption = false;
for (unsigned int i = 1; i < args.size(); ++i) {
std::string const& arg = args[i];
if (cmHasLiteralPrefix(arg, "-D")) {
@ -444,6 +445,11 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
this->SetHomeOutputDirectory(
cmSystemTools::GetCurrentWorkingDirectory());
this->ReadListFile(args, path);
seenScriptOption = true;
} else if (arg == "--" && seenScriptOption) {
// Stop processing CMake args and avoid possible errors
// when arbitrary args are given to CMake script.
break;
} else if (cmHasLiteralPrefix(arg, "--find-package")) {
findPackageMode = true;
}

3
Tests/RunCMake/CommandLine/P_arbitrary_args.cmake

@ -0,0 +1,3 @@
if(NOT ("${CMAKE_ARGV3}" STREQUAL "--" AND "${CMAKE_ARGV4}" STREQUAL "-DFOO"))
message(FATAL_ERROR "`-DFOO` shouldn't trigger an error after `--`")
endif()

1
Tests/RunCMake/CommandLine/RunCMakeTest.cmake

@ -46,6 +46,7 @@ run_cmake_command(G_no-arg ${CMAKE_COMMAND} -B DummyBuildDir -G)
run_cmake_command(G_bad-arg ${CMAKE_COMMAND} -B DummyBuildDir -G NoSuchGenerator)
run_cmake_command(P_no-arg ${CMAKE_COMMAND} -P)
run_cmake_command(P_no-file ${CMAKE_COMMAND} -P nosuchscriptfile.cmake)
run_cmake_command(P_arbitrary_args ${CMAKE_COMMAND} -P "${RunCMake_SOURCE_DIR}/P_arbitrary_args.cmake" -- -DFOO)
run_cmake_command(build-no-dir
${CMAKE_COMMAND} --build)

Loading…
Cancel
Save