borg_public/CMakeLists.txt
2023-05-29 10:41:03 +02:00

195 lines
5.4 KiB
CMake

cmake_minimum_required(VERSION 3.10)
cmake_policy(SET CMP0074 NEW)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
IF(DEFINED ARES_PREFIX_PATH)
SET(ENV{CMAKE_PREFIX_PATH} "${ARES_PREFIX_PATH}")
SET(CMAKE_PREFIX_PATH "${ARES_PREFIX_PATH}")
ENDIF()
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
option(BUILD_JULIA "Activate the Julia support" OFF)
PROJECT(ARES CXX C)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo)
# Import required cmake modules
include(color_msg)
include(GetGitRevisionDescription)
include(ExternalProject)
include(CTest)
# Not used anymore
#include(GenOptMacro)
include(CheckCXXCompilerFlag)
include(CheckCCompilerFlag)
#include(FortranCInterface)
include(FindOpenMP)
include(FindPkgConfig)
include(clang-format)
include(FetchContent)
IF (CMAKE_C_COMPILER_ID MATCHES "AppleClang" OR CMAKE_CXX_COMPILER_ID MATCHES "AppleClang")
IF (NOT ${CMAKE_C_COMPILER_ID} STREQUAL ${CMAKE_CXX_COMPILER_ID})
message(WARNING "C and C++ compiler have different IDs: ${CMAKE_C_COMPILER_ID} != ${CMAKE_CXX_COMPILER_ID}")
ENDIF()
message(WARNING "AppleClang does not support OpenMP. Please use something else for more performance.")
SET(DEFAULT_ENABLE_OPENMP OFF)
ELSE()
SET(DEFAULT_ENABLE_OPENMP ON)
ENDIF()
# Options
OPTION(ENABLE_OPENMP "Activate OpenMP support" ${DEFAULT_ENABLE_OPENMP})
OPTION(DISABLE_DEBUG_OUTPUT "No debug output support (faster)" OFF)
OPTION(ENABLE_MPI "MPI support" OFF)
OPTION(CONTEXT_TIMER "Activate profiling of LibLSS contexts" OFF)
OPTION(USE_NATIVE_ARCH "Activate instruction set supported by the running system" OFF)
OPTION(ENABLE_FULL_WARNINGS "Ask the compiler to produce lots of warnings" OFF)
OPTION(BUILD_PYTHON_EXTENSION "Build the Python BORG extension" OFF)
IF(ENABLE_MPI)
find_package(MPI)
set(EXTRA_LIB ${MPI_C_LIBRARIES})
ELSE(ENABLE_MPI)
SET(EXTRA_LIB)
SET(MPI_C_INCLUDE_PATH)
ENDIF(ENABLE_MPI)
IF(USE_NATIVE_ARCH)
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE)
if(COMPILER_SUPPORTS_MARCH_NATIVE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
endif()
endif()
include(${CMAKE_SOURCE_DIR}/external/external_build.cmake)
find_program(PYTHON_EXECUTABLE NAMES python3)
IF (NOT PYTHON_EXECUTABLE)
cmessage(FATAL_ERROR "Python3 interpreter to compile ARES")
ENDIF()
IF (BUILD_JULIA)
find_package(Julia)
if (NOT JULIA_EXECUTABLE)
cmessage(CWARNING "Julia not found, will not be built")
set(BUILD_JULIA OFF)
endif()
ENDIF()
IF(BUILD_PYTHON_EXTENSION)
FetchContent_MakeAvailable(pybind11)
ENDIF()
FetchContent_MakeAvailable(r3d)
# Retrieve current git revision
git_describe(GIT_VER)
IF (DEFINED CMAKE_C_COMPILER_VERSION)
cmessage(STATUS "C compiler version: ${CMAKE_C_COMPILER_VERSION}")
cmessage(STATUS "C++ compiler Version: ${CMAKE_CXX_COMPILER_VERSION}")
if (NOT ${CMAKE_C_COMPILER_VERSION} EQUAL ${CMAKE_CXX_COMPILER_VERSION})
cmessage(FATAL_ERROR "C and C++ compilers are different. Please fix parameters.")
ENDIF()
ELSE()
cmessage(WARNING "Cannot check compiler versions. Proceed with cautions.")
ENDIF()
SET(CMAKE_CXX_FLAGS_PROFILE "-O3 -pg" CACHE STRING "Flags to turn on profiling for C++ compiler")
SET(CMAKE_C_FLAGS_PROFILE "-O3 -pg" CACHE STRING "Flags to turn on profiling for C compiler" )
SET(CMAKE_EXE_LINKER_FLAGS_PROFILE "-pg" CACHE STRING "Flags to turn on profiling in linker")
mark_as_advanced(CMAKE_CXX_FLAGS_PROFILE CMAKE_C_FLAGS_PROFILE CMAKE_EXE_LINKER_FLAGS_PROFILE)
find_library(ZLIB_LIBRARY z)
find_library(_pre_RT_LIBRARY rt)
if(_pre_RT_LIBRARY)
SET(RT_LIBRARY ${_pre_RT_LIBRARY})
ENDIF()
find_library(DL_LIBRARY dl)
include_directories(
${Boost_INCLUDE_DIRS}
${GSL_INCLUDE}
${CMAKE_SOURCE_DIR}
${EIGEN_INCLUDE_DIRS}
${EXT_INSTALL}/include
${COSMOTOOL_INCLUDE}
${HDF5_INCLUDE_DIR}
${FFTW_INCLUDE_DIR}
${MPI_C_INCLUDE_PATH}
)
#
# OpenMP handling
#
IF(ENABLE_OPENMP)
IF (NOT OPENMP_FOUND)
MESSAGE(ERROR "No known compiler option for enabling OpenMP")
ENDIF(NOT OPENMP_FOUND)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_C_FLAGS}")
ENDIF(ENABLE_OPENMP)
IF (DISABLE_DEBUG_OUTPUT)
add_definitions(-DLIBLSS_CONSOLE_NO_DEBUG_SUPPORT)
ENDIF (DISABLE_DEBUG_OUTPUT)
IF(ENABLE_MPI)
add_definitions(-DARES_MPI_FFTW)
ENDIF (ENABLE_MPI)
IF (CONTEXT_TIMER)
add_definitions(-DLIBLSS_TIMED_CONTEXT)
ENDIF (CONTEXT_TIMER)
add_definitions(-DBOOST_ENABLE_ASSERT_DEBUG_HANDLER)
SET(ARES_INCLUDE_PATH)
# Detect extra modules
#
#
file(GLOB ARES_MODULES `LIST_DIRECTORIES false RELATIVE ${CMAKE_SOURCE_DIR}/extra ${CMAKE_SOURCE_DIR}/extra/*)
# Remove spurious contaminating OSX directories
list(REMOVE_ITEM ARES_MODULES .DS_Store)
message(STATUS "ARES modules found:")
foreach(module IN LISTS ARES_MODULES)
if (EXISTS ${CMAKE_SOURCE_DIR}/extra/${module}/DO_NOT_BUILD)
list(REMOVE_ITEM ARES_MODULES ${module})
cmessage(CWARNING " ${module} (do not build)")
else()
message(STATUS " ${module}")
endif()
endforeach()
add_subdirectory(libLSS)
add_subdirectory(src)
foreach(module IN LISTS ARES_MODULES)
if (EXISTS ${CMAKE_SOURCE_DIR}/extra/${module}/${module}.cmake)
include(${CMAKE_SOURCE_DIR}/extra/${module}/${module}.cmake)
endif()
endforeach()
setup_formatter(ARES_MODULES)