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