| // Copyright 2019 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef TOOLS_GN_RUST_TARGET_VALUES_H_ | |
| #define TOOLS_GN_RUST_TARGET_VALUES_H_ | |
| #include <map> | |
| #include "base/containers/flat_map.h" | |
| #include "gn/label.h" | |
| #include "gn/source_file.h" | |
| class Target; | |
| // Holds the values (outputs, args, script name, etc.) for either an action or | |
| // an action_foreach target. | |
| class RustValues { | |
| public: | |
| RustValues(); | |
| ~RustValues(); | |
| // Library crate types. | |
| // | |
| // The default value CRATE_AUTO means the type should be deduced from the | |
| // target type (see InferredCrateType() below). | |
| // | |
| // Shared library crate types must be specified explicitly, all other target | |
| // types can be deduced. | |
| enum CrateType { | |
| CRATE_AUTO = 0, | |
| CRATE_BIN, | |
| CRATE_CDYLIB, | |
| CRATE_DYLIB, | |
| CRATE_PROC_MACRO, | |
| CRATE_RLIB, | |
| CRATE_STATICLIB, | |
| }; | |
| // Name of this crate. | |
| std::string& crate_name() { return crate_name_; } | |
| const std::string& crate_name() const { return crate_name_; } | |
| // Main source file for this crate. | |
| const SourceFile& crate_root() const { return crate_root_; } | |
| void set_crate_root(SourceFile& s) { crate_root_ = s; } | |
| // Crate type for compilation. | |
| CrateType crate_type() const { return crate_type_; } | |
| void set_crate_type(CrateType s) { crate_type_ = s; } | |
| // Same as crate_type(), except attempt to resolve CRATE_AUTO based on the | |
| // target type. | |
| // | |
| // Dylib and cdylib targets should call set_crate_type(CRATE_[C]DYLIB) | |
| // explicitly to resolve ambiguity. For shared libraries, this assumes | |
| // CRATE_DYLIB by default. | |
| // | |
| // For unsupported target types and targets without Rust sources, | |
| // returns CRATE_AUTO. | |
| static CrateType InferredCrateType(const Target* target); | |
| // Returns whether this target is a Rust rlib, dylib, or proc macro. | |
| // | |
| // Notably, this does not include staticlib or cdylib targets that have Rust | |
| // source, because they look like native libraries to the Rust compiler. | |
| // | |
| // It does include proc_macro targets, which are sometimes a special case. | |
| // (TODO: Should it?) | |
| static bool IsRustLibrary(const Target* target); | |
| // Any renamed dependencies for the `extern` flags. | |
| const std::map<Label, std::string>& aliased_deps() const { | |
| return aliased_deps_; | |
| } | |
| std::map<Label, std::string>& aliased_deps() { return aliased_deps_; } | |
| private: | |
| std::string crate_name_; | |
| SourceFile crate_root_; | |
| CrateType crate_type_ = CRATE_AUTO; | |
| std::map<Label, std::string> aliased_deps_; | |
| RustValues(const RustValues&) = delete; | |
| RustValues& operator=(const RustValues&) = delete; | |
| }; | |
| #endif // TOOLS_GN_RUST_TARGET_VALUES_H_ |