blob: cdafa34467493fb25e16f9de872d41e9accfeac1 [file] [log] [blame]
# Copyright 2022 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
EAPI=7
PYTHON_COMPAT=( python3_{6..9} )
inherit cros-constants python-any-r1
DESCRIPTION="Compilers for building HPS firmware"
HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/hps-firmware"
LICENSE="|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA GPL-3 LGPL-3 libgcc FDL-1.2"
KEYWORDS="*"
SLOT="0"
RUST_VERSION="1.60.0"
RUST_BOOTSTRAP_VERSION="1.59.0"
RUST_BOOTSTRAP_HOST_TRIPLE="x86_64-unknown-linux-gnu"
# These revisions match the submodules in
# https://github.com/riscv-collab/riscv-gnu-toolchain/tree/2021.04.23
BINUTILS_REV="f35674005e609660f5f45005a9e095541ca4c5fe"
GCC_REV="03cb20e5433cd8e65af6a1a6baaf3fe4c72785f6"
SRC_URI="
https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.gz
https://static.rust-lang.org/dist/rustc-${RUST_BOOTSTRAP_VERSION}-${RUST_BOOTSTRAP_HOST_TRIPLE}.tar.xz
https://static.rust-lang.org/dist/rust-std-${RUST_BOOTSTRAP_VERSION}-${RUST_BOOTSTRAP_HOST_TRIPLE}.tar.xz
https://static.rust-lang.org/dist/cargo-${RUST_BOOTSTRAP_VERSION}-${RUST_BOOTSTRAP_HOST_TRIPLE}.tar.xz
https://github.com/riscv-collab/riscv-binutils-gdb/archive/${BINUTILS_REV}.tar.gz -> riscv-binutils-gdb-${BINUTILS_REV}.tar.gz
https://github.com/riscv-collab/riscv-gcc/archive/${GCC_REV}.tar.gz -> riscv-gcc-${GCC_REV}.tar.gz
ftp://sourceware.org/pub/newlib/newlib-4.1.0.tar.gz
"
S="${WORKDIR}"
pkg_setup() {
python-any-r1_pkg_setup
}
src_unpack() {
default
### RUST ###
# Copy bootstrap std to where bootstrap rustc will find it
local rust_std_dir="${WORKDIR}/rust-std-${RUST_BOOTSTRAP_VERSION}-${RUST_BOOTSTRAP_HOST_TRIPLE}/rust-std-${RUST_BOOTSTRAP_HOST_TRIPLE}"
local rustc_dir="${WORKDIR}/rustc-${RUST_BOOTSTRAP_VERSION}-${RUST_BOOTSTRAP_HOST_TRIPLE}/rustc"
cp -a \
"${rust_std_dir}/lib/rustlib/${RUST_BOOTSTRAP_HOST_TRIPLE}" \
"${rustc_dir}/lib/rustlib/" \
|| die
}
src_prepare() {
default
### RUST ###
cd "${WORKDIR}/rustc-${RUST_VERSION}-src" || die
# Copy "unknown" vendor targets to create cros_sdk target triple
# variants as referred to in 0001-add-cros-targets.patch and RUSTC_TARGET_TRIPLES.
# armv7a is treated specially because the cros toolchain differs in
# more than just the vendor part of the target triple. The arch is
# armv7a in cros versus armv7.
pushd compiler/rustc_target/src/spec || die
sed -e 's:"unknown":"pc":g' x86_64_unknown_linux_gnu.rs >x86_64_pc_linux_gnu.rs || die
sed -e 's:"unknown":"cros":g' x86_64_unknown_linux_gnu.rs >x86_64_cros_linux_gnu.rs || die
sed -e 's:"unknown":"cros":g' armv7_unknown_linux_gnueabihf.rs >armv7a_cros_linux_gnueabihf.rs || die
sed -e 's:"unknown":"cros":g' aarch64_unknown_linux_gnu.rs >aarch64_cros_linux_gnu.rs || die
popd || die
eapply "${FILESDIR}/rust-${RUST_VERSION}-add-cros-targets.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-fix-rpath.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-Revert-CMake-Unconditionally-add-.h-and-.td-files-to.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-no-test-on-build.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-sanitizer-supported.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-cc.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-revert-libunwind-build.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-ld-argv0.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-Handle-sparse-git-repo-without-erroring.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-disable-mutable-noalias.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-add-armv7a-sanitizers.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-fix-libunwind-backtrace-visibility.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-passes-only-in-pre-link.patch"
eapply "${FILESDIR}/rust-${RUST_VERSION}-Revert-DebugInfo-Re-enable-instruction-referencing-f.patch"
# For the rustc_llvm module, the build will link with -nodefaultlibs and manually choose the
# std C++ library. For x86_64 Linux, the build script always chooses libstdc++ which will not
# work if LLVM was built with USE="default-libcxx". This snippet changes that choice to libc++
# in the case that clang++ defaults to libc++.
if "${CXX}" -### -x c++ - < /dev/null 2>&1 | grep -q -e '-lc++'; then
sed -i 's:"stdc++":"c++":g' compiler/rustc_llvm/build.rs || die
fi
### GCC ###
cd "${WORKDIR}/riscv-gcc-${GCC_REV}" || die
eapply "${FILESDIR}/gcc-10.2.0-avoid-unprefixed-ld-in-configure-checks.patch"
}
src_configure() {
### RUST ###
tc-export PKG_CONFIG
cd "${WORKDIR}/rustc-${RUST_VERSION}-src" || die
cat >config.toml <<EOF
[build]
target = [
"x86_64-unknown-linux-gnu",
"aarch64-cros-linux-gnu",
"armv7a-cros-linux-gnueabihf",
"x86_64-cros-linux-gnu",
"thumbv6m-none-eabi",
"riscv32i-unknown-none-elf",
]
cargo = "${WORKDIR}/cargo-${RUST_BOOTSTRAP_VERSION}-${RUST_BOOTSTRAP_HOST_TRIPLE}/cargo/bin/cargo"
rustc = "${WORKDIR}/rustc-${RUST_BOOTSTRAP_VERSION}-${RUST_BOOTSTRAP_HOST_TRIPLE}/rustc/bin/rustc"
docs = false
submodules = false
python = "${EPYTHON}"
vendor = true
extended = true
tools = ["cargo", "cargo-miri", "miri", "src"]
sanitizers = false
profiler = false
[llvm]
ninja = true
targets = "AArch64;ARM;RISCV;X86"
experimental-targets = ""
[install]
prefix = "${D}/opt/hps-sdk"
sysconfdir = "etc"
mandir = "share/man"
[rust]
description = "${PF}"
channel = "nightly"
codegen-units = 0
llvm-libunwind = 'in-tree'
codegen-tests = false
new-symbol-mangling = true
lld = false
use-lld = false
default-linker = "${CBUILD}-clang"
[target.x86_64-unknown-linux-gnu]
cc = "${CBUILD}-clang"
cxx = "${CBUILD}-clang++"
linker = "${CBUILD}-clang++"
[target.aarch64-cros-linux-gnu]
cc = "aarch64-cros-linux-gnu-clang"
cxx = "aarch64-cros-linux-gnu-clang++"
linker = "aarch64-cros-linux-gnu-clang++"
[target.armv7a-cros-linux-gnueabihf]
cc = "armv7a-cros-linux-gnueabihf-clang"
cxx = "armv7a-cros-linux-gnueabihf-clang++"
linker = "armv7a-cros-linux-gnueabihf-clang++"
[target.x86_64-cros-linux-gnu]
cc = "x86_64-cros-linux-gnu-clang"
cxx = "x86_64-cros-linux-gnu-clang++"
linker = "x86_64-cros-linux-gnu-clang++"
[target.thumbv6m-none-eabi]
cc = "armv7m-cros-eabi-clang"
cxx = "armv7m-cros-eabi-clang++"
linker = "armv7m-cros-eabi-clang++"
[target.riscv32i-unknown-none-elf]
cc = "clang"
cxx = "clang++"
linker = "ld.lld"
EOF
### GCC ###
# Work around a defective check in libiberty ./configure which invokes unprefixed 'cc'
export ac_cv_prog_cc_x86_64_pc_linux_gnu_clang_c_o=yes
export ac_cv_prog_cc_cc_c_o=yes
}
src_compile() {
### RUST ###
cd "${WORKDIR}/rustc-${RUST_VERSION}-src" || die
${EPYTHON} x.py build --stage 2 || die
### GCC ###
# Build binutils
mkdir "${WORKDIR}/build-binutils" || die
(
cd "${WORKDIR}/build-binutils" || die
"${WORKDIR}/riscv-binutils-gdb-${BINUTILS_REV}/configure" \
--host="${CHOST}" \
--target=riscv64-unknown-elf \
--prefix=/opt/hps-sdk \
--disable-werror \
--disable-gdb \
--disable-sim \
--disable-libdecnumber \
--disable-readline \
|| die
emake
# Install under $WORKDIR so that GCC stage 1 can find it.
# We install for real under $D in src_install.
emake install DESTDIR="${WORKDIR}/installed-stage1"
)
# Build GCC stage 1
mkdir "${WORKDIR}/build-gcc-stage1" || die
(
# shellcheck disable=SC2030,SC2031 # subshell is intentional
export PATH="${WORKDIR}/installed-stage1/opt/hps-sdk/bin:${PATH}"
cd "${WORKDIR}/build-gcc-stage1" || die
"${WORKDIR}/riscv-gcc-${GCC_REV}/configure" \
--host="${CHOST}" \
--target=riscv64-unknown-elf \
--prefix="${WORKDIR}/installed-stage1/opt/hps-sdk" \
--with-sysroot="${WORKDIR}/installed-stage1/opt/hps-sdk/riscv64-unknown-elf" \
--disable-shared \
--disable-threads \
--disable-tls \
--enable-languages=c,c++ \
--with-system-zlib \
--with-newlib \
--disable-libmudflap \
--disable-libssp \
--disable-libquadmath \
--disable-libgomp \
--disable-nls \
--disable-tm-clone-registry \
--src="${WORKDIR}/riscv-gcc-${GCC_REV}" \
--enable-multilib \
--with-multilib-generator="rv32im-ilp32--" \
CFLAGS_FOR_TARGET="-Os" \
CXXFLAGS_FOR_TARGET="-Os" \
|| die
emake all-gcc
emake install-gcc
)
# Build newlib
mkdir "${WORKDIR}/build-newlib" || die
(
# shellcheck disable=SC2030,SC2031 # subshell is intentional
export PATH="${WORKDIR}/installed-stage1/opt/hps-sdk/bin:${PATH}"
cd "${WORKDIR}/build-newlib" || die
# TODO(dcallagh): should use the "nano" configuration with -Os probably
"${WORKDIR}/newlib-4.1.0/configure" \
--host="${CHOST}" \
--target=riscv64-unknown-elf \
--prefix=/opt/hps-sdk \
--enable-newlib-io-long-double \
--enable-newlib-io-long-long \
--enable-newlib-io-c99-formats \
--enable-newlib-register-fini \
CFLAGS_FOR_TARGET="-O2 -D_POSIX_MODE" \
CXXFLAGS_FOR_TARGET="-O2 -D_POSIX_MODE" \
|| die
emake
emake install DESTDIR="${WORKDIR}/installed-stage1"
)
# Build GCC stage 2
mkdir "${WORKDIR}/build-gcc-stage2" || die
(
# shellcheck disable=SC2030,SC2031 # subshell is intentional
export PATH="${WORKDIR}/installed-stage1/opt/hps-sdk/bin:${PATH}"
cd "${WORKDIR}/build-gcc-stage2" || die
# TODO(dcallagh): the riscv-gnu-toolchain Makefile passes --enable-tls
# here, but I don't think it's wanted and I don't see how it could work
"${WORKDIR}/riscv-gcc-${GCC_REV}/configure" \
--host="${CHOST}" \
--target=riscv64-unknown-elf \
--prefix=/opt/hps-sdk \
--with-sysroot=/opt/hps-sdk/riscv64-unknown-elf \
--with-build-sysroot="${WORKDIR}/installed-stage1/opt/hps-sdk/riscv64-unknown-elf" \
--with-native-system-header-dir=/include \
--disable-shared \
--disable-threads \
--disable-tls \
--enable-languages=c,c++ \
--with-system-zlib \
--with-newlib \
--disable-libmudflap \
--disable-libssp \
--disable-libquadmath \
--disable-libgomp \
--disable-nls \
--disable-tm-clone-registry \
--src="${WORKDIR}/riscv-gcc-${GCC_REV}" \
--enable-multilib \
--with-multilib-generator="rv32im-ilp32--" \
CFLAGS_FOR_TARGET="-Os" \
CXXFLAGS_FOR_TARGET="-Os" \
|| die
emake
)
}
src_install() {
### RUST ###
cd "${WORKDIR}/rustc-${RUST_VERSION}-src" || die
${EPYTHON} x.py install || die
### GCC ###
# shellcheck disable=SC2030,SC2031 # subshell is intentional
export PATH="${WORKDIR}/installed-stage1/opt/hps-sdk/bin:${PATH}"
emake -C "${WORKDIR}/build-binutils" install DESTDIR="${D}"
emake -C "${WORKDIR}/build-newlib" install DESTDIR="${D}"
emake -C "${WORKDIR}/build-gcc-stage2" install DESTDIR="${D}"
}