aboutsummaryrefslogtreecommitdiff
path: root/build2/cc/link.hxx
blob: 4dc722aa0584dbff170069b32e183dc0983326f1 (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// file      : build2/cc/link.hxx -*- C++ -*-
// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#ifndef BUILD2_CC_LINK_HXX
#define BUILD2_CC_LINK_HXX

#include <set>

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

#include <build2/rule.hxx>

#include <build2/cc/types.hxx>
#include <build2/cc/common.hxx>

namespace build2
{
  namespace cc
  {
    class link: public rule, virtual common
    {
    public:
      link (data&&);

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

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

      target_state
      perform_update (action, const target&) const;

      target_state
      perform_clean (action, const target&) const;

    private:
      friend class install;

      // Shared library paths.
      //
      struct libs_paths
      {
        // If any (except real) is empty, then it is the same as the next
        // one. Except for intermediate, for which empty indicates that it is
        // not used.
        //
        // The libs{} path is always the real path. On Windows the link path
        // is the import library.
        //
        const path  link;   // What we link: libfoo.so
        const path  soname; // SONAME:       libfoo-1.so, libfoo.so.1
        const path  interm; // Intermediate: libfoo.so.1.2
        const path& real;   // Real:         libfoo.so.1.2.3

        inline const path&
        effect_link () const {return link.empty () ? effect_soname () : link;}

        inline const path&
        effect_soname () const {return soname.empty () ? real : soname;}

        // Cleanup pattern used to remove previous versions. If empty, no
        // cleanup is performed. The above (current) names are automatically
        // filtered out.
        //
        const path clean;
      };

      libs_paths
      derive_libs_paths (file&) const;

      // Library handling.
      //
      void
      append_libraries (strings&,
                        const file&, bool,
                        const scope&, action, lorder) const;

      void
      hash_libraries (sha256&,
                      const file&, bool,
                      const scope&, action, lorder) const;

      void
      rpath_libraries (strings&,
                       const target&,
                       const scope&, action, lorder,
                       bool) const;

      // Windows rpath emulation (windows-rpath.cxx).
      //
      struct windows_dll
      {
        const string& dll;
        const string* pdb; // NULL if none.
        string pdb_storage;

        bool operator< (const windows_dll& y) const {return dll < y.dll;}
      };

      using windows_dlls = std::set<windows_dll>;

      timestamp
      windows_rpath_timestamp (const file&,
                               const scope&,
                               action, lorder) const;

      windows_dlls
      windows_rpath_dlls (const file&, const scope&, action, lorder) const;

      void
      windows_rpath_assembly (const file&, const scope&, action, lorder,
                              const string&,
                              timestamp,
                              bool) const;

      // Windows-specific (windows-manifest.cxx).
      //
      pair<path, bool>
      windows_manifest (const file&, bool rpath_assembly) const;

    private:
      const string rule_id;
    };
  }
}

#endif // BUILD2_CC_LINK_HXX