mirror of
https://github.com/boostorg/math.git
synced 2026-07-21 13:23:43 +00:00
193 lines
5.5 KiB
CMake
193 lines
5.5 KiB
CMake
# Copyright 2020 Peter Dimov
|
|
# Copyright 2021 Matt Borland
|
|
# Distributed under the Boost Software License, Version 1.0.
|
|
# https://www.boost.org/LICENSE_1_0.txt
|
|
|
|
cmake_minimum_required(VERSION 3.8...3.16)
|
|
|
|
project(boost_math VERSION 1.92.0 LANGUAGES CXX)
|
|
|
|
add_library(boost_math INTERFACE)
|
|
|
|
add_library(Boost::math ALIAS boost_math)
|
|
|
|
target_include_directories(boost_math INTERFACE include)
|
|
if(NOT CMAKE_VERSION VERSION_LESS "3.19")
|
|
file(GLOB_RECURSE headers include/*.hpp)
|
|
target_sources(boost_math PRIVATE ${headers})
|
|
endif()
|
|
|
|
include(CMakeDependentOption)
|
|
|
|
cmake_dependent_option(BOOST_MATH_STANDALONE "Use Boost.Math in standalone mode" ON "NOT BOOST_SUPERPROJECT_VERSION" OFF)
|
|
|
|
message(STATUS "Boost.Math: standalone mode ${BOOST_MATH_STANDALONE}")
|
|
|
|
if(BOOST_MATH_STANDALONE)
|
|
|
|
target_compile_definitions(boost_math INTERFACE BOOST_MATH_STANDALONE=1)
|
|
|
|
else()
|
|
|
|
target_link_libraries(boost_math
|
|
INTERFACE
|
|
Boost::assert
|
|
Boost::concept_check
|
|
Boost::config
|
|
Boost::core
|
|
Boost::integer
|
|
Boost::lexical_cast
|
|
Boost::predef
|
|
Boost::random
|
|
Boost::throw_exception
|
|
)
|
|
|
|
endif()
|
|
|
|
target_compile_features(boost_math INTERFACE cxx_std_14)
|
|
|
|
# Legacy C99/TR1 compiled libraries
|
|
option(BOOST_MATH_BUILD_WITH_LEGACY_FUNCTIONS "Build the C99 and TR1 compiled libraries" OFF)
|
|
|
|
if(BOOST_MATH_BUILD_WITH_LEGACY_FUNCTIONS)
|
|
|
|
include(CheckCXXSourceCompiles)
|
|
set(_config_inc "")
|
|
if(NOT BOOST_MATH_STANDALONE)
|
|
get_target_property(_config_type Boost::config TYPE)
|
|
if(_config_type STREQUAL "INTERFACE_LIBRARY")
|
|
get_target_property(_config_inc Boost::config INTERFACE_INCLUDE_DIRECTORIES)
|
|
endif()
|
|
endif()
|
|
set(CMAKE_REQUIRED_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/include" ${_config_inc})
|
|
check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_long_double_support.cpp> \n int main() { return 0;}" BOOST_MATH_HAS_LONG_DOUBLE)
|
|
unset(CMAKE_REQUIRED_INCLUDES)
|
|
|
|
set(C99_SOURCES
|
|
acosh
|
|
asinh
|
|
atanh
|
|
cbrt
|
|
copysign
|
|
erfc
|
|
erf
|
|
expm1
|
|
fmax
|
|
fmin
|
|
fpclassify
|
|
hypot
|
|
lgamma
|
|
llround
|
|
log1p
|
|
lround
|
|
nextafter
|
|
nexttoward
|
|
round
|
|
tgamma
|
|
trunc
|
|
)
|
|
|
|
set(TR1_SOURCES
|
|
assoc_laguerre
|
|
assoc_legendre
|
|
beta
|
|
comp_ellint_1
|
|
comp_ellint_2
|
|
comp_ellint_3
|
|
cyl_bessel_i
|
|
cyl_bessel_j
|
|
cyl_bessel_k
|
|
cyl_neumann
|
|
ellint_1
|
|
ellint_2
|
|
ellint_3
|
|
expint
|
|
hermite
|
|
laguerre
|
|
legendre
|
|
riemann_zeta
|
|
sph_bessel
|
|
sph_legendre
|
|
sph_neumann
|
|
)
|
|
|
|
list(TRANSFORM C99_SOURCES PREPEND "src/tr1/")
|
|
list(TRANSFORM TR1_SOURCES PREPEND "src/tr1/")
|
|
|
|
list(TRANSFORM C99_SOURCES APPEND "f.cpp" OUTPUT_VARIABLE C99_SOURCESf)
|
|
list(TRANSFORM TR1_SOURCES APPEND "f.cpp" OUTPUT_VARIABLE TR1_SOURCESf)
|
|
|
|
set(types "" f)
|
|
|
|
if(BOOST_MATH_HAS_LONG_DOUBLE)
|
|
list(TRANSFORM C99_SOURCES APPEND "l.cpp" OUTPUT_VARIABLE C99_SOURCESl)
|
|
list(TRANSFORM TR1_SOURCES APPEND "l.cpp" OUTPUT_VARIABLE TR1_SOURCESl)
|
|
list(APPEND types l)
|
|
endif()
|
|
|
|
list(TRANSFORM C99_SOURCES APPEND ".cpp")
|
|
list(TRANSFORM TR1_SOURCES APPEND ".cpp")
|
|
|
|
foreach(type IN LISTS types)
|
|
add_library(boost_math_tr1${type} ${TR1_SOURCES${type}})
|
|
add_library(Boost::math_tr1${type} ALIAS boost_math_tr1${type})
|
|
if(NOT BOOST_MATH_STANDALONE)
|
|
target_link_libraries(boost_math_tr1${type} PUBLIC Boost::config)
|
|
endif()
|
|
target_include_directories(boost_math_tr1${type} PRIVATE src/tr1)
|
|
target_include_directories(boost_math_tr1${type} PRIVATE include)
|
|
|
|
add_library(boost_math_c99${type} ${C99_SOURCES${type}})
|
|
add_library(Boost::math_c99${type} ALIAS boost_math_c99${type})
|
|
if(NOT BOOST_MATH_STANDALONE)
|
|
target_link_libraries(boost_math_c99${type} PUBLIC Boost::config)
|
|
endif()
|
|
target_include_directories(boost_math_c99${type} PRIVATE src/tr1)
|
|
target_include_directories(boost_math_c99${type} PRIVATE include)
|
|
|
|
if(BUILD_SHARED_LIBS)
|
|
target_compile_definitions(boost_math_tr1${type} PUBLIC BOOST_MATH_TR1_DYN_LINK=1)
|
|
target_compile_definitions(boost_math_c99${type} PUBLIC BOOST_MATH_TR1_DYN_LINK=1)
|
|
if(WIN32)
|
|
target_compile_definitions(boost_math_tr1${type} PRIVATE "BOOST_SYMBOL_EXPORT=__declspec(dllexport)" BOOST_ALL_NO_LIB)
|
|
target_compile_definitions(boost_math_c99${type} PRIVATE "BOOST_SYMBOL_EXPORT=__declspec(dllexport)" BOOST_ALL_NO_LIB)
|
|
else()
|
|
target_compile_definitions(boost_math_tr1${type} PRIVATE "BOOST_SYMBOL_EXPORT=__attribute__((visibility(\"default\")))" BOOST_ALL_NO_LIB)
|
|
target_compile_definitions(boost_math_c99${type} PRIVATE "BOOST_SYMBOL_EXPORT=__attribute__((visibility(\"default\")))" BOOST_ALL_NO_LIB)
|
|
endif()
|
|
endif()
|
|
|
|
target_compile_features(boost_math_tr1${type} PUBLIC cxx_std_14)
|
|
target_compile_features(boost_math_c99${type} PUBLIC cxx_std_14)
|
|
|
|
if(APPLE)
|
|
target_compile_definitions(boost_math_tr1${type} PRIVATE _DARWIN_C_SOURCE)
|
|
target_compile_definitions(boost_math_c99${type} PRIVATE _DARWIN_C_SOURCE)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(BOOST_SUPERPROJECT_VERSION AND NOT CMAKE_VERSION VERSION_LESS 3.13)
|
|
set(boost_math_legacy_targets "")
|
|
foreach(type IN LISTS types)
|
|
list(APPEND boost_math_legacy_targets boost_math_c99${type} boost_math_tr1${type})
|
|
endforeach()
|
|
boost_install(TARGETS ${boost_math_legacy_targets} VERSION "${BOOST_SUPERPROJECT_VERSION}")
|
|
endif()
|
|
|
|
endif()
|
|
|
|
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
|
|
|
|
add_subdirectory(test)
|
|
|
|
# Only enable tests when we're the root project
|
|
elseif(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
|
|
include(CTest)
|
|
add_subdirectory(test)
|
|
|
|
include(GNUInstallDirs)
|
|
install(DIRECTORY "include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
|
|
|
|
endif()
|