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 37KB

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