OPTION(ENABLE_PCRE2 "Enable pcre2 instead of pcre [default: ON]" ON) | OPTION(ENABLE_PCRE2 "Enable pcre2 instead of pcre [default: ON]" ON) | ||||
OPTION(ENABLE_JEMALLOC "Build rspamd with jemalloc allocator [default: OFF]" OFF) | OPTION(ENABLE_JEMALLOC "Build rspamd with jemalloc allocator [default: OFF]" OFF) | ||||
OPTION(ENABLE_UTILS "Build rspamd internal utils [default: OFF]" OFF) | OPTION(ENABLE_UTILS "Build rspamd internal utils [default: OFF]" OFF) | ||||
OPTION(ENABLE_LIBUNWIND "Use libunwind to print crash traces [default: OFF]" OFF) | |||||
OPTION(ENABLE_LIBUNWIND "Obsoleted [default: OFF]" OFF) | |||||
OPTION(ENABLE_LUA_TRACE "Trace all Lua C API invocations [default: OFF]" OFF) | OPTION(ENABLE_LUA_TRACE "Trace all Lua C API invocations [default: OFF]" OFF) | ||||
OPTION(ENABLE_LUA_REPL "Enables Lua repl (requires C++11 compiler) [default: ON]" ON) | OPTION(ENABLE_LUA_REPL "Enables Lua repl (requires C++11 compiler) [default: ON]" ON) | ||||
OPTION(ENABLE_FASTTEXT "Link with FastText library [default: OFF]" OFF) | OPTION(ENABLE_FASTTEXT "Link with FastText library [default: OFF]" OFF) | ||||
SET(WITH_JEMALLOC "1") | SET(WITH_JEMALLOC "1") | ||||
ENDIF () | ENDIF () | ||||
IF (ENABLE_LIBUNWIND MATCHES "ON") | |||||
ProcessPackage(LIBUNWIND LIBRARY unwind INCLUDE libunwind.h INCLUDE_SUFFIXES include/libunwind | |||||
ROOT ${LIBUNWIND_ROOT_DIR} MODULES libunwind) | |||||
SET(WITH_LIBUNWIND "1") | |||||
ELSE () | |||||
CHECK_SYMBOL_EXISTS(backtrace "execinfo.h" HAVE_BACKTRACE) | |||||
ENDIF () | |||||
ProcessPackage(GLIB2 LIBRARY glib-2.0 INCLUDE glib.h | ProcessPackage(GLIB2 LIBRARY glib-2.0 INCLUDE glib.h | ||||
INCLUDE_SUFFIXES include/glib include/glib-2.0 | INCLUDE_SUFFIXES include/glib include/glib-2.0 | ||||
ROOT ${GLIB_ROOT_DIR} MODULES glib-2.0>=2.28) | ROOT ${GLIB_ROOT_DIR} MODULES glib-2.0>=2.28) | ||||
ADD_SUBDIRECTORY(contrib/kann) | ADD_SUBDIRECTORY(contrib/kann) | ||||
ADD_SUBDIRECTORY(contrib/fastutf8) | ADD_SUBDIRECTORY(contrib/fastutf8) | ||||
ADD_SUBDIRECTORY(contrib/google-ced) | ADD_SUBDIRECTORY(contrib/google-ced) | ||||
ADD_SUBDIRECTORY(contrib/backward-cpp) | |||||
IF (SYSTEM_FMT MATCHES "OFF") | IF (SYSTEM_FMT MATCHES "OFF") | ||||
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/contrib/fmt/include") | INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/contrib/fmt/include") | ||||
ELSE () | ELSE () |
#cmakedefine WITH_PCRE2 1 | #cmakedefine WITH_PCRE2 1 | ||||
#cmakedefine WITH_SNOWBALL 1 | #cmakedefine WITH_SNOWBALL 1 | ||||
#cmakedefine WITH_SQLITE 1 | #cmakedefine WITH_SQLITE 1 | ||||
#cmakedefine WITH_LIBUNWIND 1 | |||||
#cmakedefine WITH_LUA_TRACE 1 | #cmakedefine WITH_LUA_TRACE 1 | ||||
#cmakedefine WITH_LUA_REPL 1 | #cmakedefine WITH_LUA_REPL 1 | ||||
#cmakedefine WITH_FASTTEXT 1 | #cmakedefine WITH_FASTTEXT 1 | ||||
#cmakedefine HAVE_BACKTRACE 1 | |||||
#cmakedefine BACKWARD_ENABLE 1 | |||||
#cmakedefine DISABLE_PTHREAD_MUTEX 1 | #cmakedefine DISABLE_PTHREAD_MUTEX 1 | ||||
# Rspamd Dependency Info | # Rspamd Dependency Info | ||||
| Name | Version | License | Patched | Notes | | |||||
|------------------------|---------|---------------------| --- | --- | | |||||
| aho-corasick | ? | LGPL-3.0 | YES | lowercase support | | |||||
| cdb | 1.1.0 | Public Domain / CC0 | NO | | | |||||
| hiredis | 0.13.3 | BSD-3-Clause | YES | many changes | | |||||
| libev | 4.33 | BSD-2-Clause | YES | many changes | | |||||
| lc-btrie | ? | BSD-3-Clause | YES | mempool support | | |||||
| libottery | ? | Public Domain / CC0 | YES | many changes | | |||||
| librdns | ? | BSD-2-Clause | YES | | | |||||
| libucl | ? | BSD-2-Clause | YES | | | |||||
| replxx | 6d93360 | BSD-2-Clause | YES | libicu usage | | |||||
| lua-argparse | 0.7.1 | MIT | NO | | | |||||
| lua-bit | 1.0.2 | MIT | YES | build fixes | | |||||
| lua-fun | ? | MIT | YES | rspamd text | | |||||
| lua-lpeg | 1.0 | MIT | YES | rspamd text + alloc| | |||||
| lua-moses | ? | MIT | NO | | | |||||
| lua-lupa | ? | MIT | NO | | | |||||
| lua-tableshape | 2.6.0 | MIT | NO | | | |||||
| mumhash | ? | MIT | NO | | | |||||
| ngx-http-parser | 2.2.0 | MIT | YES | spamc support | | |||||
| Mozilla-PublicSuffix | ? | MIT | NO | | | |||||
| snowball | ? | BSD-3-Clause | NO | | | |||||
| t1ha | ? | Zlib | NO | | | |||||
| uthash | 1.9.8 | BSD | YES | | | |||||
| xxhash | 0.8.1 | BSD | NO | | | |||||
| zstd | 1.5.4 | BSD | YES | build fixes only | | |||||
| google-ced | 37529e6 | Apache 2 | YES | build fixes | | |||||
| kann | ? | MIT | YES | blas/lapack changes| | |||||
| fpconv | ? | Boost | YES | many changes | | |||||
| fastutf8 | ? | MIT | YES | many changes | | |||||
| expected | v1.0 | Public Domain / CC0 | NO | | | |||||
| frozen | 1.0.1 | Apache 2 | NO | | | |||||
| fmt | 10.0.0 | MIT | NO | | | |||||
| doctest | 2.4.6 | MIT | NO | | | |||||
| function2 | 4.1.0 | Boost | NO | | | |||||
| ankerl/svector | 1.0.2 | MIT | NO | | | |||||
| ankerl/unordered_dense | 2.0.1 | MIT | NO | | | |||||
| Name | Version | License | Patched | Notes | | |||||
|------------------------|---------|---------------------|---------|---------------------| | |||||
| aho-corasick | ? | LGPL-3.0 | YES | lowercase support | | |||||
| cdb | 1.1.0 | Public Domain / CC0 | NO | | | |||||
| hiredis | 0.13.3 | BSD-3-Clause | YES | many changes | | |||||
| libev | 4.33 | BSD-2-Clause | YES | many changes | | |||||
| lc-btrie | ? | BSD-3-Clause | YES | mempool support | | |||||
| libottery | ? | Public Domain / CC0 | YES | many changes | | |||||
| librdns | ? | BSD-2-Clause | YES | | | |||||
| libucl | ? | BSD-2-Clause | YES | | | |||||
| replxx | 6d93360 | BSD-2-Clause | YES | libicu usage | | |||||
| lua-argparse | 0.7.1 | MIT | NO | | | |||||
| lua-bit | 1.0.2 | MIT | YES | build fixes | | |||||
| lua-fun | ? | MIT | YES | rspamd text | | |||||
| lua-lpeg | 1.0 | MIT | YES | rspamd text + alloc | | |||||
| lua-moses | ? | MIT | NO | | | |||||
| lua-lupa | ? | MIT | NO | | | |||||
| lua-tableshape | 2.6.0 | MIT | NO | | | |||||
| mumhash | ? | MIT | NO | | | |||||
| ngx-http-parser | 2.2.0 | MIT | YES | spamc support | | |||||
| Mozilla-PublicSuffix | ? | MIT | NO | | | |||||
| snowball | ? | BSD-3-Clause | NO | | | |||||
| t1ha | ? | Zlib | NO | | | |||||
| uthash | 1.9.8 | BSD | YES | | | |||||
| xxhash | 0.8.1 | BSD | NO | | | |||||
| zstd | 1.5.4 | BSD | YES | build fixes only | | |||||
| google-ced | 37529e6 | Apache 2 | YES | build fixes | | |||||
| kann | ? | MIT | YES | blas/lapack changes | | |||||
| fpconv | ? | Boost | YES | many changes | | |||||
| fastutf8 | ? | MIT | YES | many changes | | |||||
| expected | v1.0 | Public Domain / CC0 | NO | | | |||||
| frozen | 1.0.1 | Apache 2 | NO | | | |||||
| fmt | 10.0.0 | MIT | NO | | | |||||
| doctest | 2.4.6 | MIT | NO | | | |||||
| function2 | 4.1.0 | Boost | NO | | | |||||
| ankerl/svector | 1.0.2 | MIT | NO | | | |||||
| ankerl/unordered_dense | 2.0.1 | MIT | NO | | | |||||
| backward-cpp | 1.6 | MIT | NO | | | |||||
# | |||||
# BackwardMacros.cmake | |||||
# Copyright 2013 Google Inc. All Rights Reserved. | |||||
# | |||||
# Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
# of this software and associated documentation files (the "Software"), to deal | |||||
# in the Software without restriction, including without limitation the rights | |||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
# copies of the Software, and to permit persons to whom the Software is | |||||
# furnished to do so, subject to the following conditions: | |||||
# | |||||
# The above copyright notice and this permission notice shall be included in | |||||
# all copies or substantial portions of the Software. | |||||
# | |||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||||
# SOFTWARE. | |||||
############################################################################### | |||||
# OPTIONS | |||||
############################################################################### | |||||
set(STACK_WALKING_UNWIND TRUE CACHE BOOL | |||||
"Use compiler's unwind API") | |||||
set(STACK_WALKING_BACKTRACE FALSE CACHE BOOL | |||||
"Use backtrace from (e)glibc for stack walking") | |||||
set(STACK_WALKING_LIBUNWIND FALSE CACHE BOOL | |||||
"Use libunwind for stack walking") | |||||
set(STACK_DETAILS_AUTO_DETECT TRUE CACHE BOOL | |||||
"Auto detect backward's stack details dependencies") | |||||
set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE CACHE BOOL | |||||
"Use backtrace from (e)glibc for symbols resolution") | |||||
set(STACK_DETAILS_DW FALSE CACHE BOOL | |||||
"Use libdw to read debug info") | |||||
set(STACK_DETAILS_BFD FALSE CACHE BOOL | |||||
"Use libbfd to read debug info") | |||||
set(STACK_DETAILS_DWARF FALSE CACHE BOOL | |||||
"Use libdwarf/libelf to read debug info") | |||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND NOT DEFINED BACKWARD_TESTS) | |||||
# If this is a top level CMake project, we most lixely want the tests | |||||
set(BACKWARD_TESTS ON CACHE BOOL "Enable tests") | |||||
else() | |||||
set(BACKWARD_TESTS OFF CACHE BOOL "Enable tests") | |||||
endif() | |||||
############################################################################### | |||||
# CONFIGS | |||||
############################################################################### | |||||
include(FindPackageHandleStandardArgs) | |||||
if (STACK_WALKING_LIBUNWIND) | |||||
# libunwind works on the macOS without having to add special include | |||||
# paths or libraries | |||||
if (NOT APPLE) | |||||
find_path(LIBUNWIND_INCLUDE_DIR NAMES "libunwind.h") | |||||
find_library(LIBUNWIND_LIBRARY unwind) | |||||
if (LIBUNWIND_LIBRARY) | |||||
include(CheckSymbolExists) | |||||
check_symbol_exists(UNW_INIT_SIGNAL_FRAME libunwind.h HAVE_UNW_INIT_SIGNAL_FRAME) | |||||
if (NOT HAVE_UNW_INIT_SIGNAL_FRAME) | |||||
message(STATUS "libunwind does not support unwinding from signal handler frames") | |||||
endif() | |||||
endif() | |||||
set(LIBUNWIND_INCLUDE_DIRS ${LIBUNWIND_INCLUDE_DIR}) | |||||
set(LIBDWARF_LIBRARIES ${LIBUNWIND_LIBRARY}) | |||||
find_package_handle_standard_args(libunwind DEFAULT_MSG | |||||
LIBUNWIND_LIBRARY LIBUNWIND_INCLUDE_DIR) | |||||
mark_as_advanced(LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARY) | |||||
list(APPEND _BACKWARD_LIBRARIES ${LIBUNWIND_LIBRARY}) | |||||
endif() | |||||
# Disable other unwinders if libunwind is found | |||||
set(STACK_WALKING_UNWIND FALSE) | |||||
set(STACK_WALKING_BACKTRACE FALSE) | |||||
endif() | |||||
if (${STACK_DETAILS_AUTO_DETECT}) | |||||
if(NOT CMAKE_VERSION VERSION_LESS 3.17) | |||||
set(_name_mismatched_arg NAME_MISMATCHED) | |||||
endif() | |||||
# find libdw | |||||
find_path(LIBDW_INCLUDE_DIR NAMES "elfutils/libdw.h" "elfutils/libdwfl.h") | |||||
find_library(LIBDW_LIBRARY dw) | |||||
set(LIBDW_INCLUDE_DIRS ${LIBDW_INCLUDE_DIR} ) | |||||
set(LIBDW_LIBRARIES ${LIBDW_LIBRARY} ) | |||||
find_package_handle_standard_args(libdw ${_name_mismatched_arg} | |||||
REQUIRED_VARS LIBDW_LIBRARY LIBDW_INCLUDE_DIR) | |||||
mark_as_advanced(LIBDW_INCLUDE_DIR LIBDW_LIBRARY) | |||||
# find libbfd | |||||
find_path(LIBBFD_INCLUDE_DIR NAMES "bfd.h") | |||||
find_path(LIBDL_INCLUDE_DIR NAMES "dlfcn.h") | |||||
find_library(LIBBFD_LIBRARY bfd) | |||||
find_library(LIBDL_LIBRARY dl) | |||||
set(LIBBFD_INCLUDE_DIRS ${LIBBFD_INCLUDE_DIR} ${LIBDL_INCLUDE_DIR}) | |||||
set(LIBBFD_LIBRARIES ${LIBBFD_LIBRARY} ${LIBDL_LIBRARY}) | |||||
find_package_handle_standard_args(libbfd ${_name_mismatched_arg} | |||||
REQUIRED_VARS LIBBFD_LIBRARY LIBBFD_INCLUDE_DIR | |||||
LIBDL_LIBRARY LIBDL_INCLUDE_DIR) | |||||
mark_as_advanced(LIBBFD_INCLUDE_DIR LIBBFD_LIBRARY | |||||
LIBDL_INCLUDE_DIR LIBDL_LIBRARY) | |||||
# find libdwarf | |||||
find_path(LIBDWARF_INCLUDE_DIR NAMES "libdwarf.h" PATH_SUFFIXES libdwarf) | |||||
find_path(LIBELF_INCLUDE_DIR NAMES "libelf.h") | |||||
find_path(LIBDL_INCLUDE_DIR NAMES "dlfcn.h") | |||||
find_library(LIBDWARF_LIBRARY dwarf) | |||||
find_library(LIBELF_LIBRARY elf) | |||||
find_library(LIBDL_LIBRARY dl) | |||||
set(LIBDWARF_INCLUDE_DIRS ${LIBDWARF_INCLUDE_DIR} ${LIBELF_INCLUDE_DIR} ${LIBDL_INCLUDE_DIR}) | |||||
set(LIBDWARF_LIBRARIES ${LIBDWARF_LIBRARY} ${LIBELF_LIBRARY} ${LIBDL_LIBRARY}) | |||||
find_package_handle_standard_args(libdwarf ${_name_mismatched_arg} | |||||
REQUIRED_VARS LIBDWARF_LIBRARY LIBDWARF_INCLUDE_DIR | |||||
LIBELF_LIBRARY LIBELF_INCLUDE_DIR | |||||
LIBDL_LIBRARY LIBDL_INCLUDE_DIR) | |||||
mark_as_advanced(LIBDWARF_INCLUDE_DIR LIBDWARF_LIBRARY | |||||
LIBELF_INCLUDE_DIR LIBELF_LIBRARY | |||||
LIBDL_INCLUDE_DIR LIBDL_LIBRARY) | |||||
if (LIBDW_FOUND) | |||||
LIST(APPEND _BACKWARD_INCLUDE_DIRS ${LIBDW_INCLUDE_DIRS}) | |||||
LIST(APPEND _BACKWARD_LIBRARIES ${LIBDW_LIBRARIES}) | |||||
set(STACK_DETAILS_DW TRUE) | |||||
set(STACK_DETAILS_BFD FALSE) | |||||
set(STACK_DETAILS_DWARF FALSE) | |||||
set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) | |||||
elseif(LIBBFD_FOUND) | |||||
LIST(APPEND _BACKWARD_INCLUDE_DIRS ${LIBBFD_INCLUDE_DIRS}) | |||||
LIST(APPEND _BACKWARD_LIBRARIES ${LIBBFD_LIBRARIES}) | |||||
# If we attempt to link against static bfd, make sure to link its dependencies, too | |||||
get_filename_component(bfd_lib_ext "${LIBBFD_LIBRARY}" EXT) | |||||
if (bfd_lib_ext STREQUAL "${CMAKE_STATIC_LIBRARY_SUFFIX}") | |||||
list(APPEND _BACKWARD_LIBRARIES iberty z) | |||||
endif() | |||||
set(STACK_DETAILS_DW FALSE) | |||||
set(STACK_DETAILS_BFD TRUE) | |||||
set(STACK_DETAILS_DWARF FALSE) | |||||
set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) | |||||
elseif(LIBDWARF_FOUND) | |||||
LIST(APPEND _BACKWARD_INCLUDE_DIRS ${LIBDWARF_INCLUDE_DIRS}) | |||||
LIST(APPEND _BACKWARD_LIBRARIES ${LIBDWARF_LIBRARIES}) | |||||
set(STACK_DETAILS_DW FALSE) | |||||
set(STACK_DETAILS_BFD FALSE) | |||||
set(STACK_DETAILS_DWARF TRUE) | |||||
set(STACK_DETAILS_BACKTRACE_SYMBOL FALSE) | |||||
else() | |||||
set(STACK_DETAILS_DW FALSE) | |||||
set(STACK_DETAILS_BFD FALSE) | |||||
set(STACK_DETAILS_DWARF FALSE) | |||||
set(STACK_DETAILS_BACKTRACE_SYMBOL TRUE) | |||||
endif() | |||||
else() | |||||
if (STACK_DETAILS_DW) | |||||
LIST(APPEND _BACKWARD_LIBRARIES dw) | |||||
endif() | |||||
if (STACK_DETAILS_BFD) | |||||
LIST(APPEND _BACKWARD_LIBRARIES bfd dl) | |||||
endif() | |||||
if (STACK_DETAILS_DWARF) | |||||
LIST(APPEND _BACKWARD_LIBRARIES dwarf elf) | |||||
endif() | |||||
endif() | |||||
macro(map_definitions var_prefix define_prefix) | |||||
foreach(def ${ARGN}) | |||||
if (${${var_prefix}${def}}) | |||||
LIST(APPEND _BACKWARD_DEFINITIONS "${define_prefix}${def}=1") | |||||
else() | |||||
LIST(APPEND _BACKWARD_DEFINITIONS "${define_prefix}${def}=0") | |||||
endif() | |||||
endforeach() | |||||
endmacro() | |||||
if (NOT _BACKWARD_DEFINITIONS) | |||||
map_definitions("STACK_WALKING_" "BACKWARD_HAS_" UNWIND LIBUNWIND BACKTRACE) | |||||
map_definitions("STACK_DETAILS_" "BACKWARD_HAS_" BACKTRACE_SYMBOL DW BFD DWARF) | |||||
endif() | |||||
if(WIN32) | |||||
list(APPEND _BACKWARD_LIBRARIES dbghelp psapi) | |||||
if(MINGW) | |||||
set(MINGW_MSVCR_LIBRARY "msvcr90$<$<CONFIG:DEBUG>:d>" CACHE STRING "Mingw MSVC runtime import library") | |||||
list(APPEND _BACKWARD_LIBRARIES ${MINGW_MSVCR_LIBRARY}) | |||||
endif() | |||||
endif() | |||||
set(BACKWARD_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}") | |||||
set(BACKWARD_HAS_EXTERNAL_LIBRARIES FALSE) | |||||
set(FIND_PACKAGE_REQUIRED_VARS BACKWARD_INCLUDE_DIR) | |||||
if(DEFINED _BACKWARD_LIBRARIES) | |||||
set(BACKWARD_HAS_EXTERNAL_LIBRARIES TRUE) | |||||
list(APPEND FIND_PACKAGE_REQUIRED_VARS _BACKWARD_LIBRARIES) | |||||
endif() | |||||
include(FindPackageHandleStandardArgs) | |||||
find_package_handle_standard_args(Backward | |||||
REQUIRED_VARS ${FIND_PACKAGE_REQUIRED_VARS} | |||||
) | |||||
list(APPEND _BACKWARD_INCLUDE_DIRS ${BACKWARD_INCLUDE_DIR}) | |||||
macro(add_backward target) | |||||
target_include_directories(${target} PRIVATE ${BACKWARD_INCLUDE_DIRS}) | |||||
set_property(TARGET ${target} APPEND PROPERTY COMPILE_DEFINITIONS ${BACKWARD_DEFINITIONS}) | |||||
set_property(TARGET ${target} APPEND PROPERTY LINK_LIBRARIES ${BACKWARD_LIBRARIES}) | |||||
endmacro() | |||||
set(BACKWARD_INCLUDE_DIRS ${_BACKWARD_INCLUDE_DIRS} CACHE INTERNAL "_BACKWARD_INCLUDE_DIRS") | |||||
set(BACKWARD_DEFINITIONS ${_BACKWARD_DEFINITIONS} CACHE INTERNAL "BACKWARD_DEFINITIONS") | |||||
set(BACKWARD_LIBRARIES ${_BACKWARD_LIBRARIES} CACHE INTERNAL "BACKWARD_LIBRARIES") | |||||
mark_as_advanced(BACKWARD_INCLUDE_DIRS BACKWARD_DEFINITIONS BACKWARD_LIBRARIES) | |||||
# Expand each definition in BACKWARD_DEFINITIONS to its own cmake var and export | |||||
# to outer scope | |||||
foreach(var ${BACKWARD_DEFINITIONS}) | |||||
string(REPLACE "=" ";" var_as_list ${var}) | |||||
list(GET var_as_list 0 var_name) | |||||
list(GET var_as_list 1 var_value) | |||||
set(${var_name} ${var_value}) | |||||
mark_as_advanced(${var_name}) | |||||
endforeach() | |||||
if (NOT TARGET Backward::Backward) | |||||
add_library(Backward::Backward INTERFACE IMPORTED) | |||||
set_target_properties(Backward::Backward PROPERTIES | |||||
INTERFACE_INCLUDE_DIRECTORIES "${BACKWARD_INCLUDE_DIRS}" | |||||
INTERFACE_COMPILE_DEFINITIONS "${BACKWARD_DEFINITIONS}" | |||||
) | |||||
if(BACKWARD_HAS_EXTERNAL_LIBRARIES) | |||||
set_target_properties(Backward::Backward PROPERTIES | |||||
INTERFACE_LINK_LIBRARIES "${BACKWARD_LIBRARIES}" | |||||
) | |||||
endif() | |||||
endif() |
# | |||||
# CMakeLists.txt | |||||
# Copyright 2013 Google Inc. All Rights Reserved. | |||||
# | |||||
# Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
# of this software and associated documentation files (the "Software"), to deal | |||||
# in the Software without restriction, including without limitation the rights | |||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
# copies of the Software, and to permit persons to whom the Software is | |||||
# furnished to do so, subject to the following conditions: | |||||
# | |||||
# The above copyright notice and this permission notice shall be included in | |||||
# all copies or substantial portions of the Software. | |||||
# | |||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||||
# SOFTWARE. | |||||
cmake_minimum_required(VERSION 3.0) | |||||
project(backward CXX) | |||||
# Introduce variables: | |||||
# * CMAKE_INSTALL_LIBDIR | |||||
# * CMAKE_INSTALL_BINDIR | |||||
# * CMAKE_INSTALL_INCLUDEDIR | |||||
include(GNUInstallDirs) | |||||
include(BackwardConfig.cmake) | |||||
# check if compiler is nvcc or nvcc_wrapper | |||||
set(COMPILER_IS_NVCC false) | |||||
get_filename_component(COMPILER_NAME ${CMAKE_CXX_COMPILER} NAME) | |||||
if (COMPILER_NAME MATCHES "^nvcc") | |||||
set(COMPILER_IS_NVCC true) | |||||
endif() | |||||
if (DEFINED ENV{OMPI_CXX} OR DEFINED ENV{MPICH_CXX}) | |||||
if ( ($ENV{OMPI_CXX} MATCHES "nvcc") OR ($ENV{MPICH_CXX} MATCHES "nvcc") ) | |||||
set(COMPILER_IS_NVCC true) | |||||
endif() | |||||
endif() | |||||
# set CXX standard | |||||
set(CMAKE_CXX_STANDARD_REQUIRED True) | |||||
set(CMAKE_CXX_STANDARD 11) | |||||
if (${COMPILER_IS_NVCC}) | |||||
# GNU CXX extensions are not supported by nvcc | |||||
set(CMAKE_CXX_EXTENSIONS OFF) | |||||
endif() | |||||
############################################################################### | |||||
# COMPILER FLAGS | |||||
############################################################################### | |||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX) | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") | |||||
if (NOT ${COMPILER_IS_NVCC}) | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors") | |||||
endif() | |||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") | |||||
endif() | |||||
############################################################################### | |||||
# BACKWARD OBJECT | |||||
############################################################################### | |||||
add_library(backward_object OBJECT backward.cpp) | |||||
target_compile_definitions(backward_object PRIVATE ${BACKWARD_DEFINITIONS}) | |||||
target_include_directories(backward_object PRIVATE ${BACKWARD_INCLUDE_DIRS}) | |||||
set(BACKWARD_ENABLE $<TARGET_OBJECTS:backward_object> CACHE STRING | |||||
"Link with this object to setup backward automatically") | |||||
############################################################################### | |||||
# BACKWARD LIBRARY (Includes backward.cpp) | |||||
############################################################################### | |||||
option(BACKWARD_SHARED "Build dynamic backward-cpp shared lib" OFF) | |||||
if(BACKWARD_SHARED) | |||||
set(libtype SHARED) | |||||
endif() | |||||
add_library(backward ${libtype} backward.cpp) | |||||
target_compile_definitions(backward PUBLIC ${BACKWARD_DEFINITIONS}) | |||||
target_include_directories(backward PUBLIC ${BACKWARD_INCLUDE_DIRS}) | |||||
############################################################################### | |||||
# TESTS | |||||
############################################################################### | |||||
if(BACKWARD_TESTS) | |||||
enable_testing() | |||||
add_library(test_main OBJECT test/_test_main.cpp) | |||||
macro(backward_add_test src) | |||||
get_filename_component(name ${src} NAME_WE) | |||||
set(test_name "test_${name}") | |||||
add_executable(${test_name} ${src} ${ARGN} $<TARGET_OBJECTS:test_main>) | |||||
target_link_libraries(${test_name} PRIVATE Backward::Backward) | |||||
add_test(NAME ${name} COMMAND ${test_name}) | |||||
endmacro() | |||||
# Tests without backward.cpp | |||||
set(TESTS | |||||
test | |||||
stacktrace | |||||
rectrace | |||||
select_signals | |||||
) | |||||
foreach(test ${TESTS}) | |||||
backward_add_test(test/${test}.cpp) | |||||
endforeach() | |||||
# Tests with backward.cpp | |||||
set(TESTS | |||||
suicide | |||||
) | |||||
foreach(test ${TESTS}) | |||||
backward_add_test(test/${test}.cpp ${BACKWARD_ENABLE}) | |||||
endforeach() | |||||
endif() | |||||
install( | |||||
FILES "backward.hpp" | |||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} | |||||
) | |||||
install( | |||||
FILES "BackwardConfig.cmake" | |||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/backward | |||||
) |
// Pick your poison. | |||||
// | |||||
// On GNU/Linux, you have few choices to get the most out of your stack trace. | |||||
// | |||||
// By default you get: | |||||
// - object filename | |||||
// - function name | |||||
// | |||||
// In order to add: | |||||
// - source filename | |||||
// - line and column numbers | |||||
// - source code snippet (assuming the file is accessible) | |||||
// Install one of the following libraries then uncomment one of the macro (or | |||||
// better, add the detection of the lib and the macro definition in your build | |||||
// system) | |||||
// - apt-get install libdw-dev ... | |||||
// - g++/clang++ -ldw ... | |||||
// #define BACKWARD_HAS_DW 1 | |||||
// - apt-get install binutils-dev ... | |||||
// - g++/clang++ -lbfd ... | |||||
// #define BACKWARD_HAS_BFD 1 | |||||
// - apt-get install libdwarf-dev ... | |||||
// - g++/clang++ -ldwarf ... | |||||
// #define BACKWARD_HAS_DWARF 1 | |||||
// Regardless of the library you choose to read the debug information, | |||||
// for potentially more detailed stack traces you can use libunwind | |||||
// - apt-get install libunwind-dev | |||||
// - g++/clang++ -lunwind | |||||
// #define BACKWARD_HAS_LIBUNWIND 1 | |||||
#include "backward.hpp" | |||||
namespace backward { | |||||
backward::SignalHandling sh; | |||||
} // namespace backward |
libsqlite3-dev, | libsqlite3-dev, | ||||
libssl-dev (>= 1.0), | libssl-dev (>= 1.0), | ||||
libunwind-dev | libunwind-13-dev, | libunwind-dev | libunwind-13-dev, | ||||
libdwarf-dev, | |||||
perl, | perl, | ||||
ragel, | ragel, | ||||
zlib1g-dev | zlib1g-dev |
BuildRequires: ragel | BuildRequires: ragel | ||||
BuildRequires: sqlite-devel | BuildRequires: sqlite-devel | ||||
BuildRequires: systemd | BuildRequires: systemd | ||||
BuildRequires: libdwarf-devel | |||||
Requires(pre): shadow-utils | Requires(pre): shadow-utils | ||||
Requires(post): systemd | Requires(post): systemd | ||||
Requires(preun): systemd | Requires(preun): systemd | ||||
-DWANT_SYSTEMD_UNITS=ON \ | -DWANT_SYSTEMD_UNITS=ON \ | ||||
-DNO_SHARED=ON \ | -DNO_SHARED=ON \ | ||||
-DDEBIAN_BUILD=1 \ | -DDEBIAN_BUILD=1 \ | ||||
-DENABLE_LIBUNWIND=ON \ | |||||
%ifarch x86_64 amd64 arm64 aarch64 | %ifarch x86_64 amd64 arm64 aarch64 | ||||
-DENABLE_HYPERSCAN=ON \ | -DENABLE_HYPERSCAN=ON \ | ||||
%endif | %endif |
TARGET_LINK_LIBRARIES(rspamd-server ${RSPAMD_REQUIRED_LIBRARIES}) | TARGET_LINK_LIBRARIES(rspamd-server ${RSPAMD_REQUIRED_LIBRARIES}) | ||||
ADD_EXECUTABLE(rspamd ${RSPAMDSRC} ${CMAKE_CURRENT_BINARY_DIR}/workers.c ${CMAKE_CURRENT_BINARY_DIR}/config.h) | |||||
ADD_EXECUTABLE(rspamd ${RSPAMDSRC} ${CMAKE_CURRENT_BINARY_DIR}/workers.c ${CMAKE_CURRENT_BINARY_DIR}/config.h ${BACKWARD_ENABLE}) | |||||
SET_TARGET_PROPERTIES(rspamd PROPERTIES LINKER_LANGUAGE CXX) | SET_TARGET_PROPERTIES(rspamd PROPERTIES LINKER_LANGUAGE CXX) | ||||
SET_TARGET_PROPERTIES(rspamd-server PROPERTIES LINKER_LANGUAGE CXX) | SET_TARGET_PROPERTIES(rspamd-server PROPERTIES LINKER_LANGUAGE CXX) | ||||
IF(NOT DEBIAN_BUILD) | IF(NOT DEBIAN_BUILD) |
${CMAKE_CURRENT_SOURCE_DIR}/html/html.cxx | ${CMAKE_CURRENT_SOURCE_DIR}/html/html.cxx | ||||
${CMAKE_CURRENT_SOURCE_DIR}/html/html_tests.cxx | ${CMAKE_CURRENT_SOURCE_DIR}/html/html_tests.cxx | ||||
${CMAKE_CURRENT_SOURCE_DIR}/hyperscan_tools.cxx | ${CMAKE_CURRENT_SOURCE_DIR}/hyperscan_tools.cxx | ||||
${CMAKE_CURRENT_SOURCE_DIR}/backtrace.cxx | |||||
${LIBCSSSRC}) | ${LIBCSSSRC}) | ||||
# Librspamd-server | # Librspamd-server |
/* | |||||
* Copyright 2023 Vsevolod Stakhov | |||||
* | |||||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||||
* you may not use this file except in compliance with the License. | |||||
* You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
*/ | |||||
#include "config.h" | |||||
#ifdef BACKWARD_ENABLE | |||||
#include "contrib/backward-cpp/backward.hpp" | |||||
#include "fmt/core.h" | |||||
#include "logger.h" | |||||
namespace rspamd { | |||||
void log_backtrace(void) | |||||
{ | |||||
using namespace backward; | |||||
StackTrace st; | |||||
st.load_here(128); | |||||
TraceResolver tr; | |||||
tr.load_stacktrace(st); | |||||
for (auto i = 0ul; i < st.size(); ++i) { | |||||
auto trace = tr.resolve(st[i]); | |||||
auto trace_line = fmt::format("#{}: [{}]: ", i, trace.addr); | |||||
if (!trace.source.filename.empty()) { | |||||
trace_line += fmt::format("{}:{} in {}", trace.source.filename, trace.source.line, trace.source.function); | |||||
} | |||||
else { | |||||
trace_line += fmt::format("{} in {}", trace.object_filename, trace.object_function); | |||||
} | |||||
msg_err("%s", trace_line.c_str()); | |||||
} | |||||
} | |||||
}// namespace rspamd | |||||
#endif | |||||
extern "C" void rspamd_print_crash(void); | |||||
void rspamd_print_crash(void) | |||||
{ | |||||
#ifdef BACKWARD_ENABLE | |||||
rspamd::log_backtrace(); | |||||
#endif | |||||
} |
#endif | #endif | ||||
#include "zlib.h" | #include "zlib.h" | ||||
#ifdef WITH_LIBUNWIND | |||||
#define UNW_LOCAL_ONLY 1 | |||||
#include <libunwind.h> | |||||
#define UNWIND_BACKTRACE_DEPTH 256 | |||||
#endif | |||||
#ifdef HAVE_UCONTEXT_H | #ifdef HAVE_UCONTEXT_H | ||||
#include <ucontext.h> | #include <ucontext.h> | ||||
#elif defined(HAVE_SYS_UCONTEXT_H) | #elif defined(HAVE_SYS_UCONTEXT_H) | ||||
#ifdef HAVE_SA_SIGINFO | #ifdef HAVE_SA_SIGINFO | ||||
#ifdef WITH_LIBUNWIND | |||||
static void | |||||
rspamd_print_crash(ucontext_t *_uap) | |||||
{ | |||||
unw_cursor_t cursor; | |||||
unw_context_t uc; | |||||
unw_word_t ip, off, sp; | |||||
guint level; | |||||
gint ret; | |||||
unw_getcontext(&uc); | |||||
if ((ret = unw_init_local(&cursor, &uc)) != 0) { | |||||
msg_err("unw_init_local: %d", ret); | |||||
return; | |||||
} | |||||
level = 0; | |||||
ret = 0; | |||||
for (;;) { | |||||
char name[128]; | |||||
if (level >= UNWIND_BACKTRACE_DEPTH) { | |||||
break; | |||||
} | |||||
unw_get_reg(&cursor, UNW_REG_IP, &ip); | |||||
ret = unw_get_proc_name(&cursor, name, sizeof(name), &off); | |||||
if (ret == 0) { | |||||
msg_err("%d: 0x%xl: %s()+0x%xl", | |||||
level, (unsigned long) ip, name, (unsigned long) off); | |||||
} | |||||
else { | |||||
msg_err("%d: %0x%xl: <unknown>", level, (unsigned long) ip); | |||||
} | |||||
level++; | |||||
ret = unw_step(&cursor); | |||||
if (ret <= 0) { | |||||
break; | |||||
} | |||||
} | |||||
if (ret < 0) { | |||||
msg_err("unw_step_ptr: %d", ret); | |||||
} | |||||
} | |||||
#elif defined(HAVE_BACKTRACE) | |||||
#include <execinfo.h> | |||||
static void | |||||
rspamd_print_crash(ucontext_t *_uap) | |||||
{ | |||||
void *callstack[128]; | |||||
int i, frames = backtrace(callstack, 128); | |||||
char **strs = backtrace_symbols(callstack, frames); | |||||
for (i = 0; i < frames; ++i) { | |||||
msg_err("%d: %s", i, strs[i]); | |||||
} | |||||
free(strs); | |||||
} | |||||
#endif | |||||
static struct rspamd_main *saved_main = NULL; | static struct rspamd_main *saved_main = NULL; | ||||
static gboolean | static gboolean | ||||
rspamd_crash_propagate(gpointer key, gpointer value, gpointer unused) | rspamd_crash_propagate(gpointer key, gpointer value, gpointer unused) | ||||
return TRUE; | return TRUE; | ||||
} | } | ||||
#ifdef BACKWARD_ENABLE | |||||
/* See backtrace.cxx */ | |||||
extern void rspamd_print_crash(void); | |||||
#endif | |||||
static void | static void | ||||
rspamd_crash_sig_handler(int sig, siginfo_t *info, void *ctx) | rspamd_crash_sig_handler(int sig, siginfo_t *info, void *ctx) | ||||
{ | { | ||||
"pid: %P, trace: ", | "pid: %P, trace: ", | ||||
sig, strsignal(sig), pid); | sig, strsignal(sig), pid); | ||||
(void) uap; | (void) uap; | ||||
#if defined(WITH_LIBUNWIND) || defined(HAVE_BACKTRACE) | |||||
rspamd_print_crash(uap); | |||||
#ifdef BACKWARD_ENABLE | |||||
rspamd_print_crash(); | |||||
#endif | #endif | ||||
msg_err("please see Rspamd FAQ to learn how to dump core files and how to " | msg_err("please see Rspamd FAQ to learn how to dump core files and how to " | ||||
"fill a bug report"); | "fill a bug report"); |