Skip to content

Commit 9bb10d2

Browse files
pks-tgitster
authored andcommitted
Makefile: generate "git.rc" via GIT-VERSION-GEN
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 0c8d339 commit 9bb10d2

File tree

5 files changed

+30
-17
lines changed

5 files changed

+30
-17
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@
199199
*.tar.gz
200200
*.dsc
201201
*.deb
202+
/git.rc
202203
/git.spec
203204
*.exe
204205
*.[aos]

GIT-VERSION-GEN

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,18 @@ then
5858
GIT_USER_AGENT="git/$GIT_VERSION"
5959
fi
6060

61-
read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION trailing <<EOF
62-
$(echo "$GIT_VERSION" 0 0 0 | tr '.a-zA-Z-' ' ')
61+
# While released Git versions only have three numbers, development builds also
62+
# have a fourth number that corresponds to the number of patches since the last
63+
# release.
64+
read GIT_MAJOR_VERSION GIT_MINOR_VERSION GIT_MICRO_VERSION GIT_PATCH_LEVEL trailing <<EOF
65+
$(echo "$GIT_VERSION" 0 0 0 0 | tr '.a-zA-Z-' ' ')
6366
EOF
6467

6568
sed -e "s|@GIT_VERSION@|$GIT_VERSION|" \
6669
-e "s|@GIT_MAJOR_VERSION@|$GIT_MAJOR_VERSION|" \
6770
-e "s|@GIT_MINOR_VERSION@|$GIT_MINOR_VERSION|" \
6871
-e "s|@GIT_MICRO_VERSION@|$GIT_MICRO_VERSION|" \
72+
-e "s|@GIT_PATCH_LEVEL@|$GIT_PATCH_LEVEL|" \
6973
-e "s|@GIT_BUILT_FROM_COMMIT@|$GIT_BUILT_FROM_COMMIT|" \
7074
-e "s|@GIT_USER_AGENT@|$GIT_USER_AGENT|" \
7175
"$INPUT" >"$OUTPUT"+

Makefile

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2568,11 +2568,12 @@ $(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
25682568
$(QUIET_GEN)$(cmd_munge_script) && \
25692569
mv $@+ $@
25702570

2571-
git.res: git.rc GIT-VERSION-FILE GIT-PREFIX
2572-
$(QUIET_RC)$(RC) \
2573-
$(join -DMAJOR= -DMINOR= -DMICRO= -DPATCHLEVEL=, $(wordlist 1, 4, \
2574-
$(shell echo $(GIT_VERSION) 0 0 0 0 | tr '.a-zA-Z-' ' '))) \
2575-
-DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
2571+
git.rc: git.rc.in GIT-VERSION-GEN GIT-VERSION-FILE
2572+
$(QUIET_GEN)$(SHELL_PATH) ./GIT-VERSION-GEN "$(shell pwd)" $< $@+
2573+
@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2574+
2575+
git.res: git.rc GIT-PREFIX
2576+
$(QUIET_RC)$(RC) -i $< -o $@
25762577

25772578
# This makes sure we depend on the NO_PERL setting itself.
25782579
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
@@ -3717,7 +3718,7 @@ clean: profile-clean coverage-clean cocciclean
37173718
$(RM) -r .build $(UNIT_TEST_BIN)
37183719
$(RM) GIT-TEST-SUITES
37193720
$(RM) po/git.pot po/git-core.pot
3720-
$(RM) git.res
3721+
$(RM) git.rc git.res
37213722
$(RM) $(OBJECTS)
37223723
$(RM) headless-git.o
37233724
$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB)

contrib/buildsystems/CMakeLists.txt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -691,18 +691,25 @@ list(TRANSFORM reftable_SOURCES PREPEND "${CMAKE_SOURCE_DIR}/")
691691
add_library(reftable STATIC ${reftable_SOURCES})
692692

693693
if(WIN32)
694+
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.rc
695+
COMMAND "${SH_EXE}" "${CMAKE_SOURCE_DIR}/GIT-VERSION-GEN"
696+
"${CMAKE_SOURCE_DIR}"
697+
"${CMAKE_SOURCE_DIR}/git.rc.in"
698+
"${CMAKE_BINARY_DIR}/git.rc"
699+
DEPENDS "${CMAKE_SOURCE_DIR}/GIT-VERSION-GEN"
700+
"${CMAKE_SOURCE_DIR}/git.rc.in"
701+
VERBATIM)
702+
694703
if(NOT MSVC)#use windres when compiling with gcc and clang
695704
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.res
696-
COMMAND ${WINDRES_EXE} -O coff -DMAJOR=${PROJECT_VERSION_MAJOR} -DMINOR=${PROJECT_VERSION_MINOR}
697-
-DMICRO=${PROJECT_VERSION_PATCH} -DPATCHLEVEL=0 -DGIT_VERSION="\\\"${PROJECT_VERSION}.GIT\\\""
698-
-i ${CMAKE_SOURCE_DIR}/git.rc -o ${CMAKE_BINARY_DIR}/git.res
705+
COMMAND ${WINDRES_EXE} -O coff -i ${CMAKE_BINARY_DIR}/git.rc -o ${CMAKE_BINARY_DIR}/git.res
706+
DEPENDS "${CMAKE_BINARY_DIR}/git.rc"
699707
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
700708
VERBATIM)
701709
else()#MSVC use rc
702710
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/git.res
703-
COMMAND ${CMAKE_RC_COMPILER} /d MAJOR=${PROJECT_VERSION_MAJOR} /d MINOR=${PROJECT_VERSION_MINOR}
704-
/d MICRO=${PROJECT_VERSION_PATCH} /d PATCHLEVEL=0 /d GIT_VERSION="${PROJECT_VERSION}.GIT"
705-
/fo ${CMAKE_BINARY_DIR}/git.res ${CMAKE_SOURCE_DIR}/git.rc
711+
COMMAND ${CMAKE_RC_COMPILER} /fo ${CMAKE_BINARY_DIR}/git.res ${CMAKE_BINARY_DIR}/git.rc
712+
DEPENDS "${CMAKE_BINARY_DIR}/git.rc"
706713
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
707714
VERBATIM)
708715
endif()

git.rc renamed to git.rc.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
1 VERSIONINFO
2-
FILEVERSION MAJOR,MINOR,MICRO,PATCHLEVEL
3-
PRODUCTVERSION MAJOR,MINOR,MICRO,PATCHLEVEL
2+
FILEVERSION @GIT_MAJOR_VERSION@,@GIT_MINOR_VERSION@,@GIT_MICRO_VERSION@,@GIT_PATCH_LEVEL@
3+
PRODUCTVERSION @GIT_MAJOR_VERSION@,@GIT_MINOR_VERSION@,@GIT_MICRO_VERSION@,@GIT_PATCH_LEVEL@
44
BEGIN
55
BLOCK "StringFileInfo"
66
BEGIN
@@ -11,7 +11,7 @@ BEGIN
1111
VALUE "InternalName", "git\0"
1212
VALUE "OriginalFilename", "git.exe\0"
1313
VALUE "ProductName", "Git\0"
14-
VALUE "ProductVersion", GIT_VERSION "\0"
14+
VALUE "ProductVersion", "@GIT_VERSION@\0"
1515
END
1616
END
1717

0 commit comments

Comments
 (0)