tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

BUILD.gn (2314B)


      1 # Copyright 2023 The Chromium Authors
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import("//chromium/build/config/rust.gni")
      6 import("//chromium/build/rust/cargo_crate.gni")
      7 import("//chromium/build/rust/rust_executable.gni")
      8 import("//chromium/build/rust/rust_static_library.gni")
      9 import("//chromium/build/rust/rust_unit_test.gni")
     10 
     11 # This target depends on two variants of the same crate: one directly, and one
     12 # transitively. With correct metadata handling, this will work.
     13 rust_static_library("lib") {
     14   crate_root = "lib.rs"
     15   sources = [ "lib.rs" ]
     16   deps = [
     17     ":foo_dependency",
     18     ":transitive_dep_2",
     19   ]
     20 
     21   # Depending on the other variant directly will fail, as expected. rustc
     22   # gives
     23   #
     24   #   error[E0464]: multiple candidates for `rlib` dependency `transitive_dep`
     25   #   found
     26   #
     27   # deps += [":transitive_dep_1"]
     28 
     29   # We also test this in a C++ binary, so we want a #[no_mangle] fn. This is
     30   # considered unsafe.
     31   allow_unsafe = true
     32 }
     33 
     34 if (can_build_rust_unit_tests) {
     35   # Tests that the different variants return the expected strings.
     36   rust_unit_test("test_rust_metadata_unittests") {
     37     crate_root = "tests.rs"
     38     sources = [ "tests.rs" ]
     39     deps = [ ":lib" ]
     40   }
     41 }
     42 
     43 rust_executable("test_rust_metadata_exe") {
     44   crate_root = "main.rs"
     45   sources = [ "main.rs" ]
     46   deps = [ ":lib" ]
     47 }
     48 
     49 # Check that the metadata handling works when linking into a C++ binary too.
     50 executable("test_rust_metadata_cc_exe") {
     51   sources = [ "main.cc" ]
     52   deps = [ ":lib" ]
     53 }
     54 
     55 # A source file whose behavior depends on cfg options.
     56 cargo_crate("transitive_dep_1") {
     57   crate_name = "transitive_dep"
     58   crate_root = "transitive_dep.rs"
     59   sources = [ "transitive_dep.rs" ]
     60 
     61   rustc_metadata = "foo"
     62 }
     63 
     64 # Build the same source again, but with a feature enabled. The metadata should
     65 # disambiguate the symbols when linking.
     66 cargo_crate("transitive_dep_2") {
     67   crate_name = "transitive_dep"
     68   crate_root = "transitive_dep.rs"
     69   sources = [ "transitive_dep.rs" ]
     70 
     71   rustc_metadata = "bar"
     72   features = [ "bar_feature" ]
     73 }
     74 
     75 # Include one version transitively, since otherwise the names in Rust will
     76 # conflict.
     77 rust_static_library("foo_dependency") {
     78   crate_root = "foo_dependency.rs"
     79   sources = [ "foo_dependency.rs" ]
     80   deps = [ ":transitive_dep_1" ]
     81 }