]> git.lizzy.rs Git - rust.git/commitdiff
rustc: -L also indicates the location of native libraries
authorBrian Anderson <banderson@mozilla.com>
Sat, 14 Apr 2012 04:38:15 +0000 (21:38 -0700)
committerBrian Anderson <banderson@mozilla.com>
Mon, 16 Apr 2012 19:33:21 +0000 (12:33 -0700)
-L currently specifies paths to search for Rust crates

Building crates that use native libraries is difficult. When the
library is located somewhere unexpected there is no way
to tell rustc additional paths to look in.

If libclang is located at `.` then rustc is not going to
know that and linking will fail.

To get around that I often end up inserting

    #[link_args = "-L."] native mod m { }

into other crates to get them to build.

Now you just `rustc -L .` and it builds.

This doesn't do any rpathing so it's still up to somebody else
to put the library somewhere it will be found or use LD_LIBRARY_PATH

This feature comes with a single, XFAILed test, because I could
not think of a way to test it. Odd.

src/rustc/back/link.rs
src/test/run-pass/native-lib-path.rs [new file with mode: 0644]

index 11c3f43f6663c2aad0d75bc6d811cd7bbeb8a178..8bf6c585557b6e092da733a9899d4c224e4f95f2 100644 (file)
@@ -580,6 +580,8 @@ fn rmext(filename: str) -> str {
         lib_cmd = "-dynamiclib";
     } else { lib_cmd = "-shared"; }
 
+    // # Crate linking
+
     let cstore = sess.cstore;
     for cstore::get_used_crate_files(cstore).each {|cratepath|
         if str::ends_with(cratepath, ".rlib") {
@@ -596,6 +598,18 @@ fn rmext(filename: str) -> str {
     let ula = cstore::get_used_link_args(cstore);
     for ula.each {|arg| cc_args += [arg]; }
 
+    // # Native library linking
+
+    // User-supplied library search paths (-L on the cammand line) These are
+    // the same paths used to find Rust crates, so some of them may have been
+    // added already by the previous crate linking code. This only allows them
+    // to be found at compile time so it is still entirely up to outside
+    // forces to make sure that library can be found at runtime.
+
+    let addl_paths = sess.opts.addl_lib_search_paths;
+    for addl_paths.each {|path| cc_args += ["-L" + path]; }
+
+    // The names of the native libraries
     let used_libs = cstore::get_used_libraries(cstore);
     for used_libs.each {|l| cc_args += ["-l" + l]; }
 
@@ -639,6 +653,8 @@ fn rmext(filename: str) -> str {
     // Stack growth requires statically linking a __morestack function
     cc_args += ["-lmorestack"];
 
+    // FIXME: At some point we want to rpath our guesses as to where
+    // native libraries might live, based on the addl_lib_search_paths
     cc_args += rpath::get_rpath_flags(sess, output);
 
     #debug("%s link args: %s", cc_prog, str::connect(cc_args, " "));
diff --git a/src/test/run-pass/native-lib-path.rs b/src/test/run-pass/native-lib-path.rs
new file mode 100644 (file)
index 0000000..2f9d416
--- /dev/null
@@ -0,0 +1,14 @@
+// xfail-test FIXME I don't know how to test this
+// compile-flags:-L.
+// The -L flag is also used for linking native libraries
+
+// FIXME: I want to name a mod that would not link successfully
+// wouthout providing a -L argument to the compiler, and that
+// will also be found successfully at runtime.
+native mod WHATGOESHERE {
+    fn IDONTKNOW() -> u32;
+}
+
+fn main() {
+    assert IDONTKNOW() == 0x_BAD_DOOD_u32;
+}
\ No newline at end of file