dart-sdk/sdk/bin/dart2wasm
Martin Kustermann 1d92908169 [dart2wasm] Have binaryen/wasm-opt flags in one place (dart compile exe), make all other places take it from there
Golem build configuration is setup in a way that includes the `pkg/`
folder entirely, so the shell scripts should have access to the
`dart compile exe` sources.

Change-Id: I5395413ce85f11098d14eacbd6ce392f665ddce5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/347021
Reviewed-by: Slava Egorov <vegorov@google.com>
2024-01-19 07:47:52 +00:00

136 lines
3.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
# Run dart2wasm on the Dart VM. This script assumes the Dart repo's directory
# structure.
#
# Last argument must be the output .wasm file.
function follow_links() {
file="$1"
while [ -h "$file" ]; do
# On Mac OS, readlink -f doesn't work.
file="$(readlink "$file")"
done
echo "$file"
}
# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
PROG_NAME="$(follow_links "$BASH_SOURCE")"
# Handle the case where dart-sdk/bin has been symlinked to.
PROG_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
SDK_DIR="$(cd "${PROG_DIR}/../.." ; pwd -P)"
# Use same binaryen flags as `dart compile exe`
BINARYEN_FLAGS="$(sed -n '/binaryenFlags =/,/end of binaryenFlags/ p' $SDK_DIR/pkg/dartdev/lib/src/commands/compile.dart | sed '1d' | sed '$d' | tr '\n' ' ')"
# Locate build directory, containing executables, snapshots and platform dill.
if [[ `uname` == 'Darwin' ]]; then
OUT_DIR="$SDK_DIR/xcodebuild"
else
OUT_DIR="$SDK_DIR/out"
fi
# Set DART_CONFIGURATION. Code copied from `dart` script in the same directory.
if [ -z "$DART_CONFIGURATION" ];
then
DIRS=$( ls "$OUT_DIR" )
# List of possible configurations in decreasing desirability.
CONFIGS=("ReleaseX64" "ReleaseARM64" "ReleaseIA32" "DebugX64" "DebugIA32"
"ReleaseARM" "DebugARM" "DebugARM64" )
DART_CONFIGURATION="None"
for CONFIG in ${CONFIGS[*]}
do
for DIR in $DIRS;
do
if [ "$CONFIG" = "$DIR" ];
then
# Choose most desirable configuration that is available and break.
DART_CONFIGURATION="$DIR"
break 2
fi
done
done
if [ "$DART_CONFIGURATION" = "None" ]
then
echo "No valid dart configuration found in $OUT_DIR"
exit 1
fi
fi
BIN_DIR="$OUT_DIR/$DART_CONFIGURATION"
DART_PRECOMPILED_RUNTIME="$BIN_DIR/dart_precompiled_runtime"
# Point to SDK directory.
SDK_ARG="--dart-sdk=$SDK_DIR"
# Point to built platform dill.
PLATFORM="$BIN_DIR/dart2wasm_platform.dill"
# Run wasm-opt with `-O`.
OPTIMIZED=0
# `-O` also passes `--inlining-limit 10` unless it's also passed by the caller.
INLINING_LIMIT_PASSED=0
# Arguments except `-O`. These are passed to the Dart main for dart2wasm.
ARGS=()
for arg in "$@"; do
if [ "$arg" = "-O" ]; then
OPTIMIZED=1
elif [ "$arg" = "--inlining-limit" ]; then
INLINING_LIMIT_PASSED=1
ARGS+=("$arg")
else
ARGS+=("$arg")
fi
done
if [[ "$OPTIMIZED" == 1 ]] && [[ "$INLINING_LIMIT_PASSED" == 0 ]]; then
# Last argument needs to be the output file, so insert it at the beginning.
ARGS=("--inlining-limit" "10" "${ARGS[@]}")
fi
# Not the prettiest way to check for a target, and it doesn't support changing
# the default, but it will do for experiments.
for arg in "${ARGS[@]}"; do
if [[ "$arg" == "--js-compatibility" ]]; then
PLATFORM="$BIN_DIR/dart2wasm_js_compatibility_platform.dill"
fi
done
PLATFORM_ARG="--platform=$PLATFORM"
unset EXTRA_VM_OPTIONS
declare -a EXTRA_VM_OPTIONS
# Choose snapshot with or without asserts enabled.
SNAPSHOT_NAME="dart2wasm"
case $0 in
*_developer)
EXTRA_VM_OPTIONS+=('--enable_asserts')
SNAPSHOT_NAME="dart2wasm_asserts"
;;
esac
SNAPSHOT="$BIN_DIR/$SNAPSHOT_NAME.snapshot"
# We allow extra vm options to be passed in through an environment variable.
if [[ $DART_VM_OPTIONS ]]; then
read -a OPTIONS <<< "$DART_VM_OPTIONS"
EXTRA_VM_OPTIONS+=("${OPTIONS[@]}")
fi
DART_ROOT="$(cd "${SDK_DIR}/.." ; pwd -P)"
set -e
"$DART_PRECOMPILED_RUNTIME" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$SNAPSHOT" "$SDK_ARG" "$PLATFORM_ARG" "${ARGS[@]}"
if [[ "$OPTIMIZED" == 1 ]]; then
# Keep the name section by passing `-g`.
"$BIN_DIR"/wasm-opt -g $BINARYEN_FLAGS "${ARGS[-1]}" -o "${ARGS[-1]}"
fi