diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml index 6f21021a..0a0e9a16 100644 --- a/.github/workflows/core.yml +++ b/.github/workflows/core.yml @@ -8,14 +8,19 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - python-version: [3.6, 3.7, 3.8, 3.9] + python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"] + exclude: + - os: macos-latest + python-version: "3.6" + - os: windows-latest + python-version: "3.10" runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 with: submodules: "recursive" - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies diff --git a/HISTORY.rst b/HISTORY.rst index d84c84da..1089d25d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -8,6 +8,14 @@ PlatformIO Core 5 **A professional collaborative platform for embedded development** +5.2.2 (2021-10-20) +~~~~~~~~~~~~~~~~~~ + +- Override debugging firmware loading mode using ``--load-mode`` option for `pio debug `__ command +- Added support for CLion IDE 2021.3 (`pull #4085 `_) +- Removed debugging "legacy Click" message from CLI (`issue #4083 `_) +- Fixed a "TypeError: sequence item 1: expected str instance, list found" issue when extending configuration option in `"platformio.ini" `__ with the multi-line default value (`issue #4082 `_) + 5.2.1 (2021-10-11) ~~~~~~~~~~~~~~~~~~ diff --git a/docs b/docs index 8a613430..66f67cb3 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 8a613430957704dfc2e4fc30337020a0a80cfba8 +Subproject commit 66f67cb3357265ab52a0567b67337ca7fda6c3e4 diff --git a/platformio/__init__.py b/platformio/__init__.py index 31da28ca..56d45672 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (5, 2, 1) +VERSION = (5, 2, 2) __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/__main__.py b/platformio/__main__.py index f2c38808..f7bdd61b 100644 --- a/platformio/__main__.py +++ b/platformio/__main__.py @@ -76,7 +76,6 @@ try: except (AttributeError, TypeError): # legacy support for CLick > 8.0.1 - print("legacy Click") @cli.resultcallback() @click.pass_context diff --git a/platformio/commands/debug.py b/platformio/commands/debug.py index d0cbf233..48d86891 100644 --- a/platformio/commands/debug.py +++ b/platformio/commands/debug.py @@ -17,6 +17,7 @@ import asyncio import os +import signal import subprocess import click @@ -31,6 +32,7 @@ from platformio.debug.process.gdb import GDBClientProcess from platformio.project.config import ProjectConfig from platformio.project.exception import ProjectEnvsNotAvailableError from platformio.project.helpers import is_platformio_project +from platformio.project.options import ProjectOptions @click.command( @@ -54,11 +56,21 @@ from platformio.project.helpers import is_platformio_project ), ) @click.option("--environment", "-e", metavar="") +@click.option("--load-mode", type=ProjectOptions["env.debug_load_mode"].type) @click.option("--verbose", "-v", is_flag=True) @click.option("--interface", type=click.Choice(["gdb"])) @click.argument("__unprocessed", nargs=-1, type=click.UNPROCESSED) @click.pass_context -def cli(ctx, project_dir, project_conf, environment, verbose, interface, __unprocessed): +def cli( + ctx, + project_dir, + project_conf, + environment, + load_mode, + verbose, + interface, + __unprocessed, +): app.set_session_var("custom_project_conf", project_conf) # use env variables from Eclipse or CLion @@ -104,7 +116,7 @@ def cli(ctx, project_dir, project_conf, environment, verbose, interface, __unpro rebuild_prog = False preload = debug_config.load_cmds == ["preload"] - load_mode = debug_config.load_mode + load_mode = load_mode or debug_config.load_mode if load_mode == "always": rebuild_prog = preload or not helpers.has_debug_symbols( debug_config.program_path @@ -155,6 +167,7 @@ def cli(ctx, project_dir, project_conf, environment, verbose, interface, __unpro client = GDBClientProcess(project_dir, debug_config) coro = client.run(__unprocessed) try: + signal.signal(signal.SIGINT, signal.SIG_IGN) loop.run_until_complete(coro) if IS_WINDOWS: # an issue with `asyncio` executor and STIDIN, diff --git a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl index a5c0010b..9df294ee 100644 --- a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl @@ -75,7 +75,7 @@ set(CMAKE_CXX_STANDARD {{ cxx_stds[-1] }}) if (CMAKE_BUILD_TYPE MATCHES "{{ env_name }}") % for define in defines: - add_definitions(-D'{{!re.sub(r"([\"\(\)#])", r"\\\1", define)}}') + add_definitions(-D{{!re.sub(r"([\"\(\)#])", r"\\\1", define)}}) % end % for include in filter_includes(includes): @@ -99,7 +99,7 @@ endif() % for env, data in ide_data.items(): if (CMAKE_BUILD_TYPE MATCHES "{{ env }}") % for define in data["defines"]: - add_definitions(-D'{{!re.sub(r"([\"\(\)#])", r"\\\1", define)}}') + add_definitions(-D{{!re.sub(r"([\"\(\)#])", r"\\\1", define)}}) % end % for include in filter_includes(data["includes"]): diff --git a/platformio/ide/tpls/vscode/.vscode/launch.json.tpl b/platformio/ide/tpls/vscode/.vscode/launch.json.tpl index e05c7237..eb654808 100644 --- a/platformio/ide/tpls/vscode/.vscode/launch.json.tpl +++ b/platformio/ide/tpls/vscode/.vscode/launch.json.tpl @@ -30,7 +30,10 @@ % "type": "PlatformIO", % "task": ("Pre-Debug (%s)" % env_name) if len(config.envs()) > 1 else "Pre-Debug", % } -% return [debug, predebug] +% noloading = predebug.copy() +% noloading["name"] = "PIO Debug (without uploading)" +% noloading["loadMode"] = "manual" +% return [debug, predebug, noloading] % end % % def _remove_comments(lines): diff --git a/platformio/project/config.py b/platformio/project/config.py index 13ff8e2b..187cb993 100644 --- a/platformio/project/config.py +++ b/platformio/project/config.py @@ -295,7 +295,10 @@ class ProjectConfigBase(object): section, option = match.group(1), match.group(2) if section == "sysenv": return os.getenv(option) - return self.getraw(section, option) + value = self.getraw(section, option) + if isinstance(value, list): + return "\n".join(value) + return value def get(self, section, option, default=MISSING): value = None diff --git a/tests/test_projectconf.py b/tests/test_projectconf.py index 832ceb71..99c71ec0 100644 --- a/tests/test_projectconf.py +++ b/tests/test_projectconf.py @@ -63,6 +63,10 @@ targets = [env:test_extends] extends = strict_settings +[env:inject_base_env] +debug_build_flags = + ${env.debug_build_flags} + -D CUSTOM_DEBUG_FLAG """ @@ -150,13 +154,20 @@ def test_sections(config): "custom", "env:base", "env:test_extends", + "env:inject_base_env", "env:extra_1", "env:extra_2", ] def test_envs(config): - assert config.envs() == ["base", "test_extends", "extra_1", "extra_2"] + assert config.envs() == [ + "base", + "test_extends", + "inject_base_env", + "extra_1", + "extra_2", + ] assert config.default_envs() == ["base", "extra_2"] @@ -274,6 +285,14 @@ def test_get_value(config): assert config.get("env:extra_2", "monitor_speed") == 9600 assert config.get("env:base", "build_flags") == ["-D DEBUG=1"] + # get default value from ConfigOption + assert config.get("env:inject_base_env", "debug_build_flags") == [ + "-Og", + "-g2", + "-ggdb2", + "-D CUSTOM_DEBUG_FLAG", + ] + def test_items(config): assert config.items("custom") == [ @@ -445,4 +464,13 @@ def test_dump(tmpdir_factory): ], ), ("env:test_extends", [("extends", ["strict_settings"])]), + ( + "env:inject_base_env", + [ + ( + "debug_build_flags", + ["${env.debug_build_flags}", "-D CUSTOM_DEBUG_FLAG"], + ) + ], + ), ]