From 70317569c6dcd9809ed4a8c425777e653ec6ca08 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 1 May 2017 18:24:31 +0300 Subject: Add hxx extension for headers --- build2/cc/target.hxx | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 build2/cc/target.hxx (limited to 'build2/cc/target.hxx') diff --git a/build2/cc/target.hxx b/build2/cc/target.hxx new file mode 100644 index 0000000..4c9e4cb --- /dev/null +++ b/build2/cc/target.hxx @@ -0,0 +1,63 @@ +// file : build2/cc/target.hxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD2_CC_TARGET_HXX +#define BUILD2_CC_TARGET_HXX + +#include +#include + +#include + +namespace build2 +{ + namespace cc + { + // This is an abstract base target for all c-common source files. We use + // this arrangement in rule matching to detect "unknown" (to this rule) + // source files that it cannot handle but should not ignore either. For + // example, a C link rule that sees a C++ source file. + // + class cc: public file + { + public: + using file::file; + + public: + static const target_type static_type; + virtual const target_type& dynamic_type () const = 0; + }; + + // There is hardly a c-family compilation without a C header inclusion. + // As a result, this target type is registered for any c-family module. + // + class h: public file + { + public: + using file::file; + + public: + static const target_type static_type; + virtual const target_type& dynamic_type () const {return static_type;} + }; + + // This one we define in cc but the target type is only registered by the + // c module. This way we can implement rule chaining without jumping + // through too many hoops (like resolving target type dynamically) but + // also without relaxing things too much (i.e., the user still won't be + // able to refer to c{} without loading the c module). + // + class c: public cc + { + public: + using cc::cc; + + public: + static const target_type static_type; + virtual const target_type& dynamic_type () const {return static_type;} + }; + } +} + +#endif // BUILD2_CC_TARGET_HXX -- cgit v1.1