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
.