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