diff options
| -rw-r--r-- | compiler/rustc_attr/src/builtin.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_driver_impl/src/lib.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_interface/src/queries.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_interface/src/util.rs | 14 |
4 files changed, 16 insertions, 6 deletions
diff --git a/compiler/rustc_attr/src/builtin.rs b/compiler/rustc_attr/src/builtin.rs index e713b403813..7e87d1c3130 100644 --- a/compiler/rustc_attr/src/builtin.rs +++ b/compiler/rustc_attr/src/builtin.rs @@ -492,6 +492,10 @@ fn parse_unstability(sess: &Session, attr: &Attribute) -> Option<(Symbol, Stabil } } +pub fn find_crate_name(attrs: &[Attribute]) -> Option<Symbol> { + attr::first_attr_value_str_by_name(attrs, sym::crate_name) +} + #[derive(Clone, Debug)] pub struct Condition { pub name: Symbol, diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index 7dba0b24637..6c8b0a6e769 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -764,8 +764,8 @@ fn print_crate_info( // no crate attributes, print out an error and exit return Compilation::Continue; }; + let t_outputs = rustc_interface::util::build_output_filenames(attrs, sess); let id = rustc_session::output::find_crate_name(sess, attrs); - let t_outputs = rustc_interface::util::build_output_filenames(sess, id.to_string()); let crate_types = collect_crate_types(sess, attrs); for &style in &crate_types { let fname = diff --git a/compiler/rustc_interface/src/queries.rs b/compiler/rustc_interface/src/queries.rs index 78edd65df23..e352547a6c6 100644 --- a/compiler/rustc_interface/src/queries.rs +++ b/compiler/rustc_interface/src/queries.rs @@ -135,7 +135,7 @@ impl<'tcx> Queries<'tcx> { sess.opts.cg.metadata.clone(), sess.cfg_version, ); - let outputs = util::build_output_filenames(sess, crate_name.to_string()); + let outputs = util::build_output_filenames(&pre_configured_attrs, sess); let dep_graph = setup_dep_graph(sess, crate_name, stable_crate_id)?; let cstore = FreezeLock::new(Box::new(CStore::new( diff --git a/compiler/rustc_interface/src/util.rs b/compiler/rustc_interface/src/util.rs index 5266cdcec17..b3ab01a740a 100644 --- a/compiler/rustc_interface/src/util.rs +++ b/compiler/rustc_interface/src/util.rs @@ -471,7 +471,7 @@ fn multiple_output_types_to_stdout( } } -pub fn build_output_filenames(sess: &Session, crate_name: String) -> OutputFilenames { +pub fn build_output_filenames(attrs: &[ast::Attribute], sess: &Session) -> OutputFilenames { if multiple_output_types_to_stdout( &sess.opts.output_types, sess.io.output_file == Some(OutFileName::Stdout), @@ -479,6 +479,12 @@ pub fn build_output_filenames(sess: &Session, crate_name: String) -> OutputFilen sess.emit_fatal(errors::MultipleOutputTypesToStdout); } + let crate_name = sess + .opts + .crate_name + .clone() + .or_else(|| rustc_attr::find_crate_name(attrs).map(|n| n.to_string())); + match sess.io.output_file { None => { // "-" as input file will cause the parser to read from stdin so we @@ -487,11 +493,11 @@ pub fn build_output_filenames(sess: &Session, crate_name: String) -> OutputFilen let dirpath = sess.io.output_dir.clone().unwrap_or_default(); // If a crate name is present, we use it as the link name - let stem = crate_name.clone(); + let stem = crate_name.clone().unwrap_or_else(|| sess.io.input.filestem().to_owned()); OutputFilenames::new( dirpath, - crate_name, + crate_name.unwrap_or_else(|| stem.replace('-', "_")), stem, None, sess.io.temps_dir.clone(), @@ -520,7 +526,7 @@ pub fn build_output_filenames(sess: &Session, crate_name: String) -> OutputFilen out_file.filestem().unwrap_or_default().to_str().unwrap().to_string(); OutputFilenames::new( out_file.parent().unwrap_or_else(|| Path::new("")).to_path_buf(), - crate_name, + crate_name.unwrap_or_else(|| out_filestem.replace('-', "_")), out_filestem, ofile, sess.io.temps_dir.clone(), |
