diff --git a/CMakeLists.txt b/CMakeLists.txt index bdafc3180b..e0b4d39c01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -322,19 +322,43 @@ else() message(STATUS "SOURCE_DATE_EPOCH is set ($ENV{SOURCE_DATE_EPOCH}): SOURCE_DATE set to \"${SOURCE_DATE}\"") endif() -# Current Git tag/version -# ideally we would separate the hash suffix into its own variable, but sed is not available everywhere -execute_process( - COMMAND "git" "describe" "--tag" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_TAG - RESULT_VARIABLE GIT_TAG_ERROR - OUTPUT_STRIP_TRAILING_WHITESPACE) -if(GIT_TAG_ERROR AND NOT GIT_TAG_ERROR EQUAL 0) - message(WARNING "Unable to determine Git tag") +#Check for Git on the system +find_package(Git QUIET) +if (NOT GIT_FOUND) + message(WARNING "Git not found!") set(GIT_TAG vUNKNOWN) + set(GIT_HASH vUNKNOWN) +else() + #Get git tag + execute_process( + COMMAND "git" "describe" "--tags" "--abbrev=0" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_TAG + RESULT_VARIABLE GIT_TAG_ERROR + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(GIT_TAG_ERROR AND NOT GIT_TAG_ERROR EQUAL 0) + message(WARNING "Unable to determine Git tag") + set(GIT_TAG vUNKNOWN) + else() + message(STATUS "Git tag is ${GIT_TAG}") + endif() + + #Get Git commit short hash + execute_process( + COMMAND "git" "rev-parse" "--short" "HEAD" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_HASH + RESULT_VARIABLE GIT_HASH_ERROR + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(GIT_HASH_ERROR AND NOT GIT_HASH_ERROR EQUAL 0) + message(WARNING "Unable to determine Git hash") + set(GIT_HASH vUNKNOWN) + else() + message(STATUS "Git hash is ${GIT_HASH}") + endif() endif() -message(STATUS "Git tag is ${GIT_TAG}") configure_file(shared/qcommon/q_version.h.in shared/qcommon/q_version.h @ONLY) diff --git a/codemp/CMakeLists.txt b/codemp/CMakeLists.txt index 417a7ae436..74cab9fcef 100644 --- a/codemp/CMakeLists.txt +++ b/codemp/CMakeLists.txt @@ -23,6 +23,16 @@ endif(NOT InOpenJK) set(MPSharedDefines ${SharedDefines}) +if (GIT_FOUND) + if (WIN32) + add_custom_target(GET_GIT_TAG_AND_HASH + COMMAND cmd /c "${CMAKE_SOURCE_DIR}/scripts/header/update_header.bat" "${CMAKE_BINARY_DIR}/shared/qcommon/q_version.h") + elseif(UNIX OR APPLE) + add_custom_target(GET_GIT_TAG_AND_HASH + COMMAND "${CMAKE_SOURCE_DIR}/scripts/header/update_header.sh" "${CMAKE_BINARY_DIR}/shared/qcommon/q_version.h") + endif() +endif() + # Add Game Project if(BuildMPGame) add_subdirectory("${MPDir}/game") @@ -48,7 +58,6 @@ if(BuildMPRdVulkan) add_subdirectory("${MPDir}/rd-vulkan") endif(BuildMPRdVulkan) - # Add rend2 JKA Renderer Project if(BuildMPRend2) add_subdirectory("${MPDir}/rd-rend2") @@ -647,6 +656,10 @@ if(BuildMPEngine) set_target_properties(${MPEngine} PROPERTIES INCLUDE_DIRECTORIES "${MPEngineIncludeDirectories}") set_target_properties(${MPEngine} PROPERTIES PROJECT_LABEL "MP Client") target_link_libraries(${MPEngine} ${MPEngineLibraries}) + + if (GIT_FOUND) + add_dependencies(${MPEngine} GET_GIT_TAG_AND_HASH) + endif() endif(BuildMPEngine) # Dedicated Server (Engine) (jampded.exe) @@ -739,6 +752,10 @@ if(BuildMPDed) set_target_properties(${MPDed} PROPERTIES INCLUDE_DIRECTORIES "${MPDedIncludeDirectories}") set_target_properties(${MPDed} PROPERTIES PROJECT_LABEL "MP Dedicated Server") target_link_libraries(${MPDed} ${MPDedLibraries}) + + if (GIT_FOUND) + add_dependencies(${MPDed} GET_GIT_TAG_AND_HASH) + endif() endif(BuildMPDed) include(InstallZIP) diff --git a/codemp/cgame/CMakeLists.txt b/codemp/cgame/CMakeLists.txt index c04f1e3a2e..72bb94e0b1 100644 --- a/codemp/cgame/CMakeLists.txt +++ b/codemp/cgame/CMakeLists.txt @@ -180,7 +180,12 @@ set_property(TARGET ${MPCGame} APPEND PROPERTY COMPILE_OPTIONS ${OPENJK_VISIBILI set_target_properties(${MPCGame} PROPERTIES INCLUDE_DIRECTORIES "${MPCGameIncludeDirectories}") set_target_properties(${MPCGame} PROPERTIES PROJECT_LABEL "MP Client Game Library") + # no libraries used if(MPCGameLibraries) target_link_libraries(${MPCGame} ${MPCGameLibraries}) + + if (GIT_FOUND) + add_dependencies(${MPCGame} GET_GIT_TAG_AND_HASH) + endif() endif(MPCGameLibraries) diff --git a/codemp/game/CMakeLists.txt b/codemp/game/CMakeLists.txt index 7cf522a131..b6b74b23d9 100644 --- a/codemp/game/CMakeLists.txt +++ b/codemp/game/CMakeLists.txt @@ -245,4 +245,8 @@ set_target_properties(${MPGame} PROPERTIES PROJECT_LABEL "MP Game Library") # no libraries used if(MPGameLibraries) target_link_libraries(${MPGame} ${MPGameLibraries}) + + if (GIT_FOUND) + add_dependencies(${MPGame} GET_GIT_TAG_AND_HASH) + endif() endif(MPGameLibraries) diff --git a/codemp/qcommon/game_version.h b/codemp/qcommon/game_version.h index 55990e1164..cca8afcc22 100644 --- a/codemp/qcommon/game_version.h +++ b/codemp/qcommon/game_version.h @@ -38,12 +38,12 @@ along with this program; if not, see . #define VERSION_STRING_DOTTED XSTRING(VERSION_MAJOR_RELEASE) "." XSTRING(VERSION_MINOR_RELEASE) "." XSTRING(VERSION_EXTERNAL_BUILD) "." XSTRING(VERSION_INTERNAL_BUILD) // "a.b.c.d" #if defined(_DEBUG) - #define JK_VERSION "(debug)EternalJK: " GIT_TAG + #define JK_VERSION "(debug)EternalJK: " GIT_TAG "-" GIT_HASH #define JK_VERSION_OLD "(debug)JAmp: v" VERSION_STRING_DOTTED #elif defined (TOURNAMENT_CLIENT) - #define JK_VERSION "EternalJK: Tournament Client" GIT_TAG + #define JK_VERSION "EternalJK: Tournament Client: " GIT_TAG "-" GIT_HASH #define JK_VERSION_OLD "JAmp: v" VERSION_STRING_DOTTED #else - #define JK_VERSION "EternalJK: " GIT_TAG + #define JK_VERSION "EternalJK: " GIT_TAG "-" GIT_HASH #define JK_VERSION_OLD "JAmp: v" VERSION_STRING_DOTTED #endif diff --git a/codemp/ui/CMakeLists.txt b/codemp/ui/CMakeLists.txt index 8fc15c1ec3..bc87f4d00a 100644 --- a/codemp/ui/CMakeLists.txt +++ b/codemp/ui/CMakeLists.txt @@ -128,4 +128,8 @@ set_target_properties(${MPUI} PROPERTIES PROJECT_LABEL "MP UI Library") # no libraries used if(MPUILibraries) target_link_libraries(${MPUI} ${MPUILibraries}) + + if (GIT_FOUND) + add_dependencies(${MPUI} GET_GIT_TAG_AND_HASH) + endif() endif(MPUILibraries) diff --git a/scripts/header/update_header.bat b/scripts/header/update_header.bat new file mode 100644 index 0000000000..614f3e2e1f --- /dev/null +++ b/scripts/header/update_header.bat @@ -0,0 +1,20 @@ +@echo off +setlocal +echo Updating Git tag and hash... + +:: Check if header file path is provided +if "%~1"=="" ( + echo Usage: %~nx0 [HeaderFilePath] + exit /b +) + +:: Get the current git tag and hash +for /f "delims=" %%i in ('git describe --tags --abbrev^=0') do set GIT_TAG=%%i +for /f "delims=" %%i in ('git rev-parse --short HEAD') do set GIT_HASH=%%i + +:: Use powershell to replace the GIT_TAG and GIT_HASH in the header file +powershell -Command "(gc %~1) -replace '#define GIT_TAG .*', '#define GIT_TAG \""%GIT_TAG%\""' | Out-File -encoding ASCII %~1" +powershell -Command "(gc %~1) -replace '#define GIT_HASH .*', '#define GIT_HASH \""%GIT_HASH%\""' | Out-File -encoding ASCII %~1" + +echo Git tag is %GIT_TAG% +echo Git hash is %GIT_HASH% diff --git a/scripts/header/update_header.sh b/scripts/header/update_header.sh new file mode 100755 index 0000000000..0e12848ae7 --- /dev/null +++ b/scripts/header/update_header.sh @@ -0,0 +1,19 @@ +echo "Updating Git tag and hash..." + +# Check if header file path is provided +if [ -z "$1" ] +then + echo "Usage: $0 [HeaderFilePath]" + exit 1 +fi + +# Get the current git tag and hash +GIT_TAG=$(git describe --tags --abbrev=0) +GIT_HASH=$(git rev-parse --short HEAD) + +# Use sed to replace the GIT_TAG and GIT_HASH in the header file +sed -i -e "s/#define GIT_TAG .*/#define GIT_TAG \"$GIT_TAG\"/g" $1 +sed -i -e "s/#define GIT_HASH .*/#define GIT_HASH \"$GIT_HASH\"/g" $1 + +echo "Git tag is $GIT_TAG" +echo "Git hash is $GIT_HASH" \ No newline at end of file diff --git a/shared/qcommon/q_version.h.in b/shared/qcommon/q_version.h.in index 559233daf4..ec6b857860 100644 --- a/shared/qcommon/q_version.h.in +++ b/shared/qcommon/q_version.h.in @@ -1,5 +1,6 @@ #cmakedefine SOURCE_DATE "@SOURCE_DATE@" #cmakedefine GIT_TAG "@GIT_TAG@" +#cmakedefine GIT_HASH "@GIT_HASH@" #cmakedefine BUILD_PORTABLE #if !defined(SOURCE_DATE)