# 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/buildflag_header.gni")
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" ]
  }

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

    defines = [ "RUST_CXX_NO_EXCEPTIONS" ]

    if (is_win) {
      defines += [ "CXX_RS_EXPORT=__declspec(dllexport)" ]
    } else {
      defines += [ "CXX_RS_EXPORT=__attribute__((visibility(\"default\")))" ]
    }

    # 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.
    # Normally the Rust stdlib is brought in as a dependency by depending
    # on any first-party Rust target. But in this case, it's conceivable
    # that pure-C++ targets will not depend on any 1p Rust code so we'll add
    # the Rust stdlib explicitly.
    deps = [ ":cxx_rustdeps" ]

    if (use_local_std_by_default) {
      deps += [ "//build/rust/std:link_local_std" ]
    } else {
      assert(prebuilt_libstd_supported,
             "Prebuilt Rust stdlib is not available for this target")
      deps += [ "//build/rust/std:link_prebuilt_std" ]
    }
  }

  # The required dependencies for cxx-generated bindings, that must be included
  # on the Rust side.
  group("cxx_rustdeps") {
    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" ]
}