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