-
Notifications
You must be signed in to change notification settings - Fork 452
/
CMakeLists.txt
369 lines (302 loc) · 11.6 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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
cmake_minimum_required(VERSION 2.8.5)
project(libbladeRF C)
if(MSVC)
find_package(LibPThreadsWin32 REQUIRED)
if(LIBPTHREADSWIN32_FOUND)
set(HAVE_THREADS true)
else()
set(HAVE_THREADS false)
endif()
else(MSVC)
find_package(Threads REQUIRED)
if(Threads_FOUND)
set(HAVE_THREADS true)
else()
set(HAVE_THREADS false)
endif()
endif(MSVC)
if (NOT HAVE_THREADS)
message(FATAL_ERROR "pthreads not found. This is required to build libbladeRF.")
endif()
################################################################################
# Version information
################################################################################
set(VERSION_INFO_MAJOR 0)
set(VERSION_INFO_MINOR 16)
set(VERSION_INFO_PATCH 2)
if(NOT DEFINED VERSION_INFO_EXTRA)
set(VERSION_INFO_EXTRA "git")
endif()
include(Version)
set(VERSION "${VERSION_INFO}")
set(LIBVER "${VERSION_INFO_BASE}")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/src/version.h.in
${CMAKE_CURRENT_BINARY_DIR}/src/version.h
@ONLY
)
if(MSVC)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/bladerf.rc.in
${CMAKE_CURRENT_BINARY_DIR}/bladerf.rc
@ONLY
)
endif()
include(GNUInstallDirs)
# Fall back to just "lib" if the item provided by GNUInstallDirs doesn't exist
# For example, on Ubuntu 13.10 with CMake 2.8.11.2,
# /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} doesn't exist.
if (NOT EXISTS "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
message(STATUS "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} does not exist. Defaulting libbladeRF install location to ${CMAKE_INSTALL_PREFIX}/lib.")
set(CMAKE_INSTALL_LIBDIR lib)
endif()
################################################################################
# Configuration options
################################################################################
option(ENABLE_LIBBLADERF_LOGGING "Enable log messages in libbladeRF." ON)
option(BUILD_LIBBLADERF_DOCUMENTATION "Build libbladeRF documentation. Requries Doxygen." ${BUILD_DOCUMENTATION})
if(NOT ${BUILD_DOCUMENTATION})
set(BUILD_LIBBLADERF_DOCUMENTATION OFF)
endif()
option(ENABLE_LIBBLADERF_SYNC_LOG_VERBOSE
"Enable log_verbose() calls in the sync interface's data path. Note that this may harm performance."
OFF
)
option(ENABLE_LOCK_CHECKS
"Enable checks for lock acquisition failures (e.g., deadlock)"
OFF
)
##############################
# Backend Support
##############################
option(ENABLE_BACKEND_USB
"Enable USB backends. Required when using the bladeRF with a host machine."
ON
)
option(ENABLE_BACKEND_LIBUSB
"Enable libusb backend support."
ON
)
option(ENABLE_BACKEND_DUMMY
"Enable dummy backend support. This is only useful for some developers."
OFF
)
option(LIBUSB_DETACH_KERNEL_DRIVER
"Enable calls to libusb_detach_kernel_driver(). Not supported in Windows."
ON
)
option(ENABLE_BACKEND_LINUX_DRIVER
"Enable Linux driver backend support."
OFF
)
# Ensure we've got at least one backend enabled
if(NOT ENABLE_BACKEND_LIBUSB AND NOT ENABLE_BACKEND_LINUX_DRIVER AND NOT ENABLE_BACKEND_DUMMY)
message(FATAL_ERROR
"No libbladeRF backends are enabled. "
"Please enable one or more backends." )
endif()
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/src/backend/backend_config.h.in
${CMAKE_CURRENT_BINARY_DIR}/src/backend/backend_config.h
@ONLY
)
################################################################################
# Additional compiler options
################################################################################
if(ENABLE_LIBBLADERF_LOGGING)
add_definitions(-DLOGGING_ENABLED)
endif()
if(ENABLE_LOCK_CHECKS)
add_definitions(-DENABLE_LOCK_CHECKS)
endif()
if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR
"${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" )
# Doing this manually instead of via add_compiler_export_flags() since
# the GenerateExportHeader module appears to break for C-only projects:
#
# http://www.cmake.org/pipermail/cmake-commits/2012-August/013142.html
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
endif()
################################################################################
# Include paths
################################################################################
set(LIBBLADERF_INCLUDES
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/src
${BLADERF_HOST_COMMON_INCLUDE_DIRS}
${BLADERF_FW_COMMON_INCLUDE_DIR}
${CMAKE_CURRENT_BINARY_DIR}/src
)
################################################################################
# Build dependencies
################################################################################
if(NOT HAVE_THREADS)
message(FATAL_ERROR "Pthreads is required for libbladeRF")
endif()
if(NOT ENABLE_BACKEND_USB)
set(ENABLE_BACKEND_LIBUSB OFF)
set(ENABLE_BACKEND_LINUX_DRIVER OFF)
endif()
if(ENABLE_BACKEND_LIBUSB)
find_package(LibUSB)
if(NOT LIBUSB_FOUND)
message(FATAL_ERROR "libusb-1.0 not found. This is required to use the libbladeRF libusb backend. For binary releases, try setting LIBUSB_PATH.")
else(NOT LIBUSB_FOUND)
if(LIBUSB_HAVE_GET_VERSION)
add_definitions(-DHAVE_LIBUSB_GET_VERSION)
endif(LIBUSB_HAVE_GET_VERSION)
if(NOT LIBUSB_HAVE_HANDLE_EVENTS_TIMEOUT)
MESSAGE(FATAL "The required function libusb_handle_events_timeout() is missing")
endif()
set(LIBBLADERF_INCLUDES ${LIBBLADERF_INCLUDES} ${LIBUSB_INCLUDE_DIRS})
endif(NOT LIBUSB_FOUND)
endif(ENABLE_BACKEND_LIBUSB)
if(ENABLE_LIBBLADERF_SYNC_LOG_VERBOSE AND ENABLE_LIBBLADERF_LOGGING)
add_definitions(-DENABLE_LIBBLADERF_SYNC_LOG_VERBOSE)
endif()
include_directories(${LIBBLADERF_INCLUDES})
################################################################################
# Configure source files
################################################################################
set(LIBBLADERF_SOURCE
src/async.c
src/backend/backend.c
src/bladerf.c
src/bladerf_priv.c
src/config.c
src/dc_cal_table.c
src/file_ops.c
src/fpga.c
src/lms.c
src/si5338.c
src/xb.c
src/version.h
src/device_identifier.c
src/devinfo.c
src/flash.c
src/flash_fields.c
src/image.c
src/sync.c
src/sync_worker.c
src/version_compat.c
${BLADERF_HOST_COMMON_SOURCE_DIR}/sha256.c
${BLADERF_HOST_COMMON_SOURCE_DIR}/conversions.c
${BLADERF_HOST_COMMON_SOURCE_DIR}/log.c
)
if (MSVC)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE} ${CMAKE_CURRENT_BINARY_DIR}/bladerf.rc)
endif()
if(ENABLE_BACKEND_USB)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE} src/backend/usb/usb.c)
endif()
if(LIBUSB_FOUND AND ENABLE_BACKEND_LIBUSB)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE} src/backend//usb/libusb.c)
endif()
if(ENABLE_BACKEND_DUMMY)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE} src/backend/dummy.c)
endif()
if(ENABLE_BACKEND_LINUX_DRIVER)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE} src/backend/linux.c)
endif()
if(BLADERF_OS_OSX)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE}
${BLADERF_HOST_COMMON_SOURCE_DIR}/osx/clock_gettime.c
)
endif()
if(MSVC)
set(LIBBLADERF_SOURCE ${LIBBLADERF_SOURCE}
${BLADERF_HOST_COMMON_SOURCE_DIR}/windows/clock_gettime.c
)
endif()
add_library(libbladerf_shared SHARED ${LIBBLADERF_SOURCE})
################################################################################
# Build configuration
################################################################################
if(ENABLE_LIBBLADERF_SYNC)
if(MSVC)
set(LIBBLADERF_LIBS ${LIBBLADERF_LIBS} ${LIBPTHREADSWIN32_LIBRARIES})
else()
set(LIBBLADERF_LIBS ${LIBBLADERF_LIBS} ${CMAKE_THREAD_LIBS_INIT})
endif(MSVC)
endif()
if(ENABLE_BACKEND_LIBUSB)
set(LIBBLADERF_LIBS ${LIBBLADERF_LIBS} ${LIBUSB_LIBRARIES})
endif()
target_link_libraries(libbladerf_shared ${LIBBLADERF_LIBS})
# Adjust our output name
set_target_properties(libbladerf_shared PROPERTIES OUTPUT_NAME bladeRF)
# Set shared library version
set_target_properties(libbladerf_shared PROPERTIES SOVERSION ${VERSION_INFO_MAJOR})
################################################################################
# Generate pkg-config file
################################################################################
add_subdirectory(include)
foreach(inc ${LIBBLADERF_INCLUDE_DIR})
list(APPEND LIBBLADERF_PC_CFLAGS "-I${inc}")
endforeach()
foreach(lib ${LIBBLADERF_LIBRARY_DIRS})
list(APPEND LIBBLADERF_PC_PRIV_LIBS "-L${lib}")
endforeach()
set(LIBBLADERF_PC_PREFIX ${CMAKE_INSTALL_PREFIX})
set(LIBBLADERF_PC_EXEC_PREFIX \${prefix})
set(LIBBLADERF_PC_LIBDIR \${exec_prefix}/${CMAKE_INSTALL_LIBDIR})
set(LIBBLADERF_PC_INCLUDEDIR \${prefix}/include)
set(LIBBLADERF_PC_VERSION ${VERSION})
set(LIBBLADERF_PC_LIBS "-lbladeRF")
# Use space-delimiter in the .pc file, rather than CMake's semicolon separator
string(REPLACE ";" " " LIBBLADERF_PC_CFLAGS "${LIBBLADERF_PC_CFLAGS}")
string(REPLACE ";" " " LIBBLADERF_PC_LIBS "${LIBBLADERF_PC_LIBS}")
# Unset these to avoid hard-coded paths in a cross-environment
if(CMAKE_CROSSCOMPILING)
unset(LIBBLADERF_PC_CFLAGS)
unset(LIBBLADERF_PC_LIBS)
endif()
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/libbladeRF.pc.in
${CMAKE_CURRENT_BINARY_DIR}/libbladeRF.pc
@ONLY
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/libbladeRF.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig/
)
################################################################################
# Library installation information
################################################################################
install(TARGETS libbladerf_shared
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # .so/.dylib
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # .a/.lib
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR} # .dll
)
################################################################################
# Informational output
################################################################################
message(STATUS "libbladeRF version: ${VERSION_INFO}")
################################################################################
# Library tests
################################################################################
add_subdirectory(tests)
################################################################################
# Doxygen documentation
################################################################################
if(BUILD_LIBBLADERF_DOCUMENTATION)
find_package(Doxygen)
if(DOXYGEN_FOUND)
message(STATUS "Configured to build libbladeRF API documentation.")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/doc/doxygen/Doxyfile.in
${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen/Doxyfile
@ONLY
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen/html/index.html
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen/Doxyfile ${CMAKE_CURRENT_SOURCE_DIR}/include/libbladeRF.h
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen
COMMENT "Generating libbladeRF API documentation via Doxygen in: ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen"
)
add_custom_target(libbladeRF-doxygen ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen/html/index.html)
else(DOXYGEN_FOUND)
message(FATAL_ERROR "Could not find Doxygen. Unable to build libbladeRF API documentation.")
endif(DOXYGEN_FOUND)
endif(BUILD_LIBBLADERF_DOCUMENTATION)