286 lines
9.2 KiB
CMake
286 lines
9.2 KiB
CMake
cmake_minimum_required(VERSION 3.4...4.0)
|
|
|
|
project(
|
|
"CDT"
|
|
VERSION 1.4.2
|
|
DESCRIPTION
|
|
"C++ library for constrained Delaunay triangulation"
|
|
HOMEPAGE_URL "https://github.com/artem-ogre/CDT"
|
|
LANGUAGES CXX)
|
|
|
|
# -------
|
|
# target
|
|
# -------
|
|
|
|
# export all symbols as we do it by instantiating templates anyway
|
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
|
|
|
# options
|
|
option(CDT_USE_AS_COMPILED_LIBRARY
|
|
"If enabled templates for float and double will be instantiated and compiled into a library")
|
|
|
|
option(CDT_USE_64_BIT_INDEX_TYPE
|
|
"If enabled 64bits are used to store vertex/triangle index types. Otherwise 32bits are used (up to 4.2bn items)"
|
|
OFF)
|
|
|
|
option(CDT_ENABLE_CALLBACK_HANDLER
|
|
"If enabled it is possible to provide a callback handler to the triangulation"
|
|
OFF)
|
|
|
|
option(CDT_ENABLE_TESTING
|
|
"If enabled tests target will ge generated)"
|
|
OFF)
|
|
|
|
option(CDT_USE_STRONG_TYPING
|
|
"If enabled uses strong typing for types: useful for development and debugging"
|
|
OFF)
|
|
|
|
option(CDT_DEVELOPER_BUILD
|
|
"Enables all warnings."
|
|
OFF)
|
|
|
|
option(CDT_DISABLE_EXCEPTIONS
|
|
"Disables exceptions: instead of throwing the library will call `std::terminate`"
|
|
OFF)
|
|
|
|
if(CDT_DEVELOPER_BUILD)
|
|
if (MSVC)
|
|
# warning level 4 and all warnings as errors
|
|
add_compile_options(/W4 /WX)
|
|
else()
|
|
# lots of warnings and all warnings as errors
|
|
add_compile_options(-Wall -Wextra -pedantic -Wno-comment)
|
|
endif()
|
|
endif()
|
|
|
|
# check if Boost is needed
|
|
if(cxx_std_11 IN_LIST CMAKE_CXX_COMPILE_FEATURES)
|
|
# Work-around as AppleClang 11 defaults to c++98 by default
|
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
|
message(STATUS "AppleClang work-around: set CMAKE_CXX_STANDARD to 11")
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
endif()
|
|
else()
|
|
message(STATUS "Compiler does not support C++11: falling back to Boost")
|
|
set(CDT_USE_BOOST ON)
|
|
endif()
|
|
|
|
if(CDT_USE_STRONG_TYPING)
|
|
set(CDT_USE_BOOST ON)
|
|
endif()
|
|
|
|
message(STATUS "CDT_USE_AS_COMPILED_LIBRARY is ${CDT_USE_AS_COMPILED_LIBRARY}")
|
|
message(STATUS "CDT_USE_64_BIT_INDEX_TYPE is ${CDT_USE_64_BIT_INDEX_TYPE}")
|
|
message(STATUS "CDT_ENABLE_CALLBACK_HANDLER is ${CDT_ENABLE_CALLBACK_HANDLER}")
|
|
message(STATUS "CDT_ENABLE_TESTING is ${CDT_ENABLE_TESTING}")
|
|
message(STATUS "CDT_USE_STRONG_TYPING is ${CDT_USE_STRONG_TYPING}")
|
|
message(STATUS "CDT_DEVELOPER_BUILD is ${CDT_DEVELOPER_BUILD}")
|
|
message(STATUS "CDT_DISABLE_EXCEPTIONS is ${CDT_DISABLE_EXCEPTIONS}")
|
|
|
|
# Use boost for c++98 versions of c++11 containers or for Boost::rtree
|
|
if(CDT_USE_BOOST)
|
|
find_package(Boost REQUIRED)
|
|
endif()
|
|
|
|
|
|
# configure target
|
|
set(cdt_include_dirs
|
|
include
|
|
extras
|
|
)
|
|
|
|
if(CDT_USE_AS_COMPILED_LIBRARY)
|
|
set(cdt_scope PUBLIC)
|
|
set(cdt_sources
|
|
src/CDT.cpp
|
|
)
|
|
set(cdt_headers
|
|
include/CDT.h
|
|
include/CDTUtils.h
|
|
include/Triangulation.h
|
|
include/KDTree.h
|
|
include/LocatorKDTree.h
|
|
include/remove_at.hpp
|
|
include/CDT.hpp
|
|
include/CDTUtils.hpp
|
|
include/Triangulation.hpp
|
|
include/predicates.h
|
|
extras/VerifyTopology.h
|
|
extras/InitializeWithGrid.h
|
|
)
|
|
add_library(${PROJECT_NAME} ${cdt_sources} ${cdt_headers})
|
|
# Set symbols visibility to hidden by default
|
|
set_target_properties(
|
|
${PROJECT_NAME}
|
|
PROPERTIES
|
|
VERSION ${PROJECT_VERSION}
|
|
SOVERSION ${PROJECT_VERSION}
|
|
CXX_VISIBILITY_PRESET hidden
|
|
VISIBILITY_INLINES_HIDDEN 1
|
|
)
|
|
# Generate export header and add it to include directories
|
|
include(GenerateExportHeader)
|
|
generate_export_header(${PROJECT_NAME})
|
|
target_include_directories(
|
|
${PROJECT_NAME} ${cdt_scope}
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
|
)
|
|
target_sources(
|
|
${PROJECT_NAME} ${cdt_scope}
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/cdt_export.h>
|
|
)
|
|
|
|
else()
|
|
set(cdt_scope INTERFACE)
|
|
add_library(${PROJECT_NAME} INTERFACE)
|
|
endif()
|
|
|
|
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
|
|
|
|
foreach(dir_ ${cdt_include_dirs})
|
|
target_include_directories(
|
|
${PROJECT_NAME}
|
|
${cdt_scope}
|
|
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/${dir_}>
|
|
)
|
|
endforeach()
|
|
|
|
target_include_directories(
|
|
${PROJECT_NAME} INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
|
|
|
target_compile_definitions(
|
|
${PROJECT_NAME}
|
|
${cdt_scope}
|
|
$<$<BOOL:${CDT_USE_BOOST}>:CDT_USE_BOOST>
|
|
$<$<BOOL:${CDT_USE_AS_COMPILED_LIBRARY}>:CDT_USE_AS_COMPILED_LIBRARY>
|
|
$<$<BOOL:${CDT_USE_64_BIT_INDEX_TYPE}>:CDT_USE_64_BIT_INDEX_TYPE>
|
|
$<$<BOOL:${CDT_ENABLE_CALLBACK_HANDLER}>:CDT_ENABLE_CALLBACK_HANDLER>
|
|
$<$<BOOL:${CDT_USE_STRONG_TYPING}>:CDT_USE_STRONG_TYPING>
|
|
$<$<BOOL:${CDT_DISABLE_EXCEPTIONS}>:CDT_DISABLE_EXCEPTIONS>
|
|
)
|
|
|
|
target_link_libraries(${PROJECT_NAME} ${cdt_scope} $<$<BOOL:${CDT_USE_BOOST}>:Boost::boost>)
|
|
|
|
# -------------
|
|
# installation
|
|
# -------------
|
|
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
# install and export the library
|
|
foreach(dir_ ${cdt_include_dirs})
|
|
install(DIRECTORY ${dir_}/ DESTINATION include)
|
|
endforeach()
|
|
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
EXPORT ${PROJECT_NAME}Config
|
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
)
|
|
|
|
install(
|
|
FILES
|
|
$<$<BOOL:${CDT_USE_AS_COMPILED_LIBRARY}>:${CMAKE_CURRENT_BINARY_DIR}/cdt_export.h>
|
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
)
|
|
|
|
install(EXPORT ${PROJECT_NAME}Config NAMESPACE CDT:: DESTINATION cmake)
|
|
|
|
# ------------
|
|
# documentation
|
|
# ------------
|
|
|
|
# work-around to detect custom-doxygen
|
|
#set(DOXYGEN_EXECUTABLE /usr/local/bin/doxygen)
|
|
|
|
find_package(Doxygen 1.9)
|
|
if(DOXYGEN_FOUND)
|
|
message(STATUS "Doxygen found: adding documentation target.")
|
|
set(DOXYGEN_EXCLUDE_PATTERNS
|
|
*/cmake-build*
|
|
*/predicates.h
|
|
conanfile.py
|
|
${PROJECT_SOURCE_DIR}/tests/*
|
|
)
|
|
# doxygen settings can be set here, prefixed with "DOXYGEN_"
|
|
set(DOXYGEN_SOURCE_BROWSER YES)
|
|
set(DOXYGEN_JAVADOC_AUTOBRIEF YES)
|
|
set(DOXYGEN_ENABLE_PREPROCESSING NO)
|
|
set(DOXYGEN_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/docs")
|
|
set(CDT_DOCS_DIRECTORY ${PROJECT_SOURCE_DIR}/../docs)
|
|
set(DOXYGEN_USE_MDFILE_AS_MAINPAGE ${CDT_DOCS_DIRECTORY}/README.md)
|
|
set(DOXYGEN_IMAGE_PATH ${CDT_DOCS_DIRECTORY}/images)
|
|
|
|
set(DOXYGEN_GENERATE_TREEVIEW YES)
|
|
set(CDT_DOXYGEN_AWESOME_DIRECTORY ${CDT_DOCS_DIRECTORY}/doxygen-custom/doxygen-awesome)
|
|
set(DOXYGEN_HTML_EXTRA_STYLESHEET
|
|
${CDT_DOXYGEN_AWESOME_DIRECTORY}/doxygen-awesome.css
|
|
${CDT_DOXYGEN_AWESOME_DIRECTORY}/doxygen-awesome-sidebar-only.css
|
|
${CDT_DOXYGEN_AWESOME_DIRECTORY}/doxygen-awesome-sidebar-only-darkmode-toggle.css
|
|
${CDT_DOCS_DIRECTORY}/doxygen-custom/custom.css
|
|
)
|
|
set(DOXYGEN_HTML_HEADER ${PROJECT_SOURCE_DIR}/../docs/doxygen-custom/header.html)
|
|
set(DOXYGEN_HTML_EXTRA_FILES
|
|
${CDT_DOCS_DIRECTORY}/doxygen-custom/logo.svg
|
|
${CDT_DOCS_DIRECTORY}/doxygen-custom/favicon/favicon.ico
|
|
${CDT_DOCS_DIRECTORY}/doxygen-custom/favicon/apple-touch-icon.png
|
|
${CDT_DOCS_DIRECTORY}/doxygen-custom/favicon/android-chrome-192x192.png
|
|
${CDT_DOCS_DIRECTORY}/doxygen-custom/favicon/android-chrome-512x512.png
|
|
${CDT_DOCS_DIRECTORY}/doxygen-custom/favicon/site.webmanifest
|
|
${CDT_DOXYGEN_AWESOME_DIRECTORY}/doxygen-awesome-darkmode-toggle.js
|
|
${CDT_DOXYGEN_AWESOME_DIRECTORY}/doxygen-awesome-fragment-copy-button.js
|
|
${CDT_DOXYGEN_AWESOME_DIRECTORY}/doxygen-awesome-paragraph-link.js
|
|
${CDT_DOXYGEN_AWESOME_DIRECTORY}/toggle-alternative-theme.js
|
|
)
|
|
set(DOXYGEN_LAYOUT_FILE ${CDT_DOCS_DIRECTORY}/doxygen-custom/DoxygenLayout.xml)
|
|
# this target will only be built if specifically asked to.
|
|
# run "make api-docs" to create the doxygen documentation
|
|
doxygen_add_docs(
|
|
${PROJECT_NAME}-docs
|
|
${PROJECT_SOURCE_DIR}
|
|
${CDT_DOCS_DIRECTORY}
|
|
COMMENT "Generate doxygen documentation for CDT."
|
|
)
|
|
# copy README.md images to doxygen so that they are displayed
|
|
add_custom_command(
|
|
TARGET ${PROJECT_NAME}-docs POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory
|
|
${PROJECT_SOURCE_DIR}/../docs/images
|
|
${DOXYGEN_OUTPUT_DIRECTORY}/html/images
|
|
)
|
|
endif(DOXYGEN_FOUND)
|
|
|
|
|
|
# ------------
|
|
# tests
|
|
# ------------
|
|
|
|
if(CDT_ENABLE_TESTING)
|
|
include(CTest)
|
|
enable_testing()
|
|
# add Catch2
|
|
find_package(Catch2 3 QUIET)
|
|
if(Catch2_FOUND)
|
|
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
|
|
else()
|
|
set(Catch2_directory ${PROJECT_SOURCE_DIR}/tests/Catch2)
|
|
add_subdirectory(${Catch2_directory})
|
|
list(APPEND CMAKE_MODULE_PATH ${Catch2_directory}/extras)
|
|
endif()
|
|
set(TEST_TARGET_NAME ${PROJECT_NAME}-tests)
|
|
add_executable(${TEST_TARGET_NAME})
|
|
set_property(TARGET ${TEST_TARGET_NAME} PROPERTY CXX_STANDARD 17)
|
|
target_sources(${TEST_TARGET_NAME} PRIVATE tests/cdt.test.cpp)
|
|
target_link_libraries(
|
|
${TEST_TARGET_NAME}
|
|
PRIVATE
|
|
Catch2::Catch2WithMain
|
|
CDT::CDT
|
|
)
|
|
include(Catch)
|
|
catch_discover_tests(${TEST_TARGET_NAME} WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/tests")
|
|
endif()
|