Auto merge of #37681 - nrc:crate-metadata, r=@alexcrichton
add --crate-type metadata r? @alexcrichton
This commit is contained in:
commit
5196ca8518
25 changed files with 374 additions and 81 deletions
|
|
@ -56,12 +56,13 @@ pub struct LinkMeta {
|
|||
pub crate_hash: Svh,
|
||||
}
|
||||
|
||||
// Where a crate came from on the local filesystem. One of these two options
|
||||
// Where a crate came from on the local filesystem. One of these three options
|
||||
// must be non-None.
|
||||
#[derive(PartialEq, Clone, Debug)]
|
||||
pub struct CrateSource {
|
||||
pub dylib: Option<(PathBuf, PathKind)>,
|
||||
pub rlib: Option<(PathBuf, PathKind)>,
|
||||
pub rmeta: Option<(PathBuf, PathKind)>,
|
||||
}
|
||||
|
||||
#[derive(RustcEncodable, RustcDecodable, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Debug)]
|
||||
|
|
@ -76,6 +77,30 @@ pub enum DepKind {
|
|||
Explicit,
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Clone, Debug)]
|
||||
pub enum LibSource {
|
||||
Some(PathBuf),
|
||||
MetadataOnly,
|
||||
None,
|
||||
}
|
||||
|
||||
impl LibSource {
|
||||
pub fn is_some(&self) -> bool {
|
||||
if let LibSource::Some(_) = *self {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn option(&self) -> Option<PathBuf> {
|
||||
match *self {
|
||||
LibSource::Some(ref p) => Some(p.clone()),
|
||||
LibSource::MetadataOnly | LibSource::None => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Debug, PartialEq, Clone, RustcEncodable, RustcDecodable)]
|
||||
pub enum LinkagePreference {
|
||||
RequireDynamic,
|
||||
|
|
@ -244,7 +269,7 @@ pub trait CrateStore<'tcx> {
|
|||
// utility functions
|
||||
fn metadata_filename(&self) -> &str;
|
||||
fn metadata_section_name(&self, target: &Target) -> &str;
|
||||
fn used_crates(&self, prefer: LinkagePreference) -> Vec<(CrateNum, Option<PathBuf>)>;
|
||||
fn used_crates(&self, prefer: LinkagePreference) -> Vec<(CrateNum, LibSource)>;
|
||||
fn used_crate_source(&self, cnum: CrateNum) -> CrateSource;
|
||||
fn extern_mod_stmt_cnum(&self, emod_id: ast::NodeId) -> Option<CrateNum>;
|
||||
fn encode_metadata<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
|
|
@ -427,7 +452,7 @@ impl<'tcx> CrateStore<'tcx> for DummyCrateStore {
|
|||
// utility functions
|
||||
fn metadata_filename(&self) -> &str { bug!("metadata_filename") }
|
||||
fn metadata_section_name(&self, target: &Target) -> &str { bug!("metadata_section_name") }
|
||||
fn used_crates(&self, prefer: LinkagePreference) -> Vec<(CrateNum, Option<PathBuf>)>
|
||||
fn used_crates(&self, prefer: LinkagePreference) -> Vec<(CrateNum, LibSource)>
|
||||
{ vec![] }
|
||||
fn used_crate_source(&self, cnum: CrateNum) -> CrateSource { bug!("used_crate_source") }
|
||||
fn extern_mod_stmt_cnum(&self, emod_id: ast::NodeId) -> Option<CrateNum> { None }
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ fn calculate_type(sess: &session::Session,
|
|||
|
||||
// No linkage happens with rlibs, we just needed the metadata (which we
|
||||
// got long ago), so don't bother with anything.
|
||||
config::CrateTypeRlib => return Vec::new(),
|
||||
config::CrateTypeRlib | config::CrateTypeMetadata => return Vec::new(),
|
||||
|
||||
// Staticlibs and cdylibs must have all static dependencies. If any fail
|
||||
// to be found, we generate some nice pretty errors.
|
||||
|
|
@ -192,7 +192,7 @@ fn calculate_type(sess: &session::Session,
|
|||
if src.dylib.is_none() &&
|
||||
!formats.contains_key(&cnum) &&
|
||||
sess.cstore.dep_kind(cnum) == DepKind::Explicit {
|
||||
assert!(src.rlib.is_some());
|
||||
assert!(src.rlib.is_some() || src.rmeta.is_some());
|
||||
info!("adding staticlib: {}", sess.cstore.crate_name(cnum));
|
||||
add_library(sess, cnum, RequireStatic, &mut formats);
|
||||
ret[cnum.as_usize() - 1] = Linkage::Static;
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
|
|||
fn new(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> ReachableContext<'a, 'tcx> {
|
||||
let any_library = tcx.sess.crate_types.borrow().iter().any(|ty| {
|
||||
*ty == config::CrateTypeRlib || *ty == config::CrateTypeDylib ||
|
||||
*ty == config::CrateTypeProcMacro
|
||||
*ty == config::CrateTypeProcMacro || *ty == config::CrateTypeMetadata
|
||||
});
|
||||
ReachableContext {
|
||||
tcx: tcx,
|
||||
|
|
|
|||
|
|
@ -75,7 +75,8 @@ fn verify(sess: &Session, items: &lang_items::LanguageItems) {
|
|||
config::CrateTypeCdylib |
|
||||
config::CrateTypeExecutable |
|
||||
config::CrateTypeStaticlib => true,
|
||||
config::CrateTypeRlib => false,
|
||||
config::CrateTypeRlib |
|
||||
config::CrateTypeMetadata => false,
|
||||
}
|
||||
});
|
||||
if !needs_check {
|
||||
|
|
|
|||
|
|
@ -78,18 +78,6 @@ pub enum OutputType {
|
|||
DepInfo,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum ErrorOutputType {
|
||||
HumanReadable(ColorConfig),
|
||||
Json,
|
||||
}
|
||||
|
||||
impl Default for ErrorOutputType {
|
||||
fn default() -> ErrorOutputType {
|
||||
ErrorOutputType::HumanReadable(ColorConfig::Auto)
|
||||
}
|
||||
}
|
||||
|
||||
impl OutputType {
|
||||
fn is_compatible_with_codegen_units_and_single_output_file(&self) -> bool {
|
||||
match *self {
|
||||
|
|
@ -125,6 +113,18 @@ impl OutputType {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum ErrorOutputType {
|
||||
HumanReadable(ColorConfig),
|
||||
Json,
|
||||
}
|
||||
|
||||
impl Default for ErrorOutputType {
|
||||
fn default() -> ErrorOutputType {
|
||||
ErrorOutputType::HumanReadable(ColorConfig::Auto)
|
||||
}
|
||||
}
|
||||
|
||||
// Use tree-based collections to cheaply get a deterministic Hash implementation.
|
||||
// DO NOT switch BTreeMap out for an unsorted container type! That would break
|
||||
// dependency tracking for commandline arguments.
|
||||
|
|
@ -483,6 +483,7 @@ pub enum CrateType {
|
|||
CrateTypeStaticlib,
|
||||
CrateTypeCdylib,
|
||||
CrateTypeProcMacro,
|
||||
CrateTypeMetadata,
|
||||
}
|
||||
|
||||
#[derive(Clone, Hash)]
|
||||
|
|
@ -1147,7 +1148,7 @@ pub fn rustc_short_optgroups() -> Vec<RustcOptGroup> {
|
|||
assumed.", "[KIND=]NAME"),
|
||||
opt::multi_s("", "crate-type", "Comma separated list of types of crates
|
||||
for the compiler to emit",
|
||||
"[bin|lib|rlib|dylib|cdylib|staticlib]"),
|
||||
"[bin|lib|rlib|dylib|cdylib|staticlib|metadata]"),
|
||||
opt::opt_s("", "crate-name", "Specify the name of the crate being built",
|
||||
"NAME"),
|
||||
opt::multi_s("", "emit", "Comma separated list of types of output for \
|
||||
|
|
@ -1539,6 +1540,7 @@ pub fn parse_crate_types_from_list(list_list: Vec<String>) -> Result<Vec<CrateTy
|
|||
"cdylib" => CrateTypeCdylib,
|
||||
"bin" => CrateTypeExecutable,
|
||||
"proc-macro" => CrateTypeProcMacro,
|
||||
"metadata" => CrateTypeMetadata,
|
||||
_ => {
|
||||
return Err(format!("unknown crate type: `{}`",
|
||||
part));
|
||||
|
|
@ -1623,6 +1625,7 @@ impl fmt::Display for CrateType {
|
|||
CrateTypeStaticlib => "staticlib".fmt(f),
|
||||
CrateTypeCdylib => "cdylib".fmt(f),
|
||||
CrateTypeProcMacro => "proc-macro".fmt(f),
|
||||
CrateTypeMetadata => "metadata".fmt(f),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue