This section describes how the GNUmake infrastructure is implemented in Geant4 and provides a quick reference guide for the user/installer about the most important environment variables defined.
As described in Section 2.1 of the
Installation Guide, the GNUmake process in
Geant4 is mainly controlled by the following GNUmake script files
(*.gmk scripts are placed in
$G4INSTALL/config):
architecture.gmk: defining all the architecture
specific settings and paths. System settings are stored in
$G4INSTALL/config/sys in separate files.
common.gmk: defining all general GNUmake rules for
building objects and libraries.
globlib.gmk: defining all general GNUmake rules for
building compound libraries.
binmake.gmk: defining the general GNUmake rules for
building executables.
GNUmake scripts: placed inside each directory in the
G4 distribution and defining directives specific to build a library
(or a set of sub-libraries) or and executable.
To build a single library (or a set of sub-libraries) or an
executable, you must explicitly change your current directory to
the one you're interested in and invoke the "gmake"
command from there ("gmake global" for building a
compound library). Here is a list of the basic commands or GNUmake
"targets" one can invoke to build libraries and/or executables:
gmake
starts the compilation process for building a kernel library or a
library associated with an example. Kernel libraries are built with
maximum granularity, i.e. if a category is a compound, this command
will build all the related sub-libraries,
not the compound one.
The top level GNUmakefile in
$G4INSTALL/source will also build in this case a
dependency map libname.map of each library to establish
the linking order automatically at the bin step. The map
will be placed in $G4LIB/$G4SYSTEM.
gmake global
starts the compilation process to build a single compound kernel library per category. If issued after "gmake", both 'granular' and 'compound' libraries will be available (NOTE: this will consistently increase the disk space required. Compound libraries will then be selected by default at link time, unless G4LIB_USE_GRANULAR is specified).
gmake bin or gmake (only for
examples/)
starts the compilation process to build an executable. This command
will build implicitly the library associated with the example and
link the final application. It assumes all
kernel libraries are already generated and placed in the correct
$G4INSTALL path defined for them.
The linking order is controlled automatically in case libraries have been built with maximum granularity, and the link list is generated on the fly.
make dll
On Windows systems this will start the compilation process to build single compound kernel library per category and generate Dynamic Link Libraries (DLLs). Once the libraries are generated, the process will imply also the deletion of all temporary files generated during the compilation.
lib/ bin/ and tmp/ directories
The $G4INSTALL environment variable specifies where
the installation of the Geant4 toolkit should take place, therefore
kernel libraries will be placed in $G4INSTALL/lib. The
$G4WORKDIR environment variable is set by the user and
specifies the path to the user working directory; temporary files
(object-files and data products of the installation process of
Geant4) will be placed in $G4WORKDIR/tmp, according to
the system architecture used. Binaries will be placed in
$G4WORKDIR/bin, according to the system architecture
used. The path to $G4WORKDIR/bin/$G4SYSTEM should be
added to $PATH in the user environment.
Here is a list of the most important environment variables defined
within the Geant4 GNUmake infrastructure, with a short
explanation of their use.
We recommend that those environment variables listed here and marked with (*) NOT be overriden or set (explicitly or by accident). They are already set and used internally in the default setup !
Defines the architecture and compiler currently used.
NOTE: This variable is set automatically
if the Configure script is adopted for the
installation. This will result in the proper settings also for
configuring the environment with the generated shell scripts
env.[c]sh.
$HOME/geant4, assuming the Geant4 distribution
is placed in $HOME.
$CPPFLAGS and $LDFLAGS for
-I and -L directives. It has to be set to
$G4INSTALL/src.
$HOME/geant4, assuming the user's
working directory for Geant4 is placed in $HOME.
gmake includes (default
is set to $G4INSTALL/include)
$G4WORKDIR/bin and
$G4BIN/$G4SYSTEM respectively. The path to
$G4WORKDIR/bin/$G4SYSTEM should be added to
$PATH in the user environment.
$G4BIN can be overridden.
$G4WORKDIR/tmp
and $G4TMP/$G4SYSTEM respectively.
$G4TMP can be overridden.
$G4INSTALL/lib and
$G4LIB/$G4SYSTEM respectively.
$G4LIB can be overridden.
$G4INSTALL/examples.
$G4INSTALL/examples,
where class names are already mangled and different each other. It
applies only on those compilers which make use of template
repositories (see Appendix A.2 of this Guide). The secondary
template repository is set to $G4TREP/exec.
$G4OPTIMISE set).
$G4VERBOSE flag set). For better performance,
verbosity code can be left out by defining $G4_NO_VERBOSE.
$G4LIB_BUILD_SHARED is set as well).
The most relevant flags for User Interface drivers are just listed here. A more detailed description is given also in section 2. of this User's Guide.
$QTHOME should specify the path where Qt libraries
and headers are installed
The most relevant flags for visualization graphics drivers are just listed here. A description of these variables is given also in section 2. of this User's Guide.
$OGLHOME
set (path to OpenGL installation).
$OGLHOME
set (path to OpenGL installation).
$QTHOME
set to specify the path where Qt libraries and headers are installed.
$OIHOME set
(paths to the OpenInventor installation).
X11
installed in the system.
GDML, zlib and g3tog4 modules
gdml
for allowing import/export of detector description setups (geometrical
volumes, solids, materials, etc.). By default, the flag is not set; if
set, the path to the installation of XercesC package must be specified
through the variable $XERCESCROOT.
gdml module. The flag is
automatically set if $G4LIB_BUILD_GDML is set in the environment.
zlib
module for the compression of output files (mainly in use currently
for the HepRep graphics driver). By default, the flag is not set and
the built-in system library for compression is adopted instead. Setting
this flag will also implicitely set the flag below.
zlib module, either system
built-in or Geant4 specific.
g3tog4 module for
conversions of simple legacy geometries descriptions to Geant4. By
default, the flag is not set and the module's library is not built.
Setting this flag will also implicitely set the flag below.
g3tog4 module, assuming the related
library has been already installed.
$G4ANALYSIS_AIDA_CONFIG_CFLAGS,
$G4ANALYSIS_AIDA_CONFIG_LIBS) to define config options
for AIDA ("aida-config --cflags" and
"aida-config --libs"). See installation instructions
of the specific analysis tools for details.
The Geant4 GNUmake infrastructure allows to extend the link list of libraries with external (or user defined) packages which may be required for some user's applications to generate the final executable.
In the GNUmakefile of your application, before including
binmake.gmk, specify the extra library in
EXTRALIBS either using the -L...-l...
syntax or by specifying the full pathname, e.g.:
EXTRALIBS := -L<your-path>/lib -l<myExtraLib>
or
EXTRALIBS := <your-path>/lib/lib<myExtraLib>.a
You may also specify EXTRA_LINK_DEPENDENCIES, which is
added to the dependency of the target executable, and you may also
specify a rule for making it, e.g.:
EXTRA_LINK_DEPENDENCIES := <your-path>/lib/lib<myExtraLib>.a
<your-path>/lib/lib<myExtraLib>.a:
cd <your-path>/lib; $(MAKE)
Note that you almost certainly need to augment CPPFLAGS
for the header files of the external library, e.g.:
CPPFLAGS+=-I<your-path>/include
See Example 86.
Example 86. An example of a customised GNUmakefile for an application or example using an external module not bound to Geant4.
# --------------------------------------------------------------------
# GNUmakefile for the application "sim" depending on module "Xplotter"
# --------------------------------------------------------------------
name := sim
G4TARGET := $(name)
G4EXLIB := true
CPPFLAGS += -I$(HOME)/Xplotter/include
EXTRALIBS += -L$(HOME)/Xplotter/lib -lXplotter
EXTRA_LINK_DEPENDENCIES := $(HOME)/Xplotter/lib/libXplotter.a
.PHONY: all
all: lib bin
include $(G4INSTALL)/config/binmake.gmk
$(HOME)/Xplotter/lib/libXplotter.a:
cd $(HOME)/Xplotter; $(MAKE)
In addition to the above, specify, in EXTRALIBSSOURCEDIRS,
a list of directories containing source files in its src/
subdirectory. Thus, your GNUmakefile might contain:
EXTRALIBS += $(G4WORKDIR)/tmp/$(G4SYSTEM)/<myApp>/lib<myApp>.a \
-L<your-path>/lib -l<myExtraLib>
EXTRALIBSSOURCEDIRS += <your-path>/<myApp> <your-path>/<MyExtraModule>
EXTRA_LINK_DEPENDENCIES := $(G4WORKDIR)/tmp/$(G4SYSTEM)/<myApp>/lib<myApp>.a
MYSOURCES := $(wildcard <your-path>/<myApp>/src/*cc)
$(G4WORKDIR)/tmp/$(G4SYSTEM)/<myApp>/lib<myApp>.a: $(MYSOURCES)
cd <your-path>/<myApp>; $(MAKE)
See Example 87.
Example 87. An example of a customised GNUmakefile for an application or example using external modules bound to Geant4.
# -----------------------------------------------------------------
# GNUmakefile for the application "phys" depending on module "reco"
# -----------------------------------------------------------------
name := phys
G4TARGET := $(name)
G4EXLIB := true
EXTRALIBS += $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name)/libphys.a \
-L$(HOME)/reco/lib -lreco
EXTRALIBSSOURCEDIRS += $(HOME)/phys $(HOME)/reco
EXTRA_LINK_DEPENDENCIES := $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name)/libphys.a
.PHONY: all
all: lib bin
include $(G4INSTALL)/config/binmake.gmk
MYSOURCES := $(wildcard $(HOME)/phys/src/*cc)
$(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name)/libphys.a: $(MYSOURCES)
cd $(HOME)/phys; $(MAKE)