aboutsummaryrefslogtreecommitdiff
path: root/build2/install/rule.hxx
blob: ad0d8ec795247210f1c4b5f82f00e68051b3bcec (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
107
108
109
110
111
// file      : build2/install/rule.hxx -*- C++ -*-
// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#ifndef BUILD2_INSTALL_RULE_HXX
#define BUILD2_INSTALL_RULE_HXX

#include <build2/types.hxx>
#include <build2/utility.hxx>

#include <build2/rule.hxx>
#include <build2/target.hxx>
#include <build2/operation.hxx>

namespace build2
{
  namespace install
  {
    class alias_rule: public rule
    {
    public:
      static const alias_rule instance;

      alias_rule () {}

      virtual match_result
      match (action, target&, const string&) const override;

      virtual recipe
      apply (action, target&) const override;

      // Return NULL if this prerequisite should be ignored and pointer to its
      // target otherwise. The default implementation accepts all prerequsites.
      //
      virtual const target*
      filter (action, const target&, prerequisite_member) const;
    };

    struct install_dir;

    class file_rule: public rule
    {
    public:
      static const file_rule instance;

      file_rule () {}

      virtual match_result
      match (action, target&, const string&) const override;

      virtual recipe
      apply (action, target&) const override;

      // Return NULL if this prerequisite should be ignored and pointer to its
      // target otherwise. The default implementation ignores prerequsites that
      // are outside of this target's project.
      //
      virtual const target*
      filter (action, const target&, prerequisite_member) const;

      // Extra installation hooks.
      //
      using install_dir = install::install_dir;

      virtual void
      install_extra (const file&, const install_dir&) const;

      // Return true if anything was uninstalled.
      //
      virtual bool
      uninstall_extra (const file&, const install_dir&) const;

      // Installation "commands".
      //
      // If verbose is false, then only print the command at verbosity level 2
      // or higher.
      //
    public:
      // Install a symlink: base/link -> target.
      //
      static void
      install_l (const install_dir& base,
                 const path& target,
                 const path& link,
                 bool verbose);

      // Uninstall a file or symlink:
      //
      // uninstall <target> <base>/  rm <base>/<target>.leaf (); name empty
      // uninstall <target> <name>   rm <base>/<name>; target can be NULL
      //
      // Return false if nothing has been removed (i.e., the file does not
      // exist).
      //
      static bool
      uninstall_f (const install_dir& base,
                   const file* t,
                   const path& name,
                   bool verbose);

    private:
      target_state
      perform_install (action, const target&) const;

      target_state
      perform_uninstall (action, const target&) const;
    };
  }
}

#endif // BUILD2_INSTALL_RULE_HXX