]> git.lizzy.rs Git - rust.git/commitdiff
rustc: Re-jigger -L and -l for MSYS compatibility
authorAlex Crichton <alex@alexcrichton.com>
Wed, 31 Dec 2014 23:10:45 +0000 (15:10 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Thu, 1 Jan 2015 00:05:00 +0000 (16:05 -0800)
As discovered in #20376, the MSYS shell will silently rewrite arguemnts that
look like unix paths into their windows path counterparts for compatibility, but
the recently added `:kind` syntax added to the `-L` flag does not allow for this
form of rewriting. This means that the syntax can be difficult to use at an MSYS
prompt, as well as causing tests to fail when run manuall right now.

This commit takes the other option presented in the original issue to prefix the
path with `kind=` instead of suffixing it with `:kind`. For consistence, the
`-l` flag is also now migrating to `kind=name`.

This is a breaking change due to the *removal* of behavior with `-L`. All code
using `:kind` should now pass `kind=` for `-L` arguments. This is not currently,
but will become, a breaking change for `-l` flags. The old `name:kind` syntax is
still accepted, but all code should update to `kind=name`.

[breaking-change]
Closes #20376

src/librustc/session/config.rs
src/librustc/session/search_paths.rs
src/test/run-make/compiler-lookup-paths/Makefile
src/test/run-make/manual-link/Makefile

index 19ac6d466fb5856cd3d768ca54c9b707a81cb29c..fee95ffa0f4acdf1b070ea2e680dd13d3c92ae07 100644 (file)
@@ -743,7 +743,7 @@ pub fn rustc_short_optgroups() -> Vec<RustcOptGroup> {
         opt::multi("l", "",   "Link the generated crate(s) to the specified native
                              library NAME. The optional KIND can be one of,
                              static, dylib, or framework. If omitted, dylib is
-                             assumed.", "NAME[:KIND]"),
+                             assumed.", "[KIND=]NAME"),
         opt::multi("", "crate-type", "Comma separated list of types of crates
                                     for the compiler to emit",
                    "[bin|lib|rlib|dylib|staticlib]"),
@@ -1016,6 +1016,24 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
     }
 
     let libs = matches.opt_strs("l").into_iter().map(|s| {
+        let mut parts = s.splitn(1, '=');
+        let kind = parts.next().unwrap();
+        if let Some(name) = parts.next() {
+            let kind = match kind {
+                "dylib" => cstore::NativeUnknown,
+                "framework" => cstore::NativeFramework,
+                "static" => cstore::NativeStatic,
+                s => {
+                    early_error(format!("unknown library kind `{}`, expected \
+                                         one of dylib, framework, or static",
+                                        s)[]);
+                }
+            };
+            return (name.to_string(), kind)
+        }
+
+        // FIXME(acrichto) remove this once crates have stopped using it, this
+        //                 is deprecated behavior now.
         let mut parts = s.rsplitn(1, ':');
         let kind = parts.next().unwrap();
         let (name, kind) = match (parts.next(), kind) {
index 8a6217a49f560965f935823b99113da700f5634d..56b4cae2e43cfdc5e015251e12e01fb9c726e60b 100644 (file)
@@ -34,15 +34,14 @@ pub fn new() -> SearchPaths {
     }
 
     pub fn add_path(&mut self, path: &str) {
-        let (kind, path) = if path.ends_with(":native") {
-            (PathKind::Native, path.slice_to(path.len() - ":native".len()))
-        } else if path.ends_with(":crate") {
-            (PathKind::Crate, path.slice_to(path.len() - ":crate".len()))
-        } else if path.ends_with(":dependency") {
-            (PathKind::Dependency,
-             path.slice_to(path.len() - ":dependency".len()))
-        } else if path.ends_with(":all") {
-            (PathKind::All, path.slice_to(path.len() - ":all".len()))
+        let (kind, path) = if path.starts_with("native=") {
+            (PathKind::Native, path.slice_from("native=".len()))
+        } else if path.starts_with("crate=") {
+            (PathKind::Crate, path.slice_from("crate=".len()))
+        } else if path.starts_with("dependency=") {
+            (PathKind::Dependency, path.slice_from("dependency=".len()))
+        } else if path.starts_with("all=") {
+            (PathKind::All, path.slice_from("all=".len()))
         } else {
             (PathKind::All, path)
         };
index 032e0882ff8e240e60527ba82acf925e76d8e908..154e46c0edc8b2d7a63d00576f265159e098ba83 100644 (file)
@@ -6,25 +6,25 @@ all: $(TMPDIR)/libnative.a
        mv $(TMPDIR)/libnative.a $(TMPDIR)/native
        $(RUSTC) a.rs
        mv $(TMPDIR)/liba.rlib $(TMPDIR)/crate
-       $(RUSTC) b.rs -L $(TMPDIR)/crate:native && exit 1 || exit 0
-       $(RUSTC) b.rs -L $(TMPDIR)/crate:dependency && exit 1 || exit 0
-       $(RUSTC) b.rs -L $(TMPDIR)/crate:crate
-       $(RUSTC) b.rs -L $(TMPDIR)/crate
-       $(RUSTC) c.rs -L $(TMPDIR)/crate:native && exit 1 || exit 0
-       $(RUSTC) c.rs -L $(TMPDIR)/crate:crate && exit 1 || exit 0
-       $(RUSTC) c.rs -L $(TMPDIR)/crate:dependency
-       $(RUSTC) c.rs -L $(TMPDIR)/crate
-       $(RUSTC) d.rs -L $(TMPDIR)/native:dependency && exit 1 || exit 0
-       $(RUSTC) d.rs -L $(TMPDIR)/native:crate && exit 1 || exit 0
-       $(RUSTC) d.rs -L $(TMPDIR)/native:native
-       $(RUSTC) d.rs -L $(TMPDIR)/native
+       $(RUSTC) b.rs -L native=$(TMPDIR)/crate && exit 1 || exit 0
+       $(RUSTC) b.rs -L dependency=$(TMPDIR)/crate && exit 1 || exit 0
+       $(RUSTC) b.rs -L crate=$(TMPDIR)/crate
+       $(RUSTC) b.rs -L all=$(TMPDIR)/crate
+       $(RUSTC) c.rs -L native=$(TMPDIR)/crate && exit 1 || exit 0
+       $(RUSTC) c.rs -L crate=$(TMPDIR)/crate && exit 1 || exit 0
+       $(RUSTC) c.rs -L dependency=$(TMPDIR)/crate
+       $(RUSTC) c.rs -L all=$(TMPDIR)/crate
+       $(RUSTC) d.rs -L dependency=$(TMPDIR)/native && exit 1 || exit 0
+       $(RUSTC) d.rs -L crate=$(TMPDIR)/native && exit 1 || exit 0
+       $(RUSTC) d.rs -L native=$(TMPDIR)/native
+       $(RUSTC) d.rs -L all=$(TMPDIR)/native
        mkdir -p $(TMPDIR)/e1
        mkdir -p $(TMPDIR)/e2
        $(RUSTC) e.rs -o $(TMPDIR)/e1/libe.rlib
        $(RUSTC) e.rs -o $(TMPDIR)/e2/libe.rlib
        $(RUSTC) f.rs -L $(TMPDIR)/e1 -L $(TMPDIR)/e2 && exit 1 || exit 0
-       $(RUSTC) f.rs -L $(TMPDIR)/e1:crate -L $(TMPDIR)/e2 && exit 1 || exit 0
-       $(RUSTC) f.rs -L $(TMPDIR)/e1:crate -L $(TMPDIR)/e2:crate && exit 1 || exit 0
-       $(RUSTC) f.rs -L $(TMPDIR)/e1:native -L $(TMPDIR)/e2
-       $(RUSTC) f.rs -L $(TMPDIR)/e1:dependency -L $(TMPDIR)/e2
-       $(RUSTC) f.rs -L $(TMPDIR)/e1:dependency -L $(TMPDIR)/e2:crate
+       $(RUSTC) f.rs -L crate=$(TMPDIR)/e1 -L $(TMPDIR)/e2 && exit 1 || exit 0
+       $(RUSTC) f.rs -L crate=$(TMPDIR)/e1 -L crate=$(TMPDIR)/e2 && exit 1 || exit 0
+       $(RUSTC) f.rs -L native=$(TMPDIR)/e1 -L $(TMPDIR)/e2
+       $(RUSTC) f.rs -L dependency=$(TMPDIR)/e1 -L $(TMPDIR)/e2
+       $(RUSTC) f.rs -L dependency=$(TMPDIR)/e1 -L crate=$(TMPDIR)/e2
index d2a02adc9d4a458bfc6d5327203342248c8e0331..d0536956152504a1a95c58eea9080d532ea28c64 100644 (file)
@@ -1,7 +1,7 @@
 -include ../tools.mk
 
 all: $(TMPDIR)/libbar.a
-       $(RUSTC) foo.rs -lbar:static
+       $(RUSTC) foo.rs -lstatic=bar
        $(RUSTC) main.rs
        $(call RUN,main)