From 03dbdb0357539448f505a7851b14c96800c77ac7 Mon Sep 17 00:00:00 2001 From: MatusGuy Date: Fri, 29 Nov 2024 21:58:06 +0000 Subject: [PATCH] Better window title and git version detection --- CMakeLists.txt | 7 +- mk/cmake/GetGitRevisionDescription.cmake | 171 +++++++------------- mk/cmake/GetGitRevisionDescription.cmake.in | 41 ----- mk/cmake/SuperTux/BuildVersion.cmake | 51 +----- version.cmake.in | 6 - version.h.in | 3 +- 6 files changed, 65 insertions(+), 214 deletions(-) delete mode 100644 mk/cmake/GetGitRevisionDescription.cmake.in delete mode 100644 version.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index e9c8db02175..e4d8cc61bbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,12 +244,13 @@ if(NOT EMSCRIPTEN) # SDL2 main (windows?) $ # SDL2 - SDL2) + SDL2 + ) target_link_libraries(supertux2 PUBLIC Ogg Vorbis VorbisFile - ) + ) target_link_libraries(supertux2 PUBLIC CURL::libcurl) endif() @@ -265,7 +266,7 @@ endif() include(SuperTux/BuildInstall) ## Create config.h now that INSTALL_SUBDIR_* have been set. -configure_file(config.h.cmake ${CMAKE_BINARY_DIR}/config.h ) +configure_file(config.h.in ${CMAKE_BINARY_DIR}/config.h) ## Build tests if(BUILD_TESTING) diff --git a/mk/cmake/GetGitRevisionDescription.cmake b/mk/cmake/GetGitRevisionDescription.cmake index 41fd4fad706..036c718b9ac 100644 --- a/mk/cmake/GetGitRevisionDescription.cmake +++ b/mk/cmake/GetGitRevisionDescription.cmake @@ -1,130 +1,69 @@ -# - Returns a version string from Git # -# These functions force a re-configure on each git commit so that you can -# trust the values of the variables in your build system. +# SuperTux +# Copyright (C) 2024 MatusGuy # -# get_git_head_revision( [ ...]) +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. # -# Returns the refspec and sha hash of the current head revision +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# git_describe( [ ...]) +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# Returns the results of git describe on the source tree, and adjusting -# the output so that it tests false if an error occurs. -# -# git_get_exact_tag( [ ...]) -# -# Returns the results of git describe --exact-match on the source tree, -# and adjusting the output so that it tests false if there was no exact -# matching tag. -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: -# 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com -# Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -if(__get_git_revision_description) - return() -endif() -set(__get_git_revision_description YES) - -# We must run the following at "include" time, not at function call time, -# to find the path to this module rather than the path to a calling list file -get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) - -function(get_git_head_revision _refspecvar _hashvar) - set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories - set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") - get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) - if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) - # We have reached the root directory, we are not in git - set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) - return() - endif() - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - endwhile() - # check if this is a submodule - if(NOT IS_DIRECTORY ${GIT_DIR}) - file(READ ${GIT_DIR} submodule) - string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) - get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) - get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) - endif() - set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") - if(NOT EXISTS "${GIT_DATA}") - file(MAKE_DIRECTORY "${GIT_DATA}") - endif() - if(NOT EXISTS "${GIT_DIR}/HEAD") - return() - endif() - set(HEAD_FILE "${GIT_DATA}/HEAD") - configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) +find_package(Git QUIET) - configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" - "${GIT_DATA}/grabRef.cmake" - @ONLY) - include("${GIT_DATA}/grabRef.cmake") +macro(git_run) + cmake_parse_arguments(GIT_RUN "" "RESULT;OUTPUT" "COMMAND" ${ARGN}) - set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) - set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) -endfunction() + if(NOT GIT_FOUND) + set(${GIT_RUN_OUTPUT} ${GIT_RUN_OUTPUT}-NOTFOUND) + # Can't use a return command here because... Macro. + else() + execute_process(COMMAND ${GIT_EXECUTABLE} ${GIT_RUN_COMMAND} + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + RESULT_VARIABLE ${GIT_RUN_RESULT} + OUTPUT_VARIABLE ${GIT_RUN_OUTPUT}) -function(git_describe _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) - return() - endif() - if(NOT hash) - set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) - return() - endif() + if(${${GIT_RUN_RESULT}} EQUAL 0) + string(REPLACE "\n" "" ${GIT_RUN_OUTPUT} "${${GIT_RUN_OUTPUT}}") + else() + message(STATUS "\"${GIT_EXECUTABLE} ${GIT_RUN_COMMAND}\" failed with result \"${${GIT_RUN_RESULT}}\".") + set(${GIT_RUN_OUTPUT} ${GIT_RUN_OUTPUT}-NOTFOUND) + endif() + endif() +endmacro() - # TODO sanitize - #if((${ARGN}" MATCHES "&&") OR - # (ARGN MATCHES "||") OR - # (ARGN MATCHES "\\;")) - # message("Please report the following error to the project!") - # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") - #endif() +macro(git_project_version out is_release) + if(NOT GIT_FOUND OR NOT EXISTS "${PROJECT_SOURCE_DIR}/.git") + set(${out} ${out}-NOTFOUND) + set(${is_release} NO) + # Can't use a return command here because... Macro. + else() + # Tag + git_run(COMMAND describe --tags --abbrev=0 OUTPUT _tag RESULT _result) - #message(STATUS "Arguments to execute_process: ${ARGN}") + # Commits since tag + git_run(COMMAND rev-list ${_tag}..HEAD --count OUTPUT _tagn RESULT _result) - execute_process(COMMAND - "${GIT_EXECUTABLE}" - describe - ${hash} - ${ARGN} - WORKING_DIRECTORY - "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE - res - OUTPUT_VARIABLE - out -# ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - if(NOT res EQUAL 0) - set(out "${out}-${res}-NOTFOUND") - endif() + if(_tagn STREQUAL "0") + set(${is_release} YES) + set(${out} "${_tag}") + else() + # Commit hash + git_run(COMMAND rev-parse --short HEAD OUTPUT _hash RESULT _result) - set(${_var} "${out}" PARENT_SCOPE) -endfunction() + # Branch + git_run(COMMAND rev-parse --abbrev-ref HEAD OUTPUT _branch RESULT _result) -function(git_get_exact_tag _var) - git_describe(out --exact-match ${ARGN}) - set(${_var} "${out}" PARENT_SCOPE) -endfunction() + set(${is_release} NO) + set(${out} "${_tag} (${_tagn}) - ${_hash} (${_branch})") + endif() + endif() +endmacro() diff --git a/mk/cmake/GetGitRevisionDescription.cmake.in b/mk/cmake/GetGitRevisionDescription.cmake.in deleted file mode 100644 index 6d8b708efe5..00000000000 --- a/mk/cmake/GetGitRevisionDescription.cmake.in +++ /dev/null @@ -1,41 +0,0 @@ -# -# Internal file for GetGitRevisionDescription.cmake -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: -# 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com -# Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -set(HEAD_HASH) - -file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) - -string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) -if(HEAD_CONTENTS MATCHES "ref") - # named branch - string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") - if(EXISTS "@GIT_DIR@/${HEAD_REF}") - configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) - else() - configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) - file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) - if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") - set(HEAD_HASH "${CMAKE_MATCH_1}") - endif() - endif() -else() - # detached HEAD - configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) -endif() - -if(NOT HEAD_HASH) - file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) - string(STRIP "${HEAD_HASH}" HEAD_HASH) -endif() diff --git a/mk/cmake/SuperTux/BuildVersion.cmake b/mk/cmake/SuperTux/BuildVersion.cmake index b2c724b6096..2aa147e3893 100644 --- a/mk/cmake/SuperTux/BuildVersion.cmake +++ b/mk/cmake/SuperTux/BuildVersion.cmake @@ -1,53 +1,12 @@ -if(EXISTS "${CMAKE_SOURCE_DIR}/.git") - ## Find revision of WC - mark_as_advanced(GIT_EXECUTABLE) - find_program(GIT_EXECUTABLE git) - if(NOT GIT_EXECUTABLE EQUAL "GIT_EXECUTABLE-NOTFOUND") - include(GetGitRevisionDescription) - git_describe(VERSION_STRING_GIT "--tags" "--match" "?[0-9]*.[0-9]*.[0-9]*") - string(REPLACE "v" "" VERSION_LIST ${VERSION_STRING_GIT}) - string(REGEX REPLACE "[^\\-]+\\-([0-9]+)\\-.*" "\\1" VERSION_NUMBER_GIT "${VERSION_LIST}") - string(REGEX REPLACE "(-|_|\\.)" ";" VERSION_LIST ";${VERSION_LIST}") - endif() -endif() - -get_filename_component(BASEDIR ${CMAKE_SOURCE_DIR} NAME) -if("${VERSION_LIST}" STREQUAL "") - if(${BASEDIR} MATCHES "supertux2-[0-9\\.]*") - string(REGEX REPLACE "(\\.|_|-)" ";" VERSION_LIST ${BASEDIR}) - endif() -endif() - -file(GLOB ORIG_TGZ ../*.orig.tar.gz) -if("${VERSION_LIST}" STREQUAL "" AND (NOT "${ORIG_TGZ}" STREQUAL "")) - get_filename_component(BASEDIR ${ORIG_TGZ} NAME) - string(REGEX REPLACE "(\\.|_|-)" ";" VERSION_LIST ${BASEDIR}) -endif() +include(GetGitRevisionDescription) -list(LENGTH VERSION_LIST VERSION_LIST_SIZE) - -if(${VERSION_LIST_SIZE} GREATER 0) - list(GET VERSION_LIST 1 MAJOR_VERSION_GIT) - list(GET VERSION_LIST 2 MINOR_VERSION_GIT) - list(GET VERSION_LIST 3 PATCH_VERSION_GIT) - - if("${VERSION_STRING_GIT}" STREQUAL "") - set(VERSION_STRING_GIT "${MAJOR_VERSION_GIT}.${MINOR_VERSION_GIT}.${PATCH_VERSION_GIT}") - endif() - - configure_file("${CMAKE_SOURCE_DIR}/version.cmake.in" "${CMAKE_SOURCE_DIR}/version.cmake") -endif() -if(NOT EXISTS "${CMAKE_SOURCE_DIR}/version.cmake") - message( SEND_ERROR "Could not find GIT or valid version.cmake. Version information will be invalid." ) -endif() -include("${CMAKE_SOURCE_DIR}/version.cmake") +git_project_version(SUPERTUX_PACKAGE_VERSION IS_SUPERTUX_RELEASE) -if(FORCE_VERSION_STRING) - set(SUPERTUX_VERSION_STRING "${FORCE_VERSION_STRING}") +if(NOT IS_SUPERTUX_RELEASE AND SUPERTUX_PACKAGE_VERSION) + string(PREPEND SUPERTUX_PACKAGE_VERSION "dev ") endif() -set(SUPERTUX_VERSION ${SUPERTUX_VERSION_STRING}) -configure_file(version.h.in ${CMAKE_BINARY_DIR}/version.h ) +configure_file(version.h.in ${CMAKE_BINARY_DIR}/version.h) set_source_files_properties(${CMAKE_BINARY_DIR}/version.h PROPERTIES GENERATED true) diff --git a/version.cmake.in b/version.cmake.in deleted file mode 100644 index 04d9f0d833f..00000000000 --- a/version.cmake.in +++ /dev/null @@ -1,6 +0,0 @@ -SET(SUPERTUX_VERSION_MAJOR ${MAJOR_VERSION_GIT}) -SET(SUPERTUX_VERSION_MINOR ${MINOR_VERSION_GIT}) -SET(SUPERTUX_VERSION_PATCH ${PATCH_VERSION_GIT}) -SET(SUPERTUX_VERSION_TWEAK ${TWEAK_VERSION_GIT}) -SET(SUPERTUX_VERSION_STRING ${VERSION_STRING_GIT}) -SET(SUPERTUX_VERSION_BUILD ${VERSION_NUMBER_GIT}) diff --git a/version.h.in b/version.h.in index 3256bef164d..e81ede4f714 100644 --- a/version.h.in +++ b/version.h.in @@ -1,6 +1,5 @@ #ifndef VERSION_H #define VERSION_H -#define PACKAGE_VERSION "${SUPERTUX_VERSION}" -#define SUPERTUX_BUILD_NUMBER "${VERSION_NUMBER_GIT}" +#define PACKAGE_VERSION "${SUPERTUX_PACKAGE_VERSION}" #define LOGO_FILE "${LOGO_FILE}" #endif