mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2026-02-05 22:35:49 +08:00
Fix support for source subdirectories (#238)
* add support for source subdirectories * style fixes * remove debug log * grammar fix in comment
This commit is contained in:
@@ -388,6 +388,7 @@ function(CPMAddPackage)
|
|||||||
NO_CACHE
|
NO_CACHE
|
||||||
GIT_SHALLOW
|
GIT_SHALLOW
|
||||||
EXCLUDE_FROM_ALL
|
EXCLUDE_FROM_ALL
|
||||||
|
SOURCE_SUBDIR
|
||||||
)
|
)
|
||||||
|
|
||||||
set(multiValueArgs URL OPTIONS)
|
set(multiValueArgs URL OPTIONS)
|
||||||
@@ -549,11 +550,11 @@ function(CPMAddPackage)
|
|||||||
set(${CPM_ARGS_NAME}_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-build)
|
set(${CPM_ARGS_NAME}_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-build)
|
||||||
set(${CPM_ARGS_NAME}_ADDED YES)
|
set(${CPM_ARGS_NAME}_ADDED YES)
|
||||||
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
||||||
if(NOT CPM_ARGS_DOWNLOAD_ONLY AND EXISTS ${download_directory}/CMakeLists.txt)
|
cpm_add_subdirectory(
|
||||||
cpm_add_subdirectory(
|
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
||||||
${download_directory} ${${CPM_ARGS_NAME}_BINARY_DIR} "${CPM_ARGS_EXCLUDE_FROM_ALL}"
|
"${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}"
|
||||||
)
|
"${CPM_ARGS_EXCLUDE_FROM_ALL}"
|
||||||
endif()
|
)
|
||||||
set(CPM_SKIP_FETCH TRUE)
|
set(CPM_SKIP_FETCH TRUE)
|
||||||
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
|
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
|
||||||
else()
|
else()
|
||||||
@@ -592,7 +593,12 @@ function(CPMAddPackage)
|
|||||||
cpm_declare_fetch(
|
cpm_declare_fetch(
|
||||||
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
|
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
|
||||||
)
|
)
|
||||||
cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}" "${CPM_ARGS_EXCLUDE_FROM_ALL}")
|
cpm_fetch_package("${CPM_ARGS_NAME}")
|
||||||
|
cpm_add_subdirectory(
|
||||||
|
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
||||||
|
"${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}"
|
||||||
|
"${CPM_ARGS_EXCLUDE_FROM_ALL}"
|
||||||
|
)
|
||||||
cpm_get_fetch_properties("${CPM_ARGS_NAME}")
|
cpm_get_fetch_properties("${CPM_ARGS_NAME}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -715,36 +721,44 @@ function(cpm_get_fetch_properties PACKAGE)
|
|||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(cpm_add_subdirectory SOURCE_DIR BINARY_DIR EXCLUDE)
|
# adds a package as a subdirectory if viable, according to provided options
|
||||||
if(EXCLUDE)
|
function(cpm_add_subdirectory PACKAGE DOWNLOAD_ONLY SOURCE_DIR BINARY_DIR EXCLUDE)
|
||||||
set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL)
|
if(NOT DOWNLOAD_ONLY AND EXISTS ${SOURCE_DIR}/CMakeLists.txt)
|
||||||
else()
|
if(EXCLUDE)
|
||||||
set(addSubdirectoryExtraArgs "")
|
set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL)
|
||||||
|
else()
|
||||||
|
set(addSubdirectoryExtraArgs "")
|
||||||
|
endif()
|
||||||
|
set(CPM_OLD_INDENT "${CPM_INDENT}")
|
||||||
|
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
|
||||||
|
add_subdirectory(${SOURCE_DIR} ${BINARY_DIR} ${addSubdirectoryExtraArgs})
|
||||||
|
set(CPM_INDENT "${CPM_OLD_INDENT}")
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(${SOURCE_DIR} ${BINARY_DIR} ${addSubdirectoryExtraArgs})
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# downloads a previously declared package via FetchContent
|
# downloads a previously declared package via FetchContent and exports the variables
|
||||||
function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY EXCLUDE)
|
# `${PACKAGE}_SOURCE_DIR` and `${PACKAGE}_BINARY_DIR` to the parent scope
|
||||||
|
function(cpm_fetch_package PACKAGE)
|
||||||
if(${CPM_DRY_RUN})
|
if(${CPM_DRY_RUN})
|
||||||
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
|
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
FetchContent_GetProperties(${PACKAGE})
|
FetchContent_GetProperties(${PACKAGE})
|
||||||
string(TOLOWER "${PACKAGE}" lower_case_name)
|
|
||||||
|
|
||||||
if(NOT ${lower_case_name}_POPULATED)
|
if(NOT ${lower_case_name}_POPULATED)
|
||||||
FetchContent_Populate(${PACKAGE})
|
FetchContent_Populate(${PACKAGE})
|
||||||
if(NOT DOWNLOAD_ONLY AND EXISTS ${${lower_case_name}_SOURCE_DIR}/CMakeLists.txt)
|
|
||||||
set(CPM_OLD_INDENT "${CPM_INDENT}")
|
|
||||||
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
|
|
||||||
cpm_add_subdirectory(
|
|
||||||
${${lower_case_name}_SOURCE_DIR} ${${lower_case_name}_BINARY_DIR} "${EXCLUDE}"
|
|
||||||
)
|
|
||||||
set(CPM_INDENT "${CPM_OLD_INDENT}")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
string(TOLOWER "${PACKAGE}" lower_case_name)
|
||||||
|
set(${PACKAGE}_SOURCE_DIR
|
||||||
|
${${lower_case_name}_SOURCE_DIR}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
set(${PACKAGE}_BINARY_DIR
|
||||||
|
${${lower_case_name}_BINARY_DIR}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# splits a package option
|
# splits a package option
|
||||||
|
|||||||
17
test/unit/local_dependency/SubdirCMakeLists.txt.in
Normal file
17
test/unit/local_dependency/SubdirCMakeLists.txt.in
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMTest)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(@CPM_PATH@/CPM.cmake)
|
||||||
|
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME Dependency
|
||||||
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||||
|
SOURCE_SUBDIR inner
|
||||||
|
)
|
||||||
|
|
||||||
|
# ---- Call inner dependency method to validate correct addition of subdirectory ----
|
||||||
|
|
||||||
|
inner_dependency_function()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
function(inner_dependency_function)
|
||||||
|
message("called inner method")
|
||||||
|
endfunction()
|
||||||
17
test/unit/subdir.cmake
Normal file
17
test/unit/subdir.cmake
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
||||||
|
|
||||||
|
configure_package_config_file(
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/SubdirCMakeLists.txt.in"
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||||
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
|
)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
|
RESULT_VARIABLE ret
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
||||||
Reference in New Issue
Block a user