File: build.sh

package info (click to toggle)
rust-wasmtime 26.0.1%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 48,492 kB
  • sloc: ansic: 4,003; sh: 561; javascript: 542; cpp: 254; asm: 175; ml: 96; makefile: 55
file content (61 lines) | stat: -rwxr-xr-x 2,188 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/sh

# An example script to build and run the `min-platform` example by building both
# the embedding itself as well as the example host which will run it.
#
# This script takes a single argument which is a path to a Rust target json
# file. Example targets are `x86_64-unknown-none` or `aarch64-unknown-none`.
#
# This script must be executed with the current-working-directory as
# `examples/min-platform`.

target=$1
if [ "$target" = "" ]; then
  echo "Usage: $0 <target>"
  exit 1
fi

REPO_DIR=$(dirname $0)/../..
HOST_DIR=$REPO_DIR/examples/min-platform
EMBEDDING_DIR=$HOST_DIR/embedding

set -ex

# First compile the C implementation of the platform symbols that will be
# required by our embedding. This is the `embedding/wasmtime-platform.c` file.
# The header file used is generated from Rust source code with the `cbindgen`
# utility which can be installed with:
#
#   cargo install cbindgen
#
# which ensures that Rust & C agree on types and such.
cbindgen "$REPO_DIR/crates/wasmtime/src/runtime/vm/sys/custom/capi.rs" \
    --config "$EMBEDDING_DIR/cbindgen.toml" > "$EMBEDDING_DIR/wasmtime-platform.h"
clang -shared -O2 -o "$HOST_DIR/libwasmtime-platform.so" "$EMBEDDING_DIR/wasmtime-platform.c" \
  -D_GNU_SOURCE

# Next the embedding itself is built.
#
# Note that this builds the embedding as a static library, here
# `libembedding.a`. This embedding is then turned into a dynamic library for the
# host platform using `cc` afterwards. The `*-unknown-none` targets themselves
# don't support dynamic libraries so this is a bit of a dance to get around the
# fact that we're pretending this examples in't being compiled for linux.
cargo build \
  --manifest-path $EMBEDDING_DIR/Cargo.toml \
  --target $target \
  --release
cc \
  -Wl,--gc-sections \
  -Wl,--whole-archive \
  "$REPO_DIR/target/$target/release/libembedding.a" \
  -Wl,--no-whole-archive \
  -shared \
  -o "$HOST_DIR/libembedding.so"

# The final step here is running the host, in the current directory, which will
# load the embedding and execute it.
cargo run --manifest-path "$HOST_DIR/Cargo.toml" --release -- \
  "$target" \
  "$HOST_DIR/libembedding.so" \
  "$HOST_DIR/libwasmtime-platform.so"