IAP GITLAB

Skip to content
Snippets Groups Projects
Forked from Air Shower Physics / corsika
1903 commits behind the upstream repository.
CMakeLists_PROPOSAL.txt 6.64 KiB

cmake_minimum_required(VERSION 3.8)

if(CMAKE_PROJECT_NAME STREQUAL corsika)
  message(STATUS "Including PROPOSAL as part of CORSIKA8")
  set (IN_CORSIKA8 ON)
else(CMAKE_PROJECT_NAME STREQUAL corsika)
  set (IN_CORSIKA8 OFF)
endif(CMAKE_PROJECT_NAME STREQUAL corsika)

project(PROPOSAL VERSION 6.1.2 LANGUAGES CXX)

if (NOT IN_CORSIKA8)
IF(APPLE)
    # In newer version of cmake this will be the default
    SET(CMAKE_MACOSX_RPATH 1)
ENDIF(APPLE)

# sets standard installtion paths
include(GNUInstallDirs)

### full RPATH
### copied from https://cmake.org/Wiki/CMake_RPATH_handling
### set the RPATH so that for using PROPOSAL in python
### the DYLD_LIBRARY_PATH must not be set in the bashrc
### But for using PROPOSAL as c-Library, this path still
### has to be set

# use, i.e. don't skip the full RPATH for the build tree
SET(CMAKE_SKIP_BUILD_RPATH  FALSE)

# when building, don't use the install RPATH already
# (but later on when installing)
OPTION(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
list(APPEND CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${CMAKE_INSTALL_PREFIX}/lib64")
message(STATUS "CMAKE_INSTALL_RPATH=${CMAKE_INSTALL_RPATH}")

# add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
OPTION(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
### end full RPATH

# Some additional options
OPTION(ADD_PYTHON "Choose to compile the python wrapper library" ON)
endif (NOT IN_CORSIKA8)

#################################################################
####################       PROPOSAL      ########################
#################################################################
file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/src/PROPOSAL/*)
if (IN_CORSIKA8)
  add_library(PROPOSAL STATIC ${SRC_FILES})
else (IN_CORSIKA8)
  add_library(PROPOSAL SHARED ${SRC_FILES})
endif (IN_CORSIKA8)

add_library(PROPOSAL::PROPOSAL ALIAS PROPOSAL)
#target_compile_features(PROPOSAL PUBLIC cxx_std_11)
#set_target_properties(PROPOSAL PROPERTIES CXX_EXTENSIONS OFF)
target_include_directories(
    PROPOSAL PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)
target_compile_options(PROPOSAL PRIVATE -Wall -Wextra -Wnarrowing -Wpedantic -fdiagnostics-show-option -Wno-format-security)
if (NOT IN_CORSIKA8)
install(
    TARGETS PROPOSAL
    EXPORT PROPOSALTargets
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
else (NOT IN_CORSIKA8)
install(
    TARGETS PROPOSAL
    EXPORT CORSIKA8
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)
endif (NOT IN_CORSIKA8)

# input version from the project call, so the library knows its own version
configure_file(
    "${PROJECT_SOURCE_DIR}/include/PROPOSAL/version.h.in"
    "${PROJECT_BINARY_DIR}/include/PROPOSAL/version.h"
)
if (NOT IN_CORSIKA8)
install(
    FILES ${PROJECT_BINARY_DIR}/include/PROPOSAL/version.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/include/PROPOSAL
)
endif (NOT IN_CORSIKA8)
target_include_directories(
    PROPOSAL PUBLIC
    $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

# install header files
if (NOT IN_CORSIKA8)
file(GLOB_RECURSE INC_FILES ${PROJECT_SOURCE_DIR}/include/*)
foreach(INC_FILE ${INC_FILES})
    file(RELATIVE_PATH REL_FILE ${PROJECT_SOURCE_DIR}/include ${INC_FILE})
    get_filename_component(DIR ${REL_FILE} DIRECTORY)
    install(FILES include/${REL_FILE} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${DIR})
endforeach()
endif (NOT IN_CORSIKA8)


if(NOT IS_SYMLINK ${CMAKE_BINARY_DIR}/resources)
    execute_process(COMMAND ln -sv ${CMAKE_CURRENT_SOURCE_DIR}/resources ${CMAKE_BINARY_DIR}/resources OUTPUT_VARIABLE link_msg OUTPUT_STRIP_TRAILING_WHITESPACE)
    message(STATUS "Symlink to resources created:")
    message(STATUS "  ${link_msg}")
endif()


#################################################################
#################           spdlog        #######################
#################################################################

if (NOT IN_CORSIKA8)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_subdirectory("vendor/spdlog")
target_link_libraries(PROPOSAL PRIVATE spdlog::spdlog)
else (NOT IN_CORSIKA8)
target_link_libraries(PROPOSAL PRIVATE CONAN_PKG::spdlog)
endif (NOT IN_CORSIKA8)


#################################################################
#################           Tests        ########################
#################################################################

if (NOT IN_CORSIKA8)
if(CMAKE_PROJECT_NAME STREQUAL PROPOSAL)
    include(CTest)
endif()
if(CMAKE_PROJECT_NAME STREQUAL PROPOSAL AND BUILD_TESTING)
    add_subdirectory(tests)
else()
    MESSAGE(STATUS "No tests will be build.")
endif()
endif (NOT IN_CORSIKA8)

#################################################################
#################      Documentation     ########################
#################################################################
if (NOT IN_CORSIKA8)
add_subdirectory(doc)
endif (NOT IN_CORSIKA8)


#################################################################
#################           python      #########################
#################################################################
if (NOT IN_CORSIKA8)
IF(ADD_PYTHON)
    message(STATUS "Building the python wrapper library.")
    find_package(PythonLibs REQUIRED)
    add_subdirectory("vendor/pybind11")
    file(GLOB_RECURSE PYTHON_SRC_FILES ${PROJECT_SOURCE_DIR}/interface/python/*)

    pybind11_add_module(pyproposal SHARED ${PYTHON_SRC_FILES})
    set_target_properties(pyproposal PROPERTIES OUTPUT_NAME proposal)
    target_include_directories(pyproposal PRIVATE ${PYTHON_INCLUDE_DIRS})
    target_include_directories(pyproposal PRIVATE ${PROJECT_SOURCE_DIR}/interface/python)
    target_link_libraries(pyproposal PRIVATE PROPOSAL)
    target_compile_options(pyproposal PRIVATE -fvisibility=hidden)
    install(TARGETS pyproposal EXPORT PROPOSALTargets DESTINATION ${CMAKE_INSTALL_LIBDIR})
ELSE(ADD_PYTHON)
    MESSAGE(STATUS "No python wrapper library will be build.")
ENDIF(ADD_PYTHON)
endif (NOT IN_CORSIKA8)



#################################################################
#################         INSTALLATION        ###################
#################################################################
if (NOT IN_CORSIKA8)
install(
    EXPORT PROPOSALTargets
    FILE PROPOSALConfig.cmake
    NAMESPACE PROPOSAL::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PROPOSAL
)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "PROPOSALConfigVersion.cmake"
    VERSION ${PACKAGE_VERSION}
    COMPATIBILITY SameMajorVersion
)
install(
    FILES "${CMAKE_CURRENT_BINARY_DIR}/PROPOSALConfigVersion.cmake"
    DESTINATION lib/cmake/PROPOSAL
)
endif (NOT IN_CORSIKA8)