1include(CheckSymbolExists) 2 3if (NOT CMAKE_BUILD_TYPE) 4 message(FATAL_ERROR "Please specify the build type -DCMAKE_BUILD_TYPE=Debug|Release|RelWithDebInfo") 5endif() 6 7set(MODULES log utils platform fs rdb re json kv) 8 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 "/Library/Frameworks" CACHE STRING "Directory to install frameworks to.") 21endif() 22 23include(CheckIncludeFile) 24include(CheckIncludeFiles) 25include(CheckLibraryExists) 26include(TestBigEndian) 27include(TestQsortR) 28 29if (OWNER_PROJECT_NAME) 30 set(IW_PUBLIC_HEADER_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${OWNER_PROJECT_NAME}/${PROJECT_NAME}) 31else() 32 set(IW_PUBLIC_HEADER_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) 33endif() 34 35if ((CMAKE_BUILD_TYPE EQUAL Release) OR (CMAKE_BUILD_TYPE EQUAL RelWithDebInfo)) 36 add_definition(-DIW_RELEASE) 37endif() 38 39TEST_BIG_ENDIAN(IS_BIG_ENDIAN) 40if (IS_BIG_ENDIAN EQUAL 1) 41 add_definitions(-DIW_BIGENDIAN) 42endif() 43 44if (HAVE_QSORT_R) 45 add_definitions(-DIW_HAVE_QSORT_R) 46endif() 47 48if(CMAKE_SIZEOF_VOID_P MATCHES 8) 49 add_definitions(-DIW_64) 50else() 51 add_definitions(-DIW_32) 52endif() 53 54if (BUILD_TESTS) 55 add_definitions(-DIW_TESTS=1) 56endif() 57 58find_package(Threads REQUIRED CMAKE_THREAD_PREFER_PTHREAD) 59if (CMAKE_USE_WIN32_THREADS_INIT) 60 add_definitions(-DIW_WIN32_THREADS) 61elseif (CMAKE_USE_PTHREADS_INIT) 62 add_definitions(-DIW_PTHREADS) 63 check_library_exists(pthread pthread_condattr_setclock "" HAVE_PTHREAD_CONDATTR_SETCLOCK) 64 if (HAVE_PTHREAD_CONDATTR_SETCLOCK AND NOT IOS) 65 add_definitions(-DIW_HAVE_PTHREAD_CONDATTR_SETCLOCK) 66 endif() 67else() 68 mesage(FATAL_ERROR "Unable to find suitable threading library") 69endif(CMAKE_USE_WIN32_THREADS_INIT) 70 71if (ANDROID) 72 find_library(LOG_LIB log) 73 if (NOT LOG_LIB) 74 message(FATAL_ERROR "Library 'log' not FOUND") 75 endif() 76 list(APPEND PROJECT_LLIBRARIES "${LOG_LIB}") 77endif() 78 79if (NOT WIN32) 80 list(APPEND PROJECT_LLIBRARIES ${CMAKE_THREAD_LIBS_INIT}) 81else() 82 include(Win32LIBTools) 83 check_include_file(windows.h HAVE_WINDOWS_H) 84 if (NOT HAVE_WINDOWS_H) 85 message(FATAL_ERROR "Unable to find windows.h include file") 86 endif() 87 88 set(IBERTY_FIND_REQUIRED ON) 89 include(FindLibIberty) 90 list(APPEND PROJECT_LLIBRARIES ${IBERTY_LIBRARIES}) 91 92 check_library_exists(winpthread pthread_exit "" HAVE_WINPTHREAD) 93 if (NOT HAVE_WINPTHREAD) 94 message(FATAL_ERROR "Unable to winpthread lib") 95 endif() 96 list(INSERT PROJECT_LLIBRARIES 0 -lwinpthread) 97 add_definitions(-D_POSIX_THREAD_SAFE_FUNCTIONS) 98endif() 99 100if (CMAKE_SYSTEM_PROCESSOR MATCHES "mips") 101 include(FindAtomic) 102 if (ATOMIC_FOUND) 103 list(APPEND PROJECT_LLIBRARIES "${ATOMIC_LIBRARY}") 104 endif() 105endif() 106 107list(APPEND PROJECT_LLIBRARIES "-lm") 108 109check_symbol_exists(CLOCK_MONOTONIC time.h HAVE_CLOCK_MONOTONIC) 110if (HAVE_CLOCK_MONOTONIC) 111 add_definitions(-DIW_HAVE_CLOCK_MONOTONIC) 112endif() 113 114foreach(HF IN ITEMS stdlib stddef stdint stdbool stdatomic unistd dirent) 115 string(TOUPPER "${HF}" UHF) 116 check_include_file(${HF}.h "IW_HAVE_${UHF}") 117 if (NOT IW_HAVE_${UHF}) 118 message(FATAL_ERROR "Include file '${HF}.h' not FOUND") 119 endif() 120endforeach(HF) 121 122if (CMAKE_SYSTEM_NAME STREQUAL "Linux") 123 # Needed by Linux in order to use nftw() but fail to build on FreeBSD due to __BSD_VISIBLE define state. 124add_definitions(-D_XOPEN_SOURCE=700) 125endif() 126add_definitions(-D_DEFAULT_SOURCE) 127add_definitions(-D_LARGEFILE_SOURCE) 128add_definitions(-D_FILE_OFFSET_BITS=64) 129if(APPLE) 130 add_definitions(-D_DARWIN_C_SOURCE) 131endif(APPLE) 132 133 134list(APPEND ALL_SRC ${CMAKE_CURRENT_SOURCE_DIR}/iowow.c) 135 136foreach(MODULE IN LISTS MODULES) 137 file(GLOB MODULE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/*.c) 138 file(GLOB MODULE_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/*.h) 139 list(APPEND ALL_SRC ${MODULE_SRC}) 140 list(APPEND ALL_HDRS ${MODULE_HDRS}) 141 list(APPEND PROJECT_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}) 142endforeach(MODULE) 143 144list(APPEND PUB_HDRS ${CMAKE_CURRENT_SOURCE_DIR}/basedefs.h 145 ${CMAKE_CURRENT_SOURCE_DIR}/fs/iwdlsnr.h 146 ${CMAKE_CURRENT_SOURCE_DIR}/fs/iwexfile.h 147 ${CMAKE_CURRENT_SOURCE_DIR}/fs/iwfile.h 148 ${CMAKE_CURRENT_SOURCE_DIR}/fs/iwfsmfile.h 149 ${CMAKE_CURRENT_SOURCE_DIR}/iowow.h 150 ${CMAKE_CURRENT_SOURCE_DIR}/kv/iwkv.h 151 ${CMAKE_CURRENT_SOURCE_DIR}/log/iwlog.h 152 ${CMAKE_CURRENT_SOURCE_DIR}/platform/iwp.h 153 ${CMAKE_CURRENT_SOURCE_DIR}/rdb/iwrdb.h 154 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwarr.h 155 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwbits.h 156 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwconv.h 157 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwhmap.h 158 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwpool.h 159 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwstw.h 160 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwth.h 161 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwutils.h 162 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwuuid.h 163 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwxstr.h 164 ${CMAKE_CURRENT_SOURCE_DIR}/utils/murmur3.h 165 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwtp.h 166 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwrb.h 167 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwini.h 168 ${CMAKE_CURRENT_SOURCE_DIR}/utils/utf8proc.h 169 ${CMAKE_CURRENT_SOURCE_DIR}/utils/iwavl.h 170 ${CMAKE_CURRENT_SOURCE_DIR}/re/iwre.h 171 ${CMAKE_CURRENT_SOURCE_DIR}/json/iwjson.h 172 ${CMAKE_CURRENT_SOURCE_DIR}/json/iwjson_internal.h 173 ${CMAKE_CURRENT_SOURCE_DIR}/json/iwbinn.h 174 ) 175 176list(REMOVE_DUPLICATES PROJECT_LLIBRARIES) 177list(REMOVE_DUPLICATES PROJECT_INCLUDE_DIRS) 178include_directories(${PROJECT_INCLUDE_DIRS}) 179 180# -pg -no-pie 181set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ 182 -std=gnu11 -fsigned-char -pedantic \ 183 -Wfatal-errors -Wall -Wextra \ 184 -Wno-sign-compare -Wno-unused-parameter \ 185 -Wno-implicit-fallthrough -Wno-unknown-pragmas -Wno-unused-function -Wno-missing-field-initializers \ 186 -Wno-missing-braces") 187if (APPLE) 188 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-shorten-64-to-32") 189endif() 190 191 192if (NOT WIN32) ## todo review 193 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") 194else() 195 add_definitions(-D__USE_MINGW_ANSI_STDIO) 196 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-pedantic-ms-format") 197 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++") 198endif() 199 200if (ASAN) 201 set(CMAKE_C_ASAN "-fsanitize=address -fno-omit-frame-pointer") 202elseif (UBSAN) 203 set(CMAKE_C_ASAN "-fsanitize=undefined -fno-omit-frame-pointer") 204endif() 205 206set(CMAKE_C_FLAGS_DEBUG "-O0 -g -ggdb -Werror -DDEBUG -D_DEBUG -UNDEBUG \ 207 -Wno-unused-variable ${CMAKE_C_ASAN}") 208set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG ${CMAKE_C_ASAN}") 209set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g") 210set(CMAKE_C_FLAGS_RELEASEWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") 211 212if (CMAKE_COMPILER_IS_GNUCXX) 213 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") 214endif() 215 216if (CMAKE_COMPILER_IS_GNUCC) 217 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") 218endif(CMAKE_COMPILER_IS_GNUCC) 219 220configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tmpl/iwcfg.h ${PROJECT_GENERATED_DIR}/iwcfg.h) 221file(GLOB PROJECT_GENERATED_HDRS ${PROJECT_GENERATED_DIR}/*.h) 222list(APPEND ALL_HDRS ${PROJECT_GENERATED_HDRS}) 223 224configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tmpl/libiowow.pc.in ${PROJECT_GENERATED_DIR}/libiowow.pc @ONLY) 225 226if (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") 227 install(FILES ${PROJECT_GENERATED_DIR}/libiowow.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}data/pkgconfig) 228else() 229 install(FILES ${PROJECT_GENERATED_DIR}/libiowow.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) 230endif() 231 232foreach(MODULE IN LISTS MODULES) 233 if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/CMakeLists.txt) 234 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}) 235 endif() 236 if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tools/CMakeLists.txt) 237 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tools) 238 endif() 239 if (BUILD_TESTS AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tests/CMakeLists.txt) 240 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/tests) 241 endif() 242 if (BUILD_EXAMPLES AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/examples/CMakeLists.txt) 243 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/examples) 244 endif() 245 if (BUILD_BENCHMARKS AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/benchmark/CMakeLists.txt) 246 add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}/benchmark) 247 endif() 248endforeach(MODULE) 249 250if (NOT BUILD_SHARED_LIBS) 251 add_definitions(-DIW_NODLL) 252 add_library(iowow STATIC ${ALL_SRC}) 253 add_library(iowow_s ALIAS iowow) 254else() 255 add_library(iowow SHARED ${ALL_SRC}) 256 add_library(iowow_s STATIC ${ALL_SRC}) 257endif() 258 259target_link_libraries(iowow ${PROJECT_LLIBRARIES}) 260if (BUILD_SHARED_LIBS) 261 target_link_libraries(iowow_s ${PROJECT_LLIBRARIES}) 262endif() 263 264if (BUILD_SHARED_LIBS) 265 if (WIN32) 266 add_dependencies(iowow wintools_init) 267 set_target_properties(iowow PROPERTIES LINK_FLAGS "-Wl,--output-def,libiowow.def") 268 add_w32_importlib(iowow libiowow ${CMAKE_CURRENT_BINARY_DIR}) 269 install(FILES 270 ${CMAKE_CURRENT_BINARY_DIR}/libiowow.def 271 ${CMAKE_CURRENT_BINARY_DIR}/libiowow.lib 272 ${CMAKE_CURRENT_BINARY_DIR}/libiowow.exp 273 DESTINATION ${CMAKE_INSTALL_LIBDIR}) 274 endif(WIN32) 275 276 set_target_properties(iowow PROPERTIES 277 VERSION ${PROJECT_VERSION} 278 SOVERSION ${PROJECT_VERSION_MAJOR} 279 PUBLIC_HEADER "${PUB_HDRS}" 280 DEFINE_SYMBOL IW_API_EXPORTS) 281 282 set_target_properties(iowow_s PROPERTIES 283 VERSION ${PROJECT_VERSION} 284 COMPILE_FLAGS "-DIW_NODLL" 285 OUTPUT_NAME iowow-${PROJECT_VERSION_MAJOR}) 286else() 287 288 set_target_properties(iowow PROPERTIES 289 VERSION ${PROJECT_VERSION} 290 PUBLIC_HEADER "${PUB_HDRS}" 291 COMPILE_FLAGS "-DIW_NODLL" 292 OUTPUT_NAME iowow-${PROJECT_VERSION_MAJOR}) 293endif(BUILD_SHARED_LIBS) 294 295install(TARGETS iowow 296 EXPORT iowow-exports 297 FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} 298 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 299 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 300 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 301 PUBLIC_HEADER DESTINATION ${IW_PUBLIC_HEADER_DESTINATION}) 302 303install(EXPORT iowow-exports 304 DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}) 305 306if (BUILD_SHARED_LIBS) 307 install(TARGETS iowow_s 308 EXPORT iowow-static-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 ${IW_PUBLIC_HEADER_DESTINATION}) 314 315 install(EXPORT iowow-static-exports 316 DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}) 317endif() 318 319 320install(FILES 321 ${CMAKE_SOURCE_DIR}/LICENSE 322 ${CMAKE_SOURCE_DIR}/Changelog 323 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 324install(FILES 325 ${CMAKE_SOURCE_DIR}/README.md 326 RENAME README 327 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 328 329if (CMAKE_VERSION VERSION_GREATER 3.0) 330 export(EXPORT iowow-exports) 331 if (BUILD_SHARED_LIBS) 332 export(EXPORT iowow-static-exports) 333 endif(BUILD_SHARED_LIBS) 334else() 335 export(TARGETS iowow FILE iowow-exports.cmake) 336 if (BUILD_SHARED_LIBS) 337 export(TARGETS iowow_s FILE iowow-static-exports.cmake) 338 endif(BUILD_SHARED_LIBS) 339endif() 340 341include(InstallRequiredSystemLibraries) 342 343set(${PROJECT_NAME}_PUB_HDRS ${PUB_HDRS} 344 CACHE INTERNAL "${PROJECT_NAME}: Public headers" FORCE) 345set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_INCLUDE_DIRS} 346 CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE) 347 348message("") 349message("${PROJECT_NAME} LINK LIBS: ${PROJECT_LLIBRARIES}") 350message("\n${PROJECT_NAME} INCLUDE DIRS: ${PROJECT_INCLUDE_DIRS}") 351message("\n${PROJECT_NAME} SOURCES: ${ALL_SRC}") 352message("\n${PROJECT_NAME} PUB_HDRS: ${PUB_HDRS}") 353message("\n${PROJECT_NAME} CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") 354message("${PROJECT_NAME} BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") 355message("${PROJECT_NAME} BUILD_TESTS: ${BUILD_TESTS}") 356message("${PROJECT_NAME} CMAKE_C_ASAN: ${CMAKE_C_ASAN}") 357message("${PROJECT_NAME} BUILD_EXAMPLES: ${BUILD_EXAMPLES}") 358message("${PROJECT_NAME} BUILD_BENCHMARKS: ${BUILD_BENCHMARKS}") 359message("${PROJECT_NAME} BUILD_DOCUMENTATION: ${BUILD_DOCUMENTATION}") 360message("${PROJECT_NAME} PUBLIC_HEADER_DESTINATION: ${IW_PUBLIC_HEADER_DESTINATION}") 361