aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/bin/guess.hxx
blob: 255932b21f4452a500d97f252df2a6f2ac4c69ea (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
// file      : libbuild2/bin/guess.hxx -*- C++ -*-
// license   : MIT; see accompanying LICENSE file

#ifndef LIBBUILD2_BIN_GUESS_HXX
#define LIBBUILD2_BIN_GUESS_HXX

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

namespace build2
{
  namespace bin
  {
    // ar/ranlib information.
    //
    // Currently recognized ar/ranlib and their ids:
    //
    // gnu          GNU binutils
    // llvm         LLVM ar
    // bsd          FreeBSD (and maybe other BSDs)
    // msvc         Microsoft's lib.exe
    // msvc-llvm    LLVM llvm-lib.exe
    // generic      Generic/unrecognized
    //
    // The signature is normally the --version/-V line.
    //
    // The checksum is used to detect ar/ranlib changes. It is calculated in
    // a toolchain-specific manner (usually the output of --version/-V) and
    // is not bulletproof.
    //
    struct ar_info
    {
      process_path ar_path;
      string ar_id;
      string ar_signature;
      string ar_checksum;
      semantic_version ar_version;

      process_path ranlib_path;
      string ranlib_id;
      string ranlib_signature;
      string ranlib_checksum;
    };

    // The ranlib path can be NULL, in which case no ranlib guessing will be
    // attemplated and the returned ranlib_* members will be left empty.
    //
    ar_info
    guess_ar (const path& ar, const path* ranlib, const char* paths);

    // ld information.
    //
    // Currently recognized linkers and their ids (following cc's type-variant
    // theme):
    //
    // gnu          GNU binutils ld.bfd
    // gnu-gold     GNU binutils ld.gold
    // gnu-lld      LLVM ld.lld (and older lld)
    // ld64         Apple's new linker
    // ld64-lld     LLVM ld64.lld
    // cctools      Apple's old/classic linker
    // msvc         Microsoft's link.exe
    // msvc-lld     LLVM lld-link.exe
    // wasm-lld     LLVM wasm-ld
    //
    // Note that BSDs are currently using GNU ld but some of them (e.g.,
    // FreeBSD) are hoping to migrate to lld.
    //
    // The signature is normally the --version/-version/-v line.
    //
    // The checksum is used to detect ld changes. It is calculated in a
    // toolchain-specific manner (usually the output of --version/-version/-v)
    // and is not bulletproof.
    //
    struct ld_info
    {
      process_path path;
      string id;
      string signature;
      string checksum;
    };

    ld_info
    guess_ld (const path& ld, const char* paths);

    // rc information.
    //
    // Currently recognized resource compilers and their ids:
    //
    // gnu          GNU binutils windres
    // msvc         Microsoft's rc.exe
    // msvc-llvm    LLVM llvm-rc.exe
    //
    // The signature is normally the --version line.
    //
    // The checksum is used to detect rc changes. It is calculated in a
    // toolchain-specific manner (usually the output of --version) and is not
    // bulletproof.
    //
    struct rc_info
    {
      process_path path;
      string id;
      string signature;
      string checksum;
    };

    rc_info
    guess_rc (const path& rc, const char* paths);
  }
}

#endif // LIBBUILD2_BIN_GUESS_HXX