e338a4154b
This commit implements the support necessary for generating both intermediate and result static rust libraries. This is an implementation of my thoughts in https://mail.mozilla.org/pipermail/rust-dev/2013-November/006686.html. When compiling a library, we still retain the "lib" option, although now there are "rlib", "staticlib", and "dylib" as options for crate_type (and these are stackable). The idea of "lib" is to generate the "compiler default" instead of having too choose (although all are interchangeable). For now I have left the "complier default" to be a dynamic library for size reasons. Of the rust libraries, lib{std,extra,rustuv} will bootstrap with an rlib/dylib pair, but lib{rustc,syntax,rustdoc,rustpkg} will only be built as a dynamic object. I chose this for size reasons, but also because you're probably not going to be embedding the rustc compiler anywhere any time soon. Other than the options outlined above, there are a few defaults/preferences that are now opinionated in the compiler: * If both a .dylib and .rlib are found for a rust library, the compiler will prefer the .rlib variant. This is overridable via the -Z prefer-dynamic option * If generating a "lib", the compiler will generate a dynamic library. This is overridable by explicitly saying what flavor you'd like (rlib, staticlib, dylib). * If no options are passed to the command line, and no crate_type is found in the destination crate, then an executable is generated With this change, you can successfully build a rust program with 0 dynamic dependencies on rust libraries. There is still a dynamic dependency on librustrt, but I plan on removing that in a subsequent commit. This change includes no tests just yet. Our current testing infrastructure/harnesses aren't very amenable to doing flavorful things with linking, so I'm planning on adding a new mode of testing which I believe belongs as a separate commit. Closes #552
69 lines
2.1 KiB
Rust
69 lines
2.1 KiB
Rust
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
use back::target_strs;
|
|
use driver::session::sess_os_to_meta_os;
|
|
use metadata::loader::meta_section_name;
|
|
use syntax::abi;
|
|
|
|
pub fn get_target_strs(target_triple: ~str, target_os: abi::Os) -> target_strs::t {
|
|
return target_strs::t {
|
|
module_asm: ~"",
|
|
|
|
meta_sect_name: meta_section_name(sess_os_to_meta_os(target_os)).to_owned(),
|
|
|
|
data_layout: match target_os {
|
|
abi::OsMacos => {
|
|
~"e-p:32:32:32" +
|
|
"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
|
|
"-f32:32:32-f64:64:64" +
|
|
"-v64:64:64-v128:64:128" +
|
|
"-a0:0:64-n32"
|
|
}
|
|
|
|
abi::OsWin32 => {
|
|
~"e-p:32:32:32" +
|
|
"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
|
|
"-f32:32:32-f64:64:64" +
|
|
"-v64:64:64-v128:64:128" +
|
|
"-a0:0:64-n32"
|
|
}
|
|
|
|
abi::OsLinux => {
|
|
~"e-p:32:32:32" +
|
|
"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
|
|
"-f32:32:32-f64:64:64" +
|
|
"-v64:64:64-v128:64:128" +
|
|
"-a0:0:64-n32"
|
|
}
|
|
|
|
abi::OsAndroid => {
|
|
~"e-p:32:32:32" +
|
|
"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
|
|
"-f32:32:32-f64:64:64" +
|
|
"-v64:64:64-v128:64:128" +
|
|
"-a0:0:64-n32"
|
|
}
|
|
|
|
abi::OsFreebsd => {
|
|
~"e-p:32:32:32" +
|
|
"-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" +
|
|
"-f32:32:32-f64:64:64" +
|
|
"-v64:64:64-v128:64:128" +
|
|
"-a0:0:64-n32"
|
|
}
|
|
},
|
|
|
|
target_triple: target_triple,
|
|
|
|
cc_args: ~[],
|
|
};
|
|
}
|