From 151b9cf30d11a014503b0a060a6bb7875c509adf Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 22 Aug 2023 14:16:56 +0200 Subject: Consider *_inc{} target types as headers for rule match purposes --- libbuild2/c/init.cxx | 1 + libbuild2/cc/common.hxx | 17 ++++++++++------- libbuild2/cc/compile-rule.cxx | 8 ++++---- libbuild2/cc/link-rule.cxx | 7 +++++-- libbuild2/cc/module.cxx | 6 +++--- libbuild2/cc/pkgconfig.cxx | 4 ++-- libbuild2/cxx/init.cxx | 1 + 7 files changed, 26 insertions(+), 18 deletions(-) diff --git a/libbuild2/c/init.cxx b/libbuild2/c/init.cxx index 1922a99..ebf0631 100644 --- a/libbuild2/c/init.cxx +++ b/libbuild2/c/init.cxx @@ -424,6 +424,7 @@ namespace build2 c::static_type, nullptr, // No C modules yet. + c_inc::static_type, hdr, inc }; diff --git a/libbuild2/cc/common.hxx b/libbuild2/cc/common.hxx index eefcc0d..d7caeb9 100644 --- a/libbuild2/cc/common.hxx +++ b/libbuild2/cc/common.hxx @@ -223,6 +223,7 @@ namespace build2 // const target_type& x_src; // Source target type (c{}, cxx{}). const target_type* x_mod; // Module target type (mxx{}), if any. + const target_type& x_inc; // Includable base target type (e.g., c_inc{}). const target_type* x_obj; // Objective-X target type (m{}, mm{}). const target_type* x_asp; // Assembler with CPP target type (S{}). @@ -250,7 +251,7 @@ namespace build2 // (excluding h{} except for C). Keep them in the most likely to appear // order with the "real header" first and terminated with NULL. // - const target_type* const* x_hdr; + const target_type* const* x_hdrs; // Check if an object (target, prerequisite, etc) is a header. // @@ -258,7 +259,7 @@ namespace build2 bool x_header (const T& t, bool c_hdr = true) const { - for (const target_type* const* ht (x_hdr); *ht != nullptr; ++ht) + for (const target_type* const* ht (x_hdrs); *ht != nullptr; ++ht) if (t.is_a (**ht)) return true; @@ -269,7 +270,7 @@ namespace build2 // extensions to target types. Keep them in the most likely to appear // order and terminate with NULL. // - const target_type* const* x_inc; + const target_type* const* x_incs; // Aggregate-like constructor with from-base support. // @@ -297,8 +298,9 @@ namespace build2 size_t sle, size_t she, const target_type& src, const target_type* mod, - const target_type* const* hdr, - const target_type* const* inc) + const target_type& inc, + const target_type* const* hdrs, + const target_type* const* incs) : config_data (cd), x_compile (compile), x_link (link), @@ -318,8 +320,9 @@ namespace build2 sys_lib_dirs_mode (slm), sys_hdr_dirs_mode (shm), sys_mod_dirs_mode (smm), sys_lib_dirs_extra (sle), sys_hdr_dirs_extra (she), - x_src (src), x_mod (mod), x_obj (nullptr), x_asp (nullptr), - x_hdr (hdr), x_inc (inc) {} + x_src (src), x_mod (mod), x_inc (inc), + x_obj (nullptr), x_asp (nullptr), + x_hdrs (hdrs), x_incs (incs) {} }; class LIBBUILD2_CC_SYMEXPORT common: public data diff --git a/libbuild2/cc/compile-rule.cxx b/libbuild2/cc/compile-rule.cxx index fa46332..35d77f8 100644 --- a/libbuild2/cc/compile-rule.cxx +++ b/libbuild2/cc/compile-rule.cxx @@ -483,8 +483,8 @@ namespace build2 // For a header unit we check the "real header" plus the C header. // - if (ut == unit_type::module_header ? p.is_a (**x_hdr) || p.is_a () : - ut == unit_type::module_intf ? p.is_a (*x_mod) : + if (ut == unit_type::module_header ? p.is_a (**x_hdrs) || p.is_a () : + ut == unit_type::module_intf ? p.is_a (*x_mod) : p.is_a (x_src) || (x_asp != nullptr && p.is_a (*x_asp)) || (x_obj != nullptr && p.is_a (*x_obj))) @@ -3091,7 +3091,7 @@ namespace build2 // single "version" of a header. Seems reasonable. // // Note also that while it would have been nice to have a unified cc - // cache, the map_extension() call is passed x_inc which is module- + // cache, the map_extension() call is passed x_incs which is module- // specific. In other words, we may end up mapping the same header to // two different targets depending on whether it is included from, say, // C or C++ translation unit. We could have used a unified cache for @@ -3155,7 +3155,7 @@ namespace build2 fp, cache, norm, [this] (const scope& bs, const string& n, const string& e) { - return map_extension (bs, n, e, x_inc); + return map_extension (bs, n, e, x_incs); }, h::static_type, [this, &d] (action a, const scope& bs, const target& t) diff --git a/libbuild2/cc/link-rule.cxx b/libbuild2/cc/link-rule.cxx index e47a40d..58359aa 100644 --- a/libbuild2/cc/link-rule.cxx +++ b/libbuild2/cc/link-rule.cxx @@ -436,9 +436,12 @@ namespace build2 r.seen_lib = true; } // Some other c-common header/source (say C++ in a C rule) other than - // a C header (we assume everyone can hanle that). + // a C header (we assume everyone can hanle that) or some other + // #include'able target. // - else if (p.is_a () && !(x_header (p, true /* c_hdr */))) + else if (p.is_a () && + !(x_header (p, true /* c_hdr */)) && + !p.is_a (x_inc) && !p.is_a ()) { r.seen_cc = true; break; diff --git a/libbuild2/cc/module.cxx b/libbuild2/cc/module.cxx index f33ddf4..3e756c4 100644 --- a/libbuild2/cc/module.cxx +++ b/libbuild2/cc/module.cxx @@ -994,14 +994,14 @@ namespace build2 install_path (rs, tt, dir_path ("include")); }; - // Note: module (x_mod) is in x_hdr. + // Note: module (x_mod) is in x_hdrs. // - for (const target_type* const* ht (x_hdr); *ht != nullptr; ++ht) + for (const target_type* const* ht (x_hdrs); *ht != nullptr; ++ht) insert_hdr (**ht); // Also register the C header for C-derived languages. // - if (*x_hdr != &h::static_type) + if (*x_hdrs != &h::static_type) insert_hdr (h::static_type); rs.insert_target_type (); diff --git a/libbuild2/cc/pkgconfig.cxx b/libbuild2/cc/pkgconfig.cxx index 362e867..f04876b 100644 --- a/libbuild2/cc/pkgconfig.cxx +++ b/libbuild2/cc/pkgconfig.cxx @@ -1331,7 +1331,7 @@ namespace build2 // We treat headers outside of any project as C headers (see // enter_header() for details). // - parse_headers (ipc, h::static_type /* **x_hdr */, x, prs); + parse_headers (ipc, h::static_type /* **x_hdrs */, x, prs); parse_headers (ipc, h::static_type, "c", prs); } @@ -2266,7 +2266,7 @@ namespace build2 move (pp), symexport}); } - else if (pt->is_a (**x_hdr) || pt->is_a ()) + else if (pt->is_a (**this->x_hdrs) || pt->is_a ()) { if (cast_false ((*pt)[c_importable])) { diff --git a/libbuild2/cxx/init.cxx b/libbuild2/cxx/init.cxx index d5476a6..0d4faf2 100644 --- a/libbuild2/cxx/init.cxx +++ b/libbuild2/cxx/init.cxx @@ -899,6 +899,7 @@ namespace build2 cxx::static_type, modules ? &mxx::static_type : nullptr, + cxx_inc::static_type, hdr, inc }; -- cgit v1.1