• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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