diff options
Diffstat (limited to 'cmake/scripts/FindVersion.cmake')
-rw-r--r-- | cmake/scripts/FindVersion.cmake | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/cmake/scripts/FindVersion.cmake b/cmake/scripts/FindVersion.cmake new file mode 100644 index 000000000..5edabeb19 --- /dev/null +++ b/cmake/scripts/FindVersion.cmake @@ -0,0 +1,134 @@ +cmake_minimum_required(VERSION 3.5) + +# +# Finds the current version of the current folder. +# + +find_package(Git QUIET) +# ${CMAKE_SOURCE_DIR}/.git may be a directory or a regular file +if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") + # Make sure LC_ALL is set to something desirable + set(SAVED_LC_ALL "$ENV{LC_ALL}") + set(ENV{LC_ALL} C) + + # Assume the dir is not modified + set(REV_MODIFIED 0) + + # Refresh the index to make sure file stat info is in sync, then look for modifications + execute_process(COMMAND ${GIT_EXECUTABLE} update-index --refresh + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_QUIET + ) + + # See if git tree is modified + execute_process(COMMAND ${GIT_EXECUTABLE} diff-index HEAD + OUTPUT_VARIABLE IS_MODIFIED + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + if (NOT IS_MODIFIED STREQUAL "") + set(REV_MODIFIED 2) + endif() + + # Get last commit hash + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify HEAD + OUTPUT_VARIABLE FULLHASH + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ERROR_QUIET + ) + set(REV_HASH "${FULLHASH}") + + string(SUBSTRING "${FULLHASH}" 0 10 SHORTHASH) + + # Get the last commit date + execute_process(COMMAND ${GIT_EXECUTABLE} show -s --pretty=format:%ci HEAD + OUTPUT_VARIABLE COMMITDATE + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + string(REGEX REPLACE "([0-9]+)-([0-9]+)-([0-9]+).*" "\\1\\2\\3" COMMITDATE "${COMMITDATE}") + set(REV_ISODATE "${COMMITDATE}") + string(SUBSTRING REV_ISODATE 1 4 REV_YEAR) + + # Get the branch + execute_process(COMMAND ${GIT_EXECUTABLE} symbolic-ref -q HEAD + OUTPUT_VARIABLE BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ERROR_QUIET + ) + string(REGEX REPLACE ".*/" "" BRANCH "${BRANCH}") + + # Get the tag + execute_process(COMMAND ${GIT_EXECUTABLE} name-rev --name-only --tags --no-undefined HEAD + OUTPUT_VARIABLE TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ERROR_QUIET + ) + string(REGEX REPLACE "\^0$" "" TAG "${TAG}") + + if (REV_MODIFIED EQUAL 0) + set(HASHPREFIX "-g") + elseif (REV_MODIFIED EQUAL 2) + set(HASHPREFIX "-m") + else () + set(HASHPREFIX "-u") + endif() + + # Set the version string + if (NOT TAG STREQUAL "") + set(REV_VERSION "${TAG}") + set(REV_ISTAG 1) + + string(REGEX REPLACE "^[0-9.]*$" "" STABLETAG "${TAG}") + if (NOT STABLETAG STREQUAL "") + set(REV_ISSTABLETAG 1) + else () + set(REV_ISSTABLETAG 0) + endif () + else () + set(REV_VERSION "${REV_ISODATE}-${BRANCH}${HASHPREFIX}${SHORTHASH}") + set(REV_ISTAG 0) + set(REV_ISSTABLETAG 0) + endif () + + # Restore LC_ALL + set(ENV{LC_ALL} "${SAVED_LC_ALL}") +elseif (EXISTS "${CMAKE_SOURCE_DIR}/.ottdrev") + file(READ "${CMAKE_SOURCE_DIR}/.ottdrev" OTTDREV) + string(REPLACE "\t" ";" OTTDREV "${OTTDREV}") + list(GET OTTDREV 0 REV_VERSION) + list(GET OTTDREV 1 REV_ISODATE) + list(GET OTTDREV 2 REV_MODIFIED) + list(GET OTTDREV 3 REV_HASH) + list(GET OTTDREV 4 REV_ISTAG) + list(GET OTTDREV 5 REV_ISSTABLETAG) + list(GET OTTDREV 6 REV_YEAR) +else () + message(WARNING "No version detected; this build will NOT be network compatible") + set(REV_VERSION "norev0000") + set(REV_ISODATE "19700101") + set(REV_MODIFIED 1) + set(REV_HASH "unknown") + set(REV_ISTAG 0) + set(REV_ISSTABLETAG 0) + set(REV_YEAR "1970") +endif () + +message(STATUS "Version string: ${REV_VERSION}") + +message(STATUS "Generating rev.cpp") +configure_file("${CMAKE_SOURCE_DIR}/src/rev.cpp.in" + "${FIND_VERSION_BINARY_DIR}/rev.cpp") + +if (WIN32) + message(STATUS "Generating ottdres.rc") + configure_file("${CMAKE_SOURCE_DIR}/src/os/windows/ottdres.rc.in" + "${FIND_VERSION_BINARY_DIR}/ottdres.rc") +endif (WIN32) + +message(STATUS "Generating CPackProperties.cmake") +configure_file("${CMAKE_SOURCE_DIR}/CPackProperties.cmake.in" + "${CPACK_BINARY_DIR}/CPackProperties.cmake" @ONLY) |