| 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}) |