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.

CMakeLists.txt 38KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152
  1. #
  2. # Rspamd - rambler antispam system
  3. #
  4. # Cmake configuration file
  5. #
  6. ############################# INITIAL SECTION #############################################
  7. PROJECT(rspamd C)
  8. SET(RSPAMD_VERSION_MAJOR 0)
  9. SET(RSPAMD_VERSION_MINOR 6)
  10. SET(RSPAMD_VERSION_PATCH 2)
  11. SET(RSPAMD_VERSION "${RSPAMD_VERSION_MAJOR}.${RSPAMD_VERSION_MINOR}.${RSPAMD_VERSION_PATCH}")
  12. SET(RSPAMD_MASTER_SITE_URL "https://rspamd.com")
  13. IF(NOT RSPAMD_USER)
  14. SET(RSPAMD_USER "nobody")
  15. SET(RSPAMD_GROUP "nobody")
  16. ENDIF(NOT RSPAMD_USER)
  17. CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR)
  18. ############################# OPTIONS SECTION #############################################
  19. OPTION(DEBUG_MODE "Enable debug output [default: ON]" ON)
  20. OPTION(ENABLE_OPTIMIZATION "Enable optimization [default: OFF]" OFF)
  21. OPTION(SKIP_RELINK_RPATH "Skip relinking and full RPATH for the install tree" OFF)
  22. OPTION(ENABLE_REDIRECTOR "Enable redirector install [default: OFF]" OFF)
  23. OPTION(ENABLE_PROFILING "Enable profiling [default: OFF]" OFF)
  24. OPTION(ENABLE_GPERF_TOOLS "Enable google perftools [default: OFF]" OFF)
  25. OPTION(ENABLE_STATIC "Enable static compiling [default: OFF]" OFF)
  26. OPTION(ENABLE_LUAJIT "Link with libluajit [default: OFF]" OFF)
  27. OPTION(ENABLE_JUDY "Find and link with Judy library [default: ON]" ON)
  28. OPTION(ENABLE_DB "Find and link with DB library [default: OFF]" OFF)
  29. OPTION(ENABLE_SQLITE "Find and link with sqlite3 library [default: OFF]" OFF)
  30. OPTION(ENABLE_HIREDIS "Find and link with external redis library [default: OFF]" OFF)
  31. OPTION(NO_SHARED "Build internal libs static [default: OFF]" OFF)
  32. OPTION(FORCE_GMIME24 "Link with gmime2.4 [default: OFF]" OFF)
  33. # Build optimized code for following CPU (default i386)
  34. #SET(CPU_TUNE "i686")
  35. # Now CMAKE_INSTALL_PREFIX is a base prefix for everything
  36. # CONFDIR - for configuration
  37. # MANDIR - for manual pages
  38. # RUNDIR - for runtime files
  39. # DBDIR - for static files
  40. # LOGDIR - for log files
  41. # EXAMPLESDIR - for examples files
  42. IF(NOT CONFDIR)
  43. SET(CONFDIR "${CMAKE_INSTALL_PREFIX}/etc/rspamd")
  44. ENDIF(NOT CONFDIR)
  45. IF(NOT MANDIR)
  46. SET(MANDIR "${CMAKE_INSTALL_PREFIX}/share/man")
  47. ENDIF(NOT MANDIR)
  48. IF(NOT RUNDIR)
  49. SET(RUNDIR "${CMAKE_INSTALL_PREFIX}/var/run/rspamd")
  50. ENDIF(NOT RUNDIR)
  51. IF(NOT DBDIR)
  52. SET(DBDIR "${CMAKE_INSTALL_PREFIX}/var/lib/rspamd")
  53. ENDIF(NOT DBDIR)
  54. IF(NOT LOGDIR)
  55. SET(LOGDIR "${CMAKE_INSTALL_PREFIX}/var/log/rspamd")
  56. ENDIF(NOT LOGDIR)
  57. IF(NOT EXAMPLESDIR)
  58. SET(EXAMPLESDIR "${CMAKE_INSTALL_PREFIX}/share/examples/rspamd")
  59. ENDIF(NOT EXAMPLESDIR)
  60. IF(NOT PLUGINSDIR)
  61. SET(PLUGINSDIR "${CMAKE_INSTALL_PREFIX}/share/rspamd")
  62. ENDIF(NOT PLUGINSDIR)
  63. # Set libdir
  64. IF(NOT LIBDIR)
  65. SET(LIBDIR lib/rspamd)
  66. IF(NOT CMAKE_INSTALL_RPATH)
  67. SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${LIBDIR})
  68. ENDIF(NOT CMAKE_INSTALL_RPATH)
  69. ENDIF(NOT LIBDIR)
  70. # Set includedir
  71. IF(NOT INCLUDEDIR)
  72. SET(INCLUDEDIR include/rspamd)
  73. ENDIF(NOT INCLUDEDIR)
  74. ############################# INCLUDE SECTION #############################################
  75. INCLUDE(CheckIncludeFiles)
  76. INCLUDE(CheckFunctionExists)
  77. INCLUDE(CheckSymbolExists)
  78. INCLUDE(CheckCSourceCompiles)
  79. INCLUDE(CheckLibraryExists)
  80. INCLUDE(FindPkgConfig)
  81. INCLUDE(CheckCCompilerFlag)
  82. INCLUDE(FindPerl)
  83. INCLUDE(FindOpenSSL)
  84. ############################# MODULES SECTION #############################################
  85. MACRO(_AddModulesForced MLIST WLIST)
  86. # Generate unique string for this build
  87. STRING(RANDOM LENGTH 8 _MODULES_ID)
  88. SET(MODULES_ID ${_MODULES_ID} CACHE INTERNAL "Modules ID" FORCE)
  89. FILE(WRITE "src/modules.c" "/* ${MODULES_ID} */\n#include \"config.h\"\n")
  90. # Handle even old cmake
  91. LIST(LENGTH ${MLIST} MLIST_COUNT)
  92. LIST(LENGTH ${WLIST} WLIST_COUNT)
  93. MATH(EXPR MLIST_MAX ${MLIST_COUNT}-1)
  94. MATH(EXPR WLIST_MAX ${WLIST_COUNT}-1)
  95. FOREACH(MOD_IDX RANGE ${MLIST_MAX})
  96. LIST(GET ${MLIST} ${MOD_IDX} MOD)
  97. FILE(APPEND "src/modules.c" "extern module_t ${MOD}_module;\n")
  98. ENDFOREACH(MOD_IDX RANGE ${MLIST_MAX})
  99. FILE(APPEND "src/modules.c" "\n\nmodule_t *modules[] = {\n")
  100. FOREACH(MOD_IDX RANGE ${MLIST_MAX})
  101. LIST(GET ${MLIST} ${MOD_IDX} MOD)
  102. FILE(APPEND "src/modules.c" "&${MOD}_module,\n")
  103. ENDFOREACH(MOD_IDX RANGE ${MLIST_MAX})
  104. FILE(APPEND "src/modules.c" "NULL\n};\n")
  105. FOREACH(MOD_IDX RANGE ${WLIST_MAX})
  106. LIST(GET ${WLIST} ${MOD_IDX} WRK)
  107. FILE(APPEND "src/modules.c" "extern worker_t ${WRK}_worker;\n")
  108. ENDFOREACH(MOD_IDX RANGE ${WLIST_MAX})
  109. FILE(APPEND "src/modules.c" "\n\nworker_t *workers[] = {\n")
  110. FOREACH(MOD_IDX RANGE ${WLIST_MAX})
  111. LIST(GET ${WLIST} ${MOD_IDX} WRK)
  112. FILE(APPEND "src/modules.c" "&${WRK}_worker,\n")
  113. ENDFOREACH(MOD_IDX RANGE ${WLIST_MAX})
  114. FILE(APPEND "src/modules.c" "NULL\n};\n")
  115. ENDMACRO(_AddModulesForced MLIST WLIST)
  116. MACRO(AddModules MLIST WLIST)
  117. _AddModulesForced(${MLIST} ${WLIST})
  118. #IF(NOT EXISTS "src/modules.c")
  119. # _AddModulesForced(${MLIST} ${WLIST})
  120. #ELSE(NOT EXISTS "src/modules.c")
  121. # FILE(STRINGS "src/modules.c" FILE_ID_RAW REGEX "^/.*[a-zA-Z0-9]+.*/$")
  122. # STRING(REGEX MATCH "[a-zA-Z0-9]+" FILE_ID "${FILE_ID_RAW}")
  123. # IF(NOT FILE_ID STREQUAL MODULES_ID)
  124. # MESSAGE("Regenerate modules info")
  125. # _AddModulesForced(${MLIST} ${WLIST})
  126. # ENDIF(NOT FILE_ID STREQUAL MODULES_ID)
  127. #ENDIF(NOT EXISTS "src/modules.c")
  128. ENDMACRO(AddModules MLIST WLIST)
  129. MACRO(FindLua _major _minor)
  130. # Find lua libraries
  131. MESSAGE(STATUS "Check for lua ${_major}.${_minor}")
  132. FIND_PATH(LUA_INCLUDE_DIR lua.h
  133. HINTS
  134. $ENV{LUA_DIR}
  135. PATH_SUFFIXES "include/lua${_major}${_minor}"
  136. "include/lua${_major}.${_minor}"
  137. include/lua include
  138. PATHS
  139. /usr/local
  140. /usr
  141. ~/Library/Frameworks
  142. /Library/Frameworks
  143. /sw # Fink
  144. /opt/local # DarwinPorts
  145. /opt/csw # Blastwave
  146. /opt
  147. )
  148. FIND_LIBRARY(LUA_LIBRARY
  149. NAMES lua
  150. "lua${_major}${_minor}"
  151. "lua${_major}.${_minor}"
  152. "lua-${_major}.${_minor}"
  153. HINTS
  154. $ENV{LUA_DIR}
  155. PATH_SUFFIXES lib64 lib
  156. PATHS
  157. /usr/local
  158. /usr
  159. ~/Library/Frameworks
  160. /Library/Frameworks
  161. /sw
  162. /opt/local
  163. /opt/csw
  164. /opt
  165. DOC "Lua library"
  166. )
  167. IF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
  168. SET(LUA_FOUND 1)
  169. IF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
  170. SET(LUA_VERSION_MAJOR ${_major})
  171. SET(LUA_VERSION_MINOR ${_minor})
  172. ENDIF(NOT LUA_VERSION_MAJOR OR NOT LUA_VERSION_MINOR)
  173. MESSAGE(STATUS "Found lua ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
  174. ENDIF(LUA_LIBRARY AND LUA_INCLUDE_DIR)
  175. # Check for luajit
  176. IF(ENABLE_LUAJIT MATCHES "ON")
  177. FIND_LIBRARY(LUAJIT_LIBRARY NAMES
  178. "luajit${_major}${_minor}"
  179. "luajit${_major}.${_minor}"
  180. "luajit-${_major}.${_minor}"
  181. luajit
  182. HINTS
  183. $ENV{LUA_DIR}
  184. PATH_SUFFIXES lib64 lib
  185. PATHS
  186. ~/Library/Frameworks
  187. /Library/Frameworks
  188. /usr/local
  189. /usr
  190. /sw
  191. /opt/local
  192. /opt/csw
  193. /opt
  194. )
  195. IF(NOT LUAJIT_LIBRARY)
  196. MESSAGE(FATAL_ERROR "Luajit not found but enabled in configuration")
  197. ENDIF(NOT LUAJIT_LIBRARY)
  198. ENDIF(ENABLE_LUAJIT MATCHES "ON")
  199. ENDMACRO(FindLua _major _minor)
  200. FUNCTION(INSTALL_IF_NOT_EXISTS src dest suffix)
  201. IF(NOT IS_ABSOLUTE "${src}")
  202. SET(src "${CMAKE_CURRENT_SOURCE_DIR}/${src}")
  203. ENDIF()
  204. GET_FILENAME_COMPONENT(src_name "${src}" NAME)
  205. IF(NOT IS_ABSOLUTE "${dest}")
  206. SET(dest "${CMAKE_INSTALL_PREFIX}/${dest}")
  207. ENDIF()
  208. INSTALL(CODE "
  209. IF(NOT EXISTS \"\$ENV{DESTDIR}${dest}/${src_name}${suffix}\")
  210. #FILE(INSTALL \"${src}\" DESTINATION \"${dest}\")
  211. MESSAGE(STATUS \"Installing: \$ENV{DESTDIR}${dest}/${src_name}${suffix}\")
  212. EXECUTE_PROCESS(COMMAND \${CMAKE_COMMAND} -E copy \"${src}\"
  213. \"\$ENV{DESTDIR}${dest}/${src_name}${suffix}\"
  214. RESULT_VARIABLE copy_result
  215. ERROR_VARIABLE error_output)
  216. IF(copy_result)
  217. MESSAGE(FATAL_ERROR \${error_output})
  218. ENDIF()
  219. ELSE()
  220. MESSAGE(STATUS \"Skipping : \$ENV{DESTDIR}${dest}/${src_name}${suffix}\")
  221. ENDIF()
  222. ")
  223. ENDFUNCTION(INSTALL_IF_NOT_EXISTS)
  224. ############################# CONFIG SECTION #############################################
  225. # Initial set
  226. IF(CMAKE_INSTALL_PREFIX)
  227. SET(PREFIX ${CMAKE_INSTALL_PREFIX})
  228. ENDIF(CMAKE_INSTALL_PREFIX)
  229. LIST(APPEND CMAKE_REQUIRED_LIBRARIES m)
  230. # Try to detect platform for further configuration
  231. CHECK_C_SOURCE_COMPILES ("#if !defined(__x86_64) && !defined(__amd64) && !defined(_M_X64)
  232. #error assume 32 bit arch
  233. #endif
  234. int main() { return 0;}" AMD_64)
  235. IF(NOT BUILD_CPU_MODE)
  236. IF(AMD_64)
  237. SET (BUILD_CPU_MODE "64")
  238. ELSE(AMD_64)
  239. SET (BUILD_CPU_MODE "32")
  240. ENDIF(AMD_64)
  241. ENDIF(NOT BUILD_CPU_MODE)
  242. # Platform specific configuration
  243. IF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
  244. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_BSD_SOURCE -DFREEBSD")
  245. CONFIGURE_FILE(freebsd/rspamd.sh.in freebsd/rspamd @ONLY)
  246. IF(ENABLE_REDIRECTOR MATCHES "ON")
  247. CONFIGURE_FILE(freebsd/redirector.sh.in freebsd/redirector @ONLY)
  248. ENDIF(ENABLE_REDIRECTOR MATCHES "ON")
  249. FIND_LIBRARY(LIBINTL_LIBRARY NAMES intl PATHS /lib
  250. /opt/lib
  251. /usr/lib
  252. /usr/local/lib
  253. DOC "Path where the libintl library can be found")
  254. LIST(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBINTL_LIBRARY})
  255. MESSAGE(STATUS "Configuring for FreeBSD")
  256. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
  257. IF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  258. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_BSD_SOURCE -DDARWIN")
  259. FIND_LIBRARY(LIBINTL_LIBRARY NAMES intl PATHS /lib
  260. /opt/lib
  261. /usr/lib
  262. /usr/local/lib
  263. DOC "Path where the libintl library can be found")
  264. LIST(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBINTL_LIBRARY})
  265. MESSAGE(STATUS "Configuring for Darwin")
  266. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
  267. IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  268. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE -DLINUX")
  269. IF(BUILD_CPU_MODE STREQUAL "32")
  270. SET(CMAKE_C_FLAGS "-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE ${CMAKE_C_FLAGS}")
  271. ENDIF(BUILD_CPU_MODE STREQUAL "32")
  272. # Workaround with architecture specific includes
  273. IF(IS_DIRECTORY "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  274. INCLUDE_DIRECTORIES("/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  275. SET(CMAKE_REQUIRED_INCLUDES "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  276. ENDIF(IS_DIRECTORY "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
  277. LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt)
  278. LIST(APPEND CMAKE_REQUIRED_LIBRARIES dl)
  279. MESSAGE(STATUS "Configuring for Linux")
  280. IF(EXISTS "/etc/debian_version")
  281. SET(LINUX_START_SCRIPT "rspamd_debian.in")
  282. ELSE(EXISTS "/etc/debian_version")
  283. SET(LINUX_START_SCRIPT "rspamd_rh.in")
  284. ENDIF(EXISTS "/etc/debian_version")
  285. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  286. IF(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  287. IF(NOT BUILD_CPU_MODE)
  288. SET (BUILD_CPU_MODE "32")
  289. ENDIF(NOT BUILD_CPU_MODE)
  290. IF("${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  291. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Xa -xregs=no%frameptr -xstrconst -xc99")
  292. SET(SUN_BUILD32 "-xtarget=generic")
  293. SET(SUN_BUILD64 "-xtarget=generic64")
  294. IF(ENABLE_OPTIMIZATION MATCHES "ON")
  295. SET(CMAKE_C_OPT_FLAGS "-fast -xdepend")
  296. ELSE(ENABLE_OPTIMIZATION MATCHES "ON")
  297. SET(CMAKE_C_OPT_FLAGS "-xO0")
  298. ENDIF(ENABLE_OPTIMIZATION MATCHES "ON")
  299. ELSE("${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  300. set(SUN_BUILD32 "-m32")
  301. set(SUN_BUILD64 "-m64")
  302. ENDIF("${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  303. IF (BUILD_CPU_MODE STREQUAL "32")
  304. message (STATUS "Building 32-bit mode on Solaris")
  305. # If we are asked to build 32 bit mode
  306. set(CMAKE_C_FLAGS "${SUN_BUILD32} ${CMAKE_C_FLAGS}")
  307. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${SUN_BUILD32}")
  308. ELSE (BUILD_CPU_MODE STREQUAL "32")
  309. # solaris 64-bit mode
  310. message (STATUS "Building 64-bit mode on Solaris")
  311. set(CMAKE_C_FLAGS "${SUN_BUILD64} ${CMAKE_C_FLAGS}")
  312. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${SUN_BUILD64}")
  313. ENDIF (BUILD_CPU_MODE STREQUAL "32")
  314. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__EXTENSIONS__ -DSOLARIS -D_POSIX_SOURCE -D_POSIX_C_SOURCE=200112L")
  315. LIST(APPEND CMAKE_REQUIRED_LIBRARIES rt)
  316. LIST(APPEND CMAKE_REQUIRED_LIBRARIES dl)
  317. LIST(APPEND CMAKE_REQUIRED_LIBRARIES resolv)
  318. LIST(APPEND CMAKE_REQUIRED_LIBRARIES nsl)
  319. LIST(APPEND CMAKE_REQUIRED_LIBRARIES socket)
  320. LIST(APPEND CMAKE_REQUIRED_LIBRARIES umem)
  321. # Ugly hack, but FindOpenSSL on Solaris does not link with libcrypto
  322. LIST(APPEND CMAKE_REQUIRED_LIBRARIES crypto)
  323. SET(CMAKE_VERBOSE_MAKEFILE ON)
  324. SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
  325. SET(CMAKE_INSTALL_RPATH "${PREFIX}/lib")
  326. ENDIF(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  327. # Now find libraries and headers
  328. # Find lua libraries
  329. FindLua(5 2)
  330. IF(NOT LUA_FOUND)
  331. FindLua(5 1)
  332. ENDIF(NOT LUA_FOUND)
  333. IF(NOT LUA_FOUND)
  334. MESSAGE(FATAL_ERROR "Lua not found, lua support is required for working")
  335. ELSE(NOT LUA_FOUND)
  336. SET(WITH_LUA 1)
  337. INCLUDE_DIRECTORIES("${LUA_INCLUDE_DIR}")
  338. ENDIF(NOT LUA_FOUND)
  339. # Check and link to pcre
  340. pkg_check_modules(PCRE REQUIRED libpcre)
  341. IF(PCRE_INCLUDE_DIRS)
  342. INCLUDE_DIRECTORIES("${PCRE_INCLUDE_DIRS}")
  343. ENDIF(PCRE_INCLUDE_DIRS)
  344. IF(PCRE_LIBRARY_DIRS)
  345. LINK_DIRECTORIES("${PCRE_LIBRARY_DIRS}")
  346. ENDIF(PCRE_LIBRARY_DIRS)
  347. IF(ENABLE_SQLITE MATCHES "ON")
  348. # Find optional sqlite3 support
  349. pkg_check_modules(SQLITE sqlite3>=3.6.0)
  350. IF(SQLITE_FOUND)
  351. SET(WITH_SQLITE 1)
  352. ENDIF(SQLITE_FOUND)
  353. IF(SQLITE_INCLUDE_DIRS)
  354. INCLUDE_DIRECTORIES("${SQLITE_INCLUDE_DIRS}")
  355. ENDIF(SQLITE_INCLUDE_DIRS)
  356. IF(SQLITE_LIBRARY_DIRS)
  357. LINK_DIRECTORIES("${SQLITE_LIBRARY_DIRS}")
  358. ENDIF(SQLITE_LIBRARY_DIRS)
  359. ENDIF(ENABLE_SQLITE MATCHES "ON")
  360. #Check for openssl (required for dkim)
  361. IF(OPENSSL_FOUND)
  362. SET(HAVE_OPENSSL 1)
  363. INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}")
  364. ENDIF(OPENSSL_FOUND)
  365. IF(ENABLE_STATIC MATCHES "ON")
  366. pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.12 gthread-2.0 gmodule-2.0)
  367. SET(LINK_TYPE "STATIC")
  368. ELSE(ENABLE_STATIC MATCHES "ON")
  369. pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.12 gthread-2.0 gmodule-2.0)
  370. IF(NO_SHARED MATCHES "OFF")
  371. SET(LINK_TYPE "SHARED")
  372. ELSE(NO_SHARED MATCHES "OFF")
  373. SET(LINK_TYPE "STATIC")
  374. ENDIF(NO_SHARED MATCHES "OFF")
  375. ENDIF(ENABLE_STATIC MATCHES "ON")
  376. SET(GLIB2_VERSION "${GLIB2_glib-2.0_VERSION}")
  377. IF(GLIB2_VERSION VERSION_GREATER "2.30.0")
  378. pkg_check_modules(LIBFFI libffi)
  379. IF(LIBFFI_FOUND)
  380. SET(GLIB2_LDFLAGS "${GLIB2_LDFLAGS};${LIBFFI_LDFLAGS}")
  381. SET(GLIB2_LIBRARIES "${GLIB2_LIBRARIES};${LIBFFI_LIBRARIES}")
  382. SET(GLIB2_STATIC_LDFLAGS "${GLIB2_STATIC_LDFLAGS};${LIBFFI_STATIC_LDFLAGS}")
  383. SET(GLIB2_CFLAGS "${GLIB2_CFLAGS};${LIBFFI_CFLAGS}")
  384. ENDIF(LIBFFI_FOUND)
  385. ENDIF(GLIB2_VERSION VERSION_GREATER "2.30.0")
  386. pkg_check_modules(GMIME2 gmime-2.0)
  387. IF(ENABLE_HIREDIS MATCHES "ON")
  388. # Try to find hiredis library
  389. pkg_check_modules(HIREDIS REQUIRED libhiredis)
  390. IF(HIREDIS_INCLUDE_DIRS)
  391. INCLUDE_DIRECTORIES("${HIREDIS_INCLUDE_DIRS}")
  392. ENDIF(HIREDIS_INCLUDE_DIRS)
  393. IF(HIREDIS_LIBRARY_DIRS)
  394. LINK_DIRECTORIES("${HIREDIS_LIBRARY_DIRS}")
  395. ENDIF(HIREDIS_LIBRARY_DIRS)
  396. IF(HIREDIS_FOUND)
  397. SET(WITH_SYSTEM_HIREDIS 1)
  398. ENDIF(HIREDIS_FOUND)
  399. ENDIF(ENABLE_HIREDIS MATCHES "ON")
  400. # Try to link with gmime24
  401. IF(NOT GMIME2_FOUND OR FORCE_GMIME24)
  402. pkg_check_modules(GMIME24 gmime-2.4)
  403. IF(NOT GMIME24_FOUND)
  404. pkg_check_modules(GMIME24 REQUIRED gmime-2.6)
  405. ENDIF(NOT GMIME24_FOUND)
  406. SET(GMIME24 "yes")
  407. # Gmime2
  408. FOREACH(arg ${GMIME24_CFLAGS})
  409. SET(GMIME_CFLAGS "${GMIME_CFLAGS} ${arg}")
  410. ENDFOREACH(arg ${GMIME24_CFLAGS})
  411. IF(ENABLE_STATIC MATCHES "ON")
  412. FOREACH(arg ${GMIME24_STATIC_LDFLAGS})
  413. SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
  414. ENDFOREACH(arg ${GMIME24_LDFLAGS})
  415. ELSE(ENABLE_STATIC MATCHES "ON")
  416. FOREACH(arg ${GMIME24_LDFLAGS})
  417. SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
  418. ENDFOREACH(arg ${GMIME24_LDFLAGS})
  419. ENDIF(ENABLE_STATIC MATCHES "ON")
  420. IF(GMIME24_INCLUDE_DIRS)
  421. INCLUDE_DIRECTORIES(${GMIME24_INCLUDE_DIRS})
  422. ENDIF(GMIME24_INCLUDE_DIRS)
  423. IF(GMIME24_LIBRARY_DIRS)
  424. LINK_DIRECTORIES(${GMIME24_LIBRARY_DIRS})
  425. ENDIF(GMIME24_LIBRARY_DIRS)
  426. ELSE(NOT GMIME2_FOUND OR FORCE_GMIME24)
  427. # Gmime2
  428. FOREACH(arg ${GMIME2_CFLAGS})
  429. SET(GMIME_CFLAGS "${GMIME_CFLAGS} ${arg}")
  430. ENDFOREACH(arg ${GMIME2_CFLAGS})
  431. IF(ENABLE_STATIC MATCHES "ON")
  432. FOREACH(arg ${GMIME2_STATIC_LDFLAGS})
  433. SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
  434. ENDFOREACH(arg ${GMIME2_LDFLAGS})
  435. ELSE(ENABLE_STATIC MATCHES "ON")
  436. FOREACH(arg ${GMIME2_LDFLAGS})
  437. SET(GMIME_LDFLAGS "${GMIME_LDFLAGS} ${arg}")
  438. ENDFOREACH(arg ${GMIME2_LDFLAGS})
  439. ENDIF(ENABLE_STATIC MATCHES "ON")
  440. IF(GMIME2_INCLUDE_DIRS)
  441. INCLUDE_DIRECTORIES(${GMIME2_INCLUDE_DIRS})
  442. ENDIF(GMIME2_INCLUDE_DIRS)
  443. IF(GMIME2_LIBRARY_DIRS)
  444. LINK_DIRECTORIES(${GMIME2_LIBRARY_DIRS})
  445. ENDIF(GMIME2_LIBRARY_DIRS)
  446. ENDIF(NOT GMIME2_FOUND OR FORCE_GMIME24)
  447. # Make from ; separated list normal space separated list
  448. # Glib2
  449. FOREACH(arg ${GLIB2_CFLAGS})
  450. SET(GLIB_CFLAGS "${GLIB_CFLAGS} ${arg}")
  451. ENDFOREACH(arg ${GLIB2_CFLAGS})
  452. IF(ENABLE_STATIC MATCHES "ON")
  453. FOREACH(arg ${GLIB2_STATIC_LDFLAGS})
  454. SET(GLIB_LDFLAGS "${GLIB_LDFLAGS} ${arg}")
  455. ENDFOREACH(arg ${GLIB2_LDFLAGS})
  456. ELSE(ENABLE_STATIC MATCHES "ON")
  457. FOREACH(arg ${GLIB2_LDFLAGS})
  458. SET(GLIB_LDFLAGS "${GLIB_LDFLAGS} ${arg}")
  459. ENDFOREACH(arg ${GLIB2_LDFLAGS})
  460. ENDIF(ENABLE_STATIC MATCHES "ON")
  461. INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
  462. LINK_DIRECTORIES(${GLIB2_LIBRARY_DIRS})
  463. FIND_LIBRARY(LIBZ_LIBRARY NAMES z PATH_SUFFIXES lib64 lib
  464. PATHS
  465. ~/Library/Frameworks
  466. /Library/Frameworks
  467. /usr/local
  468. /usr
  469. /sw
  470. /opt/local
  471. /opt/csw
  472. /opt
  473. DOC "Path where the libz library can be found")
  474. IF(NOT LIBZ_LIBRARY)
  475. MESSAGE(FATAL_ERROR "libz is required for libgmime")
  476. ENDIF(NOT LIBZ_LIBRARY)
  477. # Check for libevent
  478. FIND_LIBRARY(LIBEVENT_LIBRARY NAMES event PATH_SUFFIXES lib64 lib
  479. PATHS
  480. ~/Library/Frameworks
  481. /Library/Frameworks
  482. /usr/local
  483. /usr
  484. /sw
  485. /opt/local
  486. /opt/csw
  487. /opt
  488. DOC "Path where the libevent library can be found")
  489. IF(NOT LIBEVENT_LIBRARY)
  490. MESSAGE(FATAL_ERROR "libevent is required for building rspamd")
  491. ENDIF(NOT LIBEVENT_LIBRARY)
  492. FIND_PATH(LIBEVENT_INCLUDE event.h PATHS /opt/include
  493. /usr/include
  494. /usr/local/include
  495. DOC "Path where the libevent header files can be found")
  496. FIND_PATH(LIBEVENT_EVHTTP evhttp.h PATHS /opt/include
  497. /usr/include
  498. /usr/local/include
  499. DOC "Path where the libevhttp header files can be found")
  500. GET_FILENAME_COMPONENT(LIBEVENT_PATH "${LIBEVENT_LIBRARY}" PATH)
  501. INCLUDE_DIRECTORIES("${LIBEVENT_INCLUDE}")
  502. LINK_DIRECTORIES("${LIBEVENT_PATH}")
  503. IF(ENABLE_JUDY MATCHES "ON")
  504. # Find libjudy
  505. FIND_LIBRARY(LIBJUDY_LIBRARY NAMES Judy PATH_SUFFIXES lib64 lib
  506. PATHS
  507. ~/Library/Frameworks
  508. /Library/Frameworks
  509. /usr/local
  510. /usr
  511. /sw
  512. /opt/local
  513. /opt/csw
  514. /opt
  515. DOC "Path where the libjudy library can be found")
  516. IF(LIBJUDY_LIBRARY)
  517. FIND_PATH(LIBJUDY_INCLUDE Judy.h PATHS /opt/include
  518. /usr/include
  519. /usr/local/include
  520. DOC "Path where the judy header files can be found")
  521. GET_FILENAME_COMPONENT(LIBJUDY_PATH "${LIBJUDY_LIBRARY}" PATH)
  522. INCLUDE_DIRECTORIES("${LIBJUDY_INCLUDE}")
  523. LINK_DIRECTORIES("${LIBJUDY_PATH}")
  524. SET(WITH_JUDY 1)
  525. ENDIF(LIBJUDY_LIBRARY)
  526. ENDIF(ENABLE_JUDY MATCHES "ON")
  527. # Find libbd
  528. IF(ENABLE_DB MATCHES "ON")
  529. FIND_LIBRARY(LIBDB_LIBRARY NAMES db PATHS PATH_SUFFIXES lib64 lib
  530. PATHS
  531. ~/Library/Frameworks
  532. /Library/Frameworks
  533. /usr/local
  534. /usr
  535. /sw
  536. /opt/local
  537. /opt/csw
  538. /opt
  539. DOC "Path where the libdb library can be found")
  540. IF(LIBDB_LIBRARY)
  541. FIND_PATH(LIBDB_INCLUDE db.h PATHS /opt/include
  542. /usr/include
  543. /usr/local/include
  544. DOC "Path where the bdb header files can be found")
  545. GET_FILENAME_COMPONENT(LIBDB_PATH "${LIBDB_LIBRARY}" PATH)
  546. INCLUDE_DIRECTORIES("${LIBDB_INCLUDE}")
  547. LINK_DIRECTORIES("${LIBDB_PATH}")
  548. SET(WITH_DB 1)
  549. ENDIF(LIBDB_LIBRARY)
  550. ENDIF(ENABLE_DB MATCHES "ON")
  551. IF(ENABLE_PROFILING MATCHES "ON")
  552. SET(WITH_PROFILER 1)
  553. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
  554. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
  555. ENDIF(ENABLE_PROFILING MATCHES "ON")
  556. # Static build
  557. IF(ENABLE_STATIC MATCHES "ON")
  558. SET(BUILD_STATIC 1)
  559. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -pthread")
  560. MESSAGE(STATUS "Static build of rspamd, no custom plugins support")
  561. ENDIF(ENABLE_STATIC MATCHES "ON")
  562. # Google performance tools
  563. IF(ENABLE_GPERF_TOOLS MATCHES "ON")
  564. FIND_PATH(GPERF_INCLUDE google/profiler.h PATHS /opt/include
  565. /usr/include
  566. /usr/local/include
  567. DOC "Path where google perftools includes can be found")
  568. INCLUDE_DIRECTORIES("${GPERF_INCLUDE}")
  569. FIND_LIBRARY(GPERF_LIBRARY NAMES profiler PATH_SUFFIXES lib64 lib
  570. PATHS
  571. ~/Library/Frameworks
  572. /Library/Frameworks
  573. /usr/local
  574. /usr
  575. /sw
  576. /opt/local
  577. /opt/csw
  578. /opt
  579. DOC "Path where the gperf library can be found")
  580. IF(NOT GPERF_LIBRARY)
  581. MESSAGE(FATAL_ERROR "gperf tools support is enabled but not found in system")
  582. ENDIF(NOT GPERF_LIBRARY)
  583. GET_FILENAME_COMPONENT(GPERF_PATH "${GPERF_LIBRARY}" PATH)
  584. LINK_DIRECTORIES("${GPERF_PATH}")
  585. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer")
  586. SET(WITH_GPERF_TOOLS 1)
  587. ENDIF(ENABLE_GPERF_TOOLS MATCHES "ON")
  588. # Find util library
  589. FIND_LIBRARY(LIBUTIL_LIBRARY NAMES util PATHS PATH_SUFFIXES lib64 lib
  590. PATHS
  591. ~/Library/Frameworks
  592. /Library/Frameworks
  593. /usr/local
  594. /usr
  595. /sw
  596. /opt/local
  597. /opt/csw
  598. /opt
  599. DOC "Path where the libutil library can be found")
  600. IF(LIBUTIL_LIBRARY)
  601. FIND_FILE(HAVE_LIBUTIL_H NAMES libutil.h PATHS /usr/include
  602. /opt/include
  603. /usr/local/include
  604. DOC "Path to libutil header")
  605. IF(HAVE_LIBUTIL_H)
  606. LIST(APPEND CMAKE_REQUIRED_LIBRARIES util)
  607. CHECK_FUNCTION_EXISTS(pidfile_open HAVE_PIDFILE)
  608. CHECK_FUNCTION_EXISTS(pidfile_fileno HAVE_PIDFILE_FILENO)
  609. ENDIF(HAVE_LIBUTIL_H)
  610. ENDIF(LIBUTIL_LIBRARY)
  611. # Find libfetch (for FreeBSD)
  612. FIND_LIBRARY(LIBFETCH_LIBRARY NAMES fetch PATHS PATH_SUFFIXES lib64 lib
  613. PATHS
  614. ~/Library/Frameworks
  615. /Library/Frameworks
  616. /usr/local
  617. /usr
  618. /sw
  619. /opt/local
  620. /opt/csw
  621. /opt
  622. DOC "Path where the libfetch library can be found")
  623. IF(LIBFETCH_LIBRARY)
  624. FIND_FILE(HAVE_FETCH_H NAMES fetch.h PATHS /usr/include
  625. /opt/include
  626. /usr/local/include
  627. DOC "Path to libfetch header")
  628. ELSE(LIBFETCH_LIBRARY)
  629. # Try to find libcurl
  630. INCLUDE(FindCURL)
  631. IF(NOT CURL_FOUND)
  632. MESSAGE(WARNING "Neither libcurl nor libfetch were found, no support of URL includes in configuration")
  633. ELSE(NOT CURL_FOUND)
  634. INCLUDE_DIRECTORIES("${CURL_INCLUDE_DIRS}")
  635. ENDIF(NOT CURL_FOUND)
  636. ENDIF(LIBFETCH_LIBRARY)
  637. # Process with warn flags
  638. SET(CMAKE_C_WARN_FLAGS "")
  639. CHECK_C_COMPILER_FLAG(-Wall SUPPORT_WALL)
  640. CHECK_C_COMPILER_FLAG(-W SUPPORT_W)
  641. CHECK_C_COMPILER_FLAG(-Wpointer-arith SUPPORT_WPOINTER)
  642. CHECK_C_COMPILER_FLAG(-Wno-unused-parameter SUPPORT_WPARAM)
  643. CHECK_C_COMPILER_FLAG(-Wno-unused-function SUPPORT_WFUNCTION)
  644. CHECK_C_COMPILER_FLAG(-Wunused-variable SUPPORT_WUNUSED_VAR)
  645. CHECK_C_COMPILER_FLAG(-Wno-pointer-sign SUPPORT_WPOINTER_SIGN)
  646. CHECK_C_COMPILER_FLAG(-Wstrict-prototypes SUPPORT_WSTRICT_PROTOTYPES)
  647. CHECK_C_COMPILER_FLAG(-pedantic SUPPORT_PEDANTIC_FLAG)
  648. IF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  649. CHECK_C_COMPILER_FLAG("-std=c99" SUPPORT_STD_FLAG)
  650. ENDIF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES SunPro)
  651. IF(SUPPORT_W)
  652. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -W")
  653. ENDIF(SUPPORT_W)
  654. IF(SUPPORT_WALL)
  655. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wall")
  656. ENDIF(SUPPORT_WALL)
  657. IF(SUPPORT_WPOINTER)
  658. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wpointer-arith")
  659. ENDIF(SUPPORT_WPOINTER)
  660. IF(SUPPORT_WPARAM)
  661. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-parameter")
  662. ENDIF(SUPPORT_WPARAM)
  663. IF(SUPPORT_WFUNCTION)
  664. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-unused-function")
  665. ENDIF(SUPPORT_WFUNCTION)
  666. IF(SUPPORT_WUNUSED_VAR)
  667. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wunused-variable")
  668. ENDIF(SUPPORT_WUNUSED_VAR)
  669. IF(SUPPORT_WPOINTER_SIGN)
  670. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wno-pointer-sign")
  671. ENDIF(SUPPORT_WPOINTER_SIGN)
  672. IF(SUPPORT_WSTRICT_PROTOTYPES)
  673. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -Wstrict-prototypes")
  674. ENDIF(SUPPORT_WSTRICT_PROTOTYPES)
  675. IF(SUPPORT_PEDANTIC_FLAG)
  676. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -pedantic")
  677. ENDIF(SUPPORT_PEDANTIC_FLAG)
  678. IF(SUPPORT_STD_FLAG)
  679. SET(CMAKE_C_WARN_FLAGS "${CMAKE_C_WARN_FLAGS} -std=c99")
  680. ENDIF(SUPPORT_STD_FLAG)
  681. CHECK_C_COMPILER_FLAG(-fPIC SUPPORT_FPIC)
  682. IF(SUPPORT_FPIC)
  683. SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  684. ENDIF(SUPPORT_FPIC)
  685. # Optimization flags
  686. IF(NOT CMAKE_C_OPT_FLAGS)
  687. IF(ENABLE_OPTIMIZATION MATCHES "ON")
  688. SET(CMAKE_C_OPT_FLAGS "-O3 -fstrict-aliasing")
  689. ELSE(ENABLE_OPTIMIZATION MATCHES "ON")
  690. SET(CMAKE_C_OPT_FLAGS "-O0 -fstrict-aliasing")
  691. ENDIF(ENABLE_OPTIMIZATION MATCHES "ON")
  692. ENDIF(NOT CMAKE_C_OPT_FLAGS)
  693. IF(DEBUG_MODE MATCHES "ON")
  694. SET(CMAKE_BUILD_TYPE "Debug")
  695. ENDIF(DEBUG_MODE MATCHES "ON")
  696. SET(CMAKE_C_FLAGS "${CMAKE_C_OPT_FLAGS} ${CMAKE_C_FLAGS} ${CMAKE_C_WARN_FLAGS}")
  697. # Check platform specific includes
  698. CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
  699. CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H)
  700. CHECK_INCLUDE_FILES(sys/uio.h HAVE_SYS_UIO_H)
  701. CHECK_INCLUDE_FILES(fcntl.h HAVE_FCNTL_H)
  702. CHECK_INCLUDE_FILES(math.h HAVE_MATH_H)
  703. CHECK_INCLUDE_FILES(stdio.h HAVE_STDIO_H)
  704. CHECK_INCLUDE_FILES(stdlib.h HAVE_STDLIB_H)
  705. CHECK_INCLUDE_FILES(string.h HAVE_STRING_H)
  706. CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
  707. CHECK_INCLUDE_FILES(time.h HAVE_TIME_H)
  708. CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
  709. CHECK_INCLUDE_FILES(sysexits.h HAVE_SYSEXITS_H)
  710. CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H)
  711. CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H)
  712. CHECK_INCLUDE_FILES(endian.h HAVE_ENDIAN_H)
  713. CHECK_INCLUDE_FILES(sys/endian.h HAVE_SYS_ENDIAN_H)
  714. CHECK_INCLUDE_FILES(machine/endian.h HAVE_MACHINE_ENDIAN_H)
  715. CHECK_INCLUDE_FILES(sys/queue.h HAVE_SYS_QUEUE_H)
  716. CHECK_INCLUDE_FILES(sys/socket.h HAVE_SYS_SOCKET_H)
  717. CHECK_INCLUDE_FILES(sys/mman.h HAVE_SYS_MMAN_H)
  718. CHECK_INCLUDE_FILES(sys/un.h HAVE_SYS_UN_H)
  719. CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H)
  720. CHECK_INCLUDE_FILES(sys/wait.h HAVE_SYS_WAIT_H)
  721. CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
  722. CHECK_INCLUDE_FILES(sys/cdefs.h HAVE_SYS_CDEFS_H)
  723. CHECK_INCLUDE_FILES(sys/file.h HAVE_SYS_FILE_H)
  724. CHECK_INCLUDE_FILES(sys/utsname.h HAVE_SYS_UTSNAME_H)
  725. CHECK_INCLUDE_FILES(sys/resource.h HAVE_SYS_RESOURCE_H)
  726. CHECK_INCLUDE_FILES(netinet/in.h HAVE_NETINET_IN_H)
  727. CHECK_INCLUDE_FILES(arpa/inet.h HAVE_ARPA_INET_H)
  728. CHECK_INCLUDE_FILES(netdb.h HAVE_NETDB_H)
  729. CHECK_INCLUDE_FILES(syslog.h HAVE_SYSLOG_H)
  730. CHECK_INCLUDE_FILES(siginfo.h HAVE_SIGINFO_H)
  731. CHECK_INCLUDE_FILES(locale.h HAVE_LOCALE_H)
  732. CHECK_INCLUDE_FILES(libgen.h HAVE_LIBGEN_H)
  733. CHECK_INCLUDE_FILES(search.h HAVE_SEARCH_H)
  734. CHECK_INCLUDE_FILES(pwd.h HAVE_PWD_H)
  735. CHECK_INCLUDE_FILES(grp.h HAVE_GRP_H)
  736. CHECK_INCLUDE_FILES(glob.h HAVE_GLOB_H)
  737. CHECK_INCLUDE_FILES(poll.h HAVE_POLL_H)
  738. CHECK_INCLUDE_FILES(readpassphrase.h HAVE_READPASSPHRASE_H)
  739. CHECK_INCLUDE_FILES(termios.h HAVE_TERMIOS_H)
  740. CHECK_INCLUDE_FILES(paths.h HAVE_PATHS_H)
  741. CHECK_INCLUDE_FILES(sys/sendfile.h HAVE_SYS_SENDFILE_H)
  742. CHECK_INCLUDE_FILES(linux/falloc.h HAVE_LINUX_FALLOC_H)
  743. CHECK_INCLUDE_FILES(sys/eventfd.h HAVE_SYS_EVENTFD_H)
  744. CHECK_INCLUDE_FILES(aio.h HAVE_AIO_H)
  745. CHECK_INCLUDE_FILES(libaio.h HAVE_LIBAIO_H)
  746. # Some dependencies
  747. IF(HAVE_SYS_WAIT_H)
  748. LIST(APPEND CMAKE_REQUIRED_INCLUDES sys/wait.h)
  749. ENDIF(HAVE_SYS_WAIT_H)
  750. IF(HAVE_TIME_H)
  751. LIST(APPEND CMAKE_REQUIRED_INCLUDES time.h)
  752. ENDIF(HAVE_TIME_H)
  753. IF(HAVE_SYS_TIME_H)
  754. LIST(APPEND CMAKE_REQUIRED_INCLUDES sys/time.h)
  755. ENDIF(HAVE_SYS_TIME_H)
  756. # Check platform API
  757. CHECK_FUNCTION_EXISTS(setproctitle HAVE_SETPROCTITLE)
  758. CHECK_FUNCTION_EXISTS(getpagesize HAVE_GETPAGESIZE)
  759. CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
  760. CHECK_FUNCTION_EXISTS(vfork HAVE_VFORK)
  761. CHECK_FUNCTION_EXISTS(wait4 HAVE_WAIT4)
  762. CHECK_FUNCTION_EXISTS(waitpid HAVE_WAITPID)
  763. CHECK_FUNCTION_EXISTS(flock HAVE_FLOCK)
  764. CHECK_FUNCTION_EXISTS(tanhl HAVE_TANHL)
  765. CHECK_FUNCTION_EXISTS(tanh HAVE_TANH)
  766. CHECK_FUNCTION_EXISTS(expl HAVE_EXPL)
  767. CHECK_FUNCTION_EXISTS(exp2l HAVE_EXP2L)
  768. CHECK_FUNCTION_EXISTS(sendfile HAVE_SENDFILE)
  769. CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
  770. CHECK_FUNCTION_EXISTS(setitimer HAVE_SETITIMER)
  771. CHECK_FUNCTION_EXISTS(inet_pton HAVE_INET_PTON)
  772. CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)
  773. #
  774. # Check macros
  775. CHECK_SYMBOL_EXISTS(PATH_MAX limits.h HAVE_PATH_MAX)
  776. CHECK_SYMBOL_EXISTS(MAXPATHLEN sys/param.h HAVE_MAXPATHLEN)
  777. CHECK_SYMBOL_EXISTS(MAP_SHARED sys/mman.h HAVE_MMAP_SHARED)
  778. CHECK_SYMBOL_EXISTS(MAP_ANON sys/mman.h HAVE_MMAP_ANON)
  779. CHECK_SYMBOL_EXISTS(MAP_NOCORE sys/mman.h HAVE_MMAP_NOCORE)
  780. CHECK_SYMBOL_EXISTS(O_DIRECT fcntl.h HAVE_O_DIRECT)
  781. CHECK_SYMBOL_EXISTS(posix_fadvise fcntl.h HAVE_FADVISE)
  782. CHECK_SYMBOL_EXISTS(posix_fallocate fcntl.h HAVE_POSIX_FALLOCATE)
  783. CHECK_SYMBOL_EXISTS(fallocate fcntl.h HAVE_FALLOCATE)
  784. CHECK_SYMBOL_EXISTS(fdatasync unistd.h HAVE_FDATASYNC)
  785. CHECK_SYMBOL_EXISTS(_SC_NPROCESSORS_ONLN unistd.h HAVE_SC_NPROCESSORS_ONLN)
  786. CHECK_SYMBOL_EXISTS(setbit sys/param.h PARAM_H_HAS_BITSET)
  787. CHECK_SYMBOL_EXISTS(getaddrinfo "sys/types.h;sys/socket.h;netdb.h" HAVE_GETADDRINFO)
  788. IF(NOT HAVE_GETADDRINFO)
  789. MESSAGE(FATAL_ERROR "Your system does not support getaddrinfo call, please consider upgrading it to run rspamd")
  790. ENDIF(NOT HAVE_GETADDRINFO)
  791. IF(HAVE_SIGINFO_H)
  792. CHECK_SYMBOL_EXISTS(SA_SIGINFO "signal.h;siginfo.h" HAVE_SA_SIGINFO)
  793. ELSE(HAVE_SIGINFO_H)
  794. CHECK_SYMBOL_EXISTS(SA_SIGINFO "signal.h" HAVE_SA_SIGINFO)
  795. ENDIF(HAVE_SIGINFO_H)
  796. # Some hack for libevent 2.0
  797. CHECK_C_SOURCE_COMPILES ("#include <event.h>
  798. #if _EVENT_NUMERIC_VERSION < 0x02000000
  799. #error Unsupported
  800. #endif
  801. int main() { return 0;}" HAVE_LIBEVENT2)
  802. IF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  803. IF(HAVE_CLOCK_GETTIME)
  804. CHECK_SYMBOL_EXISTS(CLOCK_PROCESS_CPUTIME_ID time.h HAVE_CLOCK_PROCESS_CPUTIME_ID)
  805. CHECK_SYMBOL_EXISTS(CLOCK_VIRTUAL time.h HAVE_CLOCK_VIRTUAL)
  806. ELSE(HAVE_CLOCK_GETTIME)
  807. CHECK_INCLUDE_FILES(sys/timeb.h HAVE_SYS_TIMEB_H)
  808. ENDIF(HAVE_CLOCK_GETTIME)
  809. # Check asm pause instruction
  810. CHECK_C_SOURCE_COMPILES ("#include <sys/types.h>
  811. int main (int argc, char **argv) {
  812. __asm __volatile(\"pause\");
  813. return 0;
  814. }" HAVE_ASM_PAUSE)
  815. ENDIF(NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  816. # Check queue.h compatibility
  817. IF(NOT HAVE_COMPATIBLE_QUEUE_H)
  818. INCLUDE_DIRECTORIES(compat)
  819. ENDIF(NOT HAVE_COMPATIBLE_QUEUE_H)
  820. SET(CONTRIBSRC "")
  821. IF(NOT DESTDIR)
  822. SET(DESTDIR $ENV{DESTDIR})
  823. ENDIF(NOT DESTDIR)
  824. # Try to detect tip version from hg
  825. SET(ID "unknown")
  826. FIND_PROGRAM(HG "hg")
  827. IF(HG)
  828. EXECUTE_PROCESS(COMMAND "${HG}" id OUTPUT_VARIABLE HG_ID ERROR_QUIET)
  829. IF(HG_ID)
  830. STRING(REGEX MATCH ^[0-9a-z]+ RSPAMD_ID "${HG_ID}")
  831. ELSE(HG_ID)
  832. FIND_FILE(HG_ARCH ".hg_archival.txt" "${CMAKE_CURRENT_SOURCE_DIR}")
  833. IF(HG_ARCH)
  834. FILE(READ ${HG_ARCH} HG_ID)
  835. IF(HG_ID)
  836. STRING(REGEX MATCH "node: [0-9a-z]+" _tmp "${HG_ID}")
  837. STRING(SUBSTRING "${_tmp}" 6 12 RSPAMD_ID)
  838. ENDIF(HG_ID)
  839. ENDIF(HG_ARCH)
  840. ENDIF(HG_ID)
  841. ELSE(HG)
  842. # Now check .hg_archival.txt
  843. FIND_FILE(HG_ARCH ".hg_archival.txt" "${CMAKE_CURRENT_SOURCE_DIR}")
  844. IF(HG_ARCH)
  845. FILE(READ ${HG_ARCH} HG_ID)
  846. IF(HG_ID)
  847. STRING(REGEX MATCH "node: [0-9a-z]+" _tmp "${HG_ID}")
  848. STRING(SUBSTRING "${_tmp}" 6 12 RSPAMD_ID)
  849. ENDIF(HG_ID)
  850. ENDIF(HG_ARCH)
  851. ENDIF(HG)
  852. ################################ SOURCES SECTION ###########################
  853. INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/src"
  854. "${CMAKE_BINARY_DIR}/src"
  855. "${CMAKE_SOURCE_DIR}/src/ucl/include"
  856. "${CMAKE_SOURCE_DIR}/contrib/uthash")
  857. SET(RSPAMDSRC src/modules.c
  858. src/controller.c
  859. src/fuzzy_storage.c
  860. src/lua_worker.c
  861. src/main.c
  862. src/map.c
  863. src/smtp.c
  864. src/smtp_proxy.c
  865. src/webui.c
  866. src/worker.c)
  867. SET(PLUGINSSRC src/plugins/surbl.c
  868. src/plugins/regexp.c
  869. src/plugins/chartable.c
  870. src/plugins/fuzzy_check.c
  871. src/plugins/spf.c
  872. src/plugins/dkim_check.c)
  873. SET(MODULES_LIST surbl regexp chartable fuzzy_check spf dkim)
  874. SET(WORKERS_LIST normal controller smtp smtp_proxy fuzzy lua webui)
  875. AddModules(MODULES_LIST WORKERS_LIST)
  876. ################################ SUBDIRS SECTION ###########################
  877. ADD_SUBDIRECTORY(contrib/lgpl)
  878. IF(GLIB_COMPAT)
  879. INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/contrib/lgpl")
  880. ENDIF(GLIB_COMPAT)
  881. IF(NOT HIREDIS_FOUND)
  882. ADD_SUBDIRECTORY(contrib/hiredis)
  883. INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/contrib/hiredis")
  884. ENDIF(NOT HIREDIS_FOUND)
  885. ADD_SUBDIRECTORY(src/lua)
  886. ADD_SUBDIRECTORY(src/json)
  887. ADD_SUBDIRECTORY(src/cdb)
  888. ADD_SUBDIRECTORY(src/ucl)
  889. ADD_SUBDIRECTORY(lib)
  890. ADD_SUBDIRECTORY(src/client)
  891. ADD_SUBDIRECTORY(utils)
  892. ADD_SUBDIRECTORY(test)
  893. LIST(LENGTH PLUGINSSRC RSPAMD_MODULES_NUM)
  894. ############################ TARGETS SECTION ###############################
  895. CONFIGURE_FILE(config.h.in src/config.h)
  896. CONFIGURE_FILE(contrib/exim/local_scan.c.in contrib/exim/local_scan_rspamd.c @ONLY)
  897. SET(CONFFILES
  898. conf/composites.conf
  899. conf/logging.conf
  900. conf/metrics.conf
  901. conf/modules.conf
  902. conf/options.conf
  903. conf/rspamd.conf
  904. conf/statistic.conf
  905. conf/workers.conf
  906. conf/2tld.inc
  907. conf/surbl-whitelist.inc)
  908. ######################### LINK SECTION ###############################
  909. ADD_EXECUTABLE(rspamd ${RSPAMDSRC} ${CONTRIBSRC} ${PLUGINSSRC})
  910. SET_TARGET_PROPERTIES(rspamd PROPERTIES LINKER_LANGUAGE C)
  911. SET_TARGET_PROPERTIES(rspamd PROPERTIES COMPILE_FLAGS "-DRSPAMD_MAIN")
  912. IF(NOT DEBIAN_BUILD)
  913. SET_TARGET_PROPERTIES(rspamd PROPERTIES VERSION ${RSPAMD_VERSION})
  914. ENDIF(NOT DEBIAN_BUILD)
  915. TARGET_LINK_LIBRARIES(rspamd rspamd-mime)
  916. TARGET_LINK_LIBRARIES(rspamd rspamd-server)
  917. TARGET_LINK_LIBRARIES(rspamd rspamd-util)
  918. TARGET_LINK_LIBRARIES(rspamd rspamd-lua)
  919. IF(LIBJUDY_LIBRARY)
  920. TARGET_LINK_LIBRARIES(rspamd Judy)
  921. ENDIF(LIBJUDY_LIBRARY)
  922. TARGET_LINK_LIBRARIES(rspamd event)
  923. IF(HAVE_LIBEVENT2)
  924. TARGET_LINK_LIBRARIES(rspamd event_pthreads)
  925. ENDIF(HAVE_LIBEVENT2)
  926. IF(WITH_DB)
  927. TARGET_LINK_LIBRARIES(rspamd db)
  928. ENDIF(WITH_DB)
  929. IF(SQLITE_LIBRARIES)
  930. TARGET_LINK_LIBRARIES(rspamd ${SQLITE_LIBRARIES})
  931. ENDIF(SQLITE_LIBRARIES)
  932. IF(OPENSSL_FOUND)
  933. TARGET_LINK_LIBRARIES(rspamd ${OPENSSL_LIBRARIES})
  934. ENDIF(OPENSSL_FOUND)
  935. TARGET_LINK_LIBRARIES(rspamd ${PCRE_LIBRARIES})
  936. IF(GMIME24)
  937. TARGET_LINK_LIBRARIES(rspamd ${GMIME24_LIBRARIES})
  938. ELSE(GMIME24)
  939. TARGET_LINK_LIBRARIES(rspamd ${GMIME2_LIBRARIES})
  940. ENDIF(GMIME24)
  941. TARGET_LINK_LIBRARIES(rspamd ${GLIB2_LIBRARIES})
  942. IF(HAVE_FETCH_H)
  943. TARGET_LINK_LIBRARIES(rspamd fetch)
  944. ELSE(HAVE_FETCH_H)
  945. IF(CURL_FOUND)
  946. TARGET_LINK_LIBRARIES(rspamd ${CURL_LIBRARIES})
  947. ENDIF(CURL_FOUND)
  948. ENDIF(HAVE_FETCH_H)
  949. TARGET_LINK_LIBRARIES(rspamd ${CMAKE_REQUIRED_LIBRARIES})
  950. IF(ENABLE_STATIC MATCHES "ON")
  951. TARGET_LINK_LIBRARIES(rspamd ${PCRE_LIBRARIES})
  952. TARGET_LINK_LIBRARIES(rspamd "z")
  953. ENDIF(ENABLE_STATIC MATCHES "ON")
  954. IF(ENABLE_LUAJIT MATCHES "ON")
  955. TARGET_LINK_LIBRARIES(rspamd "${LUAJIT_LIBRARY}")
  956. ELSE(ENABLE_LUAJIT MATCHES "ON")
  957. TARGET_LINK_LIBRARIES(rspamd "${LUA_LIBRARY}")
  958. ENDIF(ENABLE_LUAJIT MATCHES "ON")
  959. IF(ENABLE_GPERF_TOOLS MATCHES "ON")
  960. TARGET_LINK_LIBRARIES(rspamd profiler)
  961. ENDIF(ENABLE_GPERF_TOOLS MATCHES "ON")
  962. TARGET_LINK_LIBRARIES(rspamd hiredis)
  963. IF(GLIB_COMPAT)
  964. TARGET_LINK_LIBRARIES(rspamd glibadditions)
  965. ENDIF(GLIB_COMPAT)
  966. ##################### INSTALLATION ##########################################
  967. # Binaries
  968. INSTALL(TARGETS rspamd RUNTIME DESTINATION bin)
  969. # Configs
  970. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${CONFDIR})")
  971. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${EXAMPLESDIR})")
  972. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${PLUGINSDIR}/lua)")
  973. # Install configs only if they are unchanged
  974. LIST(LENGTH CONFFILES CONFLIST_COUNT)
  975. MATH(EXPR CONFLIST_MAX ${CONFLIST_COUNT}-1)
  976. FOREACH(CONF_IDX RANGE ${CONFLIST_MAX})
  977. LIST(GET CONFFILES ${CONF_IDX} CONF_FILE)
  978. IF(BUILD_PORT)
  979. INSTALL_IF_NOT_EXISTS(${CONF_FILE} ${CONFDIR} ".sample")
  980. ELSE(BUILD_PORT)
  981. INSTALL_IF_NOT_EXISTS(${CONF_FILE} ${CONFDIR} "")
  982. ENDIF(BUILD_PORT)
  983. ENDFOREACH(CONF_IDX RANGE ${CONFLIST_MAX})
  984. # Lua plugins
  985. FILE(GLOB LUA_PLUGINS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/lua"
  986. "${CMAKE_CURRENT_SOURCE_DIR}/src/plugins/lua/*.lua" )
  987. FOREACH(LUA_PLUGIN ${LUA_PLUGINS})
  988. GET_FILENAME_COMPONENT(_rp ${LUA_PLUGIN} PATH)
  989. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${PLUGINSDIR}/lua/${_rp})")
  990. INSTALL(FILES "src/plugins/lua/${LUA_PLUGIN}" DESTINATION ${PLUGINSDIR}/lua/${_rp})
  991. ENDFOREACH(LUA_PLUGIN)
  992. # Lua config
  993. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${CONFDIR}/lua)")
  994. FILE(GLOB_RECURSE LUA_CONFIGS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/conf/lua"
  995. "${CMAKE_CURRENT_SOURCE_DIR}/conf/lua/*.lua")
  996. FOREACH(LUA_CONF ${LUA_CONFIGS})
  997. GET_FILENAME_COMPONENT(_rp ${LUA_CONF} PATH)
  998. INSTALL(CODE "FILE(MAKE_DIRECTORY \$ENV{DESTDIR}${CONFDIR}/lua/${_rp})")
  999. INSTALL(FILES "conf/lua/${LUA_CONF}" DESTINATION ${CONFDIR}/lua/${_rp})
  1000. ENDFOREACH(LUA_CONF)
  1001. # Manual pages
  1002. INSTALL(FILES "doc/rspamd.8" DESTINATION ${MANDIR}/man8)
  1003. INSTALL(FILES "doc/rspamc.1" DESTINATION ${MANDIR}/man1)