diff --git a/tools/idf_py_actions/diag/recipes/README.md b/tools/idf_py_actions/diag/recipes/README.md index 2983e22878..14e868018b 100644 --- a/tools/idf_py_actions/diag/recipes/README.md +++ b/tools/idf_py_actions/diag/recipes/README.md @@ -90,6 +90,11 @@ variable, format it as `${NAME}`, such as `${IDF_PATH}`. Brief description of the `step`, displayed in the `idf.py diag` progress beneath the `recipe` description. +* system: string (optional) + Can be used to restrict the operating system on which the step will be + executed. It should be Linux, Darwin, or Windows. If specified, the step + will only run on the designated system. + * output: string (optional) Global output directory for the `step`. This directory serves as the main diff --git a/tools/idf_py_actions/diag/recipes/idf.yml b/tools/idf_py_actions/diag/recipes/idf.yml index 473b6adbe6..b2de9bbb74 100644 --- a/tools/idf_py_actions/diag/recipes/idf.yml +++ b/tools/idf_py_actions/diag/recipes/idf.yml @@ -6,7 +6,6 @@ steps: cmds: - exec: cmd: 'idf.py --version' - timeout: 10 output: esp_idf.ver - name: 'ESP-IDF Git Version' @@ -14,16 +13,3 @@ steps: - exec: cmd: 'git -C ${IDF_PATH} describe' output: esp_idf_git.ver - - - name: 'Platform Information' - cmds: - - exec: - cmd: - - python - - -c - - | - import platform - print(f'system: {platform.system()}') - print(f'release: {platform.release()}') - print(f'machine: {platform.machine()}') - output: platform.inf diff --git a/tools/idf_py_actions/diag/recipes/system.yml b/tools/idf_py_actions/diag/recipes/system.yml new file mode 100644 index 0000000000..c1c9edaab4 --- /dev/null +++ b/tools/idf_py_actions/diag/recipes/system.yml @@ -0,0 +1,49 @@ +description: System information +tags: [system, base, project] +steps: + - name: 'Platform Information' + cmds: + - exec: + cmd: + - python + - -c + - | + import platform + print(f'system: {platform.system()}') + print(f'release: {platform.release()}') + print(f'machine: {platform.machine()}') + output: platform.inf + + - name: 'Linux System Information' + system: Linux + output: linux + cmds: + - file: + path: '/proc/cpuinfo' + - file: + path: '/etc/os-release' + - exec: + cmd: 'uname -a' + output: uname + + - name: 'Darwin Information' + system: Darwin + output: darwin + cmds: + - exec: + cmd: 'sysctl machdep.cpu' + output: machdep.cpu + - exec: + cmd: 'sw_vers' + output: sw_vers + - exec: + cmd: 'uname -a' + output: uname + + - name: 'Windows Information' + system: Windows + output: windows + cmds: + - exec: + cmd: 'systeminfo' + output: systeminfo diff --git a/tools/idf_py_actions/diag_ext.py b/tools/idf_py_actions/diag_ext.py index 59f01c8cee..fa0b502ecb 100644 --- a/tools/idf_py_actions/diag_ext.py +++ b/tools/idf_py_actions/diag_ext.py @@ -3,6 +3,7 @@ import atexit import difflib import os +import platform import re import shutil import sys @@ -289,7 +290,7 @@ def validate_recipe(recipe: Dict) -> None: dependencies and to provide more informative error messages. """ recipe_keys = ['description', 'tags', 'output', 'steps'] - step_keys = ['name', 'cmds', 'output'] + step_keys = ['name', 'cmds', 'output', 'system'] recipe_description = recipe.get('description') recipe_tags = recipe.get('tags') recipe_output = recipe.get('output') @@ -330,6 +331,7 @@ def validate_recipe(recipe: Dict) -> None: step_name = step.get('name') step_output = step.get('output') step_cmds = step.get('cmds') + step_system = step.get('system') if not step_name: raise RuntimeError(f'Recipe step is missing "name" key') @@ -342,6 +344,12 @@ def validate_recipe(recipe: Dict) -> None: if step_output: if type(step_output) is not str: raise RuntimeError(f'Step "output" key is not of type "str"') + if step_system: + if type(step_system) is not str: + raise RuntimeError(f'Step "system" key is not of type "str"') + if step_system not in ['Linux', 'Windows', 'Darwin']: + raise RuntimeError((f'Unknown "system" key value "{step_system}", ' + f'expecting "Linux", "Windows" or "Darwin"')) for cmd in step_cmds: if 'exec' in cmd: @@ -769,6 +777,12 @@ def process_recipe(recipe: Dict) -> None: """execute commands for every stage in a recipe""" for step in recipe['steps']: step_name = step['name'] + step_system = step.get('system') + + if step_system and step_system != platform.system(): + dbg(f'Skipping step "{step_name}" for "{step_system}"') + continue + dbg(f'Processing step "{step_name}"') print(f'* {step_name}') for cmd in step['cmds']: @@ -1014,6 +1028,7 @@ def create(action: str, dbg(f'Recipe variables: {recipe_variables}') dbg(f'Project directory: {project_dir}') dbg(f'Build directory: {build_dir}') + dbg(f'System: {platform.system()}') if list_recipes: # List recipes command