set(LIBDDWAF_SOURCE
${libddwaf_SOURCE_DIR}/src/clock.cpp
${libddwaf_SOURCE_DIR}/src/interface.cpp
${libddwaf_SOURCE_DIR}/src/evaluation_engine.cpp
${libddwaf_SOURCE_DIR}/src/context_allocator.cpp
${libddwaf_SOURCE_DIR}/src/serializer.cpp
${libddwaf_SOURCE_DIR}/src/object_store.cpp
${libddwaf_SOURCE_DIR}/src/module.cpp
${libddwaf_SOURCE_DIR}/src/expression.cpp
${libddwaf_SOURCE_DIR}/src/ruleset_info.cpp
${libddwaf_SOURCE_DIR}/src/ip_utils.cpp
${libddwaf_SOURCE_DIR}/src/iterator.cpp
${libddwaf_SOURCE_DIR}/src/log.cpp
${libddwaf_SOURCE_DIR}/src/obfuscator.cpp
${libddwaf_SOURCE_DIR}/src/uri_utils.cpp
${libddwaf_SOURCE_DIR}/src/json_utils.cpp
${libddwaf_SOURCE_DIR}/src/platform.cpp
${libddwaf_SOURCE_DIR}/src/sha256.cpp
${libddwaf_SOURCE_DIR}/src/uuid.cpp
${libddwaf_SOURCE_DIR}/src/action_mapper.cpp
${libddwaf_SOURCE_DIR}/src/dynamic_string.cpp
${libddwaf_SOURCE_DIR}/src/attribute_collector.cpp
${libddwaf_SOURCE_DIR}/src/rule.cpp
${libddwaf_SOURCE_DIR}/src/semver.cpp
${libddwaf_SOURCE_DIR}/src/utils.cpp
${libddwaf_SOURCE_DIR}/src/utf8.cpp
${libddwaf_SOURCE_DIR}/src/builder/action_mapper_builder.cpp
${libddwaf_SOURCE_DIR}/src/builder/matcher_builder.cpp
${libddwaf_SOURCE_DIR}/src/builder/module_builder.cpp
${libddwaf_SOURCE_DIR}/src/builder/processor_builder.cpp
${libddwaf_SOURCE_DIR}/src/builder/ruleset_builder.cpp
${libddwaf_SOURCE_DIR}/src/builder/checksum_builder.cpp
${libddwaf_SOURCE_DIR}/src/tokenizer/sql_base.cpp
${libddwaf_SOURCE_DIR}/src/tokenizer/pgsql.cpp
${libddwaf_SOURCE_DIR}/src/tokenizer/mysql.cpp
${libddwaf_SOURCE_DIR}/src/tokenizer/sqlite.cpp
${libddwaf_SOURCE_DIR}/src/tokenizer/generic_sql.cpp
${libddwaf_SOURCE_DIR}/src/tokenizer/shell.cpp
${libddwaf_SOURCE_DIR}/src/exclusion/input_filter.cpp
${libddwaf_SOURCE_DIR}/src/exclusion/object_filter.cpp
${libddwaf_SOURCE_DIR}/src/exclusion/rule_filter.cpp
${libddwaf_SOURCE_DIR}/src/configuration/common/expression_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/common/matcher_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/common/transformer_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/common/raw_configuration.cpp
${libddwaf_SOURCE_DIR}/src/configuration/common/reference_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/actions_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/data_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/exclusion_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/processor_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/processor_override_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/rule_override_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/rule_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/scanner_parser.cpp
${libddwaf_SOURCE_DIR}/src/configuration/configuration_manager.cpp
${libddwaf_SOURCE_DIR}/src/processor/extract_schema.cpp
${libddwaf_SOURCE_DIR}/src/processor/fingerprint.cpp
${libddwaf_SOURCE_DIR}/src/processor/jwt_decode.cpp
${libddwaf_SOURCE_DIR}/src/processor/uri_parse.cpp
${libddwaf_SOURCE_DIR}/src/condition/exists.cpp
${libddwaf_SOURCE_DIR}/src/condition/lfi_detector.cpp
${libddwaf_SOURCE_DIR}/src/condition/sqli_detector.cpp
${libddwaf_SOURCE_DIR}/src/condition/ssrf_detector.cpp
${libddwaf_SOURCE_DIR}/src/condition/scalar_condition.cpp
${libddwaf_SOURCE_DIR}/src/condition/negated_scalar_condition.cpp
${libddwaf_SOURCE_DIR}/src/condition/shi_common.cpp
${libddwaf_SOURCE_DIR}/src/condition/shi_detector.cpp
${libddwaf_SOURCE_DIR}/src/condition/cmdi_detector.cpp
${libddwaf_SOURCE_DIR}/src/checksum/luhn_checksum.cpp
${libddwaf_SOURCE_DIR}/src/matcher/phrase_match.cpp
${libddwaf_SOURCE_DIR}/src/matcher/regex_match.cpp
${libddwaf_SOURCE_DIR}/src/matcher/regex_match_with_checksum.cpp
${libddwaf_SOURCE_DIR}/src/matcher/is_sqli.cpp
${libddwaf_SOURCE_DIR}/src/matcher/is_xss.cpp
${libddwaf_SOURCE_DIR}/src/matcher/ip_match.cpp
${libddwaf_SOURCE_DIR}/src/matcher/exact_match.cpp
${libddwaf_SOURCE_DIR}/src/matcher/hidden_ascii_match.cpp
${libddwaf_SOURCE_DIR}/src/transformer/lowercase.cpp
${libddwaf_SOURCE_DIR}/src/transformer/compress_whitespace.cpp
${libddwaf_SOURCE_DIR}/src/transformer/normalize_path.cpp
${libddwaf_SOURCE_DIR}/src/transformer/manager.cpp
${libddwaf_SOURCE_DIR}/src/transformer/remove_nulls.cpp
${libddwaf_SOURCE_DIR}/src/transformer/remove_comments.cpp
${libddwaf_SOURCE_DIR}/src/transformer/shell_unescape.cpp
${libddwaf_SOURCE_DIR}/src/transformer/unicode_normalize.cpp
${libddwaf_SOURCE_DIR}/src/transformer/url_basename.cpp
${libddwaf_SOURCE_DIR}/src/transformer/url_decode.cpp
${libddwaf_SOURCE_DIR}/src/transformer/url_querystring.cpp
${libddwaf_SOURCE_DIR}/src/transformer/url_path.cpp
${libddwaf_SOURCE_DIR}/src/transformer/base64_decode.cpp
${libddwaf_SOURCE_DIR}/src/transformer/base64_encode.cpp
${libddwaf_SOURCE_DIR}/src/transformer/css_decode.cpp
${libddwaf_SOURCE_DIR}/src/transformer/html_entity_decode.cpp
${libddwaf_SOURCE_DIR}/src/transformer/js_decode.cpp
${libddwaf_SOURCE_DIR}/src/vendor/fmt/format.cc
${libddwaf_SOURCE_DIR}/src/vendor/radixlib/radixlib.c
${libddwaf_SOURCE_DIR}/src/vendor/lua-aho-corasick/ac_fast.cxx
${libddwaf_SOURCE_DIR}/src/vendor/lua-aho-corasick/ac_slow.cxx
${libddwaf_SOURCE_DIR}/src/vendor/lua-aho-corasick/ac.cxx
${libddwaf_SOURCE_DIR}/src/vendor/libinjection/src/xss.c
${libddwaf_SOURCE_DIR}/src/vendor/libinjection/src/libinjection_html5.c
${libddwaf_SOURCE_DIR}/src/vendor/libinjection/src/libinjection_xss.c
${libddwaf_SOURCE_DIR}/src/vendor/libinjection/src/libinjection_sqli.c
${libddwaf_SOURCE_DIR}/src/vendor/utf8proc/utf8proc.c
${libddwaf_SOURCE_DIR}/src/vendor/re2/bitstate.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/compile.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/dfa.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/nfa.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/onepass.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/parse.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/perl_groups.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/prog.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/re2.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/regexp.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/simplify.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/tostring.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/unicode_casefold.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/unicode_groups.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/util/rune.cc
${libddwaf_SOURCE_DIR}/src/vendor/re2/util/strutil.cc
)
set(LIBDDWAF_PUBLIC_INCLUDES ${libddwaf_SOURCE_DIR}/include)
set(LIBDDWAF_PRIVATE_INCLUDES
${libddwaf_BINARY_DIR}/generated
${libddwaf_SOURCE_DIR}/src
${libddwaf_SOURCE_DIR}/src/vendor
${libddwaf_SOURCE_DIR}/src/vendor/libinjection/src/
${libddwaf_SOURCE_DIR}/src/vendor/radixlib/
${libddwaf_SOURCE_DIR}/src/vendor/lua-aho-corasick/
${libddwaf_SOURCE_DIR}/src/vendor/utf8proc/
${libddwaf_SOURCE_DIR}/src/vendor/re2/
)
function(gen_objects target_name)
add_library(${target_name} OBJECT ${LIBDDWAF_SOURCE} )
# we need PIC even on the static lib,as it's expected to be linked in a shared lib
set_target_properties(${target_name} PROPERTIES POSITION_INDEPENDENT_CODE 1)
if(NOT STDLIB_MAP_RECURSIVE)
target_compile_definitions(${target_name} PRIVATE HAS_NONRECURSIVE_UNORDERED_MAP)
endif()
if (LIBDDWAF_VECTORIZED_TRANSFORMERS)
target_compile_definitions(${target_name} PRIVATE LIBDDWAF_VECTORIZED_TRANSFORMERS)
endif()
target_include_directories(${target_name} PUBLIC ${LIBDDWAF_PUBLIC_INCLUDES})
target_include_directories(${target_name} PRIVATE ${LIBDDWAF_PRIVATE_INCLUDES})
target_compile_definitions(${target_name} PRIVATE UTF8PROC_STATIC=1 FMT_OPTIMIZE_SIZE=2)
if (MSVC)
target_compile_definitions(${target_name} PRIVATE NOMINMAX)
endif()
target_link_libraries(${target_name}
PRIVATE ${LIBDDWAF_PRIVATE_LIBRARIES}
INTERFACE ${LIBDDWAF_INTERFACE_LIBRARIES})
endfunction()
gen_objects(libddwaf_objects)
add_library(libddwaf_shared_objects ALIAS libddwaf_objects)
if (LIBDDWAF_ENABLE_LTO)
target_compile_options(libddwaf_objects PRIVATE -flto)
# If LTO is enabled, we can't use objects with -flto to generate a static
# library, as the contents of the object is an intermediate representation.
# This can be solved (in theory) using -ffat-lto-objects, but clang < 18
# doesn't currently support this, so we need to generate separate objects
# specifically for the static build.
gen_objects(libddwaf_static_objects)
else()
add_library(libddwaf_static_objects ALIAS libddwaf_objects)
endif()
if (NOT MSVC AND LIBDDWAF_TESTING AND LIBDDWAF_TEST_COVERAGE)
target_compile_options(libddwaf_objects PRIVATE --coverage)
endif()
if (LIBDDWAF_TESTING AND LIBDDWAF_ON_VALGRIND)
target_compile_definitions(libddwaf_objects PRIVATE RE2_ON_VALGRIND)
endif()
if (NOT MSVC AND LIBDDWAF_TESTING)
if (LIBDDWAF_BENCHMARK_PGO_STAGE1)
target_compile_options(libddwaf_objects PRIVATE -fprofile-instr-generate)
elseif (LIBDDWAF_BENCHMARK_PGO_STAGE2_PROFILE)
target_compile_options(libddwaf_objects PRIVATE -fprofile-use=${LIBDDWAF_BENCHMARK_PGO_STAGE2_PROFILE})
if (LIBDDWAF_BENCHMARK_BOLT_STAGE3)
# Relocations are only required for BOLT
target_link_options(libddwaf_objects PRIVATE -Wl,-q)
endif()
endif()
endif()