From 784a5cd349f56bcf8a66a669ae506e4992b3de81 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 25 Oct 2019 00:33:04 +0300 Subject: [PATCH] Add support for "Build Middlewares" --- HISTORY.rst | 1 + docs | 2 +- platformio/builder/tools/platformio.py | 28 ++++++++++++++++++++++++-- platformio/commands/check/command.py | 2 +- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index f635db39..e3ce94bd 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -18,6 +18,7 @@ PlatformIO Core 4.0 - Unused variables or functions - Out of scope memory usage. +* Added support for `Build Middlewares `__: configure custom build flags per specific file, skip any build nodes from a framework, replace build file with another on-the-fly, etc. * Extend project environment configuration in "platformio.ini" with other sections using a new `extends `__ option (`issue #2953 `_) * Generate ``.ccls`` LSP file for `Emacs `__ cross references, hierarchies, completion and semantic highlighting * Added ``--no-ansi`` flag for `PIO Core `__ to disable ANSI control characters diff --git a/docs b/docs index 46b1dee7..733ab67e 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 46b1dee7f1426eeedd9f16aaef7dcddffdd51b37 +Subproject commit 733ab67e51bf7b567e73ca9b1545410b0397f167 diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 5d7fff09..64638450 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -14,10 +14,12 @@ from __future__ import absolute_import +import fnmatch import os import sys from SCons import Builder, Util # pylint: disable=import-error +from SCons.Node import FS # pylint: disable=import-error from SCons.Script import COMMAND_LINE_TARGETS # pylint: disable=import-error from SCons.Script import AlwaysBuild # pylint: disable=import-error from SCons.Script import DefaultEnvironment # pylint: disable=import-error @@ -244,7 +246,9 @@ def MatchSourceFiles(env, src_dir, src_filter=None): ) -def CollectBuildFiles(env, variant_dir, src_dir, src_filter=None, duplicate=False): +def CollectBuildFiles( + env, variant_dir, src_dir, src_filter=None, duplicate=False +): # pylint: disable=too-many-locals sources = [] variants = [] @@ -264,9 +268,24 @@ def CollectBuildFiles(env, variant_dir, src_dir, src_filter=None, duplicate=Fals if fs.path_endswith_ext(item, SRC_BUILD_EXT): sources.append(env.File(os.path.join(_var_dir, os.path.basename(item)))) + for callback, pattern in env.get("__PIO_BUILD_MIDDLEWARES", []): + tmp = [] + for node in sources: + if pattern and not fnmatch.fnmatch(node.get_path(), pattern): + tmp.append(node) + continue + n = callback(node) + if n: + tmp.append(n) + sources = tmp + return sources +def AddBuildMiddleware(env, callback, pattern=None): + env.Append(__PIO_BUILD_MIDDLEWARES=[(callback, pattern)]) + + def BuildFrameworks(env, frameworks): if not frameworks: return @@ -309,7 +328,11 @@ def BuildLibrary(env, variant_dir, src_dir, src_filter=None): def BuildSources(env, variant_dir, src_dir, src_filter=None): nodes = env.CollectBuildFiles(variant_dir, src_dir, src_filter) - DefaultEnvironment().Append(PIOBUILDFILES=[env.Object(node) for node in nodes]) + DefaultEnvironment().Append( + PIOBUILDFILES=[ + env.Object(node) if isinstance(node, FS.File) else node for node in nodes + ] + ) def exists(_): @@ -323,6 +346,7 @@ def generate(env): env.AddMethod(ProcessUnFlags) env.AddMethod(MatchSourceFiles) env.AddMethod(CollectBuildFiles) + env.AddMethod(AddBuildMiddleware) env.AddMethod(BuildFrameworks) env.AddMethod(BuildLibrary) env.AddMethod(BuildSources) diff --git a/platformio/commands/check/command.py b/platformio/commands/check/command.py index 03e5a018..e7ba650a 100644 --- a/platformio/commands/check/command.py +++ b/platformio/commands/check/command.py @@ -165,7 +165,7 @@ def results_to_json(raw): { "ignored": item.get("succeeded") is None, "succeeded": bool(item.get("succeeded")), - "defects": [d.as_dict() for d in item.get("defects", [])] + "defects": [d.as_dict() for d in item.get("defects", [])], } ) results.append(item)