diff --git a/CMakeLists.txt b/CMakeLists.txt index 38f701c5..5adad370 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ enable_language(C) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Debug") + set(CMAKE_BUILD_TYPE "Release") endif() set(CMAKE_CXX_STANDARD 17) @@ -47,13 +47,20 @@ configure_file(extern/vector/vector.h ${CMAKE_SOURCE_DIR}/include/vector.h # Call this from your own project's makefile. -if(APPLE) -include_directories(/usr/local/include /usr/local/opt/openssl/include) -link_directories(/usr/local/lib /usr/local/opt/openssl/lib) +if(NOT CMAKE_STAGING_PREFIX) + if(APPLE) + include_directories(/usr/local/include /usr/local/opt/openssl/include) + link_directories(/usr/local/lib /usr/local/opt/openssl/lib) + else() + link_directories(/usr/local/lib) + endif() else() -link_directories(/usr/local/lib) + set(CMAKE_PREFIX_PATH ${CMAKE_STAGING_PREFIX}) + include_directories(${CMAKE_STAGING_PREFIX}/openssl/include) + link_directories(${CMAKE_STAGING_PREFIX}/openssl/lib) endif() + find_package(nng CONFIG REQUIRED) find_package(Threads) @@ -95,6 +102,7 @@ set(NEURON_INCLUDE_DIRECTORIES include src plugins) add_executable(neuron) target_sources(neuron PRIVATE ${NEURON_SOURCES}) target_include_directories(neuron PRIVATE ${NEURON_INCLUDE_DIRECTORIES}) +target_include_directories(neuron PUBLIC ${CMAKE_STAGING_PREFIX}) if(APPLE) target_link_libraries(neuron nng::nng jansson yaml neuron-base) else() @@ -128,6 +136,7 @@ add_library(neuron-base SHARED) target_sources(neuron-base PRIVATE ${NEURON_BASE_SOURCES} ${NEURON_SRC_PARSE} ${NEURON_SRC_SCHEMA}) target_include_directories(neuron-base PRIVATE ${NEURON_BASE_INCLUDE_DIRECTORIES}) +target_include_directories(neuron-base PRIVATE ${CMAKE_STAGING_PREFIX}) target_link_libraries(neuron-base vector-static csptr jansson crypto yaml ${CMAKE_THREAD_LIBS_INIT}) @@ -141,6 +150,9 @@ add_subdirectory(plugins/modbus) add_subdirectory(plugins/mqtt) add_subdirectory(plugins/opcua) -# define for tests -enable_testing() -add_subdirectory(tests) +if(CMAKE_BUILD_TYPE MATCHES "Debug") + # define for tests + enable_testing() + add_subdirectory(tests) +endif() + diff --git a/cmake/aarch64-linux-gnu.cmake b/cmake/aarch64-linux-gnu.cmake new file mode 100644 index 00000000..871ce613 --- /dev/null +++ b/cmake/aarch64-linux-gnu.cmake @@ -0,0 +1,57 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +set(triple aarch64-linux-gnu) + +set(CMAKE_STAGING_PREFIX /opt/externs/libs/${triple}) + +if(NOT CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX .cross/${triple}) +endif() + +set(CMAKE_STAGING_PREFIX /opt/externs/libs/${triple}) +set(CMAKE_PREFIX_PATH ${CMAKE_STAGING_PREFIX}) + +set(CMAKE_C_COMPILER ${triple}-gcc) +set(CMAKE_C_FLAGS + "-O3 -fPIC" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_DEBUG + "${CMAKE_C_FLAGS} -g -Wall" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_MINSIZEREL + "${CMAKE_C_FLAGS} -Os -DNDEBUG" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_RELEASE + "${CMAKE_C_FLAGS} -O4 -DNDEBUG" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_RELWITHDEBINFO + "${CMAKE_C_FLAGS} -O2 -g" + CACHE INTERNAL "") + +# set(CMAKE_CXX_COMPILER ${triple}-g++) set(CMAKE_CXX_FLAGS "-O3 -fPIC" CACHE +# INTERNAL "") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g -Wall" CACHE +# INTERNAL "") set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} -Os -DNDEBUG" +# CACHE INTERNAL "") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O4 +# -DNDEBUG" CACHE INTERNAL "") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO +# "${CMAKE_CXX_FLAGS} -O2 -g" CACHE INTERNAL "") +# include_directories(/opt/externs/libs/${triple}/include) +# include_directories(/opt/externs/libs/${triple}/openssl/include) + +# set(CMAKE_C_COMPILER ${triple}-gcc) set(CMAKE_CXX_COMPILER ${triple}-g++) + +set(CMAKE_AR ${triple}-ar) +set(CMAKE_AR ${triple}-ar) +set(CMAKE_LINKER ${triple}-ld) +set(CMAKE_NM ${triple}-nm) +set(CMAKE_OBJDUMP ${triple}-objdump) +set(CMAKE_RANLIB ${triple}-ranlib) + +include_directories(SYSTEM ${CMAKE_STAGING_PREFIX}/include) +include_directories(SYSTEM ${CMAKE_STAGING_PREFIX}/openssl/include) +set(CMAKE_FIND_ROOT_PATH ${CMAKE_STAGING_PREFIX}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_SYSROOT ${CMAKE_STAGING_PREFIX}) +link_directories(${CMAKE_STAGING_PREFIX}) \ No newline at end of file diff --git a/cmake/arm-linux-gnueabihf.cmake b/cmake/arm-linux-gnueabihf.cmake index 1976b56e..2c641333 100644 --- a/cmake/arm-linux-gnueabihf.cmake +++ b/cmake/arm-linux-gnueabihf.cmake @@ -1,10 +1,56 @@ set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR armv7l) set(triple arm-linux-gnueabihf) -set(CMAKE_STAGING_PREFIX /opt/cross/${triple}) +if(NOT CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX .cross/${triple}) +endif() + +set(CMAKE_STAGING_PREFIX /opt/externs/libs/${triple}) +set(CMAKE_PREFIX_PATH ${CMAKE_STAGING_PREFIX}) set(CMAKE_C_COMPILER ${triple}-gcc) -set(CMAKE_CXX_COMPILER ${triple}-g++) +set(CMAKE_C_FLAGS + "-O3 -fPIC" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_DEBUG + "${CMAKE_C_FLAGS} -g -Wall" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_MINSIZEREL + "${CMAKE_C_FLAGS} -Os -DNDEBUG" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_RELEASE + "${CMAKE_C_FLAGS} -O4 -DNDEBUG" + CACHE INTERNAL "") +set(CMAKE_C_FLAGS_RELWITHDEBINFO + "${CMAKE_C_FLAGS} -O2 -g" + CACHE INTERNAL "") +# set(CMAKE_CXX_COMPILER ${triple}-g++) set(CMAKE_CXX_FLAGS "-O3 -fPIC" CACHE +# INTERNAL "") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -g -Wall" CACHE +# INTERNAL "") set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} -Os -DNDEBUG" +# CACHE INTERNAL "") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O4 +# -DNDEBUG" CACHE INTERNAL "") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO +# "${CMAKE_CXX_FLAGS} -O2 -g" CACHE INTERNAL "") +# include_directories(/opt/externs/libs/${triple}/include) +# include_directories(/opt/externs/libs/${triple}/openssl/include) + +# set(CMAKE_C_COMPILER ${triple}-gcc) set(CMAKE_CXX_COMPILER ${triple}-g++) + +set(CMAKE_AR ${triple}-ar) +set(CMAKE_AR ${triple}-ar) +set(CMAKE_LINKER ${triple}-ld) +set(CMAKE_NM ${triple}-nm) +set(CMAKE_OBJDUMP ${triple}-objdump) +set(CMAKE_RANLIB ${triple}-ranlib) + +include_directories(SYSTEM ${CMAKE_STAGING_PREFIX}/include) +include_directories(SYSTEM ${CMAKE_STAGING_PREFIX}/openssl/include) +set(CMAKE_FIND_ROOT_PATH ${CMAKE_STAGING_PREFIX}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_SYSROOT ${CMAKE_STAGING_PREFIX}) +link_directories(${CMAKE_STAGING_PREFIX}) diff --git a/install-libs.sh b/install-libs.sh index f08194e2..b87d97b6 100755 --- a/install-libs.sh +++ b/install-libs.sh @@ -1,44 +1,58 @@ #!/bin/bash -system=`uname` +system=$(uname) echo "System: $system" -if [ $system == 'Linux' ];then - if [ `whoami` != "root" ];then +if [ $system == 'Linux' ]; then + if [ $(whoami) != "root" ]; then echo "Please use root access" - exit 2 + exit 2 fi fi -lib_list=(nng jansson jwt MQTT-C openssl gtest open62541 yaml) +lib_list=(zlib openssl nng jansson jwt MQTT-C gtest open62541 yaml) list_str="" -for var in ${lib_list[*]};do +for var in ${lib_list[*]}; do list_str+=$var" " done +arch=x86_64 +is_build_all=FALSE +pkgname= +is_cross=FALSE +compiler_opt= +install_opt= +cross_compiler_prefix= +ssl_lib_flag= +git_url_prefix="https://github.com/" + function usage() { echo "Usage: $0 " echo " -a Build all dependencies" - echo " -i Specify installation options (opts: $list_str)" + echo " -n Specify dependence name (opts: $list_str)" + echo " -c Cross compiler mode (default: FALSE)" + echo " -p Cross compiler prefix (opts: x86_64-linux-gnu, arm-linux-gnueabihf, aarch64-linux-gnu, ...)" + echo " -s System architecture (only for openssl, opts: x86_64, armv4, aarch64, ...) " + echo " -r Use github repository SSH url (default: HTTPS url)" } -if [ $# -eq 0 ];then -usage -exit +if [ $# -eq 0 ]; then + usage + exit fi # nng -function build_nng() -{ +function build_nng() { echo "Building nng (v1.5.2)" - if [ ! -d nng ];then - git clone -b v1.5.2 https://github.com/nanomsg/nng.git + if [ ! -d nng ]; then + git clone -b v1.5.2 ${git_url_prefix}nanomsg/nng.git fi cd nng + rm -rf build mkdir build cd build - cmake -G Ninja -DBUILD_SHARED_LIBS=1 .. + cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DNNG_TESTS=OFF ${compiler_opt} ${install_opt} .. ninja ninja install @@ -47,17 +61,18 @@ function build_nng() } # jansson -function build_jansson() -{ +function build_jansson() { echo "Building jansson" - if [ ! -d jansson ];then - git clone https://github.com/akheron/jansson.git + if [ ! -d jansson ]; then + git clone ${git_url_prefix}akheron/jansson.git fi cd jansson rm -rf build mkdir build cd build - cmake -G Ninja -DJANSSON_BUILD_DOCS=OFF .. + cmake -G Ninja -DJANSSON_BUILD_DOCS=OFF \ + -DJANSSON_EXAMPLES=OFF \ + ${compiler_opt} ${install_opt} .. ninja ninja install @@ -66,17 +81,16 @@ function build_jansson() } # jwt -function build_jwt() -{ +function build_jwt() { echo "Building libjwt" - if [ ! -d libjwt ];then - git clone https://github.com/benmcollins/libjwt.git + if [ ! -d libjwt ]; then + git clone ${git_url_prefix}benmcollins/libjwt.git fi cd libjwt rm -rf build mkdir build cd build - cmake -G Ninja -DBUILD_EXAMPLES=OFF $ssl_lib_flag .. + cmake -G Ninja -DBUILD_EXAMPLES=OFF ${ssl_lib_flag} ${compiler_opt} ${install_opt} .. ninja ninja install @@ -85,86 +99,140 @@ function build_jwt() } # MQTT-C -function build_MQTT-C() -{ +function build_MQTT-C() { echo "Building MQTT-C (1.1.5)" - if [ ! -d MQTT-C ];then - git clone -b 1.1.5 https://github.com/LiamBindle/MQTT-C.git + if [ ! -d MQTT-C ]; then + git clone -b 1.1.5 ${git_url_prefix}neugates/MQTT-C.git fi cd MQTT-C rm -rf build mkdir build cd build - cmake -G Ninja -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DMQTT_C_OpenSSL_SUPPORT=ON .. + cmake -G Ninja -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DMQTT_C_OpenSSL_SUPPORT=ON \ + -DMQTT_C_EXAMPLES=OFF \ + ${ssl_lib_flag} ${compiler_opt} ${install_opt} .. ninja ninja install echo "Leaving MQTT-C " cd ../../ } -function build_yaml() -{ - git clone https://github.com/yaml/libyaml.git +function build_yaml() { + echo "Building yaml" + git clone ${git_url_prefix}yaml/libyaml.git cd libyaml rm -rf build - mkdir build && cd build && cmake DBUILD_SHARED_LIBS=1 .. && make - make install + mkdir build + cd build + cmake -G Ninja -DBUILD_SHARED_LIBS=ON ${compiler_opt} ${install_opt} .. + ninja + ninja install + echo "Leaving yaml" cd ../../ } -function install_tool() -{ +function install_tool() { ubuntu=$1 centos=$2 darwin=$3 - - case "$system" in - "Linux") release=`awk -F= '/^NAME/{print $2}' /etc/os-release` - case "$release" in - "\"Ubuntu\"") - apt-get -y install $ubuntu - ;; - "\"CentOS Linux\"") - yum install -y $centos - ;; - esac - ;; - "Darwin") - brew install $darwin - ;; + case "$system" in + "Linux") + release=$(awk -F= '/^NAME/{print $2}' /etc/os-release) + case "$release" in + "\"Ubuntu\"") + apt-get -y install $ubuntu + ;; + "\"CentOS Linux\"") + yum install -y $centos + ;; + esac + ;; + + "Darwin") + brew install $darwin + ;; *) - echo "Unsupported System!" - echo "Please install library manually!" - ;; + echo "Unsupported System!" + echo "Please install library manually!" + ;; esac } -function build_openssl() -{ - echo "Installing openssl" - install_tool libssl-dev openssl-devel openssl +function build_zlib() { + echo "Installing zlib" + if [ ! -d zlib ]; then + git clone ${git_url_prefix}madler/zlib.git + fi + + cd zlib + rm -rf build + mkdir build + cd build + cmake -G Ninja ${compiler_opt} ${install_opt} .. + ninja + ninja install + echo "Leaving zlib " + cd ../../ } -function build_gtest() -{ +function build_openssl() { + echo "Installing openssl (1.1.1)" + if [ $is_cross == "TRUE" ]; then + if [ ! -n "$cross_compiler_prefix" ]; then + echo "Error: cross_compiler_prefix must be set" + usage + return + fi + + if [ ! -d openssl ]; then + git clone -b OpenSSL_1_1_1-stable ${git_url_prefix}openssl/openssl.git + fi + + cd openssl + make clean + mkdir -p ${install_dir}/openssl/ssl + ./Configure ${system,}-${arch} no-asm shared \ + --prefix=${install_dir}/openssl \ + --openssldir=${install_dir}/openssl/ssl \ + --cross-compile-prefix=${cross_compiler_prefix}- \ + --with-zlib-include=${install_dir}/zlib/include \ + --with-zlib-lib=${install_dir}/zlib/lib + make + make install + cd ../ + + else + install_tool libssl-dev openssl-devel openssl + fi +} + +function build_gtest() { echo "Install gtest" - install_tool libgtest-dev gtest-devel googletest + if [ $is_cross != "TRUE" ]; then + install_tool libgtest-dev gtest-devel googletest + fi } function build_open62541() { echo "Install open62541 (v1.2.2)" - if [ ! -d open62541 ];then - git clone -b v1.2.2 https://github.com/open62541/open62541.git + if [ ! -d open62541 ]; then + git clone -b v1.2.2 ${git_url_prefix}open62541/open62541.git fi - cd open62541 + cd open62541 rm -rf build mkdir build cd build - cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DUA_ENABLE_AMALGAMATION=ON -DUA_ENABLE_ENCRYPTION=ON -DUA_ENABLE_ENCRYPTION_OPENSSL=ON .. + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DUA_ENABLE_AMALGAMATION=ON \ + -DUA_ENABLE_ENCRYPTION=ON \ + -DUA_ENABLE_ENCRYPTION_OPENSSL=ON \ + ${ssl_lib_flag} ${compiler_opt} ${install_opt} .. ninja ninja install @@ -172,37 +240,33 @@ function build_open62541() { cd ../../ } -current=`pwd` +current=$(pwd) externs="/opt/externs" -if [ ! -d $externs ];then +if [ ! -d $externs ]; then mkdir $externs fi - -echo "Entering $externs" cd $externs -ssl_lib_flag="" -case "$system" in - "Linux") ssl_lib_flag="" - ;; - "Darwin") ssl_lib_flag="-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl" - ;; - *) - ;; -esac - -while getopts "a-:i:h" OPT; do +while getopts "h:c-:r-:a-:n:p:s:" OPT; do case ${OPT} in - a) - echo "Build ${list_str}" - for var in ${lib_list[*]};do - build_$var - done + c) + is_cross=TRUE ;; - i) + s) + arch=$OPTARG + ;; + p) + cross_compiler_prefix=$OPTARG + ;; + r) + git_url_prefix="git@github.com:" + ;; + a) + is_build_all=TRUE + ;; + n) pkgname=$OPTARG - build_$pkgname ;; h) usage @@ -215,6 +279,41 @@ while getopts "a-:i:h" OPT; do esac done +if [ $is_cross == "TRUE" ]; then + install_dir=${externs}/libs/${cross_compiler_prefix} + compiler_opt="-DCMAKE_C_COMPILER=${cross_compiler_prefix}-gcc \ + -DCMAKE_STAGING_PREFIX=${install_dir} -DCMAKE_PREFIX_PATH=${install_dir}" + install_opt="-DCMAKE_INSTALL_PREFIX=${install_dir}" + ssl_lib_flag="-DOPENSSL_ROOT_DIR=${install_dir}/openssl \ + -DOPENSSL_INCLUDE_DIR==${install_dir}/openssl/include \ + -DOPENSSL_LIBRARIES='${install_dir}/openssl/lib/libssl.so ${install_dir}/openssl/lib/libcrypto.so'" + + echo "Entering $externs" +else + case "$system" in + "Linux") + ssl_lib_flag="" + ;; + "Darwin") + ssl_lib_flag="-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl" + ;; + *) ;; + + esac +fi + +mkdir -p ${install_dir} + +if [ $is_build_all == "TRUE" ]; then + echo "Build ${list_str}" + for var in ${lib_list[*]}; do + install_opt=${install_opt}/$var + build_$var + done +else + install_opt=${install_opt}/$pkgname + build_$pkgname +fi + echo "Leaving $externs" cd $current -