diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index ba225bf55..529c41c0c 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py @@ -7,12 +7,15 @@ import subprocess import shlex import shutil from pathlib import Path +from time import strftime from milc import cli import qmk.keymap from qmk.constants import KEYBOARD_OUTPUT_PREFIX +time_fmt = '%Y-%m-%d-%H:%M:%S' + def _find_make(): """Returns the correct make command for this environment. @@ -62,6 +65,39 @@ def create_make_command(keyboard, keymap, target=None, parallel=1, **env_vars): return [make_cmd, '-j', str(parallel), *env, ':'.join(make_args)] +def get_git_version(repo_dir='.', check_dir='.'): + """Returns the current git version for a repo, or the current time. + """ + git_describe_cmd = ['git', 'describe', '--abbrev=6', '--dirty', '--always', '--tags'] + + if Path(check_dir).exists(): + git_describe = cli.run(git_describe_cmd, cwd=repo_dir) + + if git_describe.returncode == 0: + return git_describe.stdout.strip() + + else: + cli.args.warn(f'"{" ".join(git_describe_cmd)}" returned error code {git_describe.returncode}') + print(git_describe.stderr) + return strftime(time_fmt) + + return strftime(time_fmt) + + +def write_version_h(git_version, build_date, chibios_version, chibios_contrib_version): + """Generate and write quantum/version.h + """ + version_h = [ + f'#define QMK_VERSION "{git_version}"', + f'#define QMK_BUILD_DATE "{build_date}"', + f'#define CHIBIOS_VERSION "{chibios_version}"', + f'#define CHIBIOS_CONTRIB_VERSION "{chibios_contrib_version}"', + ] + + version_h_file = Path('quantum/version.h') + version_h_file.write_text('\n'.join(version_h)) + + def compile_configurator_json(user_keymap, parallel=1, **env_vars): """Convert a configurator export JSON file into a C file and then compile it. @@ -92,23 +128,39 @@ def compile_configurator_json(user_keymap, parallel=1, **env_vars): keymap_dir.mkdir(exist_ok=True, parents=True) keymap_c.write_text(c_text) + # Write the version.h file + git_version = get_git_version() + build_date = strftime('%Y-%m-%d-%H:%M:%S') + chibios_version = get_git_version("lib/chibios", "lib/chibios/os") + chibios_contrib_version = get_git_version("lib/chibios-contrib", "lib/chibios-contrib/os") + + write_version_h(git_version, build_date, chibios_version, chibios_contrib_version) + # Return a command that can be run to make the keymap and flash if given verbose = 'true' if cli.config.general.verbose else 'false' color = 'true' if cli.config.general.color else 'false' - make_command = [ - _find_make(), + make_command = [_find_make()] + + if not cli.config.general.verbose: + make_command.append('-s') + + make_command.extend([ '-j', str(parallel), '-r', '-R', '-f', 'build_keyboard.mk', - ] + ]) for key, value in env_vars.items(): make_command.append(f'{key}={value}') make_command.extend([ + f'GIT_VERSION={git_version}', + f'BUILD_DATE={build_date}', + f'CHIBIOS_VERSION={chibios_version}', + f'CHIBIOS_CONTRIB_VERSION={chibios_contrib_version}', f'KEYBOARD={user_keymap["keyboard"]}', f'KEYMAP={user_keymap["keymap"]}', f'KEYBOARD_FILESAFE={keyboard_filesafe}',