aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2023-08-22 09:43:20 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2023-08-22 09:43:20 +0200
commit18e079b37794dc97b6c51045476bf43296b56dd3 (patch)
treeb81682b523ab87827bbfa7c9080a9b20dcbbda65
parent1741b21e27945da8c55069fa7cd66e55757be053 (diff)
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).
-rw-r--r--libbuild2/c/init.cxx3
-rw-r--r--libbuild2/c/target.hxx1
-rw-r--r--libbuild2/cc/target.cxx13
-rw-r--r--libbuild2/cc/target.hxx19
-rw-r--r--libbuild2/cxx/init.cxx6
-rw-r--r--libbuild2/cxx/target.cxx13
-rw-r--r--libbuild2/cxx/target.hxx20
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 <libbuild2/types.hxx>
#include <libbuild2/utility.hxx>
-#include <libbuild2/target.hxx>
#include <libbuild2/cc/target.hxx>
#include <libbuild2/cxx/export.hxx>
@@ -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;
+ };
}
}