Skip to content

Commit bee8d8f

Browse files
authored
Merge pull request #5985 from ab9rf/git-describe-update
improve git describe
2 parents 02e77ac + ac760e3 commit bee8d8f

3 files changed

Lines changed: 100 additions & 54 deletions

File tree

‎library/CMakeLists.txt‎

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -353,19 +353,52 @@ if(DFHACK_PRERELEASE)
353353
endif()
354354

355355
configure_file(git-describe.cmake.in ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake @ONLY)
356-
if(EXISTS ${dfhack_SOURCE_DIR}/.git/index AND EXISTS ${dfhack_SOURCE_DIR}/.git/modules/library/xml/index)
357-
add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h
358-
COMMAND ${CMAKE_COMMAND}
359-
-D dfhack_SOURCE_DIR:STRING=${dfhack_SOURCE_DIR}
360-
-D GIT_EXECUTABLE:STRING=${GIT_EXECUTABLE}
361-
-P ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake
362-
COMMENT "Obtaining git commit information"
363-
DEPENDS ${dfhack_SOURCE_DIR}/.git/index
364-
${dfhack_SOURCE_DIR}/.git/modules/library/xml/index
365-
${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake
366-
include/git-describe.h.in
367-
)
368-
endif()
356+
357+
# .git is a directory in a normal repository, but a file containing
358+
# "gitdir: <path>" in git worktrees and submodules; resolve both.
359+
function(dfhack_find_git_dir repo_dir out_var)
360+
set(${out_var} "" PARENT_SCOPE)
361+
if(IS_DIRECTORY "${repo_dir}/.git")
362+
set(${out_var} "${repo_dir}/.git" PARENT_SCOPE)
363+
elseif(EXISTS "${repo_dir}/.git")
364+
file(STRINGS "${repo_dir}/.git" gitdir_line REGEX "^gitdir:" LIMIT_COUNT 1)
365+
if(gitdir_line MATCHES "^gitdir:[ \t]*(.+)")
366+
string(STRIP "${CMAKE_MATCH_1}" gitdir)
367+
if(NOT IS_ABSOLUTE "${gitdir}")
368+
get_filename_component(gitdir "${repo_dir}/${gitdir}" ABSOLUTE)
369+
endif()
370+
set(${out_var} "${gitdir}" PARENT_SCOPE)
371+
endif()
372+
endif()
373+
endfunction()
374+
375+
# Re-run git describe when HEAD or the index changes in the main repository or
376+
# in the library/xml submodule, when they are present. The header is generated
377+
# even outside a git checkout so the build works on plain source trees too.
378+
set(GIT_DESCRIBE_DEPS
379+
${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake
380+
${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h.in
381+
)
382+
dfhack_find_git_dir("${dfhack_SOURCE_DIR}" DFHACK_GIT_DIR)
383+
dfhack_find_git_dir("${dfhack_SOURCE_DIR}/library/xml" DFHACK_XML_GIT_DIR)
384+
foreach(git_dir "${DFHACK_GIT_DIR}" "${DFHACK_XML_GIT_DIR}")
385+
if(git_dir)
386+
foreach(name HEAD index)
387+
if(EXISTS "${git_dir}/${name}")
388+
list(APPEND GIT_DESCRIBE_DEPS "${git_dir}/${name}")
389+
endif()
390+
endforeach()
391+
endif()
392+
endforeach()
393+
394+
add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/include/git-describe.h
395+
COMMAND ${CMAKE_COMMAND}
396+
-D dfhack_SOURCE_DIR:STRING=${dfhack_SOURCE_DIR}
397+
-D GIT_EXECUTABLE:STRING=${GIT_EXECUTABLE}
398+
-P ${CMAKE_CURRENT_SOURCE_DIR}/git-describe.cmake
399+
COMMENT "Obtaining git commit information"
400+
DEPENDS ${GIT_DESCRIBE_DEPS}
401+
)
369402

370403
add_library(dfhack SHARED ${PROJECT_SOURCES})
371404
target_compile_definitions(dfhack PRIVATE BUILD_DFHACK_LIB)

‎library/git-describe.cmake.in‎

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,61 @@
11
# Generated from git-describe.cmake.in
22
set(DFHACK_BUILD_ID "@DFHACK_BUILD_ID@")
33

4-
if(NOT(EXISTS "${GIT_EXECUTABLE}"))
5-
message(FATAL_ERROR "git-describe failed: could not find git at ${GIT_EXECUTABLE}")
6-
endif()
4+
# Fallbacks used when the source tree is not a git checkout or when revision
5+
# information cannot be obtained.
6+
set(DFHACK_GIT_DESCRIPTION "@DFHACK_VERSION@-unknown")
7+
set(DFHACK_GIT_COMMIT "unknown")
8+
set(DFHACK_GIT_XML_EXPECTED_COMMIT "unknown")
9+
set(DFHACK_GIT_XML_COMMIT "unknown")
10+
set(DFHACK_GIT_TAGGED FALSE)
11+
set(DFHACK_GIT_XML_MATCH FALSE)
712

8-
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --long
9-
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
10-
OUTPUT_VARIABLE DFHACK_GIT_DESCRIPTION
11-
OUTPUT_STRIP_TRAILING_WHITESPACE
12-
RESULT_VARIABLE DFHACK_GIT_DESCRIPTION_RESULT)
13-
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
14-
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
15-
OUTPUT_VARIABLE DFHACK_GIT_COMMIT
16-
OUTPUT_STRIP_TRAILING_WHITESPACE)
17-
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --exact-match
18-
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
19-
RESULT_VARIABLE DFHACK_GIT_TAGGED_RESULT
20-
OUTPUT_QUIET ERROR_QUIET)
13+
if(EXISTS "${dfhack_SOURCE_DIR}/.git")
14+
if(NOT GIT_EXECUTABLE OR NOT EXISTS "${GIT_EXECUTABLE}")
15+
message(WARNING "git-describe: could not find git; version information will be unavailable")
16+
else()
17+
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --long
18+
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
19+
OUTPUT_VARIABLE DFHACK_GIT_DESCRIPTION
20+
OUTPUT_STRIP_TRAILING_WHITESPACE
21+
RESULT_VARIABLE DFHACK_GIT_DESCRIPTION_RESULT)
22+
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
23+
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
24+
OUTPUT_VARIABLE DFHACK_GIT_COMMIT
25+
OUTPUT_STRIP_TRAILING_WHITESPACE)
26+
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=8 --exact-match
27+
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
28+
RESULT_VARIABLE DFHACK_GIT_TAGGED_RESULT
29+
OUTPUT_QUIET ERROR_QUIET)
2130

