PROJECT(libucl C) CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR) SET(LIBUCL_VERSION_MAJOR 0) SET(LIBUCL_VERSION_MINOR 5) SET(LIBUCL_VERSION_PATCH 0) SET(LIBUCL_VERSION "${LIBUCL_VERSION_MAJOR}.${LIBUCL_VERSION_MINOR}.${LIBUCL_VERSION_PATCH}") INCLUDE(CheckCCompilerFlag) INCLUDE(CheckCSourceCompiles) INCLUDE(FindOpenSSL) INCLUDE(GNUInstallDirs) OPTION(ENABLE_URL_INCLUDE "Enable urls in ucl includes (requires libcurl or libfetch) [default: OFF]" OFF) OPTION(ENABLE_URL_SIGN "Enable signatures check in ucl includes (requires openssl) [default: OFF]" OFF) OPTION(BUILD_SHARED_LIBS "Build Shared Libraries [default: OFF]" OFF) OPTION(ENABLE_LUA "Enable lua support [default: OFF]" OFF) OPTION(ENABLE_LUAJIT "Enable luajit support [default: OFF]" OFF) OPTION(ENABLE_UTILS "Enable building utility binaries [default: OFF]" OFF) # Find lua installation MACRO(FindLua) # Find lua libraries UNSET(LUA_INCLUDE_DIR CACHE) UNSET(LUA_LIBRARY CACHE) CMAKE_PARSE_ARGUMENTS(LUA "" "VERSION_MAJOR;VERSION_MINOR;ROOT" "" ${ARGN}) IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR) MESSAGE(FATAL_ERROR "Invalid FindLua invocation: ${ARGN}") ENDIF() IF(ENABLE_LUAJIT MATCHES "ON") MESSAGE(STATUS "Check for luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}") FIND_PATH(LUA_INCLUDE_DIR luajit.h HINTS "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}" $ENV{LUA_DIR} PATH_SUFFIXES "include/luajit-2.0" "include/luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}" "include/luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "include/luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "include/luajit" "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}" "include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" include/lua include PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS} ) FIND_LIBRARY(LUA_LIBRARY NAMES luajit "luajit-2.0" "luajit2.0" "luajit${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}" "luajit${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "luajit-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" HINTS "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}" $ENV{LUA_DIR} PATH_SUFFIXES lib64 lib PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS} DOC "Lua library" ) IF(NOT LUA_LIBRARY OR NOT LUA_INCLUDE_DIR) MESSAGE(STATUS "Fallback from luajit to plain lua") SET(ENABLE_LUAJIT "OFF") MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}") FIND_PATH(LUA_INCLUDE_DIR lua.h HINTS "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}" $ENV{LUA_DIR} PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}" "include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" include/lua include PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS} ) FIND_LIBRARY(LUA_LIBRARY NAMES lua "lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}" "lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" HINTS "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}" $ENV{LUA_DIR} PATH_SUFFIXES lib64 lib PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS} DOC "Lua library" ) ENDIF() ELSE(ENABLE_LUAJIT MATCHES "ON") MESSAGE(STATUS "Check for lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}") FIND_PATH(LUA_INCLUDE_DIR lua.h HINTS "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}" $ENV{LUA_DIR} PATH_SUFFIXES "include/lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}" "include/lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "include/lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" include/lua include PATHS ${RSPAMD_DEFAULT_INCLUDE_PATHS} ) FIND_LIBRARY(LUA_LIBRARY NAMES lua "lua${LUA_VERSION_MAJOR}${LUA_VERSION_MINOR}" "lua${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" "lua-${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}" HINTS "${RSPAMD_SEARCH_PATH}" "${LUA_ROOT}" $ENV{LUA_DIR} PATH_SUFFIXES lib64 lib PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS} DOC "Lua library" ) ENDIF(ENABLE_LUAJIT MATCHES "ON") IF(LUA_LIBRARY AND LUA_INCLUDE_DIR) SET(LUA_FOUND 1) IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR) SET(LUA_VERSION_MAJOR ${LUA_VERSION_MAJOR}) SET(LUA_VERSION_MINOR ${LUA_VERSION_MINOR}) ENDIF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR) IF(ENABLE_LUAJIT MATCHES "ON") MESSAGE(STATUS "Found luajit ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}") ELSE(ENABLE_LUAJIT MATCHES "ON") MESSAGE(STATUS "Found lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}") ENDIF(ENABLE_LUAJIT MATCHES "ON") ENDIF(LUA_LIBRARY AND LUA_INCLUDE_DIR) ENDMACRO() IF(CMAKE_SYSTEM_NAME STREQUAL "Linux") LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt) ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux") IF(ENABLE_URL_INCLUDE MATCHES "ON") FIND_LIBRARY(LIBFETCH_LIBRARY NAMES fetch PATHS PATH_SUFFIXES lib64 lib PATHS ~/Library/Frameworks /Library/Frameworks /usr/local /usr /sw /opt/local /opt/csw /opt DOC "Path where the libfetch library can be found") IF(LIBFETCH_LIBRARY) FIND_FILE(HAVE_FETCH_H NAMES fetch.h PATHS /usr/include /opt/include /usr/local/include DOC "Path to libfetch header") ELSE(LIBFETCH_LIBRARY) # Try to find libcurl FIND_PACKAGE(CURL) IF(NOT CURL_FOUND) MESSAGE(WARNING "Neither libcurl nor libfetch were found, no support of URL includes in configuration") ENDIF(NOT CURL_FOUND) ENDIF(LIBFETCH_LIBRARY) ENDIF(ENABLE_URL_INCLUDE MATCHES "ON") set(SYNC_BUILTINS_TEST_SOURCE [====[ int main() { unsigned long val; __sync_bool_compare_and_swap(&val, 0, 1); __sync_add_and_fetch(&val, 1); __sync_fetch_and_add(&val, 0); __sync_sub_and_fetch(&val, 1); return 0; } ]====]) CHECK_C_SOURCE_COMPILES("${SYNC_BUILTINS_TEST_SOURCE}" HAVE_ATOMIC_BUILTINS) IF(NOT HAVE_ATOMIC_BUILTINS) MESSAGE(WARNING "Libucl references could be thread-unsafe because atomic builtins are missing") ENDIF(NOT HAVE_ATOMIC_BUILTINS) SET(CMAKE_C_WARN_FLAGS "") CHECK_C_COMPILER_FLAG(-W SUPPORT_W) CHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN) CHECK_C_COMPILER_FLAG(-Wno-unused-parameter SUPPORT_WUNUSED_PARAMETER) IF(SUPPORT_W) SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -W") ENDIF(SUPPORT_W) IF(SUPPORT_WPOINTER_SIGN) SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-pointer-sign") ENDIF(SUPPORT_WPOINTER_SIGN) IF(SUPPORT_WUNUSED_PARAMETER) SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-parameter") ENDIF(SUPPORT_WUNUSED_PARAMETER) SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_WARN_FLAGS}" ) IF(ENABLE_URL_SIGN MATCHES "ON") IF(OPENSSL_FOUND) SET(HAVE_OPENSSL 1) INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}") ENDIF(OPENSSL_FOUND) ENDIF(ENABLE_URL_SIGN MATCHES "ON") SET(UCL_COMPILE_DEFS) IF(HAVE_FETCH_H) LIST(APPEND UCL_COMPILE_DEFS -DHAVE_FETCH_H=1) ENDIF(HAVE_FETCH_H) IF(CURL_FOUND) LIST(APPEND UCL_COMPILE_DEFS -DCURL_FOUND=1) ENDIF(CURL_FOUND) IF(HAVE_OPENSSL) LIST(APPEND UCL_COMPILE_DEFS -DHAVE_OPENSSL=1) ENDIF(HAVE_OPENSSL) IF(HAVE_ATOMIC_BUILTINS) LIST(APPEND UCL_COMPILE_DEFS -DHAVE_ATOMIC_BUILTINS=1) ENDIF(HAVE_ATOMIC_BUILTINS) SET(UCLSRC src/ucl_util.c src/ucl_parser.c src/ucl_emitter.c src/ucl_emitter_streamline.c src/ucl_emitter_utils.c src/ucl_hash.c src/ucl_schema.c src/ucl_msgpack.c src/ucl_sexp.c) SET(UCLHDR include/ucl.h include/ucl++.h) SET (LIB_TYPE STATIC) IF (BUILD_SHARED_LIBS) SET (LIB_TYPE SHARED) ENDIF (BUILD_SHARED_LIBS) ADD_LIBRARY(ucl ${LIB_TYPE} ${UCLSRC}) ADD_LIBRARY(ucl::ucl ALIAS ucl) SET_TARGET_PROPERTIES(ucl PROPERTIES VERSION ${LIBUCL_VERSION} SOVERSION ${LIBUCL_VERSION_MAJOR}) TARGET_INCLUDE_DIRECTORIES(ucl PUBLIC include PRIVATE src uthash klib) TARGET_COMPILE_DEFINITIONS(ucl PRIVATE ${UCL_COMPILE_DEFS} ) IF(ENABLE_LUA MATCHES "ON") IF(ENABLE_LUAJIT MATCHES "ON") FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}") IF(NOT LUA_FOUND) MESSAGE(FATAL_ERROR "Lua not found, lua support is required") ELSE(NOT LUA_FOUND) INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}") ENDIF(NOT LUA_FOUND) ELSE(ENABLE_LUAJIT MATCHES "ON") FindLua(VERSION_MAJOR "5" VERSION_MINOR "2" ROOT "${LUA_ROOT}") IF(NOT LUA_FOUND) FindLua(VERSION_MAJOR "5" VERSION_MINOR "1" ROOT "${LUA_ROOT}") ENDIF(NOT LUA_FOUND) IF(NOT LUA_FOUND) MESSAGE(FATAL_ERROR "Lua not found, lua support is required") ELSE(NOT LUA_FOUND) INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}") ENDIF(NOT LUA_FOUND) ENDIF(ENABLE_LUAJIT MATCHES "ON") SET(UCL_LUA_SRC lua/lua_ucl.c) ADD_LIBRARY(lua-ucl ${LIB_TYPE} ${UCL_LUA_SRC}) ADD_LIBRARY(ucl::lua ALIAS lua-ucl) IF(ENABLE_LUAJIT MATCHES "ON") TARGET_LINK_LIBRARIES(lua-ucl "${LUAJIT_LIBRARY}") ELSE(ENABLE_LUAJIT MATCHES "ON") TARGET_LINK_LIBRARIES(lua-ucl "${LUA_LIBRARY}") ENDIF(ENABLE_LUAJIT MATCHES "ON") TARGET_LINK_LIBRARIES(lua-ucl ucl) TARGET_INCLUDE_DIRECTORIES(lua-ucl PUBLIC include PRIVATE src uthash) SET_TARGET_PROPERTIES(lua-ucl PROPERTIES VERSION ${LIBUCL_VERSION} SOVERSION ${LIBUCL_VERSION_MAJOR} PUBLIC_HEADER include/lua_ucl.h) INSTALL(TARGETS lua-ucl DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) ENDIF() IF(HAVE_FETCH_H) TARGET_LINK_LIBRARIES(ucl fetch) ELSE(HAVE_FETCH_H) IF(CURL_FOUND) TARGET_LINK_LIBRARIES(ucl ${CURL_LIBRARIES}) ENDIF(CURL_FOUND) ENDIF(HAVE_FETCH_H) IF(ENABLE_URL_SIGN MATCHES "ON") IF(OPENSSL_FOUND) TARGET_LINK_LIBRARIES(ucl ${OPENSSL_LIBRARIES}) ENDIF(OPENSSL_FOUND) ENDIF(ENABLE_URL_SIGN MATCHES "ON") IF(UNIX) TARGET_LINK_LIBRARIES(ucl -lm) ENDIF(UNIX) SET_TARGET_PROPERTIES(ucl PROPERTIES PUBLIC_HEADER "${UCLHDR}") INSTALL(TARGETS ucl DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) IF(ENABLE_UTILS MATCHES "ON") ADD_SUBDIRECTORY(utils) ENDIF()