1# Cable: CMake Bootstrap Library.
2# Copyright 2018-2019 Pawel Bylica.
3# Licensed under the Apache License, Version 2.0.
4
5string(TOUPPER "${PROJECT_NAME}" PROJECT_NAME_UPPERCASE)
6string(TOLOWER "${SYSTEM_NAME}" SYSTEM_NAME)
7string(TOLOWER "${SYSTEM_PROCESSOR}" SYSTEM_PROCESSOR)
8string(TOLOWER "${COMPILER_ID}" COMPILER_ID)
9string(TOLOWER "${BUILD_TYPE}" BUILD_TYPE)
10string(TIMESTAMP TIMESTAMP)
11
12# Read the git info from a file. The gitinfo is suppose to update the file
13# only if the information has changed.
14file(STRINGS ${OUTPUT_DIR}/gitinfo.txt gitinfo)
15list(LENGTH gitinfo gitinfo_len)
16if(gitinfo_len LESS 3)
17    message(WARNING "Git info not available")
18else()
19    list(GET gitinfo 0 describe)
20    list(GET gitinfo 1 GIT_BRANCH)
21    list(GET gitinfo 2 GIT_ORIGIN_URL)
22endif()
23
24# The output of `git describe --always --long --tags --match=v*`.
25string(REGEX MATCH "(v(.+)-([0-9]+)-g)?([0-9a-f]+)(-dirty)?" match "${describe}")
26
27if(DEFINED describe AND NOT match)
28    message(WARNING "Cannot parse git describe: ${describe}")
29endif()
30
31set(GIT_LATEST_PROJECT_VERSION ${CMAKE_MATCH_2})
32set(GIT_LATEST_PROJECT_VERSION_DISTANCE ${CMAKE_MATCH_3})
33set(GIT_COMMIT_HASH ${CMAKE_MATCH_4})
34if(CMAKE_MATCH_5)
35    set(GIT_DIRTY TRUE)
36    set(dirty_msg " (dirty)")
37else()
38    set(GIT_DIRTY FALSE)
39endif()
40
41if(GIT_COMMIT_HASH)
42    string(SUBSTRING ${GIT_COMMIT_HASH} 0 8 abbrev)
43    set(version_commit "+commit.${abbrev}")
44    if(GIT_DIRTY)
45        set(version_commit "${version_commit}.dirty")
46    endif()
47endif()
48
49if(NOT PROJECT_VERSION)
50    message(WARNING "PROJECT_VERSION not specified")
51endif()
52
53if(PROJECT_VERSION STREQUAL GIT_LATEST_PROJECT_VERSION)
54    if(${GIT_LATEST_PROJECT_VERSION_DISTANCE} GREATER 0)
55        set(PROJECT_VERSION "${PROJECT_VERSION}-${GIT_LATEST_PROJECT_VERSION_DISTANCE}${version_commit}")
56    endif()
57else()
58    if(GIT_LATEST_PROJECT_VERSION)
59        message(WARNING "Git project version mismatch: '${GIT_LATEST_PROJECT_VERSION}' vs '${PROJECT_VERSION}'")
60    endif()
61    set(PROJECT_VERSION "${PROJECT_VERSION}${version_commit}")
62endif()
63
64if(PROJECT_VERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$")
65    set(PROJECT_VERSION_IS_PRERELEASE false)
66else()
67    set(PROJECT_VERSION_IS_PRERELEASE true)
68    set(prerelease_comment " (prerelease)")
69endif()
70
71message(
72    "       Project Version:  ${PROJECT_VERSION}${prerelease_comment}\n"
73    "       System Name:      ${SYSTEM_NAME}\n"
74    "       System Processor: ${SYSTEM_PROCESSOR}\n"
75    "       Compiler ID:      ${COMPILER_ID}\n"
76    "       Compiler Version: ${COMPILER_VERSION}\n"
77    "       Build Type:       ${BUILD_TYPE}\n"
78    "       Git Info:         ${GIT_LATEST_PROJECT_VERSION} ${GIT_LATEST_PROJECT_VERSION_DISTANCE} ${GIT_COMMIT_HASH}${dirty_msg}\n"
79    "       Timestamp:        ${TIMESTAMP}"
80)
81
82configure_file(${CMAKE_CURRENT_LIST_DIR}/buildinfo.c.in ${OUTPUT_DIR}/buildinfo.c)
83configure_file(${CMAKE_CURRENT_LIST_DIR}/buildinfo.json.in ${OUTPUT_DIR}/buildinfo.json)
84configure_file(${CMAKE_CURRENT_LIST_DIR}/buildinfo.sh.in ${OUTPUT_DIR}/buildinfo.sh)
85configure_file(${CMAKE_CURRENT_LIST_DIR}/buildinfo.ps1.in ${OUTPUT_DIR}/buildinfo.ps1)
86
87configure_file(${CMAKE_CURRENT_LIST_DIR}/version.h.in ${OUTPUT_DIR}/version.h)
88