From 2cf7f5ec3fbf0420b3d803251fd9b894fa1d79c9 Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 16:31:13 -0800 Subject: [PATCH 01/11] #1677: cmake: Move git configuration detection into a standalone cmake script --- cmake/build_git_info.cmake | 60 ++++++++++++----------- cmake/run-git.cmake | 98 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 29 deletions(-) create mode 100644 cmake/run-git.cmake diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index be71af34ff..4f7f37f1cc 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -1,34 +1,36 @@ +function(get_git_dir _git_dir) + set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories + set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") + get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) + if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) + # We have reached the root directory, we are not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + endwhile() + # check if this is a submodule + if(NOT IS_DIRECTORY ${GIT_DIR}) + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + endif() -include(GetGitRevisionDescription) + set(${_git_dir} ${GIT_DIR} PARENT_SCOPE) +endfunction() -get_git_head_revision(GIT_REFSPEC GIT_SHA1) +get_git_dir(GIT_DIR) -# set some variables related to GIT state information -get_git_head_revision(GIT_REFSPEC GIT_SHA1) -git_describe(GIT_EXACT_TAG --tags --abbrev=0 --all) -git_describe(GIT_DESCRIPTION --abbrev=10 --always --tags --long --all) -git_local_changes(GIT_CLEAN_STATUS) +if(NOT EXISTS "${GIT_DIR}/HEAD") + message(FATAL_ERROR "no such file: \"${GIT_DIR}/HEAD\"") +endif() +set(HEAD_FILE "${GIT_DIR}/HEAD") -message(STATUS "REF:${GIT_REFSPEC}") -message(STATUS "REF:${GIT_SHA1}") -message(STATUS "REF:${GIT_DESCRIPTION}") -message(STATUS "REF:${GIT_CLEAN_STATUS}") -message(STATUS "REF:${GIT_EXACT_TAG}") +message(STATUS "Git HEAD file: \"${HEAD_FILE}\"") -configure_file( - ${PROJECT_BASE_DIR}/vt_git_revision.cc.in - ${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revision.cc - @ONLY -) - -# install( -# FILES "${PROJECT_BINARY_DIR}/${cur_build_type}/cmake_config.h" -# DESTINATION include -# CONFIGURATIONS ${cur_build_type} -# ) - -# configure_file( -# "${PROJECT_SOURCE_DIR}/vt_git_revision.cc.in" -# "${CMAKE_CURRENT_BINARY_DIR}/vt_git_revision.cc" -# @ONLY -# ) +find_package(Git REQUIRED) +execute_process(COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revision.cc -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake) diff --git a/cmake/run-git.cmake b/cmake/run-git.cmake new file mode 100644 index 0000000000..2138bbf3ef --- /dev/null +++ b/cmake/run-git.cmake @@ -0,0 +1,98 @@ +# This file is intented to be run with cmake -P + +# Derived from +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +message(STATUS "Reading head file ${HEAD_FILE}") +message(STATUS "Using git executable at \"${GIT_EXECUTABLE}\"") + +set(GIT_SHA1) + +file(READ "${HEAD_FILE}" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" GIT_REFSPEC "${HEAD_CONTENTS}") + if(EXISTS "${GIT_DIR}/${GIT_REFSPEC}") + file(READ "${GIT_DIR}/${GIT_REFSPEC}" GIT_SHA1 LIMIT 1024) + string(STRIP "${GIT_SHA1}" GIT_SHA1) + else() + file(READ "${GIT_DIR}/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${GIT_REFSPEC}") + set(GIT_SHA1 "${CMAKE_MATCH_1}") + endif() + endif() +else() + # detached HEAD + string(STRIP "${HEAD_CONTENTS}" GIT_SHA1) +endif() + +message(STATUS "GIT_REFSPEC: \"${GIT_REFSPEC}\"") +message(STATUS "GIT_SHA1: \"${GIT_SHA1}\"") + +execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${GIT_SHA1} + --tags --abbrev=0 --all + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + GIT_EXACT_TAG + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(NOT res EQUAL 0) + message(FATAL_ERROR "could not get the exact git tag") +endif() + +message(STATUS "GIT_EXACT_TAG: \"${GIT_EXACT_TAG}\"") + +execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + ${GIT_SHA1} + --abbrev=10 --always --tags --long --all + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + GIT_DESCRIPTION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(NOT res EQUAL 0) + message(FATAL_ERROR "could not get the description") +endif() + +message(STATUS "GIT_DESCRIPTION: \"${GIT_DESCRIPTION}\"") + +execute_process(COMMAND + "${GIT_EXECUTABLE}" + diff-index --quiet HEAD -- + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(res EQUAL 0) + set(GIT_CLEAN_STATUS "CLEAN") +else() + set(GIT_CLEAN_STATUS "DIRTY") +endif() + +message(STATUS "Git Clean Status: \"${GIT_CLEAN_STATUS}\"") + +message(STATUS "Configuring ${IN_FILE} to generate ${OUT_FILE}.") +configure_file(${IN_FILE} ${OUT_FILE} @ONLY) \ No newline at end of file From d93609a6210875a19e727901c4ecdbc60c219f35 Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 16:53:59 -0800 Subject: [PATCH 02/11] #1677: cmake: run generator for git configurator as a custom command dependency of VT --- CMakeLists.txt | 2 -- cmake/build_git_info.cmake | 11 ++++++++++- src/CMakeLists.txt | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c597d5b586..cd6d37e24d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,8 +64,6 @@ include(cmake/link_vt.cmake) # Load packages that are required for core VT build include(cmake/load_packages.cmake) -include(cmake/build_git_info.cmake) - include(cmake/check_compiler.cmake) option(vt_gold_linker_enabled "Build VT using the `gold' linker" ON) diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index 4f7f37f1cc..628a4e651c 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -33,4 +33,13 @@ set(HEAD_FILE "${GIT_DIR}/HEAD") message(STATUS "Git HEAD file: \"${HEAD_FILE}\"") find_package(Git REQUIRED) -execute_process(COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revision.cc -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake) +#execute_process(COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revision.cc -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake) + +set(VT_GIT_CONFIG_FILE "${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revision.cc") +add_custom_command( + OUTPUT ${VT_GIT_CONFIG_FILE} + COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${VT_GIT_CONFIG_FILE} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake + DEPENDS ${HEAD_FILE} + ) + +target_sources(${VIRTUAL_TRANSPORT_LIBRARY} PRIVATE ${VT_GIT_CONFIG_FILE}) \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b3f1969656..52fa0bab8c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -204,6 +204,8 @@ add_library( ${HEADER_FILES} ${SOURCE_FILES} ) +include(${CMAKE_CURRENT_LIST_DIR}/../cmake/build_git_info.cmake) + option(vt_no_color_enabled "Build VT with option --vt_no_color set to true by default" OFF) if(vt_no_color_enabled) message(STATUS "Building VT with --vt_no_color set to true by default") From f526544f7f6dea24004bd2a362eb7418819ad5d4 Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 17:02:33 -0800 Subject: [PATCH 03/11] #1677: cmake: watch for changes in git refspec files --- cmake/build_git_info.cmake | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index 628a4e651c..56328a323a 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -30,6 +30,13 @@ if(NOT EXISTS "${GIT_DIR}/HEAD") endif() set(HEAD_FILE "${GIT_DIR}/HEAD") +file(READ "${HEAD_FILE}" HEAD_CONTENTS LIMIT 1024) +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" REFSPEC "${HEAD_CONTENTS}") +endif() + message(STATUS "Git HEAD file: \"${HEAD_FILE}\"") find_package(Git REQUIRED) @@ -39,7 +46,7 @@ set(VT_GIT_CONFIG_FILE "${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revis add_custom_command( OUTPUT ${VT_GIT_CONFIG_FILE} COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${VT_GIT_CONFIG_FILE} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake - DEPENDS ${HEAD_FILE} + DEPENDS ${HEAD_FILE} ${GIT_DIR}/packed-refs ${GIT_DIR}/${REFSPEC} ) target_sources(${VIRTUAL_TRANSPORT_LIBRARY} PRIVATE ${VT_GIT_CONFIG_FILE}) \ No newline at end of file From 1beaa36bec2c540a23c1d7e44648372df7742b80 Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 17:06:35 -0800 Subject: [PATCH 04/11] #1677: cmake: set a secondary variable for refspec files so it can be empty if not on a named branch --- cmake/build_git_info.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index 56328a323a..3212bdfe75 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -35,6 +35,7 @@ string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" REFSPEC "${HEAD_CONTENTS}") + set(REFFILE ${GIT_DIR}/${REFSPEC}) endif() message(STATUS "Git HEAD file: \"${HEAD_FILE}\"") @@ -46,7 +47,7 @@ set(VT_GIT_CONFIG_FILE "${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revis add_custom_command( OUTPUT ${VT_GIT_CONFIG_FILE} COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${VT_GIT_CONFIG_FILE} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake - DEPENDS ${HEAD_FILE} ${GIT_DIR}/packed-refs ${GIT_DIR}/${REFSPEC} + DEPENDS ${HEAD_FILE} ${GIT_DIR}/packed-refs ${REFFILE} ) target_sources(${VIRTUAL_TRANSPORT_LIBRARY} PRIVATE ${VT_GIT_CONFIG_FILE}) \ No newline at end of file From 46db048f7e5b0ebd3051cb20754a3064595c5233 Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 17:08:08 -0800 Subject: [PATCH 05/11] #1677: cmake: clean up old git revision scripts --- cmake-modules/GetGitRevisionDescription.cmake | 166 ------------------ .../GetGitRevisionDescription.cmake.in | 41 ----- 2 files changed, 207 deletions(-) delete mode 100644 cmake-modules/GetGitRevisionDescription.cmake delete mode 100644 cmake-modules/GetGitRevisionDescription.cmake.in diff --git a/cmake-modules/GetGitRevisionDescription.cmake b/cmake-modules/GetGitRevisionDescription.cmake deleted file mode 100644 index 2ebfd40d20..0000000000 --- a/cmake-modules/GetGitRevisionDescription.cmake +++ /dev/null @@ -1,166 +0,0 @@ -# - Returns a version string from Git -# -# These functions force a re-configure on each git commit so that you can -# trust the values of the variables in your build system. -# -# get_git_head_revision( [ ...]) -# -# Returns the refspec and sha hash of the current head revision -# -# git_describe( [ ...]) -# -# Returns the results of git describe on the source tree, and adjusting -# the output so that it tests false if an error occurs. -# -# git_get_exact_tag( [ ...]) -# -# Returns the results of git describe --exact-match on the source tree, -# and adjusting the output so that it tests false if there was no exact -# matching tag. -# -# git_local_changes() -# -# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. -# Uses the return code of "git diff-index --quiet HEAD --". -# Does not regard untracked files. -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: -# 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com -# Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -if(__get_git_revision_description) - return() -endif() -set(__get_git_revision_description YES) - -# We must run the following at "include" time, not at function call time, -# to find the path to this module rather than the path to a calling list file -get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) - -function(get_git_head_revision _refspecvar _hashvar) - set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories - set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") - get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) - if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) - # We have reached the root directory, we are not in git - set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - return() - endif() - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - endwhile() - # check if this is a submodule - if(NOT IS_DIRECTORY ${GIT_DIR}) - file(READ ${GIT_DIR} submodule) - string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) - get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) - get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) - endif() - set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") - if(NOT EXISTS "${GIT_DATA}") - file(MAKE_DIRECTORY "${GIT_DATA}") - endif() - - if(NOT EXISTS "${GIT_DIR}/HEAD") - return() - endif() - set(HEAD_FILE "${GIT_DATA}/HEAD") - configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) - - configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" - "${GIT_DATA}/grabRef.cmake" - @ONLY) - include("${GIT_DATA}/grabRef.cmake") - - set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) - set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) -endfunction() - -function(git_describe _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) - return() - endif() - if(NOT hash) - set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) - return() - endif() - - # TODO sanitize - #if((${ARGN}" MATCHES "&&") OR - # (ARGN MATCHES "||") OR - # (ARGN MATCHES "\\;")) - # message("Please report the following error to the project!") - # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") - #endif() - - execute_process(COMMAND - "${GIT_EXECUTABLE}" - describe - ${hash} - ${ARGN} - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE - res - OUTPUT_VARIABLE - out - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(NOT res EQUAL 0) - set(out "${out}-${res}-NOTFOUND") - endif() - - set(${_var} "${out}" PARENT_SCOPE) -endfunction() - -function(git_get_exact_tag _var) - git_describe(out --exact-match ${ARGN}) - set(${_var} "${out}" PARENT_SCOPE) -endfunction() - -function(git_local_changes _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) - return() - endif() - if(NOT hash) - set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) - return() - endif() - - execute_process(COMMAND - "${GIT_EXECUTABLE}" - diff-index --quiet HEAD -- - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE - res - OUTPUT_VARIABLE - out - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(res EQUAL 0) - set(${_var} "CLEAN" PARENT_SCOPE) - else() - set(${_var} "DIRTY" PARENT_SCOPE) - endif() -endfunction() diff --git a/cmake-modules/GetGitRevisionDescription.cmake.in b/cmake-modules/GetGitRevisionDescription.cmake.in deleted file mode 100644 index 6d8b708efe..0000000000 --- a/cmake-modules/GetGitRevisionDescription.cmake.in +++ /dev/null @@ -1,41 +0,0 @@ -# -# Internal file for GetGitRevisionDescription.cmake -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: -# 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com -# Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -set(HEAD_HASH) - -file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) - -string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) -if(HEAD_CONTENTS MATCHES "ref") - # named branch - string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") - if(EXISTS "@GIT_DIR@/${HEAD_REF}") - configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) - else() - configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) - file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) - if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") - set(HEAD_HASH "${CMAKE_MATCH_1}") - endif() - endif() -else() - # detached HEAD - configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) -endif() - -if(NOT HEAD_HASH) - file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) - string(STRIP "${HEAD_HASH}" HEAD_HASH) -endif() From 77df30d4b824e0772b66e476ec6504000b1bf939 Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 17:21:01 -0800 Subject: [PATCH 06/11] #1677: cmake: only depend on packed refs file if it exists --- cmake/build_git_info.cmake | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index 3212bdfe75..5d0bde060e 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -35,7 +35,11 @@ string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" REFSPEC "${HEAD_CONTENTS}") - set(REFFILE ${GIT_DIR}/${REFSPEC}) + set(REF_FILE ${GIT_DIR}/${REFSPEC}) +endif() + +if (EXISTS ${GIT_DIR}/packed-refs) + set(PACKED_REF_FILE ${GIT_DIR}/packed-refs) endif() message(STATUS "Git HEAD file: \"${HEAD_FILE}\"") @@ -47,7 +51,7 @@ set(VT_GIT_CONFIG_FILE "${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revis add_custom_command( OUTPUT ${VT_GIT_CONFIG_FILE} COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${VT_GIT_CONFIG_FILE} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake - DEPENDS ${HEAD_FILE} ${GIT_DIR}/packed-refs ${REFFILE} + DEPENDS ${HEAD_FILE} ${PACKED_REF_FILE} ${REF_FILE} ) target_sources(${VIRTUAL_TRANSPORT_LIBRARY} PRIVATE ${VT_GIT_CONFIG_FILE}) \ No newline at end of file From 8aee26474addad93a4052db5cf82281fddcc618b Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 17:27:33 -0800 Subject: [PATCH 07/11] #1677: cmake: don't silence git command errors --- cmake/run-git.cmake | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake/run-git.cmake b/cmake/run-git.cmake index 2138bbf3ef..31204fc37d 100644 --- a/cmake/run-git.cmake +++ b/cmake/run-git.cmake @@ -50,7 +50,6 @@ execute_process(COMMAND res OUTPUT_VARIABLE GIT_EXACT_TAG - ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT res EQUAL 0) message(FATAL_ERROR "could not get the exact git tag") @@ -69,7 +68,6 @@ execute_process(COMMAND res OUTPUT_VARIABLE GIT_DESCRIPTION - ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT res EQUAL 0) message(FATAL_ERROR "could not get the description") @@ -84,7 +82,6 @@ execute_process(COMMAND "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE res - ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(res EQUAL 0) set(GIT_CLEAN_STATUS "CLEAN") From c4d037b6640fed68823d4d564199e3373a9e744f Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 17:33:24 -0800 Subject: [PATCH 08/11] #1677: cmake: use the parent directory of the .git folder to locate the git repository directory --- cmake/run-git.cmake | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cmake/run-git.cmake b/cmake/run-git.cmake index 31204fc37d..7dffeb1176 100644 --- a/cmake/run-git.cmake +++ b/cmake/run-git.cmake @@ -14,6 +14,8 @@ message(STATUS "Reading head file ${HEAD_FILE}") message(STATUS "Using git executable at \"${GIT_EXECUTABLE}\"") +get_filename_component(ROOT_DIR ${GIT_DIR} DIRECTORY) + set(GIT_SHA1) file(READ "${HEAD_FILE}" HEAD_CONTENTS LIMIT 1024) @@ -45,7 +47,7 @@ execute_process(COMMAND ${GIT_SHA1} --tags --abbrev=0 --all WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" + "${ROOT_DIR}" RESULT_VARIABLE res OUTPUT_VARIABLE @@ -63,7 +65,7 @@ execute_process(COMMAND ${GIT_SHA1} --abbrev=10 --always --tags --long --all WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" + "${ROOT_DIR}" RESULT_VARIABLE res OUTPUT_VARIABLE @@ -79,7 +81,7 @@ execute_process(COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD -- WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" + "${ROOT_DIR}" RESULT_VARIABLE res OUTPUT_STRIP_TRAILING_WHITESPACE) From 34e8af50a1431a4e18117b2fca8b9deff91218ee Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Mon, 21 Feb 2022 17:37:49 -0800 Subject: [PATCH 09/11] #1677: cmake: set dependency on entire .git folder --- cmake/build_git_info.cmake | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index 5d0bde060e..c5eb649591 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -30,18 +30,6 @@ if(NOT EXISTS "${GIT_DIR}/HEAD") endif() set(HEAD_FILE "${GIT_DIR}/HEAD") -file(READ "${HEAD_FILE}" HEAD_CONTENTS LIMIT 1024) -string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) -if(HEAD_CONTENTS MATCHES "ref") - # named branch - string(REPLACE "ref: " "" REFSPEC "${HEAD_CONTENTS}") - set(REF_FILE ${GIT_DIR}/${REFSPEC}) -endif() - -if (EXISTS ${GIT_DIR}/packed-refs) - set(PACKED_REF_FILE ${GIT_DIR}/packed-refs) -endif() - message(STATUS "Git HEAD file: \"${HEAD_FILE}\"") find_package(Git REQUIRED) @@ -51,7 +39,7 @@ set(VT_GIT_CONFIG_FILE "${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revis add_custom_command( OUTPUT ${VT_GIT_CONFIG_FILE} COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${VT_GIT_CONFIG_FILE} -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake - DEPENDS ${HEAD_FILE} ${PACKED_REF_FILE} ${REF_FILE} + DEPENDS ${GIT_DIR} ) target_sources(${VIRTUAL_TRANSPORT_LIBRARY} PRIVATE ${VT_GIT_CONFIG_FILE}) \ No newline at end of file From 773db107052f2d92ba0de039ee5afb82add17d13 Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Tue, 22 Feb 2022 17:37:11 -0800 Subject: [PATCH 10/11] #1677: cmake: get git folder using git rev-parse and similarly for the current sha1 --- cmake/build_git_info.cmake | 45 ++++++++++++++------------------------ cmake/run-git.cmake | 27 +++++++++++++---------- 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index c5eb649591..606a5f8714 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -1,29 +1,21 @@ -function(get_git_dir _git_dir) - set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories - set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") - get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) - if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) - # We have reached the root directory, we are not in git - set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - return() - endif() - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - endwhile() - # check if this is a submodule - if(NOT IS_DIRECTORY ${GIT_DIR}) - file(READ ${GIT_DIR} submodule) - string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) - get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) - get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) - endif() - - set(${_git_dir} ${GIT_DIR} PARENT_SCOPE) -endfunction() +find_package(Git REQUIRED) +execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir + WORKING_DIRECTORY + "${PROJECT_BASE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + REL_GIT_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) +if (NOT res EQUAL 0) + message(FATAL_ERROR "git invocation failed") +endif() -get_git_dir(GIT_DIR) +get_filename_component(GIT_DIR ${REL_GIT_DIR} ABSOLUTE BASE_DIR ${PROJECT_BASE_DIR}) +message(STATUS "Git DIR: ${GIT_DIR}") +if (NOT GIT_DIR) + message(FATAL_ERROR "not a git directory") +endif() if(NOT EXISTS "${GIT_DIR}/HEAD") message(FATAL_ERROR "no such file: \"${GIT_DIR}/HEAD\"") @@ -32,9 +24,6 @@ set(HEAD_FILE "${GIT_DIR}/HEAD") message(STATUS "Git HEAD file: \"${HEAD_FILE}\"") -find_package(Git REQUIRED) -#execute_process(COMMAND ${CMAKE_COMMAND} -DIN_FILE=${PROJECT_BASE_DIR}/vt_git_revision.cc.in -DOUT_FILE=${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revision.cc -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DGIT_DIR=${GIT_DIR} -DHEAD_FILE=${HEAD_FILE} -P ${CMAKE_CURRENT_LIST_DIR}/run-git.cmake) - set(VT_GIT_CONFIG_FILE "${PROJECT_BIN_DIR}/src/vt/configs/generated/vt_git_revision.cc") add_custom_command( OUTPUT ${VT_GIT_CONFIG_FILE} diff --git a/cmake/run-git.cmake b/cmake/run-git.cmake index 7dffeb1176..8ac835a1c2 100644 --- a/cmake/run-git.cmake +++ b/cmake/run-git.cmake @@ -24,21 +24,24 @@ string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" GIT_REFSPEC "${HEAD_CONTENTS}") - if(EXISTS "${GIT_DIR}/${GIT_REFSPEC}") - file(READ "${GIT_DIR}/${GIT_REFSPEC}" GIT_SHA1 LIMIT 1024) - string(STRIP "${GIT_SHA1}" GIT_SHA1) - else() - file(READ "${GIT_DIR}/packed-refs" PACKED_REFS) - if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${GIT_REFSPEC}") - set(GIT_SHA1 "${CMAKE_MATCH_1}") - endif() - endif() -else() - # detached HEAD - string(STRIP "${HEAD_CONTENTS}" GIT_SHA1) endif() message(STATUS "GIT_REFSPEC: \"${GIT_REFSPEC}\"") + +execute_process(COMMAND + "${GIT_EXECUTABLE}" + rev-parse --verify HEAD + WORKING_DIRECTORY + "${ROOT_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + GIT_SHA1 + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(NOT res EQUAL 0) + message(FATAL_ERROR "could not get the git sha1") +endif() + message(STATUS "GIT_SHA1: \"${GIT_SHA1}\"") execute_process(COMMAND From 6803ce66125559fc95ca5d8398927dd6041e28dc Mon Sep 17 00:00:00 2001 From: Nicolas Morales Date: Wed, 23 Feb 2022 17:02:41 -0800 Subject: [PATCH 11/11] #1677: cmake: fix newline EOF --- cmake/build_git_info.cmake | 2 +- cmake/run-git.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/build_git_info.cmake b/cmake/build_git_info.cmake index 606a5f8714..15689502af 100644 --- a/cmake/build_git_info.cmake +++ b/cmake/build_git_info.cmake @@ -31,4 +31,4 @@ add_custom_command( DEPENDS ${GIT_DIR} ) -target_sources(${VIRTUAL_TRANSPORT_LIBRARY} PRIVATE ${VT_GIT_CONFIG_FILE}) \ No newline at end of file +target_sources(${VIRTUAL_TRANSPORT_LIBRARY} PRIVATE ${VT_GIT_CONFIG_FILE}) diff --git a/cmake/run-git.cmake b/cmake/run-git.cmake index 8ac835a1c2..feb6528767 100644 --- a/cmake/run-git.cmake +++ b/cmake/run-git.cmake @@ -97,4 +97,4 @@ endif() message(STATUS "Git Clean Status: \"${GIT_CLEAN_STATUS}\"") message(STATUS "Configuring ${IN_FILE} to generate ${OUT_FILE}.") -configure_file(${IN_FILE} ${OUT_FILE} @ONLY) \ No newline at end of file +configure_file(${IN_FILE} ${OUT_FILE} @ONLY)