new package: wasmer

This commit is contained in:
Jia Yuan Lo 2021-06-19 22:23:47 +08:00 committed by YAKSH BARIYA
parent 200d3f0144
commit 5a65f78f8f
2 changed files with 174 additions and 0 deletions

148
packages/wasmer/build.sh Normal file
View File

@ -0,0 +1,148 @@
TERMUX_PKG_HOMEPAGE=https://github.com/wasmerio/wasmer
TERMUX_PKG_DESCRIPTION="A fast and secure WebAssembly runtime"
TERMUX_PKG_LICENSE="MIT"
TERMUX_PKG_MAINTAINER="@termux"
TERMUX_PKG_VERSION=2.0.0
TERMUX_PKG_SRCURL=https://github.com/wasmerio/wasmer/archive/${TERMUX_PKG_VERSION}.tar.gz
TERMUX_PKG_SHA256=f0d86dcd98882a7459f10e58671acf233b7d00f50dffe32f5770ab3bf850a9a6
TERMUX_PKG_BUILD_IN_SRC=true
TERMUX_PKG_NO_STATICSPLIT=true
# missing support in wasmer-emscripten
TERMUX_PKG_BLACKLISTED_ARCHES="arm, i686"
termux_step_pre_configure() {
export WASMER_INSTALL_PREFIX="$TERMUX_PREFIX"
# https://github.com/rust-lang/compiler-builtins#unimplemented-functions
# https://github.com/rust-lang/rfcs/issues/2629
# Android NDK r23 removed libgcc and replaced with libcompiler-rt
# Rust libcompiler-rt support does not fully cover all libgcc functions
# due to missing types f128 and f80 in Rust
# This workaround likely will break something in rusqlite in wapm
export CFLAGS+=" -DLONGDOUBLE_TYPE=double"
termux_setup_rust
}
termux_step_make() {
# https://github.com/wasmerio/wasmer/blob/master/Makefile
# Makefile only does host builds
make build-wasmer
# singlepass only for x86_64
# make build-wasmer
if [ "$TERMUX_ARCH" = "x86_64" ]; then
cargo build \
--jobs "$TERMUX_MAKE_PROCESSES" \
--target "$CARGO_TARGET_NAME" \
--release \
--manifest-path lib/cli/Cargo.toml \
--bin wasmer \
--features cranelift,singlepass
else
cargo build \
--jobs "$TERMUX_MAKE_PROCESSES" \
--target "$CARGO_TARGET_NAME" \
--release \
--manifest-path lib/cli/Cargo.toml \
--bin wasmer \
--features cranelift
fi
# make build-capi
if [ "$TERMUX_ARCH" = "x86_64" ]; then
cargo build \
--jobs "$TERMUX_MAKE_PROCESSES" \
--target "$CARGO_TARGET_NAME" \
--release \
--manifest-path lib/c-api/Cargo.toml \
--no-default-features \
--features wat,universal,dylib,staticlib,wasi,middlewares,cranelift,singlepass
else
cargo build \
--jobs "$TERMUX_MAKE_PROCESSES" \
--target "$CARGO_TARGET_NAME" \
--release \
--manifest-path lib/c-api/Cargo.toml \
--no-default-features \
--features wat,universal,dylib,staticlib,wasi,middlewares,cranelift
fi
# make build-wapm
#wapm_version="$(grep "WAPM_VERSION = " "$TERMUX_PKG_SRCDIR/Makefile" | sed -e "s/.* = //")"
#[ -d "wapm-cli" ] || git clone --branch "${wapm_version}" "https://github.com/wasmerio/wapm-cli.git"
# use master to include important bugfix
[ -d "wapm-cli" ] || \
git clone "https://github.com/wasmerio/wapm-cli.git" && \
git -C wapm-cli pull && \
git -C wapm-cli reset --hard d125632dbf6ff75cde8a82670e3665a95a84f5fb
cargo build \
--jobs "$TERMUX_MAKE_PROCESSES" \
--target "$CARGO_TARGET_NAME" \
--release \
--manifest-path wapm-cli/Cargo.toml \
--features telemetry,update-notifications
}
termux_step_make_install() {
# make install-wasmer
install -Dm755 -t "$TERMUX_PREFIX/bin" "target/$CARGO_TARGET_NAME/release/wasmer"
# make install-capi-headers
for header in lib/c-api/*.h; do
install -Dm644 "$header" "$TERMUX_PREFIX/include/$(basename $header)"
done
install -Dm644 "lib/c-api/README.md" "$TERMUX_PREFIX/include/wasmer-README.md"
# make install-capi-lib
pkgver="$(target/release/wasmer --version | cut -d\ -f2)"
shortver="${pkgver%.*}"
majorver="${shortver%.*}"
install -Dm755 "target/$CARGO_TARGET_NAME/release/libwasmer_c_api.so" "$TERMUX_PREFIX/lib/libwasmer.so.$pkgver"
ln -sf "libwasmer.so.$pkgver" "$TERMUX_PREFIX/lib/libwasmer.so.$shortver"
ln -sf "libwasmer.so.$pkgver" "$TERMUX_PREFIX/lib/libwasmer.so.$majorver"
ln -sf "libwasmer.so.$pkgver" "$TERMUX_PREFIX/lib/libwasmer.so"
# make install-capi-staticlib
install -Dm644 "target/$CARGO_TARGET_NAME/release/libwasmer_c_api.a" "$TERMUX_PREFIX/lib/libwasmer.a"
# make install-pkg-config
target/release/wasmer config --pkg-config | install -Dm644 /dev/stdin "$TERMUX_PREFIX/lib/pkgconfig/wasmer.pc"
# make install-wapm (non-existant)
install -Dm755 "wapm-cli/target/$CARGO_TARGET_NAME/release/wapm" "$TERMUX_PREFIX/bin/wapm"
cat <<- EOF > "$TERMUX_PKG_TMPDIR/wasmer.sh"
#!$TERMUX_PREFIX/bin/sh
export PATH=\$PATH:\$HOME/.wasmer/globals/wapm_packages/.bin
EOF
install -Dm644 "$TERMUX_PKG_TMPDIR/wasmer.sh" "$TERMUX_PREFIX/etc/profile.d/wasmer.sh"
unset WASMER_INSTALL_PREFIX
}
termux_step_create_debscripts() {
cat <<- EOF > postinst
#!$TERMUX_PREFIX/bin/sh
echo "Creating directory \$HOME/.wasmer ..."
mkdir -p "\$HOME/.wasmer"
echo '
====================
Post-install notice:
If this is the first time installing Wasmer,
please start a new session to take effect.
===================='
EOF
cat <<- EOF > postrm
#!$TERMUX_PREFIX/bin/sh
case "\$1" in
purge|remove)
echo "Removing directory \$HOME/.wasmer ..."
rm -fr "\$HOME/.wasmer"
esac
EOF
}

View File

@ -0,0 +1,26 @@
diff -uNr wasmer-2.0.0/lib/vm/src/trap/traphandlers.rs wasmer-2.0.0.mod/lib/vm/src/trap/traphandlers.rs
--- wasmer-2.0.0/lib/vm/src/trap/traphandlers.rs 2021-06-16 04:59:00.000000000 +0800
+++ wasmer-2.0.0.mod/lib/vm/src/trap/traphandlers.rs 2021-09-20 09:30:49.491362030 +0800
@@ -207,6 +207,9 @@
if #[cfg(all(target_os = "linux", target_arch = "x86_64"))] {
let cx = &*(cx as *const libc::ucontext_t);
cx.uc_mcontext.gregs[libc::REG_RIP as usize] as *const u8
+ } else if #[cfg(all(target_os = "android", target_arch = "x86_64"))] {
+ let cx = &*(cx as *const libc::ucontext_t);
+ cx.uc_mcontext.gregs[libc::REG_RIP as usize] as *const u8
} else if #[cfg(all(target_os = "linux", target_arch = "x86"))] {
let cx = &*(cx as *const libc::ucontext_t);
cx.uc_mcontext.gregs[libc::REG_EIP as usize] as *const u8
@@ -219,6 +222,12 @@
} else if #[cfg(all(target_os = "android", target_arch = "aarch64"))] {
let cx = &*(cx as *const libc::ucontext_t);
cx.uc_mcontext.pc as *const u8
+ } else if #[cfg(all(target_os = "linux", target_arch = "arm"))] {
+ let cx = &*(cx as *const libc::ucontext_t);
+ cx.uc_mcontext.arm_pc as *const u8 // still not implemented in rust libc
+ } else if #[cfg(all(target_os = "android", target_arch = "arm"))] {
+ let cx = &*(cx as *const libc::ucontext_t);
+ cx.uc_mcontext.arm_pc as *const u8
} else if #[cfg(all(target_os = "macos", target_arch = "x86_64"))] {
let cx = &*(cx as *const libc::ucontext_t);
(*cx.uc_mcontext).__ss.__rip as *const u8