22-
# Check library/xml for matching commits
23-
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD:library/xml
24-
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
25-
OUTPUT_VARIABLE DFHACK_GIT_XML_EXPECTED_COMMIT
26-
OUTPUT_STRIP_TRAILING_WHITESPACE)
27-
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
28-
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}/library/xml"
29-
OUTPUT_VARIABLE DFHACK_GIT_XML_COMMIT
30-
OUTPUT_STRIP_TRAILING_WHITESPACE)
31+
# Check library/xml for matching commits
32+
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD:library/xml
33+
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}"
34+
OUTPUT_VARIABLE DFHACK_GIT_XML_EXPECTED_COMMIT
35+
OUTPUT_STRIP_TRAILING_WHITESPACE)
36+
if(EXISTS "${dfhack_SOURCE_DIR}/library/xml/.git")
37+
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
38+
WORKING_DIRECTORY "${dfhack_SOURCE_DIR}/library/xml"
39+
OUTPUT_VARIABLE DFHACK_GIT_XML_COMMIT
40+
OUTPUT_STRIP_TRAILING_WHITESPACE)
41+
endif()
3142

32-
if(NOT(${DFHACK_GIT_DESCRIPTION_RESULT} EQUAL 0))
33-
message(FATAL_ERROR "git-describe failed: ${DFHACK_GIT_DESCRIPTION_RESULT}")
34-
endif()
43+
if(DFHACK_GIT_TAGGED_RESULT STREQUAL "0")
44+
set(DFHACK_GIT_TAGGED TRUE)
45+
endif()
3546

36-
if(${DFHACK_GIT_TAGGED_RESULT} EQUAL 0)
37-
set(DFHACK_GIT_TAGGED TRUE)
38-
else()
39-
set(DFHACK_GIT_TAGGED FALSE)
40-
endif()
47+
if(NOT "${DFHACK_GIT_XML_COMMIT}" STREQUAL ""
48+
AND NOT "${DFHACK_GIT_XML_COMMIT}" STREQUAL "unknown"
49+
AND "${DFHACK_GIT_XML_COMMIT}" STREQUAL "${DFHACK_GIT_XML_EXPECTED_COMMIT}")
50+
set(DFHACK_GIT_XML_MATCH TRUE)
51+
endif()
4152

42-
if(${DFHACK_GIT_XML_COMMIT} STREQUAL ${DFHACK_GIT_XML_EXPECTED_COMMIT})
43-
set(DFHACK_GIT_XML_MATCH TRUE)
44-
else()
45-
set(DFHACK_GIT_XML_MATCH FALSE)
53+
if(NOT DFHACK_GIT_DESCRIPTION_RESULT STREQUAL "0")
54+
# e.g. a clone with no reachable tags; fall back to the commit hash
55+
message(WARNING "git-describe: 'git describe' failed; using commit hash as description")
56+
set(DFHACK_GIT_DESCRIPTION "${DFHACK_GIT_COMMIT}")
57+
endif()
58+
endif()
4659
endif()
4760

4861
configure_file(${dfhack_SOURCE_DIR}/library/include/git-describe.h.in ${dfhack_SOURCE_DIR}/library/include/git-describe.h)

‎library/include/git-describe.h.in‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
#cmakedefine DFHACK_GIT_DESCRIPTION "@DFHACK_GIT_DESCRIPTION@"
2-
#cmakedefine DFHACK_GIT_COMMIT "@DFHACK_GIT_COMMIT@"
3-
#cmakedefine DFHACK_GIT_XML_EXPECTED_COMMIT "@DFHACK_GIT_XML_EXPECTED_COMMIT@"
4-
#cmakedefine DFHACK_GIT_XML_COMMIT "@DFHACK_GIT_XML_COMMIT@"
1+
#define DFHACK_GIT_DESCRIPTION "@DFHACK_GIT_DESCRIPTION@"
2+
#define DFHACK_GIT_COMMIT "@DFHACK_GIT_COMMIT@"
3+
#define DFHACK_GIT_XML_EXPECTED_COMMIT "@DFHACK_GIT_XML_EXPECTED_COMMIT@"
4+
#define DFHACK_GIT_XML_COMMIT "@DFHACK_GIT_XML_COMMIT@"
55
#define DFHACK_BUILD_ID "@DFHACK_BUILD_ID@"
66
#cmakedefine DFHACK_GIT_TAGGED
77
#cmakedefine DFHACK_GIT_XML_MATCH

0 commit comments

Comments
 (0)