From 01b69aad82e9e4876e855167b4ad3388acd3a54e Mon Sep 17 00:00:00 2001 From: Lars Melchior Date: Tue, 25 Feb 2020 13:29:21 +0100 Subject: [PATCH] add support for SOURCE_DIR argument (#97) * add support for SOURCE_DIR argument * simplify code * add test * update comment --- cmake/CPM.cmake | 34 +++++++++---------- test/unit/source_dir.cmake | 19 +++++++++++ test/unit/source_dir/.gitignore | 1 + test/unit/source_dir/CMakeLists.txt.in | 20 +++++++++++ .../unit/source_dir/dependency/CMakeLists.txt | 4 +++ 5 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 test/unit/source_dir.cmake create mode 100644 test/unit/source_dir/.gitignore create mode 100644 test/unit/source_dir/CMakeLists.txt.in create mode 100644 test/unit/source_dir/dependency/CMakeLists.txt diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 6b787ef..d1b7882 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -28,7 +28,7 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR) -set(CURRENT_CPM_VERSION 0.16) +set(CURRENT_CPM_VERSION 0.17) if(CPM_DIRECTORY) if(NOT ${CPM_DIRECTORY} MATCHES ${CMAKE_CURRENT_LIST_DIR}) @@ -208,22 +208,22 @@ function(CPMAddPackage) if (DEFINED CPM_ARGS_DOWNLOAD_COMMAND) set(FETCH_CONTENT_DECLARE_EXTRA_OPTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND}) - else() - if (CPM_SOURCE_CACHE AND NOT DEFINED CPM_ARGS_SOURCE_DIR) - string(TOLOWER ${CPM_ARGS_NAME} lower_case_name) - set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS}) - list(SORT origin_parameters) - string(SHA1 origin_hash "${origin_parameters}") - set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}) - list(APPEND FETCH_CONTENT_DECLARE_EXTRA_OPTS SOURCE_DIR ${download_directory}) - if (EXISTS ${download_directory}) - list(APPEND FETCH_CONTENT_DECLARE_EXTRA_OPTS DOWNLOAD_COMMAND ":") - set(PACKAGE_INFO "${download_directory}") - else() - # remove timestamps so CMake will re-download the dependency - file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-subbuild) - set(PACKAGE_INFO "${PACKAGE_INFO} -> ${download_directory}") - endif() + elseif(DEFINED CPM_ARGS_SOURCE_DIR) + set(FETCH_CONTENT_DECLARE_EXTRA_OPTS SOURCE_DIR ${CPM_ARGS_SOURCE_DIR}) + elseif (CPM_SOURCE_CACHE) + string(TOLOWER ${CPM_ARGS_NAME} lower_case_name) + set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS}) + list(SORT origin_parameters) + string(SHA1 origin_hash "${origin_parameters}") + set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}) + list(APPEND FETCH_CONTENT_DECLARE_EXTRA_OPTS SOURCE_DIR ${download_directory}) + if (EXISTS ${download_directory}) + list(APPEND FETCH_CONTENT_DECLARE_EXTRA_OPTS DOWNLOAD_COMMAND ":") + set(PACKAGE_INFO "${download_directory}") + else() + # remove timestamps so CMake will re-download the dependency + file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-subbuild) + set(PACKAGE_INFO "${PACKAGE_INFO} -> ${download_directory}") endif() endif() diff --git a/test/unit/source_dir.cmake b/test/unit/source_dir.cmake new file mode 100644 index 0000000..664cc44 --- /dev/null +++ b/test/unit/source_dir.cmake @@ -0,0 +1,19 @@ + +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}/source_dir/CMakeLists.txt.in" + "${CMAKE_CURRENT_LIST_DIR}/source_dir/CMakeLists.txt" + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk +) + +execute_process( + COMMAND + ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/source_dir" "-B${TEST_BUILD_DIR}" + RESULT_VARIABLE ret +) + +ASSERT_EQUAL(${ret} "0") diff --git a/test/unit/source_dir/.gitignore b/test/unit/source_dir/.gitignore new file mode 100644 index 0000000..96730bd --- /dev/null +++ b/test/unit/source_dir/.gitignore @@ -0,0 +1 @@ +/CMakeLists.txt \ No newline at end of file diff --git a/test/unit/source_dir/CMakeLists.txt.in b/test/unit/source_dir/CMakeLists.txt.in new file mode 100644 index 0000000..f4eb4d7 --- /dev/null +++ b/test/unit/source_dir/CMakeLists.txt.in @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.14 FATAL_ERROR) + +project(CPMExampleCatch2) + +# ---- Options ---- + +option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF) + +# ---- Dependencies ---- + +include(@CPM_PATH@/CPM.cmake) + +CPMAddPackage( + NAME Dependency + SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency +) + +# ---- Call dependency method to validate correct addition of directory ---- + +dependency_function() diff --git a/test/unit/source_dir/dependency/CMakeLists.txt b/test/unit/source_dir/dependency/CMakeLists.txt new file mode 100644 index 0000000..1da5117 --- /dev/null +++ b/test/unit/source_dir/dependency/CMakeLists.txt @@ -0,0 +1,4 @@ + +function(dependency_function) + message("called external method") +endfunction()