mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-04 14:50:23 +00:00
execute_process: Add options for modified environment
This commit is contained in:
@@ -22,6 +22,8 @@ Execute one or more child processes.
|
|||||||
[OUTPUT_STRIP_TRAILING_WHITESPACE]
|
[OUTPUT_STRIP_TRAILING_WHITESPACE]
|
||||||
[ERROR_STRIP_TRAILING_WHITESPACE]
|
[ERROR_STRIP_TRAILING_WHITESPACE]
|
||||||
[ENCODING <name>]
|
[ENCODING <name>]
|
||||||
|
[ENVIRONMENT <variable=value>...]
|
||||||
|
[ENVIRONMENT_MODIFICATION <env-mod-op>...]
|
||||||
[ECHO_OUTPUT_VARIABLE]
|
[ECHO_OUTPUT_VARIABLE]
|
||||||
[ECHO_ERROR_VARIABLE]
|
[ECHO_ERROR_VARIABLE]
|
||||||
[COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>])
|
[COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>])
|
||||||
@@ -187,6 +189,27 @@ Options:
|
|||||||
`UTF-8 RFC <https://datatracker.ietf.org/doc/html/rfc3629>`_
|
`UTF-8 RFC <https://datatracker.ietf.org/doc/html/rfc3629>`_
|
||||||
naming convention.
|
naming convention.
|
||||||
|
|
||||||
|
``ENVIRONMENT <variable=value>...``
|
||||||
|
.. versionadded:: 4.4
|
||||||
|
|
||||||
|
Add environment variable definitions to the environment of the child
|
||||||
|
processes. Each entry must be of the form ``NAME=value`` and is interpreted
|
||||||
|
as setting ``NAME`` to ``value`` for the duration of the
|
||||||
|
``execute_process()`` call.
|
||||||
|
|
||||||
|
These entries are processed in order. If the same variable name is given
|
||||||
|
multiple times, the last value wins.
|
||||||
|
|
||||||
|
``ENVIRONMENT_MODIFICATION <env-mod-op>...``
|
||||||
|
.. versionadded:: 4.4
|
||||||
|
|
||||||
|
Apply one or more :prop_test:`ENVIRONMENT_MODIFICATION` operations to the
|
||||||
|
environment of the child processes. Each operation is applied in the given
|
||||||
|
order, and failures to parse an operation are treated as errors.
|
||||||
|
|
||||||
|
Environment modifications are applied after ``ENVIRONMENT`` entries, if both
|
||||||
|
options are specified.
|
||||||
|
|
||||||
``COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>``
|
``COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>``
|
||||||
.. versionadded:: 3.19
|
.. versionadded:: 3.19
|
||||||
|
|
||||||
|
|||||||
6
Help/release/dev/execute_process-environment.rst
Normal file
6
Help/release/dev/execute_process-environment.rst
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
execute_process-environment
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
* The :command:`execute_process` command learned the
|
||||||
|
``ENVIRONMENT`` and ``ENVIRONMENT_MODIFICATION`` options to run child
|
||||||
|
processes with a modified environment.
|
||||||
@@ -27,6 +27,8 @@
|
|||||||
#include "cmsys/String.h"
|
#include "cmsys/String.h"
|
||||||
|
|
||||||
#include "cmArgumentParser.h"
|
#include "cmArgumentParser.h"
|
||||||
|
#include "cmArgumentParserTypes.h"
|
||||||
|
#include "cmEnvironment.h"
|
||||||
#include "cmExecutionStatus.h"
|
#include "cmExecutionStatus.h"
|
||||||
#include "cmList.h"
|
#include "cmList.h"
|
||||||
#include "cmMakefile.h"
|
#include "cmMakefile.h"
|
||||||
@@ -94,6 +96,8 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
|
|||||||
bool EchoOutputVariable = false;
|
bool EchoOutputVariable = false;
|
||||||
bool EchoErrorVariable = false;
|
bool EchoErrorVariable = false;
|
||||||
cm::optional<std::string> Encoding;
|
cm::optional<std::string> Encoding;
|
||||||
|
ArgumentParser::MaybeEmpty<std::vector<std::string>> Environment;
|
||||||
|
ArgumentParser::MaybeEmpty<std::vector<std::string>> EnvModification;
|
||||||
std::string CommandErrorIsFatal;
|
std::string CommandErrorIsFatal;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -117,6 +121,8 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
|
|||||||
.Bind("ERROR_STRIP_TRAILING_WHITESPACE"_s,
|
.Bind("ERROR_STRIP_TRAILING_WHITESPACE"_s,
|
||||||
&Arguments::ErrorStripTrailingWhitespace)
|
&Arguments::ErrorStripTrailingWhitespace)
|
||||||
.Bind("ENCODING"_s, &Arguments::Encoding)
|
.Bind("ENCODING"_s, &Arguments::Encoding)
|
||||||
|
.Bind("ENVIRONMENT"_s, &Arguments::Environment)
|
||||||
|
.Bind("ENVIRONMENT_MODIFICATION"_s, &Arguments::EnvModification)
|
||||||
.Bind("ECHO_OUTPUT_VARIABLE"_s, &Arguments::EchoOutputVariable)
|
.Bind("ECHO_OUTPUT_VARIABLE"_s, &Arguments::EchoOutputVariable)
|
||||||
.Bind("ECHO_ERROR_VARIABLE"_s, &Arguments::EchoErrorVariable)
|
.Bind("ECHO_ERROR_VARIABLE"_s, &Arguments::EchoErrorVariable)
|
||||||
.Bind("COMMAND_ERROR_IS_FATAL"_s, &Arguments::CommandErrorIsFatal);
|
.Bind("COMMAND_ERROR_IS_FATAL"_s, &Arguments::CommandErrorIsFatal);
|
||||||
@@ -213,6 +219,23 @@ bool cmExecuteProcessCommand(std::vector<std::string> const& args,
|
|||||||
builder.SetWorkingDirectory(arguments.WorkingDirectory);
|
builder.SetWorkingDirectory(arguments.WorkingDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!arguments.Environment.empty() || !arguments.EnvModification.empty()) {
|
||||||
|
#ifndef CMAKE_BOOTSTRAP
|
||||||
|
auto diff = cmEnvironmentModification{};
|
||||||
|
if (!diff.Add(arguments.EnvModification)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
auto env = cmEnvironment{ cmSystemTools::GetEnvironmentVariables() };
|
||||||
|
env.Update(arguments.Environment);
|
||||||
|
diff.ApplyTo(env);
|
||||||
|
builder.SetEnvironment(env.GetVariables());
|
||||||
|
#else
|
||||||
|
status.SetError(
|
||||||
|
"does not support environment modification in bootstrap builds");
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Check the output variables.
|
// Check the output variables.
|
||||||
std::unique_ptr<FILE, int (*)(FILE*)> inputFile(nullptr, fclose);
|
std::unique_ptr<FILE, int (*)(FILE*)> inputFile(nullptr, fclose);
|
||||||
if (!inputFilename.empty()) {
|
if (!inputFilename.empty()) {
|
||||||
|
|||||||
1
Tests/RunCMake/execute_process/Environment-stdout.txt
Normal file
1
Tests/RunCMake/execute_process/Environment-stdout.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CMAKE_TEST_RUNCMAKE_EXECUTE_PROCESS_ENVIRONMENT=expected_value
|
||||||
5
Tests/RunCMake/execute_process/Environment.cmake
Normal file
5
Tests/RunCMake/execute_process/Environment.cmake
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E environment
|
||||||
|
ENVIRONMENT
|
||||||
|
"CMAKE_TEST_RUNCMAKE_EXECUTE_PROCESS_ENVIRONMENT=expected_value"
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
CMAKE_TEST_RUNCMAKE_EXECUTE_PROCESS_ENVIRONMENT=kaesekuchen
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
set(ENV{CMAKE_TEST_RUNCMAKE_EXECUTE_PROCESS_ENVIRONMENT} "kaese")
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E environment
|
||||||
|
ENVIRONMENT_MODIFICATION
|
||||||
|
"CMAKE_TEST_RUNCMAKE_EXECUTE_PROCESS_ENVIRONMENT=string_append:kuchen"
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
1
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
CMake Error: Error: Unrecognized environment manipulation argument: invalid
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E environment
|
||||||
|
ENVIRONMENT_MODIFICATION
|
||||||
|
"CMAKE_TEST_RUNCMAKE_EXECUTE_PROCESS_ENVIRONMENT=invalid:value"
|
||||||
|
)
|
||||||
@@ -19,6 +19,10 @@ if(TEST_ENCODING_EXE)
|
|||||||
run_cmake_script(EncodingUTF8 -DTEST_ENCODING_EXE=${TEST_ENCODING_EXE})
|
run_cmake_script(EncodingUTF8 -DTEST_ENCODING_EXE=${TEST_ENCODING_EXE})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
run_cmake(Environment)
|
||||||
|
run_cmake(EnvironmentModification)
|
||||||
|
run_cmake(EnvironmentModificationError)
|
||||||
|
|
||||||
if(EXIT_CODE_EXE)
|
if(EXIT_CODE_EXE)
|
||||||
run_cmake_command(ExitValues ${CMAKE_COMMAND} -DEXIT_CODE_EXE=${EXIT_CODE_EXE} -P ${RunCMake_SOURCE_DIR}/ExitValues.cmake)
|
run_cmake_command(ExitValues ${CMAKE_COMMAND} -DEXIT_CODE_EXE=${EXIT_CODE_EXE} -P ${RunCMake_SOURCE_DIR}/ExitValues.cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
Reference in New Issue
Block a user