2 # This file is part of the GROMACS molecular simulation package.
4 # Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
5 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6 # and including many others, as listed in the AUTHORS file in the
7 # top-level source directory and at http://www.gromacs.org.
9 # GROMACS is free software; you can redistribute it and/or
10 # modify it under the terms of the GNU Lesser General Public License
11 # as published by the Free Software Foundation; either version 2.1
12 # of the License, or (at your option) any later version.
14 # GROMACS is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 # Lesser General Public License for more details.
19 # You should have received a copy of the GNU Lesser General Public
20 # License along with GROMACS; if not, see
21 # http://www.gnu.org/licenses, or write to the Free Software Foundation,
22 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 # If you want to redistribute modifications to GROMACS, please
25 # consider that scientific software is very special. Version
26 # control is crucial - bugs must be traceable. We will be happy to
27 # consider code for inclusion in the official distribution, but
28 # derived work must not be called official GROMACS. Details are found
29 # in the README & COPYING files - if they are missing, get the
30 # official version at http://www.gromacs.org.
32 # To help us fund GROMACS development, we humbly ask that you cite
33 # the research papers on the package. Check out http://www.gromacs.org.
35 # Sets version information variables and provides CMake functions for
36 # generating files based on them
38 # This script provides the following basic version variables that need to be
39 # maintained manually:
40 # GMX_VERSION_MAJOR Major version number.
41 # GMX_VERSION_PATCH Patch version number.
42 # Should always be defined: zero for, e.g., 2016.
43 # GMX_VERSION_SUFFIX String suffix to add to numeric version string.
44 # "-dev" is automatically added when not building from a source package,
45 # and does not need to be kept here. This mechanism is not quite enough
46 # for building a tarball, but setting the CMake cache variable
47 # GMX_BUILD_TARBALL=on will suppress the addition of "-dev" to the
49 # LIBRARY_SOVERSION_MAJOR so major version for the built libraries.
50 # Should be increased for each binary incompatible release. In GROMACS,
51 # the typical policy is to increase it at the start of the development
52 # cycle for each major/minor version change, but not for patch releases,
53 # even if the latter may not always be fully binary compatible.
54 # Table of historical values
59 # LIBRARY_SOVERSION_MINOR so minor version for the built libraries.
60 # Should be increased for each release that changes only the implementation.
61 # In GROMACS, the typical policy is to increase it for each patch version
62 # change, even if they may not always be fully binary compatible.
63 # If it is somehow clear that the ABI implementation has not changed
64 # in a patch release, this variable should not increase. Release candidate
65 # and beta versions will not increase this number, since nobody should
66 # write code against such versions.
67 # LIBRARY_VERSION Full library version.
68 # REGRESSIONTEST_BRANCH For builds not from source packages, name of the
69 # regressiontests branch at gerrit.gromacs.org whose HEAD can test this
70 # code, *if* this code is recent enough (i.e., contains all changes from
71 # the corresponding code branch that affects the regression test
72 # results). Even after a release branch is forked for the source
73 # repository, the correct regressiontests branch can still be master,
74 # because we do not fork it until behaviour needs to change.
75 # REGRESSIONTEST_MD5SUM
76 # The MD5 checksum of the regressiontest tarball. Only used when building
77 # from a source package.
78 # They are collected into a single section below.
79 # The following variables are set based on these:
80 # GMX_VERSION String composed from GMX_VERSION_* numeric variables
81 # above. Example: 4.6.1, 5.0, 2016
82 # GMX_VERSION_STRING String with GMX_VERSION suffixed with the given
83 # suffix and possibly "-dev" for builds not from a source package.
84 # GMX_VERSION_NUMERIC Numeric version number (e.g., 40601 for 4.6.1, 20160001 for 2016.1).
85 # GMX_API_VERSION Numeric API version.
86 # This is currently set automatically to GMX_VERSION_NUMERIC, but may
87 # become manually maintained in the future if there will be releases
88 # where the API does not change, but programs/libraries do.
89 # In such a case, this should be the first version where the current API
91 # REGRESSIONTEST_VERSION For source packages, version number of the
92 # matching regressiontests tarball. Not used for builds not from source
94 # The latter two are used to generate gromacs/version.h to allow software
95 # written against the GROMACS API to provide some #ifdef'ed code to support
96 # multiple GROMACS versions.
98 # This script also declares machinery to generate and obtain version
99 # information from a git repository. This is enabled by default if the source
100 # tree is a git, but can be disabled with
101 # GMX_GIT_VERSION_INFO Advanced CMake variable to disable git
102 # version info generation.
103 # The main interface to this machinery is the gmx_configure_version_file()
104 # CMake function. The signature is
105 # gmx_configure_version_file(<input> <output>
108 # [COMMENT <comment>])
109 # <input> Specify the input and output files as for configure_file().
110 # <output> The configuration is done with configure_file(... @ONLY) with
111 # the following variables defined (as well as all the
112 # GMX_VERSION* variables from above):
113 # GMX_VERSION_STRING_FULL
114 # GMX_VERSION_FULL_HASH
115 # GMX_VERSION_CENTRAL_BASE_HASH
116 # The output file is created during build time, so any dependent
117 # targets should specify it as a dependency.
118 # REMOTE_HASH Currently, this has no effect, but it signifies that the
119 # <input> file is using the CENTRAL_BASE_HASH variable.
120 # This variable is much more expensive to initialize than the
121 # others, so this allows local changes in this file to only
122 # compute that value when required if that becomes necessary.
123 # TARGET By default, this function uses add_custom_command() to
124 # generate the output file. If TARGET is specified, then
125 # add_custom_target() is used to create a target with the given
126 # name <target> that runs this custom command. Use this if
127 # the same file will be used for multiple downstream targets,
128 # or if the explicit target for the file is otherwise
130 # COMMENT Set a custom comment to be shown when building the rule
131 # (see add_custom_command(... COMMENT <comment>)).
132 # As an alternative to using this script, also the following variables are
133 # provided (can be useful when generating more complex CMake scripts that do
135 # VERSION_INFO_CMAKE_SCRIPT
136 # Absolute path to a CMake script that can be included using include()
137 # to declare the GMX_VERSION_* variables documented for
138 # gmx_configure_version_file().
140 # If a custom command depends on VERSION_INFO_CMAKE_SCRIPT, then it
141 # should add ${VERSION_INFO_DEPS} to its DEPENDS list to get the
142 # appropriate dependencies.
143 # TODO: If someone wants to add a custom target that depends on
144 # VERSION_INFO_CMAKE_SCRIPT, a separate variable may be needed for those
147 # The version string printed by 'gmx -version' (and also printed in the startup
148 # header) can provide useful information for, e.g., diagnosing bug reports and
149 # identifying what exact version the user was using. The following formats are
150 # possible (with examples given for a particular version):
151 # 4.6.1 Plain version number without any suffix signifies a build from
152 # a released source tarball.
153 # 4.6.1-dev '-dev' suffix signifies all other builds. If there is no other
154 # information, either the user built the code outside any git
155 # repository, or disabled the version info generation.
156 # 4.6.1-dev-YYYYMMDD-1234abc
157 # The YYYYMMDD part shows the commit date (not author date) of
158 # the HEAD commit from which the code was built. The abbreviated
159 # hash is the hash of that commit (the full hash is available in
160 # 'gmx -version' output).
161 # If the HEAD hash is not identified as coming from branches in
162 # "authoritative" GROMACS repositories, 'gmx -version' will show
163 # the nearest ancestor commit that is identified as such (but see
164 # the '-local' and '-unknown' suffixes below).
165 # 4.6.1-dev-YYYYMMDD-1234abc-dirty
166 # As above, but there were local modifications in the source tree
167 # when the code was built.
168 # 4.6.1-dev-YYYYMMDD-1234abc-unknown
169 # As above, but there were no remotes in the repository that
170 # could be identified as "authoritative" GROMACS repositories.
171 # This happens if the code is not cloned from git.gromacs.org
172 # or gerrit.gromacs.org.
173 # 4.6.1-dev-YYYYMMDD-1234abc-local
174 # As above, but there were no commits in the recent history of
175 # the branch that could be identified as coming from
176 # "authoritative" GROMACS repositories. This should be
179 # Other variables set here are not intended for use outside this file.
180 # The scripts gmxGenerateVersionInfo.cmake and gmxConfigureVersionInfo.cmake
181 # are used internally by this machinery, as well as VersionInfo.cmake.cmakein.
183 #####################################################################
184 # Manually maintained version info
186 # The GROMACS convention is that these are the version number of the next
187 # release that is going to be made from this branch.
188 set(GMX_VERSION_MAJOR 2018)
189 set(GMX_VERSION_PATCH 3)
190 # The suffix, on the other hand, is used mainly for betas and release
191 # candidates, where it signifies the most recent such release from
192 # this branch; it will be empty before the first such release, as well
193 # as after the final release is out.
194 set(GMX_VERSION_SUFFIX "")
196 # Conventionally with libtool, any ABI change must change the major
197 # version number, the minor version number should change if it's just
198 # the implementation that has been altered, and the third number
199 # counts the number of old major versions that will still run if
200 # linked to this library (i.e. it is not a patch number). See the
201 # above descriptions of LIBRARY_SOVERSION_* for policy for changes
202 # here. The important thing is to minimize the chance of third-party
203 # code being able to dynamically link with a version of libgromacs
204 # that might not work.
205 set(LIBRARY_SOVERSION_MAJOR 3)
206 set(LIBRARY_SOVERSION_MINOR 4)
207 set(LIBRARY_VERSION ${LIBRARY_SOVERSION_MAJOR}.${LIBRARY_SOVERSION_MINOR}.0)
209 #####################################################################
210 # General version management based on manually set numbers
212 if (GMX_VERSION_PATCH)
213 set(GMX_VERSION "${GMX_VERSION_MAJOR}.${GMX_VERSION_PATCH}")
215 set(GMX_VERSION "${GMX_VERSION_MAJOR}")
217 set(GMX_VERSION_STRING "${GMX_VERSION}${GMX_VERSION_SUFFIX}")
218 option(GMX_BUILD_TARBALL "Build tarball without -dev version suffix" OFF)
219 mark_as_advanced(GMX_BUILD_TARBALL)
220 # If run with cmake -P, the -dev suffix is managed elsewhere.
221 if (NOT SOURCE_IS_SOURCE_DISTRIBUTION AND
222 NOT GMX_BUILD_TARBALL AND
223 NOT CMAKE_SCRIPT_MODE_FILE)
224 set(GMX_VERSION_STRING "${GMX_VERSION_STRING}-dev")
227 set(REGRESSIONTEST_VERSION "${GMX_VERSION_STRING}")
228 set(REGRESSIONTEST_BRANCH "refs/heads/release-2018")
229 # Run the regressiontests packaging job with the correct pakage
230 # version string, and the release box checked, in order to have it
231 # build the regressiontests tarball with all the right naming. The
232 # naming affects the md5sum that has to go here, and if it isn't right
233 # release workflow will report a failure.
234 set(REGRESSIONTEST_MD5SUM "368aabf0eb4e6fbc9abb7961475f66de" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
236 math(EXPR GMX_VERSION_NUMERIC
237 "${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
238 set(GMX_API_VERSION ${GMX_VERSION_NUMERIC})
240 # If run with cmake -P from releng scripts, print out necessary version info
242 if (CMAKE_SCRIPT_MODE_FILE)
243 message("{ \"version\": \"${GMX_VERSION_STRING}\", \"regressiontest-md5sum\": \"${REGRESSIONTEST_MD5SUM}\" }")
247 #####################################################################
248 # git version info management
250 # There can be clusters where git and CMake can run on nodes where the other is
251 # not available, accessing the same source tree.
252 # Should be unlikely, but doesn't hurt to check.
253 set(_git_info_default OFF)
254 if (SOURCE_IS_GIT_REPOSITORY)
257 set(_git_info_default ON)
260 option(GMX_GIT_VERSION_INFO "Generate git version information" ${_git_info_default})
261 mark_as_advanced(GMX_GIT_VERSION_INFO)
262 # Detect preconditions for version info generation if it is requested.
263 if (GMX_GIT_VERSION_INFO)
264 if (NOT SOURCE_IS_GIT_REPOSITORY)
266 "Cannot generate git version information from source tree not under git. "
267 "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
269 # We need at least git v1.5.3 be able to parse git's date output.
270 if (NOT GIT_FOUND OR GIT_VERSION_STRING VERSION_LESS "1.5.3")
272 "No compatible git version found (>= 1.5.3 required). "
273 "Won't be able to generate development version information. "
274 "Set GMX_GIT_VERSION_INFO=OFF to proceed.")
278 include(gmxCustomCommandUtilities)
280 # The first two are also for use outside this file, encapsulating the details
281 # of how to use the generated VersionInfo.cmake.
282 set(VERSION_INFO_CMAKE_FILE ${PROJECT_BINARY_DIR}/VersionInfo.cmake)
283 set(VERSION_INFO_DEPS ${VERSION_INFO_CMAKE_FILE})
284 # Capture the location of the necessary files in internal variables for use in
285 # the function below.
286 set(VERSION_INFO_CMAKEIN_FILE ${CMAKE_CURRENT_LIST_DIR}/VersionInfo.cmake.cmakein)
287 set(VERSION_INFO_CONFIGURE_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/gmxConfigureVersionInfo.cmake)
289 # Rules to create the VersionInfo.cmake file.
290 # For git info, the sequence is:
291 # 1. (configure time) VersionInfo.cmake.cmakein -> VersionInfo-partial.cmake.cmakein
292 # - Set all variables that are known at configure time.
293 # 2. (build time) VersionInfo-partial.cmake.cmakein -> VersionInfo.cmake
294 # - Set variables that may change as result of repository state changes
295 # (i.e., everything that requires running git).
296 # - Runs every time as a git-version-info target, but the output file
297 # timestamp only changes if its contents actually change.
298 # - Depending on the native build system, this may run once per build
299 # or once per each time it is required for step 3.
300 # 3. (build time) VersionInfo.cmake -> other files
301 # - Set variables in files specified with gmx_configure_version_file()
302 # using the values generated in step 2.
303 # - Each file runs as a custom command that depends on the previous
304 # steps, and runs only if the VersionInfo.cmake file is newer than the
306 # Without git info, the sequence is:
307 # 1. (configure time) VersionInfo.cmake.cmakein -> VersionInfo.cmake
308 # - Everything is known at configure time, so the output is generated
309 # immediately with all variables set (git info will be empty).
310 # 2. (build time) VersionInfo.cmake -> other files
311 # - As with git info, processes files from gmx_configure_version_file().
312 # - These are again custom commands that depend on the output from
313 # step 1, so they get regenerated only when the static version info
315 if (GMX_GIT_VERSION_INFO)
316 # Configure information known at this time into a partially filled
318 set(VERSION_INFO_CMAKEIN_FILE_PARTIAL
319 ${PROJECT_BINARY_DIR}/VersionInfo-partial.cmake.cmakein)
320 # Leave these to be substituted by the custom target below.
321 set(GMX_VERSION_STRING_FULL "\@GMX_VERSION_STRING_FULL\@")
322 set(GMX_VERSION_FULL_HASH "\@GMX_VERSION_FULL_HASH\@")
323 set(GMX_VERSION_CENTRAL_BASE_HASH "\@GMX_VERSION_CENTRAL_BASE_HASH\@")
324 configure_file(${VERSION_INFO_CMAKEIN_FILE}
325 ${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
327 # If generating the version info, create a target that runs on every build
328 # and does the actual git calls, storing the results into a CMake script.
329 # This needs to be run at build time to update the version information
330 # properly when the git hash changes, but the build system does not.
331 # All targets added by gmx_configure_version_file() use the information
332 # from this script to get their variables from, removing the need to run
333 # git multiple times and simplifying reuse for other purposes.
334 gmx_add_custom_output_target(git-version-info RUN_ALWAYS
335 OUTPUT ${VERSION_INFO_CMAKE_FILE}
336 COMMAND ${CMAKE_COMMAND}
337 -D GIT_EXECUTABLE=${GIT_EXECUTABLE}
338 -D PROJECT_VERSION=${GMX_VERSION_STRING}
339 -D PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
340 -D VERSION_CMAKEIN=${VERSION_INFO_CMAKEIN_FILE_PARTIAL}
341 -D VERSION_OUT=${VERSION_INFO_CMAKE_FILE}
342 -P ${CMAKE_CURRENT_LIST_DIR}/gmxGenerateVersionInfo.cmake
343 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
344 COMMENT "Generating git version information")
345 list(APPEND VERSION_INFO_DEPS git-version-info)
347 # If the version info is static, just generate the CMake script with the
348 # version variables during the CMake run.
349 set(GMX_VERSION_STRING_FULL ${GMX_VERSION_STRING})
350 set(GMX_VERSION_FULL_HASH "")
351 set(GMX_VERSION_CENTRAL_BASE_HASH "")
352 configure_file(${VERSION_INFO_CMAKEIN_FILE} ${VERSION_INFO_CMAKE_FILE})
354 unset(GMX_VERSION_STRING_FULL)
355 unset(GMX_VERSION_FULL_HASH)
356 unset(GMX_VERSION_CENTRAL_BASE_HASH)
358 # The main user-visible interface to the machinery.
359 # See documentation at the top of the script.
360 function (gmx_configure_version_file INFILE OUTFILE)
361 include(CMakeParseArguments)
362 set(_options REMOTE_HASH)
363 set(_one_value_args COMMENT TARGET)
364 set(_multi_value_args EXTRA_VARS)
365 cmake_parse_arguments(
366 ARG "${_options}" "${_one_value_args}" "${_multi_value_args}" ${ARGN})
367 if (ARG_UNPARSED_ARGUMENTS)
368 message(FATAL_ERROR "Unknown arguments: ${ARG_UNPARSED_ARGUMENTS}")
370 # Some callers may pass partial paths that do not really make sense,
371 # so create a default comment that only contains the actual file name.
372 get_filename_component(_basename ${OUTFILE} NAME)
373 set(_comment "Generating ${_basename}")
375 set(_comment ${ARG_COMMENT})
377 # Mimic configure_file()
378 if (NOT IS_ABSOLUTE ${INFILE})
379 set(INFILE ${CMAKE_CURRENT_SOURCE_DIR}/${INFILE})
381 # Create command-line definitions for the requested variables
382 set(_extra_var_defines)
383 foreach(_var ${ARG_EXTRA_VARS})
384 list(APPEND _extra_var_defines -D "${_var}=${${_var}}")
386 # The touch command is necessary to ensure that after the target is run,
387 # the timestamp is newer than in the input files.
388 add_custom_command(OUTPUT ${OUTFILE}
389 COMMAND ${CMAKE_COMMAND}
390 -D VERSION_VARIABLES=${VERSION_INFO_CMAKE_FILE}
391 -D VERSION_CMAKEIN=${INFILE}
392 -D VERSION_OUT=${OUTFILE}
393 ${_extra_var_defines}
394 -P ${VERSION_INFO_CONFIGURE_SCRIPT}
395 COMMAND ${CMAKE_COMMAND} -E touch ${OUTFILE}
396 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
397 DEPENDS ${INFILE} ${VERSION_INFO_DEPS} ${VERSION_INFO_CONFIGURE_SCRIPT}
398 COMMENT "${_comment}"
401 add_custom_target(${ARG_TARGET} DEPENDS ${OUTFILE} VERBATIM)
402 gmx_set_custom_target_output(${ARG_TARGET} ${OUTFILE})