1
1
# 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 )
3
3
option (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 )
4
6
option (BUILD_TEST "Build C++ tests with Google Test" OFF )
5
7
option (BUILD_DEBUG_TARGETS "Build Standalone C++ Programs for Debugging" ON )
6
8
option (BUILD_PYTHON "Build Shared Library for Python Package" OFF )
@@ -9,8 +11,8 @@ option(BUILD_PYTHON "Build Shared Library for Python Package" OFF)
9
11
set (CMAKE_CXX_STANDARD 17 )
10
12
set (CMAKE_CXX_STANDARD_REQUIRED ON )
11
13
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 )
14
16
15
17
# Define the project
16
18
project (stochtree LANGUAGES C CXX )
@@ -34,6 +36,13 @@ if(USE_DEBUG)
34
36
add_definitions (-DDEBUG )
35
37
endif ()
36
38
39
+ # Linker flags (empty by default, updated if using openmp)
40
+ set (
41
+ STOCHTREE_LINK_FLAGS
42
+ ""
43
+ )
44
+
45
+ # Unix / MinGW compiler flags
37
46
if (UNIX OR MINGW OR CYGWIN )
38
47
set (
39
48
CMAKE_CXX_FLAGS
@@ -42,11 +51,12 @@ if(UNIX OR MINGW OR CYGWIN)
42
51
if (USE_DEBUG )
43
52
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0" )
44
53
else ()
45
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3" )
54
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g - O3" )
46
55
endif ()
47
56
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas -Wno-unused-private-field" )
48
57
endif ()
49
58
59
+ # MSVC compiler flags
50
60
if (MSVC )
51
61
set (
52
62
variables
@@ -72,6 +82,33 @@ else()
72
82
endif ()
73
83
endif ()
74
84
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
+
75
112
# Header file directory
76
113
set (StochTree_HEADER_DIR ${PROJECT_SOURCE_DIR} /include )
77
114
@@ -80,6 +117,8 @@ set(BOOSTMATH_HEADER_DIR ${PROJECT_SOURCE_DIR}/deps/boost_math/include)
80
117
81
118
# Eigen header file directory
82
119
set (EIGEN_HEADER_DIR ${PROJECT_SOURCE_DIR} /deps/eigen )
120
+ add_definitions (-DEIGEN_MPL2_ONLY )
121
+ add_definitions (-DEIGEN_DONT_PARALLELIZE )
83
122
84
123
# fast_double_parser header file directory
85
124
set (FAST_DOUBLE_PARSER_HEADER_DIR ${PROJECT_SOURCE_DIR} /deps/fast_double_parser/include )
@@ -109,10 +148,11 @@ file(
109
148
add_library (stochtree_objs OBJECT ${SOURCES} )
110
149
111
150
# 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} )
116
156
endif ()
117
157
118
158
# Python shared library
@@ -122,8 +162,13 @@ if (BUILD_PYTHON)
122
162
pybind11_add_module (stochtree_cpp src/py_stochtree.cpp )
123
163
124
164
# 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 ()
127
172
128
173
# EXAMPLE_VERSION_INFO is defined by setup.py and passed into the C++ code as a
129
174
# define (VERSION_INFO) here.
@@ -154,8 +199,13 @@ if(BUILD_TEST)
154
199
file (GLOB CPP_TEST_SOURCES test /cpp/*.cpp )
155
200
add_executable (teststochtree ${CPP_TEST_SOURCES} )
156
201
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 ()
159
209
gtest_discover_tests (teststochtree )
160
210
endif ()
161
211
@@ -164,7 +214,12 @@ if(BUILD_DEBUG_TARGETS)
164
214
# Build test suite
165
215
add_executable (debugstochtree debug/api_debug.cpp )
166
216
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 ()
169
224
endif ()
170
225
0 commit comments