• 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 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