opm-simulators/cmake/Modules/UseVersion.cmake

93 lines
3.8 KiB
CMake
Raw Normal View History

# - Write version information into the source code
#
# Add an unconditional target to the Makefile which checks the current
# SHA of the source directory and write to a header file if and *only*
# if this has changed (thus we avoid unnecessary rebuilds). By having
# this in the Makefile, we get updated version information even though
# we haven't done any reconfiguring.
#
# The time it takes to probe the VCS for this information and write it
# to the miniature file in negligable.
#
# If the build type is Debug, then we only write a static version
# information as it gets tiresome to rebuild the project everytime one
# makes changes to any of the unit tests.
string (TOUPPER "${CMAKE_BUILD_TYPE}" cmake_build_type_upper_)
if (cmake_build_type_upper_ MATCHES DEBUG)
file (WRITE "${PROJECT_BINARY_DIR}/project-version.h"
"#define PROJECT_VERSION \"${${project}_LABEL} (debug)\"\n"
)
else ()
if (NOT GIT_FOUND)
find_package (Git)
endif ()
# if git is *still* not found means it is not present on the
# system, so there is "no" way we can update the SHA. notice
# that this is a slightly different version of the label than
# above.
if (NOT GIT_FOUND)
file (WRITE "${PROJECT_BINARY_DIR}/project-version.h"
"#define PROJECT_VERSION \"${${project}_LABEL}\"\n"
)
else ()
add_custom_target (update-version ALL
COMMAND ${CMAKE_COMMAND}
-DCMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY}
-DGIT_EXECUTABLE=${GIT_EXECUTABLE}
-DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
-DPROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}
-DPROJECT_LABEL=${${project}_LABEL}
-P ${PROJECT_SOURCE_DIR}/cmake/Scripts/WriteVerSHA.cmake
COMMENT "Updating version information"
)
# the target above gets built every time thanks to the "ALL" modifier,
# but it must also be done before the main library so it can pick up
# any changes it does.
if (${project}_TARGET)
add_dependencies (${${project}_TARGET} update-version)
endif ()
endif ()
endif ()
# safety precaution: check that we don't have version number mismatch.
# first get the name of the module (e.g. "core")
set (_module_regexp "([^-]+)-(.*)")
string (REGEX REPLACE "${_module_regexp}" "\\1" _suite_name "${project}")
string (REGEX REPLACE "${_module_regexp}" "\\2" _module_name "${project}")
# if we have a version number it must be in this file, e.g. opm/core/version.h
set (_rel_ver_h "${${project}_DIR}/${_module_name}/version.h")
set (_version_h "${PROJECT_SOURCE_DIR}/${_rel_ver_h}")
# not all modules have version files, so only check if they do
if (EXISTS "${_version_h}")
# uppercase versions which is used in the file
string (TOUPPER "${_suite_name}" _suite_upper)
string (TOUPPER "${_module_name}" _module_upper)
# scan the files for version define for major version
set (_major_regexp "#define[ ]+${_suite_upper}_${_module_upper}_VERSION_MAJOR[ ]+([0-9]*)")
file (STRINGS "${_version_h}" _version_h_major REGEX "${_major_regexp}")
string (REGEX REPLACE "${_major_regexp}" "\\1" _version_h_major "${_version_h_major}")
# exactly the same, but minor version (making a macro is more lines...)
set (_minor_regexp "#define[ ]+${_suite_upper}_${_module_upper}_VERSION_MINOR[ ]+([0-9]*)")
file (STRINGS "${_version_h}" _version_h_minor REGEX "${_minor_regexp}")
string (REGEX REPLACE "${_minor_regexp}" "\\1" _version_h_minor "${_version_h_minor}")
# compare what we got from the file with what we have defined here
if (NOT (("${_version_h_major}" EQUAL "${${project}_VERSION_MAJOR}")
AND ("${_version_h_minor}" EQUAL "${${project}_VERSION_MINOR}")))
set (_proj_ver "${${project}_VERSION_MAJOR}.${${project}_VERSION_MINOR}")
set (_file_ver "${_version_h_major}.${_version_h_minor}")
message (AUTHOR_WARNING
"Version in build system (dune.module) is \"${_proj_ver}\", "
"but version in source (${_rel_ver_h}) is \"${_file_ver}\""
)
endif ()
endif ()