Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmake/.cmake-format-additional_commands-cpm
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ parse:
FIND_PACKAGE_ARGUMENTS: 1
NO_CACHE: 1
GIT_SHALLOW: 1
GIT_SUBMODULES: 1
URL: 1
URL_HASH: 1
URL_MD5: 1
Expand Down
32 changes: 29 additions & 3 deletions cmake/CPM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,7 @@ function(CPMAddPackage)
NO_CACHE
SYSTEM
GIT_SHALLOW
GIT_SUBMODULES
EXCLUDE_FROM_ALL
SOURCE_SUBDIR
CUSTOM_CACHE_KEY
Expand All @@ -689,6 +690,21 @@ function(CPMAddPackage)

cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")

set(NO_SUBMODULES FALSE)
list(FIND ARGN GIT_SUBMODULES _git_submodules_index)
if(NOT _git_submodules_index EQUAL -1)
if(DEFINED CPM_ARGS_GIT_SUBMODULES)
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SUBMODULES ${CPM_ARGS_GIT_SUBMODULES})
else()
# cmake's FetchContent function will skip initializing submodules if GIT_SUBMODULES is set to
# "". CPM has issues passing a variable when it has a value of "" (when lists are made/copied
# variables in them with a value of "" are considered NOT DEFINED). To work around this, we
# set NO_SUBMODULES to TRUE here and have it later tell the FetchContent call to set
# GIT_SUBMODULES to "".
set(NO_SUBMODULES TRUE)
endif()
endif()

# Set default values for arguments
if(NOT DEFINED CPM_ARGS_VERSION)
if(DEFINED CPM_ARGS_GIT_TAG)
Expand Down Expand Up @@ -983,7 +999,8 @@ function(CPMAddPackage)
endif()
endif()
cpm_declare_fetch(
"${CPM_ARGS_NAME}" ${fetchContentDeclareExtraArgs} "${CPM_ARGS_UNPARSED_ARGUMENTS}"
"${CPM_ARGS_NAME}" ${NO_SUBMODULES} ${fetchContentDeclareExtraArgs}
"${CPM_ARGS_UNPARSED_ARGUMENTS}"
)

cpm_fetch_package("${CPM_ARGS_NAME}" ${DOWNLOAD_ONLY} populated ${CPM_ARGS_UNPARSED_ARGUMENTS})
Expand Down Expand Up @@ -1101,13 +1118,22 @@ function(CPMGetPackageVersion PACKAGE OUTPUT)
endfunction()

# declares a package in FetchContent_Declare
function(cpm_declare_fetch PACKAGE)
function(cpm_declare_fetch PACKAGE NO_SUBMODULES)
if(${CPM_DRY_RUN})
cpm_message(STATUS "${CPM_INDENT} Package not declared (dry run)")
return()
endif()

FetchContent_Declare(${PACKAGE} ${ARGN})
if(${NO_SUBMODULES})
cpm_message(STATUS "${CPM_INDENT} ${PACKAGE}: Not cloning submodules")
FetchContent_Declare(
${PACKAGE}
${ARGN}
GIT_SUBMODULES ""
)
else()
FetchContent_Declare(${PACKAGE} ${ARGN})
endif()
endfunction()

# returns properties for a package previously defined by cpm_declare_fetch
Expand Down
65 changes: 65 additions & 0 deletions test/integration/test_fetchcontent_compatibility.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,69 @@ def test_add_dependency_cpm_and_fetchcontent
assert_success prj.build
end

def test_submodules_not_cloned_when_git_submodules_empty
prj = make_project from_template: 'using-adder'

prj.create_lists_from_default_template package: <<~PACK
CPMAddPackage(
NAME testpack-adder
GITHUB_REPOSITORY gillamkid/testpack-adder
GIT_TAG f154cd373f2eefba715ca765892bb1c788a5f065
GIT_SUBMODULES ""
)

# should have no effect, as we added the dependency using CPM
FetchContent_Declare(
testpack-adder
GIT_REPOSITORY https://github.com/gillamkid/testpack-adder
GIT_TAG f154cd373f2eefba715ca765892bb1c788a5f065
)
FetchContent_MakeAvailable(testpack-adder)
PACK

# configure with unpopulated cache
assert_success prj.configure
assert_success prj.build

# check the correct repo/branch was cloned
submodule_container_readme = File.join(prj.build_dir, '_deps', 'testpack-adder-src', 'submodules', 'README.md')
assert_true File.exist?(submodule_container_readme)

# check recursive cloning of submodules did NOT happen
submodule_file = File.join(prj.build_dir, '_deps', 'testpack-adder-src', 'submodules', 'tinySubmodule', 'README.md')
assert_false File.exist?(submodule_file)
end

def test_submodules_cloned_recursively_by_default
prj = make_project from_template: 'using-adder'

prj.create_lists_from_default_template package: <<~PACK
CPMAddPackage(
NAME testpack-adder
GITHUB_REPOSITORY gillamkid/testpack-adder
GIT_TAG f154cd373f2eefba715ca765892bb1c788a5f065
)

# should have no effect, as we added the dependency using CPM
FetchContent_Declare(
testpack-adder
GIT_REPOSITORY https://github.com/gillamkid/testpack-adder
GIT_TAG f154cd373f2eefba715ca765892bb1c788a5f065
)
FetchContent_MakeAvailable(testpack-adder)
PACK

# configure with unpopulated cache
assert_success prj.configure
assert_success prj.build

# check the correct repo/branch was cloned
submodule_container_readme = File.join(prj.build_dir, '_deps', 'testpack-adder-src', 'submodules', 'README.md')
assert_true File.exist?(submodule_container_readme)

# check recursive cloning of submodules happened
submodule_file = File.join(prj.build_dir, '_deps', 'testpack-adder-src', 'submodules', 'tinySubmodule', 'README.md')
assert_true File.exist?(submodule_file)
end

end
Loading