From bf959a7fc119f9156c4b84c9d0a10900d9153f8d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 27 Jul 2017 14:45:05 +0200 Subject: Initial infrastructure for utility libraries --- build2/cc/common.cxx | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'build2/cc/common.cxx') diff --git a/build2/cc/common.cxx b/build2/cc/common.cxx index ec89e98..8dabb07 100644 --- a/build2/cc/common.cxx +++ b/build2/cc/common.cxx @@ -48,7 +48,7 @@ namespace build2 process_libraries ( action act, const scope& top_bs, - lorder top_lo, + linfo top_li, const dir_paths& top_sysd, const file& l, bool la, @@ -189,7 +189,7 @@ namespace build2 } const scope& bs (t == nullptr || cc ? top_bs : l.base_scope ()); - optional lo; // Calculate lazily. + optional li; // Calculate lazily. const dir_paths* sysd (nullptr); // Resolve lazily. // Find system search directories corresponding to this library, i.e., @@ -207,9 +207,11 @@ namespace build2 : var_pool[*t + ".sys_lib_dirs"]]); }; - auto find_lo = [top_lo, t, cc, &bs, &l, &lo] () + auto find_linfo = [top_li, t, cc, &bs, &l, &li] () { - lo = (t == nullptr || cc) ? top_lo : link_order (bs, link_type (l)); + li = (t == nullptr || cc) + ? top_li + : link_info (bs, link_type (l).type); }; // Only go into prerequisites (implementation) if instructed and we are @@ -223,13 +225,14 @@ namespace build2 bool a; const file* f; - if ((a = (f = p->is_a ()) != nullptr) - || (f = p->is_a ()) != nullptr) + if ((a = (f = p->is_a ())) || + (a = (f = p->is_a ())) || + ( f = p->is_a ())) { if (sysd == nullptr) find_sysd (); - if (!lo) find_lo (); + if (!li) find_linfo (); - process_libraries (act, bs, *lo, *sysd, + process_libraries (act, bs, *li, *sysd, *f, a, proc_impl, proc_lib, proc_opt, true); } @@ -266,8 +269,8 @@ namespace build2 auto proc_int = [&l, &proc_impl, &proc_lib, &proc_opt, &sysd, &usrd, - &find_sysd, &find_lo, &sys_simple, - &bs, act, &lo, this] (const lookup& lu) + &find_sysd, &find_linfo, &sys_simple, + &bs, act, &li, this] (const lookup& lu) { const vector* ns (cast_null> (lu)); if (ns == nullptr || ns->empty ()) @@ -290,9 +293,9 @@ namespace build2 // This is a potentially project-qualified target. // if (sysd == nullptr) find_sysd (); - if (!lo) find_lo (); + if (!li) find_linfo (); - const file& t (resolve_library (act, bs, n, *lo, *sysd, usrd)); + const file& t (resolve_library (act, bs, n, *li, *sysd, usrd)); if (proc_lib) { @@ -313,8 +316,8 @@ namespace build2 // Process it recursively. // - process_libraries (act, bs, *lo, *sysd, - t, t.is_a (), + process_libraries (act, bs, *li, *sysd, + t, t.is_a () || t.is_a (), proc_impl, proc_lib, proc_opt, true); } } @@ -394,7 +397,7 @@ namespace build2 resolve_library (action act, const scope& s, name n, - lorder lo, + linfo li, const dir_paths& sysd, optional& usrd) const { @@ -440,10 +443,10 @@ namespace build2 fail << "unable to find library " << pk; } - // If this is lib{}, pick appropriate member. + // If this is lib{}/libu{}, pick appropriate member. // - if (const lib* l = xt->is_a ()) - xt = &link_member (*l, act, lo); // Pick liba{} or libs{}. + if (const libx* l = xt->is_a ()) + xt = &link_member (*l, act, li); // Pick lib*{e,a,s}{}. return xt->as (); } @@ -488,6 +491,9 @@ namespace build2 // @@ This is hairy enough to warrant a separate implementation for // Windows. + + // Note: since we are searching for a (presumably) installed library, + // utility libraries do not apply. // bool l (p.is_a ()); const optional& ext (l ? nullopt : p.tk.ext); // Only liba/libs. -- cgit v1.1