Anatomy of a CMakeLists.txt file

Root CMakeLists.txt

The root CMakeLists.txt should contain the following elements:

  • Versioning: definition of the major, minor and patch version number. This is the sole place where those numbers should be defined.

  • Platform setup: specific flags, detection of the architecture, … This it typically done by including the SalomeSetupPlatform macro.

  • User option definitions: in SALOME the following flags should be found in all modules:

    • SALOME_USE_MPI: wether Salome should be built using MPI containers

    • SALOME_BUILD_TESTS: wether the unit tests should be built

    • SALOME_BUILD_DOC: wether the documentation for the current module should be generated and installed

    Other flags specific to the module might be added, and should then start with SALOME_XYZ_ where <XYZ> is the module’s name (FIELDS for example).

  • Detection of the required prerequisites for the module. All prerequisites in SALOME are detected through a call to FIND_PACKAGE(SalomeXYZ …). See section Package detection mechanism:

    FIND_PACKAGE(SalomePython REQUIRED)
    FIND_PACKAGE(SalomePThread REQUIRED)
    FIND_PACKAGE(SalomeSWIG REQUIRED)
    
  • Detection of the optional prerequisites (potentially conditioned on some user options - see Package detection mechanism for more on this):

    IF(SALOME_BUILD_DOC)
      FIND_PACKAGE(SalomeDoxygen)
      FIND_PACKAGE(SalomeGraphviz)
      FIND_PACKAGE(SalomeSphinx)
      SALOME_UPDATE_FLAG_AND_LOG_PACKAGE(Doxygen SALOME_BUILD_DOC)
      SALOME_UPDATE_FLAG_AND_LOG_PACKAGE(Graphviz SALOME_BUILD_DOC)
      SALOME_UPDATE_FLAG_AND_LOG_PACKAGE(Sphinx SALOME_BUILD_DOC)
    ENDIF(SALOME_BUILD_DOC)
    
  • Printing a report about the detection status:

    SALOME_PACKAGE_REPORT()
    
  • Common installation directories. Those directories should be used consistently across all SALOME modules:

    SET(SALOME_INSTALL_BINS bin/salome CACHE PATH "Install path: SALOME binaries")
    SET(SALOME_INSTALL_LIBS lib/salome CACHE PATH "Install path: SALOME libs")
    SET(SALOME_INSTALL_IDLS idl/salome CACHE PATH "Install path: SALOME IDL files")
    SET(SALOME_INSTALL_HEADERS include/salome CACHE PATH "Install path: SALOME headers")
    SET(SALOME_INSTALL_SCRIPT_SCRIPTS ${SALOME_INSTALL_BINS} CACHE PATH "Install path: SALOME scripts")
    ...
    
  • Specific installation directories. Those should start with SALOME_<MODULE>:

    SET(SALOME_GUI_INSTALL_PARAVIEW_LIBS lib/paraview CACHE PATH "Install path: SALOME GUI ParaView libraries")
    SET(SALOME_GUI_INSTALL_RES_DATA "${SALOME_INSTALL_RES}/gui" CACHE PATH "Install path: SALOME GUI specific data")
    ...
    
  • Inclusion of the source code directories to be compiled:

    IF(NOT SALOME_LIGHT_ONLY)
      ADD_SUBDIRECTORY(idl)
    ENDIF()
    ADD_SUBDIRECTORY(src)
    
  • Header configuration: creation of the version header files, among other

  • Configuration export (see dedicated section Exposing a module’s configuration (advanced))

CMakeLists.txt dedicated to the build of a target

First, include directories:

INCLUDE_DIRECTORIES(
  ${OMNIORB_INCLUDE_DIR}
  ${PTHREAD_INCLUDE_DIRS}
  ${PROJECT_BINARY_DIR}/salome_adm
  ${CMAKE_CURRENT_SOURCE_DIR}/../Basics
  ${CMAKE_CURRENT_SOURCE_DIR}/../SALOMELocalTrace
  ${CMAKE_CURRENT_SOURCE_DIR}/../Utils
  ${PROJECT_BINARY_DIR}/idl
  )

Then we define the sources list <target>_SOURCES:

SET(SalomeNS_SOURCES
  SALOME_NamingService.cxx
  ServiceUnreachable.cxx
  NamingService_WaitForServerReadiness.cxx
)

Set the common compilation flags of all targets of the directory:

ADD_DEFINITIONS(${OMNIORB_DEFINITIONS})

Ensure dependencies are correctly set, if needed (please refer to Parallel compilation - Correct dependencies):

ADD_DEPENDENCIES(SalomeNS SalomeIDLKernel)

Then the standard way to compile, link and install a library or executable is:

ADD_LIBRARY(SalomeNS ${SalomeNS_SOURCES})
TARGET_LINK_LIBRARIES(SalomeNS OpUtil)
INSTALL(TARGETS SalomeNS DESTINATION ${SALOME_INSTALL_LIBS})

Note that there is no SHARED reference, no SET_TARGET_PROPERTIES( .. COMPILE_FLAGS ..). If you need to link against a KERNEL or other SALOME target, use the variable name of the target, not the target directly:

TARGET_LINK_LIBRARIES(xyz ${KERNEL_SalomeNS})   # OK
TARGET_LINK_LIBRARIES(xyz SalomeNS)             # Bad!!

Finally write the specific installation rule for scripts or headers:

SALOME_INSTALL_SCRIPTS(SALOME_NamingServicePy.py ${SALOME_INSTALL_SCRIPT_SCRIPTS})
FILE(GLOB COMMON_HEADERS_HXX "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx")
INSTALL(FILES ${COMMON_HEADERS_HXX} DESTINATION ${SALOME_INSTALL_HEADERS})