| find_package(Git QUIET REQUIRED) | |
| include(ExternalProject) | |
| set(srcRepo ${CMAKE_CURRENT_BINARY_DIR}/srcRepo) | |
| set(srcDir ${CMAKE_CURRENT_BINARY_DIR}/src) | |
| set(binDir ${CMAKE_CURRENT_BINARY_DIR}/build) | |
| file(MAKE_DIRECTORY ${srcRepo}) | |
| file(MAKE_DIRECTORY ${srcDir}) | |
| file(GLOB entries ${srcRepo}/*) | |
| file(REMOVE_RECURSE ${entries} ${binDir}) | |
| file(TOUCH ${srcRepo}/firstFile.txt) | |
| configure_file(${CMAKE_CURRENT_LIST_DIR}/FetchGitRefs/CMakeLists.txt | |
| ${srcDir}/CMakeLists.txt COPYONLY) | |
| function(execGitCommand) | |
| execute_process( | |
| WORKING_DIRECTORY ${srcRepo} | |
| COMMAND ${GIT_EXECUTABLE} ${ARGN} | |
| COMMAND_ECHO STDOUT | |
| COMMAND_ERROR_IS_FATAL ANY | |
| ) | |
| endfunction() | |
| function(configureAndBuild tag) | |
| execute_process(COMMAND ${CMAKE_COMMAND} | |
| -G ${CMAKE_GENERATOR} -T "${CMAKE_GENERATOR_TOOLSET}" | |
| -A "${CMAKE_GENERATOR_PLATFORM}" | |
| -D repoDir:PATH=${srcRepo} | |
| -D gitTag:STRING=${tag} | |
| -B ${binDir} | |
| -S ${srcDir} | |
| COMMAND_ECHO STDOUT | |
| COMMAND_ERROR_IS_FATAL ANY | |
| ) | |
| execute_process(COMMAND ${CMAKE_COMMAND} --build ${binDir} --target fetcher | |
| WORKING_DIRECTORY ${binDir} | |
| COMMAND_ECHO STDOUT | |
| COMMAND_ERROR_IS_FATAL ANY | |
| ) | |
| endfunction() | |
| # Setup a fresh source repo with a predictable default branch across all | |
| # git versions | |
| execGitCommand(-c init.defaultBranch=master init) | |
| execGitCommand(config --add user.email "testauthor@cmake.org") | |
| execGitCommand(config --add user.name testauthor) | |
| # Create the initial repo structure | |
| execGitCommand(add firstFile.txt) | |
| execGitCommand(commit -m "First file") | |
| message(STATUS "First configure-and-build") | |
| configureAndBuild(master) | |
| # Create a tagged commit that is not on any branch. With git 2.20 or later, | |
| # this commit won't be fetched without the --tags option. | |
| file(TOUCH ${srcRepo}/secondFile.txt) | |
| execGitCommand(add secondFile.txt) | |
| execGitCommand(commit -m "Second file") | |
| execGitCommand(tag -a -m "Adding tag" tag_of_interest) | |
| execGitCommand(reset --hard HEAD~1) | |
| message(STATUS "Configure-and-build, update to tag") | |
| configureAndBuild(tag_of_interest) | |
| # Do the same, but this time for a commit hash | |
| file(TOUCH ${srcRepo}/thirdFile.txt) | |
| execGitCommand(add thirdFile.txt) | |
| execGitCommand(commit -m "Third file") | |
| execGitCommand(tag -a -m "Adding another tag" check_for_hash) | |
| execGitCommand(reset --hard HEAD~1) | |
| execute_process( | |
| WORKING_DIRECTORY ${srcRepo} | |
| COMMAND ${GIT_EXECUTABLE} rev-parse check_for_hash | |
| COMMAND_ERROR_IS_FATAL ANY | |
| OUTPUT_VARIABLE commit_hash | |
| OUTPUT_STRIP_TRAILING_WHITESPACE | |
| ) | |
| message(STATUS "Configure-and-build, update to commit hash ${commit_hash}") | |
| configureAndBuild(${commit_hash}) |