Makefiles and compiling BOUT++¶
BOUT++ has its own makefile system. These can be used to
In all makefiles, BOUT_TOP
is required!
These makefiles are sufficient for most uses, but for more complicated,
an executable script bout-config
can be used to get the compilation
flags (see bout-config script).
Executables example¶
If writing an example (or physics module that executes) then the makefile is very simple:
BOUT_TOP = ../..
SOURCEC = <filename>.cxx
include $(BOUT_TOP)/make.config
where BOUT_TOP
- refers to the relative (or absolute) location of
the BOUT directory (the one that includes /lib
and /src
) and
SOURCEC
is the name of your file, e.g. gas_compress.cxx
.
Optionally, it is possible to specify TARGET
which defines what the
executable should be called (e.g. if you have multiple source files).
That’s it!
Multiple subdirectories¶
Large physics modules can have many files, and it can be helpful to
organise these into subdirectories. An example of how to do this is in
examples/make_subdir
.
In the top level, list the directories
DIRS = fuu bar
In the makefile in each subdirectory, specify
TARGET = sub
then specify the path to the top-level directory
MODULE_DIR = ..
and the name of the subdirectory that the makefile is in
SUB_NAME = fuu
Modules example¶
If you are writing a new module (or concrete implementation) to go into the BOUT++ library, then it is again pretty simple
BOUT_TOP = ../..
SOURCEC = communicator.cxx difops.cxx geometry.cxx grid.cxx \
interpolation.cxx topology.cxx
SOURCEH = $(SOURCEC:%.cxx=%.h)
TARGET = lib
include $(BOUT_TOP)/make.config
TARGET
- must be lib
to signify you are adding to
libbout++.a
.
The other variables should be pretty self explanatory.
Adding a new subdirectory to ’src’¶
No worries, just make sure to edit src/makefile
to add it to the
DIRS
variable.
bout-config script¶
The bout-config
script is in the bin
subdirectory of the BOUT++
distribution, and is generated by configure
. This script can be used
to get the compilers, flags and settings to compile BOUT++. To get a
list of available options:
$ bout-config --help
so to get the library linking flags, for example
$ bout-config --libs
This script can be used in makefiles to compile BOUT++ alongside other
libraries. The easiest way is to use bout-config
to find the make.config
file which contains the settings. For example the heat conduction example can
be compiled with the following makefile
:
SOURCEC = conduction.cxx
include $(shell bout-config --config-file)
This includes the make.config
file installed with bout-config
, rather than
using the BOUT_TOP
variable.
A different way to use bout-config
is to get the compiler and linker flags,
and use them in your own makefile, for example:
CXX=`bout-config --cxx`
CFLAGS=`bout-config --cflags`
LD=`bout-config --ld`
LDFLAGS=`bout-config --libs
conduction: conduction.cxx
$(CXX) $(CFLAGS) -c conduction.cxx -o conduction.o
$(LD) -o conduction conduction.o $(LDFLAGS)
A more general example is in examples/make-script
.