2. CMake: building software
There is a script build.sh to build the CEPCSW. Inside this script, it consists of three major steps:
configure: in this step, a build directory is created and the cmake reads
CMakeLists.txtin source code directory and generates config files which will be used to build the project.build: in this step, the project is built according to the config files under build directory.
install: in this step, the libraries, header files and python scripts are installed into install directory, which is
InstallArea.
The cmake command reads the CMakeLists.txt files recursively to produce the config files. As there are some common patterns to build the packages in the project, we use some macros from Gaudi framework.
gaudi_add_library: produce a shared library, which will be linked by other libraries.The source code files need to be added after
SOURCESoption.The link libraries need to be added after
LINKoption.
gaudi_add_module: produce a module library, which will be imported by Gaudi. Note, this library should not be linked by other libraries.Options
SOURCESandLINKare same asgaudi_add_library.
We also use some macros from CMake.
target_include_directories: specify the include directories when build a target.install: install the targets.
Examples could be found in CEPCSW.
For example, the RecPFACyber package uses all the macros:
gaudi_add_library(CrystalCaloRecLib
SOURCES src/Objects/CaloUnit.cc
src/Objects/CaloHit.cc
...
LINK k4FWCore::k4FWCore
GearSvc
CrystalEcalSvcLib
...
)
gaudi_add_module(CrystalCaloRec
SOURCES src/CyberPFAlg.cpp
src/CyberDataCol.cpp
...
LINK CrystalCaloRecLib
)
target_include_directories(CrystalCaloRec PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>/include
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
install(TARGETS CrystalCaloRecLib CrystalCaloRec
EXPORT CEPCSWTargets
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
COMPONENT dev)