Rapid spam filtering system https://rspamd.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1077 lines
38 KiB

11 years ago
12 years ago
14 years ago
15 years ago
11 years ago
11 years ago
16 years ago
16 years ago
12 years ago
12 years ago
12 years ago
  1. #
  2. # Rspamd - rapid antispam system
  3. #
  4. # Cmake configuration file
  5. #
  6. ############################# INITIAL SECTION #############################################
  7. PROJECT(rspamd C)
  8. ENABLE_LANGUAGE(ASM)
  9. SET(RSPAMD_VERSION_MAJOR 0)
  10. SET(RSPAMD_VERSION_MINOR 9)
  11. SET(RSPAMD_VERSION_PATCH 0)
  12. SET(RSPAMD_VERSION "${RSPAMD_VERSION_MAJOR}.${RSPAMD_VERSION_MINOR}.${RSPAMD_VERSION_PATCH}")
  13. SET(RSPAMD_MASTER_SITE_URL "https://rspamd.com")
  14. IF(NOT RSPAMD_USER)
  15. SET(RSPAMD_USER "nobody")
  16. SET(RSPAMD_GROUP "nobody")
  17. ENDIF(NOT RSPAMD_USER)
  18. # Default for SysV Init
  19. SET(RSPAMD_WORKER_NORMAL "*:11333")
  20. SET(RSPAMD_WORKER_CONTROLLER "*:11334")
  21. CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0 FATAL_ERROR)
  22. SET_PROPERTY(GLOBAL PROPERTY ALLOW_DUPLICATE_CUSTOM_TARGETS 1)
  23. ############################# OPTIONS SECTION #############################################
  24. OPTION(DEBUG_MODE "Enable debug output [default: ON]" ON)
  25. OPTION(ENABLE_OPTIMIZATION "Enable optimization [default: OFF]" OFF)
  26. OPTION(SKIP_RELINK_RPATH "Skip relinking and full RPATH for the install tree" OFF)
  27. OPTION(ENABLE_REDIRECTOR "Enable redirector install [default: OFF]" OFF)
  28. OPTION(ENABLE_GPERF_TOOLS "Enable google perftools [default: OFF]" OFF)
  29. OPTION(ENABLE_STATIC "Enable static compiling [default: OFF]" OFF)
  30. OPTION(ENABLE_LUAJIT "Link with libluajit [default: ON]" ON)
  31. OPTION(ENABLE_DB "Find and link with DB library [default: OFF]" OFF)
  32. OPTION(ENABLE_SQLITE "Find and link with sqlite3 library [default: OFF]" OFF)
  33. OPTION(ENABLE_HIREDIS "Find and link with external redis library [default: ON]" ON)
  34. OPTION(ENABLE_URL_INCLUDE "Enable urls in ucl includes (requires libcurl or libfetch) [default: OFF]" OFF)
  35. OPTION(NO_SHARED "Build internal libs static [default: ON]" ON)
  36. OPTION(FORCE_GMIME24 "Link with gmime2.4 [default: OFF]" OFF)
  37. OPTION(INSTALL_EXAMPLES "Install examples [default: OFF]" OFF)
  38. OPTION(INSTALL_WEBUI "Install web interface [default: ON]" ON)
  39. OPTION(WANT_SYSTEMD_UNITS "Install systemd unit files on Linux [default: OFF]" OFF)
  40. # Build optimized code for following CPU (default i386)
  41. #SET(CPU_TUNE "i686")
  42. # Now CMAKE_INSTALL_PREFIX is a base prefix for everything
  43. # CONFDIR - for configuration
  44. # MANDIR - for manual pages
  45. # RUNDIR - for runtime files
  46. # DBDIR - for static files
  47. # LOGDIR - for log files
  48. # EXAMPLESDIR - for examples files
  49. IF(NOT CONFDIR)
  50. SET(CONFDIR "${CMAKE_INSTALL_PREFIX}/etc/rspamd")
  51. ENDIF(NOT CONFDIR)
  52. IF(NOT MANDIR)
  53. SET(MANDIR "${CMAKE_INSTALL_PREFIX}/share/man")
  54. ENDIF(NOT MANDIR)
  55. IF(NOT RUNDIR)
  56. SET(RUNDIR "${CMAKE_INSTALL_PREFIX}/var/run/rspamd")
  57. ENDIF(NOT RUNDIR)
  58. IF(NOT DBDIR)
  59. SET(DBDIR "${CMAKE_INSTALL_PREFIX}/var/lib/rspamd")
  60. ENDIF(NOT DBDIR)
  61. IF(NOT LOGDIR)
  62. SET(LOGDIR "${CMAKE_INSTALL_PREFIX}/var/log/rspamd")
  63. ENDIF(NOT LOGDIR)
  64. IF(NOT EXAMPLESDIR)
  65. SET(EXAMPLESDIR "${CMAKE_INSTALL_PREFIX}/share/examples/rspamd")
  66. ENDIF(NOT EXAMPLESDIR)
  67. IF(NOT PLUGINSDIR)
  68. SET(PLUGINSDIR "${CMAKE_INSTALL_PREFIX}/share/rspamd")
  69. ENDIF(NOT PLUGINSDIR)
  70. IF(NOT WWWDIR)
  71. SET(WWWDIR "${CMAKE_INSTALL_PREFIX}/share/rspamd/www")
  72. ENDIF(NOT WWWDIR)
  73. # Set libdir
  74. IF(NOT LIBDIR)
  75. SET(LIBDIR lib/rspamd)
  76. IF(NOT CMAKE_INSTALL_RPATH)
  77. SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${LIBDIR})
  78. ENDIF(NOT CMAKE_INSTALL_RPATH)
  79. ENDIF(NOT LIBDIR)
  80. # Set includedir
  81. IF(NOT INCLUDEDIR)
  82. SET(INCLUDEDIR include/rspamd)
  83. ENDIF(NOT INCLUDEDIR)
  84. IF(NOT SYSTEMDDIR)
  85. SET(SYSTEMDDIR ${CMAKE_INSTALL_PREFIX}/lib/systemd/system)
  86. ENDIF(NOT SYSTEMDDIR)
  87. ############################# INCLUDE SECTION #############################################
  88. INCLUDE(CheckIncludeFiles)
  89. INCLUDE(CheckFunctionExists)
  90. INCLUDE(CheckSymbolExists)
  91. INCLUDE(CheckCSourceCompiles)
  92. INCLUDE(CheckLibraryExists)
  93. INCLUDE(FindPkgConfig)
  94. INCLUDE(CheckCCompilerFlag)
  95. INCLUDE(FindPerl)
  96. INCLUDE(FindOpenSSL)
  97. ############################# MACRO SECTION #############################################
  98. # Find lua installation
  99. MACRO(FindLua _major _minor)
  100. # Find lua libraries
  101. MESSAGE(STATUS "Check for lua ${_major}.${_minor}")
  102. UNSET(LUA_INCLUDE_DIR CACHE)
  103. UNSET(LUA_LIBRARY CACHE)
  104. FIND_PATH(LUA_INCLUDE_DIR lua.h
  105. HINTS
  106. $ENV{LUA_DIR}
  107. PATH_SUFFIXES "include/lua${_major}${_minor}"
  108. "include/lua${_major}.${_minor}"
  109. "include/lua-${_major}.${_minor}"
  110. include/lua include
  111. PATHS
  112. /usr/local
  113. /usr/pkg
  114. /usr
  115. ~/Library/Frameworks
  116. /Library/Frameworks
  117. /sw # Fink
  118. /opt/local # DarwinPorts
  119. /opt/csw # Blastwave
  120. /opt
  121. )
  122. FIND_LIBRARY(LUA_LIBRARY
  123. NAMES lua
  124. "lua${_major}${_minor}"
  125. "lua${_major}.${_minor}"
  126. "lua-${_major}.${_minor}"
  127. HINTS
  128. $ENV{LUA_DIR}
  129. PATH_SUFFIXES lib64 lib
  130. PATHS
  131. /usr/local
  132. /usr
  133. ~/Library/Frameworks
  134. /Library/Frameworks
  135. /sw
  136. /opt/local
  137. /opt/csw
  138. /opt
  139. DOC "Lua library"
  140. )
  141. IF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
  142. SET(LUA_FOUND 1)
  143. IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
  144. SET(LUA_VERSION_MAJOR ${_major})
  145. SET(LUA_VERSION_MINOR ${_minor})
  146. ENDIF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
  147. MESSAGE(STATUS "Found lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
  148. ENDIF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
  149. ENDMACRO(FindLua _major _minor)
  150. FUNCTION(INSTALL_IF_NOT_EXISTS src dest destname suffix)
  151. IF(NOT IS_ABSOLUTE "${src}")
  152. SET(src "${CMAKE_CURRENT_SOURCE_DIR}/${src}")
  153. ENDIF()
  154. GET_FILENAME_COMPONENT(src_name "${src}" NAME)
  155. GET_FILENAME_COMPONENT(dest_name "${destname}" NAME)
  156. IF(NOT IS_ABSOLUTE "${dest}")
  157. SET(dest "${CMAKE_INSTALL_PREFIX}/${dest}")
  158. ENDIF()
  159. INSTALL(CODE "
  160. IF(NOT EXISTS \"\$ENV{DESTDIR}${dest}/${dest_name}${suffix}\")
  161. #FILE(INSTALL \"${src}\" DESTINATION \"${dest}\")
  162. MESSAGE(STATUS \"Installing: \$ENV{DESTDIR}${dest}/${dest_name}${suffix}\")
  163. EXECUTE_PROCESS(COMMAND \${CMAKE_COMMAND} -E copy \"${src}\"
  164. \"\$ENV{DESTDIR}${dest}/${dest_name}${suffix}\"
  165. RESULT_VARIABLE copy_result
  166. ERROR_VARIABLE error_output)
  167. IF(copy_result)
  168. MESSAGE(FATAL_ERROR \${error_output})
  169. ENDIF()
  170. ELSE()
  171. MESSAGE(STATUS \"Skipping : \$ENV{DESTDIR}${dest}/${dest_name}${suffix}\")
  172. ENDIF()
  173. ")
  174. ENDFUNCTION(INSTALL_IF_NOT_EXISTS)
  175. # Process required package by using FindPackage and calling for INCLUDE_DIRECTORIES and
  176. # setting list of required libraries
  177. MACRO(ProcessPackage var _name0)
  178. PKG_SEARCH_MODULE(${var} "${_name0}" ${ARGN})
  179. IF(${var}_FOUND)
  180. SET(WITH_${var} 1)
  181. IF(ENABLE_STATIC MATCHES "ON")
  182. SET(_XPREFIX "${var}_STATIC")
  183. ELSE(ENABLE_STATIC MATCHES "ON")
  184. SET(_XPREFIX "${var}")
  185. ENDIF(ENABLE_STATIC MATCHES "ON")
  186. FOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS})
  187. INCLUDE_DIRECTORIES("${_arg}")
  188. SET(${var}_INCLUDE_DIR "${_arg}")
  189. ENDFOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS})
  190. FOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS})
  191. LINK_DIRECTORIES("${_arg}")
  192. ENDFOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS})
  193. # Handle other CFLAGS and LDFLAGS
  194. FOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER})
  195. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_arg}")
  196. ENDFOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER})
  197. FOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER})
  198. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_arg}")
  199. ENDFOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER})
  200. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES "${${_XPREFIX}_LIBRARIES}")
  201. ELSE(${var}_FOUND)
  202. # Try some more heuristic
  203. FIND_LIBRARY(_lib NAMES "${_name0}" ${ARGN} PATH_SUFFIXES lib64 lib
  204. PATHS
  205. ~/Library/Frameworks
  206. /Library/Frameworks
  207. /usr/local
  208. /usr
  209. /sw
  210. /opt/local
  211. /opt/csw
  212. /opt)
  213. IF(NOT _lib)
  214. MESSAGE(FATAL_ERROR "Packages ${_name0} ${ARGN} could not be found, no library")
  215. ENDIF(NOT _lib)
  216. FIND_PATH(_incl "${_name0}.h" PATH_SUFFIXES "" "${_name0}" ${ARGN}
  217. PATHS /opt/include
  218. /usr/include
  219. /usr/local/include)
  220. IF(NOT _incl)
  221. MESSAGE(FATAL_ERROR "Packages ${_name0} ${ARGN} could not be found, no header")
  222. ENDIF(NOT _incl)
  223. GET_FILENAME_COMPONENT(_lib_path "${_lib}" PATH)
  224. INCLUDE_DIRECTORIES("${_incl}")
  225. LINK_DIRECTORIES("${_lib_path}")
  226. MESSAGE(STATUS "Found ${_name0} ${ARGN} in '${_lib_path}' (library) and '${_incl}' (include).")
  227. UNSET(_lib CACHE)
  228. UNSET(_incl CACHE)
  229. ENDIF(${var}_FOUND)
  230. ENDMACRO(ProcessPackage name)
  231. MACRO(ADD_PRECOMPILED_HEADER _target _input)
  232. GET_FILENAME_COMPONENT(_name ${_input} NAME)
  233. SET(_outdir "${CMAKE_BINARY_DIR}/${_name}.pch")
  234. MAKE_DIRECTORY(${_outdir})
  235. SET(_output "${_outdir}/${_name}.pch")
  236. STRING(TOUPPER "CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
  237. SET(_compiler_FLAGS ${${_flags_var_name}})
  238. GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES)
  239. FOREACH(item ${_directory_flags})
  240. LIST(APPEND _compiler_FLAGS "-I${item}")
  241. ENDFOREACH(item)
  242. INCLUDE_DIRECTORIES(${_outdir})
  243. IF("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
  244. IF(NOT TARGET ${_name}_pch)
  245. MESSAGE("${CMAKE_C_COMPILER} -DPCHCOMPILE ${CMAKE_C_FLAGS} -x c-header -o ${_output} ${_input}")
  246. ADD_CUSTOM_COMMAND(OUTPUT ${_output}
  247. COMMAND ${CMAKE_C_COMPILER} -DPCHCOMPILE ${_compiler_FLAGS} -x c-header -o ${_output} ${_input}
  248. DEPENDS ${_input})
  249. ADD_CUSTOM_TARGET(${_name}_pch DEPENDS ${_output})
  250. ENDIF()
  251. ADD_CUSTOM_TARGET(${_target}_pch DEPENDS ${_name}_pch)
  252. ADD_DEPENDENCIES(${_target} ${_target}_pch)
  253. SET_TARGET_PROPERTIES(${_target} PROPERTIES COMPILE_FLAGS "-include ${_name} -Winvalid-pch")
  254. ENDIF()
  255. ENDMACRO()
  256. ############################# CONFIG SECTION #############################################
  257. # Initial set
  258. INCLUDE_DIRECTORIES(src/libutil src/libserver src/libmime src/libstat src/libcryptobox)
  259. IF(CMAKE_INSTALL_PREFIX)
  260. SET(PREFIX ${CMAKE_INSTALL_PREFIX})
  261. ENDIF(CMAKE_INSTALL_PREFIX)
  262. LIST(APPEND CMAKE_REQUIRED_LIBRARIES m)
  263. # Try to detect platform for further configuration
  264. CHECK_C_SOURCE_COMPILES ("#if !defined(__x86_64) && !defined(__amd64) && !defined(_M_X64)
  265. #error assume 32 bit arch
  266. #endif
  267. int main() { return 0;}" AMD_64)
  268. IF(NOT BUILD_CPU_MODE)
  269. IF(AMD_64)
  270. SET (BUILD_CPU_MODE "64")
  271. ELSE(AMD_64)
  272. SET (BUILD_CPU_MODE "32")
  273. ENDIF(AMD_64)
  274. ENDIF(NOT BUILD_CPU_MODE)
  275. # Platform specific configuration
  276. IF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
  277. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_BSD_SOURCE -DFREEBSD")
  278. CONFIGURE_FILE(freebsd/rspamd.sh.in freebsd/rspamd @ONLY)
  279. IF(ENABLE_REDIRECTOR MATCHES "ON")
  280. CONFIGURE_FILE(freebsd/redirector.sh.in freebsd/redirector @ONLY)
  281. ENDIF(ENABLE_REDIRECTOR MATCHES "ON")
  282. MESSAGE(STATUS "Configuring for FreeBSD")
  283. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
  284. IF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  285. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_BSD_SOURCE -DDARWIN")
  286. SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS} -undefined dynamic_lookup")
  287. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000")
  288. MESSAGE(STATUS "Configuring for Darwin")
  289. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  290. IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  291. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE -DLINUX")
  292. IF(BUILD_CPU_MODE STREQUAL "32")
  293. SET(CMAKE_C_FLAGS "-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE ${CMAKE_C_FLAGS}")
  294. ENDIF(BUILD_CPU_MODE STREQUAL "32")
  295. # Workaround with architecture specific includes
  296. IF(IS_DIRECTORY "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  297. INCLUDE_DIRECTORIES("/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  298. SET(CMAKE_REQUIRED_INCLUDES "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  299. ENDIF(IS_DIRECTORY "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  300. LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt)
  301. LIST(APPEND CMAKE_REQUIRED_LIBRARIES dl)
  302. #XXX: gio bug workaround
  303. IF(ENABLE_STATIC MATCHES "ON")
  304. LIST(APPEND CMAKE_REQUIRED_LIBRARIES selinux)
  305. ENDIF(ENABLE_STATIC MATCHES "ON")
  306. MESSAGE(STATUS "Configuring for Linux")
  307. IF(EXISTS "/etc/debian_version")
  308. SET(LINUX_START_SCRIPT "rspamd_debian.in")
  309. ELSE(EXISTS "/etc/debian_version")
  310. SET(LINUX_START_SCRIPT "rspamd_rh.in")
  311. ENDIF(EXISTS "/etc/debian_version")
  312. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  313. IF(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  314. IF(NOT BUILD_CPU_MODE)
  315. SET (BUILD_CPU_MODE "32")
  316. ENDIF(NOT BUILD_CPU_MODE)
  317. IF("${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  318. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Xa -xregs=no%frameptr -xstrconst -xc99")
  319. SET(SUN_BUILD32 "-xtarget=generic")
  320. SET(SUN_BUILD64 "-xtarget=generic64")
  321. IF(ENABLE_OPTIMIZATION MATCHES "ON")
  322. SET(CMAKE_C_OPT_FLAGS "-fast -xdepend")
  323. ELSE(ENABLE_OPTIMIZATION MATCHES "ON")
  324. SET(CMAKE_C_OPT_FLAGS "-xO0")
  325. ENDIF(ENABLE_OPTIMIZATION MATCHES "ON")
  326. ELSE("${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  327. set(SUN_BUILD32 "-m32")
  328. set(SUN_BUILD64 "-m64")
  329. ENDIF("${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  330. IF (BUILD_CPU_MODE STREQUAL "32")
  331. message (STATUS "Building 32-bit mode on Solaris")
  332. # If we are asked to build 32 bit mode
  333. set(CMAKE_C_FLAGS "${SUN_BUILD32} ${CMAKE_C_FLAGS}")
  334. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${SUN_BUILD32}")
  335. ELSE (BUILD_CPU_MODE STREQUAL "32")
  336. # solaris 64-bit mode
  337. message (STATUS "Building 64-bit mode on Solaris")
  338. set(CMAKE_C_FLAGS "${SUN_BUILD64} ${CMAKE_C_FLAGS}")
  339. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${SUN_BUILD64}")
  340. ENDIF (BUILD_CPU_MODE STREQUAL "32")
  341. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__EXTENSIONS__ -DSOLARIS -D_POSIX_SOURCE -D_POSIX_C_SOURCE=200112L")
  342. LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt)
  343. LIST(APPEND CMAKE_REQUIRED_LIBRARIES dl)
  344. LIST(APPEND CMAKE_REQUIRED_LIBRARIES resolv)
  345. LIST(APPEND CMAKE_REQUIRED_LIBRARIES nsl)
  346. LIST(APPEND CMAKE_REQUIRED_LIBRARIES socket)
  347. LIST(APPEND CMAKE_REQUIRED_LIBRARIES umem)
  348. # Ugly hack, but FindOpenSSL on Solaris does not link with libcrypto
  349. LIST(APPEND CMAKE_REQUIRED_LIBRARIES crypto)
  350. SET(CMAKE_VERBOSE_MAKEFILE ON)
  351. SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
  352. SET(CMAKE_INSTALL_RPATH "${PREFIX}/lib")
  353. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  354. # Now find libraries and headers
  355. IF(ENABLE_LUAJIT MATCHES "ON")
  356. ProcessPackage(LUAJIT luajit)
  357. SET(WITH_LUA 1)
  358. ELSE(ENABLE_LUAJIT MATCHES "ON")
  359. FindLua(5 2)
  360. IF(NOT LUA_FOUND)
  361. FindLua(5 1)
  362. ENDIF(NOT LUA_FOUND)
  363. IF(NOT LUA_FOUND)
  364. MESSAGE(FATAL_ERROR "Lua not found, lua support is required for working")
  365. ELSE(NOT LUA_FOUND)
  366. SET(WITH_LUA 1)
  367. INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
  368. ENDIF(NOT LUA_FOUND)
  369. ENDIF(ENABLE_LUAJIT MATCHES "ON")
  370. #Check for openssl (required for dkim)
  371. IF(OPENSSL_FOUND)
  372. SET(HAVE_OPENSSL 1)
  373. INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}")
  374. ENDIF(OPENSSL_FOUND)
  375. ProcessPackage(GLIB2 glib-2.0>=2.30)
  376. ProcessPackage(GTHREAD gthread-2.0)
  377. ProcessPackage(HIREDIS hiredis libhiredis)
  378. ProcessPackage(PCRE pcre libpcre pcre3 libpcre3)
  379. ProcessPackage(GMIME2 gmime-2.6 gmime-2.4 gmime-2.0)
  380. ProcessPackage(LIBEVENT event libevent)
  381. ProcessPackage(SQLITE sqlite3>=3.6.0)
  382. IF(GMIME2_VERSION VERSION_GREATER "2.4.0")
  383. SET(GMIME24 1)
  384. ENDIF(GMIME2_VERSION VERSION_GREATER "2.4.0")
  385. LIST(APPEND CMAKE_REQUIRED_INCLUDES "${PCRE_INCLUDE_DIR}")
  386. # Libhiredis pc file is so special
  387. FIND_PATH(LIBHIREDIS_INCLUDE hiredis.h PATHS /opt/include
  388. /usr/include
  389. /usr/local/include
  390. PATH_SUFFIXES "" "hiredis"
  391. DOC "Path where the hiredis header files can be found")
  392. IF(LIBHIREDIS_INCLUDE)
  393. INCLUDE_DIRECTORIES("${LIBHIREDIS_INCLUDE}")
  394. ENDIF(LIBHIREDIS_INCLUDE)
  395. # Google performance tools
  396. IF(ENABLE_GPERF_TOOLS MATCHES "ON")
  397. FIND_PATH(GPERF_INCLUDE google/profiler.h PATHS /opt/include
  398. /usr/include
  399. /usr/local/include
  400. DOC "Path where google perftools includes can be found")
  401. INCLUDE_DIRECTORIES("${GPERF_INCLUDE}")
  402. FIND_LIBRARY(GPERF_LIBRARY NAMES profiler PATH_SUFFIXES lib64 lib
  403. PATHS
  404. ~/Library/Frameworks
  405. /Library/Frameworks
  406. /usr/local
  407. /usr
  408. /sw
  409. /opt/local
  410. /opt/csw
  411. /opt
  412. DOC "Path where the gperf library can be found")
  413. IF(NOT GPERF_LIBRARY)
  414. MESSAGE(FATAL_ERROR "gperf tools support is enabled but not found in system")
  415. ENDIF(NOT GPERF_LIBRARY)
  416. GET_FILENAME_COMPONENT(GPERF_PATH "${GPERF_LIBRARY}" PATH)
  417. LINK_DIRECTORIES("${GPERF_PATH}")
  418. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
  419. SET(WITH_GPERF_TOOLS 1)
  420. ENDIF(ENABLE_GPERF_TOOLS MATCHES "ON")
  421. # Find util library
  422. FIND_LIBRARY(LIBUTIL_LIBRARY NAMES util PATHS PATH_SUFFIXES lib64 lib
  423. PATHS
  424. ~/Library/Frameworks
  425. /Library/Frameworks
  426. /usr/local
  427. /usr
  428. /sw
  429. /opt/local
  430. /opt/csw
  431. /opt
  432. DOC "Path where the libutil library can be found")
  433. IF(LIBUTIL_LIBRARY)
  434. FIND_FILE(HAVE_LIBUTIL_H NAMES libutil.h PATHS /usr/include
  435. /opt/include
  436. /usr/local/include
  437. DOC "Path to libutil header")
  438. IF(HAVE_LIBUTIL_H)
  439. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES util)
  440. CHECK_FUNCTION_EXISTS(pidfile_open HAVE_PIDFILE)
  441. CHECK_FUNCTION_EXISTS(pidfile_fileno HAVE_PIDFILE_FILENO)
  442. ENDIF(HAVE_LIBUTIL_H)
  443. ENDIF(LIBUTIL_LIBRARY)
  444. # Find libfetch (for FreeBSD)
  445. IF(ENABLE_URL_INCLUDE MATCHES "ON")
  446. FIND_LIBRARY(LIBFETCH_LIBRARY NAMES fetch PATHS PATH_SUFFIXES lib64 lib
  447. PATHS
  448. ~/Library/Frameworks
  449. /Library/Frameworks
  450. /usr/local
  451. /usr
  452. /sw
  453. /opt/local
  454. /opt/csw
  455. /opt
  456. DOC "Path where the libfetch library can be found")
  457. IF(LIBFETCH_LIBRARY)
  458. FIND_FILE(HAVE_FETCH_H NAMES fetch.h PATHS /usr/include
  459. /opt/include
  460. /usr/local/include
  461. DOC "Path to libfetch header")
  462. ELSE(LIBFETCH_LIBRARY)
  463. # Try to find libcurl
  464. ProcessPackage(CURL libcurl)
  465. IF(NOT CURL_FOUND)
  466. MESSAGE(WARNING "Neither libcurl nor libfetch were found, no support of URL includes in configuration")
  467. ENDIF(NOT CURL_FOUND)
  468. ENDIF(LIBFETCH_LIBRARY)
  469. ENDIF(ENABLE_URL_INCLUDE MATCHES "ON")
  470. # Static build
  471. IF(ENABLE_STATIC MATCHES "ON")
  472. SET(BUILD_STATIC 1)
  473. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -pthread")
  474. MESSAGE(STATUS "Static build of rspamd, no custom plugins support")
  475. SET(LINK_TYPE "STATIC")
  476. SET(NO_SHARED "ON")
  477. ELSE(ENABLE_STATIC MATCHES "ON")
  478. IF(NO_SHARED MATCHES "OFF")
  479. SET(LINK_TYPE "SHARED")
  480. ELSE(NO_SHARED MATCHES "OFF")
  481. SET(LINK_TYPE "STATIC")
  482. ENDIF(NO_SHARED MATCHES "OFF")
  483. ENDIF(ENABLE_STATIC MATCHES "ON")
  484. # Process with warn flags
  485. SET(CMAKE_C_WARN_FLAGS "")
  486. CHECK_C_COMPILER_FLAG(-Wall SUPPORT_WALL)
  487. CHECK_C_COMPILER_FLAG(-W SUPPORT_W)
  488. CHECK_C_COMPILER_FLAG(-Wpointer-arith SUPPORT_WPOINTER)
  489. CHECK_C_COMPILER_FLAG(-Wno-unused-parameter SUPPORT_WPARAM)
  490. CHECK_C_COMPILER_FLAG(-Wno-unused-function SUPPORT_WFUNCTION)
  491. CHECK_C_COMPILER_FLAG(-Wunused-variable SUPPORT_WUNUSED_VAR)
  492. CHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN)
  493. CHECK_C_COMPILER_FLAG(-Wstrict-prototypes SUPPORT_WSTRICT_PROTOTYPES)
  494. CHECK_C_COMPILER_FLAG(-pedantic SUPPORT_PEDANTIC_FLAG)
  495. IF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  496. CHECK_C_COMPILER_FLAG("-std=c99" SUPPORT_STD_FLAG)
  497. ENDIF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  498. IF(SUPPORT_W)
  499. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -W")
  500. ENDIF(SUPPORT_W)
  501. IF(SUPPORT_WALL)
  502. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wall")
  503. ENDIF(SUPPORT_WALL)
  504. IF(SUPPORT_WPOINTER)
  505. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wpointer-arith")
  506. ENDIF(SUPPORT_WPOINTER)
  507. IF(SUPPORT_WPARAM)
  508. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-parameter")
  509. ENDIF(SUPPORT_WPARAM)
  510. IF(SUPPORT_WFUNCTION)
  511. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-function")
  512. ENDIF(SUPPORT_WFUNCTION)
  513. IF(SUPPORT_WUNUSED_VAR)
  514. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wunused-variable")
  515. ENDIF(SUPPORT_WUNUSED_VAR)
  516. IF(SUPPORT_WPOINTER_SIGN)
  517. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-pointer-sign")
  518. ENDIF(SUPPORT_WPOINTER_SIGN)
  519. IF(SUPPORT_WSTRICT_PROTOTYPES)
  520. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wstrict-prototypes")
  521. ENDIF(SUPPORT_WSTRICT_PROTOTYPES)
  522. IF(SUPPORT_PEDANTIC_FLAG)
  523. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -pedantic")
  524. ENDIF(SUPPORT_PEDANTIC_FLAG)
  525. IF(SUPPORT_STD_FLAG)
  526. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -std=c99")
  527. ENDIF(SUPPORT_STD_FLAG)
  528. CHECK_C_COMPILER_FLAG(-fPIC SUPPORT_FPIC)
  529. IF(SUPPORT_FPIC)
  530. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  531. ENDIF(SUPPORT_FPIC)
  532. # Optimization flags
  533. IF(NOT CMAKE_C_OPT_FLAGS)
  534. IF(ENABLE_OPTIMIZATION MATCHES "ON")
  535. SET(CMAKE_C_OPT_FLAGS "-O3 -fstrict-aliasing")
  536. ELSE(ENABLE_OPTIMIZATION MATCHES "ON")
  537. SET(CMAKE_C_OPT_FLAGS "-O0 -fstrict-aliasing")
  538. ENDIF(ENABLE_OPTIMIZATION MATCHES "ON")
  539. ENDIF(NOT CMAKE_C_OPT_FLAGS)
  540. IF(DEBUG_MODE MATCHES "ON")
  541. SET(CMAKE_BUILD_TYPE "Debug")
  542. ENDIF(DEBUG_MODE MATCHES "ON")
  543. SET(CMAKE_C_FLAGS "${CMAKE_C_OPT_FLAGS} ${CMAKE_C_FLAGS} ${CMAKE_C_WARN_FLAGS}")
  544. # Check platform specific includes
  545. CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
  546. CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H)
  547. CHECK_INCLUDE_FILES(sys/uio.h HAVE_SYS_UIO_H)
  548. CHECK_INCLUDE_FILES(fcntl.h HAVE_FCNTL_H)
  549. CHECK_INCLUDE_FILES(math.h HAVE_MATH_H)
  550. CHECK_INCLUDE_FILES(stdio.h HAVE_STDIO_H)
  551. CHECK_INCLUDE_FILES(stdlib.h HAVE_STDLIB_H)
  552. CHECK_INCLUDE_FILES(string.h HAVE_STRING_H)
  553. CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
  554. CHECK_INCLUDE_FILES(time.h HAVE_TIME_H)
  555. CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
  556. CHECK_INCLUDE_FILES(sysexits.h HAVE_SYSEXITS_H)
  557. CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H)
  558. CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H)
  559. CHECK_INCLUDE_FILES(stdbool.h HAVE_STDBOOL_H)
  560. CHECK_INCLUDE_FILES(endian.h HAVE_ENDIAN_H)
  561. CHECK_INCLUDE_FILES(sys/endian.h HAVE_SYS_ENDIAN_H)
  562. CHECK_INCLUDE_FILES(machine/endian.h HAVE_MACHINE_ENDIAN_H)
  563. CHECK_INCLUDE_FILES(sys/queue.h HAVE_SYS_QUEUE_H)
  564. CHECK_INCLUDE_FILES(sys/socket.h HAVE_SYS_SOCKET_H)
  565. CHECK_INCLUDE_FILES(sys/mman.h HAVE_SYS_MMAN_H)
  566. CHECK_INCLUDE_FILES(sys/un.h HAVE_SYS_UN_H)
  567. CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H)
  568. CHECK_INCLUDE_FILES(sys/wait.h HAVE_SYS_WAIT_H)
  569. CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
  570. CHECK_INCLUDE_FILES(sys/cdefs.h HAVE_SYS_CDEFS_H)
  571. CHECK_INCLUDE_FILES(sys/file.h HAVE_SYS_FILE_H)
  572. CHECK_INCLUDE_FILES(sys/utsname.h HAVE_SYS_UTSNAME_H)
  573. CHECK_INCLUDE_FILES(sys/resource.h HAVE_SYS_RESOURCE_H)
  574. CHECK_INCLUDE_FILES(netinet/in.h HAVE_NETINET_IN_H)
  575. CHECK_INCLUDE_FILES(arpa/inet.h HAVE_ARPA_INET_H)
  576. CHECK_INCLUDE_FILES(netdb.h HAVE_NETDB_H)
  577. CHECK_INCLUDE_FILES(syslog.h HAVE_SYSLOG_H)
  578. CHECK_INCLUDE_FILES(siginfo.h HAVE_SIGINFO_H)
  579. CHECK_INCLUDE_FILES(locale.h HAVE_LOCALE_H)
  580. CHECK_INCLUDE_FILES(libgen.h HAVE_LIBGEN_H)
  581. CHECK_INCLUDE_FILES(search.h HAVE_SEARCH_H)
  582. CHECK_INCLUDE_FILES(pwd.h HAVE_PWD_H)
  583. CHECK_INCLUDE_FILES(grp.h HAVE_GRP_H)
  584. CHECK_INCLUDE_FILES(glob.h HAVE_GLOB_H)
  585. CHECK_INCLUDE_FILES(poll.h HAVE_POLL_H)
  586. CHECK_INCLUDE_FILES(readpassphrase.h HAVE_READPASSPHRASE_H)
  587. CHECK_INCLUDE_FILES(termios.h HAVE_TERMIOS_H)
  588. CHECK_INCLUDE_FILES(paths.h HAVE_PATHS_H)
  589. CHECK_INCLUDE_FILES(ctype.h HAVE_CTYPE_H)
  590. CHECK_INCLUDE_FILES(sys/sendfile.h HAVE_SYS_SENDFILE_H)
  591. CHECK_INCLUDE_FILES(linux/falloc.h HAVE_LINUX_FALLOC_H)
  592. CHECK_INCLUDE_FILES(sys/eventfd.h HAVE_SYS_EVENTFD_H)
  593. CHECK_INCLUDE_FILES(aio.h HAVE_AIO_H)
  594. CHECK_INCLUDE_FILES(libaio.h HAVE_LIBAIO_H)
  595. CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
  596. CHECK_INCLUDE_FILES(cpuid.h HAVE_CPUID_H)
  597. # Some dependencies
  598. IF(HAVE_SYS_WAIT_H)
  599. LIST(APPEND CMAKE_REQUIRED_INCLUDES sys/wait.h)
  600. ENDIF(HAVE_SYS_WAIT_H)
  601. IF(HAVE_TIME_H)
  602. LIST(APPEND CMAKE_REQUIRED_INCLUDES time.h)
  603. ENDIF(HAVE_TIME_H)
  604. IF(HAVE_SYS_TIME_H)
  605. LIST(APPEND CMAKE_REQUIRED_INCLUDES sys/time.h)
  606. ENDIF(HAVE_SYS_TIME_H)
  607. # Check platform API
  608. CHECK_FUNCTION_EXISTS(setproctitle HAVE_SETPROCTITLE)
  609. CHECK_FUNCTION_EXISTS(getpagesize HAVE_GETPAGESIZE)
  610. CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
  611. CHECK_FUNCTION_EXISTS(vfork HAVE_VFORK)
  612. CHECK_FUNCTION_EXISTS(wait4 HAVE_WAIT4)
  613. CHECK_FUNCTION_EXISTS(waitpid HAVE_WAITPID)
  614. CHECK_FUNCTION_EXISTS(flock HAVE_FLOCK)
  615. CHECK_FUNCTION_EXISTS(tanhl HAVE_TANHL)
  616. CHECK_FUNCTION_EXISTS(tanh HAVE_TANH)
  617. CHECK_FUNCTION_EXISTS(expl HAVE_EXPL)
  618. CHECK_FUNCTION_EXISTS(exp2l HAVE_EXP2L)
  619. CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE)
  620. CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
  621. CHECK_FUNCTION_EXISTS(setitimer HAVE_SETITIMER)
  622. CHECK_FUNCTION_EXISTS(inet_pton HAVE_INET_PTON)
  623. CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)
  624. CHECK_FUNCTION_EXISTS(memset_s HAVE_MEMSET_S)
  625. CHECK_FUNCTION_EXISTS(explicit_bzero HAVE_EXPLICIT_BZERO)
  626. CHECK_C_SOURCE_COMPILES(
  627. "#include <stddef.h>
  628. void cmkcheckweak() __attribute__((weak));
  629. int main(int argc, char** argv) {
  630. return cmkcheckweak == NULL;
  631. }" HAVE_WEAK_SYMBOLS)
  632. IF(NOT ICONV_ROOT_DIR)
  633. FIND_PATH(ICONV_INCLUDE_DIR iconv.h
  634. PATHS
  635. ~/Library/Frameworks
  636. /Library/Frameworks
  637. /usr/local
  638. /sw
  639. /opt/local
  640. /opt/csw
  641. /opt
  642. /usr
  643. PATH_SUFFIXES include include/libiconv
  644. DOC "Path where the libiconv headers can be found")
  645. FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c
  646. PATHS
  647. ~/Library/Frameworks
  648. /Library/Frameworks
  649. /usr/local
  650. /sw
  651. /opt/local
  652. /opt/csw
  653. /opt
  654. /usr
  655. PATH_SUFFIXES lib64 lib
  656. DOC "Path where the libiconv library can be found")
  657. ELSE(NOT ICONV_ROOT_DIR)
  658. FIND_PATH(ICONV_INCLUDE_DIR iconv.h
  659. PATHS "${ICONV_ROOT_DIR}"
  660. PATH_SUFFIXES include include/libiconv
  661. DOC "Path where the libiconv headers can be found"
  662. NO_DEFAULT_PATH)
  663. FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c
  664. PATHS "${ICONV_ROOT_DIR}"
  665. PATH_SUFFIXES lib64 lib
  666. DOC "Path where the libiconv library can be found"
  667. NO_DEFAULT_PATH)
  668. ENDIF(NOT ICONV_ROOT_DIR)
  669. IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
  670. SET(ICONV_FOUND TRUE)
  671. ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
  672. INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
  673. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES ${ICONV_LIBRARIES})
  674. IF(ICONV_FOUND)
  675. CHECK_C_SOURCE_COMPILES("
  676. #include <iconv.h>
  677. int main(){
  678. iconv_t conv = 0;
  679. const char* in = 0;
  680. size_t ilen = 0;
  681. char* out = 0;
  682. size_t olen = 0;
  683. iconv(conv, &in, &ilen, &out, &olen);
  684. return 0;
  685. }
  686. " ICONV_SECOND_ARGUMENT_IS_CONST)
  687. ENDIF(ICONV_FOUND)
  688. IF(ICONV_FOUND)
  689. MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}")
  690. ELSE(ICONV_FOUND)
  691. MESSAGE(FATAL_ERROR "Could not find Iconv")
  692. ENDIF(ICONV_FOUND)
  693. # Check macros
  694. CHECK_SYMBOL_EXISTS(PATH_MAX limits.h HAVE_PATH_MAX)
  695. CHECK_SYMBOL_EXISTS(MAXPATHLEN sys/param.h HAVE_MAXPATHLEN)
  696. CHECK_SYMBOL_EXISTS(MAP_SHARED sys/mman.h HAVE_MMAP_SHARED)
  697. CHECK_SYMBOL_EXISTS(MAP_ANON sys/mman.h HAVE_MMAP_ANON)
  698. CHECK_SYMBOL_EXISTS(MAP_NOCORE sys/mman.h HAVE_MMAP_NOCORE)
  699. CHECK_SYMBOL_EXISTS(O_DIRECT fcntl.h HAVE_O_DIRECT)
  700. CHECK_SYMBOL_EXISTS(IPV6_V6ONLY "sys/socket.h;netinet/in.h" HAVE_IPV6_V6ONLY)
  701. CHECK_SYMBOL_EXISTS(posix_fadvise fcntl.h HAVE_FADVISE)
  702. CHECK_SYMBOL_EXISTS(posix_fallocate fcntl.h HAVE_POSIX_FALLOCATE)
  703. CHECK_SYMBOL_EXISTS(fallocate fcntl.h HAVE_FALLOCATE)
  704. CHECK_SYMBOL_EXISTS(fdatasync unistd.h HAVE_FDATASYNC)
  705. CHECK_SYMBOL_EXISTS(_SC_NPROCESSORS_ONLN unistd.h HAVE_SC_NPROCESSORS_ONLN)
  706. CHECK_SYMBOL_EXISTS(setbit sys/param.h PARAM_H_HAS_BITSET)
  707. CHECK_SYMBOL_EXISTS(getaddrinfo "sys/types.h;sys/socket.h;netdb.h" HAVE_GETADDRINFO)
  708. CHECK_SYMBOL_EXISTS(sched_yield "sched.h" HAVE_SCHED_YIELD)
  709. CHECK_SYMBOL_EXISTS(__get_cpuid "cpuid.h" HAVE_GET_CPUID)
  710. CHECK_SYMBOL_EXISTS(PCRE_CONFIG_JIT "pcre.h" HAVE_PCRE_JIT)
  711. FILE(WRITE ${CMAKE_BINARY_DIR}/pthread_setpshared.c "
  712. #include <pthread.h>
  713. #include <stdlib.h>
  714. int main (void)
  715. {
  716. pthread_mutexattr_t mattr;
  717. if (pthread_mutexattr_init(&mattr) != 0) return 0;
  718. if (pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED) != 0) return 0;
  719. if (pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST) != 0) return 0;
  720. return 1;
  721. }
  722. ")
  723. TRY_RUN(_CAN_RUN _CAN_COMPILE
  724. "${CMAKE_BINARY_DIR}" "${CMAKE_BINARY_DIR}/pthread_setpshared.c"
  725. CMAKE_FLAGS CMAKE_C_FLAGS="-pthread")
  726. IF(_CAN_RUN EQUAL 1)
  727. SET(HAVE_PTHREAD_PROCESS_SHARED 1)
  728. ENDIF(_CAN_RUN EQUAL 1)
  729. IF(HAVE_PTHREAD_PROCESS_SHARED)
  730. MESSAGE(STATUS "pthread_mutexattr_setpshared is supported")
  731. ELSE(HAVE_PTHREAD_PROCESS_SHARED)
  732. MESSAGE(STATUS "pthread_mutexattr_setpshared is -NOT- supported")
  733. ENDIF(HAVE_PTHREAD_PROCESS_SHARED)
  734. IF(NOT HAVE_GETADDRINFO)
  735. MESSAGE(FATAL_ERROR "Your system does not support getaddrinfo call, please consider upgrading it to run rspamd")
  736. ENDIF(NOT HAVE_GETADDRINFO)
  737. IF(HAVE_SIGINFO_H)
  738. CHECK_SYMBOL_EXISTS(SA_SIGINFO "signal.h;siginfo.h" HAVE_SA_SIGINFO)
  739. ELSE(HAVE_SIGINFO_H)
  740. CHECK_SYMBOL_EXISTS(SA_SIGINFO "signal.h" HAVE_SA_SIGINFO)
  741. ENDIF(HAVE_SIGINFO_H)
  742. # Some hack for libevent 2.0
  743. CHECK_C_SOURCE_COMPILES ("#include <event.h>
  744. #if _EVENT_NUMERIC_VERSION < 0x02000000
  745. #error Unsupported
  746. #endif
  747. int main() { return 0;}" HAVE_LIBEVENT2)
  748. IF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  749. IF(HAVE_CLOCK_GETTIME)
  750. CHECK_SYMBOL_EXISTS(CLOCK_PROCESS_CPUTIME_ID time.h HAVE_CLOCK_PROCESS_CPUTIME_ID)
  751. CHECK_SYMBOL_EXISTS(CLOCK_VIRTUAL time.h HAVE_CLOCK_VIRTUAL)
  752. ELSE(HAVE_CLOCK_GETTIME)
  753. CHECK_INCLUDE_FILES(sys/timeb.h HAVE_SYS_TIMEB_H)
  754. ENDIF(HAVE_CLOCK_GETTIME)
  755. # Check asm pause instruction
  756. CHECK_C_SOURCE_COMPILES ("#include <sys/types.h>
  757. int main (int argc, char **argv) {
  758. __asm __volatile(\"pause\");
  759. return 0;
  760. }" HAVE_ASM_PAUSE)
  761. ENDIF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  762. # Check queue.h compatibility
  763. IF(NOT HAVE_COMPATIBLE_QUEUE_H)
  764. INCLUDE_DIRECTORIES(compat)
  765. ENDIF(NOT HAVE_COMPATIBLE_QUEUE_H)
  766. IF(NOT DESTDIR)
  767. SET(DESTDIR $ENV{DESTDIR})
  768. ENDIF(NOT DESTDIR)
  769. # Try to detect tip version from hg
  770. SET(ID "unknown")
  771. FIND_PROGRAM(HG "git")
  772. IF(HG)
  773. EXECUTE_PROCESS(COMMAND "${HG}" rev-parse --verify HEAD
  774. WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
  775. OUTPUT_VARIABLE HG_ID ERROR_QUIET)
  776. IF(HG_ID)
  777. STRING(SUBSTRING "${HG_ID}" 0 10 RSPAMD_ID)
  778. MESSAGE(STATUS "Git revision: ${RSPAMD_ID}")
  779. ELSE(HG_ID)
  780. FIND_FILE(HG_ARCH ".hg_archival.txt" "${CMAKE_CURRENT_SOURCE_DIR}")
  781. IF(HG_ARCH)
  782. FILE(READ ${HG_ARCH} HG_ID)
  783. IF(HG_ID)
  784. STRING(REGEX MATCH "node: [0-9a-z]+" _tmp "${HG_ID}")
  785. STRING(SUBSTRING "${_tmp}" 6 12 RSPAMD_ID)
  786. ENDIF(HG_ID)
  787. ENDIF(HG_ARCH)
  788. ENDIF(HG_ID)
  789. ELSE(HG)
  790. # Now check .hg_archival.txt
  791. FIND_FILE(HG_ARCH ".hg_archival.txt" "${CMAKE_CURRENT_SOURCE_DIR}")
  792. IF(HG_ARCH)
  793. FILE(READ ${HG_ARCH} HG_ID)
  794. IF(HG_ID)
  795. STRING(REGEX MATCH "node: [0-9a-z]+" _tmp "${HG_ID}")
  796. STRING(SUBSTRING "${_tmp}" 6 12 RSPAMD_ID)
  797. ENDIF(HG_ID)
  798. ENDIF(HG_ARCH)
  799. ENDIF(HG)
  800. ################################ SOURCES SECTION ###########################
  801. INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/src"
  802. "${CMAKE_BINARY_DIR}/src"
  803. "${CMAKE_BINARY_DIR}/src/libcryptobox"
  804. "${CMAKE_SOURCE_DIR}/contrib/libucl"
  805. "${CMAKE_SOURCE_DIR}/contrib/uthash"
  806. "${CMAKE_SOURCE_DIR}/contrib/http-parser"
  807. "${CMAKE_SOURCE_DIR}/contrib/libottery"
  808. "${CMAKE_SOURCE_DIR}/contrib/xxhash"
  809. "${CMAKE_SOURCE_DIR}/contrib/cdb"
  810. "${CMAKE_SOURCE_DIR}/contrib/snowball/include"
  811. "${CMAKE_SOURCE_DIR}/contrib/siphash"
  812. "${CMAKE_SOURCE_DIR}/contrib/blake2"
  813. "${CMAKE_SOURCE_DIR}/contrib/librdns")
  814. ################################ SUBDIRS SECTION ###########################
  815. ADD_SUBDIRECTORY(contrib/lgpl)
  816. IF(GLIB_COMPAT)
  817. INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/contrib/lgpl")
  818. ENDIF(GLIB_COMPAT)
  819. ADD_DEFINITIONS(-DHAVE_CONFIG_H)
  820. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
  821. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES pcre)
  822. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES ucl)
  823. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES rdns)
  824. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES ottery)
  825. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES event)
  826. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES xxhash)
  827. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES siphash)
  828. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES blake2)
  829. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES sqlite3)
  830. IF(OPENSSL_FOUND)
  831. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
  832. ENDIF(OPENSSL_FOUND)
  833. IF(HAVE_FETCH_H)
  834. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES fetch)
  835. ENDIF(HAVE_FETCH_H)
  836. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES event)
  837. IF(HAVE_LIBEVENT2)
  838. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES event_pthreads)
  839. ENDIF(HAVE_LIBEVENT2)
  840. IF(WITH_DB)
  841. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES db)
  842. ENDIF(WITH_DB)
  843. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES "${LUA_LIBRARY}")
  844. IF(ENABLE_GPERF_TOOLS MATCHES "ON")
  845. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES profiler)
  846. ENDIF(ENABLE_GPERF_TOOLS MATCHES "ON")
  847. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES hiredis)
  848. IF(GLIB_COMPAT)
  849. LIST(APPEND RSPAMD_REQUIRED_LIBRARIES glibadditions)
  850. ENDIF(GLIB_COMPAT)
  851. ADD_SUBDIRECTORY(contrib/xxhash)
  852. ADD_SUBDIRECTORY(contrib/cdb)
  853. ADD_SUBDIRECTORY(contrib/http-parser)
  854. ADD_SUBDIRECTORY(contrib/libottery)
  855. ADD_SUBDIRECTORY(contrib/snowball)
  856. ADD_SUBDIRECTORY(contrib/siphash)
  857. ADD_SUBDIRECTORY(contrib/blake2)
  858. ADD_SUBDIRECTORY(contrib/libucl)
  859. ADD_SUBDIRECTORY(contrib/librdns)
  860. ADD_SUBDIRECTORY(src)
  861. ADD_SUBDIRECTORY(test)
  862. ############################ TARGETS SECTION ###############################
  863. CONFIGURE_FILE(config.h.in src/config.h)
  864. CONFIGURE_FILE(contrib/exim/local_scan.c.in contrib/exim/local_scan_rspamd.c @ONLY)
  865. SET(CONFFILES
  866. conf/common.conf
  867. conf/composites.conf
  868. conf/metrics.conf
  869. conf/modules.conf
  870. conf/statistic.conf
  871. conf/2tld.inc
  872. conf/logging.inc
  873. conf/options.inc
  874. conf/surbl-whitelist.inc
  875. conf/worker-controller.inc
  876. conf/worker-normal.inc)
  877. ##################### INSTALLATION ##########################################
  878. # Binaries
  879. # Configs
  880. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${CONFDIR})")
  881. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${EXAMPLESDIR})")
  882. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${PLUGINSDIR}/lua)")
  883. # Install configs only if they are unchanged
  884. LIST(LENGTH CONFFILES CONFLIST_COUNT)
  885. MATH(EXPR CONFLIST_MAX ${CONFLIST_COUNT}-1)
  886. FOREACH(CONF_IDX RANGE ${CONFLIST_MAX})
  887. LIST(GET CONFFILES ${CONF_IDX} CONF_FILE)
  888. IF(BUILD_PORT)
  889. INSTALL_IF_NOT_EXISTS(${CONF_FILE} ${CONFDIR} ${CONF_FILE} ".sample")
  890. ELSE(BUILD_PORT)
  891. INSTALL_IF_NOT_EXISTS(${CONF_FILE} ${CONFDIR} ${CONF_FILE} "")
  892. ENDIF(BUILD_PORT)
  893. IF(INSTALL_EXAMPLES MATCHES "ON")
  894. INSTALL(FILES ${CONF_FILE} DESTINATION ${EXAMPLESDIR})
  895. ENDIF(INSTALL_EXAMPLES MATCHES "ON")
  896. ENDFOREACH(CONF_IDX RANGE ${CONFLIST_MAX})
  897. # Main config is special due to systemd
  898. IF(WANT_SYSTEMD_UNITS MATCHES "ON")
  899. SET(MAIN_CONF "conf/rspamd.systemd.conf")
  900. ELSE(WANT_SYSTEMD_UNITS MATCHES "ON")
  901. SET(MAIN_CONF "conf/rspamd.sysvinit.conf")
  902. ENDIF(WANT_SYSTEMD_UNITS MATCHES "ON")
  903. IF(BUILD_PORT)
  904. INSTALL_IF_NOT_EXISTS(${MAIN_CONF} ${CONFDIR} "rspamd.conf" ".sample")
  905. ELSE(BUILD_PORT)
  906. INSTALL_IF_NOT_EXISTS(${MAIN_CONF} ${CONFDIR} "rspamd.conf" "")
  907. ENDIF(BUILD_PORT)
  908. # Debian is also special
  909. IF(DEBIAN_BUILD)
  910. INSTALL_IF_NOT_EXISTS("conf/rspamd.sysvinit.conf" ${CONFDIR} "rspamd.sysvinit.conf" "")
  911. ENDIF(DEBIAN_BUILD)
  912. IF(INSTALL_EXAMPLES MATCHES "ON")
  913. INSTALL(FILES ${MAIN_CONF} DESTINATION ${EXAMPLESDIR})
  914. ENDIF(INSTALL_EXAMPLES MATCHES "ON")
  915. # Lua plugins
  916. FILE(GLOB LUA_PLUGINS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/lua"
  917. "${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/lua/*.lua" )
  918. FOREACH(LUA_PLUGIN ${LUA_PLUGINS})
  919. GET_FILENAME_COMPONENT(_rp ${LUA_PLUGIN} PATH)
  920. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${PLUGINSDIR}/lua/${_rp})")
  921. INSTALL(FILES "src/plugins/lua/${LUA_PLUGIN}" DESTINATION ${PLUGINSDIR}/lua/${_rp})
  922. ENDFOREACH(LUA_PLUGIN)
  923. # Install lua fun library
  924. INSTALL(FILES "contrib/lua-fun/fun.lua" DESTINATION ${PLUGINSDIR}/lua)
  925. # Install TLD list
  926. INSTALL(FILES "contrib/publicsuffix/effective_tld_names.dat" DESTINATION
  927. "${PLUGINSDIR}/effective_tld_names.dat")
  928. # Lua config
  929. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${CONFDIR}/lua)")
  930. FILE(GLOB_RECURSE LUA_CONFIGS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/conf/lua"
  931. "${CMAKE_CURRENT_SOURCE_DIR}/conf/lua/*.lua")
  932. FOREACH(LUA_CONF ${LUA_CONFIGS})
  933. GET_FILENAME_COMPONENT(_rp ${LUA_CONF} PATH)
  934. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${CONFDIR}/lua/${_rp})")
  935. INSTALL(FILES "conf/lua/${LUA_CONF}" DESTINATION ${CONFDIR}/lua/${_rp})
  936. ENDFOREACH(LUA_CONF)
  937. # systemd unit
  938. IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND WANT_SYSTEMD_UNITS MATCHES "ON")
  939. INSTALL(FILES "rspamd.service" DESTINATION ${SYSTEMDDIR})
  940. INSTALL(FILES "rspamd.socket" DESTINATION ${SYSTEMDDIR})
  941. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND WANT_SYSTEMD_UNITS MATCHES "ON")
  942. # Manual pages
  943. INSTALL(FILES "doc/rspamd.8" DESTINATION ${MANDIR}/man8)
  944. INSTALL(FILES "doc/rspamc.1" DESTINATION ${MANDIR}/man1)
  945. # Install webui
  946. IF(INSTALL_WEBUI MATCHES "ON")
  947. INSTALL(DIRECTORY "interface/" DESTINATION ${WWWDIR} PATTERN ".git" EXCLUDE)
  948. ENDIF(INSTALL_WEBUI MATCHES "ON")
  949. ADD_CUSTOM_TARGET(dist ${CMAKE_SOURCE_DIR}/dist.sh
  950. "${CMAKE_BINARY_DIR}/rspamd-${RSPAMD_VERSION}.tar.xz"
  951. COMMENT "Create source distribution"
  952. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
  953. IF(NOT DEBIAN_BUILD)
  954. ADD_CUSTOM_TARGET(check DEPENDS rspamd-test)
  955. ADD_CUSTOM_TARGET(run-test DEPENDS check COMMAND test/rspamd-test)
  956. ENDIF(NOT DEBIAN_BUILD)