[embedder] arm64 support.
Introduces a `--cpu arm64` flag to build_and_run_example.sh.
This required changes to compile an arm64 libflutter_engine.so
and switch between this and the x64 libflutter_engine.so based
on the build's CPU architecture.
Tested: build_and_run_example.sh compiles, but haven't tested it
yet.
Change-Id: I7be39d3de8fe181472b3a59be0d8fa832ca3cd5e
Reviewed-on: https://fuchsia-review.googlesource.com/c/flutter-embedder/+/762976
Reviewed-by: Ben Bergkamp <benbergkamp@google.com>
diff --git a/README.md b/README.md
index 2f39f96..53e851f 100644
--- a/README.md
+++ b/README.md
@@ -72,6 +72,12 @@
This can also be done from VSCode by following [this guide](https://fuchsia.googlesource.com/flutter-embedder/+/refs/heads/main/docs/debugging.md#attaching-a-debugger-from-vscode).
+ - For an arm64 device, run:
+
+ ```sh
+ $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh hello_flutter --cpu arm64
+ ```
+
- To watch logs for the example component, run:
```sh
diff --git a/scripts/build_and_copy_engine_artifacts.sh b/scripts/build_and_copy_engine_artifacts.sh
index ca06a4d..3eb910f 100755
--- a/scripts/build_and_copy_engine_artifacts.sh
+++ b/scripts/build_and_copy_engine_artifacts.sh
@@ -26,6 +26,7 @@
goma=0
goma_flags=""
ninja_cmd="ninja"
+cpu="x64"
extra_gn_args=()
while [[ $# -gt 0 ]]; do
case $1 in
@@ -35,6 +36,11 @@
ninja_cmd="autoninja"
shift # past argument
;;
+ --cpu)
+ shift # past argument
+ cpu="$1"
+ shift # past value
+ ;;
*)
extra_gn_args+=("$1") # forward argument
shift # past argument
@@ -42,16 +48,16 @@
esac
done
-all_gn_args="--fuchsia --embedder-for-target --unopt ${goma_flags} ${extra_gn_args[@]}"
+all_gn_args="--fuchsia --embedder-for-target --unopt ${goma_flags} ${extra_gn_args[@]} --fuchsia-cpu ${cpu}"
-echo-info "Building the debug Flutter Engine embedding for Fuchsia (libflutter_engine.so)..."
+echo-info "Building the debug Flutter Engine embedding for Fuchsia (libflutter_engine.so) for ${cpu}..."
echo-info "... GN args: ${all_gn_args}"
"${embedder_engine_dir}"/flutter/tools/gn ${all_gn_args}
-debug_out_dir="${embedder_engine_dir}"/out/fuchsia_debug_unopt_x64
+debug_out_dir="${embedder_engine_dir}"/out/fuchsia_debug_unopt_${cpu}
"${embedder_depot_tools}"/"${ninja_cmd}" -C "${debug_out_dir}"
-echo-info "Copying debug Flutter Engine artifacts to ${FUCHSIA_EMBEDDER_DIR}/src/embedder/engine/debug_x64..."
-cp "${debug_out_dir}"/so.unstripped/libflutter_engine.so "${FUCHSIA_EMBEDDER_DIR}"/src/embedder/engine/debug_x64/libflutter_engine.so
+echo-info "Copying debug Flutter Engine artifacts to ${FUCHSIA_EMBEDDER_DIR}/src/embedder/engine/debug_${cpu}..."
+cp "${debug_out_dir}"/so.unstripped/libflutter_engine.so "${FUCHSIA_EMBEDDER_DIR}"/src/embedder/engine/debug_${cpu}/libflutter_engine.so
echo-info "Copying embedder.h to ${FUCHSIA_EMBEDDER_DIR}/src/embedder/engine..."
cp "${embedder_engine_dir}"/flutter/shell/platform/embedder/embedder.h "${FUCHSIA_EMBEDDER_DIR}"/src/embedder/engine
diff --git a/scripts/build_and_run_example.sh b/scripts/build_and_run_example.sh
index b01de6b..562c22f 100755
--- a/scripts/build_and_run_example.sh
+++ b/scripts/build_and_run_example.sh
@@ -47,6 +47,7 @@
goma_flags=""
no_prebuilt_dart_sdk_flags=""
app_name="hello_flutter"
+cpu="x64"
while [[ $# -gt 0 ]]; do
case $1 in
--headless)
@@ -80,6 +81,15 @@
no_prebuilt_dart_sdk_flags="--no-prebuilt-dart-sdk"
shift # past argument
;;
+ --cpu)
+ shift # past argument
+ cpu="$1"
+ if [[ "${cpu}" != "x64" && "${cpu}" != "arm64" ]]
+ then
+ echo-error "Unknown value for cpu: $cpu. Valid values: x64, arm64"
+ fi
+ shift # past value
+ ;;
*)
app_name="$1"
shift # past value
@@ -115,7 +125,7 @@
if [[ "${with_engine}" != 0 ]]
then
- "${FUCHSIA_EMBEDDER_DIR}"/scripts/build_and_copy_engine_artifacts.sh ${goma_flags} ${no_prebuilt_dart_sdk_flags}
+ "${FUCHSIA_EMBEDDER_DIR}"/scripts/build_and_copy_engine_artifacts.sh ${goma_flags} ${no_prebuilt_dart_sdk_flags} --cpu "${cpu}"
fi
if [[ "${with_fuchsia}" != 0 ]]
@@ -143,10 +153,10 @@
echo-info "Running Flutter sample app."
"${FUCHSIA_EMBEDDER_DIR}"/tools/ffx repository server start
-"${FUCHSIA_EMBEDDER_DIR}"/tools/bazel run --config=fuchsia_x64 //src/examples/"${app_name}":"${app_name}"_pkg.component ${session_args}
+"${FUCHSIA_EMBEDDER_DIR}"/tools/bazel run --config=fuchsia_"${cpu}" //src/examples/"${app_name}":"${app_name}"_pkg.component ${session_args}
echo-info "Package contents for debugging:"
-"${FUCHSIA_EMBEDDER_DIR}"/tools/bazel build --config=fuchsia_x64 //src/examples/"${app_name}":"${app_name}"_pkg
+"${FUCHSIA_EMBEDDER_DIR}"/tools/bazel build --config=fuchsia_"${cpu}" //src/examples/"${app_name}":"${app_name}"_pkg
"${far_tool}" extract --archive="$(find -L ${FUCHSIA_EMBEDDER_DIR}/bazel-out -name "${app_name}".far | head -n 1)" --output="${far_debug_dir}"
"${far_tool}" extract --archive="${far_debug_dir}"/meta.far --output="${far_debug_dir}"
cat "${far_debug_dir}"/meta/contents
diff --git a/scripts/tests/build_and_copy_engine_artifacts_test.sh b/scripts/tests/build_and_copy_engine_artifacts_test.sh
index 7c4d77f..ff4c075 100755
--- a/scripts/tests/build_and_copy_engine_artifacts_test.sh
+++ b/scripts/tests/build_and_copy_engine_artifacts_test.sh
@@ -23,6 +23,9 @@
echo-info 'Testing build_and_copy_engine_artifacts.sh --no-prebuilt-dart-sdk ...'
$FUCHSIA_EMBEDDER_DIR/scripts/build_and_copy_engine_artifacts.sh --no-prebuilt-dart-sdk
+echo-info 'Testing build_and_copy_engine_artifacts.sh --cpu arm64 ...'
+$FUCHSIA_EMBEDDER_DIR/scripts/build_and_copy_engine_artifacts.sh --cpu arm64
+
popd # $FUCHSIA_EMBEDDER_DIR
echo-info 'Testing build_and_copy_engine_artifacts.sh from $HOME ...'
diff --git a/scripts/tests/build_and_run_example_test.sh b/scripts/tests/build_and_run_example_test.sh
index dea3bb6..75c6c72 100755
--- a/scripts/tests/build_and_run_example_test.sh
+++ b/scripts/tests/build_and_run_example_test.sh
@@ -17,28 +17,34 @@
echo-info 'Testing build_and_run_example.sh with no arguments ...'
$FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh
+echo-info 'Testing build_and_run_example.sh --cpu arm64 ...'
+$FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --cpu arm64
+
if [[ -d "${embedder_engine_dir}" ]]
then
- echo-info 'Testing build_and_run_example.sh --with-engine ...'
- $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-engine
+ echo-info 'Testing build_and_run_example.sh --with-engine ...'
+ $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-engine
- echo-info 'Testing build_and_run_example.sh --with-engine --goma ...'
- $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-engine --goma
+ echo-info 'Testing build_and_run_example.sh --with-engine --goma ...'
+ $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-engine --goma
- echo-info 'Testing build_and_run_example.sh --with-engine --goma --no-prebuilt-dart-sdk ...'
- $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-engine --goma --no-prebuilt-dart-sdk
+ echo-info 'Testing build_and_run_example.sh --with-engine --goma --no-prebuilt-dart-sdk ...'
+ $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-engine --goma --no-prebuilt-dart-sdk
+
+ echo-info 'Testing build_and_run_example.sh --with-engine --goma --cpu arm64 ...'
+ $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-engine --goma --cpu arm64
else
- echo-warning "Skipping --with-engine tests because ${embedder_engine_dir} doesn't exist."
- echo-warning "To run these tests, follow the setup from https://fuchsia.googlesource.com/flutter-embedder/+/refs/heads/main/docs/making_engine_changes.md."
+ echo-warning "Skipping --with-engine tests because ${embedder_engine_dir} doesn't exist."
+ echo-warning "To run these tests, follow the setup from https://fuchsia.googlesource.com/flutter-embedder/+/refs/heads/main/docs/making_engine_changes.md."
fi
if ! [ -z "${LOCAL_FUCHSIA_PLATFORM_BUILD}" ]
then
- echo-info 'Testing build_and_run_example.sh --with-fuchsia ...'
- $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-fuchsia
+ echo-info 'Testing build_and_run_example.sh --with-fuchsia ...'
+ $FUCHSIA_EMBEDDER_DIR/scripts/build_and_run_example.sh --with-fuchsia
else
- echo-warning "Skipping --with-fuchsia tests because ${LOCAL_FUCHSIA_PLATFORM_BUILD} isn't set."
- echo-warning "To run these tests, follow the setup from https://fuchsia.googlesource.com/flutter-embedder/+/refs/heads/main/docs/testing_fuchsia_sdk_changes.md."
+ echo-warning "Skipping --with-fuchsia tests because ${LOCAL_FUCHSIA_PLATFORM_BUILD} isn't set."
+ echo-warning "To run these tests, follow the setup from https://fuchsia.googlesource.com/flutter-embedder/+/refs/heads/main/docs/testing_fuchsia_sdk_changes.md."
fi
popd # $FUCHSIA_EMBEDDER_DIR
diff --git a/scripts/update_dependencies.sh b/scripts/update_dependencies.sh
index ef595d1..63eb71c 100755
--- a/scripts/update_dependencies.sh
+++ b/scripts/update_dependencies.sh
@@ -46,7 +46,8 @@
# Then bump Flutter Engine to match Flutter.
"${FUCHSIA_EMBEDDER_DIR}"/scripts/sync_engine_to_revision.sh "$(cat ${FUCHSIA_EMBEDDER_DIR}/third_party/dart-pkg/internal/flutter/flutter/bin/internal/engine.version)"
-"${FUCHSIA_EMBEDDER_DIR}"/scripts/build_and_copy_engine_artifacts.sh ${goma_args}
+"${FUCHSIA_EMBEDDER_DIR}"/scripts/build_and_copy_engine_artifacts.sh ${goma_args} --cpu x64
+"${FUCHSIA_EMBEDDER_DIR}"/scripts/build_and_copy_engine_artifacts.sh ${goma_args} --cpu arm64
# Bump the Embedder's Fuchsia SDK to whatever is the latest version and pray that the
# Engine's Fuchsia SDK is close enough to prevent incompatibility issues.
diff --git a/src/embedder/BUILD.bazel b/src/embedder/BUILD.bazel
index 24d10ed..f6a992a 100644
--- a/src/embedder/BUILD.bazel
+++ b/src/embedder/BUILD.bazel
@@ -39,10 +39,7 @@
visibility = ["//visibility:public"],
deps = [
"//src/embedder/engine:embedder_header",
- # TODO(akbiggs): Enable switching between debug and profile
- # builds of libflutter_engine.so without manually editing this
- # file.
- "//src/embedder/engine/debug_x64:libflutter_engine",
+ "//src/embedder/engine:libflutter_engine_for_platform",
"@rapidjson",
"@fuchsia_sdk//fidl/fuchsia.fonts:fuchsia.fonts_cc",
"@fuchsia_sdk//fidl/fuchsia.sysmem:fuchsia.sysmem_cc",
diff --git a/src/embedder/engine/BUILD.bazel b/src/embedder/engine/BUILD.bazel
index 4615b13..d64ab28 100644
--- a/src/embedder/engine/BUILD.bazel
+++ b/src/embedder/engine/BUILD.bazel
@@ -4,9 +4,51 @@
#
# Artifacts from the Flutter Engine repository: https://github.com/flutter/engine
+load(
+ "@rules_fuchsia//fuchsia:defs.bzl",
+ "fuchsia_package_resource",
+)
+
# ABI-stable interface for the Flutter embedder platform. Copied from the Flutter Engine.
cc_library(
name = "embedder_header",
hdrs = ["embedder.h"],
visibility = ["//src/embedder:__pkg__"],
)
+
+# A debug version of libflutter_engine.so for the build's
+# CPU architecture.
+# TODO(akbiggs): Switch between debug vs. release builds.
+cc_library(
+ name = "libflutter_engine_for_platform",
+ deps = select({
+ ":arm64_cpu": ["//src/embedder/engine/debug_arm64:libflutter_engine"],
+ ":x64_cpu": ["//src/embedder/engine/debug_x64:libflutter_engine"],
+ }),
+ visibility = ["//visibility:public"],
+)
+
+# Package resource to include libflutter_engine.so into a Fuchsia package's
+# libraries.
+#
+# You must include this in your package's dependencies if your package's binary
+# has a dependency on `:libflutter_engine_for_platform`.
+fuchsia_package_resource(
+ name = "libflutter_engine_pkg_resource",
+ src = select({
+ ":arm64_cpu": "//src/embedder/engine/debug_arm64:libflutter_engine.so",
+ ":x64_cpu": "//src/embedder/engine/debug_x64:libflutter_engine.so",
+ }),
+ dest = "lib/libflutter_engine.so",
+ visibility = ["//visibility:public"],
+)
+
+config_setting(
+ name = "arm64_cpu",
+ values = {"cpu": "aarch64"},
+)
+
+config_setting(
+ name = "x64_cpu",
+ values = {"cpu": "x86_64"},
+)
diff --git a/src/embedder/engine/debug_arm64/BUILD.bazel b/src/embedder/engine/debug_arm64/BUILD.bazel
new file mode 100644
index 0000000..b7b998d
--- /dev/null
+++ b/src/embedder/engine/debug_arm64/BUILD.bazel
@@ -0,0 +1,24 @@
+# Copyright 2022 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# Artifacts from the Flutter Engine repository built in
+# debug mode for the x64 architecture: https://github.com/flutter/engine
+
+# Shared library implementing the embedder.h header.
+#
+# TODO(akbiggs): This should come from a CIPD bucket instead.
+cc_library(
+ name = "libflutter_engine",
+ srcs = ["libflutter_engine.so"],
+ visibility = ["//src/embedder/engine:__pkg__"],
+ deps = [
+ "@fuchsia_sdk//pkg/memfs",
+ "@fuchsia_sdk//pkg/vulkan",
+ ],
+)
+
+exports_files(
+ ["libflutter_engine.so"],
+ visibility = ["//src/embedder/engine:__pkg__"],
+)
diff --git a/src/embedder/engine/debug_arm64/libflutter_engine.so b/src/embedder/engine/debug_arm64/libflutter_engine.so
new file mode 100755
index 0000000..4bd7d34
--- /dev/null
+++ b/src/embedder/engine/debug_arm64/libflutter_engine.so
Binary files differ
diff --git a/src/embedder/engine/debug_x64/BUILD.bazel b/src/embedder/engine/debug_x64/BUILD.bazel
index 20d4861..14fbe3f 100644
--- a/src/embedder/engine/debug_x64/BUILD.bazel
+++ b/src/embedder/engine/debug_x64/BUILD.bazel
@@ -16,21 +16,14 @@
cc_library(
name = "libflutter_engine",
srcs = ["libflutter_engine.so"],
- visibility = ["//src/embedder:__pkg__"],
+ visibility = ["//src/embedder/engine:__pkg__"],
deps = [
"@fuchsia_sdk//pkg/memfs",
"@fuchsia_sdk//pkg/vulkan",
],
)
-# Package resource to include libflutter_engine.so into a Fuchsia package's
-# libraries.
-#
-# You must include this in your package's dependencies if your package's binary
-# has a dependency on `:libflutter_engine`.
-fuchsia_package_resource(
- name = "libflutter_engine_pkg_resource",
- src = ":libflutter_engine.so",
- dest = "lib/libflutter_engine.so",
- visibility = ["//visibility:public"],
+exports_files(
+ ["libflutter_engine.so"],
+ visibility = ["//src/embedder/engine:__pkg__"],
)
diff --git a/src/examples/animation_example/BUILD.bazel b/src/examples/animation_example/BUILD.bazel
index 2b94786..bdca6d3 100644
--- a/src/examples/animation_example/BUILD.bazel
+++ b/src/examples/animation_example/BUILD.bazel
@@ -43,9 +43,6 @@
visibility = ["//visibility:public"],
deps = [
":component",
- # TODO(akbiggs): Enable switching between debug/release
- # builds of libflutter_engine.so without manually modifying
- # this file.
- "//src/embedder/engine/debug_x64:libflutter_engine_pkg_resource",
+ "//src/embedder/engine:libflutter_engine_pkg_resource",
],
)
diff --git a/src/examples/hello_dart/BUILD.bazel b/src/examples/hello_dart/BUILD.bazel
index 772531e..7e38c9a 100644
--- a/src/examples/hello_dart/BUILD.bazel
+++ b/src/examples/hello_dart/BUILD.bazel
@@ -39,6 +39,6 @@
visibility = ["//visibility:public"],
deps = [
":component",
- "//src/embedder/engine/debug_x64:libflutter_engine_pkg_resource",
+ "//src/embedder/engine:libflutter_engine_pkg_resource",
],
)
diff --git a/src/examples/hello_flutter/BUILD.bazel b/src/examples/hello_flutter/BUILD.bazel
index 1a335e6..1998550 100644
--- a/src/examples/hello_flutter/BUILD.bazel
+++ b/src/examples/hello_flutter/BUILD.bazel
@@ -40,9 +40,6 @@
visibility = ["//visibility:public"],
deps = [
":component",
- # TODO(akbiggs): Enable switching between debug/release
- # builds of libflutter_engine.so without manually modifying
- # this file.
- "//src/embedder/engine/debug_x64:libflutter_engine_pkg_resource",
+ "//src/embedder/engine:libflutter_engine_pkg_resource",
],
)