• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1if(NOT CMAKE_BUILD_TYPE)
2  message(
3    FATAL_ERROR
4      "Please specify the build type -DCMAKE_BUILD_TYPE=Debug|Release|RelWithDebInfo"
5  )
6endif()
7
8set(MODULES util jql jbi)
9set(PROJECT_LLIBRARIES)
10set(PROJECT_INCLUDE_DIRS)
11set(ALL_SRC)
12set(ALL_HDRS)
13set(PUB_HDRS)
14set(PROJECT_GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
15
16list(APPEND PROJECT_INCLUDE_DIRS "${PROJECT_GENERATED_DIR}"
17     "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/include")
18
19if(APPLE)
20  option(BUILD_FRAMEWORK "Build an OS X framework" OFF)
21  set(FRAMEWORK_INSTALL_DIR
22      "/Library/Frameworks"
23      CACHE STRING "Directory to install frameworks to.")
24endif()
25
26if(APPLE)
27  set(STRIP_CMD strip -x)
28else()
29  set(STRIP_CMD ${CMAKE_STRIP} -s)
30endif()
31
32include(CheckIncludeFile)
33include(CheckIncludeFiles)
34include(CheckLibraryExists)
35include(TestBigEndian)
36
37find_package(Threads REQUIRED CMAKE_THREAD_PREFER_PTHREAD)
38if(CMAKE_USE_WIN32_THREADS_INIT)
39  add_definitions(-DJB_WIN32_THREADS)
40elseif(CMAKE_USE_PTHREADS_INIT)
41  add_definitions(-DJB_PTHREADS)
42else()
43  mesage(FATAL_ERROR "Unable to find suitable threading library")
44endif(CMAKE_USE_WIN32_THREADS_INIT)
45
46include(AddIOWOW)
47
48if(ENABLE_HTTP)
49  if(WIN32)
50    message(FATAL_ERROR "ENABLE_HTTP option cannot be used in Windows build")
51  endif()
52  include(AddIWNET)
53  add_definitions(-DJB_HTTP)
54  list(APPEND MODULES jbr)
55endif()
56
57if((CMAKE_BUILD_TYPE EQUAL Release) OR (CMAKE_BUILD_TYPE EQUAL RelWithDebInfo))
58  add_definition(-DJB_RELEASE=1)
59endif()
60
61include(TestQsortR)
62if(HAVE_QSORT_R)
63  add_definitions(-DJB_HAVE_QSORT_R)
64endif()
65
66test_big_endian(IS_BIG_ENDIAN)
67if(IS_BIG_ENDIAN EQUAL 1)
68  add_definitions(-DIW_BIGENDIAN=1)
69endif()
70
71if(CMAKE_SIZEOF_VOID_P MATCHES 8)
72  add_definitions(-DIW_64)
73else()
74  add_definitions(-DIW_32)
75endif()
76
77if(BUILD_TESTS)
78  add_definitions(-DIW_TESTS)
79endif()
80
81if(ANDROID)
82  find_library(LOG_LIB log)
83  if(NOT LOG_LIB)
84    message(FATAL_ERROR "Library 'log' not FOUND")
85  endif()
86  list(APPEND PROJECT_LLIBRARIES "${LOG_LIB}")
87endif()
88
89if(NOT WIN32)
90  list(APPEND PROJECT_LLIBRARIES ${CMAKE_THREAD_LIBS_INIT})
91else()
92  include(Win32LIBTools)
93  check_include_file(windows.h HAVE_WINDOWS_H)
94  if(NOT HAVE_WINDOWS_H)
95    message(FATAL_ERROR "Unable to find windows.h include file")
96  endif()
97
98  set(IBERTY_FIND_REQUIRED ON)
99  include(FindLibIberty)
100  list(APPEND PROJECT_LLIBRARIES ${IBERTY_LIBRARIES})
101
102  check_library_exists(winpthread pthread_exit "" HAVE_WINPTHREAD)
103  if(NOT HAVE_WINPTHREAD)
104    message(FATAL_ERROR "Unable to winpthread lib")
105  endif()
106  list(INSERT PROJECT_LLIBRARIES 0 -lwinpthread)
107  add_definitions(-D_POSIX_THREAD_SAFE_FUNCTIONS)
108endif()
109
110if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
111  # Needed by Linux in order to use nftw() but fail to build on FreeBSD due to
112  # __BSD_VISIBLE define state.
113  add_definitions(-D_XOPEN_SOURCE=700)
114endif()
115add_definitions(-D_DEFAULT_SOURCE)
116add_definitions(-D_LARGEFILE_SOURCE)
117add_definitions(-D_FILE_OFFSET_BITS=64)
118if(APPLE)
119  add_definitions(-D_DARWIN_C_SOURCE)
120endif(APPLE)
121
122file(GLOB ROOT_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.c)
123list(APPEND ALL_SRC ${ROOT_SRC})
124
125foreach(MODULE IN LISTS MODULES)
126  file(GLOB MODULE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/*.c)
127  file(GLOB MODULE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/*.h)
128  list(APPEND ALL_SRC ${MODULE_SRC})
129  list(APPEND ALL_HDRS ${MODULE_HDRS})
130  list(APPEND PROJECT_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE})
131endforeach(MODULE)
132
133list(APPEND PUB_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/ejdb2.h
134     ${CMAKE_CURRENT_SOURCE_DIR}/jbr/jbr.h
135     ${CMAKE_CURRENT_SOURCE_DIR}/jql/jql.h)
136
137set(CMAKE_C_FLAGS
138    "${CMAKE_C_FLAGS} -std=gnu11 -fsigned-char -Wfatal-errors -Wall -Wextra \
139                  -Wno-sign-compare -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-function \
140                  -Wno-missing-field-initializers -Wno-missing-braces")
141
142if(APPLE)
143  set("${CMAKE_C_FLAGS} -Wno-shorten-64-to-32")
144endif()
145
146if(NOT WIN32)
147  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-fallthrough -fPIC")
148else()
149  add_definitions(-D__USE_MINGW_ANSI_STDIO)
150  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-pedantic-ms-format")
151  set(CMAKE_EXE_LINKER_FLAGS
152      "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
153endif()
154
155if(ASAN)
156  set(CMAKE_C_ASAN "-fsanitize=address -fno-omit-frame-pointer")
157endif()
158
159set(CMAKE_C_FLAGS_DEBUG
160    "${CMAKE_C_ASAN} -O0 -g -ggdb -Werror -DDEBUG -D_DEBUG -UNDEBUG -Wno-unused-variable"
161)
162set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_ASAN} -O3 -DNDEBUG")
163# set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-Wl,-s")
164set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
165set(CMAKE_C_FLAGS_RELEASEWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
166
167if(CMAKE_COMPILER_IS_GNUCC)
168  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
169endif()
170
171configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tmpl/ejdb2cfg.h
172               ${PROJECT_GENERATED_DIR}/ejdb2cfg.h)
173file(GLOB PROJECT_GENERATED_HDRS ${PROJECT_GENERATED_DIR}/*.h)
174list(APPEND ALL_HDRS ${PROJECT_GENERATED_HDRS})
175
176set(PCLIBS "-liowow -lm")
177if(DEFINED IWNET_INCLUDE_DIR)
178  set(PCLIBS "-liwnet ${PCLIBS}")
179endif()
180
181configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tmpl/libejdb2.pc.in
182               ${PROJECT_GENERATED_DIR}/libejdb2.pc @ONLY)
183
184if(DO_INSTALL_CORE)
185  install(FILES ${PROJECT_GENERATED_DIR}/libejdb2.pc
186          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
187endif()
188
189list(REMOVE_DUPLICATES PROJECT_LLIBRARIES)
190list(REMOVE_DUPLICATES PROJECT_INCLUDE_DIRS)
191include_directories(${PROJECT_INCLUDE_DIRS})
192
193foreach(MODULE IN LISTS MODULES)
194  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/CMakeLists.txt)
195    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE})
196  endif()
197  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tools/CMakeLists.txt)
198    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tools)
199  endif()
200  if(BUILD_TESTS AND EXISTS
201                     ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tests/CMakeLists.txt)
202    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tests)
203  endif()
204  if(BUILD_EXAMPLES
205     AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/examples/CMakeLists.txt)
206    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/examples)
207  endif()
208  if(BUILD_BENCHMARKS
209     AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/benchmark/CMakeLists.txt)
210    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/benchmark)
211  endif()
212endforeach(MODULE)
213
214if(ENABLE_HTTP)
215  add_subdirectory(jbs)
216endif()
217
218if(BUILD_TESTS)
219  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests)
220endif()
221
222if(BUILD_EXAMPLES)
223  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/examples)
224endif()
225
226if(BUILD_DART_BINDING)
227  add_subdirectory(bindings/ejdb2_dart)
228endif()
229
230if(BUILD_JNI_BINDING)
231  add_subdirectory(bindings/ejdb2_jni)
232endif()
233
234if(BUILD_NODEJS_BINDING)
235  add_subdirectory(bindings/ejdb2_node)
236endif()
237
238if(BUILD_ANDROID_LIBS)
239  add_subdirectory(bindings/ejdb2_android)
240endif()
241
242if(BUILD_REACT_NATIVE_BINDING)
243  add_subdirectory(bindings/ejdb2_react_native)
244endif()
245
246if(BUILD_FLUTTER_BINDING)
247  add_subdirectory(bindings/ejdb2_flutter)
248endif()
249
250if(BUILD_SWIFT_BINDING)
251  add_subdirectory(bindings/ejdb2_swift)
252endif()
253
254if(NOT BUILD_SHARED_LIBS)
255  add_definitions(-DIW_NODLL)
256  add_library(ejdb2 STATIC ${ALL_SRC})
257  add_library(ejdb2_s ALIAS ejdb2)
258else()
259  add_library(ejdb2 SHARED ${ALL_SRC})
260  add_library(ejdb2_s STATIC ${ALL_SRC})
261endif()
262
263target_link_libraries(ejdb2 PUBLIC ${PROJECT_LLIBRARIES})
264if(BUILD_SHARED_LIBS)
265  target_link_libraries(ejdb2_s PUBLIC ${PROJECT_LLIBRARIES})
266endif()
267
268if(BUILD_SHARED_LIBS)
269  if(WIN32)
270    add_dependencies(ejdb2 wintools_init)
271    set_target_properties(ejdb2 PROPERTIES LINK_FLAGS
272                                           "-Wl,--output-def,libejdb2.def")
273    add_w32_importlib(ejdb2 libejdb2 ${CMAKE_CURRENT_BINARY_DIR})
274
275    if(DO_INSTALL_CORE)
276      install(
277        FILES ${CMAKE_CURRENT_BINARY_DIR}/libejdb2.def
278              ${CMAKE_CURRENT_BINARY_DIR}/libejdb2.lib
279              ${CMAKE_CURRENT_BINARY_DIR}/libejdb2.exp
280        DESTINATION ${CMAKE_INSTALL_LIBDIR})
281    endif()
282  endif()
283
284  set_target_properties(
285    ejdb2
286    PROPERTIES VERSION ${PROJECT_VERSION}
287               SOVERSION ${PROJECT_VERSION_MAJOR}
288               PUBLIC_HEADER "${PUB_HDRS}"
289               DEFINE_SYMBOL IW_API_EXPORTS)
290
291  if(CMAKE_BUILD_TYPE STREQUAL "Release")
292    add_custom_command(
293      TARGET ejdb2
294      POST_BUILD
295      COMMAND ${STRIP_CMD} $<TARGET_FILE:ejdb2>)
296  endif()
297
298  set_target_properties(
299    ejdb2_s
300    PROPERTIES VERSION ${PROJECT_VERSION}
301               COMPILE_FLAGS "-DIW_STATIC"
302               OUTPUT_NAME ejdb2-${PROJECT_VERSION_MAJOR})
303else()
304
305  set_target_properties(
306    ejdb2
307    PROPERTIES VERSION ${PROJECT_VERSION}
308               PUBLIC_HEADER "${PUB_HDRS}"
309               COMPILE_FLAGS "-DIW_STATIC"
310               LINK_FLAGS_RELEASE "${LINK_FLAGS_RELEASE} -s"
311               OUTPUT_NAME ejdb2-${PROJECT_VERSION_MAJOR})
312endif()
313
314if(DO_INSTALL_CORE)
315  include(InstallRequiredSystemLibraries)
316  install(
317    TARGETS ejdb2
318    EXPORT ejdb2-exports
319    FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}
320    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
321    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
322    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
323    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
324  install(EXPORT ejdb2-exports
325          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME})
326endif()
327
328if(BUILD_SHARED_LIBS AND DO_INSTALL_CORE)
329  install(
330    TARGETS ejdb2_s
331    EXPORT ejdb2-static-exports
332    FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR}
333    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
334    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
335    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
336    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
337  install(EXPORT ejdb2-static-exports
338          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME})
339endif()
340
341if(DO_INSTALL_CORE)
342  if(INSTALL_FLAT_SUBPROJECT_INCLUDES)
343    set(INCLUDES_DEST ${CMAKE_INSTALL_INCLUDEDIR})
344  else()
345    set(INCLUDES_DEST ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
346  endif()
347
348  if(DEFINED IWNET_INCLUDE_DIR)
349    install(
350      DIRECTORY ${IWNET_INCLUDE_DIR}/iwnet
351      DESTINATION ${INCLUDES_DEST}
352      COMPONENT headers
353      FILES_MATCHING
354      PATTERN "*.h")
355  endif()
356
357  install(
358    DIRECTORY ${IOWOW_INCLUDE_DIR}/iowow
359    DESTINATION ${INCLUDES_DEST}
360    COMPONENT headers
361    FILES_MATCHING
362    PATTERN "*.h")
363
364  install(FILES ${CMAKE_SOURCE_DIR}/LICENSE ${CMAKE_SOURCE_DIR}/Changelog
365          DESTINATION ${CMAKE_INSTALL_DOCDIR})
366  install(
367    FILES ${CMAKE_SOURCE_DIR}/README.md
368    RENAME README
369    DESTINATION ${CMAKE_INSTALL_DOCDIR})
370
371  export(EXPORT ejdb2-exports)
372  if(BUILD_SHARED_LIBS)
373    export(EXPORT ejdb2-static-exports)
374  endif(BUILD_SHARED_LIBS)
375
376endif()
377
378set(${PROJECT_NAME}_PUB_HDRS
379    ${PUB_HDRS}
380    CACHE INTERNAL "${PROJECT_NAME}: Public headers" FORCE)
381set(${PROJECT_NAME}_INCLUDE_DIRS
382    ${PROJECT_INCLUDE_DIRS}
383    CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
384
385message("")
386message("CMAKE_GENERATOR: ${CMAKE_GENERATOR}")
387message("${PROJECT_NAME} LINK LIBS: ${PROJECT_LLIBRARIES}")
388message("${PROJECT_NAME} ASAN: ${ASAN}")
389message("\n${PROJECT_NAME} INCLUDE DIRS: ${PROJECT_INCLUDE_DIRS}")
390message("\n${PROJECT_NAME} SOURCES: ${ALL_SRC}")
391message("\n${PROJECT_NAME} PUB_HDRS: ${PUB_HDRS}")
392message("\n${PROJECT_NAME} CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
393message("${PROJECT_NAME} ANDROID_ABIS: ${ANDROID_ABIS}")
394message("${PROJECT_NAME} ENABLE_HTTP: ${ENABLE_HTTP}")
395message("${PROJECT_NAME} BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}")
396message("${PROJECT_NAME} BUILD_TESTS: ${BUILD_TESTS}")
397message("${PROJECT_NAME} BUILD_EXAMPLES: ${BUILD_EXAMPLES}")
398message("${PROJECT_NAME} BUILD_BENCHMARKS: ${BUILD_BENCHMARKS}")
399message("${PROJECT_NAME} BUILD_DART_BINDING: ${BUILD_DART_BINDING}")
400message("${PROJECT_NAME} BUILD_ANDROID_LIBS: ${BUILD_ANDROID_LIBS}")
401message("${PROJECT_NAME} BUILD_JNI_BINDING: ${BUILD_JNI_BINDING}")
402message("${PROJECT_NAME} BUILD_NODEJS_BINDING: ${BUILD_NODEJS_BINDING}")
403message(
404  "${PROJECT_NAME} BUILD_REACT_NATIVE_BINDING: ${BUILD_REACT_NATIVE_BINDING}")
405message("${PROJECT_NAME} BUILD_FLUTTER_BINDING: ${BUILD_FLUTTER_BINDING}")
406message("${PROJECT_NAME} BUILD_SWIFT_BINDING: ${BUILD_SWIFT_BINDING}")
407