11# Build options
2- option (USE_DEBUG "Set to ON for Debug mode " OFF )
2+ option (USE_DEBUG "Build with debug symbols and without optimization " OFF )
33option (USE_SANITIZER "Use santizer flags" OFF )
4+ option (USE_OPENMP "Use openMP" ON )
5+ option (USE_HOMEBREW_FALLBACK "(macOS-only) also look in 'brew --prefix' for libraries (e.g. OpenMP)" ON )
46option (BUILD_TEST "Build C++ tests with Google Test" OFF )
57option (BUILD_DEBUG_TARGETS "Build Standalone C++ Programs for Debugging" ON )
68option (BUILD_PYTHON "Build Shared Library for Python Package" OFF )
@@ -9,8 +11,8 @@ option(BUILD_PYTHON "Build Shared Library for Python Package" OFF)
911set (CMAKE_CXX_STANDARD 17)
1012set (CMAKE_CXX_STANDARD_REQUIRED ON )
1113
12- # Default to CMake 3.16
13- cmake_minimum_required (VERSION 3.16 )
14+ # Default to CMake 3.20
15+ cmake_minimum_required (VERSION 3.20 )
1416
1517# Define the project
1618project (stochtree LANGUAGES C CXX)
@@ -34,6 +36,13 @@ if(USE_DEBUG)
3436 add_definitions (-DDEBUG)
3537endif ()
3638
39+ # Linker flags (empty by default, updated if using openmp)
40+ set (
41+ STOCHTREE_LINK_FLAGS
42+ ""
43+ )
44+
45+ # Unix / MinGW compiler flags
3746if (UNIX OR MINGW OR CYGWIN )
3847 set (
3948 CMAKE_CXX_FLAGS
@@ -42,11 +51,12 @@ if(UNIX OR MINGW OR CYGWIN)
4251 if (USE_DEBUG)
4352 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0" )
4453 else ()
45- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3" )
54+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g - O3" )
4655 endif ()
4756 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas -Wno-unused-private-field" )
4857endif ()
4958
59+ # MSVC compiler flags
5060if (MSVC )
5161 set (
5262 variables
@@ -72,6 +82,33 @@ else()
7282 endif ()
7383endif ()
7484
85+ # OpenMP
86+ if (USE_OPENMP)
87+ add_definitions (-DSTOCHTREE_OPENMP_AVAILABLE)
88+ if (APPLE )
89+ find_package (OpenMP)
90+ if (NOT OpenMP_FOUND)
91+ if (USE_HOMEBREW_FALLBACK)
92+ execute_process (COMMAND brew --prefix libomp
93+ OUTPUT_VARIABLE HOMEBREW_LIBOMP_PREFIX
94+ OUTPUT_STRIP_TRAILING_WHITESPACE)
95+ set (OpenMP_C_FLAGS "-Xclang -fopenmp -I${HOMEBREW_LIBOMP_PREFIX} /include" )
96+ set (OpenMP_CXX_FLAGS "-Xclang -fopenmp -I${HOMEBREW_LIBOMP_PREFIX} /include" )
97+ set (OpenMP_C_INCLUDE_DIR "" )
98+ set (OpenMP_CXX_INCLUDE_DIR "" )
99+ set (OpenMP_C_LIB_NAMES libomp)
100+ set (OpenMP_CXX_LIB_NAMES libomp)
101+ set (OpenMP_libomp_LIBRARY ${HOMEBREW_LIBOMP_PREFIX} /lib/libomp.dylib)
102+ endif ()
103+ find_package (OpenMP REQUIRED)
104+ endif ()
105+ else ()
106+ find_package (OpenMP REQUIRED)
107+ endif ()
108+ # Update flags with openmp
109+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} " )
110+ endif ()
111+
75112# Header file directory
76113set (StochTree_HEADER_DIR ${PROJECT_SOURCE_DIR} /include )
77114
@@ -80,6 +117,8 @@ set(BOOSTMATH_HEADER_DIR ${PROJECT_SOURCE_DIR}/deps/boost_math/include)
80117
81118# Eigen header file directory
82119set (EIGEN_HEADER_DIR ${PROJECT_SOURCE_DIR} /deps/eigen)
120+ add_definitions (-DEIGEN_MPL2_ONLY)
121+ add_definitions (-DEIGEN_DONT_PARALLELIZE)
83122
84123# fast_double_parser header file directory
85124set (FAST_DOUBLE_PARSER_HEADER_DIR ${PROJECT_SOURCE_DIR} /deps/fast_double_parser/include )
@@ -109,10 +148,11 @@ file(
109148add_library (stochtree_objs OBJECT ${SOURCES} )
110149
111150# Include the headers in the source library
112- target_include_directories (stochtree_objs PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
113-
114- if (APPLE )
115- set (CMAKE_SHARED_LIBRARY_SUFFIX ".so" )
151+ if (USE_OPENMP)
152+ target_include_directories (stochtree_objs PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} ${OpenMP_CXX_INCLUDE_DIR} )
153+ target_link_libraries (stochtree_objs PRIVATE ${OpenMP_libomp_LIBRARY} )
154+ else ()
155+ target_include_directories (stochtree_objs PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
116156endif ()
117157
118158# Python shared library
@@ -122,8 +162,13 @@ if (BUILD_PYTHON)
122162 pybind11_add_module(stochtree_cpp src/py_stochtree.cpp)
123163
124164 # Link to C++ source and headers
125- target_include_directories (stochtree_cpp PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
126- target_link_libraries (stochtree_cpp PRIVATE stochtree_objs)
165+ if (USE_OPENMP)
166+ target_include_directories (stochtree_cpp PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} ${OpenMP_CXX_INCLUDE_DIR} )
167+ target_link_libraries (stochtree_cpp PRIVATE stochtree_objs ${OpenMP_libomp_LIBRARY} )
168+ else ()
169+ target_include_directories (stochtree_cpp PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
170+ target_link_libraries (stochtree_cpp PRIVATE stochtree_objs)
171+ endif ()
127172
128173 # EXAMPLE_VERSION_INFO is defined by setup.py and passed into the C++ code as a
129174 # define (VERSION_INFO) here.
@@ -154,8 +199,13 @@ if(BUILD_TEST)
154199 file (GLOB CPP_TEST_SOURCES test /cpp/*.cpp)
155200 add_executable (teststochtree ${CPP_TEST_SOURCES} )
156201 set (STOCHTREE_TEST_HEADER_DIR ${PROJECT_SOURCE_DIR} /test /cpp)
157- target_include_directories (teststochtree PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${STOCHTREE_TEST_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
158- target_link_libraries (teststochtree PRIVATE stochtree_objs GTest::gtest_main)
202+ if (USE_OPENMP)
203+ target_include_directories (teststochtree PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${STOCHTREE_TEST_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} ${OpenMP_CXX_INCLUDE_DIR} )
204+ target_link_libraries (teststochtree PRIVATE stochtree_objs GTest::gtest_main ${OpenMP_libomp_LIBRARY} )
205+ else ()
206+ target_include_directories (teststochtree PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${STOCHTREE_TEST_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
207+ target_link_libraries (teststochtree PRIVATE stochtree_objs GTest::gtest_main)
208+ endif ()
159209 gtest_discover_tests(teststochtree)
160210endif ()
161211
@@ -164,7 +214,12 @@ if(BUILD_DEBUG_TARGETS)
164214 # Build test suite
165215 add_executable (debugstochtree debug/api_debug.cpp)
166216 set (StochTree_DEBUG_HEADER_DIR ${PROJECT_SOURCE_DIR} /debug)
167- target_include_directories (debugstochtree PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${StochTree_DEBUG_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
168- target_link_libraries (debugstochtree PRIVATE stochtree_objs)
217+ if (USE_OPENMP)
218+ target_include_directories (debugstochtree PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${StochTree_DEBUG_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} ${OpenMP_CXX_INCLUDE_DIR} )
219+ target_link_libraries (debugstochtree PRIVATE stochtree_objs ${OpenMP_libomp_LIBRARY} )
220+ else ()
221+ target_include_directories (debugstochtree PRIVATE ${StochTree_HEADER_DIR} ${BOOSTMATH_HEADER_DIR} ${EIGEN_HEADER_DIR} ${StochTree_DEBUG_HEADER_DIR} ${FAST_DOUBLE_PARSER_HEADER_DIR} ${FMT_HEADER_DIR} )
222+ target_link_libraries (debugstochtree PRIVATE stochtree_objs)
223+ endif ()
169224endif ()
170225
0 commit comments