1#!/usr/bin/env python3
2"""Generate a version header for the Bazel build.
3
4Splits a semantic version string into major, minor, and patch and uses the
5provided template to produce a working version header.
6"""
7
8import argparse
9import re
10import sys
11
12
13def _parse_args():
14    parser = argparse.ArgumentParser(
15        description=__doc__,
16    )
17    parser.add_argument(
18        "--version-string",
19        required=True,
20        help="SDK version string",
21    )
22    parser.add_argument(
23        "--template",
24        type=argparse.FileType("r"),
25        required=True,
26        help="Path to version.h.in",
27    )
28    parser.add_argument(
29        "-o",
30        "--output",
31        type=argparse.FileType("wb"),
32        default=sys.stdout.buffer,
33        help="Output file path. Defaults to stdout.",
34    )
35    return parser.parse_args()
36
37
38_EXPANSION_REGEX = re.compile(r"(?:\$\{)([a-zA-Z]\w*)(?:\})")
39
40
41def generate_version_header(version_string, template, output):
42    version_parts = version_string.split('.')
43    defines = {
44        "PICO_SDK_VERSION_MAJOR": version_parts[0],
45        "PICO_SDK_VERSION_MINOR": version_parts[1],
46        "PICO_SDK_VERSION_REVISION": version_parts[2].split('-')[0],
47        "PICO_SDK_VERSION_STRING": version_string,
48    }
49    output.write(
50        _EXPANSION_REGEX.sub(
51            lambda val: str(defines.get(val.group(1))),
52            template.read(),
53        ).encode()
54    )
55
56
57if __name__ == "__main__":
58    sys.exit(generate_version_header(**vars(_parse_args())))
59