mirror of
https://github.com/topjohnwu/ondk.git
synced 2024-11-27 05:10:30 +00:00
148 lines
3.7 KiB
Bash
Executable File
148 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Copyright 2022-2023 Google LLC.
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
set -e
|
|
|
|
. common.sh
|
|
|
|
OS=$(uname | tr '[:upper:]' '[:lower:]')
|
|
NATIVE_ARCH=$(uname -m)
|
|
if [ $NATIVE_ARCH = "arm64" ]; then
|
|
# Apple calls aarch64 arm64
|
|
NATIVE_ARCH='aarch64'
|
|
fi
|
|
|
|
if [ -z $1 ]; then
|
|
# Build the native architecture by default
|
|
ARCH=$NATIVE_ARCH
|
|
else
|
|
ARCH=$1
|
|
fi
|
|
|
|
if [ $OS = "darwin" ]; then
|
|
NDK_DIRNAME='darwin-x86_64'
|
|
TRIPLE="${ARCH}-apple-darwin"
|
|
NATIVE_TRIPLE="${NATIVE_ARCH}-apple-darwin"
|
|
DYN_EXT='dylib'
|
|
|
|
if [ $ARCH = "aarch64" ]; then
|
|
# Apple Silicon uses 16k pages
|
|
export JEMALLOC_SYS_WITH_LG_PAGE=14
|
|
fi
|
|
|
|
command -v ninja >/dev/null || brew install ninja
|
|
else
|
|
NDK_DIRNAME='linux-x86_64'
|
|
TRIPLE="${ARCH}-unknown-linux-gnu"
|
|
NATIVE_TRIPLE="${NATIVE_ARCH}-unknown-linux-gnu"
|
|
DYN_EXT='so'
|
|
|
|
command -v ninja >/dev/null || sudo apt-get install ninja-build
|
|
command -v lld >/dev/null || sudo apt-get install lld
|
|
fi
|
|
|
|
build() {
|
|
cd rust
|
|
python3 ./x.py --config "../config-${OS}.toml" --host $TRIPLE install
|
|
cd ../
|
|
|
|
cd out
|
|
find . -name '*.old' -delete
|
|
cp -af ../rust/build/$TRIPLE/llvm/bin llvm-bin
|
|
cp -af $(../rust/build/$NATIVE_TRIPLE/llvm/bin/clang -print-resource-dir)/include clang-include
|
|
cp -af lib/rustlib/$TRIPLE/bin/rust-lld llvm-bin/lld
|
|
ln -sf lld llvm-bin/ld
|
|
find ../rust/build/$TRIPLE/llvm/lib -name "*.${DYN_EXT}*" -exec cp -an {} lib \;
|
|
cd ..
|
|
}
|
|
|
|
ndk() {
|
|
local NDK_ZIP="android-ndk-${NDK_VERSION}-${OS}.zip"
|
|
|
|
# Download and extract
|
|
[ -f $NDK_ZIP ] || curl -O -L "https://dl.google.com/android/repository/$NDK_ZIP"
|
|
unzip -q $NDK_ZIP
|
|
mv "android-ndk-${NDK_VERSION}" ndk
|
|
|
|
# Copy the whole output folder into ndk
|
|
cp -af out ndk/toolchains/rust
|
|
|
|
cd ndk/toolchains
|
|
|
|
# Move llvm folder to llvm.dir
|
|
mv llvm/prebuilt/$NDK_DIRNAME llvm.dir
|
|
ln -s ../../llvm.dir llvm/prebuilt/$NDK_DIRNAME
|
|
|
|
# Replace headers
|
|
local NDK_RES=$(llvm.dir/bin/clang -print-resource-dir)
|
|
rm -rf $NDK_RES/include
|
|
mv rust/clang-include $NDK_RES/include
|
|
|
|
# Replace files with those from the rust toolchain
|
|
cd llvm.dir/bin
|
|
ln -sf ../../rust/llvm-bin/* .
|
|
rm clang-14
|
|
cd ../lib64
|
|
ln -sf ../../rust/lib/*.$DYN_EXT* .
|
|
rm -f libclang.so.13 libclang-cpp.so.14git libLLVM-14git.so libLTO.so.14git libRemarks.so.14git
|
|
cd ../..
|
|
|
|
# Now that clang is replaced, move files to the correct location
|
|
mkdir -p $(dirname $(llvm.dir/bin/clang -print-resource-dir))
|
|
mv $NDK_RES $(llvm.dir/bin/clang -print-resource-dir)
|
|
ln -s ../../rust/lib/clang llvm.dir/lib/clang
|
|
cd ../..
|
|
}
|
|
|
|
universal() {
|
|
cp -af out.x86 out
|
|
cp -an out.arm/. out/. || true
|
|
|
|
# Merge all Mach-O files as universal binary and adhoc codesign
|
|
find out -type f -exec sh -c "file {} | grep -q Mach-O" \; -print0 | \
|
|
while IFS= read -r -d '' o; do
|
|
local a="${o/out/out.x86}"
|
|
local b="${o/out/out.arm}"
|
|
if [ -f "$a" -a -f "$b" ]; then
|
|
lipo -create -output "$o" "$a" "$b"
|
|
fi
|
|
codesign -s - "$o"
|
|
done
|
|
}
|
|
|
|
clone
|
|
|
|
if [ -n "$GITHUB_ACTION" -a $OS = "darwin" -a $ARCH = "aarch64" ]; then
|
|
if [ ! -f tmp/stage-1.tar.gz ]; then
|
|
echo '! Missing stage 1 artifacts'
|
|
exit 1
|
|
fi
|
|
tar zxf tmp/stage-1.tar.gz
|
|
mv out out.x86
|
|
# FIXME: For some unknown reason, Mach-O larger than 8MB will always be corrupted
|
|
cp -af rust/build/x86_64-apple-darwin/llvm/lib/*.dylib \
|
|
rust/build/x86_64-apple-darwin/llvm/build/lib
|
|
cp -af rust/build/x86_64-apple-darwin/llvm/bin/. \
|
|
rust/build/x86_64-apple-darwin/llvm/build/bin
|
|
fi
|
|
|
|
build
|
|
|
|
if [ -n "$GITHUB_ACTION" -a $OS = "darwin" ]; then
|
|
if [ $ARCH = "x86_64" ]; then
|
|
# Pack up first stage artifacts
|
|
mkdir tmp
|
|
tar zcf tmp/stage-1.tar.gz rust/build/$TRIPLE/ll* out
|
|
# Exit early
|
|
exit 0
|
|
else
|
|
mv out out.arm
|
|
universal
|
|
fi
|
|
fi
|
|
|
|
ndk
|
|
dist
|