Spaces:
Sleeping
Sleeping
cmake_minimum_required(VERSION 3.10) | |
project("Pangolin") | |
set(PANGOLIN_VERSION_MAJOR 0) | |
set(PANGOLIN_VERSION_MINOR 8) | |
set(PANGOLIN_VERSION ${PANGOLIN_VERSION_MAJOR}.${PANGOLIN_VERSION_MINOR}) | |
if(NOT CMAKE_CXX_STANDARD) | |
set(CMAKE_CXX_STANDARD 17) | |
set(CMAKE_CXX_STANDARD_REQUIRED ON) | |
endif() | |
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) | |
# Prevent in source builds | |
if(EXISTS "${PROJECT_BINARY_DIR}/CMakeLists.txt") | |
message(FATAL_ERROR "Source build detected: please use a subdir. You may remove 'CMakeCache.txt' and 'CMakeFiles'.") | |
endif() | |
# Make our own cmake imports accessible | |
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") | |
include(SetPlatformVars) | |
include(PangolinFactory) | |
option( BUILD_TOOLS "Build Tools" ON ) | |
option( BUILD_EXAMPLES "Build Examples" ON ) | |
option( BUILD_ASAN "Enable AddressSanitizer for Debug builds" OFF ) | |
# Default build type (Override with cmake .. -DCMAKE_BUILD_TYPE=...) | |
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) | |
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) | |
message(STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified.") | |
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") | |
endif() | |
if(_WIN_) | |
option( BUILD_SHARED_LIBS "Build Shared Library" OFF) | |
option( MSVC_USE_STATIC_CRT "Use static C Runtime with MSVC, /MT instead of /MD" ON) | |
# Make sure there are no erroneous C Runtime flags | |
list(APPEND FLAG_VARS | |
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO | |
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO | |
) | |
if(MSVC_USE_STATIC_CRT) | |
foreach(FLAG_VAR ${FLAG_VARS}) | |
string(REGEX REPLACE "/MD" "/MT" NEW_FLAGS "${${FLAG_VAR}}") | |
set(${FLAG_VAR} "${NEW_FLAGS}" CACHE STRING "" FORCE) | |
endforeach() | |
else() | |
foreach(FLAG_VAR ${FLAG_VARS}) | |
string(REGEX REPLACE "/MT" "/MD" NEW_FLAGS "${${FLAG_VAR}}") | |
set(${FLAG_VAR} "${NEW_FLAGS}" CACHE STRING "" FORCE) | |
endforeach() | |
endif() | |
elseif(_OSX_) | |
option( BUILD_SHARED_LIBS "Build Shared Library" ON) | |
set(CMAKE_MACOSX_RPATH ON) | |
elseif(EMSCRIPTEN) | |
set(BUILD_SHARED_LIBS OFF) | |
include(EmscriptenUtils) | |
set(CMAKE_EXE_LINKER_FLAGS "-sASYNCIFY=1 -sDISABLE_EXCEPTION_CATCHING=0 -sGL_ASSERTIONS=1 -sFULL_ES2=1 -sFULL_ES3=1 --bind") | |
else() | |
option( BUILD_SHARED_LIBS "Build Shared Library" ON) | |
endif() | |
# run with "ASAN_OPTIONS=fast_unwind_on_malloc=0" to print stack with more details | |
if(BUILD_ASAN) | |
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} \ | |
-fsanitize=address \ | |
-fsanitize=bool \ | |
-fsanitize=bounds \ | |
-fsanitize=enum \ | |
-fsanitize=float-cast-overflow \ | |
-fsanitize=float-divide-by-zero \ | |
-fsanitize=nonnull-attribute \ | |
-fsanitize=returns-nonnull-attribute \ | |
-fsanitize=signed-integer-overflow \ | |
-fsanitize=undefined \ | |
-fsanitize=vla-bound \ | |
-fno-sanitize=alignment \ | |
-fsanitize=leak \ | |
-fsanitize=object-size \ | |
") | |
endif() | |
####################################################### | |
## Testing setup | |
option( BUILD_TESTS "Build Tests" OFF) | |
find_package(Catch2 2 QUIET) | |
if(Catch2_FOUND) | |
include(CTest) | |
include(Catch) | |
else() | |
if(BUILD_TESTS) | |
message(WARNING "Building Tests requested, but Catch2 library not found.") | |
set( BUILD_TESTS OFF) | |
endif() | |
endif() | |
####################################################### | |
## Add all pangolin components | |
file(GLOB components_cmake "${CMAKE_CURRENT_LIST_DIR}/components/*/CMakeLists.txt") | |
set(component_list "") | |
foreach(component_cmake ${components_cmake}) | |
get_filename_component(component_dir ${component_cmake} DIRECTORY) | |
get_filename_component(component_name ${component_dir} NAME) | |
add_library(${component_name} "") | |
list(APPEND component_list ${component_name}) | |
endforeach() | |
foreach(component_cmake ${components_cmake}) | |
include(${component_cmake}) | |
endforeach() | |
####################################################### | |
## Build Tree Export | |
# Export Targets | |
export(TARGETS ${component_list} FILE PangolinTargets.cmake) | |
export(PACKAGE Pangolin) | |
# Version information | |
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake.in | |
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" @ONLY) | |
# Build tree config | |
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in | |
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY IMMEDIATE ) | |
####################################################### | |
## Install headers / targets | |
# This relative path allows installed files to be relocatable. | |
set( CMAKECONFIG_INSTALL_DIR lib/cmake/${PROJECT_NAME} ) | |
file( RELATIVE_PATH REL_INCLUDE_DIR | |
"${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR}" | |
"${CMAKE_INSTALL_PREFIX}/include" | |
) | |
install( | |
TARGETS ${component_list} | |
EXPORT ${PROJECT_NAME}Targets | |
LIBRARY DESTINATION lib | |
ARCHIVE DESTINATION lib | |
RUNTIME DESTINATION bin | |
INCLUDES DESTINATION include | |
) | |
install( | |
FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" | |
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" | |
DESTINATION ${CMAKECONFIG_INSTALL_DIR} | |
) | |
install( | |
EXPORT ${PROJECT_NAME}Targets DESTINATION ${CMAKECONFIG_INSTALL_DIR} | |
) | |
# uninstall target | |
if(NOT TARGET uninstall) | |
configure_file( | |
"${CMAKE_CURRENT_LIST_DIR}/cmake/cmake_uninstall.cmake.in" | |
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" | |
IMMEDIATE @ONLY) | |
add_custom_target(uninstall | |
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) | |
endif() | |
####################################################### | |
## Tools / Examples | |
set(Pangolin_DIR ${CMAKE_CURRENT_BINARY_DIR}) | |
if(BUILD_EXAMPLES) | |
add_subdirectory(examples) | |
endif() | |
if(BUILD_TOOLS) | |
add_subdirectory(tools) | |
endif() | |