25 interesting_fields = [
"BOARD",
"BUILD_TYPE"]
26 build_system = { k: env.Dictionary(k)
for k
in interesting_fields }
27 build_flags = env.Dictionary(
'BUILD_FLAGS')
28except (NameError, KeyError):
41lib_dir = pathlib.Path(
"./").resolve()
42rel_src_dir = lib_dir / pathlib.Path(
"src/build")
45print(f
"OEM distribution generating infos at {rel_src_dir}")
46warn =
lambda msg: print(
"build_distributor.py: WARN ", msg)
51firmware_version = subprocess.getoutput(
"which git >/dev/null && git describe --tags || echo no-git-avail").strip()
52firmware_version_useful = bool(re.match(
r"v\d+\.\d+(-\d+.*)?", firmware_version))
54if not firmware_version_useful: firmware_version = not_available
59 unix_timestamp = subprocess.getoutput(
"which git >/dev/null && git log -1 --format=%ct || echo failure").strip()
60 firmware_version_date = datetime.datetime.fromtimestamp(int(unix_timestamp)).isoformat()
62 print(
"Read: ", unix_timestamp)
63 warn(
"No git available, have no information about version and date at all.")
64 firmware_version_date = not_available
66rename_keys =
lambda dct, prefix=
'',suffix=
'': {prefix+k+suffix:v
for k,v
in dct.items()}
75 OEM_MODEL_NAME =
"LUCIDAC",
77 BUILD_SYSTEM_NAME =
"pio",
78 **
rename_keys(build_system, prefix=
"BUILD_SYSTEM_"),
79 BUILD_FLAGS =
" ".join(build_flags),
81 FIRMWARE_VERSION = firmware_version,
82 FIRMWARE_DATE = firmware_version_date,
91for k,v
in distdb.items():
92 assert isinstance(v,str), f
"Expected {k} to be string but it is: {v}"
95esc =
lambda s: s.replace(quote,
'\\"')
97distdb_as_variables =
"\n".join(f
"const char {k}[] PROGMEM = {quote}{esc(v)}{quote};" for k,v
in distdb.items())
98distdb_variable_lookup =
"\n".join(f
" if(strcmp_P(key, (PGM_P)F({quote}{k}{quote}) )) return {k};" for k,v
in distdb.items())
99distdb_as_defines =
"\n".join(f
"#define {k} {quote}{esc(v)}{quote}" for k,v
in distdb.items())
100distdb_as_json_string_esc =
esc(json.dumps(distdb));
101distdb_as_json_defines =
"\n".join(f
" target[{quote}{k}{quote}] = {k};" for k,v
in distdb.items())
105code_files[
"distributor_generated.h"] = \
107// This file was written by dist/build_progmem.py and is not supposed to be git-versioned
109// This file is not supposed to be included directly. Include "distributor.h" instead.
115code_files[
"distributor_generated.cpp"] = \
117#include <build/distributor.h>
118#include "distributor_generated.h"
120// Interestingly, FLASHMEM and PROGMEM *do* have an effect in Teensy,
121// which is whether functions are copied into ICTM RAM or not. If not provided,
122// it is up to the compiler (linker) to decide where to put stuff.
124FLASHMEM const char* dist::ident() {
125 return OEM_MODEL_NAME " Hybrid Controller (" FIRMWARE_VERSION ")";
128FLASHMEM void dist::write_to_json(JsonObject target) {
129%(distdb_as_json_defines)s
133for fname, content
in code_files.items():
134 pathlib.Path(rel_src_dir / fname).write_text(content % locals())
137(rel_src_dir /
".gitignore").write_text(
"".join( f
"{fname}\n" for fname
in code_files.keys()))