Browse Source

Merge remote-tracking branch 'origin/develop' into xap

zvecr 4 years ago
parent
commit
2e8db66201

+ 4 - 14
lib/python/qmk/cli/generate/config_h.py

@@ -9,7 +9,9 @@ from qmk.info import info_json
 from qmk.json_schema import json_load, validate
 from qmk.json_schema import json_load, validate
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.keymap import locate_keymap
 from qmk.keymap import locate_keymap
+from qmk.commands import dump_lines
 from qmk.path import normpath
 from qmk.path import normpath
+from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
 
 
 
 
 def direct_pins(direct_pins, postfix):
 def direct_pins(direct_pins, postfix):
@@ -186,7 +188,7 @@ def generate_config_h(cli):
         kb_info_json = dotty(info_json(cli.args.keyboard))
         kb_info_json = dotty(info_json(cli.args.keyboard))
 
 
     # Build the info_config.h file.
     # Build the info_config.h file.
-    config_h_lines = ['/* This file was generated by `qmk generate-config-h`. Do not edit or copy.', ' */', '', '#pragma once']
+    config_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once']
 
 
     generate_config_items(kb_info_json, config_h_lines)
     generate_config_items(kb_info_json, config_h_lines)
 
 
@@ -199,16 +201,4 @@ def generate_config_h(cli):
         generate_split_config(kb_info_json, config_h_lines)
         generate_split_config(kb_info_json, config_h_lines)
 
 
     # Show the results
     # Show the results
-    config_h = '\n'.join(config_h_lines)
-
-    if cli.args.output:
-        cli.args.output.parent.mkdir(parents=True, exist_ok=True)
-        if cli.args.output.exists():
-            cli.args.output.replace(cli.args.output.parent / (cli.args.output.name + '.bak'))
-        cli.args.output.write_text(config_h, encoding='utf-8')
-
-        if not cli.args.quiet:
-            cli.log.info('Wrote info_config.h to %s.', cli.args.output)
-
-    else:
-        print(config_h)
+    dump_lines(cli.args.output, config_h_lines, cli.args.quiet)

+ 4 - 14
lib/python/qmk/cli/generate/dfu_header.py

@@ -7,6 +7,8 @@ from qmk.decorators import automagic_keyboard
 from qmk.info import info_json
 from qmk.info import info_json
 from qmk.path import is_keyboard, normpath
 from qmk.path import is_keyboard, normpath
 from qmk.keyboard import keyboard_completer
 from qmk.keyboard import keyboard_completer
+from qmk.commands import dump_lines
+from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
 
 
 
 
 @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
 @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
@@ -30,7 +32,7 @@ def generate_dfu_header(cli):
     # Build the Keyboard.h file.
     # Build the Keyboard.h file.
     kb_info_json = dotty(info_json(cli.config.generate_dfu_header.keyboard))
     kb_info_json = dotty(info_json(cli.config.generate_dfu_header.keyboard))
 
 
-    keyboard_h_lines = ['/* This file was generated by `qmk generate-dfu-header`. Do not edit or copy.', ' */', '', '#pragma once']
+    keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once']
     keyboard_h_lines.append(f'#define MANUFACTURER {kb_info_json["manufacturer"]}')
     keyboard_h_lines.append(f'#define MANUFACTURER {kb_info_json["manufacturer"]}')
     keyboard_h_lines.append(f'#define PRODUCT {kb_info_json["keyboard_name"]} Bootloader')
     keyboard_h_lines.append(f'#define PRODUCT {kb_info_json["keyboard_name"]} Bootloader')
 
 
@@ -45,16 +47,4 @@ def generate_dfu_header(cli):
         keyboard_h_lines.append(f'#define QMK_SPEAKER {kb_info_json["qmk_lufa_bootloader.speaker"]}')
         keyboard_h_lines.append(f'#define QMK_SPEAKER {kb_info_json["qmk_lufa_bootloader.speaker"]}')
 
 
     # Show the results
     # Show the results
