-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathCMakeLists.txt
executable file
·231 lines (199 loc) · 9.51 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
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
cmake_minimum_required(VERSION 3.7)
#set(VERBOSE)
if (NOT (PLATFORM STREQUAL "Linux" OR PLATFORM STREQUAL "Android" OR PLATFORM STREQUAL "Android64" OR PLATFORM STREQUAL "RaspberryPi" OR PLATFORM STREQUAL "Windows"))
message(FATAL_ERROR "Please specify the PLATFORM variable <Linux, Android, Android64, RaspberryPi, Windows>")
endif()
if (PLATFORM STREQUAL "Windows")
set(CMAKE_GENERATOR_PLATFORM x64)
endif()
if ((PLATFORM STREQUAL "Android") OR (PLATFORM STREQUAL "Android64"))
# This is some annoying acrobatic for the Android build. Issue is, when we specify Boost::thread further down, a -lpthread gets appended to the linker args. The NDK doesn't have an explicit pthread library, so this fails. This create a shell script that removes that specific parameter
set(CXX_NO_PTHREAD "${CMAKE_CURRENT_BINARY_DIR}/android_cxx_no_pthread.sh")
file(WRITE "${CXX_NO_PTHREAD}" "#!/bin/bash\nfor var in \"$@\"\ndo\nif [ \"\$var\" == \"-lpthread\" ]; then\ncontinue\nfi\nNEW_ARGS=\"\$NEW_ARGS \$var\"\ndone\n$ENV{CXX} \$NEW_ARGS")
execute_process(COMMAND "chmod" "755" "${CXX_NO_PTHREAD}")
set(CMAKE_CXX_COMPILER "${CXX_NO_PTHREAD}")
endif()
project(godec)
if (NOT DEFINED CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
set(GCC_MINIMAL_VERSION 4.9.0)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${GCC_MINIMAL_VERSION})
message(FATAL_ERROR "Insufficient gcc version: ${CMAKE_CXX_COMPILER_VERSION}. Version ${GCC_MINIMAL_VERSION} or above is required.")
endif()
endif()
if (NOT PLATFORM STREQUAL "Windows")
add_compile_options(-Wall -Wno-sign-compare -Wno-unused-local-typedefs -Winit-self )
endif()
if ((PLATFORM STREQUAL "Linux") OR (PLATFORM STREQUAL "RaspberryPi"))
add_compile_options(-pthread)
endif()
set(CMAKE_CXX_FLAGS_DEBUG "-g -DDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-Ofast -DNDEBUG")
find_program(CCACHE_PROGRAM ccache)
if(DEFINED ENV{CCACHE_DIR} AND CCACHE_PROGRAM)
message(STATUS "CCACHE_DIR environment variable set to '$ENV{CCACHE_DIR}', will use ${CCACHE_PROGRAM}")
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif()
#set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# The reason why we use static libs for Windows is because I have yet to discover the magic b2 command line args that produce the right combination of libraries for shared linkine in Boost 1.68 on Windows. Static linking works.
if (PLATFORM STREQUAL "Windows")
set(Boost_USE_STATIC_LIBS ON)
else()
set(Boost_USE_STATIC_LIBS OFF)
endif()
set(Boost_USE_STATIC_RUNTIME OFF)
set(Boost_USE_MULTITHREADED ON)
#set(Boost_DEBUG ON)
find_package(Boost
1.55.0 # Minimum or EXACT version e.g. 1.36.0
REQUIRED # Fail with error if Boost is not found
COMPONENTS date_time atomic regex system serialization filesystem iostreams timer chrono program_options thread
)
if (NOT PLATFORM STREQUAL "Windows")
find_package(PkgConfig)
endif()
if(DEFINED Eigen3_INCLUDE_DIRS)
else()
pkg_search_module(Eigen3 REQUIRED eigen3)
endif()
if ((NOT PLATFORM STREQUAL "Android") OR (NOT PLATFORM STREQUAL "Android64"))
if ((NOT ALSA_INCLUDE_DIRS) AND (NOT PLATFORM STREQUAL "Windows"))
find_package(ALSA REQUIRED)
endif()
find_package(PythonLibs 3.3 REQUIRED)
find_package(Java REQUIRED)
find_package(Java COMPONENTS REQUIRED Runtime)
find_package(Java COMPONENTS REQUIRED Development)
find_package(JNI REQUIRED)
find_package(ZLIB REQUIRED)
endif()
if (PLATFORM STREQUAL "Android")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DANDROID -march=armv7-a -mfpu=neon -Wno-narrowing -fexceptions -frtti -Wno-deprecated-register -Wno-redeclared-class-member")
list(APPEND LINKER_LIBS -lOpenSLES)
elseif(PLATFORM STREQUAL "Android64")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DANDROID -march=armv8-a -mfpu=neon-fp-armv8 -Wno-narrowing -fexceptions -frtti -Wno-deprecated-register -Wno-redeclared-class-member")
list(APPEND LINKER_LIBS -lOpenSLES)
elseif(PLATFORM STREQUAL "RaspberryPi")
if (NOT DEFINED RASPBERRY_PI_OPT_FLAGS)
message(FATAL_ERROR "For RaspberryPi platform, need to specify RASPBERRY_PI_OPT_FLAGS")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${RASPBERRY_PI_OPT_FLAGS} -Wno-psabi -mhard-float")
elseif(PLATFORM STREQUAL "Linux")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-ignored-attributes -Wno-int-in-bool-context -msse -msse2 -Wno-psabi")
elseif(PLATFORM STREQUAL "Windows")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /MD")
endif()
add_definitions(
-DEIGEN_NO_DEBUG
-DNDEBUG
-Ofast
)
if (NOT PLATFORM STREQUAL "Windows")
add_definitions(
-DLINUX_MACHINE=1
)
list(APPEND LINKER_LIBS -Wl,--no-undefined)
else()
add_definitions(
-D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
)
endif()
include_directories(
BEFORE SYSTEM
${PROJECT_SOURCE_DIR}/src/include
${Boost_INCLUDE_DIR}
${Eigen3_INCLUDE_DIRS}
${JNI_INCLUDE_DIRS}
${PYTHON_INCLUDE_DIRS}
${ALSA_INCLUDE_DIRS}
${ZLIB_INCLUDE_DIRS}
${GODEC_ADDITIONAL_INCLUDE_DIRS}
)
link_directories(
${GODEC_ADDITIONAL_LINKER_DIRS}
)
file(WRITE "${PROJECT_SOURCE_DIR}/src/include/godec/version.h" "#pragma once\n")
if ("${VERSION_STRING}" STREQUAL "")
# Use Git SHA as version
execute_process(COMMAND git rev-parse --short HEAD OUTPUT_VARIABLE VERSION_STRING)
string(REGEX REPLACE "[\ \n]+" "" VERSION_STRING "${VERSION_STRING}")
endif()
file(APPEND "${PROJECT_SOURCE_DIR}/src/include/godec/version.h" "#define GODEC_VERSION_STRING \"${VERSION_STRING}\"\n")
# Get Eigen version
execute_process(COMMAND bash "-c" "grep EIGEN_WORLD_VERSION ${Eigen3_INCLUDE_DIRS}/Eigen/src/Core/util/Macros.h | head -1 | awk '{print $3;}'" OUTPUT_VARIABLE EIGEN_WORLD_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
file(APPEND "${PROJECT_SOURCE_DIR}/src/include/godec/version.h" "#define GODEC_EIGEN_WORLD_VERSION ${EIGEN_WORLD_VERSION}\n")
execute_process(COMMAND bash "-c" "grep EIGEN_MAJOR_VERSION ${Eigen3_INCLUDE_DIRS}/Eigen/src/Core/util/Macros.h | head -1 | awk '{print $3;}'" OUTPUT_VARIABLE EIGEN_MAJOR_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
file(APPEND "${PROJECT_SOURCE_DIR}/src/include/godec/version.h" "#define GODEC_EIGEN_MAJOR_VERSION ${EIGEN_MAJOR_VERSION}\n")
execute_process(COMMAND bash "-c" "grep EIGEN_MINOR_VERSION ${Eigen3_INCLUDE_DIRS}/Eigen/src/Core/util/Macros.h | head -1 | awk '{print $3;}'" OUTPUT_VARIABLE EIGEN_MINOR_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
file(APPEND "${PROJECT_SOURCE_DIR}/src/include/godec/version.h" "#define GODEC_EIGEN_MINOR_VERSION ${EIGEN_MINOR_VERSION}\n")
set(SOURCE_FILES
src/include/godec/channel.h
src/ChannelMessenger.cc
src/include/godec/ChannelMessenger.h
src/ComponentGraph.cc
src/include/godec/ComponentGraph.h
src/HelperFuncs.cc
src/include/godec/HelperFuncs.h
src/TimeStream.cc
src/include/godec/TimeStream.h
)
link_directories(${JAVA_LINKER_DIR})
link_directories(${ALSA_LINKER_DIR})
if (PYTHON_LIBRARIES)
get_filename_component(PYTHON_LIBRARY_DIR ${PYTHON_LIBRARIES} DIRECTORY)
endif()
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH};${Boost_LIBRARY_DIRS};${PYTHON_LIBRARY_DIR}")
if ((PLATFORM STREQUAL "Android") OR (PLATFORM STREQUAL "Android64"))
list(APPEND LINKER_LIBS -llog -lz -lOpenSLES)
elseif(PLATFORM STREQUAL "Windows")
list(APPEND LINKER_LIBS ${JAVA_JVM_LIBRARY} ${PYTHON_LIBRARIES} ${ZLIB_LIBRARY} winmm.lib)
else()
list(APPEND LINKER_LIBS ${JAVA_JVM_LIBRARY} ${PYTHON_LIBRARIES} ${ZLIB_LIBRARY} -ldl -lrt -lasound)
endif()
add_subdirectory(src/core_components)
add_subdirectory(doc)
add_subdirectory(java)
add_library(godec_dynamic SHARED src/godec.cpp ${SOURCE_FILES})
target_link_libraries(godec_dynamic
godec_core_static
Boost::program_options Boost::regex Boost::system Boost::serialization Boost::filesystem Boost::iostreams Boost::timer Boost::chrono Boost::thread
${LINKER_LIBS}
)
if (PLATFORM STREQUAL "Windows")
set(GODEC_DYNAMIC_NAME "libgodec")
else()
set(GODEC_DYNAMIC_NAME "godec")
endif()
set_target_properties(godec_dynamic PROPERTIES OUTPUT_NAME ${GODEC_DYNAMIC_NAME})
add_library(godec_static STATIC ${SOURCE_FILES})
add_executable(godec src/godec.cpp)
target_link_libraries(godec
godec_static
godec_core_static
Boost::program_options Boost::regex Boost::system Boost::serialization Boost::filesystem Boost::iostreams Boost::timer Boost::chrono Boost::thread
${LINKER_LIBS}
)
install (TARGETS godec DESTINATION bin)
install (TARGETS godec_dynamic DESTINATION bin)
install (TARGETS godec_static DESTINATION lib)
install (DIRECTORY "${PROJECT_SOURCE_DIR}/src/include" DESTINATION .)
install (FILES "${PROJECT_SOURCE_DIR}/src/core_components/GodecMessages.h" DESTINATION include/godec)
install (FILES "${PROJECT_SOURCE_DIR}/src/core_components/AccumCovariance.h" DESTINATION include/godec/core_components)
install (FILES "${PROJECT_SOURCE_DIR}/src/core_components/cnpy.h" DESTINATION include/godec/core_components)
install (FILES "${PROJECT_SOURCE_DIR}/tools/env.sh" DESTINATION .)
install (DIRECTORY ${PROJECT_SOURCE_DIR}/doc/ DESTINATION doc/ PATTERN "CMakeLists.txt" EXCLUDE)
install (FILES ${PROJECT_SOURCE_DIR}/README.md DESTINATION .)
enable_testing()
if (PLATFORM STREQUAL "Windows")
set(TEST_CMD cmd /C ${MVN})
else()
set(TEST_CMD ${MVN})
file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/.git/hooks)
ADD_CUSTOM_TARGET(link_astyle ALL COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_SOURCE_DIR}/misc/pre-commit ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit)
endif()
add_test(NAME regression COMMAND ./run_tests.sh ${CMAKE_INSTALL_PREFIX} ${PLATFORM} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/test)