4 The root directory of the |Gromacs| repository only contains :file:`CMakeLists.txt`
5 (the root file for the CMake build system), a few files supporting the build
6 system, and a few standard informative files (:file:`README` etc.). The
7 :file:`INSTALL` is generated for source packages from
8 :file:`docs/install-guide/index.rst`.
10 All other content is in the following top-level directories:
13 Contains various scripts for developer use, as well as configuration files
14 and scripts for some of the tools used.
16 Contains code fragments and find modules for CMake.
17 Some content here is copied and/or adapted from newer versions of CMake than
18 the minimum currently supported.
19 Default suppression file for valgrind is also included here.
20 See :doc:`build-system` for details of the build system.
22 Contains the build system logic and source code for all documentation, both
23 user-facing and developer-facing. Some of the documentation is generated
24 from the source code under :file:`src/`; see :ref:`dev-doc-layout`.
25 This directory also contains some developer scripts that use the Doxygen
26 documentation for their operation.
28 Contains the templates for :file:`GMXRC` script, some other installed scripts,
29 as well as installation rules for all these scripts.
31 Contains data files that will be installed under :file:`share/`. These
32 include a template for writing C++ analysis tools, and data files used by
35 Contains all source code. See :ref:`dev-source-layout`.
37 Contains build system logic for some high-level tests. Currently, only the
38 regression test build system logic and cppcheck rules are in this directory,
39 while other tests are under :file:`src/`.
41 .. _dev-source-layout:
43 Source code organization
44 ------------------------
46 The following figure shows a high-level view of components of what gets built
47 from the source code under :file:`src/` and how the code is organized.
48 The build system is described in detail in :doc:`build-system`.
49 With default options, the green and white components are built as part of the
50 default target. If ``GMX_BUILD_MDRUN_ONLY`` is ``ON``, then the blue and white
51 components are built instead; :file:`libgromacs_mdrun` is built from a subset
52 of the code used for :file:`libgromacs`.
53 The gray parts are for testing, and are by default only built as part of the
54 ``tests`` target, but if ``GMX_DEVELOPER_BUILD`` is ``ON``, then these are
55 included in the default build target.
56 See :doc:`testutils` for details of the testing side.
58 .. digraph:: dev_high_level_components
61 node [ shape=box, style=filled, width=2 ]
66 label="externals\nsrc/external/", group=common, style=rounded
69 label="Google Test & Mock\nsrc/external/gmock-1.7.0/", group=test
70 style="rounded,filled", fillcolor="0 0 0.9"
76 label="libgromacs\nsrc/gromacs/", group=gmx, fillcolor="0.33 0.3 1"
79 label="libgromacs_mdrun\nsrc/gromacs/", group=mdrun, fillcolor="0.66 0.3 1"
83 label="testutils\nsrc/testutils/", group=test
84 style="rounded,filled", fillcolor="0 0 0.9"
87 label="mdrun object lib.\nsrc/programs/mdrun/", group=common, style=rouded
92 label="gmx\nsrc/programs/", group=gmx, fillcolor="0.33 0.3 1"
95 label="mdrun\nsrc/programs/", group=mdrun, fillcolor="0.66 0.3 1"
98 label="test binaries\nsrc/.../tests/", group=test
99 style="rounded,filled", fillcolor="0 0 0.9"
102 label="analysis template\nshare/template/", group=common
103 fillcolor="0.33 0.3 1"
106 gmx -> template [ style=invis, constraint=no ]
107 template -> mdrun [ style=invis, constraint=no ]
110 libgromacs -> externals
111 libgromacs_mdrun -> externals
112 mdrun_objlib -> libgromacs
115 mdrun -> libgromacs_mdrun
116 mdrun -> mdrun_objlib
117 testutils -> externals
119 testutils -> libgromacs
122 tests -> mdrun_objlib
124 template -> libgromacs
126 template -> mdrun_objlib [ style=invis ]
127 mdrun_objlib -> externals [ style=invis ]
129 All the source code (except for the analysis template) is under the
130 :file:`src/` directory. Only a few files related to the build system are
131 included at the root level. All actual code is in subdirectories:
134 The code under this directory is built into a single library,
135 :file:`libgromacs`. Installed headers are also located in this hierarchy.
136 This is the main part of the code, and is organized into further subdirectories
137 as *modules*. See below for details.
138 :file:`src/programs/`
139 |Gromacs| executables are built from code under this directory.
140 Although some build options can change this, there is typically only a single
141 binary, :file:`gmx`, built.
143 :file:`src/{...}/tests/`
144 Various subdirectories under :file:`src/` contain a subdirectory named
145 :file:`tests/`. The code from each such directory is built into a test
146 binary. Some such directories also provide shared test code as object
147 libraries that is linked into multiple test binaries from different folders.
148 See :doc:`testutils` for details.
149 :file:`src/testutils/`
150 Contains shared utility code for writing Google Test tests.
151 See :doc:`testutils` for details.
152 :file:`src/external/`
153 Contains bundled source code for various libraries and
154 components that |Gromacs| uses internally. All the code from these
155 directories are built using our custom build rules into :file:`libgromacs`,
156 or in some cases into the test binaries. Some CMake options change which
157 parts of this code are included in the build.
158 See :doc:`build-system` for some explanation about how the code in this
161 Contains collection of less well maintained code that may or may
162 not compile. It is not included in the build.
163 :file:`src/contrib/fftw/`
164 As an exception to the above, this folder contains the build system code for
165 downloading and building FFTW to be included into :file:`libgromacs`.
167 When compiling, the include search path is set to :file:`src/`.
168 Some directories from under :file:`src/external/` may also be included,
169 depending on the compilation options.
171 Organization under :file:`src/gromacs/`
172 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
174 The :file:`libgromacs` library is built from code under :file:`src/gromacs/`.
175 Again, the top-level directory contains build and installation rules for the
176 library, and :dfn:`public API convenience headers`. These convenience headers
177 provide the main installed headers that other code can use. They do not
178 contain any declarations, but only include a suitable set of headers from the
179 subdirectories. They typically also contain high-level Doxygen documentation
180 for the subdirectory with the same name: :file:`{module}.h` corresponds to
183 The code is organized into subdirectories. These subdirectories are denoted as
184 :dfn:`modules` throughout this documentation. Each module consists of a set
185 of routines that do some well-defined task or a collection of tasks.
187 Installed headers are a subset of the headers under :file:`src/gromacs/`.
188 They are installed into a corresponding hierarchy under
189 :file:`include/gromacs/` in the installation directory.
190 Comments at the top of the header files contain a note about their visibility:
191 public (installed), intra-library (can be used from inside the library), or
192 intra-module/intra-file.
194 See :doc:`naming` for some common naming patterns for files that can help
195 locating declarations.
197 Tests, and data required for them, are in a :file:`tests/` subdirectory under
198 the module directory.
199 See :doc:`testutils` for more details.
203 Documentation organization
204 --------------------------
206 All documentation (including this developer guide) is produced from source
207 files under :file:`docs/`, except for some command-line help that is generated
208 from the source code (by executing the compiled :file:`gmx` binary).
209 The build system provides various custom targets that build the documentation;
210 see :doc:`build-system` for details.
212 :file:`docs/fragments/`
213 Contains reStructuredText fragments used through ``.. include::`` mechanism
214 from various places in the documentation.
219 :file:`docs/install-guide/`
220 Contains reStructuredText source files for building the install guide section
221 of the user documentation, as well as the :file:`INSTALL` file for the source
223 The build rules are in :file:`docs/CMakeLists.txt`.
225 Contains LaTeX source files and build rules for the reference (PDF) manual.
226 :file:`docs/user-guide/`
227 Contains reStructuredText source files for building the user guide section
228 of the user documentation.
229 The build rules are in :file:`docs/CMakeLists.txt`.
234 Man pages for programs are generated by running the :file:`gmx` executable
235 after compiling it, and then using Sphinx on the reStructuredText files that
236 :file:`gmx` writes out.
238 The build rules for the man pages are in :file:`docs/CMakeLists.txt`.
243 :file:`docs/dev-manual/`
244 Contains reStructuredText source files used to build the developer guide.
245 The build rules are in :file:`docs/CMakeLists.txt`.
247 The organization of the developer guide is explained on the :doc:`front page of
250 Doxygen documentation
251 ^^^^^^^^^^^^^^^^^^^^^
253 :file:`docs/doxygen/`
254 Contains the build rules and some overview content for the Doxygen
256 See :doc:`doxygen` for details of how the Doxygen documentation is built and
259 .. TODO: Create a separate page (at the front of the developer guide, and/or at
260 the main index.rst) that describes the documentation from readers'
261 perspective, and move relevant content there. This should contain just an
262 overview of how the documentation is organized in the source tree.
264 The Doxygen documentation is made of a few different parts. Use the list
265 below as a guideline on where to look for a particular kind of content.
266 Since the documentation has been written over a long period of time and the
267 approach has evolved, not all the documentation yet follows these guidelines,
268 but this is where we are aiming at.
271 These contain mainly overview content, from general-level introduction down
272 into explanation of some particular areas of individual modules.
273 These are generally the place to start familiarizing with the code or a new
275 They can be reached by links from the main page, and also through cross-links
276 from places in the documentation where that information is relevant to
277 understand the context.
279 These contain mainly techical content, explaining the general implementation of
280 a particular module and listing the classes, functions etc. in the module.
281 They complement pages that describe the concepts.
282 They can be reached from the Modules tab, and also from all individual classes,
283 functions etc. that make up the module.
285 These document the usage of an individual class, and in some cases that of
286 closely related classes. Where necessary (and time allowing), a broader
287 overview is given on a separate page and/or in the module documentation.
289 These document the individual method. Typically, the class documentation or
290 other overview content is the place to look for how different methods interact.
291 file and namespace documentation
292 These are generally only placeholders for links, and do not contain much else.
293 The main content is the list of classes and other entities declared in that