diff --git a/config/functions b/config/functions index a6e5e594e2..836bd23ba9 100644 --- a/config/functions +++ b/config/functions @@ -416,6 +416,12 @@ setup_toolchain() { export _python_sysroot="$SYSROOT_PREFIX" export _python_prefix=/usr export _python_exec_prefix=/usr + + # rust + export CARGO_TARGET_DIR="${PKG_BUILD}/.${TARGET_NAME}/target" + export CARGO_HOME="$(get_build_dir rust)/cargo_home" + export RUST_TARGET_PATH="${TOOLCHAIN}/lib/rustlib/" + ;; host:*|bootstrap:*) export DESTIMAGE="host" @@ -467,6 +473,23 @@ setup_toolchain() { export _python_sysroot="$TOOLCHAIN" export _python_prefix=/ export _python_exec_prefix=/ + + # rust + case "${MACHINE_HARDWARE_CPU}" in + "arm") + RUST_HOST="arm-unknown-linux-gnueabihf" + ;; + "aarch64") + RUST_HOST="aarch64-unknown-linux-gnu" + ;; + "x86_64") + RUST_HOST="x86_64-unknown-linux-gnu" + ;; + esac + + export CARGO_TARGET_DIR="${PKG_BUILD}/.${RUST_HOST}/target" + export CARGO_HOME="$(get_build_dir rust)/cargo_home" + export RUST_TARGET_PATH="${TOOLCHAIN}/lib/rustlib/" ;; esac } diff --git a/packages/rust/rust/package.mk b/packages/rust/rust/package.mk new file mode 100644 index 0000000000..f03faec883 --- /dev/null +++ b/packages/rust/rust/package.mk @@ -0,0 +1,126 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="rust" +PKG_VERSION="1.60.0" +PKG_SHA256="20ca826d1cf674daf8e22c4f8c4b9743af07973211c839b85839742314c838b7" +PKG_LICENSE="MIT" +PKG_SITE="https://www.rust-lang.org" +PKG_URL="https://static.rust-lang.org/dist/rustc-${PKG_VERSION}-src.tar.gz" +PKG_DEPENDS_HOST="toolchain llvm:host" +PKG_DEPENDS_UNPACK="rustc-snapshot rust-std-snapshot cargo-snapshot" +PKG_LONGDESC="A systems programming language that prevents segfaults, and guarantees thread safety." +PKG_TOOLCHAIN="manual" + +pre_configure_host() { + "$(get_build_dir rustc-snapshot)/install.sh" --prefix="${PKG_BUILD}/rust-snapshot" --disable-ldconfig + "$(get_build_dir rust-std-snapshot)/install.sh" --prefix="${PKG_BUILD}/rust-snapshot" --disable-ldconfig + "$(get_build_dir cargo-snapshot)/install.sh" --prefix="${PKG_BUILD}/rust-snapshot" --disable-ldconfig +} + +configure_host() { + + mkdir -p ${PKG_BUILD}/targets + + case "${TARGET_ARCH}" in + "arm") + # the arm target is special because we specify the subarch. ie armv8a + cp -a ${PKG_DIR}/targets/arm-libreelec-linux-gnueabihf.json ${PKG_BUILD}/targets/${TARGET_NAME}.json + ;; + "aarch64"|"x86_64") + cp -a ${PKG_DIR}/targets/${TARGET_NAME}.json ${PKG_BUILD}/targets/${TARGET_NAME}.json + ;; + esac + + cat > ${PKG_BUILD}/config.toml < ${CARGO_HOME}/config << END +[target.${TARGET_NAME}] +linker = "${TARGET_PREFIX}gcc" + +[target.${RUST_HOST}] +linker = "${CC}" +rustflags = ["-C", "link-arg=-Wl,-rpath,${TOOLCHAIN}/lib"] + +[build] +target-dir = "${PKG_BUILD}/target" + +[term] +progress.when = 'always' +progress.width = 80 + +END + +} + +make_host() { + cd ${PKG_BUILD} + + unset CFLAGS + unset CXXFLAGS + unset CPPFLAGS + unset LDFLAGS + + export RUST_TARGET_PATH="${PKG_BUILD}/targets/" + + python3 src/bootstrap/bootstrap.py -j ${CONCURRENCY_MAKE_LEVEL} build --stage 2 --verbose +} + +makeinstall_host() { + mkdir -p ${TOOLCHAIN}/bin + cp -a build/${RUST_HOST}/stage2/bin/* ${TOOLCHAIN}/bin + + mkdir -p ${TOOLCHAIN}/lib/rustlib + cp -a build/${RUST_HOST}/stage2/lib/* ${TOOLCHAIN}/lib + + cp -a ${PKG_BUILD}/targets/*.json ${TOOLCHAIN}/lib/rustlib/ +} diff --git a/packages/rust/rust/targets/aarch64-libreelec-linux-gnu.json b/packages/rust/rust/targets/aarch64-libreelec-linux-gnu.json new file mode 100644 index 0000000000..5dba97d832 --- /dev/null +++ b/packages/rust/rust/targets/aarch64-libreelec-linux-gnu.json @@ -0,0 +1,32 @@ +{ + "arch": "aarch64", + "crt-static-respected": true, + "data-layout": "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", + "dynamic-linking": true, + "env": "gnu", + "executables": true, + "features": "+outline-atomics", + "has-rpath": true, + "has-thread-local": true, + "is-builtin": false, + "llvm-target": "aarch64-unknown-linux-gnu", + "max-atomic-width": 128, + "os": "linux", + "position-independent-executables": true, + "relro-level": "full", + "supported-sanitizers": [ + "address", + "cfi", + "leak", + "memory", + "memtag", + "thread", + "hwaddress" + ], + "target-family": [ + "unix" + ], + "target-mcount": "\u0001_mcount", + "target-pointer-width": "64" +} + diff --git a/packages/rust/rust/targets/arm-libreelec-linux-gnueabihf.json b/packages/rust/rust/targets/arm-libreelec-linux-gnueabihf.json new file mode 100644 index 0000000000..351e10419e --- /dev/null +++ b/packages/rust/rust/targets/arm-libreelec-linux-gnueabihf.json @@ -0,0 +1,23 @@ +{ + "abi": "eabihf", + "arch": "arm", + "crt-static-respected": true, + "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64", + "dynamic-linking": true, + "env": "gnu", + "executables": true, + "features": "+strict-align,+v6,+vfp2,-d32", + "has-rpath": true, + "has-thread-local": true, + "is-builtin": false, + "llvm-target": "arm-unknown-linux-gnueabihf", + "max-atomic-width": 64, + "os": "linux", + "position-independent-executables": true, + "relro-level": "full", + "target-family": [ + "unix" + ], + "target-mcount": "\u0001__gnu_mcount_nc", + "target-pointer-width": "32" +} diff --git a/packages/rust/rust/targets/x86_64-libreelec-linux-gnu.json b/packages/rust/rust/targets/x86_64-libreelec-linux-gnu.json new file mode 100644 index 0000000000..f30f36ddcf --- /dev/null +++ b/packages/rust/rust/targets/x86_64-libreelec-linux-gnu.json @@ -0,0 +1,38 @@ +{ + "arch": "x86_64", + "cpu": "x86-64", + "crt-static-respected": true, + "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", + "dynamic-linking": true, + "env": "gnu", + "executables": true, + "has-rpath": true, + "has-thread-local": true, + "is-builtin": false, + "llvm-target": "x86_64-unknown-linux-gnu", + "max-atomic-width": 64, + "os": "linux", + "position-independent-executables": true, + "pre-link-args": { + "gcc": [ + "-m64" + ] + }, + "relro-level": "full", + "stack-probes": { + "kind": "call" + }, + "static-position-independent-executables": true, + "supported-sanitizers": [ + "address", + "cfi", + "leak", + "memory", + "thread" + ], + "target-family": [ + "unix" + ], + "target-pointer-width": "64" +} +