forked from adafruit/circuitpython
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmakeversionhdr.py
107 lines (88 loc) · 3.06 KB
/
makeversionhdr.py
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
"""
Generate header file with macros defining MicroPython version info.
# CIRCUITPY-CHANGE: This script is thoroughly reworked for use with CircuitPython.
This script works with Python 3.7 and newer
"""
from __future__ import print_function
import argparse
import sys
import os
import pathlib
import datetime
import subprocess
# CIRCUITPY-CHANGE: Factor out version computation to py/version.py
import version
# CIRCUITPY-CHANGE
def cannot_determine_version():
raise SystemExit(
"""Cannot determine version.
CircuitPython must be built from a git clone with tags.
If you cloned from a fork, fetch the tags from adafruit/circuitpython as follows:
make fetch-tags"""
)
def make_version_header(repo_path, filename):
# Get version info using git (required)
info = version.get_version_info_from_git(repo_path)
if info is None:
cannot_determine_version()
git_tag, git_hash, ver = info
if len(ver) < 3:
cannot_determine_version()
else:
version_string = ".".join(ver)
build_date = datetime.date.today()
if "SOURCE_DATE_EPOCH" in os.environ:
build_date = datetime.datetime.utcfromtimestamp(
int(os.environ["SOURCE_DATE_EPOCH"])
).date()
# Generate the file with the git and version info
# CIRCUITPY-CHANGE: different contents
file_data = """\
// This file was generated by py/makeversionhdr.py
#define MICROPY_GIT_TAG "%s"
#define MICROPY_GIT_HASH "%s"
#define MICROPY_BUILD_DATE "%s"
#define MICROPY_VERSION_MAJOR (%s)
#define MICROPY_VERSION_MINOR (%s)
#define MICROPY_VERSION_MICRO (%s)
#define MICROPY_VERSION_PRERELEASE 0
#define MICROPY_VERSION_STRING "%s"
// Combined version as a 32-bit number for convenience
#define MICROPY_VERSION (MICROPY_VERSION_MAJOR << 16 | MICROPY_VERSION_MINOR << 8 | MICROPY_VERSION_MICRO)
#define MICROPY_FULL_VERSION_INFO "Adafruit CircuitPython " MICROPY_GIT_TAG " on " MICROPY_BUILD_DATE "; " MICROPY_BANNER_MACHINE
""" % (
git_tag,
git_hash,
build_date.strftime("%Y-%m-%d"),
ver[0].replace("v", ""),
ver[1],
ver[2],
version_string,
)
# Check if the file contents changed from last time
write_file = True
if os.path.isfile(filename):
with open(filename, "r") as f:
existing_data = f.read()
if existing_data == file_data:
write_file = False
# Only write the file if we need to
if write_file:
print("GEN %s" % filename)
with open(filename, "w") as f:
f.write(file_data)
def main():
parser = argparse.ArgumentParser()
# makeversionheader.py lives in repo/py, so default repo_path to the
# parent of sys.argv[0]'s directory.
parser.add_argument(
"-r",
"--repo-path",
default=os.path.join(os.path.dirname(sys.argv[0]), ".."),
help="path to MicroPython Git repo to query for version",
)
parser.add_argument("dest", nargs=1, help="output file path")
args = parser.parse_args()
make_version_header(args.repo_path, args.dest[0])
if __name__ == "__main__":
main()