2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR)
4 SET(LIBUCL_VERSION_MAJOR 0)
5 SET(LIBUCL_VERSION_MINOR 5)
6 SET(LIBUCL_VERSION_PATCH 0)
9 "${LIBUCL_VERSION_MAJOR}.${LIBUCL_VERSION_MINOR}.${LIBUCL_VERSION_PATCH}")
11 INCLUDE(CheckCCompilerFlag)
12 INCLUDE(CheckCSourceCompiles)
14 INCLUDE(GNUInstallDirs)
16 OPTION(ENABLE_URL_INCLUDE "Enable urls in ucl includes (requires libcurl or libfetch) [default: OFF]" OFF)
17 OPTION(ENABLE_URL_SIGN "Enable signatures check in ucl includes (requires openssl) [default: OFF]" OFF)
18 OPTION(BUILD_SHARED_LIBS "Build Shared Libraries [default: OFF]" OFF)
19 OPTION(ENABLE_LUA "Enable lua support [default: OFF]" OFF)
20 OPTION(ENABLE_LUAJIT "Enable luajit support [default: OFF]" OFF)
21 OPTION(ENABLE_UTILS "Enable building utility binaries [default: OFF]" OFF)
23 # Find lua installation
26 UNSET(LUA_INCLUDE_DIR CACHE)
27 UNSET(LUA_LIBRARY CACHE)
28 CMAKE_PARSE_ARGUMENTS(LUA "" "VERSION_MAJOR;VERSION_MINOR;ROOT" "" ${ARGN})
30 IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
31 MESSAGE(FATAL_ERROR "Invalid FindLua invocation: ${ARGN}")
34 IF(ENABLE_LUAJIT MATCHES "ON")
35 MESSAGE(STATUS "Check for luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
36 FIND_PATH(LUA_INCLUDE_DIR luajit.h
38 "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
40 PATH_SUFFIXES "include/luajit-2.0"
41 "include/luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
42 "include/luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
43 "include/luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
45 "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
46 "include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
47 "include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
49 PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
51 FIND_LIBRARY(LUA_LIBRARY
55 "luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
56 "luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
57 "luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
59 "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
61 PATH_SUFFIXES lib64 lib
62 PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
66 IF(NOT LUA_LIBRARY OR NOT LUA_INCLUDE_DIR)
67 MESSAGE(STATUS "Fallback from luajit to plain lua")
68 SET(ENABLE_LUAJIT "OFF")
69 MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
70 FIND_PATH(LUA_INCLUDE_DIR lua.h
72 "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
74 PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
75 "include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
76 "include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
78 PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
80 FIND_LIBRARY(LUA_LIBRARY
82 "lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
83 "lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
84 "lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
86 "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
88 PATH_SUFFIXES lib64 lib
89 PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
93 ELSE(ENABLE_LUAJIT MATCHES "ON")
94 MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
95 FIND_PATH(LUA_INCLUDE_DIR lua.h
97 "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
99 PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
100 "include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
101 "include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
103 PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
105 FIND_LIBRARY(LUA_LIBRARY
107 "lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
108 "lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
109 "lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
111 "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
113 PATH_SUFFIXES lib64 lib
114 PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
117 ENDIF(ENABLE_LUAJIT MATCHES "ON")
119 IF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
121 IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
122 SET(LUA_VERSION_MAJOR ${LUA_VERSION_MAJOR})
123 SET(LUA_VERSION_MINOR ${LUA_VERSION_MINOR})
124 ENDIF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
125 IF(ENABLE_LUAJIT MATCHES "ON")
126 MESSAGE(STATUS "Found luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
127 ELSE(ENABLE_LUAJIT MATCHES "ON")
128 MESSAGE(STATUS "Found lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
129 ENDIF(ENABLE_LUAJIT MATCHES "ON")
130 ENDIF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
133 IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
134 LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt)
135 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
137 IF(ENABLE_URL_INCLUDE MATCHES "ON")
138 FIND_LIBRARY(LIBFETCH_LIBRARY NAMES fetch PATHS PATH_SUFFIXES lib64 lib
148 DOC "Path where the libfetch library can be found")
150 FIND_FILE(HAVE_FETCH_H NAMES fetch.h PATHS /usr/include
153 DOC "Path to libfetch header")
154 ELSE(LIBFETCH_LIBRARY)
155 # Try to find libcurl
158 MESSAGE(WARNING "Neither libcurl nor libfetch were found, no support of URL includes in configuration")
159 ENDIF(NOT CURL_FOUND)
160 ENDIF(LIBFETCH_LIBRARY)
161 ENDIF(ENABLE_URL_INCLUDE MATCHES "ON")
163 set(SYNC_BUILTINS_TEST_SOURCE [====[
168 __sync_bool_compare_and_swap(&val, 0, 1);
169 __sync_add_and_fetch(&val, 1);
170 __sync_fetch_and_add(&val, 0);
171 __sync_sub_and_fetch(&val, 1);
177 CHECK_C_SOURCE_COMPILES("${SYNC_BUILTINS_TEST_SOURCE}" HAVE_ATOMIC_BUILTINS)
178 IF(NOT HAVE_ATOMIC_BUILTINS)
179 MESSAGE(WARNING "Libucl references could be thread-unsafe because atomic builtins are missing")
180 ENDIF(NOT HAVE_ATOMIC_BUILTINS)
182 SET(CMAKE_C_WARN_FLAGS "")
183 CHECK_C_COMPILER_FLAG(-W SUPPORT_W)
184 CHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN)
185 CHECK_C_COMPILER_FLAG(-Wno-unused-parameter SUPPORT_WUNUSED_PARAMETER)
187 SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -W")
189 IF(SUPPORT_WPOINTER_SIGN)
190 SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-pointer-sign")
191 ENDIF(SUPPORT_WPOINTER_SIGN)
192 IF(SUPPORT_WUNUSED_PARAMETER)
193 SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-parameter")
194 ENDIF(SUPPORT_WUNUSED_PARAMETER)
196 SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_WARN_FLAGS}" )
198 IF(ENABLE_URL_SIGN MATCHES "ON")
201 INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}")
203 ENDIF(ENABLE_URL_SIGN MATCHES "ON")
205 SET(UCL_COMPILE_DEFS)
207 LIST(APPEND UCL_COMPILE_DEFS -DHAVE_FETCH_H=1)
210 LIST(APPEND UCL_COMPILE_DEFS -DCURL_FOUND=1)
213 LIST(APPEND UCL_COMPILE_DEFS -DHAVE_OPENSSL=1)
215 IF(HAVE_ATOMIC_BUILTINS)
216 LIST(APPEND UCL_COMPILE_DEFS -DHAVE_ATOMIC_BUILTINS=1)
217 ENDIF(HAVE_ATOMIC_BUILTINS)
219 SET(UCLSRC src/ucl_util.c
222 src/ucl_emitter_streamline.c
223 src/ucl_emitter_utils.c
229 SET(UCLHDR include/ucl.h
232 SET (LIB_TYPE STATIC)
233 IF (BUILD_SHARED_LIBS)
234 SET (LIB_TYPE SHARED)
235 ENDIF (BUILD_SHARED_LIBS)
236 ADD_LIBRARY(ucl ${LIB_TYPE} ${UCLSRC})
237 ADD_LIBRARY(ucl::ucl ALIAS ucl)
238 SET_TARGET_PROPERTIES(ucl PROPERTIES VERSION ${LIBUCL_VERSION} SOVERSION ${LIBUCL_VERSION_MAJOR})
239 TARGET_INCLUDE_DIRECTORIES(ucl
246 TARGET_COMPILE_DEFINITIONS(ucl
251 IF(ENABLE_LUA MATCHES "ON")
252 IF(ENABLE_LUAJIT MATCHES "ON")
253 FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}")
255 MESSAGE(FATAL_ERROR "Lua not found, lua support is required")
257 INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
259 ELSE(ENABLE_LUAJIT MATCHES "ON")
260 FindLua(VERSION_MAJOR "5" VERSION_MINOR "2" ROOT "${LUA_ROOT}")
262 FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}")
265 MESSAGE(FATAL_ERROR "Lua not found, lua support is required")
267 INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
269 ENDIF(ENABLE_LUAJIT MATCHES "ON")
270 SET(UCL_LUA_SRC lua/lua_ucl.c)
271 ADD_LIBRARY(lua-ucl ${LIB_TYPE} ${UCL_LUA_SRC})
272 ADD_LIBRARY(ucl::lua ALIAS lua-ucl)
273 IF(ENABLE_LUAJIT MATCHES "ON")
274 TARGET_LINK_LIBRARIES(lua-ucl "${LUAJIT_LIBRARY}")
275 ELSE(ENABLE_LUAJIT MATCHES "ON")
276 TARGET_LINK_LIBRARIES(lua-ucl "${LUA_LIBRARY}")
277 ENDIF(ENABLE_LUAJIT MATCHES "ON")
278 TARGET_LINK_LIBRARIES(lua-ucl ucl)
279 TARGET_INCLUDE_DIRECTORIES(lua-ucl PUBLIC include PRIVATE src uthash)
280 SET_TARGET_PROPERTIES(lua-ucl PROPERTIES
281 VERSION ${LIBUCL_VERSION}
282 SOVERSION ${LIBUCL_VERSION_MAJOR}
283 PUBLIC_HEADER include/lua_ucl.h)
284 INSTALL(TARGETS lua-ucl DESTINATION ${CMAKE_INSTALL_LIBDIR}
285 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
289 TARGET_LINK_LIBRARIES(ucl fetch)
292 TARGET_LINK_LIBRARIES(ucl ${CURL_LIBRARIES})
295 IF(ENABLE_URL_SIGN MATCHES "ON")
297 TARGET_LINK_LIBRARIES(ucl ${OPENSSL_LIBRARIES})
299 ENDIF(ENABLE_URL_SIGN MATCHES "ON")
302 TARGET_LINK_LIBRARIES(ucl -lm)
305 SET_TARGET_PROPERTIES(ucl PROPERTIES
306 PUBLIC_HEADER "${UCLHDR}")
308 INSTALL(TARGETS ucl DESTINATION ${CMAKE_INSTALL_LIBDIR}
309 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
311 IF(ENABLE_UTILS MATCHES "ON")
312 ADD_SUBDIRECTORY(utils)