mirror of https://github.com/Kitware/CMake.git
Browse Source
ExternalProject: Set environment variables
ExternalProject: Set environment variables
Add the ability to modify the environment of the various steps running as part of an external project build. This specifically adds the ability to set them on the configure , build , install, and test steps, as well as exposing the `ENVIRONMENT_MODIFICATION` keyword arguments to `ExternalProject_Add_Step`, allowing customization of the environment of custom steps. The values of the environment variable respect the `LIST_SEPARATOR`. Fixes: #26963master

committed by
Brad King

11 changed files with 363 additions and 1 deletions
-
5Auxiliary/vim/syntax/cmake.vim
-
178Modules/ExternalProject.cmake
-
4Modules/ExternalProject/shared_internal_commands.cmake
-
32Tests/RunCMake/ExternalProject/EnvVars-build-stdout.txt
-
102Tests/RunCMake/ExternalProject/EnvVars.cmake
-
12Tests/RunCMake/ExternalProject/EnvVars/CMakeLists.txt
-
7Tests/RunCMake/ExternalProject/EnvVars/EchoVar.cmake
-
1Tests/RunCMake/ExternalProject/InvalidEnvModification-result.txt
-
6Tests/RunCMake/ExternalProject/InvalidEnvModification-stderr.txt
-
12Tests/RunCMake/ExternalProject/InvalidEnvModification.cmake
-
5Tests/RunCMake/ExternalProject/RunCMakeTest.cmake
@ -0,0 +1,32 @@ |
|||
.*(Performing custom step for 'CustomCommandEnvVars'|CustomCommandEnvVars-custom).* |
|||
*-- Variable - CustomVar: custom.* |
|||
*-- Variable - CustomVar2: custom2.* |
|||
*-- Stage: custom |
|||
*-- Separator: ; |
|||
*-- List: 1;2;3 |
|||
.*(Performing configure step for 'CustomCommandEnvVars'|CustomCommandEnvVars-configure).* |
|||
*-- Stage: config |
|||
*-- Separator: ; |
|||
*-- List: 4;5;6.* |
|||
*-- Variable - Stage: config.* |
|||
*-- Variable - ListVar: 4;5;6 |
|||
.*(Performing build step for 'CustomCommandEnvVars'|CustomCommandEnvVars-build).* |
|||
*-- Stage: build |
|||
*-- Separator: ; |
|||
*-- List: 4;5;6 |
|||
.*(Performing install step for 'CustomCommandEnvVars'|CustomCommandEnvVars-install).* |
|||
*-- Stage: install |
|||
*-- Separator: ; |
|||
*-- List: 4;5;6 |
|||
.*(Performing test step for 'CustomCommandEnvVars'|CustomCommandEnvVars-test).* |
|||
*-- Stage: test |
|||
*-- Separator: ; |
|||
*-- List: 4;5;6 |
|||
.*(Performing configure step for 'DefaultCommandEnvVars'|DefaultCommandEnvVars-configure).* |
|||
*-- ConfigVar: config |
|||
*-- Separator: , |
|||
*-- List: 7,8,9 |
|||
.*(Performing build step for 'DefaultCommandEnvVars'|DefaultCommandEnvVars-build).* |
|||
*-- Stage: build |
|||
*-- Separator: , |
|||
*-- List: 7,8,9,10 |
@ -0,0 +1,102 @@ |
|||
include(ExternalProject) |
|||
|
|||
# |
|||
## Set environment variables on custom commands |
|||
# |
|||
|
|||
# Comma list-separator |
|||
set(ScriptPath "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars/EchoVar.cmake") |
|||
ExternalProject_Add(CustomCommandEnvVars |
|||
DOWNLOAD_COMMAND "" |
|||
UPDATE_COMMAND "" |
|||
PATCH_COMMAND "" |
|||
LIST_SEPARATOR , |
|||
CONFIGURE_COMMAND "${CMAKE_COMMAND}" -P ${ScriptPath} |
|||
COMMAND "${CMAKE_COMMAND}" -DVARNAME=Stage -P ${ScriptPath} |
|||
COMMAND "${CMAKE_COMMAND}" -DVARNAME=ListVar -P ${ScriptPath} |
|||
CONFIGURE_ENVIRONMENT_MODIFICATION |
|||
Stage=set:config |
|||
ListVar=set:4,5,6 |
|||
ListSeparator=set:, |
|||
BUILD_COMMAND "${CMAKE_COMMAND}" -P ${ScriptPath} |
|||
BUILD_ENVIRONMENT_MODIFICATION |
|||
Stage=set:build |
|||
ListVar=set:4,5,6 |
|||
ListSeparator=set:, |
|||
INSTALL_COMMAND "${CMAKE_COMMAND}" -P ${ScriptPath} |
|||
INSTALL_ENVIRONMENT_MODIFICATION |
|||
InstallVar=set:install |
|||
Stage=set:install |
|||
ListVar=set:4,5,6 |
|||
ListSeparator=set:, |
|||
TEST_COMMAND "${CMAKE_COMMAND}" -P ${ScriptPath} |
|||
TEST_ENVIRONMENT_MODIFICATION |
|||
Stage=set:test |
|||
ListVar=set:4,5,6 |
|||
ListSeparator=set:,) |
|||
|
|||
ExternalProject_Add_Step(CustomCommandEnvVars custom |
|||
DEPENDERS configure |
|||
COMMAND "${CMAKE_COMMAND}" -DVARNAME=CustomVar -P ${ScriptPath} |
|||
COMMAND "${CMAKE_COMMAND}" -DVARNAME=CustomVar2 -P ${ScriptPath} |
|||
COMMAND "${CMAKE_COMMAND}" -P ${ScriptPath} |
|||
ENVIRONMENT_MODIFICATION |
|||
CustomVar=set:custom |
|||
CustomVar2=set:custom2 |
|||
Stage=set:custom |
|||
ListVar=set:1,2,3 |
|||
ListSeparator=set:,) |
|||
|
|||
# |
|||
## Set environment variables on the default commands |
|||
# |
|||
|
|||
# No list separator |
|||
ExternalProject_Add(DefaultCommandEnvVars |
|||
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars" |
|||
DOWNLOAD_COMMAND "" |
|||
UPDATE_COMMAND "" |
|||
PATCH_COMMAND "" |
|||
DEPENDS CustomCommandEnvVars |
|||
CMAKE_ARGS |
|||
-DVARIABLE=ConfigVar |
|||
CONFIGURE_ENVIRONMENT_MODIFICATION |
|||
ConfigVar=set:config |
|||
ListVar=set:7,8,9 |
|||
ListSeparator=set:, |
|||
BUILD_ENVIRONMENT_MODIFICATION |
|||
Stage=set:build |
|||
ListVar=set:7,8,9,10 |
|||
ListSeparator=set:, |
|||
INSTALL_COMMAND "" # empty install command should not show up |
|||
INSTALL_ENVIRONMENT_MODIFICATION |
|||
Stage=set:install |
|||
Separator=set:,) |
|||
|
|||
# Using `:` as a list separator on Windows does not work as it replaces the `:` |
|||
# between the drive letter and the filepath with `;`. |
|||
if(NOT WIN32) |
|||
# Ensure that using `:` as a list-separator does not break setting environment |
|||
# variables |
|||
ExternalProject_Add(DefaultCommandListSepEnvVars |
|||
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars" |
|||
DOWNLOAD_COMMAND "" |
|||
UPDATE_COMMAND "" |
|||
PATCH_COMMAND "" |
|||
DEPENDS DefaultCommandEnvVars |
|||
LIST_SEPARATOR : |
|||
CMAKE_ARGS |
|||
-DVARIABLE=ConfigVar |
|||
CONFIGURE_ENVIRONMENT_MODIFICATION |
|||
ConfigVar=set:config |
|||
ListVar=set:10:11:12 |
|||
ListSeparator=set:: |
|||
BUILD_ENVIRONMENT_MODIFICATION |
|||
Stage=set:build |
|||
ListVar=set:10:11:12 |
|||
ListSeparator=set:: |
|||
INSTALL_ENVIRONMENT_MODIFICATION |
|||
Stage=set:install |
|||
ListSeparator=set:: |
|||
ListVar=set:10:11:12:13) |
|||
endif() |
@ -0,0 +1,12 @@ |
|||
cmake_minimum_required(VERSION 4.0) |
|||
|
|||
project(EnvVars LANGUAGES NONE) |
|||
|
|||
message(STATUS "${VARIABLE}: $ENV{${VARIABLE}}") |
|||
message(STATUS "Separator: $ENV{ListSeparator}") |
|||
message(STATUS "List: $ENV{ListVar}") |
|||
|
|||
add_custom_target(EchoEnvVars ALL COMMAND |
|||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_SOURCE_DIR}/EchoVar.cmake") |
|||
|
|||
install(SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/EchoVar.cmake") |
@ -0,0 +1,7 @@ |
|||
if(VARNAME) |
|||
message(STATUS "Variable - ${VARNAME}: $ENV{${VARNAME}}") |
|||
else() |
|||
message(STATUS "Stage: $ENV{Stage}") |
|||
message(STATUS "Separator: $ENV{ListSeparator}") |
|||
message(STATUS "List: $ENV{ListVar}") |
|||
endif() |
@ -0,0 +1 @@ |
|||
1 |
@ -0,0 +1,6 @@ |
|||
.* Malformed environment modification specifier: 'HI' |
|||
.* Expected MYVAR=OP:VALUE |
|||
.* Malformed environment modification specifier: 'INVALID=SETTING' |
|||
.* Expected MYVAR=OP:VALUE |
|||
.* Malformed environment modification specifier: 'INVALID=OP1:operation:10' |
|||
.* Expected MYVAR=OP:VALUE |
@ -0,0 +1,12 @@ |
|||
include(ExternalProject) |
|||
|
|||
ExternalProject_Add(EnvModification |
|||
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars" |
|||
DOWNLOAD_COMMAND "" |
|||
UPDATE_COMMAND "" |
|||
PATCH_COMMAND "" |
|||
LIST_SEPARATOR : |
|||
CONFIGURE_ENVIRONMENT_MODIFICATION |
|||
HI |
|||
INVALID=SETTING |
|||
INVALID=OP1:operation:10) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue