Adapt cross compile

This commit is contained in:
alvin1221
2021-11-16 16:14:23 +08:00
committed by Parker Liu
parent af565723a9
commit 438b8c2ff7
4 changed files with 314 additions and 100 deletions
+20 -8
View File
@@ -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()
+57
View File
@@ -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})
+49 -3
View File
@@ -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})
+188 -89
View File
@@ -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