about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/build-managers/build2/nix-ldflags-sysdirs.patch
blob: 4a1013f16e019dc420c9b6c913d56aef735feb67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
diff --git a/libbuild2/cc/common.cxx b/libbuild2/cc/common.cxx
index f848003c..0f14f9a5 100644
--- a/libbuild2/cc/common.cxx
+++ b/libbuild2/cc/common.cxx
@@ -966,6 +966,17 @@ namespace build2
     void
     msvc_extract_library_search_dirs (const strings&, dir_paths&); // msvc.cxx
 
+    static strings split (const string& s, const char delim) {
+      stringstream ss (s);
+      string item;
+      strings result;
+
+      while (getline (ss, item, delim)) {
+        result.push_back (item);
+      }
+      return result;
+    }
+
     dir_paths common::
     extract_library_search_dirs (const scope& bs) const
     {
@@ -987,8 +998,19 @@ namespace build2
           msvc_extract_library_search_dirs (v, r);
         else
           gcc_extract_library_search_dirs (v, r);
+
       };
 
+      // NIX_LDFLAGS are implicitly used when linking,
+      // so its -L flags effectively specify system dirs.
+      // However, they are only enabled when actually linking and are thus
+      // not detected by build2, so we need to manually pick them up here.
+      if (auto s = getenv ("NIX_LDFLAGS")) {
+        // TODO: do we need more robust args splitting here? e.g. shlex.split
+        auto args = split (s.value (), ' ');
+        gcc_extract_library_search_dirs (args, r);
+      }
+
       // Note that the compiler mode options are in sys_lib_dirs.
       //
       if (auto l = bs[c_loptions]) extract (*l, c_loptions);