Skip to content

Commit fd539b8

Browse files
authored
Add dependencies using EXCLUDE_FROM_ALL flag (#198)
* add dependencies using EXCLUDE_FROM_ALL flag * respect DOWNLOAD_ONLY flag * set EXCLUDE_FROM_ALL as an optional flag * use one value arg for consistency * fix argument passing * add unit test * update cmake-format
1 parent 02d57a1 commit fd539b8

File tree

7 files changed

+93
-12
lines changed

7 files changed

+93
-12
lines changed

.cmake-format

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ parse:
3333
DOWNLOAD_NO_EXTRACT: 1
3434
HTTP_USERNAME: 1
3535
HTTP_PASSWORD: 1
36+
EXCLUDE_FROM_ALL: 1
3637
OPTIONS: +
3738
cpmfindpackage:
3839
pargs:

cmake/CPM.cmake

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ function(CPMAddPackage)
257257
FIND_PACKAGE_ARGUMENTS
258258
NO_CACHE
259259
GIT_SHALLOW
260+
EXCLUDE_FROM_ALL
260261
)
261262

262263
set(multiValueArgs OPTIONS)
@@ -387,7 +388,9 @@ function(CPMAddPackage)
387388
set(${CPM_ARGS_NAME}_ADDED YES)
388389
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
389390
if(NOT CPM_ARGS_DOWNLOAD_ONLY AND EXISTS ${download_directory}/CMakeLists.txt)
390-
add_subdirectory(${download_directory} ${${CPM_ARGS_NAME}_BINARY_DIR})
391+
cpm_add_subdirectory(
392+
${download_directory} ${${CPM_ARGS_NAME}_BINARY_DIR} "${CPM_ARGS_EXCLUDE_FROM_ALL}"
393+
)
391394
endif()
392395
set(CPM_SKIP_FETCH TRUE)
393396
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
@@ -427,7 +430,7 @@ function(CPMAddPackage)
427430
cpm_declare_fetch(
428431
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
429432
)
430-
cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}")
433+
cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}" "${CPM_ARGS_EXCLUDE_FROM_ALL}")
431434
cpm_get_fetch_properties("${CPM_ARGS_NAME}")
432435
endif()
433436

@@ -550,23 +553,35 @@ function(cpm_get_fetch_properties PACKAGE)
550553
)
551554
endfunction()
552555

556+
function(cpm_add_subdirectory SOURCE_DIR BINARY_DIR EXCLUDE)
557+
if(EXCLUDE)
558+
set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL)
559+
else()
560+
set(addSubdirectoryExtraArgs "")
561+
endif()
562+
add_subdirectory(${SOURCE_DIR} ${BINARY_DIR} ${addSubdirectoryExtraArgs})
563+
endfunction()
564+
553565
# downloads a previously declared package via FetchContent
554-
function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY)
566+
function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY EXCLUDE)
555567
if(${CPM_DRY_RUN})
556568
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
557569
return()
558570
endif()
559571

560-
if(DOWNLOAD_ONLY)
561-
FetchContent_GetProperties(${PACKAGE})
562-
if(NOT ${PACKAGE}_POPULATED)
563-
FetchContent_Populate(${PACKAGE})
572+
FetchContent_GetProperties(${PACKAGE})
573+
string(TOLOWER "${PACKAGE}" lower_case_name)
574+
575+
if(NOT ${lower_case_name}_POPULATED)
576+
FetchContent_Populate(${PACKAGE})
577+
if(NOT DOWNLOAD_ONLY AND EXISTS ${${lower_case_name}_SOURCE_DIR}/CMakeLists.txt)
578+
set(CPM_OLD_INDENT "${CPM_INDENT}")
579+
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
580+
cpm_add_subdirectory(
581+
${${lower_case_name}_SOURCE_DIR} ${${lower_case_name}_BINARY_DIR} "${EXCLUDE}"
582+
)
583+
set(CPM_INDENT "${CPM_OLD_INDENT}")
564584
endif()
565-
else()
566-
set(CPM_OLD_INDENT "${CPM_INDENT}")
567-
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
568-
FetchContent_MakeAvailable(${PACKAGE})
569-
set(CPM_INDENT "${CPM_OLD_INDENT}")
570585
endif()
571586
endfunction()
572587

cmake/testing.cmake

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@ function(ASSERT_EQUAL)
1010
endif()
1111
endfunction()
1212

13+
function(ASSERT_NOT_EQUAL)
14+
if(NOT ARGC EQUAL 2)
15+
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
16+
endif()
17+
18+
if(${ARGV0} STREQUAL ${ARGV1})
19+
message(FATAL_ERROR "assertion failed: '${ARGV0}' == '${ARGV1}'")
20+
else()
21+
message(STATUS "test passed: '${ARGV0}' != '${ARGV1}'")
22+
endif()
23+
endfunction()
24+
1325
function(ASSERT_EMPTY)
1426
if(NOT ARGC EQUAL 0)
1527
message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/CMakeLists.txt
2+
/package-lock.cmake
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
2+
3+
project(CPMTest)
4+
5+
# ---- Dependencies ----
6+
7+
include(@CPM_PATH@/CPM.cmake)
8+
9+
CPMAddPackage(
10+
NAME BrokenDependency
11+
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
12+
EXCLUDE_FROM_ALL @EXCLUDE_FROM_ALL@
13+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
project(BrokenDependency)
2+
3+
add_custom_target(error ALL ${CMAKE_COMMAND} -E false)

test/unit/exclude_from_all.cmake

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
include(CMakePackageConfigHelpers)
2+
include(${CPM_PATH}/testing.cmake)
3+
4+
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/exclude_from_all)
5+
6+
function(init_project EXCLUDE_FROM_ALL)
7+
configure_package_config_file(
8+
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt.in"
9+
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt"
10+
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
11+
)
12+
13+
execute_process(
14+
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/broken_dependency" "-B${TEST_BUILD_DIR}"
15+
RESULT_VARIABLE ret
16+
)
17+
18+
assert_equal(${ret} "0")
19+
endfunction()
20+
21+
function(build_project expected_success)
22+
execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${TEST_BUILD_DIR}" RESULT_VARIABLE ret)
23+
24+
if(expected_success)
25+
assert_equal(${ret} 0)
26+
else()
27+
assert_not_equal(${ret} 0)
28+
endif()
29+
endfunction()
30+
31+
init_project(FALSE)
32+
build_project(FALSE)
33+
34+
init_project(TRUE)
35+
build_project(TRUE)

0 commit comments

Comments
 (0)