-    keyboard_h = '\n'.join(keyboard_h_lines)
-
-    if cli.args.output:
-        cli.args.output.parent.mkdir(parents=True, exist_ok=True)
-        if cli.args.output.exists():
-            cli.args.output.replace(cli.args.output.parent / (cli.args.output.name + '.bak'))
-        cli.args.output.write_text(keyboard_h)
-
-        if not cli.args.quiet:
-            cli.log.info('Wrote Keyboard.h to %s.', cli.args.output)
-
-    else:
-        print(keyboard_h)
+    dump_lines(cli.args.output, keyboard_h_lines, cli.args.quiet)

+ 4 - 14
lib/python/qmk/cli/generate/keyboard_h.py

@@ -3,8 +3,10 @@
 from milc import cli
 from milc import cli
 
 
 from qmk.info import info_json
 from qmk.info import info_json
+from qmk.commands import dump_lines
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.path import normpath
 from qmk.path import normpath
+from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
 
 
 
 
 def would_populate_layout_h(keyboard):
 def would_populate_layout_h(keyboard):
@@ -36,22 +38,10 @@ def generate_keyboard_h(cli):
     has_layout_h = would_populate_layout_h(cli.args.keyboard)
     has_layout_h = would_populate_layout_h(cli.args.keyboard)
 
 
     # Build the layouts.h file.
     # Build the layouts.h file.
-    keyboard_h_lines = ['/* This file was generated by `qmk generate-keyboard-h`. Do not edit or copy.', ' */', '', '#pragma once', '#include "quantum.h"']
+    keyboard_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once', '#include "quantum.h"']
 
 
     if not has_layout_h:
     if not has_layout_h:
         keyboard_h_lines.append('#pragma error("<keyboard>.h is only optional for data driven keyboards - kb.h == bad times")')
         keyboard_h_lines.append('#pragma error("<keyboard>.h is only optional for data driven keyboards - kb.h == bad times")')
 
 
     # Show the results
     # Show the results
-    keyboard_h = '\n'.join(keyboard_h_lines) + '\n'
-
-    if cli.args.output:
-        cli.args.output.parent.mkdir(parents=True, exist_ok=True)
-        if cli.args.output.exists():
-            cli.args.output.replace(cli.args.output.parent / (cli.args.output.name + '.bak'))
-        cli.args.output.write_text(keyboard_h)
-
-        if not cli.args.quiet:
-            cli.log.info('Wrote keyboard_h to %s.', cli.args.output)
-
-    else:
-        print(keyboard_h)
+    dump_lines(cli.args.output, keyboard_h_lines, cli.args.quiet)

+ 4 - 15
lib/python/qmk/cli/generate/layouts.py

@@ -2,11 +2,12 @@
 """
 """
 from milc import cli
 from milc import cli
 
 
-from qmk.constants import COL_LETTERS, ROW_LETTERS
+from qmk.constants import COL_LETTERS, ROW_LETTERS, GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
 from qmk.decorators import automagic_keyboard, automagic_keymap
 from qmk.decorators import automagic_keyboard, automagic_keymap
 from qmk.info import info_json
 from qmk.info import info_json
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.path import is_keyboard, normpath
 from qmk.path import is_keyboard, normpath
