forked from andrew-hardin/cmake-git-version-tracking
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
81 lines (65 loc) · 4.05 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
cmake_minimum_required(VERSION 3.2...3.27)
# gtml - git tracking meta library
project(gtml
LANGUAGES CXX)
set(NBL_GTML_TRACKED_TARGETS CACHE INTERNAL "")
set(NBL_GTML_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "")
set(NBL_GTML_PROJECT_NAME "${PROJECT_NAME}" CACHE INTERNAL "")
set(NBL_GTML_STAMP_FILE "${NBL_GTML_BINARY_DIR}/stamp" CACHE INTERNAL "")
# useage notes:
# 1. `add_subdirectory` this project
# 2. use function `NBL_ADD_GIT_TRACKING_META_LIBRARY("name" "GIT_PATH")` to track any git_repo
# 3. call `NBL_GENERATE_GIT_TRACKING_META()` to finalize and configure required headers/sources
# 4. link this anywhere you need `target_link_libraries(TARGET PUBLIC gtml)`
# 5. #include "git_info.h" in your code
# 6. profit
function(NBL_ADD_GIT_TRACKING_META_LIBRARY GTML_NAME GIT_WORKING_DIR)
if(NOT GTML_NAME MATCHES "^[a-zA-Z0-9_]+$")
message(SEND_ERROR "Name \"${GTML_NAME}\" contains illegal characters, name needs to match '^[a-zA-Z0-9_]+$' regex")
endif()
if(GTML_NAME IN_LIST NBL_GTML_TRACKED_TARGETS)
message(SEND_ERROR "Name \"${GTML_NAME}\" is already specified")
endif()
set(SRC_DIR "${CMAKE_CURRENT_FUNCTION_LIST_DIR}")
set(PRE_CONFIGURE_FILENAME "template_git_info.cpp.in")
set(PRE_CONFIGURE_FILE "${SRC_DIR}/${PRE_CONFIGURE_FILENAME}")
set(GTML_INFO "/* This file is auto-generated by CMake's configure_file function from the template: `${PRE_CONFIGURE_FILENAME}`. * Do not edit this file manually. */")
set(GTML_TARGET_NAME "${GTML_NAME}_check_git")
set(POST_CONFIGURE_FILE "${NBL_GTML_BINARY_DIR}/${GTML_NAME}_git_info.cpp")
set(GIT_STATE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${GTML_NAME}_git-state-hash")
include("${SRC_DIR}/git_watcher.cmake")
set(NBL_GTML_TRACKED_TARGETS ${NBL_GTML_TRACKED_TARGETS} "${GTML_NAME}" CACHE INTERNAL "")
endfunction(NBL_ADD_GIT_TRACKING_META_LIBRARY)
# TODO: for QoL auto-generate instead of relying of function call to finalize configuration
# finalize configuration, generates headers
function(NBL_GENERATE_GIT_TRACKING_META)
set(SRC_DIR "${CMAKE_CURRENT_FUNCTION_LIST_DIR}")
list(SORT NBL_GTML_TRACKED_TARGETS)
set(GTML_TARGET_NAMES ${NBL_GTML_TRACKED_TARGETS})
set(GTML_TARGET_SOURCES ${NBL_GTML_TRACKED_TARGETS})
set(GTML_ENUMS ${NBL_GTML_TRACKED_TARGETS})
set(GTML_EXTERNS ${NBL_GTML_TRACKED_TARGETS})
set(GTML_ARRAY ${NBL_GTML_TRACKED_TARGETS})
list(TRANSFORM GTML_TARGET_NAMES APPEND _check_git)
list(TRANSFORM GTML_TARGET_SOURCES REPLACE "^(.+)$" "${NBL_GTML_BINARY_DIR}/\\1_git_info.cpp")
list(TRANSFORM GTML_ENUMS TOUPPER)
list(TRANSFORM GTML_ENUMS PREPEND EGRM_)
string(REGEX REPLACE ";" ", " GTML_ENUMS "${GTML_ENUMS}")
list(TRANSFORM GTML_EXTERNS REPLACE "^(.+)$" "\nextern const GitInfo \\1_git_info")
list(TRANSFORM GTML_ARRAY REPLACE "^(.+)$" "\\1_git_info")
string(REGEX REPLACE ";" ", " GTML_ARRAY "${GTML_ARRAY}")
set(HEADER_NAME "git_info.h.in")
set(SOURCE_NAME "git_info.cpp.in")
set(GTML_INFO "/* This file is auto-generated by CMake's configure_file function from the template: `${HEADER_NAME}`.\n * Do not edit this file manually. */")
configure_file("${SRC_DIR}/${HEADER_NAME}" "${NBL_GTML_BINARY_DIR}/git_info.h" @ONLY)
set(GTML_INFO "/* This file is auto-generated by CMake's configure_file function from the template: `${SOURCE_NAME}`.\n * Do not edit this file manually. */")
configure_file("${SRC_DIR}/${SOURCE_NAME}" "${NBL_GTML_BINARY_DIR}/git_info.cpp" @ONLY)
add_library("${NBL_GTML_PROJECT_NAME}" STATIC ${GTML_TARGET_SOURCES} "${NBL_GTML_BINARY_DIR}/git_info.cpp")
target_include_directories("${NBL_GTML_PROJECT_NAME}" SYSTEM PUBLIC "${NBL_GTML_BINARY_DIR}")
set_target_properties("${NBL_GTML_PROJECT_NAME}" PROPERTIES UNITY_BUILD TRUE)
# triggers all git check custom commands each build
add_custom_target("gtml_git_check" ALL COMMAND "${CMAKE_COMMAND}" -E touch "${NBL_GTML_STAMP_FILE}"
BYPRODUCTS "${NBL_GTML_STAMP_FILE}"
)
add_dependencies("${NBL_GTML_PROJECT_NAME}" "gtml_git_check")
endfunction(NBL_GENERATE_GIT_TRACKING_META)