From 3d519d6c1992955979e31feb05a184430980a0bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 1 Jun 2020 20:12:55 +0200 Subject: [PATCH] Add a version header containing full Git version information. --- CMakeLists.txt | 5 +++ src/Magnum/CMakeLists.txt | 29 +++++++++++++ src/Magnum/Test/CMakeLists.txt | 27 ++++++++++++ src/Magnum/Test/VersionTest.cpp | 66 ++++++++++++++++++++++++++++++ src/Magnum/versionBindings.h.cmake | 38 +++++++++++++++++ 5 files changed, 165 insertions(+) create mode 100644 src/Magnum/Test/CMakeLists.txt create mode 100644 src/Magnum/Test/VersionTest.cpp create mode 100644 src/Magnum/versionBindings.h.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 298ba25..056a658 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,11 @@ endif() set(MAGNUMBINDINGS_CMAKE_MODULE_INSTALL_DIR share/cmake/MagnumBindings) +# Library version. MAGNUMBINDINGS_VERSION_YEAR/MONTH is used in +# src/Magnum/CMakeLists.txt to generate the versionBindings.h header. +set(MAGNUMBINDINGS_VERSION_YEAR 2019) +set(MAGNUMBINDINGS_VERSION_MONTH 10) + # A single output location. After a decade of saying NO THIS IS A NON-SOLUTION # TO A NON-PROBLEM I reconsidered my views and enabled this, because: # diff --git a/src/Magnum/CMakeLists.txt b/src/Magnum/CMakeLists.txt index 5991502..010ab65 100644 --- a/src/Magnum/CMakeLists.txt +++ b/src/Magnum/CMakeLists.txt @@ -23,6 +23,31 @@ # DEALINGS IN THE SOFTWARE. # +# Generate version header. If Git is found and this is a Git working copy, +# extract values from there, otherwise use just MAGNUMBINDINGS_VERSION_YEAR / +# MONTH that are set in project root CMakeLists. +find_package(Git) +if(Git_FOUND) + # Match only tags starting with `v`, always use the long format so we have + # a commit hash also on a tagged version + execute_process(COMMAND ${GIT_EXECUTABLE} describe --match "v*" --long + OUTPUT_VARIABLE MAGNUMBINDINGS_VERSION_STRING + RESULT_VARIABLE _MAGNUMBINDINGS_VERSION_RESULT + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if(MAGNUMBINDINGS_VERSION_STRING MATCHES "^v([0-9][0-9][0-9][0-9])\\.0?([0-9][0-9])-([0-9]+)-g([a-f0-9]+)$") + set(MAGNUMBINDINGS_VERSION_YEAR ${CMAKE_MATCH_1}) + set(MAGNUMBINDINGS_VERSION_MONTH ${CMAKE_MATCH_2}) + set(MAGNUMBINDINGS_VERSION_COMMIT ${CMAKE_MATCH_3}) + set(MAGNUMBINDINGS_VERSION_HASH ${CMAKE_MATCH_4}) + elseif(_MAGNUMBINDINGS_VERSION_RESULT EQUAL 0) + message(WARNING "Can't match Git version from ${MAGNUMBINDINGS_VERSION_STRING}") + endif() +endif() +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/versionBindings.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/versionBindings.h) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/versionBindings.h DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}) + if(WITH_PYTHON) add_custom_target(MagnumPython SOURCES Python.h) set_target_properties(MagnumPython PROPERTIES FOLDER "Magnum/Python") @@ -38,3 +63,7 @@ endif() if(Magnum_SceneGraph_FOUND) add_subdirectory(SceneGraph) endif() + +if(BUILD_TESTS) + add_subdirectory(Test) +endif() diff --git a/src/Magnum/Test/CMakeLists.txt b/src/Magnum/Test/CMakeLists.txt new file mode 100644 index 0000000..23ca35b --- /dev/null +++ b/src/Magnum/Test/CMakeLists.txt @@ -0,0 +1,27 @@ +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, +# 2020 Vladimír Vondruš +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +corrade_add_test(VersionTest VersionTest.cpp) +target_include_directories(VersionTest PRIVATE ${PROJECT_BINARY_DIR}/src) diff --git a/src/Magnum/Test/VersionTest.cpp b/src/Magnum/Test/VersionTest.cpp new file mode 100644 index 0000000..bec8c7d --- /dev/null +++ b/src/Magnum/Test/VersionTest.cpp @@ -0,0 +1,66 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include +#include + +#include "Magnum/Magnum.h" +#include "Magnum/versionBindings.h" + +namespace Magnum { namespace Test { namespace { + +struct VersionTest: TestSuite::Tester { + explicit VersionTest(); + + void test(); +}; + +VersionTest::VersionTest() { + addTests({&VersionTest::test}); +} + +void VersionTest::test() { + Debug{} << "MAGNUMBINDINGS_VERSION_YEAR:" << MAGNUMBINDINGS_VERSION_YEAR; + Debug{} << "MAGNUMBINDINGS_VERSION_MONTH:" << MAGNUMBINDINGS_VERSION_MONTH; + #ifdef MAGNUMBINDINGS_VERSION_COMMIT + Debug{} << "MAGNUMBINDINGS_VERSION_COMMIT:" << MAGNUMBINDINGS_VERSION_COMMIT; + Debug{} << "MAGNUMBINDINGS_VERSION_HASH:" << reinterpret_cast(MAGNUMBINDINGS_VERSION_HASH); + Debug{} << "MAGNUMBINDINGS_VERSION_STRING:" << MAGNUMBINDINGS_VERSION_STRING; + #else + Debug{} << "No Git version information available."; + #endif + + CORRADE_COMPARE_AS(MAGNUMBINDINGS_VERSION_YEAR, 2019, TestSuite::Compare::GreaterOrEqual); + CORRADE_COMPARE_AS(MAGNUMBINDINGS_VERSION_YEAR, 2100, TestSuite::Compare::LessOrEqual); + CORRADE_COMPARE_AS(MAGNUMBINDINGS_VERSION_MONTH, 0, TestSuite::Compare::Greater); + CORRADE_COMPARE_AS(MAGNUMBINDINGS_VERSION_MONTH, 12, TestSuite::Compare::LessOrEqual); + #ifdef MAGNUMBINDINGS_VERSION_COMMIT + CORRADE_COMPARE_AS(MAGNUMBINDINGS_VERSION_COMMIT, 0, TestSuite::Compare::GreaterOrEqual); + #endif +} + +}}} + +CORRADE_TEST_MAIN(Magnum::Test::VersionTest) diff --git a/src/Magnum/versionBindings.h.cmake b/src/Magnum/versionBindings.h.cmake new file mode 100644 index 0000000..86c1273 --- /dev/null +++ b/src/Magnum/versionBindings.h.cmake @@ -0,0 +1,38 @@ +#ifndef Magnum_versionBindings_h +#define Magnum_versionBindings_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +/* Note: this header is deliberately not included from anywhere except + VersionTest to avoid triggering a full rebuild every time the Git commit + hash changes. */ + +#define MAGNUMBINDINGS_VERSION_YEAR ${MAGNUMBINDINGS_VERSION_YEAR} +#define MAGNUMBINDINGS_VERSION_MONTH ${MAGNUMBINDINGS_VERSION_MONTH} +#cmakedefine MAGNUMBINDINGS_VERSION_COMMIT ${MAGNUMBINDINGS_VERSION_COMMIT} +#cmakedefine MAGNUMBINDINGS_VERSION_HASH 0x${MAGNUMBINDINGS_VERSION_HASH} +#cmakedefine MAGNUMBINDINGS_VERSION_STRING "${MAGNUMBINDINGS_VERSION_STRING}" + +#endif