Skip to content

Commit 4cc97fa

Browse files
Implement #406: CPM_<dependency>_SOURCE explicit->env fallback (#696)
* Reimplement #406 with cascading env overrides * style: format package override env unit test * style: align env override test with cmake-format layout * style: apply cmake-format to env override unit test * feat: warn when CPM_<name>_SOURCE override activates Reviewer request: add a warning for any overridden dependencies to minimise the risk of having unexpected dependency versions injected. Both override paths now emit message(WARNING): - ENV variable path: fires inside the ENV-fallback block when an environment variable activates the override - CMake variable path: fires only when no ENV variable is active, avoiding a double-warn when ENV sets the CMake variable Warning format matches CPM_INDENT prefix convention: "CPM: '<name>' version overridden by environment variable CPM_<name>_SOURCE='<path>'" Unit tests updated to capture stderr and assert the expected warning text is present for both override paths. * style: apply cmake-format to warning messages * style: apply cmake-format to package-override-env test * style: apply cmake-format to package-override test
1 parent af416b9 commit 4cc97fa

5 files changed

Lines changed: 68 additions & 3 deletions

File tree

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,16 @@ For example, to use the local version of the dependency `Dep` at the path `/path
260260
cmake -Bbuild -DCPM_Dep_SOURCE=/path/to/dep
261261
```
262262

263+
Environment-based local package overrides are also available via `CPM_<dependency name>_SOURCE`.
264+
For example:
265+
266+
```bash
267+
export CPM_Dep_SOURCE=/path/to/dep
268+
cmake -Bbuild
269+
```
270+
271+
If both the CMake option and environment variable are set, the explicit CMake option takes precedence.
272+
263273
## Package lock
264274

265275
In large projects with many transitive dependencies, it can be useful to introduce a package lock file.

cmake/CPM.cmake

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,10 +768,23 @@ function(CPMAddPackage)
768768
return()
769769
endif()
770770

771+
if(NOT DEFINED CPM_${CPM_ARGS_NAME}_SOURCE AND DEFINED ENV{CPM_${CPM_ARGS_NAME}_SOURCE})
772+
# Normalize separators to support Windows paths when reading from environment variables.
773+
file(TO_CMAKE_PATH "$ENV{CPM_${CPM_ARGS_NAME}_SOURCE}" CPM_${CPM_ARGS_NAME}_SOURCE)
774+
message(WARNING "${CPM_INDENT} '${CPM_ARGS_NAME}' version overridden by environment variable "
775+
"CPM_${CPM_ARGS_NAME}_SOURCE='${CPM_${CPM_ARGS_NAME}_SOURCE}'"
776+
)
777+
endif()
778+
771779
# Check for manual overrides
772780
if(NOT CPM_ARGS_FORCE AND NOT "${CPM_${CPM_ARGS_NAME}_SOURCE}" STREQUAL "")
773781
set(PACKAGE_SOURCE ${CPM_${CPM_ARGS_NAME}_SOURCE})
774782
set(CPM_${CPM_ARGS_NAME}_SOURCE "")
783+
if(NOT DEFINED ENV{CPM_${CPM_ARGS_NAME}_SOURCE})
784+
message(WARNING "${CPM_INDENT} '${CPM_ARGS_NAME}' version overridden by CMake variable "
785+
"CPM_${CPM_ARGS_NAME}_SOURCE='${PACKAGE_SOURCE}'"
786+
)
787+
endif()
775788
CPMAddPackage(
776789
NAME "${CPM_ARGS_NAME}"
777790
SOURCE_DIR "${PACKAGE_SOURCE}"

cmake/get_cpm.cmake

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
set(CPM_DOWNLOAD_VERSION 1.0.0-development-version)
66
set(CPM_HASH_SUM "CPM_HASH_SUM_PLACEHOLDER")
77

8-
if(CPM_SOURCE_CACHE)
8+
if(CPM_PATH)
9+
set(CPM_DOWNLOAD_LOCATION "${CPM_PATH}/CPM.cmake")
10+
elseif(DEFINED ENV{CPM_PATH})
11+
file(TO_CMAKE_PATH "$ENV{CPM_PATH}/CPM.cmake" CPM_DOWNLOAD_LOCATION)
12+
elseif(CPM_SOURCE_CACHE)
913
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
1014
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
1115
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
include(CMakePackageConfigHelpers)
2+
include(${CPM_PATH}/testing.cmake)
3+
4+
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/project-override-env)
5+
6+
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
7+
8+
configure_package_config_file(
9+
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/OverrideCMakeLists.txt.in"
10+
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
11+
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
12+
)
13+
14+
execute_process(
15+
COMMAND
16+
${CMAKE_COMMAND} -E env
17+
"CPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency" ${CMAKE_COMMAND}
18+
"-S${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
19+
RESULT_VARIABLE ret
20+
ERROR_VARIABLE cmake_stderr
21+
)
22+
23+
assert_equal(${ret} "0")
24+
25+
if(NOT "${cmake_stderr}" MATCHES "CPM:.*Dependency.*overridden by environment variable")
26+
message(FATAL_ERROR "Expected CPM ENV override warning not found in output:\n${cmake_stderr}")
27+
else()
28+
message(STATUS "test passed: CPM ENV override warning was emitted")
29+
endif()

test/unit/package-override.cmake

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,18 @@ configure_package_config_file(
1212
)
1313

1414
execute_process(
15-
COMMAND ${CMAKE_COMMAND} -S${CMAKE_CURRENT_LIST_DIR}/local_dependency -B${TEST_BUILD_DIR}
16-
-DCPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
15+
COMMAND ${CMAKE_COMMAND} "-S${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
16+
"-DCPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency"
1717
RESULT_VARIABLE ret
18+
ERROR_VARIABLE cmake_stderr
1819
)
1920

2021
assert_equal(${ret} "0")
22+
23+
if(NOT "${cmake_stderr}" MATCHES "CPM:.*Dependency.*overridden by CMake variable")
24+
message(
25+
FATAL_ERROR "Expected CPM CMake variable override warning not found in output:\n${cmake_stderr}"
26+
)
27+
else()
28+
message(STATUS "test passed: CPM CMake variable override warning was emitted")
29+
endif()

0 commit comments

Comments
 (0)