diff options
Diffstat (limited to 'zephyr/zmake/zmake/version.py')
-rw-r--r-- | zephyr/zmake/zmake/version.py | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/zephyr/zmake/zmake/version.py b/zephyr/zmake/zmake/version.py index 404c05cb74..2d505769f2 100644 --- a/zephyr/zmake/zmake/version.py +++ b/zephyr/zmake/zmake/version.py @@ -2,7 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import datetime +import getpass +import io import os +import platform import subprocess import zmake.util as util @@ -114,3 +118,42 @@ def get_version_string(project, zephyr_base, modules, static=False): return "{}_v{}.{}.{}-{}".format( project_id, major_version, minor_version, num_commits, vcs_hashes ) + + +def write_version_header(version_str, output_path, static=False): + """Generate a version header and write it to the specified path. + + Generate a version header in the format expected by the EC build + system, and write it out only if the version header does not exist + or changes. We don't write in the case that the version header + does exist and was unchanged, which allows "zmake build" commands + on an unchanged tree to be an effective no-op. + + Args: + version_str: The version string to be used in the header, such + as one generated by get_version_string. + output_path: The file path to write at (a pathlib.Path + object). + static: If true, generate a header which does not include + information like the username, hostname, or date, allowing + the build to be reproducible. + """ + output = io.StringIO() + output.write("/* This file is automatically generated by zmake */\n") + + def add_def(name, value): + output.write("#define {} {}\n".format(name, util.c_str(value))) + + add_def("VERSION", version_str) + add_def("CROS_EC_VERSION32", version_str[:31]) + + if static: + add_def("BUILDER", "reproducible@build") + add_def("DATE", "STATIC_VERSION_DATE") + else: + add_def("BUILDER", "{}@{}".format(getpass.getuser(), platform.node())) + add_def("DATE", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) + + contents = output.getvalue() + if not output_path.exists() or output_path.read_text() != contents: + output_path.write_text(contents) |