blob: e4af23ef13a61beb40cd47cdd946354aa6cdfad5 [file] [log] [blame]
#!/bin/bash
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
### Builds and copies the Flutter and Dart runners for the Fuchsia platform.
###
### Arguments:
### --runtime-mode: The runtime mode to build Flutter in.
### Valid values: [debug, profile, release]
### Default value: debug
### --fuchsia-cpu: The architecture of the Fuchsia device to target.
### Valid values: [x64, arm64]
### Default value: x64
### --unoptimized: Disables C++ compiler optimizations.
### --goma: Speeds up builds for Googlers. sorry. :(
###
### Any additional arguments are forwarded directly to GN.
set -e # Fail on any error.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
ensure_fuchsia_dir
ensure_engine_dir
ensure_ninja
# Parse arguments.
runtime_mode="debug"
compilation_mode="jit"
fuchsia_cpu="x64"
goma=0
goma_flags=""
ninja_cmd="ninja"
unoptimized_flags=""
unoptimized_suffix=""
extra_gn_args=()
while [[ $# -gt 0 ]]; do
case $1 in
--runtime-mode)
shift # past argument
runtime_mode="$1"
shift # past value
if [[ "${runtime_mode}" == debug ]]
then
compilation_mode="jit"
elif [[ "${runtime_mode}" == profile || "${runtime_mode}" == release ]]
then
compilation_mode="aot"
else
engine-error "Invalid value for --runtime_mode: ${runtime_mode}"
exit 1
fi
;;
--fuchsia-cpu)
shift # past argument
fuchsia_cpu="$1"
shift # past value
if [[ "${fuchsia_cpu}" != x64 && "${fuchsia_cpu}" != arm64 ]]
then
engine-error "Invalid value for --fuchsia-cpu: ${fuchsia_cpu}"
exit 1
fi
;;
--goma)
goma=1
goma_flags="--goma"
ninja_cmd="autoninja"
shift # past argument
;;
--unopt|--unoptimized)
unoptimized_flags="--unoptimized"
unoptimized_suffix="_unopt"
shift # past argument
;;
*)
extra_gn_args+=("$1") # forward argument
shift # past argument
;;
esac
done
fuchsia_flutter_git_revision="$(cat $FUCHSIA_DIR/integration/jiri.lock | grep -A 1 "\"package\": \"flutter/fuchsia\"" | grep "git_revision" | tr ":" "\n" | sed -n 3p | tr "\"" "\n" | sed -n 1p)"
current_flutter_git_revision="$(git -C $ENGINE_DIR/flutter rev-parse HEAD)"
if [[ $fuchsia_flutter_git_revision != $current_flutter_git_revision ]]
then
engine-warning "Your current Flutter Engine commit ($current_flutter_git_revision) is not Fuchsia's Flutter Engine commit ($fuchsia_flutter_git_revision)."
engine-warning "You should checkout Fuchsia's Flutter Engine commit. This avoids crashing on app startup from using a different version of the Dart SDK. See https://github.com/flutter/flutter/wiki/Compiling-the-engine#important-dart-version-synchronization-on-fuchsia for more details."
engine-warning "You can checkout Fuchsia's Flutter Engine commit by running:"
engine-warning '$ENGINE_DIR/flutter/tools/fuchsia/devshell/checkout_fuchsia_revision.sh'
engine-warning "If you have already checked out Fuchsia's Flutter Engine commit and then committed some additional changes, please ignore the above warning."
fi
all_gn_args="--fuchsia --fuchsia-cpu="${fuchsia_cpu}" --runtime-mode="${runtime_mode}" ${goma_flags} ${unoptimized_flags} ${extra_gn_args[@]}"
engine-info "GN args: ${all_gn_args}"
"$ENGINE_DIR"/flutter/tools/gn ${all_gn_args}
fuchsia_out_dir_name=fuchsia_${runtime_mode}${unoptimized_suffix}_${fuchsia_cpu}
fuchsia_out_dir="$ENGINE_DIR"/out/"${fuchsia_out_dir_name}"
engine-info "Building ${fuchsia_out_dir_name}..."
${ninja_cmd} -C "${fuchsia_out_dir}" flutter/shell/platform/fuchsia fuchsia_tests
engine-info "Making Fuchsia's Flutter prebuilts writable..."
chmod -R +w "$FUCHSIA_DIR"/prebuilt/third_party/flutter
engine-info "Copying the patched SDK (dart:ui, dart:zircon, dart:fuchsia) to Fuchsia..."
cp -ra "${fuchsia_out_dir}"/flutter_runner_patched_sdk/* "$FUCHSIA_DIR"/prebuilt/third_party/flutter/"${fuchsia_cpu}"/release/aot/flutter_runner_patched_sdk/
# TODO(akbiggs): Register debug symbols.
if [[ "${runtime_mode}" == release ]]
then
flutter_runner_pkg="flutter_jit_product_runner-0.far"
engine-info "Copying the Flutter JIT product runner (${flutter_runner_pkg}) to Fuchsia..."
cp "${fuchsia_out_dir}"/"${flutter_runner_pkg}" "$FUCHSIA_DIR"/prebuilt/third_party/flutter/"${fuchsia_cpu}"/release/jit/"${flutter_runner_pkg}"
flutter_runner_pkg="flutter_aot_product_runner-0.far"
engine-info "Copying the Flutter AOT product runner (${flutter_runner_pkg}) to Fuchsia..."
cp "${fuchsia_out_dir}"/"${flutter_runner_pkg}" "$FUCHSIA_DIR"/prebuilt/third_party/flutter/"${fuchsia_cpu}"/release/aot/"${flutter_runner_pkg}"
dart_runner_pkg="dart_jit_product_runner-0.far"
engine-info "Copying the Dart JIT product runner (${dart_runner_pkg}) to Fuchsia..."
cp "${fuchsia_out_dir}"/"${dart_runner_pkg}" "$FUCHSIA_DIR"/prebuilt/third_party/flutter/"${fuchsia_cpu}"/release/jit/"${dart_runner_pkg}"
dart_runner_pkg="dart_aot_product_runner-0.far"
engine-info "Copying the Dart AOT product runner (${dart_runner_pkg}) to Fuchsia..."
cp "${fuchsia_out_dir}"/"${dart_runner_pkg}" "$FUCHSIA_DIR"/prebuilt/third_party/flutter/"${fuchsia_cpu}"/release/aot/"${dart_runner_pkg}"
else
flutter_runner_pkg="flutter_${compilation_mode}_runner-0.far"
engine-info "Copying the Flutter runner (${flutter_runner_pkg}) to Fuchsia..."
cp "${fuchsia_out_dir}"/"${flutter_runner_pkg}" "$FUCHSIA_DIR"/prebuilt/third_party/flutter/"${fuchsia_cpu}"/"${runtime_mode}"/"${compilation_mode}"/"${flutter_runner_pkg}"
dart_runner_pkg="dart_${compilation_mode}_runner-0.far"
engine-info "Copying the Dart runner (${dart_runner_pkg}) to Fuchsia..."
cp "${fuchsia_out_dir}"/"${dart_runner_pkg}" "$FUCHSIA_DIR"/prebuilt/third_party/flutter/"${fuchsia_cpu}"/"${runtime_mode}"/"${compilation_mode}"/"${dart_runner_pkg}"
fi
# TODO(akbiggs): Warn the developer when their current
# Fuchsia configuration (`fx set`) is mismatched with the runner
# they just deployed.
# TODO(akbiggs): Copy the tests over. I couldn't figure out a glob that grabs all of them.
echo "Done. You can now build Fuchsia with your Flutter Engine changes by running:"
echo ' cd $FUCHSIA_DIR'
# TODO(akbiggs): I'm not sure what example to give for arm64.
if [[ "${fuchsia_cpu}" == x64 ]]
then
if [[ "${runtime_mode}" == debug ]]
then
echo " fx set workstation_eng.x64"
else
echo " fx set workstation_eng.x64 --release"
fi
fi
echo ' fx build'