Skip to content

Commit b585ad4

Browse files
authored
Release 5.4.12 (intel#341)
Multiple changes since last release, this will be the last 100% ABI and API compatible with Hyperscan release. Next versions will include major refactors and API extensions, it will be mostly backwards compatible however. Without particular order, platform support is now: * Linux (x86, Arm, Power) * FreeBSD 14 (x86, Arm, Power) * MacOS 14+ (x86, Arm) In total more than 200 configurations in the CI are tested for every PR. Other features: - Fat Runtime supported for Arm as well (ASIMD/SVE/SVE2). - Initial implementations for Arm SVE/SVE2 algorithms added, thanks to Yoan Picchi from Arm. - SIMDe support added, used as an alternative backend for existing platforms, but mostly interesting for allowing Vectorscan to build in new platforms without a supported SIMD engine. - Various speedups and optimizations. - Cppcheck and clang-tidy fixes throughout the code, both have been added to CI for multiple configurations, but only cppcheck triggers a build failure for now. Various bugfixes, most important listed: - Speed up truffle with 256b TBL instructions (intel#290) - Fix Clang Tidy warnings (intel#295) - Clang 17+ is more restrictive on rebind<T> on MacOS/Boost, remove warning (intel#332) - partial_load_u64 will fail if buf == NULL/c_len == 0 (intel#331) - Bugfix/fix avx512vbmi regressions (intel#335) - fix missing hs_version.h header (closes intel#198) - hs_valid_platform: Fix check for SSE4.2 (intel#310) - Fixed out of bounds read in AVX512VBMI version of fdr_exec_fat_teddy … (intel#333) - Fix noodle SVE2 off by one bug (intel#313) - Make vectorscan accept \0 starting pattern (intel#312) - Fix 5.4.11's config step regression (intel#327) - Fix double shufti's vector end false positive (intel#325)
2 parents d29730e + 22b76d1 commit b585ad4

File tree

377 files changed

+1397517
-5721
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

377 files changed

+1397517
-5721
lines changed

.clang-tidy

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#unit/gtest/gtest-all.cc,build/src/parser/Parser.cpp,build/src/parser/control_verbs.cpp
2+
#Dont change first comment ignores specific files from clang-tidy
3+
4+
5+
Checks: 'clang-analyzer-*,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,performance-*,-performance-unnecessary-value-param,-performance-avoid-endl'
6+
WarningsAsErrors: ''
7+
HeaderFilterRegex: '.*'
8+
SystemHeaders: false
9+
FormatStyle: none
10+
InheritParentConfig: true
11+
User: user

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "simde"]
2+
path = simde
3+
url = https://github.com/simd-everywhere/simde.git

CHANGELOG-vectorscan.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,39 @@
22

33
This is a list of notable changes to Vectorscan, in reverse chronological order. For Hyperscan Changelog, check CHANGELOG.md
44

5+
## [5.4.12] 2025-07-21
6+
7+
Multiple changes since last release, this will be the last 100% ABI and API compatible with Hyperscan release.
8+
Next versions will include major refactors and API extensions, it will be mostly backwards compatible however.
9+
Without particular order, platform support is now:
10+
11+
* Linux (x86, Arm, Power)
12+
* FreeBSD 14 (x86, Arm, Power)
13+
* MacOS 14+ (x86, Arm)
14+
15+
In total more than 200 configurations in the CI are tested for every PR.
16+
17+
Other features:
18+
- Fat Runtime supported for Arm as well (ASIMD/SVE/SVE2).
19+
- Initial implementations for Arm SVE/SVE2 algorithms added, thanks to Yoan Picchi from Arm.
20+
- SIMDe support added, used as an alternative backend for existing platforms, but mostly interesting for allowing Vectorscan to build in new platforms without a supported SIMD engine.
21+
- Various speedups and optimizations.
22+
- Cppcheck and clang-tidy fixes throughout the code, both have been added to CI for multiple configurations, but only cppcheck triggers a build failure for now.
23+
24+
Various bugfixes, most important listed:
25+
- Speed up truffle with 256b TBL instructions (#290)
26+
- Fix Clang Tidy warnings (#295)
27+
- Clang 17+ is more restrictive on rebind<T> on MacOS/Boost, remove warning (#332)
28+
- partial_load_u64 will fail if buf == NULL/c_len == 0 (#331)
29+
- Bugfix/fix avx512vbmi regressions (#335)
30+
- fix missing hs_version.h header (closes #198)
31+
- hs_valid_platform: Fix check for SSE4.2 (#310)
32+
- Fixed out of bounds read in AVX512VBMI version of fdr_exec_fat_teddy … (#333)
33+
- Fix noodle SVE2 off by one bug (#313)
34+
- Make vectorscan accept \0 starting pattern (#312)
35+
- Fix 5.4.11's config step regression (#327)
36+
- Fix double shufti's vector end false positive (#325)
37+
538
## [5.4.11] 2023-11-19
639

740
- Refactor CMake build system to be much more modular.

CMakeLists.txt

Lines changed: 153 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ project (vectorscan C CXX)
44

55
set (HS_MAJOR_VERSION 5)
66
set (HS_MINOR_VERSION 4)
7-
set (HS_PATCH_VERSION 11)
7+
set (HS_PATCH_VERSION 12)
88
set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION})
99

1010
string (TIMESTAMP BUILD_DATE "%Y-%m-%d")
@@ -23,18 +23,24 @@ INCLUDE (CheckLibraryExists)
2323
INCLUDE (CheckSymbolExists)
2424
include (CMakeDependentOption)
2525
include (GNUInstallDirs)
26-
include (${CMAKE_MODULE_PATH}/platform.cmake)
2726
include (${CMAKE_MODULE_PATH}/boost.cmake)
2827
include (${CMAKE_MODULE_PATH}/ragel.cmake)
2928

30-
find_package(PkgConfig REQUIRED)
29+
find_package(PkgConfig QUIET)
3130

3231
find_program(RAGEL ragel)
3332

3433
if(${RAGEL} STREQUAL "RAGEL-NOTFOUND")
3534
message(FATAL_ERROR "Ragel state machine compiler not found")
3635
endif()
3736

37+
# Add ccache to speed builds
38+
find_program(CCACHE_FOUND ccache)
39+
if(CCACHE_FOUND)
40+
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
41+
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
42+
endif(CCACHE_FOUND)
43+
3844
# Build type check
3945

4046
if (NOT CMAKE_BUILD_TYPE)
@@ -116,18 +122,33 @@ if (RELEASE_BUILD)
116122
add_definitions(-DNDEBUG)
117123
endif()
118124

125+
# Architecture detection
126+
127+
include (${CMAKE_MODULE_PATH}/platform.cmake)
128+
119129
# Detect OS and if Fat Runtime is available
120130
include (${CMAKE_MODULE_PATH}/osdetection.cmake)
121131

122-
if (ARCH_IA32 OR ARCH_X86_64)
132+
if(ARCH_X86_64 AND BUILD_SSE2_SIMDE AND NOT FAT_RUNTIME)
133+
set(SIMDE_BACKEND True)
134+
endif()
135+
136+
if(SIMDE_BACKEND)
137+
include (${CMAKE_MODULE_PATH}/simde.cmake)
138+
elseif (ARCH_IA32 OR ARCH_X86_64)
123139
include (${CMAKE_MODULE_PATH}/cflags-x86.cmake)
124-
set(ARCH_FLAG march)
125140
elseif (ARCH_ARM32 OR ARCH_AARCH64)
126141
include (${CMAKE_MODULE_PATH}/cflags-arm.cmake)
127-
set(ARCH_FLAG march)
128142
elseif (ARCH_PPC64EL)
129143
include (${CMAKE_MODULE_PATH}/cflags-ppc64le.cmake)
144+
else ()
145+
message(FATAL_ERROR "Unsupported platform")
146+
endif ()
147+
148+
if (ARCH_PPC64EL)
130149
set(ARCH_FLAG mcpu)
150+
else ()
151+
set(ARCH_FLAG march)
131152
endif ()
132153

133154
# Detect Native arch flags if requested
@@ -139,9 +160,11 @@ include (${CMAKE_MODULE_PATH}/sanitize.cmake)
139160

140161
if (NOT FAT_RUNTIME)
141162
if (GNUCC_TUNE)
163+
message(STATUS "GNUCC_TUNE is set")
142164
set(ARCH_C_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -${TUNE_FLAG}=${GNUCC_TUNE}")
143165
set(ARCH_CXX_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -${TUNE_FLAG}=${GNUCC_TUNE}")
144166
else()
167+
message(STATUS "GNUCC_TUNE is not set")
145168
set(ARCH_C_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -mtune=${TUNE_FLAG} ${ARCH_C_FLAGS}")
146169
set(ARCH_CXX_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -mtune=${TUNE_FLAG} ${ARCH_CXX_FLAGS}")
147170
endif()
@@ -207,6 +230,19 @@ set_source_files_properties(
207230

208231
ragelmaker(src/parser/control_verbs.rl)
209232

233+
# BSD has the _np funcs in a _np header
234+
CHECK_INCLUDE_FILE_CXX(pthread_np.h HAVE_PTHREAD_NP_H)
235+
if (HAVE_PTHREAD_NP_H)
236+
set (PTHREAD_NP_INC pthread_np.h)
237+
else ()
238+
set (PTHREAD_NP_INC pthread.h)
239+
endif ()
240+
CHECK_CXX_SYMBOL_EXISTS(pthread_setaffinity_np ${PTHREAD_NP_INC} HAVE_DECL_PTHREAD_SETAFFINITY_NP)
241+
242+
CHECK_FUNCTION_EXISTS(malloc_info HAVE_MALLOC_INFO)
243+
CHECK_FUNCTION_EXISTS(shmget HAVE_SHMGET)
244+
set(HAVE_SHMGET ${HAVE_SHMGET} CACHE BOOL "shmget()")
245+
210246
# do substitutions
211247
configure_file(${CMAKE_MODULE_PATH}/config.h.in ${PROJECT_BINARY_DIR}/config.h)
212248
configure_file(src/hs_version.h.in ${PROJECT_BINARY_DIR}/hs_version.h)
@@ -239,8 +275,11 @@ set (hs_exec_common_SRCS
239275
src/util/arch/common/cpuid_flags.h
240276
src/util/multibit.c
241277
)
242-
243-
if (ARCH_IA32 OR ARCH_X86_64)
278+
if (SIMDE_BACKEND)
279+
set (hs_exec_common_SRCS
280+
${hs_exec_common_SRCS}
281+
src/util/arch/simde/cpuid_flags.c)
282+
elseif (ARCH_IA32 OR ARCH_X86_64)
244283
set (hs_exec_common_SRCS
245284
${hs_exec_common_SRCS}
246285
src/util/arch/x86/cpuid_flags.c
@@ -275,7 +314,7 @@ set (hs_exec_SRCS
275314
src/fdr/fdr_confirm_runtime.h
276315
src/fdr/flood_runtime.h
277316
src/fdr/fdr_loadval.h
278-
src/fdr/teddy.c
317+
src/fdr/teddy.cpp
279318
src/fdr/teddy.h
280319
src/fdr/teddy_internal.h
281320
src/fdr/teddy_runtime_common.h
@@ -398,7 +437,12 @@ set (hs_exec_SRCS
398437
src/database.h
399438
)
400439

401-
if (ARCH_IA32 OR ARCH_X86_64)
440+
if (SIMDE_BACKEND)
441+
set (hs_exec_SRCS
442+
${hs_exec_SRCS}
443+
src/nfa/vermicelli_simd.cpp
444+
src/util/supervector/arch/x86/impl.cpp)
445+
elseif (ARCH_IA32 OR ARCH_X86_64)
402446
set (hs_exec_SRCS
403447
${hs_exec_SRCS}
404448
src/nfa/vermicelli_simd.cpp
@@ -414,9 +458,11 @@ set (hs_exec_SRCS
414458
src/util/supervector/arch/ppc64el/impl.cpp)
415459
endif()
416460

461+
417462
if (ARCH_IA32 OR ARCH_X86_64)
418463
set (hs_exec_avx2_SRCS
419-
src/fdr/teddy_avx2.c
464+
src/fdr/teddy.cpp
465+
src/fdr/teddy_fat.cpp
420466
src/util/arch/x86/masked_move.c
421467
src/util/arch/x86/masked_move.h
422468
)
@@ -918,16 +964,47 @@ else ()
918964
if (NOT BUILD_AVX512VBMI)
919965
set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -DDISABLE_AVX512VBMI_DISPATCH")
920966
endif (NOT BUILD_AVX512VBMI)
967+
if(BUILD_SSE2_SIMDE)
968+
set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2")
969+
endif(BUILD_SSE2_SIMDE)
921970
set_source_files_properties(src/dispatcher.c PROPERTIES
922971
COMPILE_FLAGS "-Wno-unused-parameter -Wno-unused-function ${DISPATCHER_DEFINE}")
972+
if(BUILD_SSE2_SIMDE AND NOT BUILD_AVX2 AND NOT BUILD_AVX512 AND NOT BUILD_AVX512VBMI)
973+
set_source_files_properties(src/crc32.c PROPERTIES
974+
COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2")
975+
set_source_files_properties(src/hs.cpp PROPERTIES
976+
COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2")
977+
978+
string(REGEX REPLACE "-msse4.2" "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
979+
string(REGEX REPLACE "-msse4.2" "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
980+
endif()
923981

924982
if (BUILD_STATIC_LIBS)
925-
add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS})
926-
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_core2>)
927-
set_target_properties(hs_exec_core2 PROPERTIES
928-
COMPILE_FLAGS "-march=core2 -msse4.2"
929-
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
930-
)
983+
984+
if (BUILD_SSE2_SIMDE)
985+
add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS})
986+
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_core2>)
987+
message("Building SIMDE SSE2 version..")
988+
include_directories(${PROJECT_SOURCE_DIR}/simde)
989+
if (CMAKE_COMPILER_IS_CLANG)
990+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT")
991+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT")
992+
endif()
993+
994+
set_target_properties(hs_exec_core2 PROPERTIES
995+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
996+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
997+
COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2"
998+
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
999+
)
1000+
else()
1001+
add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS})
1002+
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_core2>)
1003+
set_target_properties(hs_exec_core2 PROPERTIES
1004+
COMPILE_FLAGS "-march=core2 -msse4.2"
1005+
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
1006+
)
1007+
endif(BUILD_SSE2_SIMDE)
9311008

9321009
add_library(hs_exec_corei7 OBJECT ${hs_exec_SRCS})
9331010
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_corei7>)
@@ -980,19 +1057,59 @@ else ()
9801057
$<TARGET_OBJECTS:hs_compile>
9811058
$<TARGET_OBJECTS:hs_exec_common>
9821059
${RUNTIME_LIBS})
1060+
1061+
if (BUILD_SSE2_SIMDE)
1062+
set_target_properties(hs_compile PROPERTIES
1063+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1064+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1065+
COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2"
1066+
)
1067+
set_target_properties(hs PROPERTIES
1068+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1069+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1070+
COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2"
1071+
)
1072+
endif (BUILD_SSE2_SIMDE)
1073+
9831074
endif (BUILD_STATIC_LIBS)
9841075

9851076
if (BUILD_SHARED_LIBS)
9861077
# build shared libs
9871078
add_library(hs_compile_shared OBJECT ${hs_compile_SRCS})
9881079
set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
989-
add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS})
990-
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_core2>)
991-
set_target_properties(hs_exec_shared_core2 PROPERTIES
992-
COMPILE_FLAGS "-march=core2 -msse4.2"
993-
POSITION_INDEPENDENT_CODE TRUE
994-
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
995-
)
1080+
1081+
if (BUILD_SSE2_SIMDE)
1082+
message("Building SIMDE SSE2 version..")
1083+
add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS})
1084+
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_core2>)
1085+
1086+
include_directories(${PROJECT_SOURCE_DIR}/simde)
1087+
if (CMAKE_COMPILER_IS_CLANG)
1088+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT")
1089+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT")
1090+
endif()
1091+
set_target_properties(hs_exec_shared_core2 PROPERTIES
1092+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1093+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1094+
COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2"
1095+
POSITION_INDEPENDENT_CODE TRUE
1096+
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
1097+
)
1098+
set_target_properties(hs_compile_shared PROPERTIES
1099+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1100+
string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
1101+
COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2"
1102+
)
1103+
else()
1104+
add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS})
1105+
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_core2>)
1106+
set_target_properties(hs_exec_shared_core2 PROPERTIES
1107+
COMPILE_FLAGS "-march=core2 -msse4.2"
1108+
POSITION_INDEPENDENT_CODE TRUE
1109+
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
1110+
)
1111+
endif (BUILD_SSE2_SIMDE)
1112+
9961113
add_library(hs_exec_shared_corei7 OBJECT ${hs_exec_SRCS})
9971114
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_corei7>)
9981115
set_target_properties(hs_exec_shared_corei7 PROPERTIES
@@ -1194,11 +1311,17 @@ if (NOT BUILD_STATIC_LIBS)
11941311
endif ()
11951312

11961313
add_subdirectory(util)
1197-
add_subdirectory(unit)
11981314

1199-
if (EXISTS ${CMAKE_SOURCE_DIR}/tools/CMakeLists.txt)
1315+
option(BUILD_UNIT "Build Hyperscan unit tests (default TRUE)" TRUE)
1316+
if(BUILD_UNIT)
1317+
add_subdirectory(unit)
1318+
endif()
1319+
1320+
option(BUILD_TOOLS "Build Hyperscan tools (default TRUE)" TRUE)
1321+
if(EXISTS ${CMAKE_SOURCE_DIR}/tools/CMakeLists.txt AND BUILD_TOOLS)
12001322
add_subdirectory(tools)
12011323
endif()
1324+
12021325
if (EXISTS ${CMAKE_SOURCE_DIR}/chimera/CMakeLists.txt AND BUILD_CHIMERA)
12031326
add_subdirectory(chimera)
12041327
endif()
@@ -1213,4 +1336,7 @@ if(BUILD_BENCHMARKS)
12131336
add_subdirectory(benchmarks)
12141337
endif()
12151338

1216-
add_subdirectory(doc/dev-reference)
1339+
option(BUILD_DOC "Build the Hyperscan documentation (default TRUE)" TRUE)
1340+
if(BUILD_DOC)
1341+
add_subdirectory(doc/dev-reference)
1342+
endif()

0 commit comments

Comments
 (0)