diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2019-02-15 09:11:34 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2019-02-15 09:11:34 +0200 |
commit | 9c74a58db7cdb86d6d5a4600accd8ba9df3e1bbe (patch) | |
tree | 105dc6708a80bfa4cd97e6fb5f947bef78be4d87 | |
parent | f11213933bc79c8115974f5f7971b97413481654 (diff) |
Don't try to pass utility's loptions/libs when linking static library
-rw-r--r-- | build2/cc/common.cxx | 4 | ||||
-rw-r--r-- | build2/cc/link-rule.cxx | 45 |
2 files changed, 36 insertions, 13 deletions
diff --git a/build2/cc/common.cxx b/build2/cc/common.cxx index 318a7f1..5ccb198 100644 --- a/build2/cc/common.cxx +++ b/build2/cc/common.cxx @@ -305,8 +305,8 @@ namespace build2 { // This is something like -lpthread or shell32.lib so should be // a valid path. But it can also be an absolute library path - // (e.g., something that in the future will come from our - // -static/-shared .pc files. + // (e.g., something that may come from our .static/shared.pc + // files). // if (proc_lib) proc_lib (nullptr, n.value, 0, sys_simple (n.value)); diff --git a/build2/cc/link-rule.cxx b/build2/cc/link-rule.cxx index a899ab2..30f1df8 100644 --- a/build2/cc/link-rule.cxx +++ b/build2/cc/link-rule.cxx @@ -1193,7 +1193,10 @@ namespace build2 linfo li; } d {args, l, a, li}; - auto imp = [] (const file&, bool la) {return la;}; + auto imp = [] (const file&, bool la) + { + return la; + }; auto lib = [&d, this] (const file* const* lc, const string& p, @@ -1204,7 +1207,11 @@ namespace build2 if (l == nullptr) { - d.args.push_back (p); + // Don't try to link a library (whether -lfoo or foo.lib) to a + // static library. + // + if (d.li.type != otype::a) + d.args.push_back (p); } else { @@ -1313,9 +1320,16 @@ namespace build2 } }; - auto opt = [&args, this] ( - const file& l, const string& t, bool com, bool exp) + auto opt = [&d, this] (const file& l, + const string& t, + bool com, + bool exp) { + // Don't try to pass any loptions when linking a static library. + // + if (d.li.type == otype::a) + return; + // If we need an interface value, then use the group (lib{}). // if (const target* g = exp && l.is_a<libs> () ? l.group : &l) @@ -1327,7 +1341,7 @@ namespace build2 ? (exp ? x_export_loptions : x_loptions) : var_pool[t + (exp ? ".export.loptions" : ".loptions")])); - append_options (args, *g, var); + append_options (d.args, *g, var); } }; @@ -1341,8 +1355,6 @@ namespace build2 const file& l, bool la, lflags lf, const scope& bs, action a, linfo li) const { - auto imp = [] (const file&, bool la) {return la;}; - struct data { sha256& cs; @@ -1352,6 +1364,11 @@ namespace build2 linfo li; } d {cs, bs.root_scope ()->out_path (), update, mt, li}; + auto imp = [] (const file&, bool la) + { + return la; + }; + auto lib = [&d, this] (const file* const* lc, const string& p, lflags f, @@ -1361,7 +1378,8 @@ namespace build2 if (l == nullptr) { - d.cs.append (p); + if (d.li.type != otype::a) + d.cs.append (p); } else { @@ -1407,9 +1425,14 @@ namespace build2 } }; - auto opt = [&cs, this] ( - const file& l, const string& t, bool com, bool exp) + auto opt = [&d, this] (const file& l, + const string& t, + bool com, + bool exp) { + if (d.li.type == otype::a) + return; + if (const target* g = exp && l.is_a<libs> () ? l.group : &l) { const variable& var ( @@ -1419,7 +1442,7 @@ namespace build2 ? (exp ? x_export_loptions : x_loptions) : var_pool[t + (exp ? ".export.loptions" : ".loptions")])); - hash_options (cs, *g, var); + hash_options (d.cs, *g, var); } }; |