Makefiles and compiling BOUT++#

BOUT++ has its own makefile system. These can be used to

  1. Write an example or executable

  2. Add a feature to BOUT++

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.