+from qmk.commands import dump_lines
 
 
 usb_properties = {
 usb_properties = {
     'vid': 'VENDOR_ID',
     'vid': 'VENDOR_ID',
@@ -38,7 +39,7 @@ def generate_layouts(cli):
     kb_info_json = info_json(cli.config.generate_layouts.keyboard)
     kb_info_json = info_json(cli.config.generate_layouts.keyboard)
 
 
     # Build the layouts.h file.
     # Build the layouts.h file.
-    layouts_h_lines = ['/* This file was generated by `qmk generate-layouts`. Do not edit or copy.', ' */', '', '#pragma once']
+    layouts_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once']
 
 
     if 'matrix_size' not in kb_info_json:
     if 'matrix_size' not in kb_info_json:
         cli.log.error('%s: Invalid matrix config.', cli.config.generate_layouts.keyboard)
         cli.log.error('%s: Invalid matrix config.', cli.config.generate_layouts.keyboard)
@@ -86,16 +87,4 @@ def generate_layouts(cli):
         layouts_h_lines.append('#endif')
         layouts_h_lines.append('#endif')
 
 
     # Show the results
     # Show the results
-    layouts_h = '\n'.join(layouts_h_lines) + '\n'
-
-    if cli.args.output:
-        cli.args.output.parent.mkdir(parents=True, exist_ok=True)
-        if cli.args.output.exists():
-            cli.args.output.replace(cli.args.output.parent / (cli.args.output.name + '.bak'))
-        cli.args.output.write_text(layouts_h)
-
-        if not cli.args.quiet:
-            cli.log.info('Wrote info_config.h to %s.', cli.args.output)
-
-    else:
-        print(layouts_h)
+    dump_lines(cli.args.output, layouts_h_lines, cli.args.quiet)

+ 4 - 10
lib/python/qmk/cli/generate/rules_mk.py

@@ -9,7 +9,9 @@ from qmk.info import info_json
 from qmk.json_schema import json_load, validate
 from qmk.json_schema import json_load, validate
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.keyboard import keyboard_completer, keyboard_folder
 from qmk.keymap import locate_keymap
 from qmk.keymap import locate_keymap
+from qmk.commands import dump_lines
 from qmk.path import normpath
 from qmk.path import normpath
+from qmk.constants import GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE
 
 
 
 
 def process_mapping_rule(kb_info_json, rules_key, info_dict):
 def process_mapping_rule(kb_info_json, rules_key, info_dict):
@@ -57,7 +59,7 @@ def generate_rules_mk(cli):
         kb_info_json = dotty(info_json(cli.args.keyboard))
         kb_info_json = dotty(info_json(cli.args.keyboard))
 
 
     info_rules_map = json_load(Path('data/mappings/info_rules.json'))
     info_rules_map = json_load(Path('data/mappings/info_rules.json'))
-    rules_mk_lines = ['# This file was generated by `qmk generate-rules-mk`. Do not edit or copy.', '']
+    rules_mk_lines = [GPL2_HEADER_SH_LIKE, GENERATED_HEADER_SH_LIKE]
 
 
     # Iterate through the info_rules map to generate basic rules
     # Iterate through the info_rules map to generate basic rules
     for rules_key, info_dict in info_rules_map.items():
     for rules_key, info_dict in info_rules_map.items():
@@ -85,14 +87,9 @@ def generate_rules_mk(cli):
             rules_mk_lines.append('CUSTOM_MATRIX ?= yes')
             rules_mk_lines.append('CUSTOM_MATRIX ?= yes')
 
 
     # Show the results
     # Show the results
-    rules_mk = '\n'.join(rules_mk_lines) + '\n'
+    dump_lines(cli.args.output, rules_mk_lines)
 
 
     if cli.args.output:
     if cli.args.output:
-        cli.args.output.parent.mkdir(parents=True, exist_ok=True)
-        if cli.args.output.exists():
-            cli.args.output.replace(cli.args.output.parent / (cli.args.output.name + '.bak'))
-        cli.args.output.write_text(rules_mk)
-
         if cli.args.quiet:
         if cli.args.quiet:
             if cli.args.escape:
             if cli.args.escape:
                 print(cli.args.output.as_posix().replace(' ', '\\ '))
                 print(cli.args.output.as_posix().replace(' ', '\\ '))
@@ -100,6 +97,3 @@ def generate_rules_mk(cli):
                 print(cli.args.output)
                 print(cli.args.output)
         else:
         else:
             cli.log.info('Wrote rules.mk to %s.', cli.args.output)
             cli.log.info('Wrote rules.mk to %s.', cli.args.output)
-
-    else:
-        print(rules_mk)

+ 31 - 11
lib/python/qmk/cli/generate/version_h.py

@@ -1,9 +1,15 @@
 """Used by the make system to generate version.h for use in code.
 """Used by the make system to generate version.h for use in code.
 """
 """
+from time import strftime
+
 from milc import cli
 from milc import cli
 
 
-from qmk.commands import create_version_h
 from qmk.path import normpath
 from qmk.path import normpath
+from qmk.commands import dump_lines
+from qmk.commands import get_git_version
+from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
+
+TIME_FMT = '%Y-%m-%d-%H:%M:%S'
 
 
 
 
 @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
 @cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
@@ -17,15 +23,29 @@ def generate_version_h(cli):
     if cli.args.skip_all:
     if cli.args.skip_all:
         cli.args.skip_git = True
         cli.args.skip_git = True
 
 
-    version_h = create_version_h(cli.args.skip_git, cli.args.skip_all)
-
-    if cli.args.output:
-        cli.args.output.parent.mkdir(parents=True, exist_ok=True)
-        if cli.args.output.exists():
-            cli.args.output.replace(cli.args.output.parent / (cli.args.output.name + '.bak'))
-        cli.args.output.write_text(version_h)
+    if cli.args.skip_all:
+        current_time = "1970-01-01-00:00:00"
+    else:
+        current_time = strftime(TIME_FMT)
 
 
-        if not cli.args.quiet:
-            cli.log.info('Wrote version.h to %s.', cli.args.output)
+    if cli.args.skip_git:
+        git_version = "NA"
+        chibios_version = "NA"
+        chibios_contrib_version = "NA"
     else:
     else:
-        print(version_h)
+        git_version = get_git_version(current_time)
+        chibios_version = get_git_version(current_time, "chibios", "os")
+        chibios_contrib_version = get_git_version(current_time, "chibios-contrib", "os")
+
+    # Build the version.h file.
+    version_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '#pragma once']
+
+    version_h_lines.append(f"""
+#define QMK_VERSION "{git_version}"
+#define QMK_BUILDDATE "{current_time}"
+#define CHIBIOS_VERSION "{chibios_version}"
+#define CHIBIOS_CONTRIB_VERSION "{chibios_contrib_version}"
+""")
+
+    # Show the results
+    dump_lines(cli.args.output, version_h_lines, cli.args.quiet)

+ 12 - 48
lib/python/qmk/commands.py

@@ -5,8 +5,6 @@ import sys
 import shutil
 import shutil
 from pathlib import Path
 from pathlib import Path
 from subprocess import DEVNULL
 from subprocess import DEVNULL
-from time import strftime
-from itertools import islice
 
 
 from milc import cli
 from milc import cli
 import jsonschema
 import jsonschema
@@ -15,8 +13,6 @@ import qmk.keymap
 from qmk.constants import QMK_FIRMWARE, KEYBOARD_OUTPUT_PREFIX
 from qmk.constants import QMK_FIRMWARE, KEYBOARD_OUTPUT_PREFIX
 from qmk.json_schema import json_load, validate
 from qmk.json_schema import json_load, validate
 
 
-time_fmt = '%Y-%m-%d-%H:%M:%S'
-
 
 
 def _find_make():
 def _find_make():
     """Returns the correct make command for this environment.
     """Returns the correct make command for this environment.
@@ -140,37 +136,6 @@ def get_make_parallel_args(parallel=1):
     return parallel_args
     return parallel_args
 
 
 
 
-def create_version_h(skip_git=False, skip_all=False):
-    """Generate version.h contents
-    """
-    if skip_all:
-        current_time = "1970-01-01-00:00:00"
-    else:
-        current_time = None
-
-    if skip_git:
-        git_version = "NA"
-        chibios_version = "NA"
-        chibios_contrib_version = "NA"
-    else:
-        git_version = get_git_version(current_time)
-        chibios_version = get_git_version(current_time, "chibios", "os")
-        chibios_contrib_version = get_git_version(current_time, "chibios-contrib", "os")
-
-    version_h_lines = f"""/* This file was automatically generated. Do not edit or copy.
- */
-
-#pragma once
-
-#define QMK_VERSION "{git_version}"
-#define QMK_BUILDDATE "{current_time}"
-#define CHIBIOS_VERSION "{chibios_version}"
-#define CHIBIOS_CONTRIB_VERSION "{chibios_contrib_version}"
-"""
-
-    return version_h_lines
-
-
 def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_vars):
 def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_vars):
     """Convert a configurator export JSON file into a C file and then compile it.
     """Convert a configurator export JSON file into a C file and then compile it.
 
 
