1290067SbaptPROJECT(libucl C)
2290067SbaptCMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR)
3290067Sbapt
4290067SbaptSET(LIBUCL_VERSION_MAJOR 0)
5290067SbaptSET(LIBUCL_VERSION_MINOR 5)
6290067SbaptSET(LIBUCL_VERSION_PATCH 0)
7290067Sbapt
8290067SbaptSET(LIBUCL_VERSION
9290067Sbapt        "${LIBUCL_VERSION_MAJOR}.${LIBUCL_VERSION_MINOR}.${LIBUCL_VERSION_PATCH}")
10290067Sbapt
11290067SbaptINCLUDE(CheckCCompilerFlag)
12290067SbaptINCLUDE(FindOpenSSL)
13290067Sbapt
14290067SbaptOPTION(ENABLE_URL_INCLUDE  "Enable urls in ucl includes (requires libcurl or libfetch) [default: OFF]" OFF)
15290067SbaptOPTION(ENABLE_URL_SIGN  "Enable signatures check in ucl includes (requires openssl) [default: OFF]" OFF)
16290067SbaptOPTION(BUILD_SHARED_LIBS "Build Shared Libraries [default: OFF]" OFF)
17290067SbaptOPTION(ENABLE_LUA "Enable lua support [default: OFF]" OFF)
18290067SbaptOPTION(ENABLE_LUAJIT "Enable luajit support [default: OFF]" OFF)
19290067Sbapt
20290067Sbapt# Find lua installation
21290067SbaptMACRO(FindLua)
22290067Sbapt	# Find lua libraries
23290067Sbapt	UNSET(LUA_INCLUDE_DIR CACHE)
24290067Sbapt	UNSET(LUA_LIBRARY CACHE)
25290067Sbapt	CMAKE_PARSE_ARGUMENTS(LUA "" "VERSION_MAJOR;VERSION_MINOR;ROOT" "" ${ARGN})
26290067Sbapt
27290067Sbapt	IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
28290067Sbapt		MESSAGE(FATAL_ERROR "Invalid FindLua invocation: ${ARGN}")
29290067Sbapt	ENDIF()
30290067Sbapt
31290067Sbapt	IF(ENABLE_LUAJIT MATCHES "ON")
32290067Sbapt		MESSAGE(STATUS "Check for luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
33290067Sbapt		FIND_PATH(LUA_INCLUDE_DIR luajit.h
34290067Sbapt				HINTS
35290067Sbapt				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
36290067Sbapt				$ENV{LUA_DIR}
37290067Sbapt				PATH_SUFFIXES "include/luajit-2.0"
38290067Sbapt				"include/luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
39290067Sbapt				"include/luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
40290067Sbapt				"include/luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
41290067Sbapt				"include/luajit"
42290067Sbapt				"include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
43290067Sbapt				"include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
44290067Sbapt				"include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
45290067Sbapt				include/lua include
46290067Sbapt				PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
47290067Sbapt		)
48290067Sbapt		FIND_LIBRARY(LUA_LIBRARY
49290067Sbapt				NAMES luajit
50290067Sbapt				"luajit-2.0"
51290067Sbapt				"luajit2.0"
52290067Sbapt				"luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
53290067Sbapt				"luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
54290067Sbapt				"luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
55290067Sbapt				HINTS
56290067Sbapt				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
57290067Sbapt				$ENV{LUA_DIR}
58290067Sbapt				PATH_SUFFIXES lib64 lib
59290067Sbapt				PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
60290067Sbapt				DOC "Lua library"
61290067Sbapt		)
62290067Sbapt
63290067Sbapt		IF(NOT LUA_LIBRARY OR NOT LUA_INCLUDE_DIR)
64290067Sbapt			MESSAGE(STATUS "Fallback from luajit to plain lua")
65290067Sbapt			SET(ENABLE_LUAJIT "OFF")
66290067Sbapt			MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
67290067Sbapt			FIND_PATH(LUA_INCLUDE_DIR lua.h
68290067Sbapt					HINTS
69290067Sbapt					"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
70290067Sbapt					$ENV{LUA_DIR}
71290067Sbapt					PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
72290067Sbapt					"include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
73290067Sbapt					"include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
74290067Sbapt					include/lua include
75290067Sbapt					PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
76290067Sbapt			)
77290067Sbapt			FIND_LIBRARY(LUA_LIBRARY
78290067Sbapt					NAMES lua
79290067Sbapt					"lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
80290067Sbapt					"lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
81290067Sbapt					"lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
82290067Sbapt					HINTS
83290067Sbapt					"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
84290067Sbapt					$ENV{LUA_DIR}
85290067Sbapt					PATH_SUFFIXES lib64 lib
86290067Sbapt					PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
87290067Sbapt					DOC "Lua library"
88290067Sbapt			)
89290067Sbapt		ENDIF()
90290067Sbapt	ELSE(ENABLE_LUAJIT MATCHES "ON")
91290067Sbapt		MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
92290067Sbapt		FIND_PATH(LUA_INCLUDE_DIR lua.h
93290067Sbapt				HINTS
94290067Sbapt				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
95290067Sbapt				$ENV{LUA_DIR}
96290067Sbapt				PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
97290067Sbapt				"include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
98290067Sbapt				"include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
99290067Sbapt				include/lua include
100290067Sbapt				PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS}
101290067Sbapt		)
102290067Sbapt		FIND_LIBRARY(LUA_LIBRARY
103290067Sbapt				NAMES lua
104290067Sbapt				"lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}"
105290067Sbapt				"lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
106290067Sbapt				"lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}"
107290067Sbapt				HINTS
108290067Sbapt				"${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}"
109290067Sbapt				$ENV{LUA_DIR}
110290067Sbapt				PATH_SUFFIXES lib64 lib
111290067Sbapt				PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}
112290067Sbapt				DOC "Lua library"
113290067Sbapt		)
114290067Sbapt	ENDIF(ENABLE_LUAJIT MATCHES "ON")
115290067Sbapt
116290067Sbapt	IF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
117290067Sbapt		SET(LUA_FOUND 1)
118290067Sbapt		IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
119290067Sbapt			SET(LUA_VERSION_MAJOR ${LUA_VERSION_MAJOR})
120290067Sbapt			SET(LUA_VERSION_MINOR ${LUA_VERSION_MINOR})
121290067Sbapt		ENDIF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
122290067Sbapt		IF(ENABLE_LUAJIT MATCHES "ON")
123290067Sbapt			MESSAGE(STATUS "Found luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
124290067Sbapt		ELSE(ENABLE_LUAJIT MATCHES "ON")
125290067Sbapt			MESSAGE(STATUS "Found lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
126290067Sbapt		ENDIF(ENABLE_LUAJIT MATCHES "ON")
127290067Sbapt	ENDIF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
128290067SbaptENDMACRO()
129290067Sbapt
130290067SbaptIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
131290067Sbapt	LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt)
132290067SbaptENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
133290067Sbapt
134290067SbaptIF(ENABLE_URL_INCLUDE MATCHES "ON")
135290067Sbapt    FIND_LIBRARY(LIBFETCH_LIBRARY NAMES fetch PATHS	PATH_SUFFIXES lib64 lib
136290067Sbapt                      PATHS
137290067Sbapt                          ~/Library/Frameworks
138290067Sbapt                          /Library/Frameworks
139290067Sbapt                          /usr/local
140290067Sbapt                          /usr
141290067Sbapt                          /sw
142290067Sbapt                          /opt/local
143290067Sbapt                          /opt/csw
144290067Sbapt                          /opt
145290067Sbapt                     DOC "Path where the libfetch library can be found")
146290067Sbapt    IF(LIBFETCH_LIBRARY)
147290067Sbapt    	FIND_FILE(HAVE_FETCH_H NAMES fetch.h PATHS /usr/include
148290067Sbapt    											   /opt/include
149290067Sbapt    											   /usr/local/include
150290067Sbapt    				DOC "Path to libfetch header")
151290067Sbapt    ELSE(LIBFETCH_LIBRARY)
152290067Sbapt    	# Try to find libcurl
153290067Sbapt    	ProcessPackage(CURL libcurl)
154290067Sbapt    	IF(NOT CURL_FOUND)
155290067Sbapt    		MESSAGE(WARNING "Neither libcurl nor libfetch were found, no support of URL includes in configuration")
156290067Sbapt    	ENDIF(NOT CURL_FOUND)
157290067Sbapt    ENDIF(LIBFETCH_LIBRARY)
158290067SbaptENDIF(ENABLE_URL_INCLUDE MATCHES "ON")
159290067Sbapt
160290067SbaptSET(CMAKE_C_WARN_FLAGS "")
161290067SbaptCHECK_C_COMPILER_FLAG(-Wall SUPPORT_WALL)
162290067SbaptCHECK_C_COMPILER_FLAG(-W SUPPORT_W)
163290067SbaptCHECK_C_COMPILER_FLAG(-Wno-unused-parameter SUPPORT_WPARAM)
164290067SbaptCHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN)
165290067SbaptCHECK_C_COMPILER_FLAG(-Wstrict-prototypes SUPPORT_WSTRICT_PROTOTYPES)
166290067SbaptIF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
167290067Sbapt	CHECK_C_COMPILER_FLAG("-std=c99" SUPPORT_STD_FLAG)
168290067SbaptENDIF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
169290067SbaptIF(SUPPORT_W)
170290067Sbapt	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -W")
171290067SbaptENDIF(SUPPORT_W)
172290067SbaptIF(SUPPORT_WALL)
173290067Sbapt	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wall")
174290067SbaptENDIF(SUPPORT_WALL)
175290067SbaptIF(SUPPORT_WPARAM)
176290067Sbapt	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-parameter")
177290067SbaptENDIF(SUPPORT_WPARAM)
178290067SbaptIF(SUPPORT_WPOINTER_SIGN)
179290067Sbapt	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-pointer-sign")
180290067SbaptENDIF(SUPPORT_WPOINTER_SIGN)
181290067SbaptIF(SUPPORT_WSTRICT_PROTOTYPES)
182290067Sbapt	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wstrict-prototypes")
183290067SbaptENDIF(SUPPORT_WSTRICT_PROTOTYPES)
184290067SbaptIF(SUPPORT_STD_FLAG)
185290067Sbapt	SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -std=c99")
186290067SbaptENDIF(SUPPORT_STD_FLAG)
187290067Sbapt
188290067SbaptIF(ENABLE_URL_SIGN MATCHES "ON")
189290067Sbapt	IF(OPENSSL_FOUND)
190290067Sbapt		SET(HAVE_OPENSSL 1)
191290067Sbapt		INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}")
192290067Sbapt	ENDIF(OPENSSL_FOUND)
193290067SbaptENDIF(ENABLE_URL_SIGN MATCHES "ON")
194290067Sbapt
195290067SbaptINCLUDE_DIRECTORIES("src")
196290067SbaptINCLUDE_DIRECTORIES("include")
197290067SbaptINCLUDE_DIRECTORIES("uthash")
198290067SbaptINCLUDE_DIRECTORIES("klib")
199290067Sbapt
200290067SbaptSET(UCLSRC src/ucl_util.c
201290067Sbapt		src/ucl_parser.c
202290067Sbapt		src/ucl_emitter.c
203290067Sbapt		src/ucl_emitter_streamline.c
204290067Sbapt		src/ucl_emitter_utils.c
205290067Sbapt		src/ucl_hash.c
206290067Sbapt		src/ucl_schema.c
207290067Sbapt		src/ucl_msgpack.c
208307790Sbapt		src/ucl_sexp.c)
209290067Sbapt
210290067Sbapt
211290067SbaptSET (LIB_TYPE STATIC)
212290067SbaptIF (BUILD_SHARED_LIBS)
213290067Sbapt  SET (LIB_TYPE SHARED)
214290067SbaptENDIF (BUILD_SHARED_LIBS)
215290067SbaptADD_LIBRARY(ucl ${LIB_TYPE} ${UCLSRC})
216290067SbaptSET_TARGET_PROPERTIES(ucl PROPERTIES VERSION ${LIBUCL_VERSION} SOVERSION ${LIBUCL_VERSION_MAJOR})
217290067Sbapt
218290067SbaptIF(ENABLE_LUA MATCHES "ON")
219290067Sbapt	IF(ENABLE_LUAJIT MATCHES "ON")
220290067Sbapt		FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}")
221290067Sbapt		IF(NOT LUA_FOUND)
222290067Sbapt			MESSAGE(FATAL_ERROR "Lua not found, lua support is required")
223290067Sbapt		ELSE(NOT LUA_FOUND)
224290067Sbapt			INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
225290067Sbapt		ENDIF(NOT LUA_FOUND)
226290067Sbapt	ELSE(ENABLE_LUAJIT MATCHES "ON")
227290067Sbapt		FindLua(VERSION_MAJOR "5" VERSION_MINOR "2" ROOT "${LUA_ROOT}")
228290067Sbapt		IF(NOT LUA_FOUND)
229290067Sbapt			FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}")
230290067Sbapt		ENDIF(NOT LUA_FOUND)
231290067Sbapt		IF(NOT LUA_FOUND)
232290067Sbapt			MESSAGE(FATAL_ERROR "Lua not found, lua support is required")
233290067Sbapt		ELSE(NOT LUA_FOUND)
234290067Sbapt			INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
235290067Sbapt		ENDIF(NOT LUA_FOUND)
236290067Sbapt	ENDIF(ENABLE_LUAJIT MATCHES "ON")
237290067Sbapt	SET(UCL_LUA_SRC lua/lua_ucl.c)
238290067Sbapt	ADD_LIBRARY(lua-ucl ${LIB_TYPE} ${UCL_LUA_SRC})
239290067Sbapt	IF(ENABLE_LUAJIT MATCHES "ON")
240290067Sbapt		TARGET_LINK_LIBRARIES(lua-ucl "${LUAJIT_LIBRARY}")
241290067Sbapt	ELSE(ENABLE_LUAJIT MATCHES "ON")
242290067Sbapt		TARGET_LINK_LIBRARIES(lua-ucl "${LUA_LIBRARY}")
243290067Sbapt	ENDIF(ENABLE_LUAJIT MATCHES "ON")
244290067Sbapt	TARGET_LINK_LIBRARIES(lua-ucl ucl)
245290067Sbapt	SET_TARGET_PROPERTIES(lua-ucl PROPERTIES VERSION ${LIBUCL_VERSION} SOVERSION ${LIBUCL_VERSION_MAJOR})
246290067SbaptENDIF()
247290067Sbapt
248290067SbaptIF(HAVE_FETCH_H)
249290067Sbapt    TARGET_LINK_LIBRARIES(ucl fetch)
250290067SbaptELSE(HAVE_FETCH_H)
251290067Sbapt    IF(CURL_FOUND)
252290067Sbapt        TARGET_LINK_LIBRARIES(ucl ${CURL_LIBRARIES})
253290067Sbapt    ENDIF(CURL_FOUND)
254290067SbaptENDIF(HAVE_FETCH_H)
255290067SbaptIF(ENABLE_URL_SIGN MATCHES "ON")
256290067Sbapt	IF(OPENSSL_FOUND)
257290067Sbapt		TARGET_LINK_LIBRARIES(ucl ${OPENSSL_LIBRARIES})
258290067Sbapt	ENDIF(OPENSSL_FOUND)
259290067SbaptENDIF(ENABLE_URL_SIGN MATCHES "ON")
260