forked from bpiwowar/kqp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMakeLists.txt
executable file
·203 lines (147 loc) · 6.22 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
197
198
199
200
201
202
# This file is part of the Kernel Quantum Probability library (KQP).
#
# KQP is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# KQP is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with KQP. If not, see <http://www.gnu.org/licenses/>.
# --- Basic information about the project
cmake_minimum_required (VERSION 2.6)
INCLUDE (CheckCXXSourceRuns)
PROJECT (kqp)
SET (libkqp_VERSION "1.0.0-SNAPSHOT")
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
# --- Main options
OPTION(JAVA_KQP "Build Java wrapper" ON)
OPTION(PYTHON_KQP "Build Python wrapper" ON)
OPTION(OPEN_MP "Use Open MP" ON)
# --- Get version number from libkqp_VERSION
STRING (REGEX MATCHALL "[0-9]" libkqp_VERSION_PARTS "${libkqp_VERSION}")
LIST (GET libkqp_VERSION_PARTS 0 libkqp_VERSION_MAJOR)
LIST (GET libkqp_VERSION_PARTS 1 libkqp_VERSION_MINOR)
LIST (GET libkqp_VERSION_PARTS 2 libkqp_VERSION_PATCH)
SET (libkqp_SOVERSION "${libkqp_VERSION_MAJOR}.${libkqp_VERSION_MINOR}")
# --- Output some information
if (NOT(CMAKE_BUILD_TYPE))
SET(CMAKE_BUILD_TYPE Debug)
ENDIF()
MESSAGE(STATUS "Creating project KQP ${libkqp_VERSION} with build type ${CMAKE_BUILD_TYPE}")
# --- Compilation flags
# - Gnu CC
IF(CMAKE_COMPILER_IS_GNUCXX)
# Get the major and minor version
EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
IF(GCC_VERSION VERSION_GREATER "4.6.999999")
SET(CXX_STD "c++11")
ELSE()
SET(CXX_STD "c++0x")
ENDIF()
SET (EXTRA_C_FLAGS "${EXTRA_C_FLAGS} --std=${CXX_STD} -Wno-deprecated -Wall -W -Wextra -fPIC -Werror ")
SET (EXTRA_C_FLAGS_RELEASE "-O3 ${EXTRA_C_FLAGS}")
SET (EXTRA_C_FLAGS_DEBUG "-O0 -g ${EXTRA_C_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_C_FLAGS}")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${EXTRA_C_FLAGS_RELEASE}")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${EXTRA_C_FLAGS_DEBUG}")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
# - Xcode
IF (CMAKE_GENERATOR MATCHES Xcode)
SET_PROPERTY(GLOBAL PROPERTY XCODE_BUILD_VARIANTS "Debug Release")
SET(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++0x")
SET(CMAKE_XCODE_GCC_OPTIMIZATION_LEVEL "0")
# SET(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
ENDIF(CMAKE_GENERATOR MATCHES Xcode)
# --- Add our own modules
INCLUDE_DIRECTORIES(${LIBLOG4CXX_INCLUDE_DIRS})
# --- Find Boost
FIND_PACKAGE(Boost)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
# -- Find log4cxx
FIND_PACKAGE(log4cxx)
INCLUDE_DIRECTORIES(${LIBLOG4CXX_INCLUDE_DIRS})
# -- Find pugixml
FIND_PACKAGE(LibPugixml REQUIRED)
if(NOT(PUGIXML_FOUND))
MESSAGE(STATUS "Building PUGIXML")
ADD_SUBDIRECTORY("pugixml/scripts")
INCLUDE_DIRECTORIES("pugixml/src")
SET(PUGIXML_LIBRARIES pugixml)
else()
INCLUDE_DIRECTORIES(${PUGIXML_INCLUDES})
endif()
# --- Check for openmp
IF(OPEN_MP MATCHES "ON")
MESSAGE(STATUS "Testing OPEN MP support")
SET(OLD_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
try_compile(COMPILES_OPENMP "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/openmp/dummy.cpp"
CMAKE_FLAGS "-fopenmp" OUTPUT_VARIABLE comp)
IF(NOT(COMPILES_OPENMP))
MESSAGE(STATUS "No OpenMP support detected")
# MESSAGE(STATUS "${comp}")
SET(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS}")
SET(OPEN_MP "OFF")
ELSE()
MESSAGE(STATUS "OpenMP enabled")
ENDIF()
ENDIF()
IF(OPEN_MP MATCHES "ON")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
MESSAGE(STATUS "Using OpenMP")
ELSEIF(OPEN_MP MATCHES "OFF")
MESSAGE(STATUS "Not using OpenMP")
ELSE()
ENDIF()
# --- Build kqp library
file(GLOB kqp_kqp_H "include/kqp/*.hpp" "include/kqp/for_all*")
file(GLOB kqp_fmatrix_H "ADD_CUSTOM_COMMAND/kqp/feature_matrix/*.hpp" "include/kqp/feature_matrix.hpp")
file(GLOB kqp_kernel_evd_H "include/kqp/kernel_evd/*.hpp" "include/kqp/kernel_evd.hpp")
file(GLOB kqp_cleaning_H "include/kqp/cleaning/*.hpp" "include/kqp/cleaning.hpp")
file(GLOB kqp_kqp_CPP "src/*.cpp")
file(GLOB kqp_fmatrix_CPP "src/feature_matrix/*.cpp" "src/feature_matrix.cpp")
file(GLOB kqp_kernel_evd_CPP "src/kernel_evd/*.cpp" "src/kernel_evd.cpp")
file(GLOB kqp_cleaning_CPP "src/cleaning/*.cpp" "src/cleaning.cpp")
FOREACH(name kqp fmatrix cleaning kernel_evd)
SET(kqp_${name}_SRC ${kqp_${name}_H} ${kqp_${name}_CPP})
ENDFOREACH(name)
SOURCE_GROUP("Spaces" FILES ${kqp_fmatrix_SRC})
SOURCE_GROUP("Kernel EVD" FILES ${kqp_kernel_evd_SRC})
SOURCE_GROUP("Cleaning" FILES ${kqp_cleaning_SRC})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS})
ADD_LIBRARY (kqp ${kqp_kqp_SRC} ${kqp_fmatrix_SRC} ${kqp_kernel_evd_SRC} ${kqp_cleaning_SRC} "${CMAKE_CURRENT_SOURCE_DIR}/include/Eigen")
SET(LIBKQP_LIBRARIES ${LIBLOG4CXX_LIBRARY} ${PUGIXML_LIBRARIES})
TARGET_LINK_LIBRARIES(kqp ${LIBLOG4CXX_LIBRARY} ${PUGIXML_LIBRARIES})
if(NOT(PUGIXML_FOUND))
ADD_DEPENDENCIES(kqp DEPENDS pugixml)
endif()
# --- Doxygen
# add a target to generate API documentation with Doxygen
find_package(Doxygen)
if(DOXYGEN_FOUND)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile ${WORKING_DIRECTORY} ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating API documentation with Doxygen" VERBATIM
)
endif(DOXYGEN_FOUND)
# --- Tests
ENABLE_TESTING()
ADD_CUSTOM_TARGET(run-tests COMMAND ${CMAKE_CTEST_COMMAND})
# Tests
add_subdirectory(tests)
# Benchmark
add_subdirectory(benchmark)
# Wrappers
add_subdirectory(swig)
# Examples
add_subdirectory(examples)
# --- Installation
INSTALL(DIRECTORY include/kqp DESTINATION include)
INSTALL(DIRECTORY include/Eigen DESTINATION include/kqp)
INSTALL(TARGETS kqp LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)