xref: /aosp_15_r20/development/tools/cargo_embargo/src/cargo.rs (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker // Copyright (C) 2023 The Android Open Source Project
2*90c8c64dSAndroid Build Coastguard Worker //
3*90c8c64dSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*90c8c64dSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*90c8c64dSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*90c8c64dSAndroid Build Coastguard Worker //
7*90c8c64dSAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*90c8c64dSAndroid Build Coastguard Worker //
9*90c8c64dSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*90c8c64dSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*90c8c64dSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*90c8c64dSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*90c8c64dSAndroid Build Coastguard Worker // limitations under the License.
14*90c8c64dSAndroid Build Coastguard Worker 
15*90c8c64dSAndroid Build Coastguard Worker //! Types and functions for parsing the output of cargo.
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker pub mod cargo_out;
18*90c8c64dSAndroid Build Coastguard Worker pub mod metadata;
19*90c8c64dSAndroid Build Coastguard Worker 
20*90c8c64dSAndroid Build Coastguard Worker use serde::{Deserialize, Serialize};
21*90c8c64dSAndroid Build Coastguard Worker use std::path::PathBuf;
22*90c8c64dSAndroid Build Coastguard Worker 
23*90c8c64dSAndroid Build Coastguard Worker /// Combined representation of --crate-type and --test flags.
24*90c8c64dSAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
25*90c8c64dSAndroid Build Coastguard Worker #[serde[rename_all = "lowercase"]]
26*90c8c64dSAndroid Build Coastguard Worker pub enum CrateType {
27*90c8c64dSAndroid Build Coastguard Worker     // --crate-type types
28*90c8c64dSAndroid Build Coastguard Worker     Bin,
29*90c8c64dSAndroid Build Coastguard Worker     Lib,
30*90c8c64dSAndroid Build Coastguard Worker     RLib,
31*90c8c64dSAndroid Build Coastguard Worker     DyLib,
32*90c8c64dSAndroid Build Coastguard Worker     CDyLib,
33*90c8c64dSAndroid Build Coastguard Worker     StaticLib,
34*90c8c64dSAndroid Build Coastguard Worker     #[serde(rename = "proc-macro")]
35*90c8c64dSAndroid Build Coastguard Worker     ProcMacro,
36*90c8c64dSAndroid Build Coastguard Worker     // --test
37*90c8c64dSAndroid Build Coastguard Worker     Test,
38*90c8c64dSAndroid Build Coastguard Worker     // "--cfg test" without --test. (Assume it is a test with the harness disabled.
39*90c8c64dSAndroid Build Coastguard Worker     TestNoHarness,
40*90c8c64dSAndroid Build Coastguard Worker }
41*90c8c64dSAndroid Build Coastguard Worker 
42*90c8c64dSAndroid Build Coastguard Worker impl CrateType {
from_str(s: &str) -> CrateType43*90c8c64dSAndroid Build Coastguard Worker     fn from_str(s: &str) -> CrateType {
44*90c8c64dSAndroid Build Coastguard Worker         match s {
45*90c8c64dSAndroid Build Coastguard Worker             "bin" => CrateType::Bin,
46*90c8c64dSAndroid Build Coastguard Worker             "lib" => CrateType::Lib,
47*90c8c64dSAndroid Build Coastguard Worker             "rlib" => CrateType::RLib,
48*90c8c64dSAndroid Build Coastguard Worker             "dylib" => CrateType::DyLib,
49*90c8c64dSAndroid Build Coastguard Worker             "cdylib" => CrateType::CDyLib,
50*90c8c64dSAndroid Build Coastguard Worker             "staticlib" => CrateType::StaticLib,
51*90c8c64dSAndroid Build Coastguard Worker             "proc-macro" => CrateType::ProcMacro,
52*90c8c64dSAndroid Build Coastguard Worker             _ => panic!("unexpected --crate-type: {}", s),
53*90c8c64dSAndroid Build Coastguard Worker         }
54*90c8c64dSAndroid Build Coastguard Worker     }
55*90c8c64dSAndroid Build Coastguard Worker }
56*90c8c64dSAndroid Build Coastguard Worker 
57*90c8c64dSAndroid Build Coastguard Worker impl CrateType {
58*90c8c64dSAndroid Build Coastguard Worker     /// Returns whether the crate type is a kind of library.
is_library(self) -> bool59*90c8c64dSAndroid Build Coastguard Worker     pub fn is_library(self) -> bool {
60*90c8c64dSAndroid Build Coastguard Worker         matches!(self, Self::Lib | Self::RLib | Self::DyLib | Self::CDyLib | Self::StaticLib)
61*90c8c64dSAndroid Build Coastguard Worker     }
62*90c8c64dSAndroid Build Coastguard Worker 
63*90c8c64dSAndroid Build Coastguard Worker     /// Returns whether the crate type is a kind of test.
is_test(self) -> bool64*90c8c64dSAndroid Build Coastguard Worker     pub fn is_test(self) -> bool {
65*90c8c64dSAndroid Build Coastguard Worker         matches!(self, Self::Test | Self::TestNoHarness)
66*90c8c64dSAndroid Build Coastguard Worker     }
67*90c8c64dSAndroid Build Coastguard Worker 
68*90c8c64dSAndroid Build Coastguard Worker     /// Returns whether the crate type is a kind of C ABI library.
is_c_library(self) -> bool69*90c8c64dSAndroid Build Coastguard Worker     pub fn is_c_library(self) -> bool {
70*90c8c64dSAndroid Build Coastguard Worker         matches!(self, Self::CDyLib | Self::StaticLib)
71*90c8c64dSAndroid Build Coastguard Worker     }
72*90c8c64dSAndroid Build Coastguard Worker }
73*90c8c64dSAndroid Build Coastguard Worker 
74*90c8c64dSAndroid Build Coastguard Worker /// Info extracted from `CargoOut` for a crate.
75*90c8c64dSAndroid Build Coastguard Worker ///
76*90c8c64dSAndroid Build Coastguard Worker /// Note that there is a 1-to-many relationship between a Cargo.toml file and these `Crate`
77*90c8c64dSAndroid Build Coastguard Worker /// objects. For example, a Cargo.toml file might have a bin, a lib, and various tests. Each of
78*90c8c64dSAndroid Build Coastguard Worker /// those will be a separate `Crate`. All of them will have the same `package_name`.
79*90c8c64dSAndroid Build Coastguard Worker #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
80*90c8c64dSAndroid Build Coastguard Worker pub struct Crate {
81*90c8c64dSAndroid Build Coastguard Worker     pub name: String,
82*90c8c64dSAndroid Build Coastguard Worker     pub package_name: String,
83*90c8c64dSAndroid Build Coastguard Worker     pub version: Option<String>,
84*90c8c64dSAndroid Build Coastguard Worker     pub types: Vec<CrateType>,
85*90c8c64dSAndroid Build Coastguard Worker     pub target: Option<String>, // --target
86*90c8c64dSAndroid Build Coastguard Worker     pub features: Vec<String>,  // --cfg feature=
87*90c8c64dSAndroid Build Coastguard Worker     pub cfgs: Vec<String>,      // non-feature --cfg
88*90c8c64dSAndroid Build Coastguard Worker     pub externs: Vec<Extern>,
89*90c8c64dSAndroid Build Coastguard Worker     pub codegens: Vec<String>, // -C
90*90c8c64dSAndroid Build Coastguard Worker     pub cap_lints: String,
91*90c8c64dSAndroid Build Coastguard Worker     pub static_libs: Vec<String>,
92*90c8c64dSAndroid Build Coastguard Worker     pub shared_libs: Vec<String>,
93*90c8c64dSAndroid Build Coastguard Worker     pub edition: String,
94*90c8c64dSAndroid Build Coastguard Worker     pub package_dir: PathBuf, // canonicalized
95*90c8c64dSAndroid Build Coastguard Worker     pub main_src: PathBuf,    // relative to package_dir
96*90c8c64dSAndroid Build Coastguard Worker     pub license: Option<String>,
97*90c8c64dSAndroid Build Coastguard Worker     pub license_file: Option<String>,
98*90c8c64dSAndroid Build Coastguard Worker     /// Whether it is a test crate which doesn't actually contain any tests or benchmarks.
99*90c8c64dSAndroid Build Coastguard Worker     pub empty_test: bool,
100*90c8c64dSAndroid Build Coastguard Worker }
101*90c8c64dSAndroid Build Coastguard Worker 
102*90c8c64dSAndroid Build Coastguard Worker /// A dependency of a Rust crate.
103*90c8c64dSAndroid Build Coastguard Worker #[derive(Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
104*90c8c64dSAndroid Build Coastguard Worker pub struct Extern {
105*90c8c64dSAndroid Build Coastguard Worker     pub name: String,
106*90c8c64dSAndroid Build Coastguard Worker     pub lib_name: String,
107*90c8c64dSAndroid Build Coastguard Worker     pub raw_name: String,
108*90c8c64dSAndroid Build Coastguard Worker     pub extern_type: ExternType,
109*90c8c64dSAndroid Build Coastguard Worker }
110*90c8c64dSAndroid Build Coastguard Worker 
111*90c8c64dSAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
112*90c8c64dSAndroid Build Coastguard Worker pub enum ExternType {
113*90c8c64dSAndroid Build Coastguard Worker     Rust,
114*90c8c64dSAndroid Build Coastguard Worker     ProcMacro,
115*90c8c64dSAndroid Build Coastguard Worker }
116