]> Kevux Git Server - rit/commitdiff
Makefile: generate "git.rc" via GIT-VERSION-GEN
authorPatrick Steinhardt <ps@pks.im>
Fri, 6 Dec 2024 13:24:40 +0000 (14:24 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Dec 2024 22:52:09 +0000 (07:52 +0900)
The "git.rc" is used on Windows to embed information like the project
name and version into the resulting executables. As such we need to
inject the version information, which we do by using preprocessor
defines. The logic to do so is non-trivial and needs to be kept in sync
with the different build systems.

Refactor the logic so that we generate "git.rc" via `GIT-VERSION-GEN`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
.gitignore
GIT-VERSION-GEN
Makefile
contrib/buildsystems/CMakeLists.txt
git.rc.in [moved from git.rc with 67% similarity]

index e17963e..d3be460 100644 (file)
 *.tar.gz
 *.dsc
 *.deb
+/git.rc
 /git.spec
 *.exe
 *.[aos]
index c18f24e..a1c8146 100755 (executable)
@@ -58,14 +58,18 @@ then
        GIT_USER_AGENT="git/$GIT_VERSION"
 fi
 
-read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION trailing <<EOF
-$(echo "$GIT_VERSION" 0 0 0 | tr '.a-zA-Z-' ' ')
+# While released Git versions only have three numbers, development builds also
+# have a fourth number that corresponds to the number of patches since the last
+# release.
+read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION GIT_PATCH_LEVEL trailing <<EOF
+$(echo "$GIT_VERSION" 0 0 0 0 | tr '.a-zA-Z-' ' ')
 EOF
 
 sed -e "s|@GIT_VERSION@|$GIT_VERSION|" \
        -e "s|@GIT_MAJOR_VERSION@|$GIT_MAJOR_VERSION|" \
        -e "s|@GIT_MINOR_VERSION@|$GIT_MINOR_VERSION|" \
        -e "s|@GIT_MICRO_VERSION@|$GIT_MICRO_VERSION|" \
+       -e "s|@GIT_PATCH_LEVEL@|$GIT_PATCH_LEVEL|" \
        -e "s|@GIT_BUILT_FROM_COMMIT@|$GIT_BUILT_FROM_COMMIT|" \
        -e "s|@GIT_USER_AGENT@|$GIT_USER_AGENT|" \
        "$INPUT" >"$OUTPUT"+
index 7150ffc..1255d22 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2568,11 +2568,12 @@ $(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
        $(QUIET_GEN)$(cmd_munge_script) && \
        mv $@+ $@
 
-git.res: git.rc GIT-VERSION-FILE GIT-PREFIX
-       $(QUIET_RC)$(RC) \
-         $(join -DMAJOR= -DMINOR= -DMICRO= -DPATCHLEVEL=, $(wordlist 1, 4, \
-           $(shell echo $(GIT_VERSION) 0 0 0 0 | tr '.a-zA-Z-' ' '))) \
-         -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
+git.rc: git.rc.in GIT-VERSION-GEN GIT-VERSION-FILE
+       $(QUIET_GEN)$(SHELL_PATH) ./GIT-VERSION-GEN "$(shell pwd)" $< $@+
+       @if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
+
+git.res: git.rc GIT-PREFIX
+       $(QUIET_RC)$(RC) -i $< -o $@
 
 # This makes sure we depend on the NO_PERL setting itself.
 $(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
@@ -3717,7 +3718,7 @@ clean: profile-clean coverage-clean cocciclean
        $(RM) -r .build $(UNIT_TEST_BIN)
        $(RM) GIT-TEST-SUITES
        $(RM) po/git.pot po/git-core.pot
-       $(RM) git.res
+       $(RM) git.rc git.res
        $(RM) $(OBJECTS)
        $(RM) headless-git.o
        $(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB)
index 3cc5e31..865b3af 100644 (file)
@@ -691,18 +691,25 @@ list(TRANSFORM reftable_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
 add_library(reftable STATIC ${reftable_SOURCES})
 
 if(WIN32)
+       add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.rc
+                       COMMAND "${SH_EXE}" "${CMAKE_SOURCE_DIR}/GIT-VERSION-GEN"
+                               "${CMAKE_SOURCE_DIR}"
+                               "${CMAKE_SOURCE_DIR}/git.rc.in"
+                               "${CMAKE_BINARY_DIR}/git.rc"
+                       DEPENDS "${CMAKE_SOURCE_DIR}/GIT-VERSION-GEN"
+                               "${CMAKE_SOURCE_DIR}/git.rc.in"
+                       VERBATIM)
+
        if(NOT MSVC)#use windres when compiling with gcc and clang
                add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.res
-                               COMMAND ${WINDRES_EXE} -O coff -DMAJOR=${PROJECT_VERSION_MAJOR} -DMINOR=${PROJECT_VERSION_MINOR}
-                                       -DMICRO=${PROJECT_VERSION_PATCH} -DPATCHLEVEL=0 -DGIT_VERSION="\\\"${PROJECT_VERSION}.GIT\\\""
-                                       -i ${CMAKE_SOURCE_DIR}/git.rc -o ${CMAKE_BINARY_DIR}/git.res
+                               COMMAND ${WINDRES_EXE} -O coff -i ${CMAKE_BINARY_DIR}/git.rc -o ${CMAKE_BINARY_DIR}/git.res
+                               DEPENDS "${CMAKE_BINARY_DIR}/git.rc"
                                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
                                VERBATIM)
        else()#MSVC use rc
                add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.res
-                               COMMAND ${CMAKE_RC_COMPILER} /d MAJOR=${PROJECT_VERSION_MAJOR} /d MINOR=${PROJECT_VERSION_MINOR}
-                                       /d MICRO=${PROJECT_VERSION_PATCH} /d PATCHLEVEL=0 /d GIT_VERSION="${PROJECT_VERSION}.GIT"
-                                       /fo ${CMAKE_BINARY_DIR}/git.res ${CMAKE_SOURCE_DIR}/git.rc
+                               COMMAND ${CMAKE_RC_COMPILER} /fo ${CMAKE_BINARY_DIR}/git.res ${CMAKE_BINARY_DIR}/git.rc
+                               DEPENDS "${CMAKE_BINARY_DIR}/git.rc"
                                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
                                VERBATIM)
        endif()
similarity index 67%
rename from git.rc
rename to git.rc.in
index cc3fdc6..e69444e 100644 (file)
--- a/git.rc
+++ b/git.rc.in
@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION     MAJOR,MINOR,MICRO,PATCHLEVEL
-PRODUCTVERSION  MAJOR,MINOR,MICRO,PATCHLEVEL
+FILEVERSION     @GIT_MAJOR_VERSION@,@GIT_MINOR_VERSION@,@GIT_MICRO_VERSION@,@GIT_PATCH_LEVEL@
+PRODUCTVERSION  @GIT_MAJOR_VERSION@,@GIT_MINOR_VERSION@,@GIT_MICRO_VERSION@,@GIT_PATCH_LEVEL@
 BEGIN
   BLOCK "StringFileInfo"
   BEGIN
@@ -11,7 +11,7 @@ BEGIN
       VALUE "InternalName", "git\0"
       VALUE "OriginalFilename", "git.exe\0"
       VALUE "ProductName", "Git\0"
-      VALUE "ProductVersion", GIT_VERSION "\0"
+      VALUE "ProductVersion", "@GIT_VERSION@\0"
     END
   END