diff --git a/cmake/modules/GetFalcoVersion.cmake b/cmake/modules/GetFalcoVersion.cmake index 7281132d..6bba3690 100644 --- a/cmake/modules/GetFalcoVersion.cmake +++ b/cmake/modules/GetFalcoVersion.cmake @@ -16,18 +16,32 @@ include(GetGitRevisionDescription) # Create the falco version variable according to git index if(NOT FALCO_VERSION) - string(STRIP "${FALCO_HASH}" FALCO_HASH) # Try to obtain the exact git tag git_get_exact_tag(FALCO_TAG) if(NOT FALCO_TAG) - # Obtain the closest tag - git_describe(FALCO_VERSION "--always" "--tags" "--abbrev=7") - # Fallback version - if(FALCO_VERSION MATCHES "NOTFOUND$") - set(FALCO_VERSION "0.0.0") - endif() - # Format FALCO_VERSION to be semver with prerelease and build part - string(REPLACE "-g" "+" FALCO_VERSION "${FALCO_VERSION}") + # Fetch current hash + get_git_head_revision(refspec FALCO_HASH) + if(NOT FALCO_HASH OR FALCO_HASH MATCHES "NOTFOUND$") + set(FALCO_VERSION "0.0.0") + else() + # Obtain the closest tag + git_get_latest_tag(FALCO_LATEST_TAG) + if(NOT FALCO_LATEST_TAG OR FALCO_LATEST_TAG MATCHES "NOTFOUND$") + set(FALCO_VERSION "0.0.0") + else() + # Compute commit delta since tag + git_get_delta_from_tag(FALCO_DELTA ${FALCO_LATEST_TAG} ${FALCO_HASH}) + if(NOT FALCO_DELTA OR FALCO_DELTA MATCHES "NOTFOUND$") + set(FALCO_VERSION "0.0.0") + else() + # Cut hash to 7 bytes + string(SUBSTRING ${FALCO_HASH} 0 7 FALCO_HASH) + # Format FALCO_VERSION to be semver with prerelease and build part + set(FALCO_VERSION + "${FALCO_LATEST_TAG}-${FALCO_DELTA}+${FALCO_HASH}") + endif() + endif() + endif() else() # A tag has been found: use it as the Falco version set(FALCO_VERSION "${FALCO_TAG}") diff --git a/cmake/modules/GetGitRevisionDescription.cmake b/cmake/modules/GetGitRevisionDescription.cmake index 4b54161d..4e7a2739 100644 --- a/cmake/modules/GetGitRevisionDescription.cmake +++ b/cmake/modules/GetGitRevisionDescription.cmake @@ -86,29 +86,36 @@ function(get_git_head_revision _refspecvar _hashvar) PARENT_SCOPE) endfunction() -function(git_describe _var) +function(git_get_latest_tag _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) + + # We use git describe --tags `git rev-list --tags --max-count=1` + execute_process(COMMAND + "${GIT_EXECUTABLE}" + rev-list + --tags + --max-count=1 + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + COMMAND tail -n1 + RESULT_VARIABLE + res + OUTPUT_VARIABLE + tag_hash + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${tag_hash}-${res}-NOTFOUND" PARENT_SCOPE) return() endif() execute_process(COMMAND "${GIT_EXECUTABLE}" describe - ${hash} - ${ARGN} + --tags + ${tag_hash} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE @@ -120,10 +127,108 @@ function(git_describe _var) if(NOT res EQUAL 0) set(out "${out}-${res}-NOTFOUND") endif() + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_delta_from_tag _var tag hash) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + + # Count commits in HEAD + execute_process(COMMAND + "${GIT_EXECUTABLE}" + rev-list + --count + ${hash} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out_counter_head + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(${_var} "HEADCOUNT-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # Count commits in latest tag + execute_process(COMMAND + "${GIT_EXECUTABLE}" + rev-list + --count + ${tag} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out_counter_tag + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(${_var} "TAGCOUNT-NOTFOUND" PARENT_SCOPE) + return() + endif() + + execute_process(COMMAND + expr + ${out_counter_head} - ${out_counter_tag} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out_delta + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(${_var} "DELTA-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(${_var} "${out_delta}" 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() + + 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) + "${out}" + PARENT_SCOPE) endfunction() function(git_get_exact_tag _var) diff --git a/userspace/falco/config_falco.h.in b/userspace/falco/config_falco.h.in index 0b4d79ef..398b1d78 100644 --- a/userspace/falco/config_falco.h.in +++ b/userspace/falco/config_falco.h.in @@ -16,8 +16,6 @@ limitations under the License. #pragma once -#define FALCO_BRANCH "@FALCO_REF@" -#define FALCO_HASH "@FALCO_HASH@" #define FALCO_VERSION "@FALCO_VERSION@" #define FALCO_VERSION_MAJOR @FALCO_VERSION_MAJOR@ #define FALCO_VERSION_MINOR @FALCO_VERSION_MINOR@