1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109

build / rust / BUILD.gn [blame]

# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/rust.gni")

if (toolchain_has_rust) {
  config("edition_2021") {
    rustflags = [ "--edition=2021" ]
  }

  config("edition_2018") {
    rustflags = [ "--edition=2018" ]
  }

  config("edition_2015") {
    rustflags = [ "--edition=2015" ]
  }

  if (enable_rust_cxx) {
    import("//build/rust/cxx_version.gni")

    config("cxx_include_path") {
      defines = [ "CR_CXX_INCLUDE=\"third_party/rust/chromium_crates_io/vendor/cxx-${cxx_version}/include/cxx.h\"" ]
    }

    # The required dependencies for cxx-generated bindings, that must be included
    # on the C++ side.
    static_library("cxx_cppdeps") {
      sources = [
        "//third_party/rust/chromium_crates_io/vendor/cxx-${cxx_version}/include/cxx.h",
        "//third_party/rust/chromium_crates_io/vendor/cxx-${cxx_version}/src/cxx.cc",

        # Our version-independent forwarding header, which we patch cxx.cc to
        # use since we want it to use an absolute path for its include.
        "//third_party/rust/cxx/v1/cxx.h",
      ]

      defines = [ "RUST_CXX_NO_EXCEPTIONS" ]
      public_configs = [ ":cxx_include_path" ]

      # We cannot depend on base/base_export.h because base depends on us.
      if (is_component_build) {
        if (is_win) {
          defines += [ "CXX_RS_EXPORT=__declspec(dllexport)" ]
        } else {
          defines +=
              [ "CXX_RS_EXPORT=__attribute__((visibility(\"default\")))" ]
        }
      } else {
        defines += [ "CXX_RS_EXPORT=" ]
      }

      deps = [
        # Depending on the C++ bindings side of cxx then requires also depending
        # on the Rust bindings, since one calls the other. And the Rust bindings
        # require the Rust standard library.
        ":cxx_rustdeps",
      ]
    }

    group("cxx_rustdeps") {
      # The required dependencies for cxx-generated bindings, that must be
      # included on the Rust side.
      public_deps = [ "//third_party/rust/cxx/v1:lib" ]
    }
  }
}

# Enables code behind #[cfg(test)]. This should only be used for targets where
# testonly=true.
config("test") {
  rustflags = [
    "--cfg",
    "test",
  ]
}

# TODO(crbug.com/gn/104): GN rust_proc_macro targets are missing this
# command line flag, for the proc_macro crate which is provided by rustc for
# compiling proc-macros.
config("proc_macro_extern") {
  rustflags = [
    "--extern",
    "proc_macro",
  ]
}

# Forbids unsafe code in crates with this config.
config("forbid_unsafe") {
  rustflags = [ "-Funsafe_code" ]
}

config("panic_immediate_abort") {
  visibility = [ "//build/rust/std/rules:*" ]
  if (is_official_build) {
    rustflags = [
      "--cfg",
      "feature=\"panic_immediate_abort\"",
    ]
  }
}

config("is_gtest_unittests") {
  rustflags = [
    "--cfg",
    "is_gtest_unittests",
  ]
}