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