forked from pierrebarbera/epa-ng
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
196 lines (156 loc) · 7.83 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
cmake_minimum_required (VERSION 2.8.7 FATAL_ERROR)
# add extra cmake modules specifically for Lucas' find_openmp patch under clang/macOS
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/libs/genesis/tools/cmake" )
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
# main compile alternators and their defaults
set (ENABLE_MPI OFF)
set (ENABLE_OMP ON)
set (ENABLE_PREFETCH ON)
if ( $ENV{EPA_HYBRID} )
set (ENABLE_MPI ON)
set (ENABLE_OMP ON)
set (ENABLE_PREFETCH ON)
endif ()
if ( $ENV{EPA_SERIAL} )
set (ENABLE_MPI OFF)
set (ENABLE_OMP OFF)
set (ENABLE_PREFETCH OFF)
endif ()
project ( epa CXX C )
set (epa_VERSION_MAJOR 0)
set (epa_VERSION_MINOR 3)
set (epa_VERSION_PATCH 8)
# set (epa_VERSION_BETA "beta")
set (epa_PROJECT_VERSION "${epa_VERSION_MAJOR}")
set (epa_PROJECT_VERSION "${epa_PROJECT_VERSION}.${epa_VERSION_MINOR}")
set (epa_PROJECT_VERSION "${epa_PROJECT_VERSION}.${epa_VERSION_PATCH}")
if ( ${epa_VERSION_BETA} )
set (epa_PROJECT_VERSION "${epa_PROJECT_VERSION}-${epa_VERSION_BETA}")
endif()
#check for minimum compiler versions
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(EPA_COMPILER_TARGET_VERSION "4.9.2")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS EPA_COMPILER_TARGET_VERSION)
message (FATAL_ERROR "${CMAKE_CXX_COMPILER_ID} compiler too old! Minimum required: ${EPA_COMPILER_TARGET_VERSION}")
endif()
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(EPA_COMPILER_TARGET_VERSION "3.8")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS EPA_COMPILER_TARGET_VERSION)
message (FATAL_ERROR "${CMAKE_CXX_COMPILER_ID} compiler too old! Minimum required: ${EPA_COMPILER_TARGET_VERSION}")
endif()
endif()
message(STATUS "Building EPA-ng version: ${epa_PROJECT_VERSION}")
set (CMAKE_BUILD_TYPE RELEASE)
if ( $ENV{EPA_DEBUG} )
set (CMAKE_BUILD_TYPE DEBUG)
endif ()
message (STATUS "Build type: ${CMAKE_BUILD_TYPE}")
set (WARN_FLAGS "-Wall -Wextra -Wno-unknown-pragmas -pedantic")
set (CMAKE_CXX_FLAGS "-std=c++14 ${WARN_FLAGS} -DEPA_VERSION='\"${epa_PROJECT_VERSION}\"'")
set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g -ggdb3 -DDEBUG -D_GLIBCXX_DEBUG")
set (CMAKE_C_FLAGS_DEBUG "-O0 -g -ggdb3 -D_GLIBCXX_DEBUG")
set (CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
set (CMAKE_C_FLAGS_RELEASE "-O3")
if( ENABLE_PREFETCH )
set (CMAKE_THREAD_PREFER_PTHREAD ON)
set (THREADS_PREFER_PTHREAD_FLAG ON)
find_package (Threads)
message(STATUS "Enabling Prefetching")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__PREFETCH")
endif()
if( ENABLE_OMP )
message(STATUS "Checking for OpenMP")
# CMake versions before 3.5 do not properly support Clang OpenMP flags.
# And even with more recent CMake versions, it is not fully working.
# In order to still enable OpenMP, we use our own patch of the find module.
# See ./tools/cmake/FindOpenMP_patch.cmake for the modifications we made to support Clang.
if( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
find_package( OpenMP_patch )
# If our patch does not work, try the standard one, just in case.
if( NOT OPENMP_FOUND )
find_package( OpenMP )
endif()
else()
# In all other cases, use the normal find module.
find_package( OpenMP )
endif()
if( OPENMP_FOUND )
message(STATUS "Checking for OpenMP -- found")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -D__OMP")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
else()
message(STATUS "Checking for OpenMP -- NOT FOUND")
endif()
endif()
if(ENABLE_MPI)
find_package(MPI REQUIRED)
if(MPI_CXX_FOUND)
set( ENV{OMPI_CXX} ${CMAKE_CXX_COMPILER} PARENT_SCOPE )
#set( CMAKE_CXX_COMPILER "mpicxx")
include_directories(${MPI_CXX_INCLUDE_PATH})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MPI_CXX_COMPILER_FLAGS} -D__MPI")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MPI_CXX_LINK_FLAGS}")
endif()
endif()
# =============================================
# Download Dependencies
# =============================================
# Downloads dependencies if they are not there. We use a special script for this.
include( "${CMAKE_CURRENT_LIST_DIR}/libs/cmake/DownloadDependency.cmake" )
# Store the commit hashes of our dependencies.
# These are replaced by libs/cmake/update_dependencies.sh to the hashes that are currently checked out.
# Thus, do not replace the hashes manually!
SET( CLI11_COMMIT_HASH "13becaddb657eacd090537719a669d66d393b8b2" ) #CLI11_COMMIT_HASH#
SET( genesis_COMMIT_HASH "27a8806aff4dece0348bf7c86e4d0e4d748255f0" ) #genesis_COMMIT_HASH#
SET( pll-modules_COMMIT_HASH "d46415e07e7a2830ca0bda339263b5625ceae2ff" ) #pll-modules_COMMIT_HASH#
SET( libpll_COMMIT_HASH "69411e4b217a3de9940c96ffccc77916702bae92" ) #libpll_COMMIT_HASH#
SET( cereal_COMMIT_HASH "51cbda5f30e56c801c07fe3d3aba5d7fb9e6cca4" ) #cereal_COMMIT_HASH#
# Call the github download function, which takes four arguments:
# - LIBPATH : Path to the libracy dir where dependencies are stored.
# - LIBNAME : Name of the dependency, that is, the name of its main directory within the ${LIBPATH}.
# - TESTFILE : A testfile to check if the dependency is already there.
# - REPOSITORY : Github repository (user/reponame)
# - COMMITHASH : Hash of the commit to check out
DOWNLOAD_GITHUB_DEPENDENCY( "${PROJECT_SOURCE_DIR}/libs" "CLI11" "CMakeLists.txt" "CLIUtils/CLI11" ${CLI11_COMMIT_HASH} )
DOWNLOAD_GITHUB_DEPENDENCY( "${PROJECT_SOURCE_DIR}/libs" "genesis" "CMakeLists.txt" "lczech/genesis" ${genesis_COMMIT_HASH} )
DOWNLOAD_GITHUB_DEPENDENCY( "${PROJECT_SOURCE_DIR}/libs" "pll-modules" "README.md" "ddarriba/pll-modules" ${pll-modules_COMMIT_HASH} )
DOWNLOAD_GITHUB_DEPENDENCY( "${PROJECT_SOURCE_DIR}/libs/pll-modules/libs"
"libpll" "README.md" "xflouris/libpll-2" ${libpll_COMMIT_HASH} )
DOWNLOAD_GITHUB_DEPENDENCY( "${PROJECT_SOURCE_DIR}/libs" "cereal" "README.md" "USCiLab/cereal" ${cereal_COMMIT_HASH} )
# =============================================
# Build pll-modules
# =============================================
set( BUILD_PLLMODULES_STATIC ON CACHE BOOL "Passing BUILD_PLLMODULES_STATIC=ON to pll-modules" )
set( BUILD_PLLMODULES_SHARED OFF CACHE BOOL "Passing BUILD_PLLMODULES_SHARED=OFF to pll-modules" )
add_subdirectory( ${PROJECT_SOURCE_DIR}/libs/pll-modules )
include_directories(${PLLMOD_EXPORTED_INCLUDE_PATH})
# =============================================
# Build genesis
# =============================================
# pass special info to genesis
if(ENABLE_PREFETCH)
set(GENESIS_USE_THREADS ON CACHE BOOL "Passing GENESIS_USE_THREADS=ON to genesis")
else()
set(GENESIS_USE_THREADS OFF CACHE BOOL "Passing GENESIS_USE_THREADS=OFF to genesis")
endif()
set(GENESIS_USE_OPENMP OFF CACHE BOOL "Passing GENESIS_USE_OPENMP=OFF to genesis")
# Add Genesis as dependency
add_subdirectory( ${PROJECT_SOURCE_DIR}/libs/genesis )
# Use everything that Genesis exports, just to be sure that we use the same setup.
add_definitions( ${GENESIS_DEFINITIONS} )
include_directories( ${GENESIS_INCLUDE_DIR} )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GENESIS_CXX_FLAGS}" )
set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GENESIS_EXE_LINKER_FLAGS}" )
message(STATUS "Using flags: ${CMAKE_CXX_FLAGS}")
# =============================================
# Add include directories for other dependencies
# =============================================
include_directories(${PROJECT_SOURCE_DIR}/libs/cereal/include)
include_directories(${PROJECT_SOURCE_DIR}/libs/CLI11/include)
# =============================================
# Recurse and compile main code
# =============================================
add_subdirectory(${PROJECT_SOURCE_DIR}/src)
enable_testing()
add_subdirectory(${PROJECT_SOURCE_DIR}/test/src)