include_guard() # git_info calls a git COMMAND and put the result in VARNAME # function(git_info) cmake_parse_arguments(PARSE_ARGV 0 A "CAN_FAIL" "VARNAME" "COMMAND;WORKING_DIRECTORY") if(NOT A_WORKING_DIRECTORY) set(A_WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) endif() execute_process( COMMAND ${A_COMMAND} RESULT_VARIABLE result OUTPUT_VARIABLE output COMMAND_ECHO NONE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${A_WORKING_DIRECTORY}) if(NOT result) if(A_VARNAME) set(${A_VARNAME} "${output}" PARENT_SCOPE) endif() if (A_FAIL) set(${A_FAIL} FALSE PARENT_SCOPE) endif() else() if (A_FAIL) set(${A_FAIL} TRUE PARENT_SCOPE) endif() if(A_VARNAME) set(${A_VARNAME} FALSE PARENT_SCOPE) endif() if(NOT A_CAN_FAIL) message(SEND_ERROR "failed git command: ${A_COMMAND}") endif() endif() endfunction() # jpp_git_info sets a few variables with some git info # # KM3NET_JPP_GIT_VERSION : the git tag # KM3NET_JPP_GIT_COMMIT : the git commit hash # KM3NET_JPP_GIT_DATE : the HEAD date # # (note: this is a macro and not a function on purpose for var scope reason) # macro(jpp_global_git_info) find_package(Git) if(NOT Git_FOUND) message(WARNING "Could not find git, so no git information can be retrieved...") return() endif() set(KM3NET_JPP_IS_GIT_REPO TRUE) git_info(COMMAND ${GIT_EXECUTABLE} status CAN_FAIL VARNAME KM3NET_JPP_IS_GIT_REPO) if(NOT Git_FOUND) message(WARNING "source dir is not a git repo, so no git information can be retrieved...") return() endif() if(KM3NET_JPP_IS_GIT_REPO) git_info(COMMAND ${GIT_EXECUTABLE} --no-pager describe --tags --always --dirty VARNAME KM3NET_JPP_GIT_VERSION) git_info(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD VARNAME KM3NET_JPP_GIT_COMMIT) git_info(COMMAND ${GIT_EXECUTABLE} show -s --format=%cI HEAD VARNAME KM3NET_JPP_GIT_DATE) endif() endmacro() jpp_global_git_info() # # jpp_git_info extract git information for a given file # function(jpp_git_info file) cmake_parse_arguments( PARSE_ARGV 1 A "" "GIT_COMMIT_DATE;GIT_COMMIT_NAME;GIT_COMMIT_EMAIL" "" ) if(NOT Git_FOUND) message(WARNING "Could not find git, so no git information can be retrieved...") return() endif() git_info(COMMAND ${GIT_EXECUTABLE} log -n1 --pretty=tformat:%cd --date=format:%c ${file} VARNAME commit_date WORKING_DIRECTORY ${CMAKE_CURRENT_CMAKE_LIST_DIR}) git_info(COMMAND ${GIT_EXECUTABLE} log -n1 --pretty=tformat:%cn ${file} VARNAME commit_name WORKING_DIRECTORY ${CMAKE_CURRENT_CMAKE_LIST_DIR}) git_info(COMMAND ${GIT_EXECUTABLE} log -n1 --pretty=tformat:%ce ${file} VARNAME commit_email WORKING_DIRECTORY ${CMAKE_CURRENT_CMAKE_LIST_DIR}) if(A_GIT_COMMIT_EMAIL) set(${A_GIT_COMMIT_EMAIL} ${commit_email} PARENT_SCOPE) endif() if(A_GIT_COMMIT_NAME) set(${A_GIT_COMMIT_NAME} ${commit_name} PARENT_SCOPE) endif() if(A_GIT_COMMIT_DATE) set(${A_GIT_COMMIT_DATE} ${commit_date} PARENT_SCOPE) endif() endfunction()