summaryrefslogtreecommitdiff
path: root/cmake/scripts/FindVersion.cmake
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2019-04-07 11:57:55 +0200
committerglx22 <glx22@users.noreply.github.com>2020-06-05 19:36:05 +0200
commit56d54cf60eb5814f77dfcce91cf12879f01e1d1b (patch)
treee35fc5b7becc8f993d8c44179bc16e2586c3c64d /cmake/scripts/FindVersion.cmake
parent85315e2e3132dd7aff9ee96c1ba8d282350d9d5e (diff)
downloadopenttd-56d54cf60eb5814f77dfcce91cf12879f01e1d1b.tar.xz
Add: introduce CMake for project management
CMake works on all our supported platforms, like MSVC, Mingw, GCC, Clang, and many more. It allows for a single way of doing things, so no longer we need shell scripts and vbs scripts to work on all our supported platforms. Additionally, CMake allows to generate project files for like MSVC, KDevelop, etc. This heavily reduces the lines of code we need to support multiple platforms from a project perspective. Addtiionally, this heavily improves our detection of libraries, etc.
Diffstat (limited to 'cmake/scripts/FindVersion.cmake')
-rw-r--r--cmake/scripts/FindVersion.cmake134
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)