about summary refs log tree commit diff
path: root/src/librustc_codegen_utils/link.rs
diff options
context:
space:
mode:
authorMark Mansi <markm@cs.wisc.edu>2020-03-12 18:07:58 -0500
committermark <markm@cs.wisc.edu>2020-03-19 23:14:46 -0500
commit2d75a339ca9e7cd11338b165311927e6eb73cca4 (patch)
treea48f8cbc64cb11fc1ec825190fe708a13657cbd5 /src/librustc_codegen_utils/link.rs
parentf4c675c476c18b1a11041193f2f59d695b126bc8 (diff)
downloadrust-2d75a339ca9e7cd11338b165311927e6eb73cca4.tar.gz
rust-2d75a339ca9e7cd11338b165311927e6eb73cca4.zip
Refactorings to begin getting rid of rustc_codegen_utils
Diffstat (limited to 'src/librustc_codegen_utils/link.rs')
-rw-r--r--src/librustc_codegen_utils/link.rs191
1 files changed, 0 insertions, 191 deletions
diff --git a/src/librustc_codegen_utils/link.rs b/src/librustc_codegen_utils/link.rs
deleted file mode 100644
index 1f53eec514b..00000000000
--- a/src/librustc_codegen_utils/link.rs
+++ /dev/null
@@ -1,191 +0,0 @@
-use rustc_ast::{ast, attr};
-use rustc_session::config::{self, Input, OutputFilenames, OutputType};
-use rustc_session::Session;
-use rustc_span::symbol::sym;
-use rustc_span::Span;
-use std::path::{Path, PathBuf};
-
-pub fn out_filename(
-    sess: &Session,
-    crate_type: config::CrateType,
-    outputs: &OutputFilenames,
-    crate_name: &str,
-) -> PathBuf {
-    let default_filename = filename_for_input(sess, crate_type, crate_name, outputs);
-    let out_filename = outputs
-        .outputs
-        .get(&OutputType::Exe)
-        .and_then(|s| s.to_owned())
-        .or_else(|| outputs.single_output_file.clone())
-        .unwrap_or(default_filename);
-
-    check_file_is_writeable(&out_filename, sess);
-
-    out_filename
-}
-
-// Make sure files are writeable.  Mac, FreeBSD, and Windows system linkers
-// check this already -- however, the Linux linker will happily overwrite a
-// read-only file.  We should be consistent.
-pub fn check_file_is_writeable(file: &Path, sess: &Session) {
-    if !is_writeable(file) {
-        sess.fatal(&format!(
-            "output file {} is not writeable -- check its \
-                            permissions",
-            file.display()
-        ));
-    }
-}
-
-fn is_writeable(p: &Path) -> bool {
-    match p.metadata() {
-        Err(..) => true,
-        Ok(m) => !m.permissions().readonly(),
-    }
-}
-
-pub fn find_crate_name(sess: Option<&Session>, attrs: &[ast::Attribute], input: &Input) -> String {
-    let validate = |s: String, span: Option<Span>| {
-        rustc_metadata::validate_crate_name(sess, &s, span);
-        s
-    };
-
-    // Look in attributes 100% of the time to make sure the attribute is marked
-    // as used. After doing this, however, we still prioritize a crate name from
-    // the command line over one found in the #[crate_name] attribute. If we
-    // find both we ensure that they're the same later on as well.
-    let attr_crate_name =
-        attr::find_by_name(attrs, sym::crate_name).and_then(|at| at.value_str().map(|s| (at, s)));
-
-    if let Some(sess) = sess {
-        if let Some(ref s) = sess.opts.crate_name {
-            if let Some((attr, name)) = attr_crate_name {
-                if name.as_str() != *s {
-                    let msg = format!(
-                        "`--crate-name` and `#[crate_name]` are \
-                                       required to match, but `{}` != `{}`",
-                        s, name
-                    );
-                    sess.span_err(attr.span, &msg);
-                }
-            }
-            return validate(s.clone(), None);
-        }
-    }
-
-    if let Some((attr, s)) = attr_crate_name {
-        return validate(s.to_string(), Some(attr.span));
-    }
-    if let Input::File(ref path) = *input {
-        if let Some(s) = path.file_stem().and_then(|s| s.to_str()) {
-            if s.starts_with('-') {
-                let msg = format!(
-                    "crate names cannot start with a `-`, but \
-                                   `{}` has a leading hyphen",
-                    s
-                );
-                if let Some(sess) = sess {
-                    sess.err(&msg);
-                }
-            } else {
-                return validate(s.replace("-", "_"), None);
-            }
-        }
-    }
-
-    "rust_out".to_string()
-}
-
-pub fn filename_for_metadata(
-    sess: &Session,
-    crate_name: &str,
-    outputs: &OutputFilenames,
-) -> PathBuf {
-    let libname = format!("{}{}", crate_name, sess.opts.cg.extra_filename);
-
-    let out_filename = outputs
-        .single_output_file
-        .clone()
-        .unwrap_or_else(|| outputs.out_directory.join(&format!("lib{}.rmeta", libname)));
-
-    check_file_is_writeable(&out_filename, sess);
-
-    out_filename
-}
-
-pub fn filename_for_input(
-    sess: &Session,
-    crate_type: config::CrateType,
-    crate_name: &str,
-    outputs: &OutputFilenames,
-) -> PathBuf {
-    let libname = format!("{}{}", crate_name, sess.opts.cg.extra_filename);
-
-    match crate_type {
-        config::CrateType::Rlib => outputs.out_directory.join(&format!("lib{}.rlib", libname)),
-        config::CrateType::Cdylib | config::CrateType::ProcMacro | config::CrateType::Dylib => {
-            let (prefix, suffix) =
-                (&sess.target.target.options.dll_prefix, &sess.target.target.options.dll_suffix);
-            outputs.out_directory.join(&format!("{}{}{}", prefix, libname, suffix))
-        }
-        config::CrateType::Staticlib => {
-            let (prefix, suffix) = (
-                &sess.target.target.options.staticlib_prefix,
-                &sess.target.target.options.staticlib_suffix,
-            );
-            outputs.out_directory.join(&format!("{}{}{}", prefix, libname, suffix))
-        }
-        config::CrateType::Executable => {
-            let suffix = &sess.target.target.options.exe_suffix;
-            let out_filename = outputs.path(OutputType::Exe);
-            if suffix.is_empty() { out_filename } else { out_filename.with_extension(&suffix[1..]) }
-        }
-    }
-}
-
-/// Returns default crate type for target
-///
-/// Default crate type is used when crate type isn't provided neither
-/// through cmd line arguments nor through crate attributes
-///
-/// It is CrateType::Executable for all platforms but iOS as there is no
-/// way to run iOS binaries anyway without jailbreaking and
-/// interaction with Rust code through static library is the only
-/// option for now
-pub fn default_output_for_target(sess: &Session) -> config::CrateType {
-    if !sess.target.target.options.executables {
-        config::CrateType::Staticlib
-    } else {
-        config::CrateType::Executable
-    }
-}
-
-/// Checks if target supports crate_type as output
-pub fn invalid_output_for_target(sess: &Session, crate_type: config::CrateType) -> bool {
-    match crate_type {
-        config::CrateType::Cdylib | config::CrateType::Dylib | config::CrateType::ProcMacro => {
-            if !sess.target.target.options.dynamic_linking {
-                return true;
-            }
-            if sess.crt_static(Some(crate_type))
-                && !sess.target.target.options.crt_static_allows_dylibs
-            {
-                return true;
-            }
-        }
-        _ => {}
-    }
-    if sess.target.target.options.only_cdylib {
-        match crate_type {
-            config::CrateType::ProcMacro | config::CrateType::Dylib => return true,
-            _ => {}
-        }
-    }
-    if !sess.target.target.options.executables {
-        if crate_type == config::CrateType::Executable {
-            return true;
-        }
-    }
-
-    false
-}