From 18e079b37794dc97b6c51045476bf43296b56dd3 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 22 Aug 2023 09:43:20 +0200 Subject: Add abstract c_inc{} and cxx_inc{} target types These abstract base target types are meant for deriving additional target types (for example, Qt moc{}) that can be #include'd in C and C++ translation units, respectively. In particular, only such targets will be considered to reverse-lookup extensions to target types (see dyndep_rule::map_extension() for background). --- libbuild2/c/init.cxx | 3 ++- libbuild2/c/target.hxx | 1 + libbuild2/cc/target.cxx | 13 +++++++++++++ libbuild2/cc/target.hxx | 19 +++++++++++++++++++ libbuild2/cxx/init.cxx | 6 ++++-- libbuild2/cxx/target.cxx | 13 +++++++++++++ libbuild2/cxx/target.hxx | 20 +++++++++++++++++++- 7 files changed, 71 insertions(+), 4 deletions(-) diff --git a/libbuild2/c/init.cxx b/libbuild2/c/init.cxx index c3d8174..1922a99 100644 --- a/libbuild2/c/init.cxx +++ b/libbuild2/c/init.cxx @@ -350,7 +350,7 @@ namespace build2 }; // Note that we include S{} here because .S files can include each other. - // (And maybe from inline assember instrcutions?) + // (And maybe from inline assembler instructions?) // static const target_type* const inc[] = { @@ -358,6 +358,7 @@ namespace build2 &c::static_type, &m::static_type, &S::static_type, + &c_inc::static_type, nullptr }; diff --git a/libbuild2/c/target.hxx b/libbuild2/c/target.hxx index 39fcf89..c9955e3 100644 --- a/libbuild2/c/target.hxx +++ b/libbuild2/c/target.hxx @@ -17,6 +17,7 @@ namespace build2 using cc::c; using cc::m; using cc::S; + using cc::c_inc; } } diff --git a/libbuild2/cc/target.cxx b/libbuild2/cc/target.cxx index 6c5d7c8..6a518dd 100644 --- a/libbuild2/cc/target.cxx +++ b/libbuild2/cc/target.cxx @@ -80,6 +80,19 @@ namespace build2 target_type::flag::none }; + const target_type c_inc::static_type + { + "c_inc", + &cc::static_type, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + &target_search, + target_type::flag::none + }; + extern const char pc_ext[] = "pc"; // VC14 rejects constexpr. const target_type pc::static_type { diff --git a/libbuild2/cc/target.hxx b/libbuild2/cc/target.hxx index a078422..01f2d6e 100644 --- a/libbuild2/cc/target.hxx +++ b/libbuild2/cc/target.hxx @@ -100,6 +100,25 @@ namespace build2 static const target_type static_type; }; + // This is an abstract base target for deriving additional targets that + // can be #include'd in C translation units (the same rationale for having + // it here as for c{} above). In particular, only such targets will be + // considered to reverse-lookup extensions to target types (see + // dyndep_rule::map_extension() for background). + // + class LIBBUILD2_CC_SYMEXPORT c_inc: public cc + { + public: + c_inc (context& c, dir_path d, dir_path o, string n) + : cc (c, move (d), move (o), move (n)) + { + dynamic_type = &static_type; + } + + public: + static const target_type static_type; + }; + // pkg-config file targets. // class LIBBUILD2_CC_SYMEXPORT pc: public file // .pc (common) diff --git a/libbuild2/cxx/init.cxx b/libbuild2/cxx/init.cxx index 3cf330f..d5476a6 100644 --- a/libbuild2/cxx/init.cxx +++ b/libbuild2/cxx/init.cxx @@ -806,8 +806,8 @@ namespace build2 }; // Note that we don't include S{} here because none of the files we - // compile can plausibly want to include .S. (Maybe in inline assember - // instrcutions?) + // compile can plausibly want to include .S. (Maybe in inline assembler + // instructions?) // static const target_type* const inc[] = { @@ -820,6 +820,8 @@ namespace build2 &c::static_type, &mm::static_type, &m::static_type, + &cxx_inc::static_type, + &cc::c_inc::static_type, nullptr }; diff --git a/libbuild2/cxx/target.cxx b/libbuild2/cxx/target.cxx index 5ead620..37096c3 100644 --- a/libbuild2/cxx/target.cxx +++ b/libbuild2/cxx/target.cxx @@ -90,5 +90,18 @@ namespace build2 &file_search, target_type::flag::none }; + + const target_type cxx_inc::static_type + { + "cxx_inc", + &cc::static_type, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + &target_search, + target_type::flag::none + }; } } diff --git a/libbuild2/cxx/target.hxx b/libbuild2/cxx/target.hxx index fc85f75..06e8a67 100644 --- a/libbuild2/cxx/target.hxx +++ b/libbuild2/cxx/target.hxx @@ -7,7 +7,6 @@ #include #include -#include #include #include @@ -104,6 +103,25 @@ namespace build2 public: static const target_type static_type; }; + + // This is an abstract base target for deriving additional targets (for + // example, Qt moc{}) that can be #include'd in C++ translation units. In + // particular, only such targets will be considered to reverse-lookup + // extensions to target types (see dyndep_rule::map_extension() for + // background). + // + class LIBBUILD2_CXX_SYMEXPORT cxx_inc: public cc::cc + { + public: + cxx_inc (context& c, dir_path d, dir_path o, string n) + : cc (c, move (d), move (o), move (n)) + { + dynamic_type = &static_type; + } + + public: + static const target_type static_type; + }; } } -- cgit v1.1