cmake_command: Add command to INVOKE other commands by name

Fixes: #18392
This commit is contained in:
Cristian Adam
2020-01-26 18:31:48 +01:00
committed by Brad King
parent 3276f85fd7
commit 54e4f2ad45
29 changed files with 164 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
cmake_command
-------------
Call meta-operations on CMake commands.
Synopsis
^^^^^^^^
.. parsed-literal::
cmake_command(`INVOKE`_ <command> [<args>...])
Introduction
^^^^^^^^^^^^
This command will call meta-operations on built-in CMake commands or
those created via the :command:`macro` or :command:`function` commands.
Invoking
^^^^^^^^
.. _INVOKE:
.. code-block:: cmake
cmake_command(INVOKE <command> [<args>...])
Invokes the named ``<command>`` with the given arguments (if any).
For example, the code:
.. code-block:: cmake
set(message_command "message")
cmake_command(INVOKE ${message_command} STATUS "Hello World!")
is equivalent to
.. code-block:: cmake
message(STATUS "Hello World!")

View File

@@ -44,11 +44,15 @@ can be invoked through any of
foo()
Foo()
FOO()
cmake_command(INVOKE foo)
and so on. However, it is strongly recommended to stay with the
case chosen in the function definition. Typically functions use
all-lowercase names.
The :command:`cmake_command(INVOKE ...)` command can also be used to invoke the
function.
Arguments
^^^^^^^^^

View File

@@ -42,11 +42,15 @@ can be invoked through any of
foo()
Foo()
FOO()
cmake_command(INVOKE foo)
and so on. However, it is strongly recommended to stay with the
case chosen in the macro definition. Typically macros use
all-lowercase names.
The :command:`cmake_command(INVOKE ...)` command can also be used to invoke the
macro.
Arguments
^^^^^^^^^

View File

@@ -16,6 +16,7 @@ These commands are always available.
:maxdepth: 1
/command/break
/command/cmake_command
/command/cmake_host_system_information
/command/cmake_minimum_required
/command/cmake_parse_arguments

View File

@@ -0,0 +1,6 @@
cmake_command
-------------
* The :command:`cmake_command()` command was added for meta-operations on
scripted or built-in commands, starting with a mode to ``INVOKE`` other
commands.

View File

@@ -484,6 +484,8 @@ set(SRCS
cmBuildCommand.h
cmBuildNameCommand.cxx
cmBuildNameCommand.h
cmCMakeCommand.cxx
cmCMakeCommand.h
cmCMakeHostSystemInformationCommand.cxx
cmCMakeHostSystemInformationCommand.h
cmCMakeMinimumRequired.cxx

47
Source/cmCMakeCommand.cxx Normal file
View File

@@ -0,0 +1,47 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCMakeCommand.h"
#include <cstddef>
#include "cmExecutionStatus.h"
#include "cmListFileCache.h"
#include "cmMakefile.h"
bool cmCMakeCommand(std::vector<std::string> const& args,
cmExecutionStatus& status)
{
if (args.empty()) {
status.SetError("called with incorrect number of arguments");
return false;
}
cmMakefile& makefile = status.GetMakefile();
cmListFileContext context = makefile.GetExecutionContext();
if (args[0] == "INVOKE") {
if (args.size() == 1) {
status.SetError("called with incorrect number of arguments");
return false;
}
// First argument is the name of the function to call
cmListFileFunction func;
func.Name = args[1];
func.Line = context.Line;
// The rest of the arguments are passed to the function call above
func.Arguments.resize(args.size() - 1);
for (size_t i = 2; i < args.size(); ++i) {
cmListFileArgument lfarg;
lfarg.Line = context.Line;
lfarg.Value = args[i];
func.Arguments.emplace_back(lfarg);
}
return makefile.ExecuteCommand(func, status);
}
status.SetError("called with unknown meta-operation");
return false;
}

20
Source/cmCMakeCommand.h Normal file
View File

@@ -0,0 +1,20 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmCMakeCommand_h
#define cmCMakeCommand_h
#include "cmConfigure.h" // IWYU pragma: keep
#include <string>
#include <vector>
class cmExecutionStatus;
/**
* \brief Calls a scripted or build-in command
*
*/
bool cmCMakeCommand(std::vector<std::string> const& args,
cmExecutionStatus& status);
#endif

View File

@@ -91,6 +91,7 @@
# include "cmAddLinkOptionsCommand.h"
# include "cmAuxSourceDirectoryCommand.h"
# include "cmBuildNameCommand.h"
# include "cmCMakeCommand.h"
# include "cmCMakeHostSystemInformationCommand.h"
# include "cmExportCommand.h"
# include "cmExportLibraryDependenciesCommand.h"
@@ -196,6 +197,7 @@ void GetScriptingCommands(cmState* state)
"match the opening WHILE command.");
#if !defined(CMAKE_BOOTSTRAP)
state->AddBuiltinCommand("cmake_command", cmCMakeCommand);
state->AddBuiltinCommand("cmake_host_system_information",
cmCMakeHostSystemInformationCommand);
state->AddBuiltinCommand("load_cache", cmLoadCacheCommand);

View File

@@ -651,3 +651,5 @@ add_RunCMake_test("CTestCommandExpandLists")
add_RunCMake_test(PrecompileHeaders)
add_RunCMake_test("UnityBuild")
add_RunCMake_test(cmake_command)

View File

@@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.16)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@@ -0,0 +1,8 @@
include(RunCMake)
run_cmake(cmake_command_no_parameters)
run_cmake(cmake_command_unknown_meta_operation)
run_cmake(cmake_command_invoke_message)
run_cmake(cmake_command_invoke_message_fatal_error)
run_cmake(cmake_command_invoke_no_parameters)
run_cmake(cmake_command_invoke_unknown_function)

View File

@@ -0,0 +1 @@
WORKS!

View File

@@ -0,0 +1 @@
cmake_command(INVOKE message WORKS!)

View File

@@ -0,0 +1,5 @@
CMake Error at cmake_command_invoke_message_fatal_error.cmake:1 \(message\):
error!
Call Stack \(most recent call first\):
cmake_command_invoke_message_fatal_error.cmake:1 \(cmake_command\)
CMakeLists.txt:3 \(include\)

View File

@@ -0,0 +1 @@
cmake_command(INVOKE message FATAL_ERROR error!)

View File

@@ -0,0 +1,2 @@
CMake Error at cmake_command_invoke_no_parameters.cmake:1 \(cmake_command\):
cmake_command called with incorrect number of arguments

View File

@@ -0,0 +1 @@
cmake_command(INVOKE)

View File

@@ -0,0 +1,2 @@
CMake Error at cmake_command_invoke_unknown_function.cmake:1 \(unknown\):
Unknown CMake command "unknown".

View File

@@ -0,0 +1 @@
cmake_command(INVOKE unknown)

View File

@@ -0,0 +1,2 @@
CMake Error at cmake_command_no_parameters.cmake:1 \(cmake_command\):
cmake_command called with incorrect number of arguments

View File

@@ -0,0 +1 @@
cmake_command(INVOKE)

View File

@@ -0,0 +1,2 @@
CMake Error at cmake_command_unknown_meta_operation.cmake:1 \(cmake_command\):
cmake_command called with unknown meta-operation

View File

@@ -0,0 +1 @@
cmake_command(UNKNOWN)