| # Copyright 2018 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. |
| |
| import("//build/package.gni") |
| import("//build/rust/rustc_binary.gni") |
| import("//build/rust/rustc_library.gni") |
| import("//build/rust/rustc_test.gni") |
| import("//build/test/test_package.gni") |
| import("//src/lib/vulkan/layers.gni") |
| import("//src/sys/build/components.gni") |
| |
| declare_args() { |
| # Include the vulkan validation layers in carnelian examples. |
| carnelian_enable_vulkan_validation = is_debug |
| } |
| |
| rustc_library("carnelian") { |
| name = "carnelian" |
| with_unit_tests = true |
| version = "0.1.0" |
| edition = "2018" |
| deps = [ |
| "//sdk/fidl/fuchsia.fonts:fuchsia.fonts-rustc", |
| "//sdk/fidl/fuchsia.hardware.input:fuchsia.hardware.input-rustc", |
| "//sdk/fidl/fuchsia.images:fuchsia.images-rustc", |
| "//sdk/fidl/fuchsia.input:fuchsia.input-rustc", |
| "//sdk/fidl/fuchsia.input.report:fuchsia.input.report-rustc", |
| "//sdk/fidl/fuchsia.math:fuchsia.math-rustc", |
| "//sdk/fidl/fuchsia.mem:fuchsia.mem-rustc", |
| "//sdk/fidl/fuchsia.scenic.scheduling:fuchsia.scenic.scheduling-rustc", |
| "//sdk/fidl/fuchsia.sysmem:fuchsia.sysmem-rustc", |
| "//sdk/fidl/fuchsia.ui.app:fuchsia.ui.app-rustc", |
| "//sdk/fidl/fuchsia.ui.gfx:fuchsia.ui.gfx-rustc", |
| "//sdk/fidl/fuchsia.ui.input:fuchsia.ui.input-rustc", |
| "//sdk/fidl/fuchsia.ui.input2:fuchsia.ui.input2-rustc", |
| "//sdk/fidl/fuchsia.ui.input3:fuchsia.ui.input3-rustc", |
| "//sdk/fidl/fuchsia.ui.policy:fuchsia.ui.policy-rustc", |
| "//sdk/fidl/fuchsia.ui.scenic:fuchsia.ui.scenic-rustc", |
| "//sdk/fidl/fuchsia.ui.views:fuchsia.ui.views-rustc", |
| "//src/graphics/lib/compute/mold", |
| "//src/graphics/lib/compute/spinel-rs-sys", |
| "//src/lib/diagnostics/inspect/rust", |
| "//src/lib/fdio/rust:fdio", |
| "//src/lib/fidl/rust/fidl", |
| "//src/lib/fuchsia-async", |
| "//src/lib/fuchsia-component", |
| "//src/lib/fuchsia-runtime", |
| "//src/lib/mapped-vmo", |
| "//src/lib/syslog/rust:syslog", |
| "//src/lib/trace/rust:trace", |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/fuchsia-framebuffer", |
| "//src/lib/ui/fuchsia-scenic", |
| "//src/lib/ui/input-synthesis", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//src/lib/zircon/rust:fuchsia-zircon-sys", |
| "//src/testing/fidl:placeholders-rustc", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:async-trait", |
| "//third_party/rust_crates:chrono", |
| "//third_party/rust_crates:euclid", |
| "//third_party/rust_crates:futures", |
| "//third_party/rust_crates:itertools", |
| "//third_party/rust_crates:lazy_static", |
| "//third_party/rust_crates:lipsum", |
| "//third_party/rust_crates:png", |
| "//third_party/rust_crates:rand", |
| "//third_party/rust_crates:smallvec", |
| "//third_party/rust_crates:ttf-parser", |
| "//third_party/rust_crates:vk-sys", |
| ] |
| |
| non_rust_deps = [ |
| "//src/graphics/lib/compute/common", |
| "//src/graphics/lib/compute/common/vk", |
| "//src/graphics/lib/compute/hotsort/platforms/vk", |
| "//src/graphics/lib/compute/spinel", |
| "//src/graphics/lib/compute/spinel/platforms/vk", |
| "//src/graphics/lib/compute/spinel/platforms/vk:vk_find_target", |
| ] |
| |
| sources = [ |
| "src/app.rs", |
| "src/app/strategies.rs", |
| "src/app/strategies/base.rs", |
| "src/app/strategies/framebuffer.rs", |
| "src/app/strategies/scenic.rs", |
| "src/color.rs", |
| "src/drawing.rs", |
| "src/facet.rs", |
| "src/geometry.rs", |
| "src/input.rs", |
| "src/input_ext.rs", |
| "src/lib.rs", |
| "src/message.rs", |
| "src/render/dynamic.rs", |
| "src/render/generic/mod.rs", |
| "src/render/generic/mold/composition.rs", |
| "src/render/generic/mold/context.rs", |
| "src/render/generic/mold/image.rs", |
| "src/render/generic/mold/mod.rs", |
| "src/render/generic/mold/path.rs", |
| "src/render/generic/mold/raster.rs", |
| "src/render/generic/spinel/composition.rs", |
| "src/render/generic/spinel/context.rs", |
| "src/render/generic/spinel/image.rs", |
| "src/render/generic/spinel/mod.rs", |
| "src/render/generic/spinel/path.rs", |
| "src/render/generic/spinel/raster.rs", |
| "src/render/mod.rs", |
| "src/render/shed.rs", |
| "src/view.rs", |
| "src/view/strategies.rs", |
| "src/view/strategies/base.rs", |
| "src/view/strategies/framebuffer.rs", |
| "src/view/strategies/scenic.rs", |
| ] |
| |
| inputs = [ "//prebuilt/third_party/fonts/robotoslab/RobotoSlab-Regular.ttf" ] |
| |
| if (carnelian_enable_vulkan_validation) { |
| features = [ "vulkan-validation" ] |
| } |
| } |
| |
| rustc_binary("button") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/button.rs" |
| sources = [ "examples/button.rs" ] |
| deps = [ |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:euclid", |
| ] |
| } |
| |
| rustc_binary("clockface") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/clockface.rs" |
| sources = [ "examples/clockface.rs" ] |
| deps = [ |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:chrono", |
| "//third_party/rust_crates:euclid", |
| ] |
| } |
| |
| rustc_binary("font_metrics") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/font_metrics.rs" |
| sources = [ "examples/font_metrics.rs" ] |
| deps = [ |
| "//src/lib/fdio/rust:fdio", |
| "//src/lib/fuchsia-runtime", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:euclid", |
| "//third_party/rust_crates:lipsum", |
| ] |
| } |
| |
| rustc_binary("infinite_scroll") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/infinite_scroll.rs" |
| sources = [ "examples/infinite_scroll.rs" ] |
| deps = [ |
| "//src/lib/trace/rust:trace", |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:chrono", |
| "//third_party/rust_crates:euclid", |
| "//third_party/rust_crates:lazy_static", |
| "//third_party/rust_crates:lipsum", |
| "//third_party/rust_crates:rand", |
| ] |
| } |
| |
| rustc_binary("ink") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/ink.rs" |
| sources = [ "examples/ink.rs" ] |
| deps = [ |
| "//sdk/fidl/fuchsia.hardware.input:fuchsia.hardware.input-rustc", |
| "//src/lib/fdio/rust:fdio", |
| "//src/lib/trace/rust:trace", |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:euclid", |
| "//third_party/rust_crates:itertools", |
| "//third_party/rust_crates:rand", |
| ] |
| } |
| |
| rustc_binary("shapes") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/shapes.rs" |
| sources = [ "examples/shapes.rs" ] |
| deps = [ |
| "//src/lib/trace/rust:trace", |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:euclid", |
| "//third_party/rust_crates:rand", |
| ] |
| } |
| |
| rustc_binary("spinning_square") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/spinning_square.rs" |
| sources = [ "examples/spinning_square.rs" ] |
| deps = [ |
| "//src/lib/fidl/rust/fidl", |
| "//src/lib/fuchsia-async", |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//src/testing/fidl:placeholders-rustc", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:euclid", |
| "//third_party/rust_crates:futures", |
| ] |
| } |
| |
| rustc_binary("gamma") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/gamma.rs" |
| sources = [ "examples/gamma.rs" ] |
| deps = [ |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:euclid", |
| ] |
| } |
| |
| rustc_binary("png") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/png.rs" |
| sources = [ "examples/png.rs" ] |
| deps = [ |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:euclid", |
| "//third_party/rust_crates:png", |
| ] |
| } |
| |
| rustc_binary("svg") { |
| version = "0.1.0" |
| edition = "2018" |
| source_root = "examples/svg.rs" |
| sources = [ "examples/svg.rs" ] |
| deps = [ |
| "//src/lib/trace/rust:trace-provider", |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| "//third_party/rust_crates:argh", |
| "//third_party/rust_crates:euclid", |
| ] |
| } |
| |
| test_package("carnelian-render-tests") { |
| deps = [ ":carnelian_test" ] |
| |
| tests = [ |
| { |
| name = "carnelian_lib_test" |
| environments = basic_envs |
| }, |
| ] |
| |
| public_deps = vulkan_validation_layers.public_deps |
| loadable_modules = vulkan_validation_layers.loadable_modules |
| resources = vulkan_validation_layers.resources |
| } |
| |
| test_package("carnelian-tests") { |
| deps = [ ":carnelian_test" ] |
| |
| tests = [ |
| { |
| name = "carnelian_lib_test" |
| environments = basic_envs |
| }, |
| ] |
| } |
| |
| rustc_binary("carnelian_integration_test_bin") { |
| name = "carnelian_integration_test" |
| edition = "2018" |
| source_root = "tests/carnelian_integration_test.rs" |
| sources = [ "tests/carnelian_integration_test.rs" ] |
| deps = [ |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| ] |
| } |
| |
| fuchsia_component("carnelian-integration-test-component") { |
| testonly = true |
| manifest = "meta/carnelian_integration_test.cmx" |
| deps = [ ":carnelian_integration_test_bin" ] |
| } |
| |
| fuchsia_test_package("carnelian-integration-test") { |
| test_components = [ ":carnelian-integration-test-component" ] |
| deps = [ ":carnelian-integration-test-component" ] |
| test_specs = { |
| environments = [ nuc_env ] |
| } |
| } |
| |
| rustc_binary("carnelian_fb_integration_test_bin") { |
| name = "carnelian_fb_integration_test" |
| edition = "2018" |
| source_root = "tests/carnelian_integration_test.rs" |
| sources = [ "tests/carnelian_integration_test.rs" ] |
| deps = [ |
| "//src/lib/ui/carnelian", |
| "//src/lib/zircon/rust:fuchsia-zircon", |
| "//third_party/rust_crates:anyhow", |
| ] |
| } |
| |
| fuchsia_component("carnelian-fb-integration-test-component") { |
| testonly = true |
| manifest = "meta/carnelian_fb_integration_test.cmx" |
| deps = [ ":carnelian_fb_integration_test_bin" ] |
| } |
| |
| fuchsia_test_package("carnelian-fb-integration-test") { |
| test_components = [ ":carnelian-fb-integration-test-component" ] |
| deps = [ ":carnelian-fb-integration-test-component" ] |
| test_specs = { |
| environments = [ nuc_env ] |
| } |
| } |
| |
| resource("robotoslab") { |
| sources = [ "//prebuilt/third_party/fonts/robotoslab/RobotoSlab-Regular.ttf" ] |
| outputs = [ "data/fonts/{{source_file_part}}" ] |
| } |
| |
| resource("quintessential") { |
| sources = [ |
| "//prebuilt/third_party/fonts/quintessential/Quintessential-Regular.ttf", |
| ] |
| outputs = [ "data/fonts/{{source_file_part}}" ] |
| } |
| |
| resource("droidserif") { |
| sources = [ "//prebuilt/third_party/fonts/droidserif/DroidSerif-Regular.ttf" ] |
| outputs = [ "data/fonts/{{source_file_part}}" ] |
| } |
| |
| resource("shortstack") { |
| sources = [ "//prebuilt/third_party/fonts/shortstack/ShortStack-Regular.ttf" ] |
| outputs = [ "data/fonts/{{source_file_part}}" ] |
| } |
| |
| resource("roboto") { |
| sources = [ "//prebuilt/third_party/fonts/roboto/Roboto-Regular.ttf" ] |
| outputs = [ "data/fonts/{{source_file_part}}" ] |
| } |
| |
| resource("static_images") { |
| sources = [ |
| "examples/static/baboon.png", |
| "examples/static/cross.png", |
| "examples/static/lenna.png", |
| ] |
| outputs = [ "data/static/{{source_file_part}}" ] |
| } |
| |
| resource("static_sheds") { |
| sources = [ "examples/static/fuchsia.shed" ] |
| outputs = [ "data/static/{{source_file_part}}" ] |
| } |
| |
| resource("shaders") { |
| sources = [ |
| "src/render/shaders/copy.comp.spv", |
| "src/render/shaders/motioncopy-srgb.comp.spv", |
| "src/render/shaders/motioncopy-unorm.comp.spv", |
| ] |
| outputs = [ "data/shaders/{{source_file_part}}" ] |
| } |
| |
| # A custom template for carnelian examples to support |
| # dynamic enabling of the vulkan validation layers |
| template("carnelian_example") { |
| example_deps = invoker.deps |
| if (carnelian_enable_vulkan_validation) { |
| example_deps += [ "//src/lib/vulkan:validation-layers" ] |
| } |
| fuchsia_package_with_single_component(target_name) { |
| forward_variables_from(invoker, [ "manifest" ]) |
| visibility = [ ":*" ] |
| deps = example_deps |
| } |
| } |
| |
| # To add an example to the build, add its name |
| # and any addition dependencies like fonts or static image |
| # assets to the list below. |
| carnelian_examples = [ |
| { |
| name = "button" |
| additional_deps = [ ":robotoslab" ] |
| }, |
| { |
| name = "clockface" |
| }, |
| { |
| name = "font_metrics" |
| additional_deps = [ |
| ":droidserif", |
| ":quintessential", |
| ":roboto", |
| ":robotoslab", |
| ":shortstack", |
| ] |
| }, |
| { |
| name = "gamma" |
| }, |
| { |
| name = "infinite_scroll" |
| additional_deps = [ |
| ":robotoslab", |
| ":shaders", |
| ] |
| }, |
| { |
| name = "ink" |
| }, |
| { |
| name = "png" |
| additional_deps = [ ":static_images" ] |
| }, |
| { |
| name = "shapes" |
| }, |
| { |
| name = "spinning_square" |
| }, |
| { |
| name = "svg" |
| additional_deps = [ ":static_sheds" ] |
| }, |
| ] |
| |
| # List for populating the examples group below |
| carnelian_examples_deps = [] |
| |
| # Rebased path to the example shard |
| carnelian_example_manifest_include = rebase_path("meta/example.shard.cmx") |
| |
| foreach(carnelian_example_details, carnelian_examples) { |
| carnelian_example_package_name = |
| string_replace(carnelian_example_details.name, "_", "-") + "-rs" |
| carnelian_example_manifest_label = |
| "generate_${carnelian_example_details.name}_cmx" |
| carnelian_example_manifest_path = |
| "${target_gen_dir}/${carnelian_example_package_name}.cmx" |
| |
| # Generate a manifest file for the example |
| # that has the name of the binary but otherwise |
| # just depends on the example.shard.cmx for needed |
| # content |
| generated_file(carnelian_example_manifest_label) { |
| visibility = [ ":*" ] |
| |
| outputs = [ carnelian_example_manifest_path ] |
| output_conversion = "json" |
| contents = { |
| include = [ carnelian_example_manifest_include ] |
| program = { |
| binary = "bin/${carnelian_example_details.name}" |
| } |
| } |
| } |
| |
| # Use the carnelian_example template to create a target |
| # for the example |
| carnelian_example(carnelian_example_package_name) { |
| manifest = rebase_path(carnelian_example_manifest_path) |
| deps = [ |
| ":" + carnelian_example_details.name, |
| ":${carnelian_example_manifest_label}", |
| ] |
| if (defined(carnelian_example_details.additional_deps)) { |
| deps += carnelian_example_details.additional_deps |
| } |
| } |
| carnelian_examples_deps += |
| [ "//src/lib/ui/carnelian:" + carnelian_example_package_name ] |
| } |
| |
| group("examples") { |
| public_deps = carnelian_examples_deps |
| } |