blob: 18e7f1689066700a5edcba6c9248d7d4714f91b0 [file] [log] [blame]
# 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
}