diff --git a/config/functions b/config/functions index f98e76739c..631ee2cf0a 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 } @@ -482,7 +505,7 @@ cpp = '$CXX' ar = '$AR' strip = '$STRIP' pkgconfig = '$PKG_CONFIG' -llvm-config = '$TOOLCHAIN/bin/llvm-config-host' +llvm-config = '$TOOLCHAIN/bin/llvm-config' libgcrypt-config = '$SYSROOT_PREFIX/usr/bin/libgcrypt-config' [build_machine] @@ -520,7 +543,7 @@ cpp = '$TARGET_CXX' ar = '$TARGET_AR' strip = '$TARGET_STRIP' pkgconfig = '$PKG_CONFIG' -llvm-config = '$TOOLCHAIN/bin/llvm-config-host' +llvm-config = '$SYSROOT_PREFIX/usr/bin/llvm-config' libgcrypt-config = '$SYSROOT_PREFIX/usr/bin/libgcrypt-config' [build_machine] diff --git a/packages/addons/addon-depends/librespot-depends/rust/package.mk b/packages/addons/addon-depends/librespot-depends/rust/package.mk deleted file mode 100644 index 5d61b90ebb..0000000000 --- a/packages/addons/addon-depends/librespot-depends/rust/package.mk +++ /dev/null @@ -1,63 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="rust" -PKG_VERSION="1.60.0" -PKG_LICENSE="MIT" -PKG_SITE="https://www.rust-lang.org" -PKG_DEPENDS_TARGET="toolchain rustup.rs" -PKG_LONGDESC="A systems programming language that prevents segfaults, and guarantees thread safety." -PKG_TOOLCHAIN="manual" - -make_target() { - export CARGO_HOME="${PKG_BUILD}/cargo" - export RUSTUP_HOME="${CARGO_HOME}" - export PATH="${CARGO_HOME}/bin:${PATH}" - case "${TARGET_ARCH}" in - aarch64) - RUST_TARGET_TRIPLE="aarch64-unknown-linux-gnu" - ;; - arm) - RUST_TARGET_TRIPLE="arm-unknown-linux-gnueabihf" - ;; - x86_64) - RUST_TARGET_TRIPLE="x86_64-unknown-linux-gnu" - ;; - esac - "$(get_build_dir rustup.rs)/rustup-init.sh" \ - --default-toolchain none \ - --no-modify-path \ - --profile minimal \ - --target "${RUST_TARGET_TRIPLE}" \ - -y - cargo/bin/rustup toolchain install ${PKG_VERSION} --allow-downgrade --profile minimal --component clippy - cargo/bin/rustup target add ${RUST_TARGET_TRIPLE} - - cat <"${CARGO_HOME}/config" -[build] -target = "${RUST_TARGET_TRIPLE}" - -[target.${RUST_TARGET_TRIPLE}] -ar = "${AR}" -linker = "${CC}" -EOF - - cat <"${CARGO_HOME}/env" -export CARGO_HOME="${CARGO_HOME}" -export CARGO_TARGET_DIR="\${PKG_BUILD}/.\${TARGET_NAME}" -if [ "${HOSTTYPE}" = "${TARGET_ARCH}" ]; then - # Until target-applies-to-host is incorporated into stable this - # option is required for a matching host-target triple to be compiled - # by the cross compiler. Read more here. - # https://doc.rust-lang.org/cargo/reference/unstable.html#target-applies-to-host - export __CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS="nightly" - export CARGO_UNSTABLE_TARGET_APPLIES_TO_HOST="true" - export CARGO_TARGET_APPLIES_TO_HOST="false" -fi -export PATH="${CARGO_HOME}/bin:${PATH}" -export PKG_CONFIG_ALLOW_CROSS="1" -export PKG_CONFIG_PATH="${PKG_CONFIG_LIBDIR}" -export RUSTUP_HOME="${CARGO_HOME}" -unset CFLAGS -EOF -} diff --git a/packages/addons/service/librespot/package.mk b/packages/addons/service/librespot/package.mk index 21cdd15594..2becc5343f 100644 --- a/packages/addons/service/librespot/package.mk +++ b/packages/addons/service/librespot/package.mk @@ -10,7 +10,7 @@ PKG_ARCH="any" PKG_LICENSE="MIT" PKG_SITE="https://github.com/librespot-org/librespot/" PKG_URL="https://github.com/librespot-org/librespot/archive/v${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain alsa-lib avahi pulseaudio rust" +PKG_DEPENDS_TARGET="toolchain alsa-lib avahi pulseaudio cargo:host" PKG_SECTION="service" PKG_SHORTDESC="Librespot: play Spotify through Kodi using a Spotify app as a remote" PKG_LONGDESC="Librespot (${PKG_VERSION_DATE}) lets you play Spotify through Kodi using a Spotify app as a remote." @@ -23,17 +23,18 @@ PKG_ADDON_REQUIRES="script.module.requests:0.0.0" PKG_MAINTAINER="Anton Voyl (awiouy)" make_target() { - . $(get_build_dir rust)/cargo/env cargo build \ + --target ${TARGET_NAME} \ --release \ --no-default-features \ --features "alsa-backend pulseaudio-backend with-dns-sd" - ${STRIP} ${PKG_BUILD}/.${TARGET_NAME}/*/release/librespot + + ${STRIP} ${PKG_BUILD}/.${TARGET_NAME}/target/${TARGET_NAME}/release/librespot } addon() { mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin - cp ${PKG_BUILD}/.${TARGET_NAME}/*/release/librespot \ + cp ${PKG_BUILD}/.${TARGET_NAME}/target/${TARGET_NAME}/release/librespot \ ${ADDON_BUILD}/${PKG_ADDON_ID}/bin mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/lib diff --git a/packages/lang/llvm/package.mk b/packages/lang/llvm/package.mk index dcf752f53c..7082dcd9da 100644 --- a/packages/lang/llvm/package.mk +++ b/packages/lang/llvm/package.mk @@ -5,7 +5,6 @@ PKG_NAME="llvm" PKG_VERSION="13.0.1" PKG_SHA256="ec6b80d82c384acad2dc192903a6cf2cdbaffb889b84bfb98da9d71e630fc834" -PKG_ARCH="x86_64" PKG_LICENSE="Apache-2.0" PKG_SITE="http://llvm.org/" PKG_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${PKG_VERSION}/llvm-${PKG_VERSION}.src.tar.xz" @@ -28,11 +27,10 @@ PKG_CMAKE_OPTS_COMMON="-DLLVM_INCLUDE_TOOLS=ON \ -DLLVM_ENABLE_SPHINX=OFF \ -DLLVM_ENABLE_OCAMLDOC=OFF \ -DLLVM_ENABLE_BINDINGS=OFF \ - -DLLVM_TARGETS_TO_BUILD=AMDGPU \ -DLLVM_ENABLE_TERMINFO=OFF \ -DLLVM_ENABLE_ASSERTIONS=OFF \ -DLLVM_ENABLE_WERROR=OFF \ - -DLLVM_ENABLE_ZLIB=ON \ + -DLLVM_ENABLE_ZLIB=OFF \ -DLLVM_ENABLE_LIBXML2=OFF \ -DLLVM_BUILD_LLVM_DYLIB=ON \ -DLLVM_LINK_LLVM_DYLIB=ON \ @@ -43,27 +41,43 @@ PKG_CMAKE_OPTS_COMMON="-DLLVM_INCLUDE_TOOLS=ON \ -DLLVM_ENABLE_Z3_SOLVER=OFF" pre_configure_host() { - CXXFLAGS+=" -DLLVM_CONFIG_EXEC_PREFIX=\\\"${SYSROOT_PREFIX}/usr\\\"" - PKG_CMAKE_OPTS_HOST="${PKG_CMAKE_OPTS_COMMON}" + case "${TARGET_ARCH}" in + "arm") + LLVM_BUILD_TARGETS="X86\;ARM" + ;; + "aarch64") + LLVM_BUILD_TARGETS="X86\;AArch64" + ;; + "x86_64") + LLVM_BUILD_TARGETS="X86\;AMDGPU" + ;; + esac + + PKG_CMAKE_OPTS_HOST="${PKG_CMAKE_OPTS_COMMON} \ + -DLLVM_TARGETS_TO_BUILD=${LLVM_BUILD_TARGETS}" +} + +post_make_host() { + ninja ${NINJA_OPTS} llvm-config llvm-tblgen +} + +post_makeinstall_host() { + mkdir -p ${TOOLCHAIN}/bin + cp -a bin/llvm-config ${TOOLCHAIN}/bin + cp -a bin/llvm-tblgen ${TOOLCHAIN}/bin } pre_configure_target() { PKG_CMAKE_OPTS_TARGET="${PKG_CMAKE_OPTS_COMMON} \ + -DLLVM_TARGETS_TO_BUILD=AMDGPU \ -DLLVM_TARGET_ARCH="${TARGET_ARCH}" \ -DLLVM_TABLEGEN=${TOOLCHAIN}/bin/llvm-tblgen" } -make_host() { - ninja ${NINJA_OPTS} llvm-config llvm-tblgen -} - -makeinstall_host() { - cp -a lib/libLLVM-*.so ${TOOLCHAIN}/lib - cp -a bin/llvm-config ${TOOLCHAIN}/bin/llvm-config-host - cp -a bin/llvm-tblgen ${TOOLCHAIN}/bin -} - post_makeinstall_target() { + mkdir -p ${SYSROOT_PREFIX}/usr/bin + cp -a ${TOOLCHAIN}/bin/llvm-config ${SYSROOT_PREFIX}/usr/bin + rm -rf ${INSTALL}/usr/bin rm -rf ${INSTALL}/usr/lib/LLVMHello.so rm -rf ${INSTALL}/usr/lib/libLTO.so diff --git a/packages/lang/llvm/patches/llvm-config.patch b/packages/lang/llvm/patches/llvm-config.patch deleted file mode 100644 index b50c1a963e..0000000000 --- a/packages/lang/llvm/patches/llvm-config.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/tools/llvm-config/llvm-config.cpp 2019-12-15 20:54:21.898634608 +0100 -+++ b/tools/llvm-config/llvm-config.cpp 2019-12-15 20:56:12.280223943 +0100 -@@ -285,6 +285,10 @@ - CurrentExecPrefix = - sys::path::parent_path(sys::path::parent_path(CurrentPath)).str(); - -+#ifdef LLVM_CONFIG_EXEC_PREFIX -+ CurrentExecPrefix = LLVM_CONFIG_EXEC_PREFIX; -+#endif -+ - // Check to see if we are inside a development tree by comparing to possible - // locations (prefix style or CMake style). - if (sys::fs::equivalent(CurrentExecPrefix, LLVM_OBJ_ROOT)) { diff --git a/packages/rust/cargo-snapshot/package.mk b/packages/rust/cargo-snapshot/package.mk new file mode 100644 index 0000000000..44955fd868 --- /dev/null +++ b/packages/rust/cargo-snapshot/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="cargo-snapshot" +PKG_VERSION="$(get_pkg_version rust)" +PKG_SHA256="48edb2eb51d7c56ef9a3130f0b331e83f139559161f6f93b9588d28cf72610f3" +PKG_LICENSE="MIT" +PKG_SITE="https://www.rust-lang.org" +PKG_URL="https://static.rust-lang.org/dist/cargo-${PKG_VERSION}-${MACHINE_HARDWARE_CPU}-unknown-linux-gnu.tar.xz" +PKG_LONGDESC="cargo bootstrap package" +PKG_TOOLCHAIN="manual" diff --git a/packages/rust/cargo/package.mk b/packages/rust/cargo/package.mk new file mode 100644 index 0000000000..0065116aee --- /dev/null +++ b/packages/rust/cargo/package.mk @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="cargo" +PKG_VERSION="$(get_pkg_version rust)" +PKG_LICENSE="MIT" +PKG_SITE="https://www.rust-lang.org" +PKG_DEPENDS_HOST="rust:host" +PKG_DEPENDS_UNPACK="cargo-snapshot rust" +PKG_LONGDESC="Cargo is the Rust package manager" +PKG_TOOLCHAIN="manual" + +pre_configure_host() { + "$(get_build_dir cargo-snapshot)/install.sh" --prefix="${PKG_BUILD}/cargo-snapshot" --disable-ldconfig +} + +configure_host() { + cd ${PKG_BUILD} +} + +make_host() { + cd ${PKG_BUILD} + + export RUSTC_BOOTSTRAP="1" + + ./cargo-snapshot/bin/cargo build -v --target ${RUST_HOST} --release --manifest-path="$(get_build_dir rust)/src/tools/cargo/Cargo.toml" +} + +makeinstall_host() { + mkdir -p ${TOOLCHAIN}/bin + cp -a ${PKG_BUILD}/.${RUST_HOST}/target/${RUST_HOST}/release/cargo ${TOOLCHAIN}/bin/ +} diff --git a/packages/rust/rust-std-snapshot/package.mk b/packages/rust/rust-std-snapshot/package.mk new file mode 100644 index 0000000000..80f0b37e89 --- /dev/null +++ b/packages/rust/rust-std-snapshot/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="rust-std-snapshot" +PKG_VERSION="$(get_pkg_version rust)" +PKG_SHA256="6fb8ee3650beb10836ae48a9aaa535473e64eaca20695b88113267aea3c7557f" +PKG_LICENSE="MIT" +PKG_SITE="https://www.rust-lang.org" +PKG_URL="https://static.rust-lang.org/dist/rust-std-${PKG_VERSION}-${MACHINE_HARDWARE_CPU}-unknown-linux-gnu.tar.xz" +PKG_LONGDESC="rust std library bootstrap package" +PKG_TOOLCHAIN="manual" 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" +} + diff --git a/packages/rust/rustc-snapshot/package.mk b/packages/rust/rustc-snapshot/package.mk new file mode 100644 index 0000000000..a5f4f3140b --- /dev/null +++ b/packages/rust/rustc-snapshot/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="rustc-snapshot" +PKG_VERSION="$(get_pkg_version rust)" +PKG_SHA256="fc0b41c15e348ad0eeb7a6c015a922a2ac95e9577e531635558b26d99399f315" +PKG_LICENSE="MIT" +PKG_SITE="https://www.rust-lang.org" +PKG_URL="https://static.rust-lang.org/dist/rustc-${PKG_VERSION}-${MACHINE_HARDWARE_CPU}-unknown-linux-gnu.tar.xz" +PKG_LONGDESC="rustc bootstrap compiler" +PKG_TOOLCHAIN="manual"