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