| # Copyright 2021 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/components.gni") |
| import("//build/rust/rustc_binary.gni") |
| import("//build/testing/host_test.gni") |
| import("//build/testing/host_test_data.gni") |
| import("//src/lib/fuchsia-cxx/rust_cxx_ffi_library.gni") |
| |
| # The 'rust_cxx_ffi_library' template is the core of using cxx on Fuchsia. It generates C++ sources |
| # as needed from the specified `bridge_sources`, defines a Rust library target, and produces a final |
| # `source_set` target that includes this Rust library and any additional `cpp_sources` provided. |
| # |
| # As demonstrated below, other Rust or C++ targets can depend directly on a `rust_cxx_ffi_library` |
| # target to make use of it. |
| # |
| # See rust_cxx_ffi_library.gni for more information. |
| rust_cxx_ffi_library("example_blobstore") { |
| rust_source_root = "src/lib.rs" |
| rust_sources = [ "src/lib.rs" ] |
| |
| # This should include the subset of rust_sources that include a #[cxx::bridge] module. |
| bridge_sources = [ "src/lib.rs" ] |
| |
| cpp_sources = [ |
| "blobstore.h", |
| "src/blobstore.cc", |
| ] |
| } |
| |
| cpp_binary = "cxx_basic_example_cpp_binary" |
| executable("cpp_binary") { |
| output_name = cpp_binary |
| sources = [ "main.cc" ] |
| deps = [ ":example_blobstore" ] |
| } |
| |
| rust_binary = "cxx_basic_example_rust_binary" |
| rustc_binary("rust_binary") { |
| edition = "2021" |
| output_name = rust_binary |
| source_root = "main.rs" |
| sources = [ "main.rs" ] |
| deps = [ ":example_blobstore" ] |
| |
| # TODO(fxbug.dev/92670): .o path has redundant output-dir |
| configs += [ "//build/config/rust:output_dir_sensitive" ] |
| } |
| |
| # Unit tests that accompany the Rust sources used in the rust_cxx_ffi_library() target above can be |
| # built simply using a rustc_test() target. |
| rustc_test("example_blobstore_test_bin") { |
| edition = "2021" |
| name = "example_blobstore_test" |
| sources = [ "src/lib.rs" ] |
| deps = [ |
| ":example_blobstore", |
| "//third_party/rust_crates:cxx", |
| ] |
| } |
| |
| fuchsia_unittest_package("example_blobstore_test") { |
| deps = [ ":example_blobstore_test_bin" ] |
| } |
| |
| # The rest of this is to test the example and prevent bitrot, not part of general cxx usage. |
| # |
| # The test below runs on both host and target, which also serves to test cxx usage on both since the |
| # toolchains and build configs differ significantly. |
| |
| group("tests") { |
| testonly = true |
| deps = [ |
| ":cxx_basic_example_test", |
| ":cxx_basic_example_test($host_toolchain)", |
| ":example_blobstore_test", |
| ] |
| } |
| |
| rustc_binary("run_and_compare_output") { |
| edition = "2021" |
| source_root = "run_and_compare_output.rs" |
| sources = [ source_root ] |
| } |
| |
| if (current_toolchain == host_toolchain) { |
| cpp_binary_target = ":cpp_binary($host_toolchain)" |
| rust_binary_target = ":rust_binary($host_toolchain)" |
| test_data_dir = "$root_out_dir/test_data/cxx_basic_example_test_data" |
| |
| host_test_data("cxx_basic_example_test_data") { |
| sources = [ |
| get_label_info(cpp_binary_target, "root_out_dir") + "/" + cpp_binary, |
| get_label_info(rust_binary_target, "root_out_dir") + "/" + rust_binary, |
| ] |
| outputs = [ "$test_data_dir/{{source_file_part}}" ] |
| deps = [ |
| cpp_binary_target, |
| rust_binary_target, |
| ] |
| } |
| |
| host_test("cxx_basic_example_test") { |
| binary_path = "$root_out_dir/run_and_compare_output" |
| args = [ |
| rebase_path("$test_data_dir/" + cpp_binary, root_build_dir), |
| rebase_path("$test_data_dir/" + rust_binary, root_build_dir), |
| ] |
| deps = [ |
| ":cxx_basic_example_test_data", |
| ":run_and_compare_output", |
| ] |
| } |
| } else { |
| fuchsia_unittest_package("cxx_basic_example_test") { |
| manifest = "meta/cxx_basic_example_test.cml" |
| deps = [ |
| ":cpp_binary", |
| ":run_and_compare_output", |
| ":rust_binary", |
| ] |
| } |
| } |