This is g42so, a simple Python script that compiles
Geant4 detector-construction and
primary-generator-action classes, wraps them in C-style (unmangled) adapter
functions and produces a shared library. The library can then be loaded via
dlopen by third-party code, allowing instantiation of a Geant4 detector
construction or primary generator action even if the name of the specific class
is not known in advance.
The recommended installation procedure for g42so is to use pip:
$ pip install g42so
Compilation is delegated to g++ by default (no, I did
not reimplement gcc from scratch), but this can be configured using the -c
option. Note however that g42so must know what compilation flags to use for
your compiler; at the moment, it only recognizes g++ and clang++.
Running g42so -h gives a list of available options. You will typically want
to run something along the lines of the following:
$ g42so -I /path/to/include/ \
/path/to/src/MyDetectorConstruction.cc /path/to/src/MyPrimaryGeneratorAction.cc
-
Geant4 must be installed and the
geant4-configscript must be in the$PATH, or its location can be specified with the--geant4-configoption. -
g42sotries to automatically detect the names of the classes you want to wrap. If it fails or is unsure, it will ask you to explicitly specify your class names. -
If your class constructors require arguments, you will need to customise the C wrappers generated by the code. First run
$ g42so --dump-detector-wrapper >detectorWrapper.ccto dump the relevant wrapper. Modify it to your needs and pass it to
g42soalong with the--custom-detector-wrapperoption, which tellsg42sonot to include its default wrapper. For instance:$ g42so --custom-detector-wrapper -I /path/to/include/ \ /path/to/src/MyDetectorConstruction.cc detectorWrapper.ccThe
--dump-pga-wrapperand--custom-pga-wrapperdo the same job for primary-generator-action classes. -
Note that
dlopening shared libraries that link to Geant4 is likely to fail if Geant4 was compiled is multi-threaded mode (theGEANT4_BUILD_MULTITHREADEDCMake flag is set toON) with the default value for theGEANT4_BUILD_TLS_MODEL(the default isinitial-exec). If you want todlopenthe libraries created byg42so(which is the whole point of this tool, really!), then you should make sure that either Geant4 was compiled in single-threaded mode, orGEANT4_BUILD_TLS_MODELwas set toglobal-dynamic.