From 5bc6230741008257c33e849e4b84a2c30c19d37c Mon Sep 17 00:00:00 2001 From: Charis Marangos Date: Wed, 16 Oct 2019 04:19:18 +0100 Subject: [PATCH] ExternalProject: Option to turn off recursive update of git submodules Fixes: #19832 --- .../dev/ExternalProject-git-no-recurse.rst | 7 ++ Modules/ExternalProject.cmake | 27 ++++++-- Tests/ExternalProject/CMakeLists.txt | 60 ++++++++++++++++++ Tests/ExternalProject/gitrepo-sub-rec.tgz | Bin 0 -> 9008 bytes 4 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 Help/release/dev/ExternalProject-git-no-recurse.rst create mode 100644 Tests/ExternalProject/gitrepo-sub-rec.tgz diff --git a/Help/release/dev/ExternalProject-git-no-recurse.rst b/Help/release/dev/ExternalProject-git-no-recurse.rst new file mode 100644 index 0000000000..b9e09d3564 --- /dev/null +++ b/Help/release/dev/ExternalProject-git-no-recurse.rst @@ -0,0 +1,7 @@ +ExternalProject-git-no-recurse +------------------------------ + +* The :module:`ExternalProject` module :command:`ExternalProject_Add` + command gained a ``GIT_SUBMODULES_RECURSE`` option to specify whether + Git submodules should be updated recursively. The default is on to + preserve existing behavior. diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index 66061a137d..cd4e22d4e6 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -265,6 +265,11 @@ External Project Definition is set to ``NEW`` if this value is set to an empty string then no submodules are initialized or updated. + ``GIT_SUBMODULES_RECURSE `` + Specify whether git submodules (if any) should update recursively by + passing the ``--recursive`` flag to ``git submodule update``. + If not specified, the default is on. + ``GIT_SHALLOW `` When this option is enabled, the ``git clone`` operation will be given the ``--depth 1`` option. This performs a shallow clone, which avoids @@ -1065,7 +1070,7 @@ define_property(DIRECTORY PROPERTY "EP_UPDATE_DISCONNECTED" INHERITED "ExternalProject module." ) -function(_ep_write_gitclone_script script_filename source_dir git_EXECUTABLE git_repository git_tag git_remote_name init_submodules git_submodules git_shallow git_progress git_config src_name work_dir gitclone_infofile gitclone_stampfile tls_verify) +function(_ep_write_gitclone_script script_filename source_dir git_EXECUTABLE git_repository git_tag git_remote_name init_submodules git_submodules_recurse git_submodules git_shallow git_progress git_config src_name work_dir gitclone_infofile gitclone_stampfile tls_verify) if(NOT GIT_VERSION_STRING VERSION_LESS 1.8.5) # Use `git checkout --` to avoid ambiguity with a local path. set(git_checkout_explicit-- "--") @@ -1153,7 +1158,7 @@ endif() set(init_submodules ${init_submodules}) if(init_submodules) execute_process( - COMMAND \"${git_EXECUTABLE}\" ${git_options} submodule update --recursive --init ${git_submodules} + COMMAND \"${git_EXECUTABLE}\" ${git_options} submodule update ${git_submodules_recurse} --init ${git_submodules} WORKING_DIRECTORY \"${work_dir}/${src_name}\" RESULT_VARIABLE error_code ) @@ -1394,7 +1399,7 @@ if(error_code OR is_remote_ref OR NOT (\"\${tag_sha}\" STREQUAL \"\${head_sha}\" set(init_submodules ${init_submodules}) if(init_submodules) execute_process( - COMMAND \"${git_EXECUTABLE}\" submodule update --recursive --init ${git_submodules} + COMMAND \"${git_EXECUTABLE}\" submodule update ${git_submodules_recurse} --init ${git_submodules} WORKING_DIRECTORY \"${work_dir}/${src_name}\" RESULT_VARIABLE error_code ) @@ -2421,9 +2426,21 @@ function(_ep_add_download_command name) message(FATAL_ERROR "error: could not find git for clone of ${name}") endif() + get_property(git_submodules_recurse_set TARGET ${name} PROPERTY _EP_GIT_SUBMODULES_RECURSE SET) + if(NOT git_submodules_recurse_set) + set(git_submodules_recurse "--recursive") + else() + get_property(git_submodules_recurse_value TARGET ${name} PROPERTY _EP_GIT_SUBMODULES_RECURSE) + if(git_submodules_recurse_value) + set(git_submodules_recurse "--recursive") + else() + set(git_submodules_recurse "") + endif() + endif() + # The git submodule update '--recursive' flag requires git >= v1.6.5 # - if(GIT_VERSION_STRING VERSION_LESS 1.6.5) + if(git_submodules_recurse AND GIT_VERSION_STRING VERSION_LESS 1.6.5) message(FATAL_ERROR "error: git version 1.6.5 or later required for 'git submodule update --recursive': GIT_VERSION_STRING='${GIT_VERSION_STRING}'") endif() @@ -2477,7 +2494,7 @@ function(_ep_add_download_command name) # The script will delete the source directory and then call git clone. # _ep_write_gitclone_script(${tmp_dir}/${name}-gitclone.cmake ${source_dir} - ${GIT_EXECUTABLE} ${git_repository} ${git_tag} ${git_remote_name} ${git_init_submodules} "${git_submodules}" "${git_shallow}" "${git_progress}" "${git_config}" ${src_name} ${work_dir} + ${GIT_EXECUTABLE} ${git_repository} ${git_tag} ${git_remote_name} ${git_init_submodules} "${git_submodules_recurse}" "${git_submodules}" "${git_shallow}" "${git_progress}" "${git_config}" ${src_name} ${work_dir} ${stamp_dir}/${name}-gitinfo.txt ${stamp_dir}/${name}-gitclone-lastrun.txt "${tls_verify}" ) set(comment "Performing download step (git clone) for '${name}'") diff --git a/Tests/ExternalProject/CMakeLists.txt b/Tests/ExternalProject/CMakeLists.txt index 093391e3fb..ef81169ff4 100644 --- a/Tests/ExternalProject/CMakeLists.txt +++ b/Tests/ExternalProject/CMakeLists.txt @@ -482,6 +482,66 @@ if(do_git_tests) ) set_property(TARGET ${proj} PROPERTY FOLDER "GIT") + # Unzip/untar the git repository in our source folder so that other + # projects below may use it to test git args of ExternalProject_Add + # + set(proj SetupLocalGITRepositoryWithRecursiveSubmodules) + ExternalProject_Add(${proj} + SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/LocalRepositories/GIT-with-recursive-submodules + URL ${CMAKE_CURRENT_SOURCE_DIR}/gitrepo-sub-rec.tgz + BUILD_COMMAND "" + CONFIGURE_COMMAND "${GIT_EXECUTABLE}" --version + INSTALL_COMMAND "" + ) + set_property(TARGET ${proj} + PROPERTY FOLDER "SetupRepos/Local/Deeply/Nested/For/Testing") + + set(local_git_repo "../../LocalRepositories/GIT-with-recursive-submodules") + + set(proj TS1-GIT-RECURSIVE_SUBMODULES-default) + ExternalProject_Add(${proj} + GIT_REPOSITORY "${local_git_repo}" + CMAKE_GENERATOR "${CMAKE_GENERATOR}" + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= + -DWITH_RECURSIVE:BOOL=ON + BUILD_COMMAND "" + INSTALL_COMMAND "" + DEPENDS "SetupLocalGITRepository" + "SetupLocalGITRepositoryWithSubmodules" + "SetupLocalGITRepositoryWithRecursiveSubmodules" + ) + set_property(TARGET ${proj} PROPERTY FOLDER "GIT") + + set(proj TS1-GIT-RECURSIVE_SUBMODULES-exclusive) + ExternalProject_Add(${proj} + GIT_REPOSITORY "${local_git_repo}" + GIT_SUBMODULES_RECURSE TRUE + CMAKE_GENERATOR "${CMAKE_GENERATOR}" + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= + -DWITH_RECURSIVE:BOOL=ON + BUILD_COMMAND "" + INSTALL_COMMAND "" + DEPENDS "SetupLocalGITRepository" + "SetupLocalGITRepositoryWithSubmodules" + "SetupLocalGITRepositoryWithRecursiveSubmodules" + ) + set_property(TARGET ${proj} PROPERTY FOLDER "GIT") + + set(proj TS1-GIT-RECURSIVE_SUBMODULES-off) + ExternalProject_Add(${proj} + GIT_REPOSITORY "${local_git_repo}" + GIT_SUBMODULES_RECURSE FALSE + CMAKE_GENERATOR "${CMAKE_GENERATOR}" + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH= + -DWITH_RECURSIVE:BOOL=OFF + BUILD_COMMAND "" + INSTALL_COMMAND "" + DEPENDS "SetupLocalGITRepository" + "SetupLocalGITRepositoryWithSubmodules" + "SetupLocalGITRepositoryWithRecursiveSubmodules" + ) + set_property(TARGET ${proj} PROPERTY FOLDER "GIT") + endif() set(do_hg_tests 0) diff --git a/Tests/ExternalProject/gitrepo-sub-rec.tgz b/Tests/ExternalProject/gitrepo-sub-rec.tgz new file mode 100644 index 0000000000000000000000000000000000000000..b0f3f18b745a7586305d7290343c8a4b83afd152 GIT binary patch literal 9008 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 Wr&oHVS9;|yEk6U388eyyssI20CF7R> literal 0 HcmV?d00001