f0286576e7
Add a cargo wrapper which appends a --target argument to the command line. This makes cargo pass the --target argument to rustc for crates being built for the target architecture, even if the target is the same as the host. It will omit the --target argument for build scripts and crates used in macros. Check for this --target argument in the rustc wrapper and adjust the library paths depending on its presence. The fallback that runs rustc under qemu is no longer needed because macros are now built for the native architecture and can be loaded into the native compiler without any problems. Also check if the arguments passed to rustc are "-vV". If this is the case, we still need to fall back to the target rustc because the native rustc will return the wrong architecture. If the wrong host architecture is passed to a build script, it might try to look for a cross-compiler or do something else that doesn't work. [ci:skip-build]: already built successfully in CI
84 lines
3 KiB
Text
84 lines
3 KiB
Text
# Wrapper for the "crossdirect" compilation method.
|
|
# pmbootstrap mounts the native chroot in the foreign arch (e.g. armhf) chroot
|
|
# as /native. This package gets installed into the native chroot, and creates
|
|
# wrappers like:
|
|
#
|
|
# /native/usr/lib/crossdirect/armhf/gcc
|
|
# -> /native/usr/bin/armv6-alpine-linux-muslgnueabihf-gcc
|
|
# /native/usr/lib/crossdirect/armhf/rustc
|
|
# -> /native/usr/bin/rustc --target=armv6-alpine-linux-musleabihf ...
|
|
#
|
|
# When building packages in the armhf chroot, PATH will get prepended with
|
|
# "/native/usr/lib/crossdirect/armhf". The end game is of course invoking the
|
|
# cross compiler from the native chroot, running at native speed, whenever
|
|
# calling the compiler from the foreign arch chroot. See crossdirect.c for
|
|
# implementation details of the C version (llvm, fakeroot, rpath). The rust
|
|
# version is implemented as simple shell wrappers.
|
|
|
|
pkgname=crossdirect
|
|
pkgver=5
|
|
pkgrel=0
|
|
pkgdesc="Wrappers to launch native cross compilers in foreign chroots"
|
|
url="https://postmarketOS.org"
|
|
arch="all"
|
|
license="MIT"
|
|
options="!check"
|
|
source="cargo.sh crossdirect.c rustc.sh rust-qemu-linker.sh"
|
|
|
|
build() {
|
|
cd "$srcdir"
|
|
# Architectures and binaries
|
|
_archs="x86_64 armhf armv7 aarch64"
|
|
for _arch in $_archs; do
|
|
[ "$_arch" == "$CARCH" ] && continue
|
|
_hostspec="$(arch_to_hostspec $_arch)"
|
|
|
|
# Build with -Werror, because we maintain this short program. (If
|
|
# upstream is elsewhere, having -Werror is usually not desired.)
|
|
$CC -o "crossdirect-$_arch" \
|
|
-static \
|
|
-Werror \
|
|
-DHOSTSPEC="\"$_hostspec\"" \
|
|
crossdirect.c
|
|
done
|
|
}
|
|
|
|
package() {
|
|
# Architectures and binaries
|
|
_archs="x86_64 armhf armv7 aarch64"
|
|
_bins="c++ cc cpp g++ gcc clang clang++"
|
|
|
|
# Rust wrappers
|
|
install -Dm755 "$srcdir/rust-qemu-linker.sh" \
|
|
"$pkgdir/usr/lib/crossdirect/rust-qemu-linker"
|
|
install -Dm755 "$srcdir/cargo.sh" "$pkgdir/usr/lib/crossdirect/cargo.sh"
|
|
install -Dm755 "$srcdir/rustc.sh" "$pkgdir/usr/lib/crossdirect/rustc.sh"
|
|
|
|
# Iterate over architectures
|
|
for _arch in $_archs; do
|
|
[ "$_arch" == "$CARCH" ] && continue
|
|
|
|
# GCC: put arch-specific crossdirect wrapper in arch-specific
|
|
# bin folder
|
|
_bindir="$pkgdir/usr/lib/crossdirect/$_arch"
|
|
_hostspec="$(arch_to_hostspec $_arch)"
|
|
mkdir -p "$_bindir"
|
|
cd "$_bindir"
|
|
cp "$srcdir/crossdirect-$_arch" "./"
|
|
|
|
# GCC: create compiler symlinks
|
|
for _bin in $_bins; do
|
|
ln -s "crossdirect-$_arch" "$_bin"
|
|
ln -s "crossdirect-$_arch" "$_hostspec-$_bin"
|
|
done
|
|
|
|
ln -s ../cargo.sh cargo
|
|
ln -s ../rustc.sh rustc
|
|
done
|
|
}
|
|
sha512sums="
|
|
0f4b48f250425dc57f63955fc8b38477d23db793bee367c3fbe03c3d2a559ba576434d07518310db4cae9d90d501af4051b80038b10fae94b980e537fc9374ad cargo.sh
|
|
500107e5aff8b34e74b54982ebcd447fc41bc8283956d506561b031a055cb30ec12698047c2604918b4b6d8560fe03db427a63dff2b83c907e8494b7f5233f29 crossdirect.c
|
|
2c41410a9ef2dab31403545e55e2464f2ee4e7056ffbcd3bc5810d582311801496b88d55307f17ce6acf766e9c867d30d05f2b0d8d46bf77a5e8f0495d6bc24e rustc.sh
|
|
ea9bf8db3810d03d0a7395057f3d6e57f7127d87c55deaedc171c255288f5f3cc6fbcc680a5a1b92786cf573875d5dc22521173799fe2639acc97d0715ff905b rust-qemu-linker.sh
|
|
"
|