message(SEND_ERROR "Something went wrong determining gcc tune: -mtune=${GNUCC_ARCH} not valid")
endif()
set(TUNE_FLAG ${GNUCC_ARCH})
- else ()
+ elseif (NOT TUNE_FLAG)
set(TUNE_FLAG native)
endif()
endif()
if (NOT CMAKE_C_FLAGS MATCHES .*march.* AND NOT CMAKE_C_FLAGS MATCHES .*mtune.*)
- set(ARCH_C_FLAGS "-march=native -mtune=${TUNE_FLAG}")
+ 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=native -mtune=${TUNE_FLAG}")
+ set(ARCH_CXX_FLAGS "-march=${GNUCC_ARCH} -mtune=${TUNE_FLAG}")
endif()
if(CMAKE_COMPILER_IS_GNUCC)
endif()
if (NOT FAT_RUNTIME)
- message(STATUS "Building for current host CPU: ${ARCH_C_FLAGS}")
+ if (CROSS_COMPILE_AARCH64)
+ message(STATUS "Building for target CPU: ${ARCH_C_FLAGS}")
+ else()
+ message(STATUS "Building for current host CPU: ${ARCH_C_FLAGS}")
+ endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ARCH_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARCH_CXX_FLAGS}")
else()
Vectorscan is licensed under the BSD License.
Copyright (c) 2020, VectorCamp PC
+Copyright (c) 2021, Arm Limited
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Vectorscan is typically used in a DPI library stack, just like Hyperscan.
+# Cross Compiling for AArch64
+
+- To cross compile for AArch64, first adjust the variables set in cmake/setenv-arm64-cross.sh.
+ - `export CROSS=<arm-cross-compiler-dir>/bin/aarch64-linux-gnu-`
+ - `export CROSS_SYS=<arm-cross-compiler-system-dir>`
+ - `export BOOST_PATH=<boost-source-dir>`
+- Set the environment variables:
+ - `source cmake/setenv-arm64-cross.sh`
+- Configure Vectorscan:
+ - `mkdir <build-dir-name>`
+ - `cd <build-dir>`
+ - `cmake -DCROSS_COMPILE_AARCH64=1 <hyperscan-source-dir> -DCMAKE_TOOLCHAIN_FILE=<hyperscan-source-dir>/cmake/arm64-cross.cmake`
+- Build Vectorscan:
+ - `make -jT` where T is the number of threads used to compile.
+ - `cmake --build . -- -j T` can also be used instead of make.
+
# Documentation
Information on building the Hyperscan library and using its API is available in
--- /dev/null
+set(CMAKE_SYSTEM_NAME "Linux")
+set(CMAKE_SYSTEM_PROCESSOR "aarch64")
+
+# specify the cross compiler
+set(CMAKE_C_COMPILER "$ENV{CROSS}gcc")
+set(CMAKE_CXX_COMPILER "$ENV{CROSS}g++")
+# where is the target environment
+set(CMAKE_SYSROOT $ENV{CROSS_SYS})
+
+set(Boost_INCLUDE_DIR $ENV{BOOST_PATH})
+
+# for libraries and headers in the target directories
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+
+set(THREADS_PTHREAD_ARG "2" CACHE STRING "Result from TRY_RUN" FORCE)
+
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -falign-functions=16 -falign-jumps=16 -falign-labels=16 -falign-loops=16" CACHE STRING "" FORCE)
+
+set(GNUCC_ARCH "armv8.2-a+fp16+simd+rcpc+dotprod+crypto")
+set(TUNE_FLAG "neoverse-n1")
\ No newline at end of file
/* "Define if building for AARCH64" */
#cmakedefine ARCH_AARCH64
+/* "Define if cross compiling for AARCH64" */
+#cmakedefine CROSS_COMPILE_AARCH64
+
/* internal build, switch on dump support. */
#cmakedefine DUMP_SUPPORT
# determine the target arch
-# really only interested in the preprocessor here
-CHECK_C_SOURCE_COMPILES("#if !(defined(__x86_64__) || defined(_M_X64))\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_X86_64)
+if (CROSS_COMPILE_AARCH64)
+ set(ARCH_AARCH64 TRUE)
+ set(ARCH_64_BIT TRUE)
+ message(STATUS "Cross compiling for aarch64")
+else()
+ # really only interested in the preprocessor here
+ CHECK_C_SOURCE_COMPILES("#if !(defined(__x86_64__) || defined(_M_X64))\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_X86_64)
-CHECK_C_SOURCE_COMPILES("#if !(defined(__i386__) || defined(_M_IX86))\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_IA32)
+ CHECK_C_SOURCE_COMPILES("#if !(defined(__i386__) || defined(_M_IX86))\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_IA32)
-CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_A64)\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_AARCH64)
-CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_ARM)\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_ARM32)
+ CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_A64)\n#error not 64bit\n#endif\nint main(void) { return 0; }" ARCH_AARCH64)
+ CHECK_C_SOURCE_COMPILES("#if !defined(__ARM_ARCH_ISA_ARM)\n#error not 32bit\n#endif\nint main(void) { return 0; }" ARCH_ARM32)
-if (ARCH_X86_64 OR ARCH_AARCH64)
- set(ARCH_64_BIT TRUE)
-else()
- set(ARCH_32_BIT TRUE)
-endif()
+ if (ARCH_X86_64 OR ARCH_AARCH64)
+ set(ARCH_64_BIT TRUE)
+ else()
+ set(ARCH_32_BIT TRUE)
+ endif()
+endif()
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+export BOOST_VERSION=1_57_0
+export BOOST_DOT_VERSION=${BOOST_VERSION//_/.}
+export CROSS=<arm-cross-compiler-dir>/bin/aarch64-linux-gnu-
+export CROSS_SYS=<arm-cross-compiler-system-dir>
+
+# if [ ! -d "boost_$BOOST_VERSION" ];
+# then
+# wget -O boost_$BOOST_VERSION.tar.gz https://sourceforge.net/projects/boost/files/boost/$BOOST_DOT_VERSION/boost_$BOOST_VERSION.tar.gz/download
+# tar xf boost_$BOOST_VERSION.tar.gz
+# fi
+if [ ! -d "pcre-8.41" ];
+then
+ wget -O pcre-8.41.tar.bz2 https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.bz2
+ tar xf pcre-8.41.tar.bz2
+ export PCRE_SOURCE=1
+fi
+
+export BOOST_PATH=<boost-source-dir>
\ No newline at end of file