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