def check_subcommand_stdin(file_to_read, command, *args): """Pipe content of a file to a command and return output. """ with open(file_to_read) as my_file: cmd = ['bin/qmk', command, *args] result = run(cmd, stdin=my_file, stdout=PIPE, stderr=STDOUT, universal_newlines=True) return result
def is_executable(command): """Returns True if command exists and can be executed. """ # Make sure the command is in the path. res = shutil.which(command) if res is None: cli.log.error("{fg_red}Can't find %s in your path.", command) return False # Make sure the command can be executed version_arg = ESSENTIAL_BINARIES[command].get('version_arg', '--version') check = run([command, version_arg], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=5, universal_newlines=True) ESSENTIAL_BINARIES[command]['output'] = check.stdout if check.returncode in [0, 1]: # Older versions of dfu-programmer exit 1 cli.log.debug('Found {fg_cyan}%s', command) return True cli.log.error("{fg_red}Can't run `%s %s`", command, version_arg) return False
def check_subcommand(command, *args): cmd = ['bin/qmk', command] + list(args) result = run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) return result
def check_modem_manager(): """Returns True if ModemManager is running. """ if shutil.which("systemctl"): mm_check = run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10) if mm_check.returncode == 0: return True else: cli.log.warn("Can't find systemctl to check for ModemManager.")
def check_modem_manager(): """Returns True if ModemManager is running. """ if check_systemd(): mm_check = run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10) if mm_check.returncode == 0: return True else: """(TODO): Add check for non-systemd systems """ return False
def doctor(cli): """Basic QMK environment checks. This is currently very simple, it just checks that all the expected binaries are on your system. TODO(unclaimed): * [ ] Compile a trivial program with each compiler """ cli.log.info('QMK Doctor is checking your environment.') ok = True # Determine our OS and run platform specific tests platform_id = platform.platform().lower() if 'darwin' in platform_id or 'macos' in platform_id: if not os_test_macos(): ok = False elif 'linux' in platform_id: if not os_test_linux(): ok = False elif 'windows' in platform_id: if not os_test_windows(): ok = False else: cli.log.error('Unsupported OS detected: %s', platform_id) ok = False # Make sure the basic CLI tools we need are available and can be executed. bin_ok = check_binaries() if not bin_ok: if yesno('Would you like to install dependencies?', default=True): run(['util/qmk_install.sh']) bin_ok = check_binaries() if bin_ok: cli.log.info('All dependencies are installed.') else: ok = False # Make sure the tools are at the correct version if not check_arm_gcc_version(): ok = False if not check_avr_gcc_version(): ok = False # Check out the QMK submodules sub_ok = check_submodules() if sub_ok: cli.log.info('Submodules are up to date.') else: if yesno('Would you like to clone the submodules?', default=True): submodules.update() sub_ok = check_submodules() if not sub_ok: ok = False # Report a summary of our findings to the user if ok: cli.log.info('{fg_green}QMK is ready to go') else: cli.log.info('{fg_yellow}Problems detected, please fix these problems before proceeding.')
def doctor(cli): """Basic QMK environment checks. This is currently very simple, it just checks that all the expected binaries are on your system. TODO(unclaimed): * [ ] Compile a trivial program with each compiler """ cli.log.info('QMK Doctor is checking your environment.') status = os_tests() cli.log.info('QMK home: {fg_cyan}%s', QMK_FIRMWARE) # Make sure our QMK home is a Git repo git_ok = check_git_repo() if git_ok == CheckStatus.WARNING: cli.log.warning( "QMK home does not appear to be a Git repository! (no .git folder)" ) status = CheckStatus.WARNING # Make sure the basic CLI tools we need are available and can be executed. bin_ok = check_binaries() if not bin_ok: if yesno('Would you like to install dependencies?', default=True): run(['util/qmk_install.sh']) bin_ok = check_binaries() if bin_ok: cli.log.info('All dependencies are installed.') else: status = CheckStatus.ERROR # Make sure the tools are at the correct version ver_ok = check_binary_versions() if CheckStatus.ERROR in ver_ok: status = CheckStatus.ERROR elif CheckStatus.WARNING in ver_ok and status == CheckStatus.OK: status = CheckStatus.WARNING # Check out the QMK submodules sub_ok = check_submodules() if sub_ok == CheckStatus.OK: cli.log.info('Submodules are up to date.') else: if yesno('Would you like to clone the submodules?', default=True): submodules.update() sub_ok = check_submodules() if sub_ok == CheckStatus.ERROR: status = CheckStatus.ERROR elif sub_ok == CheckStatus.WARNING and status == CheckStatus.OK: status = CheckStatus.WARNING # Report a summary of our findings to the user if status == CheckStatus.OK: cli.log.info('{fg_green}QMK is ready to go') return 0 elif status == CheckStatus.WARNING: cli.log.info( '{fg_yellow}QMK is ready to go, but minor problems were found') return 1 else: cli.log.info( '{fg_red}Major problems detected, please fix these problems before proceeding.' ) cli.log.info( '{fg_blue}Check out the FAQ (https://docs.qmk.fm/#/faq_build) or join the QMK Discord (https://discord.gg/Uq7gcHh) for help.' ) return 2
def check_subcommand(command, *args): cmd = ['bin/qmk', command, *args] result = run(cmd, stdout=PIPE, stderr=STDOUT, universal_newlines=True) return result
def doctor(cli): """Basic QMK environment checks. This is currently very simple, it just checks that all the expected binaries are on your system. TODO(unclaimed): * [ ] Compile a trivial program with each compiler """ cli.log.info('QMK Doctor is checking your environment.') status = CheckStatus.OK # Determine our OS and run platform specific tests platform_id = platform.platform().lower() if 'darwin' in platform_id or 'macos' in platform_id: status = os_test_macos() elif 'linux' in platform_id: status = os_test_linux() elif 'windows' in platform_id: status = os_test_windows() else: cli.log.warning('Unsupported OS detected: %s', platform_id) status = CheckStatus.WARNING cli.log.info('QMK home: {fg_cyan}%s', QMK_FIRMWARE) # Make sure the basic CLI tools we need are available and can be executed. bin_ok = check_binaries() if not bin_ok: if yesno('Would you like to install dependencies?', default=True): run(['util/qmk_install.sh']) bin_ok = check_binaries() if bin_ok: cli.log.info('All dependencies are installed.') else: status = CheckStatus.ERROR # Make sure the tools are at the correct version ver_ok = [] for check in (check_arm_gcc_version, check_avr_gcc_version, check_avrdude_version, check_dfu_util_version, check_dfu_programmer_version): ver_ok.append(check()) if CheckStatus.ERROR in ver_ok: status = CheckStatus.ERROR elif CheckStatus.WARNING in ver_ok and status == CheckStatus.OK: status = CheckStatus.WARNING # Check out the QMK submodules sub_ok = check_submodules() if sub_ok == CheckStatus.OK: cli.log.info('Submodules are up to date.') else: if yesno('Would you like to clone the submodules?', default=True): submodules.update() sub_ok = check_submodules() if CheckStatus.ERROR in sub_ok: status = CheckStatus.ERROR elif CheckStatus.WARNING in sub_ok and status == CheckStatus.OK: status = CheckStatus.WARNING # Report a summary of our findings to the user if status == CheckStatus.OK: cli.log.info('{fg_green}QMK is ready to go') return 0 elif status == CheckStatus.WARNING: cli.log.info( '{fg_yellow}QMK is ready to go, but minor problems were found') return 1 else: cli.log.info( '{fg_red}Major problems detected, please fix these problems before proceeding.' ) cli.log.info( '{fg_blue}Check out the FAQ (https://docs.qmk.fm/#/faq_build) or join the QMK Discord (https://discord.gg/Uq7gcHh) for help.' ) return 2
def clean(cli): """Runs `make clean` (or `make distclean` if --all is passed) """ make_cmd = 'gmake' if shutil.which('gmake') else 'make' run([make_cmd, 'distclean' if cli.args.all else 'clean'])
def clean(cli): """Runs `make clean` (or `make distclean` if --all is passed) """ run(create_make_target('distclean' if cli.args.all else 'clean'))
elif 'linux' in platform_id: if not os_test_linux(): ok = False elif 'windows' in platform_id: if not os_test_windows(): ok = False else: cli.log.error('Unsupported OS detected: %s', platform_id) ok = False # Make sure the basic CLI tools we need are available and can be executed. bin_ok = check_binaries() if not bin_ok: if yesno('Would you like to install dependencies?', default=True): run(['util/qmk_install.sh']) bin_ok = check_binaries() if bin_ok: cli.log.info('All dependencies are installed.') else: ok = False # Make sure the tools are at the correct version for check in (check_arm_gcc_version, check_avr_gcc_version, check_avrdude_version, check_dfu_util_version, check_dfu_programmer_version): if not check(): ok = False # Check out the QMK submodules sub_ok = check_submodules()