@@ -205,9 +170,6 @@ def compile_configurator_json(user_keymap, bootloader=None, parallel=1, **env_va
     keymap_dir.mkdir(exist_ok=True, parents=True)
     keymap_dir.mkdir(exist_ok=True, parents=True)
     keymap_c.write_text(c_text)
     keymap_c.write_text(c_text)
 
 
-    version_h = Path('quantum/version.h')
-    version_h.write_text(create_version_h())
-
     # Return a command that can be run to make the keymap and flash if given
     # Return a command that can be run to make the keymap and flash if given
     verbose = 'true' if cli.config.general.verbose else 'false'
     verbose = 'true' if cli.config.general.verbose else 'false'
     color = 'true' if cli.config.general.color else 'false'
     color = 'true' if cli.config.general.color else 'false'
@@ -370,16 +332,18 @@ def get_chunks(it, size):
     return iter(lambda: tuple(islice(it, size)), ())
     return iter(lambda: tuple(islice(it, size)), ())
 
 
 
 
-def dump_lines(output_file, lines):
+def dump_lines(output_file, lines, quiet=True):
     """Handle dumping to stdout or file
     """Handle dumping to stdout or file
     Creates parent folders if required
     Creates parent folders if required
     """
     """
-    generated = '\n'.join(lines)
-    if output_file:
-        if output_file.name == '-':
-            print(generated)
-        else:
-            output_file.parent.mkdir(parents=True, exist_ok=True)
-            if output_file.exists():
-                output_file.replace(output_file.parent / (output_file.name + '.bak'))
-            output_file.write_text(generated)
+    generated = '\n'.join(lines) + '\n'
+    if output_file and output_file.name != '-':
+        output_file.parent.mkdir(parents=True, exist_ok=True)
+        if output_file.exists():
+            output_file.replace(output_file.parent / (output_file.name + '.bak'))
+        output_file.write_text(generated, encoding='utf-8')
+
+        if not quiet:
+            cli.log.info(f'Wrote {output_file.name} to {output_file}.')
+    else:
+        print(generated)

+ 4 - 31
lib/python/qmk/constants.py

@@ -78,40 +78,14 @@ BUILD_DIR = environ.get('BUILD_DIR', '.build')
 KEYBOARD_OUTPUT_PREFIX = f'{BUILD_DIR}/obj_'
 KEYBOARD_OUTPUT_PREFIX = f'{BUILD_DIR}/obj_'
 
 
 # Headers for generated files
 # Headers for generated files
-this_year = date.today().year
 GPL2_HEADER_C_LIKE = f'''\
 GPL2_HEADER_C_LIKE = f'''\
-/* Copyright {this_year} QMK
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
+// Copyright {date.today().year} QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
 '''
 '''
 
 
 GPL2_HEADER_SH_LIKE = f'''\
 GPL2_HEADER_SH_LIKE = f'''\
-# Copyright {this_year} QMK
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# Copyright {date.today().year} QMK
+# SPDX-License-Identifier: GPL-2.0-or-later
 '''
 '''
 
 
 GENERATED_HEADER_C_LIKE = '''\
 GENERATED_HEADER_C_LIKE = '''\
@@ -124,7 +98,6 @@ GENERATED_HEADER_C_LIKE = '''\
       888     888  888 888 "Y8888b.      888    888 888 88888888      888 "Y8888b.
       888     888  888 888 "Y8888b.      888    888 888 88888888      888 "Y8888b.
       888     888  888 888      X88      888    888 888 Y8b.          888      X88
       888     888  888 888      X88      888    888 888 Y8b.          888      X88
       888     888  888 888  88888P'      888    888 888  "Y8888       888  88888P'
       888     888  888 888  88888P'      888    888 888  "Y8888       888  88888P'
-
                                                         888                 888
                                                         888                 888
                                                         888                 888
                                                         888                 888
                                                         888                 888
                                                         888                 888