From f57bd290d9c26aa095f96094ef9b006d50cd9923 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 10 May 2022 16:43:16 +0200 Subject: [PATCH] this compiles --- CMakeLists.txt | 72 +++++++++++++++++++++++-------------- FSFWVersion.h.in | 0 cmake/FsfwHelpers.cmake | 4 +++ cmake/version.cmake | 38 ++++++++++++++++++++ src/fsfw/CMakeLists.txt | 1 + src/fsfw/FSFWVersion.h.in | 11 ------ src/fsfw/version.h | 7 +++- src/fsfw/versionAutogen.cpp | 10 ++++++ 8 files changed, 105 insertions(+), 38 deletions(-) delete mode 100644 FSFWVersion.h.in create mode 100644 cmake/version.cmake delete mode 100644 src/fsfw/FSFWVersion.h.in create mode 100644 src/fsfw/versionAutogen.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index fec79a42..ce13f6bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.13) set(MSG_PREFIX "fsfw |") # Add the cmake folder so the FindSphinx module is found -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-modules/bilke") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-modules/rpavlik") @@ -16,37 +16,42 @@ set(FSFW_SUBVERSION_IF_GIT_FAILS 0) set(FSFW_REVISION_IF_GIT_FAILS 0) set(FSFW_GIT_VER_HANDLING_OK FALSE) -# Version handling -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git) - message(STATUS "${MSG_PREFIX} Determining version information with git") - include(FsfwHelpers) - determine_version_with_git("--exclude" "docker_*") - if(GIT_INFO) - set(FSFW_GIT_INFO ${GIT_INFO} CACHE STRING "Version information retrieved with git describe" FORCE) - list(GET FSFW_GIT_INFO 1 FSFW_VERSION) - list(GET FSFW_GIT_INFO 2 FSFW_SUBVERSION) - list(GET FSFW_GIT_INFO 3 FSFW_REVISION) - list(GET FSFW_GIT_INFO 4 FSFW_VCS_INFO) - if(NOT FSFW_VERSION) - set(FSFW_VERSION ${FSFW_VERSION_IF_GIT_FAILS}) - endif() - if(NOT FSFW_SUBVERSION) - set(FSFW_SUBVERSION ${FSFW_SUBVERSION_IF_GIT_FAILS}) - endif() - if(NOT FSFW_REVISION) - set(FSFW_REVISION ${FSFW_REVISION_IF_GIT_FAILS}) - endif() - set(FSFW_GIT_VER_HANDLING_OK TRUE) - else() - set(FSFW_GIT_VER_HANDLING_OK FALSE) - endif() +# Check whether we got any revision (which isn't +# always the case, e.g. when someone downloaded a zip +# file from Github instead of a checkout) +message(STATUS "${MSG_PREFIX} Determining version information with git") +include(FsfwHelpers) +determine_version_with_git("--exclude" "docker_*") +if(GIT_INFO) + set(FSFW_GIT_INFO ${GIT_INFO} CACHE STRING "Version information retrieved with git describe" FORCE) + list(GET FSFW_GIT_INFO 1 FSFW_VERSION_MAJOR) + list(GET FSFW_GIT_INFO 2 FSFW_VERSION_MINOR) + list(GET FSFW_GIT_INFO 3 FSFW_VERSION_REVISION) + list(GET FSFW_GIT_INFO 4 FSFW_VERSION_VCS_INFO) + if(NOT FSFW_VERSION) + set(FSFW_VERSION ${FSFW_VERSION_IF_GIT_FAILS}) + endif() + if(NOT FSFW_SUBVERSION) + set(FSFW_SUBVERSION ${FSFW_SUBVERSION_IF_GIT_FAILS}) + endif() + if(NOT FSFW_REVISION) + set(FSFW_REVISION ${FSFW_REVISION_IF_GIT_FAILS}) + endif() + set(FSFW_GIT_VER_HANDLING_OK TRUE) +else() + set(FSFW_GIT_VER_HANDLING_OK FALSE) endif() + if(NOT FSFW_GIT_VER_HANDLING_OK) set(FSFW_VERSION ${FSFW_VERSION_IF_GIT_FAILS}) set(FSFW_SUBVERSION ${FSFW_SUBVERSION_IF_GIT_FAILS}) set(FSFW_REVISION ${FSFW_REVISION_IF_GIT_FAILS}) + set(GIT_REV "N/A") + set(GIT_DIFF "") + set(GIT_BRANCH "N/A") endif() + set(LIB_FSFW_NAME fsfw) project(${LIB_FSFW_NAME} VERSION ${FSFW_VERSION}.${FSFW_SUBVERSION}.${FSFW_REVISION}) @@ -245,7 +250,7 @@ else() endif() configure_file(src/fsfw/FSFW.h.in fsfw/FSFW.h) -configure_file(src/fsfw/FSFWVersion.h.in fsfw/FSFWVersion.h) +# configure_file(src/fsfw/FSFWVersion.h.in fsfw/FSFWVersion.h) message(STATUS "${MSG_PREFIX} Compiling FSFW for the ${FSFW_OS_NAME} operating system") @@ -455,3 +460,18 @@ add_custom_command( POST_BUILD COMMENT ${POST_BUILD_COMMENT} ) + +# Add a custom command that produces version.cpp, plus +# a dummy output that's not actually produced, in order +# to force version.cmake to always be re-run before the build +add_custom_command( + TARGET ${LIB_FSFW_NAME} + COMMAND ${CMAKE_COMMAND} -DVERSION_DIR=${FSFW_SOURCES_DIR} + -DVERSION_MAJOR=${FSFW_VERSION_MAJOR} + -DVERSION_MINOR=${FSFW_VERSION_MINOR} + -DVERSION_REVISION=${FSFW_VERSION_REVISION} + -DVERSION_VCS_INFO=${FSFW_VERSION_VCS_INFO} + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cmake + BYPRODUCTS ${FSFW_SOURCES_DIR}/versionAutogen.cpp + COMMENT "" +) diff --git a/FSFWVersion.h.in b/FSFWVersion.h.in deleted file mode 100644 index e69de29b..00000000 diff --git a/cmake/FsfwHelpers.cmake b/cmake/FsfwHelpers.cmake index 3f22ebde..35e82741 100644 --- a/cmake/FsfwHelpers.cmake +++ b/cmake/FsfwHelpers.cmake @@ -8,6 +8,7 @@ function(determine_version_with_git) include(GetGitRevisionDescription) git_describe(VERSION ${ARGN}) + get_git_head_revision(GIT_BRANCH HASH_VAR) string(FIND ${VERSION} "." VALID_VERSION) if(VALID_VERSION EQUAL -1) message(WARNING "Version string ${VERSION} retrieved with git describe is invalid") @@ -18,11 +19,14 @@ function(determine_version_with_git) string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" _VERSION_MINOR "${VERSION}") string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" _VERSION_PATCH "${VERSION}") string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+-(.*)" "\\1" VERSION_SHA1 "${VERSION}") + string(STRIP "${GIT_BRANCH}" GIT_BRANCH) set(GIT_INFO ${VERSION}) list(APPEND GIT_INFO ${_VERSION_MAJOR}) list(APPEND GIT_INFO ${_VERSION_MINOR}) list(APPEND GIT_INFO ${_VERSION_PATCH}) list(APPEND GIT_INFO ${VERSION_SHA1}) set(GIT_INFO ${GIT_INFO} PARENT_SCOPE) + set(GIT_BRANCH ${GIT_BRANCH} PARENT_SCOPE) + message(STATUS "${MSG_PREFIX} git branch ${GIT_BRANCH}") message(STATUS "${MSG_PREFIX} Set git version info into GIT_INFO from the git tag ${VERSION}") endfunction() diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 00000000..19216d82 --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,38 @@ +if(NOT DEFINED VERSION_MAJOR) + message(WARNING "version.cmake | No VERSION_MAJOR variable passed. Setting to 0") + set(VERSION_MAJOR 0) +endif() +if(NOT DEFINED VERSION_MINOR) + message(WARNING "version.cmake | No VERSION_MINOR variable passed. Setting to 0") + set(VERSION_MINOR 0) +endif() +if(NOT DEFINED VERSION_REVISION) + message(WARNING "version.cmake | No VERSION_REVISION variable passed. Setting to 0") + set(VERSION_REVISION 0) +endif() +if(NOT DEFINED VERSION_VCS_INFO) + set(VERSION_VCS_INFO "") +endif() + +set(VERSION_TO_SET "#include \"version.h\" + +namespace fsfw { + +const int FSFW_VERSION_MAJOR = ${VERSION_MAJOR}; +const int FSFW_VERSION_MINOR = ${VERSION_MINOR}; +const int FSFW_VERSION_REVISION = ${VERSION_MINOR}; +const char FSFW_VCS_INFO[] = \"${VERSION_VCS_INFO}\"; + +}; +") + +if(EXISTS ${VERSION_DIR}/versionAutogen.cpp) + file(READ ${VERSION_DIR}/versionAutogen.cpp OLD_VERSION) +else() + set(OLD_VERSION "") +endif() + +if (NOT "${VERSION_TO_SET}" STREQUAL "${OLD_VERSION}") + message(STATUS "Updating versionAutogen.cpp file") + file(WRITE ${VERSION_DIR}/versionAutogen.cpp "${VERSION_TO_SET}") +endif() diff --git a/src/fsfw/CMakeLists.txt b/src/fsfw/CMakeLists.txt index efb9f6c7..a5b48366 100644 --- a/src/fsfw/CMakeLists.txt +++ b/src/fsfw/CMakeLists.txt @@ -1,5 +1,6 @@ target_sources(${LIB_FSFW_NAME} PRIVATE version.cpp + versionAutogen.cpp ) # Core diff --git a/src/fsfw/FSFWVersion.h.in b/src/fsfw/FSFWVersion.h.in deleted file mode 100644 index caff1efb..00000000 --- a/src/fsfw/FSFWVersion.h.in +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef FSFW_VERSION_H_ -#define FSFW_VERSION_H_ - -// Versioning is managed in project CMakeLists.txt file -static constexpr int FSFW_VERSION_MAJOR = @FSFW_VERSION@; -static constexpr int FSFW_VERSION_MINOR = @FSFW_SUBVERSION@; -static constexpr int FSFW_VERSION_REVISION = @FSFW_REVISION@; -// Also contains CST (Commits since tag) information -static const char FSFW_VCS_INFO[] = "@FSFW_VCS_INFO@"; - -#endif /* FSFW_VERSION_H_ */ diff --git a/src/fsfw/version.h b/src/fsfw/version.h index a538c39a..bf581b5c 100644 --- a/src/fsfw/version.h +++ b/src/fsfw/version.h @@ -57,7 +57,12 @@ class Version { void getVersion(char* str, size_t maxLen) const; }; -extern const Version FSFW_VERSION; +extern const int FSFW_VERSION_MAJOR; +extern const int FSFW_VERSION_MINOR; +extern const int FSFW_VERSION_REVISION; +extern const char FSFW_VCS_INFO[]; + +extern const fsfw::Version FSFW_VERSION; } // namespace fsfw diff --git a/src/fsfw/versionAutogen.cpp b/src/fsfw/versionAutogen.cpp new file mode 100644 index 00000000..a8cea443 --- /dev/null +++ b/src/fsfw/versionAutogen.cpp @@ -0,0 +1,10 @@ +#include "version.h" + +namespace fsfw { + +const int FSFW_VERSION_MAJOR = 4; +const int FSFW_VERSION_MINOR = 0; +const int FSFW_VERSION_REVISION = 0; +const char FSFW_VCS_INFO[] = "285-gaa4e2d72"; + +};