From 08a9e0ad39f49846bf9552abd67728a00f419789 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 2 Feb 2022 07:35:39 -0500 Subject: [PATCH] add cross compile helpers and update/add toolchains --- cmake/StaticBuild.cmake | 15 ++++++++- contrib/cross.sh | 45 +++++++++++++++++++++++++++ contrib/cross/aarch64.toolchain.cmake | 3 +- contrib/cross/armhf.toolchain.cmake | 2 +- contrib/cross/mips.toolchain.cmake | 13 ++++++++ contrib/cross/mips64.toolchain.cmake | 13 ++++++++ contrib/cross/mipsel.toolchain.cmake | 13 ++++++++ readme.md | 25 +++++++++++++-- 8 files changed, 123 insertions(+), 6 deletions(-) create mode 100755 contrib/cross.sh create mode 100644 contrib/cross/mips.toolchain.cmake create mode 100644 contrib/cross/mips64.toolchain.cmake create mode 100644 contrib/cross/mipsel.toolchain.cmake diff --git a/cmake/StaticBuild.cmake b/cmake/StaticBuild.cmake index 9dfd958ce..7e63d55bd 100644 --- a/cmake/StaticBuild.cmake +++ b/cmake/StaticBuild.cmake @@ -234,6 +234,7 @@ add_static_target(zlib zlib_external libz.a) set(openssl_system_env "") +set(openssl_configure_command ./config) if(CMAKE_CROSSCOMPILING) if(ARCH_TRIPLET STREQUAL x86_64-w64-mingw32) set(openssl_system_env SYSTEM=MINGW64 RC=${CMAKE_RC_COMPILER} AR=${ARCH_TRIPLET}-ar RANLIB=${ARCH_TRIPLET}-ranlib) @@ -242,13 +243,25 @@ if(CMAKE_CROSSCOMPILING) elseif(ANDROID) set(openssl_system_env SYSTEM=Linux MACHINE=${android_machine} LD=${deps_ld} RANLIB=${deps_ranlib} AR=${deps_ar}) set(openssl_extra_opts no-asm) + elseif(ARCH_TRIPLET STREQUAL mips64-linux-gnuabi64) + set(openssl_system_env SYSTEM=Linux MACHINE=mips64) + set(openssl_configure_command ./Configure linux64-mips64) + elseif(ARCH_TRIPLET STREQUAL mips-linux-gnu) + set(openssl_system_env SYSTEM=Linux MACHINE=mips) + elseif(ARCH_TRIPLET STREQUAL mipsel-linux-gnu) + set(openssl_system_env SYSTEM=Linux MACHINE=mipsel) + elseif(ARCH_TRIPLET STREQUAL aarch64-linux-gnu) + # cross compile arm64 + set(openssl_system_env SYSTEM=Linux MACHINE=aarch64) endif() elseif(CMAKE_C_FLAGS MATCHES "-march=armv7") # Help openssl figure out that we're building from armv7 even if on armv8 hardware: set(openssl_system_env SYSTEM=Linux MACHINE=armv7) endif() + + build_external(openssl - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env CC=${deps_cc} ${openssl_system_env} ./config + CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env CC=${deps_cc} ${openssl_system_env} ${openssl_configure_command} --prefix=${DEPS_DESTDIR} ${openssl_extra_opts} no-shared no-capieng no-dso no-dtls1 no-ec_nistp_64_gcc_128 no-gost no-heartbeats no-md2 no-rc5 no-rdrand no-rfc3779 no-sctp no-ssl-trace no-ssl2 no-ssl3 no-static-engine no-tests no-weak-ssl-ciphers no-zlib no-zlib-dynamic "CFLAGS=${deps_CFLAGS}" diff --git a/contrib/cross.sh b/contrib/cross.sh new file mode 100755 index 000000000..abdb13c34 --- /dev/null +++ b/contrib/cross.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# +# helper script for me for when i cross compile +# t. jeff +# +die() { + echo $@ + exit 1 +} + +root="$(readlink -e $(dirname $0)/../)" +cd $root +set -e +set +x +test $# = 0 && die no targets provided +mkdir -p build-cross +echo "all: $@" > build-cross/Makefile +for targ in $@ ; do + mkdir -p build-$targ + cd build-$targ + cmake \ + -G 'Unix Makefiles' \ + -DCMAKE_EXE_LINKER_FLAGS=-fstack-protector \ + -DCMAKE_CXX_FLAGS=-fdiagnostics-color=always\ + -DCMAKE_TOOLCHAIN_FILE=../contrib/cross/$targ.toolchain.cmake\ + -DBUILD_STATIC_DEPS=ON \ + -DBUILD_SHARED_LIBS=OFF \ + -DBUILD_TESTING=OFF \ + -DBUILD_LIBLOKINET=OFF \ + -DWITH_TESTS=OFF \ + -DNATIVE_BUILD=OFF \ + -DSTATIC_LINK=ON \ + -DWITH_SYSTEMD=OFF \ + -DFORCE_OXENMQ_SUBMODULE=ON \ + -DSUBMODULE_CHECK=OFF \ + -DWITH_LTO=OFF \ + -DWITH_BOOTSTRAP=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + .. + cd - + echo -ne "$targ:\n\t\$(MAKE) -C $root/build-$targ\n" >> build-cross/Makefile + +done + +make -j${JOBS:-$(nproc)} -C build-cross diff --git a/contrib/cross/aarch64.toolchain.cmake b/contrib/cross/aarch64.toolchain.cmake index 03357daf1..ada0993c3 100644 --- a/contrib/cross/aarch64.toolchain.cmake +++ b/contrib/cross/aarch64.toolchain.cmake @@ -1,6 +1,6 @@ set(CMAKE_SYSTEM_NAME Linux) set(TOOLCHAIN_PREFIX aarch64-linux-gnu) -#set(TOOLCHAIN_SUFFIX) +set(TOOLCHAIN_SUFFIX) set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) @@ -10,3 +10,4 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc${TOOLCHAIN_SUFFIX}) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++${TOOLCHAIN_SUFFIX}) +set(ARCH_TRIPLET ${TOOLCHAIN_PREFIX}) diff --git a/contrib/cross/armhf.toolchain.cmake b/contrib/cross/armhf.toolchain.cmake index a61a270bb..aba32f0f2 100644 --- a/contrib/cross/armhf.toolchain.cmake +++ b/contrib/cross/armhf.toolchain.cmake @@ -1,6 +1,6 @@ set(CMAKE_SYSTEM_NAME Linux) set(TOOLCHAIN_PREFIX arm-linux-gnueabihf) -set(TOOLCHAIN_SUFFIX -8) +set(TOOLCHAIN_SUFFIX) set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) diff --git a/contrib/cross/mips.toolchain.cmake b/contrib/cross/mips.toolchain.cmake new file mode 100644 index 000000000..758fa4fb2 --- /dev/null +++ b/contrib/cross/mips.toolchain.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(TOOLCHAIN_PREFIX mips-linux-gnu) +set(TOOLCHAIN_SUFFIX) + +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_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_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc${TOOLCHAIN_SUFFIX}) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++${TOOLCHAIN_SUFFIX}) +set(ARCH_TRIPLET ${TOOLCHAIN_PREFIX}) diff --git a/contrib/cross/mips64.toolchain.cmake b/contrib/cross/mips64.toolchain.cmake new file mode 100644 index 000000000..e71867b68 --- /dev/null +++ b/contrib/cross/mips64.toolchain.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(TOOLCHAIN_PREFIX mips64-linux-gnuabi64) +set(TOOLCHAIN_SUFFIX) + +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_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_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc${TOOLCHAIN_SUFFIX}) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++${TOOLCHAIN_SUFFIX}) +set(ARCH_TRIPLET ${TOOLCHAIN_PREFIX}) diff --git a/contrib/cross/mipsel.toolchain.cmake b/contrib/cross/mipsel.toolchain.cmake new file mode 100644 index 000000000..142f96337 --- /dev/null +++ b/contrib/cross/mipsel.toolchain.cmake @@ -0,0 +1,13 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(TOOLCHAIN_PREFIX mipsel-linux-gnu) +set(TOOLCHAIN_SUFFIX) + +set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_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_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc${TOOLCHAIN_SUFFIX}) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++${TOOLCHAIN_SUFFIX}) +set(ARCH_TRIPLET ${TOOLCHAIN_PREFIX}) diff --git a/readme.md b/readme.md index f8df94448..e2ce163f7 100644 --- a/readme.md +++ b/readme.md @@ -59,9 +59,28 @@ If you want to build from source: $ make -j$(nproc) $ sudo make install +#### Cross Compile + +supported cross targets: + +* aarch64 +* armhf +* mips +* mips64 +* mipsel +* ppc64le + +install the toolchain for `$arch` this example is `aarch64` + + $ sudo apt install g{cc,++}-aarch64-linux-gnu + +build 1 or many cross targets: + + $ ./contrib/cross.sh arch_1 arch_2 ... arch_n + ### macOS -Lokinet ~~is~~ will be available on the Apple App store. +Lokinet ~~is~~ will be available on the Apple App store. Source code compilation of Lokinet by end users is not supported or permitted by apple on their platforms, see [this](contrib/macos/README.txt) for more information. If you find this disagreeable consider using a platform that permits compiling from source. @@ -112,11 +131,11 @@ lokinet`, etc. ### Running on Linux (without debs) -**DO NOT RUN AS ROOT**, run as normal user. +**DO NOT RUN AS ROOT**, run as normal user. set up the initial configs: - $ lokinet -g + $ lokinet -g $ lokinet-bootstrap after you create default config, run it: