From 1391154b1492987a357293c1e3774f9326fc640b Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 3 Oct 2011 14:45:38 -0700 Subject: [PATCH] Use util::filesearch to locate intrinsics.bc and main.o --- src/comp/back/link.rs | 17 +++++++++++++---- src/comp/metadata/creader.rs | 1 + src/comp/util/filesearch.rs | 6 ++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/comp/back/link.rs b/src/comp/back/link.rs index a3d134aee73..c9c03e82775 100644 --- a/src/comp/back/link.rs +++ b/src/comp/back/link.rs @@ -23,6 +23,7 @@ import lib::llvm::mk_target_data; import lib::llvm::mk_type_names; import lib::llvm::False; import lib::llvm::True; +import util::filesearch; tag output_type { output_type_none; @@ -40,8 +41,12 @@ fn llvm_err(sess: session::session, msg: str) { } fn link_intrinsics(sess: session::session, llmod: ModuleRef) { - let path = sess.filesearch() - .get_target_lib_file_path("intrinsics.bc"); + let path = alt filesearch::search( + sess.filesearch(), + bind filesearch::pick_file("intrinsics.bc", _)) { + option::some(path) { path } + option::none. { sess.fatal("couldn't find intrinsics.bc") } + }; let membuf = str::as_buf(path, {|buf| llvm::LLVMRustCreateMemoryBufferWithContentsOfFile(buf) }); @@ -497,8 +502,12 @@ fn mangle_internal_name_by_seq(ccx: @crate_ctxt, flav: str) -> str { // gcc to link the object file with some libs fn link_binary(sess: session::session, saved_out_filename: str) { - let main: str = sess.filesearch() - .get_target_lib_file_path("main.o"); + let main: str = alt filesearch::search( + sess.filesearch(), bind filesearch::pick_file("main.o", _)) { + option::some(f) { f } + option::none. { sess.fatal("can't find main.o") } + }; + let stage: str = "-L" + sess.filesearch().get_target_lib_path(); let prog: str = "gcc"; // The invocations of gcc share some flags across platforms diff --git a/src/comp/metadata/creader.rs b/src/comp/metadata/creader.rs index a706a16726b..90da54f36b3 100644 --- a/src/comp/metadata/creader.rs +++ b/src/comp/metadata/creader.rs @@ -60,6 +60,7 @@ fn visit_item(e: env, i: @ast::item) { if !cstore::add_used_library(cstore, m.native_name) { ret; } for a: ast::attribute in attr::find_attrs_by_name(i.attrs, "link_args") { + alt attr::get_meta_item_value_str(attr::attr_meta(a)) { some(linkarg) { cstore::add_used_link_args(cstore, linkarg); } none. {/* fallthrough */ } diff --git a/src/comp/util/filesearch.rs b/src/comp/util/filesearch.rs index 228d1266b1f..9e2644a2a98 100644 --- a/src/comp/util/filesearch.rs +++ b/src/comp/util/filesearch.rs @@ -9,10 +9,16 @@ import back::link; export filesearch; export mk_filesearch; export pick; +export pick_file; export search; type pick<@T> = block(path: fs::path) -> option::t; +fn pick_file(file: fs::path, path: fs::path) -> option::t { + if fs::basename(path) == file { option::some(path) } + else { option::none } +} + type filesearch = obj { fn sysroot() -> fs::path; fn lib_search_paths() -> [fs::path];