Build system overview¶
The GROMACS build system uses CMake (version 3.4.3 or newer is required) to generate the actual build system for the build tool choosen by the user. See CMake documentation for general introduction to CMake and how to use it. This documentation focuses on how the GROMACS build system is organized and implemented, and what features it provides to developers (some of which may be of interest to advanced users).
Most developers use make
or ninja
as the underlying build system, so
there can be parts of the build system that are specifically designed for
command-line consumption with these tools, and may not work ideally with other
environments, but basic building should be possible with all the environments
supported by CMake.
Also, the build system and version control is designed for out-of-source
builds. In-source builds mostly work (there are a few custom targets that do
not), but no particular effort has been put to, e.g., having .gitignore
files that exclude all the build outputs, or to have the clean
target
remove all possible build outputs.
Build types¶
Build types is a CMake concept that provides overall control of how
the build tools are used on the given platform to produce executable
code. These can be set in CMake in various ways, including on a
command line such as cmake -DCMAKE_BUILD_TYPE=Debug
. GROMACS
supports the following standard CMake build types:
- Release
- Fully optimized code intended for use in production simulation. This is the default.
- Debug
- Compiled code intended for use with debugging tools, with low optimization levels and debug information for symbols.
- RelWithDebInfo
- As Release, but with debug information for symbol names, which can help debugging issues that only emerge in optimized code.
- MinSizeRel
- As Release, but optimized to minimize the size of the resulting executable. This is never a concern for GROMACS installations, so should not be used, but probably works.
Additionally, GROMACS provides the following build types for development and
testing. Their implementations can be found in cmake/gmxBuildTypeXXX.cmake
.
- Reference
- This build type compiles a version of GROMACS aimed solely at correctness. All parallelization and optimization possibilities are disabled. This build type is compiled with gcc 4.7 to generate the regression test reference values, against which all other GROMACS builds are tested.
- RelWithAssert
- As Release, but removes
-DNDEBUG
from compiler command lines, which makes all assertion statements active (and can have other safety-related side effects in GROMACS and code upon which it depends) - Profile
- As Release, but adds
-pg
for use with profiling tools. This is not likely to be effective for profiling the performance of gmx mdrun, but can be useful for the tools. - TSAN
- Builds GROMACS for use with ThreadSanitzer in gcc >= 4.8 and clang >= 3.4 (http://clang.llvm.org/docs/ThreadSanitizer.html) to detect data races. This disables the use of atomics in ThreadMPI, preferring the mutex-based implementation.
- ASAN
- Builds GROMACS for use with AddressSanitzer in gcc >= 4.8 and clang >= 3.4 (http://clang.llvm.org/docs/AddressSanitizer.html) to detect many kinds of memory mis-use. By default, AddressSanitizer includes LeakSanitizer.
- MSAN
- Builds GROMACS for use with AddressSanitzer in clang >= 3.4
(http://clang.llvm.org/docs/MemorySanitizer.html) to detect
reads of unitialized memory. This functionality requires that
dependencies of the GROMACS build have been built in a compatible
way (roughly, static libraries with
-g -fsanitize=memory -fno-omit-frame-pointer
), which generally requires at least the C++ standard library to have been built specially. The path where the includes and libraries for dependencies should be found for this build type is set in the CMake cache variableGMX_MSAN_PATH
. Only internal XDR and internal fftpack are supported at this time.
For all of the sanitizer builds, to get readable stack traces, you may
need to ensure that the ASAN_SYMBOLIZER_PATH
environment variable
(or your PATH
) include that of the llvm-symbolizer
binary.
With some generators, CMake generates the build system for more than a
single CMAKE_BUILD_TYPE
from one pass over the CMakeLists.txt
files, so any code that uses CMAKE_BUILD_TYPE
in
CMakeLists.txt
directly will break. GROMACS does use such CMake
code, so we do not fully support all these build types in such
generators (which includes Visual Studio).
CMake cache variables¶
This section provides a (currently incomplete) list of cache variables that developers or advanced users can set to affect what CMake generates and/or what will get built.
Compiler flags¶
Standard CMake mechanism for specifying the compiler flags is to use
CMAKE_C_FLAGS
/CMAKE_CXX_FLAGS
for flags that affect all build types,
and CMAKE_C_FLAGS_buildtype
/CMAKE_CXX_FLAGS_buildtype
for
flags that only affect a specific build type. CMake provides some default flags.
GROMACS determines its own set of default flags, grouped into two categories:
- Generic flags that are appended to the above default CMake flag variables (possibly for multiple build types), generally specifying optimization flags to use and controlling compiler warnings.
- Specific flags for certain features that the build system determines to be necessary for successful compilation. One example is flags that determine what SIMD instruction set the compiler is allowed to use/needs to support.
All of the above flags are only added after testing that they work with the provided compiler.
There is one cache variable to control the behavior of automatic compiler flags:
-
GMX_SKIP_DEFAULT_CFLAGS
¶ If set
ON
, the build system will not add any compiler flags automatically (neither generic nor specific as defined above), and will skip most linker flags as well. The default flags that would have been added are instead printed out when cmake is run, and the user can set the flags themselves using the CMake variables. IfOFF
(the default), the flags are added as described above.
The code the determine the default generic flags is in
cmake/gmxCFlags.cmake
.
Code that sets the specific flags (e.g., SIMD flags) is in the main
CMakeLists.txt
; search for GMX_SKIP_DEFAULT_CFLAGS
.
The variables used there can be traced back to the locations where the actual
flags to use are determined.
Variables affecting compilation/linking¶
-
GMX_BROKEN_CALLOC
¶
-
GMX_BUILD_FOR_COVERAGE
¶ Special variable set
ON
by Jenkins when doing a build for the coverage job. Allows the build system to set options to produce as useful coverage metrics as possible. Currently, it disables all asserts to avoid them showing up as poor conditional coverage. Defaults toOFF
, and there should not be any need to change this in a manual build.
-
GMX_BUILD_MDRUN_ONLY
¶ If set
ON
, the build system is configured to only build and install a singlemdrun
executable. To be fully functional, the installedmdrun
requires a standard GROMACS installation (withGMX_BUILD_MDRUN_ONLY=OFF
) in the same installation prefix, as the mdrun-only build does not install any data files or scripts, only the binary. This is intended for cases where one wants to/needs to compile one or more instances ofmdrun
with different build options (e.g., MPI or SIMD) than the full installation with the other utilities. Defaults toOFF
, in which case a singlegmx
executable is built and installed, together with all the supporting files. mdrun can be executed as gmx mdrun.
-
GMX_BUILD_OWN_FFTW
¶
-
GMX_BUILD_SHARED_EXE
¶
-
GMX_COMPILER_WARNINGS
¶ If set
ON
, various compiler warnings are enabled for compilers that Jenkins uses for verification. Defaults toOFF
when building from a source tarball so that users compiling with versions not tested on Jenkins are not exposed to our rather aggressive warning flags that can trigger a lot of warnings with, e.g., new versions of the compilers we use. When building from a git repository, defaults toON
.
-
GMX_CYCLE_SUBCOUNTERS
¶ If set to
ON
, enables performance subcounters that offer more fine-grained mdrun performance measurement and evaluation than the default counters. See Getting good performance from mdrun for the description of subcounters which are available. Defaults toOFF
.
-
GMX_ENABLE_CCACHE
¶ If set to
ON
, attempts to set up the ccache caching compiler wrapper to speed up repeated builds. Theccache
executable is searched for withfind_package()
if CMake is being run with a compatible build type. If the executable is found and a compatible compiler is configured, CMake launch wrapper scripts are set. If enabled, theccache
executable location discovered by CMake must be accessible during build, as well. Defaults toOFF
to minimize build system complexity.
-
GMX_INSTALL_DATASUBDIR
¶ Sets the subdirectory under CMAKE_INSTALL_DATADIR where GROMACS-specific read-only architecture-independent data files are installed. The default is
gromacs
, which means the files will go undershare/gromacs
. To alter theshare
part, change CMAKE_INSTALL_DATADIR. See Relocatable binaries for how this influences the build.
-
GMX_DOUBLE
¶ Many part of GROMACS are implemented in terms of “real” precision, which is actually either a single- or double-precision type, according to the value of this flag. Some parts of the code deliberately use single- or double-precision types, and these are unaffected by this setting. See reference manual for further information.
-
GMX_RELAXED_DOUBLE_PRECISION
¶ Permit a double-precision configuration to compute some quantities to single-precision accuracy. Particularly on architectures where only double-precision SIMD is available (e.g. Sparc machines such as the K computer), it is faster to default to
GMX_DOUBLE=ON
and use SIMD than to useGMX_DOUBLE=OFF
and use no SIMD. However, if the user does not need full double precision, then some optimizations can achieve the equivalent of single-precision results (e.g. fewer Newton-Raphson iterations for a reciprocal square root computation).
-
GMX_EXTRAE
¶
-
GMX_EXTERNAL_BLAS
¶
-
GMX_EXTERNAL_LAPACK
¶
-
GMX_EXTERNAL_TNG
¶
-
GMX_FFT_LIBRARY
¶
-
GMX_GIT_VERSION_INFO
¶ Whether to generate version information dynamically from git for each build (e.g., HEAD commit hash). Defaults to
ON
if the build is from a git repository and git is found, otherwiseOFF
. IfOFF
, static version information fromcmake/gmxVersionInfo.cmake
is used.
-
GMX_GPU
¶
-
GMX_CLANG_CUDA
¶ Use clang for compiling CUDA GPU code, both host and device.
-
GMX_CUDA_CLANG_FLAGS
¶ Pass additional CUDA-only compiler flags to clang using this variable.
-
CMAKE_INSTALL_LIBDIR
¶ Sets the installation directory for libraries (default is determined by standard CMake package
GNUInstallDirs
). See Relocatable binaries for how this influences the build.
-
GMX_LOAD_PLUGINS
¶
-
GMX_MPI
¶
-
GMX_OPENMP
¶
-
GMX_PREFER_STATIC_LIBS
¶
-
GMX_SIMD
¶
-
GMX_SOFTWARE_INVSQRT
¶
-
GMX_THREAD_MPI
¶
-
GMX_USE_RDTSCP
¶
-
GMX_USE_TNG
¶
-
GMX_VMD_PLUGIN_PATH
¶
-
GMX_X11
¶
-
GMX_XML
¶ Currently, this option has no effect on the compilation or linking, since there is no code outside the tests that would use
libxml2
.
Variables affecting the all
target¶
-
BUILD_TESTING
¶ Standard variable created by CTest that enables/disables all tests. Defaults to
ON
.
-
GMX_BUILD_HELP
¶ Controls handling of man pages and shell completions. Possible values:
OFF
(default for builds from release source distribution)- Man pages and shell completions are not generated as part of the
all
target, and only installed if compiling from a source package. AUTO
(default for builds from development version)- Shell completions are generated by executing the
gmx
binary as part of theall
target. If it fails, a message is printed, but the build succeeds. Man pages need to be generated manually by invoking theman
target. Man pages and shell completions are installed if they have been successfully generated. ON
- Works the same as
AUTO
, except that if invoking thegmx
binary fails, the build fails as well.
-
GMX_DEVELOPER_BUILD
¶ If set
ON
, theall
target will include also the test binaries using Google Test (ifGMX_BUILD_UNITTESTS
isON
). Also,GMX_COMPILER_WARNINGS
is always enabled. In the future, other developer convenience features (as well as features inconvenient for a general user) can be added to the set controlled by this variable.
Variables affecting special targets¶
-
GMXAPI
¶ If set
ON
, the additionalgmxapi
C++ library is configured and thegmxapi
headers will be installed. Provides the additional build tree targetsgmxapi-cppdocs
andgmxapi-cppdocs-dev
when Doxygen is available. Also exports CMake configuration files forgmxapi
that allowfind_package(gmxapi)
to import theGromacs::gmxapi
CMake target in client projects that search the GROMACS installation root.
-
GMX_BUILD_MANUAL
¶ If set
ON
, CMake detection for LaTeX and other prerequisites for the reference PDF manual is done, and themanual
target for building the manual is generated. IfOFF
(the default), all detection is skipped and the manual cannot be built.
-
GMX_BUILD_TARBALL
¶ If set
ON
,-dev
suffix is stripped off from version strings and some other version info logic is adjusted such that the man pages and other documentation generated from this build is suitable for releasing (on the web page and/or in the source distribution package). Defaults toOFF
.
-
GMX_BUILD_UNITTESTS
¶ If
ON
, test binaries using Google Test are built (either as the separatetests
targer, or also as part of theall
target, depending onGMX_DEVELOPER_BUILD
). All dependencies required for building the tests (Google Test and Google Mock frameworks, and tinyxml2) are included insrc/external/
. Defaults toON
ifBUILD_TESTING
isON
.
-
GMX_COMPACT_DOXYGEN
¶ If set
ON
, Doxygen configuration is changed to avoid generating large dependency graphs, which makes it significantly faster to run Doxygen and reduces disk usage. This is typically useful when developing the documentation to reduce the build times. Defaults toOFF
.
-
REGRESSIONTEST_DOWNLOAD
¶ If set
ON
, CMake will download the regression tests and extract them to a local directory.REGRESSIONTEST_PATH
is set to the extracted tests. Note that this happens during the configure phase, not during the build. After the download is done, the variable is automatically reset toOFF
again to avoid repeated downloads. Can be set toON
to download again. Defaults toOFF
.
-
REGRESSIONTEST_PATH
¶ Path to extracted regression test suite matching the source tree (the directory containing
gmxtest.pl
) If set, CTest tests are generated to run the regression tests. Defaults to empty.
-
SOURCE_MD5SUM
¶ Sets the MD5 sum of the release tarball when generating the HTML documentation. It gets inserted into the download section of the HTML pages.
External libraries¶
Special targets¶
In addition to the default all
target, the generated build system has
several custom targets that are intended to be explicitly built to perform
various tasks (some of these may also run automatically). There are various
other targets as well used internally by these, but those are typically not
intended to be invoked directly.
- check
- Builds all the binaries needed by the tests and runs the tests. If some types of tests are not available, shows a note to the user. This is the main target intended for normal users to run the tests. See Unit testing.
- check-source
- Runs a custom Python checker script to check for various source-level
issues. Uses Doxygen XML documentation as well as rudimentary parsing of
some parts of the source files.
This target is used as part of the Jenkins documentation job.
All CMake code is currently in
docs/doxygen/
. See Source tree checker scripts. - completion
- Runs the compiled
gmx
executable to generate shell command-line completion definitions. This target is only added ifGMX_BUILD_HELP
is notOFF
, and it is run automatically as part of the defaultall
target. SeeGMX_BUILD_HELP
. All CMake code is insrc/programs/
. - dep-graphs*
- Builds include dependency graphs for the source files using dot
from graphviz.
All CMake code is in
docs/doxygen/
. See Source tree checker scripts. - doxygen-*
- Targets that run Doxygen to generate the documentation.
The
doxygen-all
target runs as part of thewebpage
target, which in turn runs as part of the Jenkins documentation job. All CMake code is indocs/doxygen/
. See Using Doxygen. - gmxapi-cppdocs
- Builds API documentation for gmxapi. Useful to authors of client software.
Documentation is generated in
docs/api-user
in the build directory. - gmxapi-cppdocs-dev
- Extract documentation for gmxapi and GROMACS developers to
docs/api-dev
. - install-guide
- Runs Sphinx to generate a plain-text INSTALL file for the source package.
The files is generated at
docs/install-guide/text/
, from where it gets put at the root of the source package by CPack. All CMake code is indocs/
. - man
- Runs Sphinx to generate man pages for the programs.
Internally, also runs the compiled
gmx
executable to generate the input files for Sphinx. All CMake code is indocs/
. SeeGMX_BUILD_HELP
for information on when the man pages are installed. - manual
- Runs LaTeX to generate the reference PDF manual.
All CMake code is in
docs/manual/
. SeeGMX_BUILD_MANUAL
. - package_source
- Standard target created by CPack that builds a source package. This target is used to generate the released source packages.
- test
- Standard target created by CTest that runs all the registered tests. Note that this does not build the test binaries, only runs them, so you need to first ensure that they are up-to-date. See Unit testing.
- tests
- Builds all the binaries needed by the tests (but not
gmx
). See Unit testing. - webpage
- Collection target that runs the other documentation targets to generate the
full set of HTML (and linked) documentaion.
This target is used as part of the Jenkins documentation job.
All CMake code is in
docs/
. - webpage-sphinx
- Runs Sphinx to generate most content for the HTML documentation (the set of
web pages this developer guide is also part of).
Internally, also runs the compiled
gmx
executable to generate some input files for Sphinx. All CMake code is indocs/
.
Passing information to source code¶
The build system uses a few different mechanisms to influence the compilation:
On the highest level, some CMake options select what files will be compiled.
Some options are passed on the compiler command line using
-D
or equivalent, such that they are available in every compilation unit. This should be used with care to keep the compiler command lines manageable. You can find the current set of such defines withgit grep add_definitions
A few header files are generated using CMake
configure_file()
and included in the desired source files. These files must exist for the compilation to pass. Only a few files use an#ifdef HAVE_CONFIG_H
to protect against inclusion in case the define is not set; this is used in files that may get compiled outside the main build system.buildinfo.h
Contains various strings about the build environment, used mainly for outputting version information to log files and when requested.
config.h
Contains defines for conditional compilation within source files.
gmxpre-config.h
Included by
gmxpre.h
as the first thing in every source file. Should only contain defines that are required before any other header for correct operation. For example, defines that affect the behavior of system headers fall in this category. See Doxygen documentation forgmxpre.h
.
All the above files get generated in
src/
.Additionally, the following file is generated by the build system:
baseversion-gen.cpp
Provides definitions for declarations in
baseversion-gen.h
for version info output. The contents are generated either from Git version info, or from static version info if not building from a git repository.