]> granicus.if.org Git - clang/commitdiff
[driver] Older versions of ld expect '-L<dir>' not '-L <dir>'. In Xcode4 and
authorChad Rosier <mcrosier@apple.com>
Tue, 30 Oct 2012 21:42:09 +0000 (21:42 +0000)
committerChad Rosier <mcrosier@apple.com>
Tue, 30 Oct 2012 21:42:09 +0000 (21:42 +0000)
later, '-L <dir>' is allowed, but rewrite these in the driver as '-L<dir>' to
maintain backward compatibility.  The same is true for the -I option.
rdar://12366753

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167054 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Tools.cpp
test/Driver/cpath.c
test/Driver/linker-opts.c

index d0cf1cad5e5456123b82110419fde8ff9b99bc20..7c48d6bc41a0617e9f506fafbc6ec953e0f13a17 100644 (file)
@@ -93,9 +93,15 @@ static void addDirectoryList(const ArgList &Args,
                              const char *ArgName,
                              const char *EnvVar) {
   const char *DirList = ::getenv(EnvVar);
+  bool CombinedArg = false;
+
   if (!DirList)
     return; // Nothing to do.
 
+  StringRef Name(ArgName);
+  if (Name.equals("-I") || Name.equals("-L"))
+    CombinedArg = true;
+
   StringRef Dirs(DirList);
   if (Dirs.empty()) // Empty string should not add '.'.
     return;
@@ -103,21 +109,37 @@ static void addDirectoryList(const ArgList &Args,
   StringRef::size_type Delim;
   while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
     if (Delim == 0) { // Leading colon.
-      CmdArgs.push_back(ArgName);
-      CmdArgs.push_back(".");
+      if (CombinedArg) {
+        CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
+      } else {
+        CmdArgs.push_back(ArgName);
+        CmdArgs.push_back(".");
+      }
     } else {
-      CmdArgs.push_back(ArgName);
-      CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
+      if (CombinedArg) {
+        CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
+      } else {
+        CmdArgs.push_back(ArgName);
+        CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
+      }
     }
     Dirs = Dirs.substr(Delim + 1);
   }
 
   if (Dirs.empty()) { // Trailing colon.
-    CmdArgs.push_back(ArgName);
-    CmdArgs.push_back(".");
+    if (CombinedArg) {
+      CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
+    } else {
+      CmdArgs.push_back(ArgName);
+      CmdArgs.push_back(".");
+    }
   } else { // Add the last path.
-    CmdArgs.push_back(ArgName);
-    CmdArgs.push_back(Args.MakeArgString(Dirs));
+    if (CombinedArg) {
+      CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
+    } else {
+      CmdArgs.push_back(ArgName);
+      CmdArgs.push_back(Args.MakeArgString(Dirs));
+    }
   }
 }
 
index bd7c8d0ab5f0c64b08acd5799b6fe2f7580b77dd..ea6ba49d6d51f4eef86dd480d038e54c2b156afc 100644 (file)
@@ -1,8 +1,8 @@
 // RUN: mkdir -p %T/test1 %T/test2 %T/test3
 
 // RUN: env "CPATH=%T/test1%{pathsep}%T/test2" %clang -x c -E -v %s 2>&1 | FileCheck %s -check-prefix=CPATH
-// CPATH: -I {{.*}}/test1
-// CPATH: -I {{.*}}/test2
+// CPATH: -I{{.*}}/test1
+// CPATH: -I{{.*}}/test2
 // CPATH: search starts here
 // CPATH: test1
 // CPATH: test2
index 85e180c4e2106a38a3bd041dd890cb1ee1f15c66..2a96a17c70d3134612cebe256ed2257795f3aede 100644 (file)
@@ -1,5 +1,5 @@
 // RUN: env LIBRARY_PATH=%T/test1 %clang -x c %s -### 2>&1 | FileCheck %s
-// CHECK: "-L" "{{.*}}/test1"
+// CHECK: "-L{{.*}}/test1"
 
 // GCC driver is used as linker on cygming. It should be aware of LIBRARY_PATH.
 // XFAIL: cygwin,mingw32,win32