diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-12-08 20:08:00 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-12-08 20:08:00 -0800 |
| commit | fd81fb6a2418d3cbef5244662573e2b61d5f66a7 (patch) | |
| tree | ffbe0a081e582fd8723269c3aeafd437721c9b90 /src/comp | |
| parent | 9e6ff44d9359ce062fb4f0e29c8f4c33eec7781e (diff) | |
| download | rust-fd81fb6a2418d3cbef5244662573e2b61d5f66a7.tar.gz rust-fd81fb6a2418d3cbef5244662573e2b61d5f66a7.zip | |
rustc: Determine the crate type (lib/bin) in the session, not session opts
This is in preparation for adding a #[crate_type] attribute
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/back/link.rs | 4 | ||||
| -rw-r--r-- | src/comp/driver/rustc.rs | 25 | ||||
| -rw-r--r-- | src/comp/driver/session.rs | 5 | ||||
| -rw-r--r-- | src/comp/middle/resolve.rs | 2 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 6 | ||||
| -rw-r--r-- | src/comp/middle/typeck.rs | 2 |
6 files changed, 28 insertions, 16 deletions
diff --git a/src/comp/back/link.rs b/src/comp/back/link.rs index 73137bd7437..dea4481fa26 100644 --- a/src/comp/back/link.rs +++ b/src/comp/back/link.rs @@ -425,7 +425,7 @@ fn build_link_meta(sess: session::session, c: ast::crate, output: str, } fn warn_missing(sess: session::session, name: str, default: str) { - if !sess.get_opts().library { ret; } + if !sess.building_library() { ret; } sess.warn(#fmt["missing crate link meta '%s', using '%s' as default", name, default]); } @@ -611,7 +611,7 @@ fn link_binary(sess: session::session, let used_libs = cstore::get_used_libraries(cstore); for l: str in used_libs { gcc_args += ["-l" + l]; } - if sess.get_opts().library { + if sess.building_library() { gcc_args += [lib_cmd]; // On mac we need to tell the linker to let this library diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index 03086444419..e00c16425f2 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -282,6 +282,7 @@ options: -o <filename> write output to <filename> --lib compile a library crate + --bin compile an executable crate (default) --static use or produce static libraries --no-core omit the 'core' library (used and imported by default) --pretty [type] pretty-print the input instead of compiling @@ -371,7 +372,13 @@ fn host_triple() -> str { fn build_session_options(match: getopts::match) -> @session::options { - let library = opt_present(match, "lib"); + let crate_type = if opt_present(match, "lib") { + session::lib_crate + } else if opt_present(match, "bin") { + session::bin_crate + } else { + session::unknown_crate + }; let static = opt_present(match, "static"); let parse_only = opt_present(match, "parse-only"); @@ -435,7 +442,7 @@ fn build_session_options(match: getopts::match) let stack_growth = opt_present(match, "stack-growth"); let warn_unused_imports = opt_present(match, "warn-unused-imports"); let sopts: @session::options = - @{library: library, + @{crate_type: crate_type, static: static, libcore: libcore, optimize: opt_level, @@ -495,20 +502,21 @@ fn opts() -> [getopts::opt] { optflag("no-verify"), optmulti("cfg"), optflag("test"), optflag("no-core"), - optflag("lib"), optflag("static"), optflag("gc"), + optflag("lib"), optflag("bin"), optflag("static"), optflag("gc"), optflag("stack-growth"), optflag("no-asm-comments"), optflag("warn-unused-imports")]; } fn build_output_filenames(ifile: str, ofile: option::t<str>, - sopts: @session::options) + sess: session::session) -> @{out_filename: str, obj_filename:str} { let obj_filename = ""; let saved_out_filename: str = ""; + let sopts = sess.get_opts(); let stop_after_codegen = sopts.output_type != link::output_type_exe || - sopts.static && sopts.library; + sopts.static && sess.building_library(); alt ofile { none. { // "-" as input file will cause the parser to read from stdin so we @@ -533,7 +541,7 @@ fn build_output_filenames(ifile: str, ofile: option::t<str>, }; obj_filename = base_filename + "." + suffix; - if sopts.library { + if sess.building_library() { saved_out_filename = std::os::dylib_filename(base_filename); } else { saved_out_filename = base_filename; @@ -580,7 +588,6 @@ fn main(args: [str]) { let sopts = build_session_options(match); let sess = build_session(sopts); let ofile = getopts::opt_maybe_str(match, "o"); - let outputs = build_output_filenames(ifile, ofile, sopts); let cfg = build_configuration(sess, binary, ifile); let pretty = option::map::<str, @@ -597,9 +604,11 @@ fn main(args: [str]) { ret; } + let outputs = build_output_filenames(ifile, ofile, sess); + let stop_after_codegen = sopts.output_type != link::output_type_exe || - sopts.static && sopts.library; + sopts.static && sess.building_library(); let temp_filename = outputs.obj_filename; diff --git a/src/comp/driver/session.rs b/src/comp/driver/session.rs index 590f8a1f192..2292c5c2882 100644 --- a/src/comp/driver/session.rs +++ b/src/comp/driver/session.rs @@ -13,6 +13,8 @@ tag os { os_win32; os_macos; os_linux; } tag arch { arch_x86; arch_x86_64; arch_arm; } +tag crate_type { bin_crate; lib_crate; unknown_crate; } + type config = {os: os, arch: arch, @@ -24,7 +26,7 @@ type config = type options = // The crate config requested for the session, which may be combined // with additional crate configurations during the compile process - {library: bool, + {crate_type: crate_type, static: bool, libcore: bool, optimize: uint, @@ -116,6 +118,7 @@ obj session(targ_cfg: @config, fn set_main_id(d: node_id) { main_fn = some(d); } fn get_main_id() -> option::t<node_id> { main_fn } fn filesearch() -> filesearch::filesearch { filesearch } + fn building_library() -> bool { opts.crate_type == lib_crate } } // Local Variables: // fill-column: 78; diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 7ed27f2502d..4a8795d9d5e 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -362,7 +362,7 @@ fn visit_fn_with_scope(e: @env, f: ast::_fn, tp: [ast::ty_param], sp: span, // is this a main fn declaration? alt name { some(nm) { - if is_main_name([nm]) && !e.sess.get_opts().library { + if is_main_name([nm]) && !e.sess.building_library() { // This is a main function -- set it in the session // as the main ID e.sess.set_main_id(id); diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 104085579b5..df0de922fa3 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -5528,7 +5528,7 @@ fn register_fn_full(ccx: @crate_ctxt, sp: span, path: [str], _flav: str, ccx.item_ids.insert(node_id, llfn); ccx.item_symbols.insert(node_id, ps); - let is_main: bool = is_main_name(path) && !ccx.sess.get_opts().library; + let is_main: bool = is_main_name(path) && !ccx.sess.building_library(); if is_main { create_main_wrapper(ccx, sp, llfn, node_type); } } @@ -5951,7 +5951,7 @@ fn decl_crate_map(sess: session::session, mapname: str, let n_subcrates = 1; let cstore = sess.get_cstore(); while cstore::have_crate_data(cstore, n_subcrates) { n_subcrates += 1; } - let mapname = sess.get_opts().library ? mapname : "toplevel"; + let mapname = sess.building_library() ? mapname : "toplevel"; let sym_name = "_rust_crate_map_" + mapname; let arrtype = T_array(int_type, n_subcrates as uint); let maptype = T_struct([int_type, arrtype]); @@ -5983,7 +5983,7 @@ fn fill_crate_map(ccx: @crate_ctxt, map: ValueRef) { } fn write_metadata(cx: @crate_ctxt, crate: @ast::crate) { - if !cx.sess.get_opts().library { ret; } + if !cx.sess.building_library() { ret; } let llmeta = C_postr(metadata::encoder::encode_metadata(cx, crate)); let llconst = trans_common::C_struct([llmeta]); let llglobal = diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 34fc1816c3f..feaa1215d87 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -2720,7 +2720,7 @@ fn check_main_fn_ty(tcx: ty::ctxt, main_id: ast::node_id) { } fn check_for_main_fn(tcx: ty::ctxt, crate: @ast::crate) { - if !tcx.sess.get_opts().library { + if !tcx.sess.building_library() { alt tcx.sess.get_main_id() { some(id) { check_main_fn_ty(tcx, id); } none. { tcx.sess.span_err(crate.span, "main function not found"); } |
