mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-26 08:08:24 -05:00
9cb590b843
Fix two bugs from commit e301cbffcc (ExternalProject: Set environment
variables, 2025-04-09):
* Do not flatten lists in command arguments when adding env mods.
* Remove empty `COMMAND`s without injecting corresponding env mods.
Fixes: #27125
Fixes: #27126
Co-authored-by: Brad King <brad.king@kitware.com>
126 lines
3.4 KiB
CMake
126 lines
3.4 KiB
CMake
include(ExternalProject)
|
|
|
|
#
|
|
## Set environment variables on custom commands
|
|
#
|
|
|
|
# Comma list-separator
|
|
set(ScriptPath "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars/EchoVar.cmake")
|
|
ExternalProject_Add(CustomCommand
|
|
DOWNLOAD_COMMAND ""
|
|
UPDATE_COMMAND ""
|
|
PATCH_COMMAND ""
|
|
LIST_SEPARATOR ,
|
|
CONFIGURE_COMMAND ""
|
|
COMMAND
|
|
COMMAND "${CMAKE_COMMAND}" -DMYLIST='a,b,c' -P ${ScriptPath}
|
|
COMMAND "${CMAKE_COMMAND}" -DVARNAME=Stage -P ${ScriptPath}
|
|
COMMAND ""
|
|
COMMAND COMMAND COMMAND
|
|
COMMAND "${CMAKE_COMMAND}" -E echo "" ""
|
|
COMMAND
|
|
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(CustomCommand 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(DefaultCommand
|
|
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars"
|
|
DOWNLOAD_COMMAND ""
|
|
UPDATE_COMMAND ""
|
|
PATCH_COMMAND ""
|
|
DEPENDS CustomCommand
|
|
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:,)
|
|
|
|
ExternalProject_Add(DefaultCommandListSep
|
|
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars"
|
|
DOWNLOAD_COMMAND ""
|
|
UPDATE_COMMAND ""
|
|
PATCH_COMMAND ""
|
|
DEPENDS DefaultCommand
|
|
LIST_SEPARATOR `
|
|
CMAKE_ARGS
|
|
-DVARIABLE=ConfigVar
|
|
-DMYLIST=d`e`f`g
|
|
CONFIGURE_ENVIRONMENT_MODIFICATION
|
|
ConfigVar=set:config
|
|
ListVar=set:9`8`7
|
|
ListSeparator=set:`
|
|
BUILD_COMMAND ""
|
|
INSTALL_COMMAND "")
|
|
|
|
# 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(DefaultCommandListColon
|
|
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/EnvVars"
|
|
DOWNLOAD_COMMAND ""
|
|
UPDATE_COMMAND ""
|
|
PATCH_COMMAND ""
|
|
DEPENDS DefaultCommandListSep
|
|
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()
|