Imported Upstream version 2.10.4
[platform/upstream/freetype2.git] / builds / meson / extract_freetype_version.py
1 #!/usr/bin/env python
2 """Extract the FreeType version numbers from `<freetype/freetype.h>`.
3
4 This script parses the header to extract the version number defined there.
5 By default, the full dotted version number is printed, but `--major`,
6 `--minor` or `--patch` can be used to only print one of these values
7 instead.
8 """
9
10 from __future__ import print_function
11
12 import argparse
13 import os
14 import re
15 import sys
16
17 # Expected input:
18 #
19 #  ...
20 #  #define FREETYPE_MAJOR  2
21 #  #define FREETYPE_MINOR  10
22 #  #define FREETYPE_PATCH  2
23 #  ...
24
25 RE_MAJOR = re.compile(r"^ \#define \s+ FREETYPE_MAJOR \s+ (.*) $", re.X)
26 RE_MINOR = re.compile(r"^ \#define \s+ FREETYPE_MINOR \s+ (.*) $", re.X)
27 RE_PATCH = re.compile(r"^ \#define \s+ FREETYPE_PATCH \s+ (.*) $", re.X)
28
29
30 def parse_freetype_header(header):
31     major = None
32     minor = None
33     patch = None
34
35     for line in header.splitlines():
36         line = line.rstrip()
37         m = RE_MAJOR.match(line)
38         if m:
39             assert major == None, "FREETYPE_MAJOR appears more than once!"
40             major = m.group(1)
41             continue
42
43         m = RE_MINOR.match(line)
44         if m:
45             assert minor == None, "FREETYPE_MINOR appears more than once!"
46             minor = m.group(1)
47             continue
48
49         m = RE_PATCH.match(line)
50         if m:
51             assert patch == None, "FREETYPE_PATCH appears more than once!"
52             patch = m.group(1)
53             continue
54
55     assert (
56         major and minor and patch
57     ), "This header is missing one of FREETYPE_MAJOR, FREETYPE_MINOR or FREETYPE_PATCH!"
58
59     return (major, minor, patch)
60
61
62 def main():
63     parser = argparse.ArgumentParser(description=__doc__)
64
65     group = parser.add_mutually_exclusive_group()
66     group.add_argument(
67         "--major",
68         action="store_true",
69         help="Only print the major version number.",
70     )
71     group.add_argument(
72         "--minor",
73         action="store_true",
74         help="Only print the minor version number.",
75     )
76     group.add_argument(
77         "--patch",
78         action="store_true",
79         help="Only print the patch version number.",
80     )
81
82     parser.add_argument(
83         "input",
84         metavar="FREETYPE_H",
85         help="The input freetype.h header to parse.",
86     )
87
88     args = parser.parse_args()
89     with open(args.input) as f:
90         header = f.read()
91
92     version = parse_freetype_header(header)
93
94     if args.major:
95         print(version[0])
96     elif args.minor:
97         print(version[1])
98     elif args.patch:
99         print(version[2])
100     else:
101         print("%s.%s.%s" % version)
102
103     return 0
104
105
106 if __name__ == "__main__":
107     sys.exit(main())