From 8b6c7b79abb8f756c64362f26636b7811cab16e2 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Thu, 12 May 2022 11:08:09 -0700 Subject: [PATCH] Move ELF note parsing into cargo-subcommand-metadata optional feature --- Cargo.toml | 6 +----- crates/cargo-subcommand-metadata/Cargo.toml | 7 +++++++ crates/cargo-subcommand-metadata/src/lib.rs | 21 ++++++++++--------- .../cargo-subcommand-metadata/src/parse.rs | 7 +++---- src/bin/cargo/cli.rs | 4 ++-- src/bin/cargo/main.rs | 1 - 6 files changed, 24 insertions(+), 22 deletions(-) rename src/bin/cargo/subcommand_metadata.rs => crates/cargo-subcommand-metadata/src/parse.rs (86%) diff --git a/Cargo.toml b/Cargo.toml index e685328c661d..8ff973937253 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ path = "src/cargo/lib.rs" atty = "0.2" bytesize = "1.0" cargo-platform = { path = "crates/cargo-platform", version = "0.1.2" } +cargo-subcommand-metadata = { path = "crates/cargo-subcommand-metadata", version = "0.1.0", features = ["parse"] } cargo-util = { path = "crates/cargo-util", version = "0.2.1" } crates-io = { path = "crates/crates-io", version = "0.34.0" } curl = { version = "0.4.43", features = ["http2"] } @@ -73,11 +74,6 @@ itertools = "0.10.0" # for more information. rustc-workspace-hack = "1.0.0" -[target.'cfg(target_os = "linux")'.dependencies] -cargo-subcommand-metadata = { path = "crates/cargo-subcommand-metadata", version = "0.1.0" } -memmap = "0.7" -object = "0.28" - [target.'cfg(windows)'.dependencies] fwdansi = "1.1.0" diff --git a/crates/cargo-subcommand-metadata/Cargo.toml b/crates/cargo-subcommand-metadata/Cargo.toml index 70a0de4a02e0..ee5254b4311a 100644 --- a/crates/cargo-subcommand-metadata/Cargo.toml +++ b/crates/cargo-subcommand-metadata/Cargo.toml @@ -5,3 +5,10 @@ edition = "2021" license = "MIT OR Apache-2.0" repository = "https://github.com/rust-lang/cargo" description = "Embed metadata into a Cargo subcommand, so that `cargo --list` can show a description of the subcommand" + +[target.'cfg(target_os = "linux")'.dependencies] +memmap = { version = "0.7", optional = true } +object = { version = "0.28", optional = true } + +[features] +parse = ["memmap", "object"] diff --git a/crates/cargo-subcommand-metadata/src/lib.rs b/crates/cargo-subcommand-metadata/src/lib.rs index 61f5fc708347..e5615e4d25e9 100644 --- a/crates/cargo-subcommand-metadata/src/lib.rs +++ b/crates/cargo-subcommand-metadata/src/lib.rs @@ -1,3 +1,6 @@ +#[cfg(feature = "parse")] +pub mod parse; + /// Cargo's name for the purpose of ELF notes. /// /// The `name` field of an ELF note is designated to hold the entry's "owner" or @@ -82,16 +85,14 @@ macro_rules! description { #[used] #[link_section = ".note.cargo.subcommand"] - static ELF_NOTE: ElfNote = { - ElfNote { - namesz: $crate::ELF_NOTE_NAME.len() as u32 + 1, - descsz: CARGO_SUBCOMMAND_DESCRIPTION.len() as u32, - ty: $crate::ElfNoteType::Description, - name: unsafe { *$crate::ELF_NOTE_NAME.as_ptr().cast() }, - name_padding: $crate::private::padding(), - desc: unsafe { *CARGO_SUBCOMMAND_DESCRIPTION.as_ptr().cast() }, - desc_padding: $crate::private::padding(), - } + static ELF_NOTE: ElfNote = ElfNote { + namesz: $crate::ELF_NOTE_NAME.len() as u32 + 1, + descsz: CARGO_SUBCOMMAND_DESCRIPTION.len() as u32, + ty: $crate::ElfNoteType::Description, + name: unsafe { *$crate::ELF_NOTE_NAME.as_ptr().cast() }, + name_padding: $crate::private::padding(), + desc: unsafe { *CARGO_SUBCOMMAND_DESCRIPTION.as_ptr().cast() }, + desc_padding: $crate::private::padding(), }; }; }; diff --git a/src/bin/cargo/subcommand_metadata.rs b/crates/cargo-subcommand-metadata/src/parse.rs similarity index 86% rename from src/bin/cargo/subcommand_metadata.rs rename to crates/cargo-subcommand-metadata/src/parse.rs index 04239193206b..a008cae0f42b 100644 --- a/src/bin/cargo/subcommand_metadata.rs +++ b/crates/cargo-subcommand-metadata/src/parse.rs @@ -1,6 +1,6 @@ use std::path::Path; -pub(crate) fn description(path: &Path) -> Option { +pub fn description(path: &Path) -> Option { implementation::description(path) } @@ -29,9 +29,8 @@ mod implementation { if section_header.name(endian, string_table).ok() == Some(b".note.cargo.subcommand") { if let Ok(Some(mut notes)) = section_header.notes(endian, data) { while let Ok(Some(note)) = notes.next() { - if note.name() == cargo_subcommand_metadata::ELF_NOTE_NAME.as_bytes() - && note.n_type(endian) - == cargo_subcommand_metadata::ElfNoteType::Description as u32 + if note.name() == crate::ELF_NOTE_NAME.as_bytes() + && note.n_type(endian) == crate::ElfNoteType::Description as u32 { if description.is_some() { return None; diff --git a/src/bin/cargo/cli.rs b/src/bin/cargo/cli.rs index 9db627a9b539..4f65d330c807 100644 --- a/src/bin/cargo/cli.rs +++ b/src/bin/cargo/cli.rs @@ -2,6 +2,7 @@ use anyhow::anyhow; use cargo::core::shell::Shell; use cargo::core::{features, CliUnstable}; use cargo::{self, drop_print, drop_println, CliResult, Config}; +use cargo_subcommand_metadata as subcommand_metadata; use clap::{Arg, ArgMatches}; use itertools::Itertools; use std::collections::HashMap; @@ -12,7 +13,6 @@ use std::fmt::Write; use super::commands; use super::list_commands; use crate::command_prelude::*; -use crate::subcommand_metadata; use cargo::core::features::HIDDEN; lazy_static::lazy_static! { @@ -122,7 +122,7 @@ Run with 'cargo -Z [FLAG] [COMMAND]'", CommandInfo::External { path } => { if let Some(desc) = known_external_desc { drop_println!(config, " {:<20} {}", name, desc); - } else if let Some(desc) = subcommand_metadata::description(&path) { + } else if let Some(desc) = subcommand_metadata::parse::description(&path) { drop_println!(config, " {:<20} {}", name, desc); } else if is_verbose { drop_println!(config, " {:<20} {}", name, path.display()); diff --git a/src/bin/cargo/main.rs b/src/bin/cargo/main.rs index d4770e56ecd5..3c0c943e9f12 100644 --- a/src/bin/cargo/main.rs +++ b/src/bin/cargo/main.rs @@ -13,7 +13,6 @@ use std::path::{Path, PathBuf}; mod cli; mod commands; -mod subcommand_metadata; use crate::command_prelude::*;