summaryrefslogtreecommitdiff
path: root/Build/source/libs/freetype2/freetype-src/builds/meson/extract_libtool_version.py
blob: 580f645c1ccd9f1a0979dcc9903ba1e883816aee (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
#!/usr/bin/env python3
#
# Copyright (C) 2020-2022 by
# David Turner, Robert Wilhelm, and Werner Lemberg.
#
# This file is part of the FreeType project, and may only be used, modified,
# and distributed under the terms of the FreeType project license,
# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
# indicate that you have read the license and understand and accept it
# fully.

"""Extract the libtool version from `configure.raw`.

This script parses the `configure.raw` file to extract the libtool version
number.  By default, the full dotted version number is printed, but
`--major`, `--minor` or `--patch` can be used to only print one of these
values instead.
"""

from __future__ import print_function

import argparse
import os
import re
import sys

# Expected input:
#
#  ...
#  version_info='23:2:17'
#  ...

RE_VERSION_INFO = re.compile(r"^version_info='(\d+):(\d+):(\d+)'")


def parse_configure_raw(header):
    major = None
    minor = None
    patch = None

    for line in header.splitlines():
        line = line.rstrip()
        m = RE_VERSION_INFO.match(line)
        if m:
            assert major == None, "version_info appears more than once!"
            major = m.group(1)
            minor = m.group(2)
            patch = m.group(3)
            continue

    assert (
        major and minor and patch
    ), "This input file is missing a version_info definition!"

    return (major, minor, patch)


def main():
    parser = argparse.ArgumentParser(description=__doc__)

    group = parser.add_mutually_exclusive_group()
    group.add_argument(
        "--major",
        action="store_true",
        help="Only print the major version number.",
    )
    group.add_argument(
        "--minor",
        action="store_true",
        help="Only print the minor version number.",
    )
    group.add_argument(
        "--patch",
        action="store_true",
        help="Only print the patch version number.",
    )
    group.add_argument(
        "--soversion",
        action="store_true",
        help="Only print the libtool library suffix.",
    )

    parser.add_argument(
        "input",
        metavar="CONFIGURE_RAW",
        help="The input configure.raw file to parse.",
    )

    args = parser.parse_args()
    with open(args.input) as f:
        raw_file = f.read()

    version = parse_configure_raw(raw_file)

    if args.major:
        print(version[0])
    elif args.minor:
        print(version[1])
    elif args.patch:
        print(version[2])
    elif args.soversion:
        # Convert libtool version_info to the library suffix.
        # (current,revision, age) -> (current - age, age, revision)
        print(
            "%d.%s.%s"
            % (int(version[0]) - int(version[2]), version[2], version[1])
        )
    else:
        print("%s.%s.%s" % version)

    return 0


if __name__ == "__main__":
    sys.exit(main())