summaryrefslogtreecommitdiff
path: root/zephyr/zmake/zmake/version.py
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/zmake/zmake/version.py')
-rw-r--r--zephyr/zmake/zmake/version.py43
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)