aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/in/target.cxx
blob: d9bc8a78e13615e7bb32b14bac1a4abc9fb8f40b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// file      : libbuild2/in/target.cxx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

#include <libbuild2/in/target.hxx>

using namespace std;

namespace build2
{
  namespace in
  {
    static const target*
    in_search (const target& xt, const prerequisite_key& cpk)
    {
      // If we have no extension then derive it from our target. Then delegate
      // to file_search().
      //
      prerequisite_key pk (cpk);
      optional<string>& e (pk.tk.ext);

      if (!e)
      {
        if (const file* t = xt.is_a<file> ())
        {
          const string& te (t->derive_extension ());
          e = te + (te.empty () ? "" : ".") + "in";
        }
        else
          fail << "prerequisite " << pk << " for a non-file target " << xt;
      }

      return file_search (xt, pk);
    }

    static bool
    in_pattern (const target_type&,
                const scope&,
                string&,
                optional<string>&,
                const location& l,
                bool)
    {
      fail (l) << "pattern in in{} prerequisite" << endf;
    }

    const target_type in::static_type
    {
      "in",
      &file::static_type,
      &target_factory<in>,
      &target_extension_none,
      nullptr, /* default_extension */   // Taken care of by search.
      &in_pattern,
      &target_print_1_ext_verb,          // Same as file.
      &in_search,
      false
    };
  }
}