#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2014,2015,2016,2017,2018,2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2016,2017,2018 by the GROMACS development team.
+# Copyright (c) 2019,2020,2021, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
# Sets version information variables and provides CMake functions for
# generating files based on them
#
-# This script provides the following basic version variables that need to be
-# maintained manually:
+# The following variables are derived from variables initialized by
+# https://cmake.org/cmake/help/latest/command/project.html#command:project
# GMX_VERSION_MAJOR Major version number.
# GMX_VERSION_PATCH Patch version number.
# Should always be defined: zero for, e.g., 2016.
+#
+# This script provides the following basic version variables that need to be
+# maintained manually:
# GMX_VERSION_SUFFIX String suffix to add to numeric version string.
# "-dev" is automatically added when not building from a source package,
# and does not need to be kept here. This mechanism is not quite enough
# GROMACS 2018 3
# GROMACS 2019 4
# GROMACS 2020 5
+# GROMACS 2021 6
+# GROMACS 2022 7
# LIBRARY_SOVERSION_MINOR so minor version for the built libraries.
# Should be increased for each release that changes only the implementation.
# In GROMACS, the typical policy is to increase it for each patch version
# The scripts gmxGenerateVersionInfo.cmake and gmxConfigureVersionInfo.cmake
# are used internally by this machinery, as well as VersionInfo.cmake.cmakein.
+#####################################################################
+# Derived version info.
+# Ref https://cmake.org/cmake/help/latest/command/project.html#command:project
+set(GMX_VERSION_MAJOR ${Gromacs_VERSION_MAJOR})
+set(GMX_VERSION_PATCH ${Gromacs_VERSION_MINOR})
+
#####################################################################
# Manually maintained version info
-# The GROMACS convention is that these are the version number of the next
-# release that is going to be made from this branch.
-set(GMX_VERSION_MAJOR 2020)
-set(GMX_VERSION_PATCH 0)
-# The suffix, on the other hand, is used mainly for betas and release
+# The suffix is used mainly for betas and release
# candidates, where it signifies the most recent such release from
# this branch; it will be empty before the first such release, as well
# as after the final release is out.
-set(GMX_VERSION_SUFFIX "-rc1")
+set(GMX_VERSION_SUFFIX "-beta1")
# Conventionally with libtool, any ABI change must change the major
# version number, the minor version number should change if it's just
# here. The important thing is to minimize the chance of third-party
# code being able to dynamically link with a version of libgromacs
# that might not work.
-set(LIBRARY_SOVERSION_MAJOR 5)
+set(LIBRARY_SOVERSION_MAJOR 7)
set(LIBRARY_SOVERSION_MINOR 0)
set(LIBRARY_VERSION ${LIBRARY_SOVERSION_MAJOR}.${LIBRARY_SOVERSION_MINOR}.0)
endif()
set(GMX_VERSION_STRING "${GMX_VERSION}${GMX_VERSION_SUFFIX}")
+set(REGRESSIONTEST_VERSION "${GMX_VERSION_STRING}")
+set(REGRESSIONTEST_BRANCH "master")
+# Follow the relevant part of the release checklist at
+# https://gitlab.com/gromacs/gromacs/-/wikis/Release-checklist#how-to-build-a-regressiontests-tarball
+# in order to have it build the regressiontests tarball with all the
+# right version naming. The version number and suffix goes into the
+# directory name within the regressiontests tarball, which affects the
+# md5sum of the tarball. The matching md5sum has to go here, and if it
+# isn't right the real release workflow will report a failure.
+set(REGRESSIONTEST_MD5SUM "9e122010c6e0fea35ec621a8e6561f7f" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
+
# If you are making a custom fork of GROMACS, please describe your
# fork, perhaps with its version number, in the value of
# GMX_VERSION_STRING_OF_FORK here. This string will appear in the
option(GMX_BUILD_TARBALL "Build tarball without -dev version suffix" OFF)
mark_as_advanced(GMX_BUILD_TARBALL)
-# If run with cmake -P, the -dev suffix is managed elsewhere.
if (NOT SOURCE_IS_SOURCE_DISTRIBUTION AND
- NOT GMX_BUILD_TARBALL AND
- NOT CMAKE_SCRIPT_MODE_FILE)
+ NOT GMX_BUILD_TARBALL)
set(GMX_VERSION_STRING "${GMX_VERSION_STRING}-dev")
endif()
-set(REGRESSIONTEST_VERSION "${GMX_VERSION_STRING}")
-set(REGRESSIONTEST_BRANCH "refs/heads/release-2020")
-# Run the regressiontests packaging job with the correct pakage
-# version string, and the release box checked, in order to have it
-# build the regressiontests tarball with all the right naming. The
-# naming affects the md5sum that has to go here, and if it isn't right
-# release workflow will report a failure.
-set(REGRESSIONTEST_MD5SUM "42e3bfe74a8e8bf8e38919e10aaf8fa1" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
-
math(EXPR GMX_VERSION_NUMERIC
"${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
set(GMX_API_VERSION ${GMX_VERSION_NUMERIC})
-# If run with cmake -P from releng scripts, print out necessary version info
-# as JSON.
-if (CMAKE_SCRIPT_MODE_FILE)
- message("{ \"version\": \"${GMX_VERSION_STRING}\", \"regressiontest-md5sum\": \"${REGRESSIONTEST_MD5SUM}\" }")
- return()
-endif()
-
# Set those values only in release versions, after getting the identifiers
# from Zenodo for the manual and source code
# Has to be done by hand before every final release
endif()
include(gmxCustomCommandUtilities)
-
+include(FindPythonModule)
# The first two are also for use outside this file, encapsulating the details
# of how to use the generated VersionInfo.cmake.
set(VERSION_INFO_CMAKE_FILE ${PROJECT_BINARY_DIR}/VersionInfo.cmake)
set(VERSION_INFO_CMAKEIN_FILE ${CMAKE_CURRENT_LIST_DIR}/VersionInfo.cmake.cmakein)
set(VERSION_INFO_CONFIGURE_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/gmxConfigureVersionInfo.cmake)
# A set of directories to scan for calculating the hash of source files.
-set(SET_OF_DIRECTORIES_TO_CHECKSUM "${PROJECT_SOURCE_DIR}/src")
-list(APPEND SET_OF_DIRECTORIES_TO_CHECKSUM "${PROJECT_SOURCE_DIR}/python_packaging")
-# Try to find python for the checksumming script
-set(PythonInterp_FIND_QUIETLY ON)
-find_package(PythonInterp 3.5)
+set(SET_OF_DIRECTORIES_TO_CHECKSUM "src")
+list(APPEND SET_OF_DIRECTORIES_TO_CHECKSUM "python_packaging")
+# Due to the limitations for passing a list as arguments, we make the directories a string here
+string(REPLACE ";" ":" DIRECTORIES_TO_CHECKSUM_STRING "${SET_OF_DIRECTORIES_TO_CHECKSUM}")
# Rules to create the VersionInfo.cmake file.
# For git info, the sequence is:
# - These are again custom commands that depend on the output from
# step 1, so they get regenerated only when the static version info
# changes.
+#
+# Note that VersionInfo-partial.cmake is also used to transfer version
+# information between GitLab CI jobs for release and documentation builds.
+
+# Check if we have all necessary python modules available
+if (Python3_Interpreter_FOUND)
+ set(HAVE_FULL_FUNCTIONING_PYTHON Python3_Interpreter_FOUND)
+ foreach(module argparse hashlib hmac os stat re) # add further modules if necessary
+ find_python_module(${module} QUIET)
+ string(TOUPPER ${module} module_upper)
+ if(NOT PYTHONMODULE_${module_upper})
+ message(STATUS
+ "Python module ${module} not found - disabling checksum validation")
+ unset(HAVE_FULL_FUNCTIONING_PYTHON)
+ endif()
+ endforeach()
+endif()
+
+# Configure information known at this time into a partially filled
+# version info file.
+set(VERSION_INFO_CMAKEIN_FILE_PARTIAL
+ ${PROJECT_BINARY_DIR}/VersionInfo-partial.cmake.cmakein)
+# Leave these to be substituted by the targets below.
+set(GMX_VERSION_STRING_FULL "\@GMX_VERSION_STRING_FULL\@")
+
if (GMX_GIT_VERSION_INFO)
- # Configure information known at this time into a partially filled
- # version info file.
- set(VERSION_INFO_CMAKEIN_FILE_PARTIAL
- ${PROJECT_BINARY_DIR}/VersionInfo-partial.cmake.cmakein)
# Leave these to be substituted by the custom target below.
- set(GMX_VERSION_STRING_FULL "\@GMX_VERSION_STRING_FULL\@")
+ # Specific for building from git.
set(GMX_VERSION_FULL_HASH "\@GMX_VERSION_FULL_HASH\@")
set(GMX_VERSION_CENTRAL_BASE_HASH "\@GMX_VERSION_CENTRAL_BASE_HASH\@")
- configure_file(${VERSION_INFO_CMAKEIN_FILE}
- ${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
- @ONLY)
# If generating the version info, create a target that runs on every build
# and does the actual git calls, storing the results into a CMake script.
# This needs to be run at build time to update the version information
COMMENT "Generating git version information")
list(APPEND VERSION_INFO_DEPS git-version-info)
else()
- # If the version info is static, just generate the CMake script with the
- # version variables during the CMake run.
- set(GMX_VERSION_STRING_FULL ${GMX_VERSION_STRING})
- set(GMX_VERSION_FULL_HASH "")
- set(GMX_VERSION_CENTRAL_BASE_HASH "")
- # To notify the user during compilation and at runtime that the build source
- # has not been modified after unpacking the source tarball, the contents are hashed
- # to be compared to a hash computed during the release process. If the hash matches
- # all is fine and the user gets a message in the log file indicating that.
- # If either the release hash file is missing, or if the hash does not match
- # a different message is printed to indicate that the source has been changed
- # compared to the version actually released. This is not needed in case a build
- # is done in git, as we have the information there already.
- # This is not done if the user has explicitly set an additional custom version string with
- # -DGMX_VERSION_STRING_OF_FORK, as this indicates that they are knowing that a custom
- # version of GROMACS is in use.
- set(RELEASE_CHECKSUM_FILE "${PROJECT_SOURCE_DIR}/src/reference_checksum")
- if(NOT GMX_VERSION_STRING_OF_FORK OR "${GMX_VERSION_STRING_OF_FORK}" STREQUAL "")
- if(EXISTS ${RELEASE_CHECKSUM_FILE} AND PythonInterp_FOUND)
- file(READ ${RELEASE_CHECKSUM_FILE} GMX_RELEASE_SOURCE_FILE_CHECKSUM)
- string(STRIP ${GMX_RELEASE_SOURCE_FILE_CHECKSUM} GMX_RELEASE_SOURCE_FILE_CHECKSUM)
- set(CHECKSUM_RESULT_FILE "${CMAKE_CURRENT_BINARY_DIR}/computed_checksum")
- execute_process(COMMAND ${PYTHON_EXECUTABLE}
- ${PROJECT_SOURCE_DIR}/admin/createFileHash.py
- -s ${SET_OF_DIRECTORIES_TO_CHECKSUM}
- -o ${CHECKSUM_RESULT_FILE}
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- OUTPUT_QUIET)
- file(READ ${CHECKSUM_RESULT_FILE} GMX_CURRENT_SOURCE_FILE_CHECKSUM)
- string(STRIP ${GMX_CURRENT_SOURCE_FILE_CHECKSUM} GMX_CURRENT_SOURCE_FILE_CHECKSUM)
- if(NOT ${GMX_RELEASE_SOURCE_FILE_CHECKSUM} STREQUAL ${GMX_CURRENT_SOURCE_FILE_CHECKSUM})
- set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-MODIFIED")
- message(STATUS "The source code for this GROMACS installation is different from the officially released version.")
- endif()
- elseif(PythonInterp_FOUND)
- set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-UNCHECKED")
- set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "NoChecksumFile")
- set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "NoChecksumFile")
- message(WARNING "Could not valdiate the GROMACS source due to missing reference checksum file.")
- else()
- set(GMX_VERSION_STRING_FULL "${GMX_VERSION_STRING_FULL}-UNCHECKED")
- set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "NoPythonAvailable")
- set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "NoPythonAvailable")
- message(STATUS "Could not calculate checksum of source files without Python")
- endif()
- endif()
- configure_file(${VERSION_INFO_CMAKEIN_FILE} ${VERSION_INFO_CMAKE_FILE})
+ # Leave these to be substituted by the custom target below.
+ # Specific for building from source tarball.
+ set(GMX_RELEASE_SOURCE_FILE_CHECKSUM "\@GMX_RELEASE_SOURCE_FILE_CHECKSUM\@")
+ set(GMX_CURRENT_SOURCE_FILE_CHECKSUM "\@GMX_CURRENT_SOURCE_FILE_CHECKSUM\@")
+ gmx_add_custom_output_target(release-version-info RUN_ALWAYS
+ OUTPUT ${VERSION_INFO_CMAKE_FILE}
+ COMMAND ${CMAKE_COMMAND}
+ -D PYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
+ -D HAVE_FULL_FUNCTIONING_PYTHON=${HAVE_FULL_FUNCTIONING_PYTHON}
+ -D PROJECT_VERSION=${GMX_VERSION_STRING}
+ -D PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
+ -D DIRECTORIES_TO_CHECKSUM=${DIRECTORIES_TO_CHECKSUM_STRING}
+ -D VERSION_CMAKEIN=${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
+ -D VERSION_OUT=${VERSION_INFO_CMAKE_FILE}
+ -D VERSION_STRING_OF_FORK=${GMX_VERSION_STRING_OF_FORK}
+ -D SOURCE_IS_SOURCE_DISTRIBUTION=${SOURCE_IS_SOURCE_DISTRIBUTION}
+ -P ${CMAKE_CURRENT_LIST_DIR}/gmxGenerateVersionInfoWithoutGit.cmake
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ COMMENT "Generating release version information")
+ list(APPEND VERSION_INFO_DEPS release-version-info)
endif()
+configure_file(${VERSION_INFO_CMAKEIN_FILE}
+ ${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
+ @ONLY)
unset(GMX_VERSION_STRING_FULL)
unset(GMX_VERSION_FULL_HASH)
unset(GMX_VERSION_CENTRAL_BASE_HASH)
# not been tampered with.
# Note: The RUN_ALWAYS here is to regenerate the hash file only, it does not
# mean that the target is run in all builds
-if (PYTHONINTERP_FOUND)
+if (HAVE_FULL_FUNCTIONING_PYTHON)
+ # We need the full path to the directories after passing it through
+ set(FULL_PATH_DIRECTORIES "")
+ foreach(DIR ${SET_OF_DIRECTORIES_TO_CHECKSUM})
+ list(APPEND FULL_PATH_DIRECTORIES "${PROJECT_SOURCE_DIR}/${DIR}")
+ endforeach()
gmx_add_custom_output_target(reference_checksum RUN_ALWAYS
OUTPUT ${CHECKSUM_FILE}
COMMAND ${PYTHON_EXECUTABLE}
${PROJECT_SOURCE_DIR}/admin/createFileHash.py
- -s ${SET_OF_DIRECTORIES_TO_CHECKSUM}
+ -s ${FULL_PATH_DIRECTORIES}
-o ${CHECKSUM_FILE}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT "Generating reference checksum of source files")
else()
add_custom_target(reference_checksum
COMMAND ${CMAKE_COMMAND} -E echo
- "Can not checksum files without python being available"
+ "Can not checksum files without python3 being available"
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT "Generating reference checksum of source files")
endif()