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