aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/bash/init.cxx
blob: bd0e34b3c66d989be8bfe97a05ba90f7c76def66 (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// file      : libbuild2/bash/init.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#include <libbuild2/bash/init.hxx>

#include <libbuild2/scope.hxx>
#include <libbuild2/variable.hxx>
#include <libbuild2/diagnostics.hxx>

#include <libbuild2/install/utility.hxx>

#include <libbuild2/bash/rule.hxx>
#include <libbuild2/bash/target.hxx>
#include <libbuild2/bash/utility.hxx>

using namespace std;

namespace build2
{
  namespace bash
  {
    static const in_rule in_rule_;
    static const install_rule install_rule_ (in_rule_);

    bool
    init (scope& rs,
          scope& bs,
          const location& l,
          unique_ptr<module_base>&,
          bool,
          bool,
          const variable_map&)
    {
      tracer trace ("bash::init");
      l5 ([&]{trace << "for " << bs;});

      // Load in.base (in.* variables, in{} target type).
      //
      if (!cast_false<bool> (rs["in.base.loaded"]))
        load_module (rs, rs, "in.base", l);

      bool install_loaded (cast_false<bool> (rs["install.loaded"]));

      // Register target types and configure default installability.
      //
      bs.target_types.insert<bash> ();

      if (install_loaded)
      {
        using namespace install;

        // Install into bin/<project>/ by default stripping the .bash
        // extension from <project> if present.
        //
        const project_name& p (project (rs));

        if (!p.empty ())
        {
          install_path<bash> (bs, dir_path ("bin") /= project_base (p));
          install_mode<bash> (bs, "644");
        }
      }

      // Register rules.
      //
      {
        auto& r (bs.rules);

        r.insert<exe> (perform_update_id,   "bash.in", in_rule_);
        r.insert<exe> (perform_clean_id,    "bash.in", in_rule_);
        r.insert<exe> (configure_update_id, "bash.in", in_rule_);

        r.insert<bash> (perform_update_id,   "bash.in", in_rule_);
        r.insert<bash> (perform_clean_id,    "bash.in", in_rule_);
        r.insert<bash> (configure_update_id, "bash.in", in_rule_);

        if (install_loaded)
        {
          r.insert<exe>  (perform_install_id,   "bash.install",   install_rule_);
          r.insert<exe>  (perform_uninstall_id, "bash.uninstall", install_rule_);

          r.insert<bash> (perform_install_id,   "bash.install",   install_rule_);
          r.insert<bash> (perform_uninstall_id, "bash.uninstall", install_rule_);
        }
      }

      return true;
    }

    static const module_functions mod_functions[] =
    {
      // NOTE: don't forget to also update the documentation in init.hxx if
      //       changing anything here.

      {"bash",  nullptr, init},
      {nullptr, nullptr, nullptr}
    };

    const module_functions*
    build2_bash_load ()
    {
      return mod_functions;
    }
  }
}