mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
tune and arch flags will be applied from autodetect only if they have been created by the process, otherwise the old logical flow remains wrt the flags
1490 lines
48 KiB
CMake
1490 lines
48 KiB
CMake
cmake_minimum_required (VERSION 2.8.11)
|
|
project (vectorscan C CXX)
|
|
|
|
set (HS_MAJOR_VERSION 5)
|
|
set (HS_MINOR_VERSION 4)
|
|
set (HS_PATCH_VERSION 8)
|
|
set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION})
|
|
|
|
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
|
|
include(CheckCCompilerFlag)
|
|
include(CheckCXXCompilerFlag)
|
|
include(CheckCXXSymbolExists)
|
|
INCLUDE (CheckFunctionExists)
|
|
INCLUDE (CheckIncludeFiles)
|
|
INCLUDE (CheckIncludeFileCXX)
|
|
INCLUDE (CheckLibraryExists)
|
|
INCLUDE (CheckSymbolExists)
|
|
include (CMakeDependentOption)
|
|
include (GNUInstallDirs)
|
|
include (${CMAKE_MODULE_PATH}/platform.cmake)
|
|
include (${CMAKE_MODULE_PATH}/ragel.cmake)
|
|
|
|
find_package(PkgConfig QUIET)
|
|
|
|
if (NOT CMAKE_BUILD_TYPE)
|
|
message(STATUS "Default build type 'Release with debug info'")
|
|
set(CMAKE_BUILD_TYPE RELWITHDEBINFO CACHE STRING "" FORCE )
|
|
else()
|
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)
|
|
message(STATUS "Build type ${CMAKE_BUILD_TYPE}")
|
|
endif()
|
|
|
|
if(CMAKE_BUILD_TYPE MATCHES NONE|RELEASE|RELWITHDEBINFO|MINSIZEREL)
|
|
message(STATUS "using release build")
|
|
set(RELEASE_BUILD TRUE)
|
|
else()
|
|
set(RELEASE_BUILD FALSE)
|
|
endif()
|
|
|
|
set(BINDIR "${PROJECT_BINARY_DIR}/bin")
|
|
set(LIBDIR "${PROJECT_BINARY_DIR}/lib")
|
|
|
|
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR})
|
|
|
|
# First for the generic no-config case
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${BINDIR}")
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${LIBDIR}")
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${LIBDIR}")
|
|
# Second, for multi-config builds (e.g. msvc)
|
|
foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
|
|
string (TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${BINDIR}")
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${LIBDIR}")
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${LIBDIR}")
|
|
endforeach (OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
|
|
|
|
|
|
if(CMAKE_GENERATOR STREQUAL Xcode)
|
|
set(XCODE TRUE)
|
|
endif()
|
|
|
|
# older versions of cmake don't know things support isystem
|
|
if (XCODE OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
|
|
set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem")
|
|
endif ()
|
|
|
|
set(CMAKE_INCLUDE_CURRENT_DIR 1)
|
|
include_directories(${PROJECT_SOURCE_DIR}/src)
|
|
include_directories(${PROJECT_BINARY_DIR})
|
|
include_directories(SYSTEM include)
|
|
|
|
include (${CMAKE_MODULE_PATH}/boost.cmake)
|
|
|
|
find_package(Python COMPONENTS Interpreter)
|
|
find_program(RAGEL ragel)
|
|
|
|
if(NOT Python_Interpreter_FOUND)
|
|
message(FATAL_ERROR "No python interpreter found")
|
|
endif()
|
|
|
|
# allow for reproducible builds - python for portability
|
|
if (DEFINED ENV{SOURCE_DATE_EPOCH})
|
|
execute_process(
|
|
COMMAND "${PYTHON}" "${CMAKE_MODULE_PATH}/formatdate.py" "$ENV{SOURCE_DATE_EPOCH}"
|
|
OUTPUT_VARIABLE BUILD_DATE
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
else ()
|
|
string (TIMESTAMP BUILD_DATE "%Y-%m-%d")
|
|
endif ()
|
|
message(STATUS "Build date: ${BUILD_DATE}")
|
|
|
|
|
|
if(${RAGEL} STREQUAL "RAGEL-NOTFOUND")
|
|
message(FATAL_ERROR "Ragel state machine compiler not found")
|
|
endif()
|
|
|
|
option(DEBUG_OUTPUT "Enable debug output (warning: very verbose)" FALSE)
|
|
|
|
if(DEBUG_OUTPUT)
|
|
add_definitions(-DDEBUG)
|
|
set(RELEASE_BUILD FALSE)
|
|
endif(DEBUG_OUTPUT)
|
|
|
|
option(BUILD_SHARED_LIBS "Build shared libs instead of static" OFF)
|
|
option(BUILD_STATIC_AND_SHARED "Build shared libs as well as static" OFF)
|
|
|
|
if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS)
|
|
message(STATUS "Building shared libraries")
|
|
else()
|
|
message(STATUS "Building static libraries")
|
|
endif()
|
|
|
|
if (NOT BUILD_SHARED_LIBS)
|
|
# build static libs
|
|
set(BUILD_STATIC_LIBS ON)
|
|
mark_as_advanced(BUILD_STATIC_LIBS)
|
|
endif ()
|
|
|
|
#for config
|
|
if (RELEASE_BUILD)
|
|
set(HS_OPTIMIZE ON)
|
|
endif()
|
|
|
|
include (${CMAKE_MODULE_PATH}/sanitize.cmake)
|
|
|
|
CMAKE_DEPENDENT_OPTION(DUMP_SUPPORT "Dump code support; normally on, except in release builds" ON "NOT RELEASE_BUILD" OFF)
|
|
|
|
CMAKE_DEPENDENT_OPTION(DISABLE_ASSERTS "Disable assert(); Asserts are enabled in debug builds, disabled in release builds" OFF "NOT RELEASE_BUILD" ON)
|
|
|
|
option(BUILD_AVX512 "Experimental: support avx512 in the fat runtime" OFF)
|
|
|
|
option(BUILD_AVX512VBMI "Experimental: support avx512vbmi in the fat runtime" OFF)
|
|
|
|
if (BUILD_AVX512VBMI)
|
|
set(BUILD_AVX512 ON)
|
|
endif ()
|
|
|
|
# TODO: per platform config files?
|
|
|
|
# remove CMake's idea of optimisation
|
|
foreach (CONFIG ${CMAKE_BUILD_TYPE} ${CMAKE_CONFIGURATION_TYPES})
|
|
string(REGEX REPLACE "-O[^ ]*" "" CMAKE_C_FLAGS_${CONFIG} "${CMAKE_C_FLAGS_${CONFIG}}")
|
|
string(REGEX REPLACE "-O[^ ]*" "" CMAKE_CXX_FLAGS_${CONFIG} "${CMAKE_CXX_FLAGS_${CONFIG}}")
|
|
endforeach ()
|
|
|
|
if (CMAKE_C_COMPILER_ID MATCHES "Intel")
|
|
set(SKYLAKE_FLAG "-xCORE-AVX512")
|
|
else ()
|
|
set(SKYLAKE_FLAG "-march=skylake-avx512")
|
|
set(ICELAKE_FLAG "-march=icelake-server")
|
|
endif ()
|
|
|
|
if(ARCH_PPC64EL)
|
|
set(ARCH_FLAG mcpu)
|
|
else()
|
|
set(ARCH_FLAG march)
|
|
endif()
|
|
|
|
# Detect best GNUCC_ARCH to tune for
|
|
if (CMAKE_COMPILER_IS_GNUCC AND NOT CROSS_COMPILE)
|
|
message(STATUS "gcc version ${CMAKE_C_COMPILER_VERSION}")
|
|
|
|
# If gcc doesn't recognise the host cpu, then mtune=native becomes
|
|
# generic, which isn't very good in some cases. march=native looks at
|
|
# cpuid info and then chooses the best microarch it can (and replaces
|
|
# the flag), so use that for tune.
|
|
|
|
set(TUNE_FLAG "mtune")
|
|
set(GNUCC_TUNE "")
|
|
message(STATUS "ARCH_FLAG '${ARCH_FLAG}' '${GNUCC_ARCH}', TUNE_FLAG '${TUNE_FLAG}' '${GNUCC_TUNE}' ")
|
|
|
|
# arg1 might exist if using ccache
|
|
string (STRIP "${CMAKE_C_COMPILER_ARG1}" CC_ARG1)
|
|
set (EXEC_ARGS ${CC_ARG1} -c -Q --help=target -${ARCH_FLAG}=native -${TUNE_FLAG}=native)
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} ${EXEC_ARGS}
|
|
OUTPUT_VARIABLE _GCC_OUTPUT)
|
|
set(_GCC_OUTPUT_TUNE ${_GCC_OUTPUT})
|
|
string(FIND "${_GCC_OUTPUT}" "${ARCH_FLAG}=" POS)
|
|
string(SUBSTRING "${_GCC_OUTPUT}" ${POS} -1 _GCC_OUTPUT)
|
|
string(REGEX REPLACE "${ARCH_FLAG}=[ \t]*([^ \n]*)[ \n].*" "\\1" GNUCC_ARCH "${_GCC_OUTPUT}")
|
|
|
|
string(FIND "${_GCC_OUTPUT_TUNE}" "${TUNE_FLAG}=" POS_TUNE)
|
|
string(SUBSTRING "${_GCC_OUTPUT_TUNE}" ${POS_TUNE} -1 _GCC_OUTPUT_TUNE)
|
|
string(REGEX REPLACE "${TUNE_FLAG}=[ \t]*([^ \n]*)[ \n].*" "\\1" GNUCC_TUNE "${_GCC_OUTPUT_TUNE}")
|
|
|
|
string(FIND "${GNUCC_ARCH}" "sve" POS_SVE)
|
|
string(FIND "${GNUCC_ARCH}" "sve2" POS_SVE2)
|
|
string(FIND "${GNUCC_ARCH}" "sve2-bitperm" POS_SVE2_BITPERM)
|
|
if (NOT POS_SVE EQUAL 0)
|
|
set(SVE_FOUND 1)
|
|
elseif(NOT POS_SVE2 EQUAL 0)
|
|
set(SVE2_FOUND 1)
|
|
elseif(NOT POS_SVE2_BITPERM EQUAL 0)
|
|
set(SVE2_BITPERM_FOUND 1)
|
|
endif()
|
|
|
|
message(STATUS "ARCH_FLAG '${ARCH_FLAG}' '${GNUCC_ARCH}', TUNE_FLAG '${TUNE_FLAG}' '${GNUCC_TUNE}' ")
|
|
|
|
# test the parsed flag
|
|
set (EXEC_ARGS ${CC_ARG1} -E - -${ARCH_FLAG}=${GNUCC_ARCH} -${TUNE_FLAG}=${GNUCC_TUNE})
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} ${EXEC_ARGS}
|
|
OUTPUT_QUIET ERROR_QUIET
|
|
INPUT_FILE /dev/null
|
|
RESULT_VARIABLE GNUCC_TUNE_TEST)
|
|
if (NOT GNUCC_TUNE_TEST EQUAL 0)
|
|
message(WARNING "Something went wrong determining gcc tune: -mtune=${GNUCC_TUNE} not valid, falling back to -mtune=native")
|
|
set(GNUCC_TUNE native)
|
|
else()
|
|
set(GNUCC_TUNE ${GNUCC_TUNE})
|
|
message(STATUS "gcc will tune for ${GNUCC_ARCH}, ${GNUCC_TUNE}")
|
|
endif()
|
|
elseif (CMAKE_COMPILER_IS_CLANG AND NOT CROSS_COMPILE)
|
|
if (ARCH_IA32 OR ARCH_X86_64)
|
|
set(GNUCC_ARCH native)
|
|
set(TUNE_FLAG generic)
|
|
elseif(ARCH_AARCH64)
|
|
set(GNUCC_ARCH armv8)
|
|
set(TUNE_FLAG generic)
|
|
elseif(ARCH_ARM32)
|
|
set(GNUCC_ARCH armv7a)
|
|
set(TUNE_FLAG generic)
|
|
else()
|
|
set(GNUCC_ARCH native)
|
|
set(TUNE_FLAG generic)
|
|
endif()
|
|
message(STATUS "clang will tune for ${GNUCC_ARCH}, ${TUNE_FLAG}")
|
|
elseif (CROSS_COMPILE)
|
|
set(GNUCC_ARCH generic)
|
|
set(TUNE_FLAG generic)
|
|
endif()
|
|
|
|
if (ARCH_IA32 OR ARCH_X86_64)
|
|
if (NOT FAT_RUNTIME)
|
|
if (BUILD_AVX512)
|
|
set(ARCH_C_FLAGS "${SKYLAKE_FLAG}")
|
|
set(ARCH_CXX_FLAGS "${SKYLAKE_FLAG}")
|
|
elseif (BUILD_AVX2)
|
|
set(ARCH_C_FLAGS "-mavx2")
|
|
set(ARCH_CXX_FLAGS "-mavx2")
|
|
else()
|
|
set(ARCH_C_FLAGS "-msse4.2")
|
|
set(ARCH_CXX_FLAGS "-msse4.2")
|
|
endif()
|
|
else()
|
|
set(ARCH_C_FLAGS "-msse4.2")
|
|
set(ARCH_CXX_FLAGS "-msse4.2")
|
|
endif()
|
|
endif()
|
|
|
|
if (ARCH_AARCH64)
|
|
if (BUILD_SVE2_BITPERM AND NOT SVE2_BITPERM_FOUND)
|
|
set(GNUCC_ARCH "${GNUCC_ARCH}+sve2-bitperm")
|
|
elseif (BUILD_SVE2 AND NOT SVE2_FOUND)
|
|
set(GNUCC_ARCH "${GNUCC_ARCH}+sve2")
|
|
elseif (BUILD_SVE AND NOT SVE_FOUND)
|
|
set(GNUCC_ARCH "${GNUCC_ARCH}+sve")
|
|
endif ()
|
|
endif(ARCH_AARCH64)
|
|
|
|
message(STATUS "ARCH_C_FLAGS : ${ARCH_C_FLAGS}")
|
|
message(STATUS "ARCH_CXX_FLAGS : ${ARCH_CXX_FLAGS}")
|
|
|
|
if (NOT FAT_RUNTIME)
|
|
if (GNUCC_TUNE)
|
|
set(ARCH_C_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -${TUNE_FLAG}=${GNUCC_TUNE}")
|
|
set(ARCH_CXX_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -${TUNE_FLAG}=${GNUCC_TUNE}")
|
|
else()
|
|
set(ARCH_C_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -mtune=${TUNE_FLAG} ${ARCH_C_FLAGS}")
|
|
set(ARCH_CXX_FLAGS "-${ARCH_FLAG}=${GNUCC_ARCH} -mtune=${TUNE_FLAG} ${ARCH_CXX_FLAGS}")
|
|
endif()
|
|
endif()
|
|
|
|
#if (ARCH_IA32 OR ARCH_X86_64 OR ARCH_ARM32 OR ARCH_AARCH64)
|
|
# if (NOT CMAKE_C_FLAGS MATCHES .*march.* AND NOT CMAKE_C_FLAGS MATCHES .*mtune.*)
|
|
# set(ARCH_C_FLAGS "-march=${GNUCC_ARCH} -mtune=${TUNE_FLAG}")
|
|
# endif()
|
|
# if (NOT CMAKE_CXX_FLAGS MATCHES .*march.* AND NOT CMAKE_CXX_FLAGS MATCHES .*mtune.*)
|
|
# set(ARCH_CXX_FLAGS "-march=${GNUCC_ARCH} -mtune=${TUNE_FLAG}")
|
|
# endif()
|
|
#endif()
|
|
|
|
#if(ARCH_PPC64EL)
|
|
# if (NOT CMAKE_C_FLAGS MATCHES .*march.* AND NOT CMAKE_C_FLAGS MATCHES .*mtune.*)
|
|
# set(ARCH_C_FLAGS "-mtune=${TUNE_FLAG}")
|
|
# endif()
|
|
# if (NOT CMAKE_CXX_FLAGS MATCHES .*march.* AND NOT CMAKE_CXX_FLAGS MATCHES .*mtune.*)
|
|
# set(ARCH_CXX_FLAGS "-mtune=${TUNE_FLAG}")
|
|
# endif()
|
|
#endif()
|
|
|
|
# compiler version checks TODO: test more compilers
|
|
if (CMAKE_COMPILER_IS_GNUCXX)
|
|
set(GNUCXX_MINVER "9")
|
|
message(STATUS "g++ version ${CMAKE_CXX_COMPILER_VERSION}")
|
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS GNUCXX_MINVER)
|
|
message(FATAL_ERROR "A minimum of g++ ${GNUCXX_MINVER} is required for C++17 support")
|
|
endif()
|
|
endif()
|
|
|
|
if(RELEASE_BUILD)
|
|
if (NOT CMAKE_BUILD_TYPE MATCHES MINSIZEREL)
|
|
set(OPT_C_FLAG "-O3")
|
|
set(OPT_CXX_FLAG "-O3")
|
|
else ()
|
|
set(OPT_C_FLAG "-Os")
|
|
set(OPT_CXX_FLAG "-Os")
|
|
endif ()
|
|
else()
|
|
set(OPT_C_FLAG "-O0")
|
|
set(OPT_CXX_FLAG "-O0")
|
|
endif(RELEASE_BUILD)
|
|
|
|
# set compiler flags - more are tested and added later
|
|
set(EXTRA_C_FLAGS "${OPT_C_FLAG} -std=c17 -Wall -Wextra -Wshadow -Wcast-qual -fno-strict-aliasing")
|
|
set(EXTRA_CXX_FLAGS "${OPT_CXX_FLAG} -std=c++17 -Wall -Wextra -Wshadow -Wswitch -Wreturn-type -Wcast-qual -Wno-deprecated -Wnon-virtual-dtor -fno-strict-aliasing")
|
|
if (NOT CMAKE_COMPILER_IS_CLANG)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fno-new-ttp-matching")
|
|
endif()
|
|
|
|
if (NOT RELEASE_BUILD)
|
|
# -Werror is most useful during development, don't potentially break
|
|
# release builds
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Werror")
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Werror")
|
|
endif()
|
|
|
|
if (DISABLE_ASSERTS)
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -DNDEBUG")
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -DNDEBUG")
|
|
endif()
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
# spurious warnings?
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-array-bounds -Wno-maybe-uninitialized")
|
|
endif()
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-maybe-uninitialized")
|
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fabi-version=0")
|
|
endif ()
|
|
# don't complain about abi
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-abi")
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-abi")
|
|
endif()
|
|
|
|
if (NOT(ARCH_IA32 AND RELEASE_BUILD))
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -fno-omit-frame-pointer")
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fno-omit-frame-pointer")
|
|
endif()
|
|
|
|
CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
|
|
if (ARCH_IA32 OR ARCH_X86_64)
|
|
CHECK_INCLUDE_FILES(intrin.h HAVE_C_INTRIN_H)
|
|
CHECK_INCLUDE_FILE_CXX(intrin.h HAVE_CXX_INTRIN_H)
|
|
CHECK_INCLUDE_FILES(x86intrin.h HAVE_C_X86INTRIN_H)
|
|
CHECK_INCLUDE_FILE_CXX(x86intrin.h HAVE_CXX_X86INTRIN_H)
|
|
elseif (ARCH_ARM32 OR ARCH_AARCH64)
|
|
CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H)
|
|
if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM)
|
|
CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H)
|
|
if (NOT HAVE_C_ARM_SVE_H)
|
|
message(FATAL_ERROR "arm_sve.h is required to build for SVE.")
|
|
endif()
|
|
endif()
|
|
elseif (ARCH_PPC64EL)
|
|
CHECK_INCLUDE_FILE_CXX(altivec.h HAVE_C_PPC64EL_ALTIVEC_H)
|
|
endif()
|
|
|
|
CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN)
|
|
CHECK_FUNCTION_EXISTS(_aligned_malloc HAVE__ALIGNED_MALLOC)
|
|
|
|
# these end up in the config file
|
|
CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAS_C_HIDDEN)
|
|
CHECK_CXX_COMPILER_FLAG(-fvisibility=hidden HAS_CXX_HIDDEN)
|
|
|
|
# are we using libc++
|
|
CHECK_CXX_SYMBOL_EXISTS(_LIBCPP_VERSION ciso646 HAVE_LIBCPP)
|
|
|
|
if (RELEASE_BUILD)
|
|
if (HAS_C_HIDDEN)
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -fvisibility=hidden")
|
|
endif()
|
|
if (HAS_CXX_HIDDEN)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -fvisibility=hidden")
|
|
endif()
|
|
endif()
|
|
|
|
option(FAT_RUNTIME "Build a library that supports multiple microarchitectures" ON)
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux" AND FAT_RUNTIME MATCHES "ON")
|
|
# This is a Linux-only feature for now - requires platform support
|
|
# elsewhere
|
|
message(STATUS "generator is ${CMAKE_GENERATOR}")
|
|
if (CMAKE_C_COMPILER_IS_CLANG AND CMAKE_C_COMPILER_VERSION VERSION_LESS "3.9")
|
|
message (STATUS "Clang v3.9 or higher required for fat runtime, cannot build fat runtime")
|
|
set (FAT_RUNTIME_REQUISITES FALSE)
|
|
elseif (NOT (CMAKE_GENERATOR MATCHES "Unix Makefiles" OR
|
|
(CMAKE_VERSION VERSION_GREATER "3.0" AND CMAKE_GENERATOR MATCHES "Ninja")))
|
|
message (STATUS "Building the fat runtime requires the Unix Makefiles generator, or Ninja with CMake v3.0 or higher")
|
|
set (FAT_RUNTIME_REQUISITES FALSE)
|
|
else()
|
|
include (${CMAKE_MODULE_PATH}/attrib.cmake)
|
|
if (NOT HAS_C_ATTR_IFUNC)
|
|
message(STATUS "Compiler does not support ifunc attribute, cannot build fat runtime")
|
|
set (FAT_RUNTIME_REQUISITES FALSE)
|
|
else ()
|
|
set (FAT_RUNTIME_REQUISITES TRUE)
|
|
endif()
|
|
endif()
|
|
if (NOT FAT_RUNTIME_REQUISITES OR NOT RELEASE_BUILD)
|
|
set (FAT_RUNTIME OFF)
|
|
endif()
|
|
endif ()
|
|
|
|
include (${CMAKE_MODULE_PATH}/arch.cmake)
|
|
|
|
# testing a builtin takes a little more work
|
|
CHECK_C_SOURCE_COMPILES("void *aa_test(void *x) { return __builtin_assume_aligned(x, 16);}\nint main(void) { return 0; }" HAVE_CC_BUILTIN_ASSUME_ALIGNED)
|
|
CHECK_CXX_SOURCE_COMPILES("void *aa_test(void *x) { return __builtin_assume_aligned(x, 16);}\nint main(void) { return 0; }" HAVE_CXX_BUILTIN_ASSUME_ALIGNED)
|
|
# Clang does not use __builtin_constant_p() the same way as gcc
|
|
if (NOT CMAKE_COMPILER_IS_CLANG)
|
|
CHECK_C_SOURCE_COMPILES("int main(void) { __builtin_constant_p(0); }" HAVE__BUILTIN_CONSTANT_P)
|
|
endif()
|
|
|
|
set(C_FLAGS_TO_CHECK
|
|
# Variable length arrays are way bad, most especially at run time
|
|
"-Wvla"
|
|
# Pointer arith on void pointers is doing it wrong.
|
|
"-Wpointer-arith"
|
|
# Build our C code with -Wstrict-prototypes -Wmissing-prototypes
|
|
"-Wstrict-prototypes"
|
|
"-Wmissing-prototypes"
|
|
)
|
|
foreach (FLAG ${C_FLAGS_TO_CHECK})
|
|
# munge the name so it doesn't break things
|
|
string(REPLACE "-" "_" FNAME C_FLAG${FLAG})
|
|
CHECK_C_COMPILER_FLAG("${FLAG}" ${FNAME})
|
|
if (${FNAME})
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} ${FLAG}")
|
|
endif()
|
|
endforeach()
|
|
|
|
set(CXX_FLAGS_TO_CHECK
|
|
"-Wvla"
|
|
"-Wpointer-arith"
|
|
)
|
|
foreach (FLAG ${CXX_FLAGS_TO_CHECK})
|
|
string(REPLACE "-" "_" FNAME CXX_FLAG${FLAG})
|
|
CHECK_CXX_COMPILER_FLAG("${FLAG}" ${FNAME})
|
|
if (${FNAME})
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} ${FLAG}")
|
|
endif()
|
|
endforeach()
|
|
|
|
# self-assign should be thrown away, but clang whinges
|
|
CHECK_C_COMPILER_FLAG("-Wself-assign" CC_SELF_ASSIGN)
|
|
if (CC_SELF_ASSIGN)
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-self-assign")
|
|
endif()
|
|
CHECK_CXX_COMPILER_FLAG("-Wself-assign" CXX_SELF_ASSIGN)
|
|
if (CXX_SELF_ASSIGN)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-self-assign")
|
|
endif()
|
|
|
|
# clang gets up in our face for going paren crazy with macros
|
|
CHECK_C_COMPILER_FLAG("-Wparentheses-equality" CC_PAREN_EQUALITY)
|
|
if (CC_PAREN_EQUALITY)
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-parentheses-equality")
|
|
endif()
|
|
|
|
# clang complains about unused const vars in our Ragel-generated code.
|
|
CHECK_CXX_COMPILER_FLAG("-Wunused-const-variable" CXX_UNUSED_CONST_VAR)
|
|
if (CXX_UNUSED_CONST_VAR)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-unused-const-variable")
|
|
endif()
|
|
|
|
# gcc 6 complains about type attributes that get ignored, like alignment
|
|
CHECK_CXX_COMPILER_FLAG("-Wignored-attributes" CXX_IGNORED_ATTR)
|
|
if (CXX_IGNORED_ATTR)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-ignored-attributes")
|
|
endif()
|
|
|
|
# gcc 9 complains about redundant move for returned variable
|
|
CHECK_CXX_COMPILER_FLAG("-Wredundant-move" CXX_REDUNDANT_MOVE)
|
|
if (CXX_REDUNDANT_MOVE)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wno-redundant-move")
|
|
endif()
|
|
|
|
# note this for later
|
|
# g++ doesn't have this flag but clang does
|
|
CHECK_CXX_COMPILER_FLAG("-Wweak-vtables" CXX_WEAK_VTABLES)
|
|
if (CXX_WEAK_VTABLES)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wweak-vtables")
|
|
endif()
|
|
|
|
CHECK_CXX_COMPILER_FLAG("-Wmissing-declarations" CXX_MISSING_DECLARATIONS)
|
|
if (CXX_MISSING_DECLARATIONS)
|
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} -Wmissing-declarations")
|
|
endif()
|
|
|
|
CHECK_CXX_COMPILER_FLAG("-Wunused-local-typedefs" CXX_UNUSED_LOCAL_TYPEDEFS)
|
|
|
|
# gcc5 complains about this
|
|
CHECK_CXX_COMPILER_FLAG("-Wunused-variable" CXX_WUNUSED_VARIABLE)
|
|
|
|
# gcc 10 complains about this
|
|
CHECK_C_COMPILER_FLAG("-Wstringop-overflow" CC_STRINGOP_OVERFLOW)
|
|
if(CC_STRINGOP_OVERFLOW)
|
|
set(EXTRA_C_FLAGS "${EXTRA_C_FLAGS} -Wno-stringop-overflow")
|
|
endif()
|
|
|
|
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
|
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
set(LINUX TRUE)
|
|
endif(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
|
set(FREEBSD true)
|
|
endif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
|
|
|
|
|
if (FAT_RUNTIME)
|
|
if (NOT (ARCH_IA32 OR ARCH_X86_64))
|
|
message(FATAL_ERROR "Fat runtime is not supported on non-Intel architectures")
|
|
else()
|
|
message(STATUS "Building runtime for multiple microarchitectures")
|
|
endif()
|
|
else()
|
|
if (CROSS_COMPILE)
|
|
message(STATUS "Building for target CPU: ${ARCH_C_FLAGS}")
|
|
else()
|
|
message(STATUS "Building for current host CPU: ${ARCH_C_FLAGS}")
|
|
endif()
|
|
endif()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_C_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_CXX_FLAGS}")
|
|
|
|
add_subdirectory(util)
|
|
add_subdirectory(doc/dev-reference)
|
|
|
|
# PCRE check, we have a fixed requirement for PCRE to use Chimera
|
|
# and hscollider
|
|
set(PCRE_REQUIRED_MAJOR_VERSION 8)
|
|
set(PCRE_REQUIRED_MINOR_VERSION 41)
|
|
set(PCRE_REQUIRED_VERSION ${PCRE_REQUIRED_MAJOR_VERSION}.${PCRE_REQUIRED_MINOR_VERSION})
|
|
include (${CMAKE_MODULE_PATH}/pcre.cmake)
|
|
if (NOT CORRECT_PCRE_VERSION)
|
|
message(STATUS "PCRE ${PCRE_REQUIRED_VERSION} or above not found")
|
|
endif()
|
|
|
|
# we need static libs for Chimera - too much deep magic for shared libs
|
|
if (CORRECT_PCRE_VERSION AND PCRE_BUILD_SOURCE AND BUILD_STATIC_LIBS)
|
|
set(BUILD_CHIMERA TRUE)
|
|
endif()
|
|
|
|
add_subdirectory(unit)
|
|
if (EXISTS ${CMAKE_SOURCE_DIR}/tools/CMakeLists.txt)
|
|
add_subdirectory(tools)
|
|
endif()
|
|
if (EXISTS ${CMAKE_SOURCE_DIR}/chimera/CMakeLists.txt AND BUILD_CHIMERA)
|
|
add_subdirectory(chimera)
|
|
endif()
|
|
|
|
# do substitutions
|
|
configure_file(${CMAKE_MODULE_PATH}/config.h.in ${PROJECT_BINARY_DIR}/config.h)
|
|
configure_file(src/hs_version.h.in ${PROJECT_BINARY_DIR}/hs_version.h)
|
|
|
|
|
|
configure_file(libhs.pc.in libhs.pc @ONLY) # only replace @ quoted vars
|
|
install(FILES ${CMAKE_BINARY_DIR}/libhs.pc
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
|
|
|
# only set these after all tests are done
|
|
if (NOT FAT_RUNTIME)
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS} ${HS_C_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS} ${HS_CXX_FLAGS}")
|
|
else()
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}")
|
|
endif()
|
|
|
|
set(RAGEL_C_FLAGS "-Wno-unused")
|
|
|
|
set_source_files_properties(
|
|
${CMAKE_BINARY_DIR}/src/parser/Parser.cpp
|
|
PROPERTIES
|
|
COMPILE_FLAGS "${RAGEL_C_FLAGS}")
|
|
|
|
ragelmaker(src/parser/Parser.rl)
|
|
|
|
set_source_files_properties(
|
|
${CMAKE_BINARY_DIR}/src/parser/control_verbs.cpp
|
|
PROPERTIES
|
|
COMPILE_FLAGS "${RAGEL_C_FLAGS}")
|
|
|
|
ragelmaker(src/parser/control_verbs.rl)
|
|
|
|
SET(hs_HEADERS
|
|
src/hs.h
|
|
src/hs_common.h
|
|
src/hs_compile.h
|
|
src/hs_runtime.h
|
|
)
|
|
install(FILES ${hs_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/hs")
|
|
|
|
set (hs_exec_common_SRCS
|
|
src/alloc.c
|
|
src/scratch.c
|
|
src/util/arch/common/cpuid_flags.h
|
|
src/util/multibit.c
|
|
)
|
|
|
|
if (ARCH_IA32 OR ARCH_X86_64)
|
|
set (hs_exec_common_SRCS
|
|
${hs_exec_common_SRCS}
|
|
src/util/arch/x86/cpuid_flags.c
|
|
)
|
|
elseif (ARCH_ARM32 OR ARCH_AARCH64 OR ARCH_PPC64EL)
|
|
set (hs_exec_common_SRCS
|
|
${hs_exec_common_SRCS}
|
|
src/util/arch/arm/cpuid_flags.c
|
|
)
|
|
endif ()
|
|
|
|
set (hs_exec_SRCS
|
|
${hs_HEADERS}
|
|
src/hs_version.h
|
|
src/ue2common.h
|
|
src/allocator.h
|
|
src/crc32.c
|
|
src/crc32.h
|
|
src/report.h
|
|
src/runtime.c
|
|
src/stream_compress.c
|
|
src/stream_compress.h
|
|
src/stream_compress_impl.h
|
|
src/fdr/fdr.c
|
|
src/fdr/fdr.h
|
|
src/fdr/fdr_internal.h
|
|
src/fdr/fdr_confirm.h
|
|
src/fdr/fdr_confirm_runtime.h
|
|
src/fdr/flood_runtime.h
|
|
src/fdr/fdr_loadval.h
|
|
src/fdr/teddy.c
|
|
src/fdr/teddy.h
|
|
src/fdr/teddy_internal.h
|
|
src/fdr/teddy_runtime_common.h
|
|
src/hwlm/hwlm.c
|
|
src/hwlm/hwlm.h
|
|
src/hwlm/hwlm_internal.h
|
|
src/hwlm/noodle_engine.cpp
|
|
src/hwlm/noodle_engine.h
|
|
src/hwlm/noodle_internal.h
|
|
src/nfa/accel.c
|
|
src/nfa/accel.h
|
|
src/nfa/castle.c
|
|
src/nfa/castle.h
|
|
src/nfa/castle_internal.h
|
|
src/nfa/gough.c
|
|
src/nfa/gough_internal.h
|
|
src/nfa/lbr.c
|
|
src/nfa/lbr.h
|
|
src/nfa/lbr_common_impl.h
|
|
src/nfa/lbr_internal.h
|
|
src/nfa/limex_accel.c
|
|
src/nfa/limex_accel.h
|
|
src/nfa/limex_exceptional.h
|
|
src/nfa/limex_native.c
|
|
src/nfa/limex_ring.h
|
|
src/nfa/limex_64.c
|
|
src/nfa/limex_simd128.c
|
|
src/nfa/limex_simd256.c
|
|
src/nfa/limex_simd384.c
|
|
src/nfa/limex_simd512.c
|
|
src/nfa/limex.h
|
|
src/nfa/limex_common_impl.h
|
|
src/nfa/limex_context.h
|
|
src/nfa/limex_internal.h
|
|
src/nfa/limex_runtime.h
|
|
src/nfa/limex_runtime_impl.h
|
|
src/nfa/limex_shuffle.h
|
|
src/nfa/limex_state_impl.h
|
|
src/nfa/mcclellan.c
|
|
src/nfa/mcclellan.h
|
|
src/nfa/mcclellan_common_impl.h
|
|
src/nfa/mcclellan_internal.h
|
|
src/nfa/mcsheng.c
|
|
src/nfa/mcsheng_data.c
|
|
src/nfa/mcsheng.h
|
|
src/nfa/mcsheng_internal.h
|
|
src/nfa/mpv.h
|
|
src/nfa/mpv.c
|
|
src/nfa/mpv_internal.h
|
|
src/nfa/nfa_api.h
|
|
src/nfa/nfa_api_dispatch.c
|
|
src/nfa/nfa_internal.h
|
|
src/nfa/nfa_rev_api.h
|
|
src/nfa/repeat.c
|
|
src/nfa/repeat.h
|
|
src/nfa/repeat_internal.h
|
|
src/nfa/sheng.c
|
|
src/nfa/sheng.h
|
|
src/nfa/sheng_defs.h
|
|
src/nfa/sheng_impl.h
|
|
src/nfa/sheng_impl4.h
|
|
src/nfa/sheng_internal.h
|
|
src/nfa/shufti.cpp
|
|
src/nfa/shufti.h
|
|
src/nfa/tamarama.c
|
|
src/nfa/tamarama.h
|
|
src/nfa/tamarama_internal.h
|
|
src/nfa/truffle.cpp
|
|
src/nfa/truffle.h
|
|
src/nfa/vermicelli.hpp
|
|
src/nfa/vermicelli_run.h
|
|
src/som/som.h
|
|
src/som/som_operation.h
|
|
src/som/som_runtime.h
|
|
src/som/som_runtime.c
|
|
src/som/som_stream.c
|
|
src/som/som_stream.h
|
|
src/rose/block.c
|
|
src/rose/catchup.h
|
|
src/rose/catchup.c
|
|
src/rose/infix.h
|
|
src/rose/init.h
|
|
src/rose/init.c
|
|
src/rose/stream.c
|
|
src/rose/stream_long_lit.h
|
|
src/rose/stream_long_lit_hash.h
|
|
src/rose/match.h
|
|
src/rose/match.c
|
|
src/rose/miracle.h
|
|
src/rose/program_runtime.c
|
|
src/rose/program_runtime.h
|
|
src/rose/runtime.h
|
|
src/rose/rose.h
|
|
src/rose/rose_internal.h
|
|
src/rose/rose_program.h
|
|
src/rose/rose_types.h
|
|
src/rose/rose_common.h
|
|
src/rose/validate_mask.h
|
|
src/rose/validate_shufti.h
|
|
src/util/bitutils.h
|
|
src/util/copybytes.h
|
|
src/util/exhaust.h
|
|
src/util/fatbit.h
|
|
src/util/join.h
|
|
src/util/multibit.h
|
|
src/util/multibit.c
|
|
src/util/multibit_compress.h
|
|
src/util/multibit_internal.h
|
|
src/util/pack_bits.h
|
|
src/util/popcount.h
|
|
src/util/pqueue.h
|
|
src/util/scatter.h
|
|
src/util/scatter_runtime.h
|
|
src/util/simd_utils.h
|
|
src/util/state_compress.h
|
|
src/util/state_compress.c
|
|
src/util/unaligned.h
|
|
src/util/uniform_ops.h
|
|
src/database.c
|
|
src/database.h
|
|
)
|
|
|
|
if (NOT RELEASE_BUILD OR FAT_RUNTIME)
|
|
if (ARCH_IA32 OR ARCH_X86_64)
|
|
set (hs_exec_SRCS
|
|
${hs_exec_SRCS}
|
|
src/util/supervector/arch/x86/impl.cpp)
|
|
elseif (ARCH_ARM32 OR ARCH_AARCH64)
|
|
set (hs_exec_SRCS
|
|
${hs_exec_SRCS}
|
|
src/util/supervector/arch/arm/impl.cpp)
|
|
elseif (ARCH_PPC64EL)
|
|
set (hs_exec_SRCS
|
|
${hs_exec_SRCS}
|
|
src/util/supervector/arch/ppc64el/impl.cpp)
|
|
endif ()
|
|
endif()
|
|
|
|
if (NOT BUILD_SVE2)
|
|
set (hs_exec_SRCS
|
|
${hs_exec_SRCS}
|
|
src/nfa/vermicelli_simd.cpp)
|
|
endif()
|
|
|
|
set (hs_exec_avx2_SRCS
|
|
src/fdr/teddy_avx2.c
|
|
src/util/arch/x86/masked_move.c
|
|
src/util/arch/x86/masked_move.h
|
|
)
|
|
|
|
SET (hs_compile_SRCS
|
|
${hs_HEADERS}
|
|
src/crc32.h
|
|
src/database.h
|
|
src/grey.cpp
|
|
src/grey.h
|
|
src/hs.cpp
|
|
src/hs_internal.h
|
|
src/hs_version.h
|
|
src/scratch.h
|
|
src/state.h
|
|
src/ue2common.h
|
|
src/compiler/asserts.cpp
|
|
src/compiler/asserts.h
|
|
src/compiler/compiler.cpp
|
|
src/compiler/compiler.h
|
|
src/compiler/error.cpp
|
|
src/compiler/error.h
|
|
src/compiler/expression_info.h
|
|
src/fdr/engine_description.cpp
|
|
src/fdr/engine_description.h
|
|
src/fdr/fdr_compile.cpp
|
|
src/fdr/fdr_compile.h
|
|
src/fdr/fdr_compile_internal.h
|
|
src/fdr/fdr_compile_util.cpp
|
|
src/fdr/fdr_confirm_compile.cpp
|
|
src/fdr/fdr_confirm.h
|
|
src/fdr/fdr_engine_description.cpp
|
|
src/fdr/fdr_engine_description.h
|
|
src/fdr/fdr_internal.h
|
|
src/fdr/flood_compile.cpp
|
|
src/fdr/teddy_compile.cpp
|
|
src/fdr/teddy_compile.h
|
|
src/fdr/teddy_engine_description.cpp
|
|
src/fdr/teddy_engine_description.h
|
|
src/fdr/teddy_internal.h
|
|
src/hwlm/hwlm_build.cpp
|
|
src/hwlm/hwlm_build.h
|
|
src/hwlm/hwlm_internal.h
|
|
src/hwlm/hwlm_literal.cpp
|
|
src/hwlm/hwlm_literal.h
|
|
src/hwlm/noodle_build.cpp
|
|
src/hwlm/noodle_build.h
|
|
src/hwlm/noodle_internal.h
|
|
src/nfa/accel.h
|
|
src/nfa/accel_dfa_build_strat.cpp
|
|
src/nfa/accel_dfa_build_strat.h
|
|
src/nfa/accelcompile.cpp
|
|
src/nfa/accelcompile.h
|
|
src/nfa/callback.h
|
|
src/nfa/castlecompile.cpp
|
|
src/nfa/castlecompile.h
|
|
src/nfa/dfa_build_strat.cpp
|
|
src/nfa/dfa_build_strat.h
|
|
src/nfa/dfa_min.cpp
|
|
src/nfa/dfa_min.h
|
|
src/nfa/goughcompile.cpp
|
|
src/nfa/goughcompile.h
|
|
src/nfa/goughcompile_accel.cpp
|
|
src/nfa/goughcompile_internal.h
|
|
src/nfa/goughcompile_reg.cpp
|
|
src/nfa/mcclellan.h
|
|
src/nfa/mcclellan_internal.h
|
|
src/nfa/mcclellancompile.cpp
|
|
src/nfa/mcclellancompile.h
|
|
src/nfa/mcclellancompile_util.cpp
|
|
src/nfa/mcclellancompile_util.h
|
|
src/nfa/mcsheng_compile.cpp
|
|
src/nfa/mcsheng_compile.h
|
|
src/nfa/limex_compile.cpp
|
|
src/nfa/limex_compile.h
|
|
src/nfa/limex_accel.h
|
|
src/nfa/limex_internal.h
|
|
src/nfa/mpv_internal.h
|
|
src/nfa/mpvcompile.cpp
|
|
src/nfa/mpvcompile.h
|
|
src/nfa/nfa_api.h
|
|
src/nfa/nfa_api_queue.h
|
|
src/nfa/nfa_api_util.h
|
|
src/nfa/nfa_build_util.cpp
|
|
src/nfa/nfa_build_util.h
|
|
src/nfa/nfa_internal.h
|
|
src/nfa/nfa_kind.h
|
|
src/nfa/rdfa.cpp
|
|
src/nfa/rdfa.h
|
|
src/nfa/rdfa_graph.cpp
|
|
src/nfa/rdfa_graph.h
|
|
src/nfa/rdfa_merge.cpp
|
|
src/nfa/rdfa_merge.h
|
|
src/nfa/repeat_internal.h
|
|
src/nfa/repeatcompile.cpp
|
|
src/nfa/repeatcompile.h
|
|
src/nfa/sheng_internal.h
|
|
src/nfa/shengcompile.cpp
|
|
src/nfa/shengcompile.h
|
|
src/nfa/shufticompile.cpp
|
|
src/nfa/shufticompile.h
|
|
src/nfa/tamaramacompile.cpp
|
|
src/nfa/tamaramacompile.h
|
|
src/nfa/trufflecompile.cpp
|
|
src/nfa/trufflecompile.h
|
|
src/nfa/vermicellicompile.cpp
|
|
src/nfa/vermicellicompile.h
|
|
src/nfagraph/ng.cpp
|
|
src/nfagraph/ng.h
|
|
src/nfagraph/ng_anchored_acyclic.cpp
|
|
src/nfagraph/ng_anchored_acyclic.h
|
|
src/nfagraph/ng_anchored_dots.cpp
|
|
src/nfagraph/ng_anchored_dots.h
|
|
src/nfagraph/ng_asserts.cpp
|
|
src/nfagraph/ng_asserts.h
|
|
src/nfagraph/ng_builder.cpp
|
|
src/nfagraph/ng_builder.h
|
|
src/nfagraph/ng_calc_components.cpp
|
|
src/nfagraph/ng_calc_components.h
|
|
src/nfagraph/ng_cyclic_redundancy.cpp
|
|
src/nfagraph/ng_cyclic_redundancy.h
|
|
src/nfagraph/ng_depth.cpp
|
|
src/nfagraph/ng_depth.h
|
|
src/nfagraph/ng_dominators.cpp
|
|
src/nfagraph/ng_dominators.h
|
|
src/nfagraph/ng_edge_redundancy.cpp
|
|
src/nfagraph/ng_edge_redundancy.h
|
|
src/nfagraph/ng_equivalence.cpp
|
|
src/nfagraph/ng_equivalence.h
|
|
src/nfagraph/ng_execute.cpp
|
|
src/nfagraph/ng_execute.h
|
|
src/nfagraph/ng_expr_info.cpp
|
|
src/nfagraph/ng_expr_info.h
|
|
src/nfagraph/ng_extparam.cpp
|
|
src/nfagraph/ng_extparam.h
|
|
src/nfagraph/ng_fixed_width.cpp
|
|
src/nfagraph/ng_fixed_width.h
|
|
src/nfagraph/ng_fuzzy.cpp
|
|
src/nfagraph/ng_fuzzy.h
|
|
src/nfagraph/ng_haig.cpp
|
|
src/nfagraph/ng_haig.h
|
|
src/nfagraph/ng_holder.cpp
|
|
src/nfagraph/ng_holder.h
|
|
src/nfagraph/ng_is_equal.cpp
|
|
src/nfagraph/ng_is_equal.h
|
|
src/nfagraph/ng_lbr.cpp
|
|
src/nfagraph/ng_lbr.h
|
|
src/nfagraph/ng_literal_analysis.cpp
|
|
src/nfagraph/ng_literal_analysis.h
|
|
src/nfagraph/ng_literal_component.cpp
|
|
src/nfagraph/ng_literal_component.h
|
|
src/nfagraph/ng_literal_decorated.cpp
|
|
src/nfagraph/ng_literal_decorated.h
|
|
src/nfagraph/ng_mcclellan.cpp
|
|
src/nfagraph/ng_mcclellan.h
|
|
src/nfagraph/ng_mcclellan_internal.h
|
|
src/nfagraph/ng_limex.cpp
|
|
src/nfagraph/ng_limex.h
|
|
src/nfagraph/ng_limex_accel.cpp
|
|
src/nfagraph/ng_limex_accel.h
|
|
src/nfagraph/ng_misc_opt.cpp
|
|
src/nfagraph/ng_misc_opt.h
|
|
src/nfagraph/ng_netflow.cpp
|
|
src/nfagraph/ng_netflow.h
|
|
src/nfagraph/ng_prefilter.cpp
|
|
src/nfagraph/ng_prefilter.h
|
|
src/nfagraph/ng_prune.cpp
|
|
src/nfagraph/ng_prune.h
|
|
src/nfagraph/ng_puff.cpp
|
|
src/nfagraph/ng_puff.h
|
|
src/nfagraph/ng_redundancy.cpp
|
|
src/nfagraph/ng_redundancy.h
|
|
src/nfagraph/ng_region.cpp
|
|
src/nfagraph/ng_region.h
|
|
src/nfagraph/ng_region_redundancy.cpp
|
|
src/nfagraph/ng_region_redundancy.h
|
|
src/nfagraph/ng_repeat.cpp
|
|
src/nfagraph/ng_repeat.h
|
|
src/nfagraph/ng_reports.cpp
|
|
src/nfagraph/ng_reports.h
|
|
src/nfagraph/ng_restructuring.cpp
|
|
src/nfagraph/ng_restructuring.h
|
|
src/nfagraph/ng_revacc.cpp
|
|
src/nfagraph/ng_revacc.h
|
|
src/nfagraph/ng_sep.cpp
|
|
src/nfagraph/ng_sep.h
|
|
src/nfagraph/ng_small_literal_set.cpp
|
|
src/nfagraph/ng_small_literal_set.h
|
|
src/nfagraph/ng_som.cpp
|
|
src/nfagraph/ng_som.h
|
|
src/nfagraph/ng_som_add_redundancy.cpp
|
|
src/nfagraph/ng_som_add_redundancy.h
|
|
src/nfagraph/ng_som_util.cpp
|
|
src/nfagraph/ng_som_util.h
|
|
src/nfagraph/ng_split.cpp
|
|
src/nfagraph/ng_split.h
|
|
src/nfagraph/ng_squash.cpp
|
|
src/nfagraph/ng_squash.h
|
|
src/nfagraph/ng_stop.cpp
|
|
src/nfagraph/ng_stop.h
|
|
src/nfagraph/ng_uncalc_components.cpp
|
|
src/nfagraph/ng_uncalc_components.h
|
|
src/nfagraph/ng_utf8.cpp
|
|
src/nfagraph/ng_utf8.h
|
|
src/nfagraph/ng_util.cpp
|
|
src/nfagraph/ng_util.h
|
|
src/nfagraph/ng_vacuous.cpp
|
|
src/nfagraph/ng_vacuous.h
|
|
src/nfagraph/ng_violet.cpp
|
|
src/nfagraph/ng_violet.h
|
|
src/nfagraph/ng_width.cpp
|
|
src/nfagraph/ng_width.h
|
|
src/parser/AsciiComponentClass.cpp
|
|
src/parser/AsciiComponentClass.h
|
|
src/parser/Component.cpp
|
|
src/parser/Component.h
|
|
src/parser/ComponentAlternation.cpp
|
|
src/parser/ComponentAlternation.h
|
|
src/parser/ComponentAssertion.cpp
|
|
src/parser/ComponentAssertion.h
|
|
src/parser/ComponentAtomicGroup.cpp
|
|
src/parser/ComponentAtomicGroup.h
|
|
src/parser/ComponentBackReference.cpp
|
|
src/parser/ComponentBackReference.h
|
|
src/parser/ComponentBoundary.cpp
|
|
src/parser/ComponentBoundary.h
|
|
src/parser/ComponentByte.cpp
|
|
src/parser/ComponentByte.h
|
|
src/parser/ComponentClass.cpp
|
|
src/parser/ComponentClass.h
|
|
src/parser/ComponentCondReference.cpp
|
|
src/parser/ComponentCondReference.h
|
|
src/parser/ComponentEUS.cpp
|
|
src/parser/ComponentEUS.h
|
|
src/parser/ComponentEmpty.cpp
|
|
src/parser/ComponentEmpty.h
|
|
src/parser/ComponentRepeat.cpp
|
|
src/parser/ComponentRepeat.h
|
|
src/parser/ComponentSequence.cpp
|
|
src/parser/ComponentSequence.h
|
|
src/parser/ComponentVisitor.cpp
|
|
src/parser/ComponentVisitor.h
|
|
src/parser/ComponentWordBoundary.cpp
|
|
src/parser/ComponentWordBoundary.h
|
|
src/parser/ConstComponentVisitor.cpp
|
|
src/parser/ConstComponentVisitor.h
|
|
src/parser/Parser.cpp
|
|
src/parser/Parser.h
|
|
src/parser/Utf8ComponentClass.cpp
|
|
src/parser/Utf8ComponentClass.h
|
|
src/parser/buildstate.cpp
|
|
src/parser/buildstate.h
|
|
src/parser/check_refs.cpp
|
|
src/parser/check_refs.h
|
|
src/parser/control_verbs.cpp
|
|
src/parser/control_verbs.h
|
|
src/parser/logical_combination.cpp
|
|
src/parser/logical_combination.h
|
|
src/parser/parse_error.cpp
|
|
src/parser/parse_error.h
|
|
src/parser/parser_util.cpp
|
|
src/parser/position.h
|
|
src/parser/position_info.h
|
|
src/parser/prefilter.cpp
|
|
src/parser/prefilter.h
|
|
src/parser/shortcut_literal.cpp
|
|
src/parser/shortcut_literal.h
|
|
src/parser/ucp_table.cpp
|
|
src/parser/ucp_table.h
|
|
src/parser/unsupported.cpp
|
|
src/parser/unsupported.h
|
|
src/parser/utf8_validate.h
|
|
src/parser/utf8_validate.cpp
|
|
src/smallwrite/smallwrite_build.cpp
|
|
src/smallwrite/smallwrite_build.h
|
|
src/smallwrite/smallwrite_internal.h
|
|
src/som/slot_manager.cpp
|
|
src/som/slot_manager.h
|
|
src/som/slot_manager_internal.h
|
|
src/som/som.h
|
|
src/som/som_operation.h
|
|
src/rose/rose_build.h
|
|
src/rose/rose_build_add.cpp
|
|
src/rose/rose_build_add_internal.h
|
|
src/rose/rose_build_add_mask.cpp
|
|
src/rose/rose_build_anchored.cpp
|
|
src/rose/rose_build_anchored.h
|
|
src/rose/rose_build_bytecode.cpp
|
|
src/rose/rose_build_castle.h
|
|
src/rose/rose_build_castle.cpp
|
|
src/rose/rose_build_compile.cpp
|
|
src/rose/rose_build_convert.cpp
|
|
src/rose/rose_build_convert.h
|
|
src/rose/rose_build_dedupe.cpp
|
|
src/rose/rose_build_engine_blob.cpp
|
|
src/rose/rose_build_engine_blob.h
|
|
src/rose/rose_build_exclusive.cpp
|
|
src/rose/rose_build_exclusive.h
|
|
src/rose/rose_build_groups.cpp
|
|
src/rose/rose_build_groups.h
|
|
src/rose/rose_build_impl.h
|
|
src/rose/rose_build_infix.cpp
|
|
src/rose/rose_build_infix.h
|
|
src/rose/rose_build_instructions.cpp
|
|
src/rose/rose_build_instructions.h
|
|
src/rose/rose_build_lit_accel.cpp
|
|
src/rose/rose_build_lit_accel.h
|
|
src/rose/rose_build_long_lit.cpp
|
|
src/rose/rose_build_long_lit.h
|
|
src/rose/rose_build_lookaround.cpp
|
|
src/rose/rose_build_lookaround.h
|
|
src/rose/rose_build_matchers.cpp
|
|
src/rose/rose_build_matchers.h
|
|
src/rose/rose_build_merge.cpp
|
|
src/rose/rose_build_merge.h
|
|
src/rose/rose_build_misc.cpp
|
|
src/rose/rose_build_misc.h
|
|
src/rose/rose_build_program.cpp
|
|
src/rose/rose_build_program.h
|
|
src/rose/rose_build_resources.h
|
|
src/rose/rose_build_role_aliasing.cpp
|
|
src/rose/rose_build_scatter.cpp
|
|
src/rose/rose_build_scatter.h
|
|
src/rose/rose_build_util.h
|
|
src/rose/rose_build_width.cpp
|
|
src/rose/rose_build_width.h
|
|
src/rose/rose_graph.h
|
|
src/rose/rose_in_graph.h
|
|
src/rose/rose_in_util.cpp
|
|
src/rose/rose_in_util.h
|
|
src/util/accel_scheme.h
|
|
src/util/alloc.cpp
|
|
src/util/alloc.h
|
|
src/util/bitfield.h
|
|
src/util/boundary_reports.h
|
|
src/util/charreach.cpp
|
|
src/util/charreach.h
|
|
src/util/charreach_util.h
|
|
src/util/clique.cpp
|
|
src/util/clique.h
|
|
src/util/compare.h
|
|
src/util/compile_context.cpp
|
|
src/util/compile_context.h
|
|
src/util/compile_error.cpp
|
|
src/util/compile_error.h
|
|
src/util/container.h
|
|
src/util/depth.cpp
|
|
src/util/depth.h
|
|
src/util/determinise.h
|
|
src/util/dump_mask.cpp
|
|
src/util/dump_mask.h
|
|
src/util/fatbit_build.cpp
|
|
src/util/fatbit_build.h
|
|
src/util/flat_containers.h
|
|
src/util/graph.h
|
|
src/util/graph_range.h
|
|
src/util/graph_small_color_map.h
|
|
src/util/graph_undirected.h
|
|
src/util/hash.h
|
|
src/util/hash_dynamic_bitset.h
|
|
src/util/insertion_ordered.h
|
|
src/util/math.h
|
|
src/util/multibit_build.cpp
|
|
src/util/multibit_build.h
|
|
src/util/noncopyable.h
|
|
src/util/operators.h
|
|
src/util/order_check.h
|
|
src/util/partial_store.h
|
|
src/util/partitioned_set.h
|
|
src/util/popcount.h
|
|
src/util/queue_index_factory.h
|
|
src/util/report.h
|
|
src/util/report_manager.cpp
|
|
src/util/report_manager.h
|
|
src/util/simd_utils.h
|
|
src/util/small_vector.h
|
|
src/util/target_info.cpp
|
|
src/util/target_info.h
|
|
src/util/ue2_graph.h
|
|
src/util/ue2string.cpp
|
|
src/util/ue2string.h
|
|
src/util/unaligned.h
|
|
src/util/unicode_def.h
|
|
src/util/unicode_set.h
|
|
src/util/uniform_ops.h
|
|
src/util/unordered.h
|
|
src/util/verify_types.h
|
|
)
|
|
|
|
set(hs_dump_SRCS
|
|
src/scratch_dump.cpp
|
|
src/scratch_dump.h
|
|
src/fdr/fdr_dump.cpp
|
|
src/hwlm/hwlm_dump.cpp
|
|
src/hwlm/hwlm_dump.h
|
|
src/nfa/accel_dump.cpp
|
|
src/nfa/accel_dump.h
|
|
src/nfa/castle_dump.cpp
|
|
src/nfa/castle_dump.h
|
|
src/nfagraph/ng_dump.cpp
|
|
src/nfagraph/ng_dump.h
|
|
src/nfa/goughcompile_dump.cpp
|
|
src/nfa/goughcompile_dump.h
|
|
src/nfa/goughdump.cpp
|
|
src/nfa/goughdump.h
|
|
src/nfa/lbr_dump.cpp
|
|
src/nfa/limex_dump.cpp
|
|
src/nfa/mcclellandump.cpp
|
|
src/nfa/mcclellandump.h
|
|
src/nfa/mcsheng_dump.cpp
|
|
src/nfa/mcsheng_dump.h
|
|
src/nfa/mpv_dump.cpp
|
|
src/nfa/nfa_dump_api.h
|
|
src/nfa/nfa_dump_dispatch.cpp
|
|
src/nfa/nfa_dump_internal.cpp
|
|
src/nfa/nfa_dump_internal.h
|
|
src/nfa/shengdump.cpp
|
|
src/nfa/shengdump.h
|
|
src/nfa/tamarama_dump.cpp
|
|
src/nfa/tamarama_dump.h
|
|
src/parser/dump.cpp
|
|
src/parser/dump.h
|
|
src/parser/position_dump.h
|
|
src/smallwrite/smallwrite_dump.cpp
|
|
src/smallwrite/smallwrite_dump.h
|
|
src/som/slot_manager_dump.cpp
|
|
src/som/slot_manager_dump.h
|
|
src/rose/rose_build_dump.cpp
|
|
src/rose/rose_build_dump.h
|
|
src/rose/rose_in_dump.cpp
|
|
src/rose/rose_in_dump.h
|
|
src/util/dump_charclass.cpp
|
|
src/util/dump_charclass.h
|
|
src/util/dump_util.cpp
|
|
src/util/dump_util.h
|
|
)
|
|
|
|
if (DUMP_SUPPORT)
|
|
set(hs_compile_SRCS ${hs_compile_SRCS} ${hs_dump_SRCS})
|
|
endif()
|
|
|
|
# we group things by sublibraries, specifying shared and static and then
|
|
# choose which ones to build
|
|
|
|
set (LIB_VERSION ${HS_VERSION})
|
|
set (LIB_SOVERSION ${HS_MAJOR_VERSION})
|
|
|
|
if (NOT FAT_RUNTIME)
|
|
|
|
set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_common_SRCS})
|
|
|
|
if (BUILD_AVX2)
|
|
set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
|
|
endif()
|
|
|
|
if (BUILD_STATIC_LIBS)
|
|
add_library(hs_exec OBJECT ${hs_exec_SRCS})
|
|
|
|
add_library(hs_runtime STATIC src/hs_version.c src/hs_valid_platform.c $<TARGET_OBJECTS:hs_exec>)
|
|
set_target_properties(hs_runtime PROPERTIES LINKER_LANGUAGE C)
|
|
|
|
add_library(hs_compile OBJECT ${hs_compile_SRCS})
|
|
add_library(hs STATIC
|
|
src/hs_version.c
|
|
src/hs_valid_platform.c
|
|
$<TARGET_OBJECTS:hs_exec>
|
|
$<TARGET_OBJECTS:hs_compile>)
|
|
endif (BUILD_STATIC_LIBS)
|
|
|
|
if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS)
|
|
add_library(hs_exec_shared OBJECT ${hs_exec_SRCS})
|
|
set_target_properties(hs_exec_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
|
|
add_library(hs_compile_shared OBJECT ${hs_compile_SRCS})
|
|
set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
|
|
endif()
|
|
|
|
else (FAT_RUNTIME)
|
|
|
|
set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh")
|
|
if (NOT BUILD_AVX512)
|
|
set (DISPATCHER_DEFINE "-DDISABLE_AVX512_DISPATCH")
|
|
endif (NOT BUILD_AVX512)
|
|
if (NOT BUILD_AVX512VBMI)
|
|
set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -DDISABLE_AVX512VBMI_DISPATCH")
|
|
endif (NOT BUILD_AVX512VBMI)
|
|
set_source_files_properties(src/dispatcher.c PROPERTIES
|
|
COMPILE_FLAGS "-Wno-unused-parameter -Wno-unused-function ${DISPATCHER_DEFINE}")
|
|
|
|
if (BUILD_STATIC_LIBS)
|
|
add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS})
|
|
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_core2>)
|
|
set_target_properties(hs_exec_core2 PROPERTIES
|
|
COMPILE_FLAGS "-march=core2 -msse4.2"
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
|
|
add_library(hs_exec_corei7 OBJECT ${hs_exec_SRCS})
|
|
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_corei7>)
|
|
set_target_properties(hs_exec_corei7 PROPERTIES
|
|
COMPILE_FLAGS "-march=corei7 -msse4.2"
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} corei7 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
|
|
if (BUILD_AVX2)
|
|
add_library(hs_exec_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
|
|
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_avx2>)
|
|
set_target_properties(hs_exec_avx2 PROPERTIES
|
|
COMPILE_FLAGS "-march=core-avx2 -mavx2"
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
endif (BUILD_AVX2)
|
|
if (BUILD_AVX512)
|
|
add_library(hs_exec_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
|
|
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_avx512>)
|
|
set_target_properties(hs_exec_avx512 PROPERTIES
|
|
COMPILE_FLAGS "${SKYLAKE_FLAG}"
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
endif (BUILD_AVX512)
|
|
if (BUILD_AVX512VBMI)
|
|
add_library(hs_exec_avx512vbmi OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
|
|
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_avx512vbmi>)
|
|
set_target_properties(hs_exec_avx512vbmi PROPERTIES
|
|
COMPILE_FLAGS "${ICELAKE_FLAG}"
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512vbmi ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
endif (BUILD_AVX512VBMI)
|
|
|
|
add_library(hs_exec_common OBJECT
|
|
${hs_exec_common_SRCS}
|
|
src/dispatcher.c
|
|
)
|
|
|
|
# hs_version.c is added explicitly to avoid some build systems that refuse to
|
|
# create a lib without any src (I'm looking at you Xcode)
|
|
|
|
add_library(hs_runtime STATIC src/hs_version.c
|
|
$<TARGET_OBJECTS:hs_exec_common>
|
|
${RUNTIME_LIBS})
|
|
set_target_properties(hs_runtime PROPERTIES LINKER_LANGUAGE C)
|
|
add_library(hs_compile OBJECT ${hs_compile_SRCS})
|
|
|
|
# we want the static lib for testing
|
|
add_library(hs STATIC src/hs_version.c src/hs_valid_platform.c
|
|
$<TARGET_OBJECTS:hs_compile>
|
|
$<TARGET_OBJECTS:hs_exec_common>
|
|
${RUNTIME_LIBS})
|
|
|
|
endif (BUILD_STATIC_LIBS)
|
|
|
|
if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS)
|
|
# build shared libs
|
|
add_library(hs_compile_shared OBJECT ${hs_compile_SRCS})
|
|
set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
|
|
add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS})
|
|
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_core2>)
|
|
set_target_properties(hs_exec_shared_core2 PROPERTIES
|
|
COMPILE_FLAGS "-march=core2 -msse4.2"
|
|
POSITION_INDEPENDENT_CODE TRUE
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
add_library(hs_exec_shared_corei7 OBJECT ${hs_exec_SRCS})
|
|
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_corei7>)
|
|
set_target_properties(hs_exec_shared_corei7 PROPERTIES
|
|
COMPILE_FLAGS "-march=corei7 -msse4.2"
|
|
POSITION_INDEPENDENT_CODE TRUE
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} corei7 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
|
|
if (BUILD_AVX2)
|
|
add_library(hs_exec_shared_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
|
|
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_avx2>)
|
|
set_target_properties(hs_exec_shared_avx2 PROPERTIES
|
|
COMPILE_FLAGS "-march=core-avx2 -mavx2"
|
|
POSITION_INDEPENDENT_CODE TRUE
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
endif (BUILD_AVX2)
|
|
if (BUILD_AVX512)
|
|
add_library(hs_exec_shared_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
|
|
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_avx512>)
|
|
set_target_properties(hs_exec_shared_avx512 PROPERTIES
|
|
COMPILE_FLAGS "${SKYLAKE_FLAG}"
|
|
POSITION_INDEPENDENT_CODE TRUE
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512 ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
endif (BUILD_AVX512)
|
|
if (BUILD_AVX512VBMI)
|
|
add_library(hs_exec_shared_avx512vbmi OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
|
|
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_avx512vbmi>)
|
|
set_target_properties(hs_exec_shared_avx512vbmi PROPERTIES
|
|
COMPILE_FLAGS "${ICELAKE_FLAG}"
|
|
POSITION_INDEPENDENT_CODE TRUE
|
|
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512vbmi ${CMAKE_MODULE_PATH}/keep.syms.in"
|
|
)
|
|
endif (BUILD_AVX512VBMI)
|
|
add_library(hs_exec_common_shared OBJECT
|
|
${hs_exec_common_SRCS}
|
|
src/dispatcher.c
|
|
)
|
|
set_target_properties(hs_exec_common_shared PROPERTIES
|
|
OUTPUT_NAME hs_exec_common
|
|
POSITION_INDEPENDENT_CODE TRUE)
|
|
endif() # SHARED
|
|
|
|
|
|
endif (NOT FAT_RUNTIME)
|
|
|
|
if (NOT BUILD_SHARED_LIBS)
|
|
install(TARGETS hs_runtime DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
endif()
|
|
|
|
if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS)
|
|
if (NOT FAT_RUNTIME)
|
|
add_library(hs_runtime_shared SHARED src/hs_version.c
|
|
src/hs_valid_platform.c $<TARGET_OBJECTS:hs_exec_shared>
|
|
hs_runtime.def)
|
|
else()
|
|
add_library(hs_runtime_shared SHARED src/hs_version.c
|
|
src/hs_valid_platform.c
|
|
$<TARGET_OBJECTS:hs_exec_common_shared>
|
|
${RUNTIME_SHLIBS}
|
|
hs_runtime.def)
|
|
endif()
|
|
set_target_properties(hs_runtime_shared PROPERTIES
|
|
VERSION ${LIB_VERSION}
|
|
SOVERSION ${LIB_SOVERSION}
|
|
OUTPUT_NAME hs_runtime
|
|
MACOSX_RPATH ON
|
|
LINKER_LANGUAGE C)
|
|
install(TARGETS hs_runtime_shared
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
endif()
|
|
|
|
if (BUILD_STATIC_LIBS)
|
|
add_dependencies(hs ragel_Parser)
|
|
endif ()
|
|
|
|
if (NOT BUILD_SHARED_LIBS)
|
|
install(TARGETS hs DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
endif()
|
|
|
|
if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS)
|
|
set(hs_shared_SRCS
|
|
src/hs_version.c
|
|
src/hs_valid_platform.c
|
|
$<TARGET_OBJECTS:hs_compile_shared>)
|
|
|
|
if (XCODE)
|
|
# force this lib to use C++ linkage
|
|
add_custom_command(OUTPUT empty.cxx
|
|
COMMAND ${CMAKE_COMMAND} -E touch empty.cxx)
|
|
set (hs_shared_SRCS ${hs_shared_SRCS} empty.cxx)
|
|
endif (XCODE)
|
|
|
|
if (NOT FAT_RUNTIME)
|
|
set(hs_shared_SRCS
|
|
${hs_shared_SRCS}
|
|
$<TARGET_OBJECTS:hs_exec_shared>)
|
|
else ()
|
|
set(hs_shared_SRCS
|
|
${hs_shared_SRCS}
|
|
$<TARGET_OBJECTS:hs_exec_common_shared>
|
|
${RUNTIME_SHLIBS})
|
|
endif ()
|
|
|
|
add_library(hs_shared SHARED ${hs_shared_SRCS} hs.def)
|
|
|
|
add_dependencies(hs_shared ragel_Parser)
|
|
set_target_properties(hs_shared PROPERTIES
|
|
OUTPUT_NAME hs
|
|
VERSION ${LIB_VERSION}
|
|
SOVERSION ${LIB_SOVERSION}
|
|
MACOSX_RPATH ON)
|
|
|
|
install(TARGETS hs_shared
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
endif()
|
|
|
|
# used by tools and other targets
|
|
if (NOT BUILD_STATIC_LIBS)
|
|
# use shared lib without having to change all the targets
|
|
add_library(hs ALIAS hs_shared)
|
|
endif ()
|
|
|
|
option(BUILD_EXAMPLES "Build Hyperscan example code (default TRUE)" TRUE)
|
|
if(BUILD_EXAMPLES)
|
|
add_subdirectory(examples)
|
|
endif()
|
|
|
|
option(BUILD_BENCHMARKS "Build benchmarks (default TRUE)" TRUE)
|
|
if(BUILD_BENCHMARKS)
|
|
add_subdirectory(benchmarks)
|
|
endif()
|