add_library(secrethider_core STATIC
  src/strings.cpp
  src/json.cpp
  src/redact/aho_corasick.cpp
  src/redact/detectors.cpp
  src/redact/mask.cpp
  src/redact/redactor.cpp
  src/redact/json_redact.cpp
  src/redact/stream.cpp
  src/redact/regex_re2.cpp)
add_library(secrethider::core ALIAS secrethider_core)

target_include_directories(secrethider_core PUBLIC include PRIVATE src)
target_link_libraries(secrethider_core PRIVATE simdjson::simdjson simdutf::simdutf)
if(SECRETHIDER_WITH_RE2)
  target_compile_definitions(secrethider_core PRIVATE SECRETHIDER_WITH_RE2)
  target_link_libraries(secrethider_core PRIVATE re2::re2)
endif()
secrethider_set_warnings(secrethider_core)

if(SECRETHIDER_BUILD_TESTS)
  add_executable(secrethider_tests
    tests/test_strings.cpp
    tests/test_json.cpp
    tests/test_redact.cpp
    tests/test_mask.cpp
    tests/test_aho_corasick.cpp
    tests/test_features.cpp
    tests/test_property.cpp
    tests/test_stream.cpp
    tests/test_json_redact.cpp)
  target_include_directories(secrethider_tests PRIVATE src)
  target_link_libraries(secrethider_tests PRIVATE secrethider::core Catch2::Catch2WithMain)
  if(SECRETHIDER_WITH_RE2)
    target_compile_definitions(secrethider_tests PRIVATE SECRETHIDER_WITH_RE2)
  endif()
  secrethider_set_warnings(secrethider_tests)
  include(Catch)
  catch_discover_tests(secrethider_tests)

  add_executable(secrethider_leakcheck tests/leakcheck.cpp)  # counting-allocator leak/growth checker
  target_link_libraries(secrethider_leakcheck PRIVATE secrethider::core)
  if(SECRETHIDER_WITH_RE2)
    target_compile_definitions(secrethider_leakcheck PRIVATE SECRETHIDER_WITH_RE2)
  endif()
  if(WIN32)
    target_link_libraries(secrethider_leakcheck PRIVATE psapi)
  endif()

  add_executable(secrethider_repro tests/qa_repro.cpp)  # replay property failures: see the file header
  target_include_directories(secrethider_repro PRIVATE src)
  target_link_libraries(secrethider_repro PRIVATE secrethider::core)
  if(SECRETHIDER_WITH_RE2)
    target_compile_definitions(secrethider_repro PRIVATE SECRETHIDER_WITH_RE2)
  endif()
endif()

if(SECRETHIDER_BUILD_FUZZ AND NOT MSVC)  # clang on Linux/macOS: libFuzzer target (clang-cl's libFuzzer uses the static CRT, which cannot be mixed with ASan's dynamic one)
  add_executable(secrethider_fuzz tests/fuzz_redact.cpp)
  target_link_libraries(secrethider_fuzz PRIVATE secrethider::core)
  if(SECRETHIDER_WITH_RE2)
    target_compile_definitions(secrethider_fuzz PRIVATE SECRETHIDER_WITH_RE2)
  endif()
  target_compile_options(secrethider_fuzz PRIVATE -fsanitize=fuzzer)
  target_link_options(secrethider_fuzz PRIVATE -fsanitize=fuzzer)
endif()

if(SECRETHIDER_BUILD_BENCH)
  add_executable(secrethider_bench bench/bench.cpp bench/bench_redact.cpp)
  target_link_libraries(secrethider_bench PRIVATE secrethider::core benchmark::benchmark_main)
endif()
