diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b001e94..e32be7b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,7 +209,7 @@ else() 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() @@ -252,11 +252,11 @@ else() 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) @@ -460,7 +460,11 @@ endif() 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() diff --git a/LICENSE b/LICENSE index 3a32e281..8324617b 100644 --- a/LICENSE +++ b/LICENSE @@ -5,6 +5,7 @@ Copyright (c) 2015, Intel Corporation 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: diff --git a/README.md b/README.md index 4a6e6fc0..e780238f 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,22 @@ matching of regular expressions across streams of data. 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=/bin/aarch64-linux-gnu-` + - `export CROSS_SYS=` + - `export BOOST_PATH=` +- Set the environment variables: + - `source cmake/setenv-arm64-cross.sh` +- Configure Vectorscan: + - `mkdir ` + - `cd ` + - `cmake -DCROSS_COMPILE_AARCH64=1 -DCMAKE_TOOLCHAIN_FILE=/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 diff --git a/cmake/arm64-cross.cmake b/cmake/arm64-cross.cmake new file mode 100644 index 00000000..b95ca33b --- /dev/null +++ b/cmake/arm64-cross.cmake @@ -0,0 +1,22 @@ +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 diff --git a/cmake/config.h.in b/cmake/config.h.in index 0de8cca2..17c1e729 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -21,6 +21,9 @@ /* "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 diff --git a/cmake/platform.cmake b/cmake/platform.cmake index 479b3680..295775df 100644 --- a/cmake/platform.cmake +++ b/cmake/platform.cmake @@ -1,15 +1,21 @@ # 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) - -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) - -if (ARCH_X86_64 OR ARCH_AARCH64) +if (CROSS_COMPILE_AARCH64) + set(ARCH_AARCH64 TRUE) set(ARCH_64_BIT TRUE) + message(STATUS "Cross compiling for aarch64") else() - set(ARCH_32_BIT TRUE) -endif() + # 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(__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() +endif() \ No newline at end of file diff --git a/cmake/setenv-arm64-cross.sh b/cmake/setenv-arm64-cross.sh new file mode 100644 index 00000000..4858da1e --- /dev/null +++ b/cmake/setenv-arm64-cross.sh @@ -0,0 +1,19 @@ +#!/bin/bash +export BOOST_VERSION=1_57_0 +export BOOST_DOT_VERSION=${BOOST_VERSION//_/.} +export CROSS=/bin/aarch64-linux-gnu- +export CROSS_SYS= + +# 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= \ No newline at end of file