Build Android and iOS/macOS libraries on CI
This commit is contained in:
73
scripts/build_android.sh
Executable file
73
scripts/build_android.sh
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
set -x
|
||||
|
||||
name=leaf
|
||||
package=leaf-ffi
|
||||
manifest=android/Cargo.toml
|
||||
mode=--release
|
||||
targets=
|
||||
|
||||
if [ ! -z "$2" ]; then
|
||||
targets="$2"
|
||||
else
|
||||
targets="aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android"
|
||||
fi
|
||||
|
||||
for target in $targets; do
|
||||
rustup target add $target
|
||||
done
|
||||
|
||||
if [ "$1" = "debug" ]; then
|
||||
mode=
|
||||
fi
|
||||
|
||||
BASE=`dirname "$0"`
|
||||
HOST_OS=`uname -s | tr "[:upper:]" "[:lower:]"`
|
||||
HOST_ARCH=`uname -m | tr "[:upper:]" "[:lower:]"`
|
||||
|
||||
export PATH="$NDK_HOME/toolchains/llvm/prebuilt/$HOST_OS-$HOST_ARCH/bin/":$PATH
|
||||
|
||||
android_tools="$NDK_HOME/toolchains/llvm/prebuilt/$HOST_OS-$HOST_ARCH/bin"
|
||||
api=21
|
||||
|
||||
# See also: https://github.com/briansmith/ring/blob/main/mk/cargo.sh
|
||||
|
||||
for target in $targets; do
|
||||
case $target in
|
||||
'armv7-linux-androideabi')
|
||||
export CC_armv7_linux_androideabi="$android_tools/armv7a-linux-androideabi${api}-clang"
|
||||
export AR_armv7_linux_androideabi="$android_tools/llvm-ar"
|
||||
export CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="$android_tools/armv7a-linux-androideabi${api}-clang"
|
||||
;;
|
||||
'x86_64-linux-android')
|
||||
export CC_x86_64_linux_android="$android_tools/${target}${api}-clang"
|
||||
export AR_x86_64_linux_android="$android_tools/llvm-ar"
|
||||
export CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="$android_tools/${target}${api}-clang"
|
||||
;;
|
||||
'aarch64-linux-android')
|
||||
export CC_aarch64_linux_android="$android_tools/${target}${api}-clang"
|
||||
export AR_aarch64_linux_android="$android_tools/llvm-ar"
|
||||
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$android_tools/${target}${api}-clang"
|
||||
;;
|
||||
'i686-linux-android')
|
||||
export CC_i686_linux_android="$android_tools/${target}${api}-clang"
|
||||
export AR_i686_linux_android="$android_tools/llvm-ar"
|
||||
export CARGO_TARGET_I686_LINUX_ANDROID_LINKER="$android_tools/${target}${api}-clang"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown target $target"
|
||||
;;
|
||||
esac
|
||||
cargo build -p $package --target $target $mode
|
||||
done
|
||||
|
||||
android_libs=$BASE/../target/leaf-android-libs
|
||||
|
||||
mkdir -p $android_libs
|
||||
for target in $targets; do
|
||||
mv $BASE/../target/$target/release/libleaf.so $android_libs/libleaf-$target.so
|
||||
done
|
||||
cbindgen \
|
||||
--config $BASE/../$package/cbindgen.toml \
|
||||
$BASE/../$package/src/lib.rs > $android_libs/$name.h
|
||||
68
scripts/build_apple_xcframework.sh
Executable file
68
scripts/build_apple_xcframework.sh
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
set -x
|
||||
|
||||
mode=release
|
||||
release_flag=--release
|
||||
package=leaf-ffi
|
||||
name=leaf
|
||||
lib=lib$name.a
|
||||
|
||||
# The script is assumed to run in the root of the workspace
|
||||
base=$(dirname "$0")
|
||||
|
||||
# Debug or release build?
|
||||
if [ "$1" = "debug" ]; then
|
||||
mode=debug
|
||||
release_flag=
|
||||
fi
|
||||
|
||||
# Build for all desired targets
|
||||
rustup target add x86_64-apple-darwin
|
||||
rustup target add aarch64-apple-darwin
|
||||
rustup target add aarch64-apple-ios
|
||||
cargo build -p $package $release_flag --no-default-features --features "default-openssl" --target x86_64-apple-darwin
|
||||
cargo build -p $package $release_flag --no-default-features --features "default-openssl" --target aarch64-apple-darwin
|
||||
cargo build -p $package $release_flag --no-default-features --features "default-openssl" --target aarch64-apple-ios
|
||||
|
||||
# Directories to put the libraries.
|
||||
rm -rf target/apple/$mode
|
||||
mkdir -p target/apple/$mode/include
|
||||
mkdir -p target/apple/$mode/ios
|
||||
mkdir -p target/apple/$mode/macos
|
||||
|
||||
# Put built libraries to folders where we can find them easier later
|
||||
cp target/aarch64-apple-ios/$mode/$lib target/apple/$mode/ios/
|
||||
# Create a single library for multiple archs
|
||||
lipo -create \
|
||||
-arch x86_64 target/x86_64-apple-darwin/$mode/$lib \
|
||||
-arch arm64 target/aarch64-apple-darwin/$mode/$lib \
|
||||
-output target/apple/$mode/macos/$lib
|
||||
# Generate the header file
|
||||
cbindgen \
|
||||
--config $package/cbindgen.toml \
|
||||
$package/src/lib.rs > target/apple/$mode/include/$name.h
|
||||
|
||||
wd="$base/../target/apple/$mode"
|
||||
|
||||
# Remove existing artifact
|
||||
rm -rf "$wd/$name.xcframework"
|
||||
|
||||
# A modulemap is required for the compiler to find the module when using Swift
|
||||
cat << EOF > "$wd/include/module.modulemap"
|
||||
module $name {
|
||||
header "$name.h"
|
||||
export *
|
||||
}
|
||||
EOF
|
||||
|
||||
# Create the XCFramework packaging both iOS and macOS static libraries, so we can
|
||||
# use a single XCFramework for both platforms.
|
||||
xcodebuild -create-xcframework \
|
||||
-library "$wd/ios/$lib" \
|
||||
-headers "$wd/include" \
|
||||
-library "$wd/macos/$lib" \
|
||||
-headers "$wd/include" \
|
||||
-output "$wd/$name.xcframework"
|
||||
|
||||
ls $wd/$name.xcframework
|
||||
9
scripts/build_cross.sh
Executable file
9
scripts/build_cross.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
target=$1
|
||||
|
||||
if [[ "$target" == *"mips"* ]]; then
|
||||
cross build --release --target $target --manifest-path leaf-bin/Cargo.toml --no-default-features --features "default-openssl"
|
||||
else
|
||||
cross build --release --target $target --manifest-path leaf-bin/Cargo.toml --no-default-features --features "default-ring"
|
||||
fi
|
||||
6
scripts/regenerate_proto_files.sh
Executable file
6
scripts/regenerate_proto_files.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
set -x
|
||||
|
||||
touch leaf/build.rs
|
||||
PROTO_GEN=1 cargo build -p leaf
|
||||
Reference in New Issue
Block a user