build: Expand version info in SDL_REVISION and SDL_GetRevision()

Instead of using a URL and git sha1, this uses `git describe` to
describe the version relative to the nearest previous git tag, which
gives a better indication of whether this is a release, a prerelease,
a slightly patched prerelease, or a long way after the last release
during active development.

This serves two purposes: it makes those APIs more informative, and it
also puts this information into the binary in a form that is easy to
screen-scrape using strings(1). For instance, if the bundled version of
SDL in a game has this, we can see at a glance what version it is.

It's also shorter than using the web address of the origin git
repository and the full git commit sha1.

Also write the computed version into a file ./VERSION in `make dist`
tarballs, so that when we build from a tarball on a system that doesn't
have git available, we still get the version details.

For the Perforce code path in showrev.sh, output the version number
followed by the Perforce revision, in a format reminiscent of
`git describe` (with p instead of g to indicate Perforce).

For the code path with no VCS available at all, put a suffix on the
version number to indicate that this is just a guess (we can't know
whether this SDL version is actually a git snapshot or has been
patched locally or similar).

Resolves: https://github.com/libsdl-org/SDL/issues/6418
Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
Simon McVittie
2022-10-20 19:54:24 +01:00
committed by Sam Lantinga
parent 5b8f830e34
commit 2dc788cb9f
8 changed files with 73 additions and 26 deletions

View File

@@ -2930,29 +2930,36 @@ listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
# Compat helpers for the configuration files
if(EXISTS "${PROJECT_SOURCE_DIR}/VERSION")
file(READ "${PROJECT_SOURCE_DIR}/VERSION" SDL_SOURCE_VERSION)
endif()
find_package(Git)
if(Git_FOUND)
execute_process(COMMAND
"${GIT_EXECUTABLE}" remote get-url origin
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
RESULT_VARIABLE GIT_URL_STATUS
OUTPUT_VARIABLE GIT_URL
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND
"${GIT_EXECUTABLE}" rev-list --max-count=1 HEAD~..
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
"${GIT_EXECUTABLE}" describe --always --tags --long
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
RESULT_VARIABLE GIT_REVISION_STATUS
OUTPUT_VARIABLE GIT_REVISION
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
else()
set(GIT_REVISION_STATUS 1)
set(GIT_REVISION "")
endif()
if(GIT_URL_STATUS EQUAL 0 OR GIT_REVISION_STATUS EQUAL 0)
set(SDL_REVISION "${GIT_URL}@${GIT_REVISION}")
if(SDL_SOURCE_VERSION)
set(SDL_REVISION "SDL-${SDL_SOURCE_VERSION}")
elseif(GIT_REVISION_STATUS EQUAL 0)
if(GIT_REVISION MATCHES "^[0-9a-f]+$")
# Just a truncated sha1, so prefix it with the version number
set(SDL_REVISION "SDL-${SDL_VERSION}-g${GIT_REVISION}")
else()
set(SDL_REVISION "")
# e.g. release-2.24.0-542-g96361fc47
set(SDL_REVISION "SDL-${GIT_REVISION}")
endif()
else()
set(SDL_REVISION "")
set(SDL_REVISION "SDL-${SDL_VERSION}-no-vcs")
endif()
configure_file("${SDL2_SOURCE_DIR}/include/SDL_revision.h.cmake"