From cf24280a3c84d2ef2df73e810da409a0f8474919 Mon Sep 17 00:00:00 2001 From: Andrei Formiga Date: Fri, 8 Nov 2013 16:51:40 -0300 Subject: [PATCH] Added default value for package_id attribute when encoding metadata for lib crates --- src/librustc/back/link.rs | 14 +++----------- src/librustc/metadata/encoder.rs | 19 +++++++++++++++---- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index ab0763aac9e5..b88966c0ab29 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -634,20 +634,12 @@ pub fn build_link_meta(sess: Session, } } - fn crate_meta_pkgid(sess: Session, output: &Path, opt_pkg_id: Option<@str>) + fn crate_meta_pkgid(sess: Session, name: @str, opt_pkg_id: Option<@str>) -> @str { match opt_pkg_id { Some(v) if !v.is_empty() => v, _ => { - let pkg_id = session::expect(sess, - output.filestem_str(), - || format!("output file name `{}` doesn't\ - appear to have a stem", - output.display())).to_managed(); - if pkg_id.is_empty() { - sess.fatal("missing crate link meta `package_id`, and the \ - inferred name is blank"); - } + let pkg_id = name.clone(); warn_missing(sess, "package_id", pkg_id); pkg_id } @@ -662,7 +654,7 @@ pub fn build_link_meta(sess: Session, } = provided_link_metas(sess, c); let name = crate_meta_name(sess, output, opt_name); let vers = crate_meta_vers(sess, opt_vers); - let pkg_id = crate_meta_pkgid(sess, output, opt_pkg_id); + let pkg_id = crate_meta_pkgid(sess, name, opt_pkg_id); let dep_hashes = cstore::get_dep_hashes(sess.cstore); let extras_hash = crate_meta_extras_hash(symbol_hasher, cmh_items, diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index 1ad7e416342f..0f328d337480 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -1487,8 +1487,8 @@ fn encode_attributes(ebml_w: &mut writer::Encoder, attrs: &[Attribute]) { // So there's a special crate attribute called 'link' which defines the // metadata that Rust cares about for linking crates. This attribute requires -// 'name' and 'vers' items, so if the user didn't provide them we will throw -// them in anyway with default values. +// 'name', 'vers' and 'package_id' items, so if the user didn't provide them we +// will throw them in anyway with default values. fn synthesize_crate_attrs(ecx: &EncodeContext, crate: &Crate) -> ~[Attribute] { @@ -1505,9 +1505,20 @@ fn synthesize_crate_attrs(ecx: &EncodeContext, attr::mk_name_value_item_str(@"vers", ecx.link_meta.vers); - let mut meta_items = ~[name_item, vers_item]; + let pkgid_item = match ecx.link_meta.package_id { + Some(pkg_id) => attr::mk_name_value_item_str(@"package_id", + pkg_id), + // uses package_id equal to name; + // this should never happen here but package_id is an Option + // FIX: change package_id in LinkMeta to @str instead of Option<@str> + _ => attr::mk_name_value_item_str(@"package_id", + ecx.link_meta.name) + }; - for &mi in items.iter().filter(|mi| "name" != mi.name() && "vers" != mi.name()) { + let mut meta_items = ~[name_item, vers_item, pkgid_item]; + + for &mi in items.iter().filter(|mi| "name" != mi.name() && "vers" != mi.name() && + "package_id" != mi.name()) { meta_items.push(mi); } let link_item = attr::mk_list_item(@"link", meta_items);