From a584ac1da2a3d1487abc83200216bba98a79b244 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 8 Jun 2018 21:37:57 +0300 Subject: [PATCH 1/6] YAPF --- platformio/builder/tools/piolib.py | 11 +++++------ platformio/builder/tools/piomisc.py | 18 +++++++++--------- platformio/builder/tools/pioupload.py | 6 +++--- platformio/commands/lib.py | 4 ++-- platformio/commands/platform.py | 4 ++-- platformio/commands/run.py | 16 ++++++++-------- platformio/commands/settings.py | 4 ++-- platformio/downloader.py | 5 ++--- platformio/maintenance.py | 18 +++++++++--------- platformio/managers/lib.py | 18 +++++++++--------- platformio/managers/package.py | 26 +++++++++++++------------- platformio/managers/platform.py | 10 +++++----- 12 files changed, 69 insertions(+), 71 deletions(-) diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index 9048ea1c..3570e232 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -279,9 +279,8 @@ class LibBuilderBase(object): if (key in item and not util.items_in_list(self.env[env_key], item[key])): if self.verbose: - sys.stderr.write( - "Skip %s incompatible dependency %s\n" % (key[:-1], - item)) + sys.stderr.write("Skip %s incompatible dependency %s\n" + % (key[:-1], item)) skip = True if skip: continue @@ -394,9 +393,9 @@ class LibBuilderBase(object): if self != lb: if _already_depends(lb): if self.verbose: - sys.stderr.write("Warning! Circular dependencies detected " - "between `%s` and `%s`\n" % (self.path, - lb.path)) + sys.stderr.write( + "Warning! Circular dependencies detected " + "between `%s` and `%s`\n" % (self.path, lb.path)) self._circular_deps.append(lb) elif lb not in self._depbuilders: self._depbuilders.append(lb) diff --git a/platformio/builder/tools/piomisc.py b/platformio/builder/tools/piomisc.py index b01ea1a2..87331f5d 100644 --- a/platformio/builder/tools/piomisc.py +++ b/platformio/builder/tools/piomisc.py @@ -30,7 +30,8 @@ from platformio.managers.core import get_core_package_dir class InoToCPPConverter(object): - PROTOTYPE_RE = re.compile(r"""^( + PROTOTYPE_RE = re.compile( + r"""^( (?:template\<.*\>\s*)? # template ([a-z_\d]+\*?\s+){1,2} # return type ([a-z_\d]+\s*) # name of prototype @@ -89,8 +90,8 @@ class InoToCPPConverter(object): self.env.Execute( self.env.VerboseAction( '$CXX -o "{0}" -x c++ -fpreprocessed -dD -E "{1}"'.format( - out_file, - tmp_path), "Converting " + basename(out_file[:-4]))) + out_file, tmp_path), + "Converting " + basename(out_file[:-4]))) atexit.register(_delete_file, tmp_path) return isfile(out_file) @@ -163,18 +164,17 @@ class InoToCPPConverter(object): prototype_names = set([m.group(3).strip() for m in prototypes]) split_pos = prototypes[0].start() - match_ptrs = re.search(self.PROTOPTRS_TPLRE % - ("|".join(prototype_names)), - contents[:split_pos], re.M) + match_ptrs = re.search( + self.PROTOPTRS_TPLRE % ("|".join(prototype_names)), + contents[:split_pos], re.M) if match_ptrs: split_pos = contents.rfind("\n", 0, match_ptrs.start()) + 1 result = [] result.append(contents[:split_pos].strip()) result.append("%s;" % ";\n".join([m.group(1) for m in prototypes])) - result.append('#line %d "%s"' % - (self._get_total_lines(contents[:split_pos]), - self._main_ino.replace("\\", "/"))) + result.append('#line %d "%s"' % (self._get_total_lines( + contents[:split_pos]), self._main_ino.replace("\\", "/"))) result.append(contents[split_pos:].strip()) return "\n".join(result) diff --git a/platformio/builder/tools/pioupload.py b/platformio/builder/tools/pioupload.py index 1ba523e4..7c6c2df0 100644 --- a/platformio/builder/tools/pioupload.py +++ b/platformio/builder/tools/pioupload.py @@ -209,9 +209,9 @@ def CheckUploadSize(_, target, source, env): # pylint: disable=W0613,W0621 used_size = int(values[0]) + int(values[1]) if used_size > max_size: - sys.stderr.write("Error: The program size (%d bytes) is greater " - "than maximum allowed (%s bytes)\n" % (used_size, - max_size)) + sys.stderr.write( + "Error: The program size (%d bytes) is greater " + "than maximum allowed (%s bytes)\n" % (used_size, max_size)) env.Exit(1) diff --git a/platformio/commands/lib.py b/platformio/commands/lib.py index 81400684..826cd344 100644 --- a/platformio/commands/lib.py +++ b/platformio/commands/lib.py @@ -439,8 +439,8 @@ def lib_stats(json_output): printitem_tpl.format( name=click.style(name, fg="cyan"), url=click.style( - "https://platformio.org/lib/search?query=" + - quote("keyword:%s" % name), + "https://platformio.org/lib/search?query=" + quote( + "keyword:%s" % name), fg="blue"))) for key in ("updated", "added"): diff --git a/platformio/commands/platform.py b/platformio/commands/platform.py index 8ec1c259..394803a1 100644 --- a/platformio/commands/platform.py +++ b/platformio/commands/platform.py @@ -273,8 +273,8 @@ def platform_show(platform, json_output): # pylint: disable=too-many-branches if item['type']: click.echo("Type: %s" % item['type']) click.echo("Requirements: %s" % item['requirements']) - click.echo("Installed: %s" % - ("Yes" if item.get("version") else "No (optional)")) + click.echo("Installed: %s" % ("Yes" if item.get("version") else + "No (optional)")) if "version" in item: click.echo("Version: %s" % item['version']) if "originalVersion" in item: diff --git a/platformio/commands/run.py b/platformio/commands/run.py index f2d4636c..a09ee01e 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -296,10 +296,10 @@ class EnvironmentProcessor(object): if d.strip() ], self.verbose) if "lib_deps" in self.options: - _autoinstall_libdeps(self.cmd_ctx, - util.parse_conf_multi_values( - self.options['lib_deps']), - self.verbose) + _autoinstall_libdeps( + self.cmd_ctx, + util.parse_conf_multi_values(self.options['lib_deps']), + self.verbose) try: p = PlatformFactory.newPlatform(self.options['platform']) @@ -385,10 +385,10 @@ def print_summary(results, start_time): err=status is False) print_header( - "[%s] Took %.2f seconds" % - ((click.style("SUCCESS", fg="green", bold=True) - if successed else click.style("ERROR", fg="red", bold=True)), - time() - start_time), + "[%s] Took %.2f seconds" % ( + (click.style("SUCCESS", fg="green", bold=True) + if successed else click.style("ERROR", fg="red", bold=True)), + time() - start_time), is_error=not successed) diff --git a/platformio/commands/settings.py b/platformio/commands/settings.py index f163ff6d..a29d3997 100644 --- a/platformio/commands/settings.py +++ b/platformio/commands/settings.py @@ -32,8 +32,8 @@ def settings_get(name): click.echo( list_tpl.format( name=click.style("Name", fg="cyan"), - value=(click.style("Value", fg="green") + - click.style(" [Default]", fg="yellow")), + value=(click.style("Value", fg="green") + click.style( + " [Default]", fg="yellow")), description="Description")) click.echo("-" * terminal_width) diff --git a/platformio/downloader.py b/platformio/downloader.py index 34f597b2..62c19385 100644 --- a/platformio/downloader.py +++ b/platformio/downloader.py @@ -43,9 +43,8 @@ class FileDownloader(object): disposition = self._request.headers.get("content-disposition") if disposition and "filename=" in disposition: - self._fname = disposition[ - disposition.index("filename=") + 9:].replace('"', "").replace( - "'", "") + self._fname = disposition[disposition.index("filename=") + + 9:].replace('"', "").replace("'", "") self._fname = self._fname.encode("utf8") else: self._fname = [p for p in url.split("/") if p][-1] diff --git a/platformio/maintenance.py b/platformio/maintenance.py index 35f0e173..7b1a5f58 100644 --- a/platformio/maintenance.py +++ b/platformio/maintenance.py @@ -208,8 +208,8 @@ def after_upgrade(ctx): # PlatformIO banner click.echo("*" * terminal_width) - click.echo("If you like %s, please:" % - (click.style("PlatformIO", fg="cyan"))) + click.echo( + "If you like %s, please:" % (click.style("PlatformIO", fg="cyan"))) click.echo("- %s us on Twitter to stay up-to-date " "on the latest project news > %s" % (click.style("follow", fg="cyan"), @@ -224,9 +224,9 @@ def after_upgrade(ctx): (click.style("try", fg="cyan"), click.style("https://platformio.org/platformio-ide", fg="cyan"))) if not util.is_ci(): - click.echo("- %s us with PlatformIO Plus > %s" % - (click.style("support", fg="cyan"), - click.style("https://pioplus.com", fg="cyan"))) + click.echo("- %s us with PlatformIO Plus > %s" % (click.style( + "support", fg="cyan"), click.style( + "https://pioplus.com", fg="cyan"))) click.echo("*" * terminal_width) click.echo("") @@ -296,8 +296,8 @@ def check_internal_updates(ctx, what): if manifest['name'] in outdated_items: continue conds = [ - pm.outdated(manifest['__pkg_dir']), - what == "platforms" and PlatformFactory.newPlatform( + pm.outdated(manifest['__pkg_dir']), what == "platforms" + and PlatformFactory.newPlatform( manifest['__pkg_dir']).are_outdated_packages() ] if any(conds): @@ -318,8 +318,8 @@ def check_internal_updates(ctx, what): if not app.get_setting("auto_update_" + what): click.secho("Please update them via ", fg="yellow", nl=False) click.secho( - "`platformio %s update`" % - ("lib --global" if what == "libraries" else "platform"), + "`platformio %s update`" % ("lib --global" if what == "libraries" + else "platform"), fg="cyan", nl=False) click.secho(" command.\n", fg="yellow") diff --git a/platformio/managers/lib.py b/platformio/managers/lib.py index 5613b668..ba81870a 100644 --- a/platformio/managers/lib.py +++ b/platformio/managers/lib.py @@ -208,9 +208,9 @@ class LibraryManager(BasePkgManager): cache_valid="30d") assert dl_data - return self._install_from_url(name, dl_data['url'].replace( - "http://", "https://") if app.get_setting("enable_ssl") else - dl_data['url'], requirements) + return self._install_from_url( + name, dl_data['url'].replace("http://", "https://") + if app.get_setting("enable_ssl") else dl_data['url'], requirements) def search_lib_id( # pylint: disable=too-many-branches self, @@ -237,9 +237,9 @@ class LibraryManager(BasePkgManager): if not isinstance(values, list): values = [v.strip() for v in values.split(",") if v] for value in values: - query.append('%s:"%s"' % (key[:-1] - if key.endswith("s") else key, - value)) + query.append( + '%s:"%s"' % (key[:-1] + if key.endswith("s") else key, value)) lib_info = None result = util.get_api_result( @@ -290,9 +290,9 @@ class LibraryManager(BasePkgManager): def _get_lib_id_from_installed(self, filters): if filters['name'].startswith("id="): return int(filters['name'][3:]) - package_dir = self.get_package_dir(filters['name'], - filters.get("requirements", - filters.get("version"))) + package_dir = self.get_package_dir( + filters['name'], filters.get("requirements", + filters.get("version"))) if not package_dir: return None manifest = self.load_manifest(package_dir) diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 3996bc06..58331980 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -500,8 +500,8 @@ class PkgInstallerMixin(object): cur_manifest['version']) if "__src_url" in cur_manifest: target_dirname = "%s@src-%s" % ( - pkg_dirname, - hashlib.md5(cur_manifest['__src_url']).hexdigest()) + pkg_dirname, hashlib.md5( + cur_manifest['__src_url']).hexdigest()) shutil.move(pkg_dir, join(self.package_dir, target_dirname)) # fix to a version elif action == 2: @@ -509,8 +509,8 @@ class PkgInstallerMixin(object): tmp_manifest['version']) if "__src_url" in tmp_manifest: target_dirname = "%s@src-%s" % ( - pkg_dirname, - hashlib.md5(tmp_manifest['__src_url']).hexdigest()) + pkg_dirname, hashlib.md5( + tmp_manifest['__src_url']).hexdigest()) pkg_dir = join(self.package_dir, target_dirname) # remove previous/not-satisfied package @@ -722,13 +722,13 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): pkg_dir = self.get_package_dir(name, requirements, url) if not pkg_dir: - raise exception.UnknownPackage("%s @ %s" % (package, - requirements or "*")) + raise exception.UnknownPackage( + "%s @ %s" % (package, requirements or "*")) manifest = self.load_manifest(pkg_dir) click.echo( - "Uninstalling %s @ %s: \t" % - (click.style(manifest['name'], fg="cyan"), manifest['version']), + "Uninstalling %s @ %s: \t" % (click.style( + manifest['name'], fg="cyan"), manifest['version']), nl=False) if islink(pkg_dir): @@ -740,9 +740,9 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): # unfix package with the same name pkg_dir = self.get_package_dir(manifest['name']) if pkg_dir and "@" in pkg_dir: - shutil.move(pkg_dir, - join(self.package_dir, - self.get_install_dirname(manifest))) + shutil.move( + pkg_dir, + join(self.package_dir, self.get_install_dirname(manifest))) self.cache_reset() click.echo("[%s]" % click.style("OK", fg="green")) @@ -761,8 +761,8 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): pkg_dir = self.get_package_dir(*self.parse_pkg_uri(package)) if not pkg_dir: - raise exception.UnknownPackage("%s @ %s" % (package, - requirements or "*")) + raise exception.UnknownPackage( + "%s @ %s" % (package, requirements or "*")) manifest = self.load_manifest(pkg_dir) name = manifest['name'] diff --git a/platformio/managers/platform.py b/platformio/managers/platform.py index 03010fdc..5a947c4c 100644 --- a/platformio/managers/platform.py +++ b/platformio/managers/platform.py @@ -39,9 +39,9 @@ class PlatformManager(BasePkgManager): "{0}://dl.platformio.org/platforms/manifest.json".format( "https" if app.get_setting("enable_ssl") else "http") ] - BasePkgManager.__init__(self, package_dir - or join(util.get_home_dir(), "platforms"), - repositories) + BasePkgManager.__init__( + self, package_dir or join(util.get_home_dir(), "platforms"), + repositories) @property def manifest_names(self): @@ -331,8 +331,8 @@ class PlatformPackagesMixin(object): def get_package_dir(self, name): version = self.packages[name].get("version", "") if ":" in version: - return self.pm.get_package_dir(*self.pm.parse_pkg_uri( - "%s=%s" % (name, version))) + return self.pm.get_package_dir( + *self.pm.parse_pkg_uri("%s=%s" % (name, version))) return self.pm.get_package_dir(name, version) def get_package_version(self, name): From 75754a47504a112d4cd4da6320796e0861f3fe3a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 8 Jun 2018 21:38:41 +0300 Subject: [PATCH 2/6] Don't export ``CPPPATH`` of project dependent libraries to frameworks // Resolve #1665 --- HISTORY.rst | 6 +++ docs | 2 +- platformio/builder/tools/piolib.py | 6 +-- platformio/builder/tools/platformio.py | 57 ++++++++++++++++---------- tests/test_builder.py | 5 ++- 5 files changed, 48 insertions(+), 28 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 4bcb68f6..a1bf404b 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,12 @@ Release Notes PlatformIO 3.0 -------------- +3.5.4 (2018-??-??) +~~~~~~~~~~~~~~~~~~ + +* Don't export ``CPPPATH`` of project dependent libraries to frameworks + (`issue #1665 `_) + 3.5.3 (2018-06-01) ~~~~~~~~~~~~~~~~~~ diff --git a/docs b/docs index 3ad76be8..e80a1091 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 3ad76be8f73ab1b3766bafa7ffca4284051aca4c +Subproject commit e80a1091b0f9b29383bddf10dc02a56967b74eed diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index 3570e232..76798b8e 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -821,7 +821,7 @@ def BuildProjectLibraries(env): title = "<%s>" % lb.name vcs_info = lb.vcs_info if lb.version: - title += " v%s" % lb.version + title += " %s" % lb.version if vcs_info and vcs_info.get("version"): title += " #%s" % vcs_info.get("version") sys.stdout.write("%s|-- %s" % (margin, title)) @@ -836,7 +836,6 @@ def BuildProjectLibraries(env): print_deps_tree(lb, level + 1) project = ProjectAsLibBuilder(env, "$PROJECT_DIR") - project.env = env ldf_mode = LibBuilderBase.lib_ldf_mode.fget(project) print "Library Dependency Finder -> http://bit.ly/configure-pio-ldf" @@ -858,7 +857,8 @@ def BuildProjectLibraries(env): else: print "No dependencies" - return project.build() + libs = project.build() + return dict(LIBS=libs, CPPPATH=project.env.get("CPPPATH")) def exists(_): diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 9c6f6d0d..543d36a9 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -22,7 +22,7 @@ from os.path import basename, dirname, isdir, join, realpath from SCons import Builder, Util from SCons.Script import (COMMAND_LINE_TARGETS, AlwaysBuild, - DefaultEnvironment, SConscript) + DefaultEnvironment, Export, SConscript) from platformio.util import glob_escape, pioversion_to_intstr @@ -41,6 +41,36 @@ def scons_patched_match_splitext(path, suffixes=None): return tokens +def _build_project_deps(env): + deps = env.BuildProjectLibraries() + srcnodes = None + if "__test" in COMMAND_LINE_TARGETS: + srcnodes = env.ProcessTest() + else: + srcnodes = env.CollectBuildFiles( + "$BUILDSRC_DIR", + "$PROJECTSRC_DIR", + src_filter=env.get("SRC_FILTER")) + + projenv = env.Clone() + Export("projenv") + + # CPPPATH from dependencies + projenv.PrependUnique(CPPPATH=deps['CPPPATH']) + # extra build flags from `platformio.ini` + projenv.ProcessFlags(env.get("SRC_BUILD_FLAGS")) + + # prepend dependent libs before built-in + env.Prepend( + LIBS=deps['LIBS'], PIOBUILDFILES=[projenv.Object(n) for n in srcnodes]) + + if not env['PIOBUILDFILES'] and not COMMAND_LINE_TARGETS: + sys.stderr.write( + "Error: Nothing to build. Please put your source code files " + "to '%s' folder\n" % env.subst("$PROJECTSRC_DIR")) + env.Exit(1) + + def BuildProgram(env): def _append_pio_macros(): @@ -62,6 +92,7 @@ def BuildProgram(env): # process extra flags from board if "BOARD" in env and "build.extra_flags" in env.BoardConfig(): env.ProcessFlags(env.BoardConfig().get("build.extra_flags")) + # apply user flags env.ProcessFlags(env.get("BUILD_FLAGS")) @@ -74,8 +105,8 @@ def BuildProgram(env): # remove specified flags env.ProcessUnFlags(env.get("BUILD_UNFLAGS")) - # build dependent libs; place them before built-in libs - env.Prepend(LIBS=env.BuildProjectLibraries()) + # build project with dependencies + _build_project_deps(env) # append specified LD_SCRIPT if ("LDSCRIPT_PATH" in env @@ -87,24 +118,6 @@ def BuildProgram(env): env.Prepend(_LIBFLAGS="-Wl,--start-group ") env.Append(_LIBFLAGS=" -Wl,--end-group") - # Handle SRC_BUILD_FLAGS - env.ProcessFlags(env.get("SRC_BUILD_FLAGS")) - - if "__test" in COMMAND_LINE_TARGETS: - env.Append(PIOBUILDFILES=env.ProcessTest()) - else: - env.Append( - PIOBUILDFILES=env.CollectBuildFiles( - "$BUILDSRC_DIR", - "$PROJECTSRC_DIR", - src_filter=env.get("SRC_FILTER"))) - - if not env['PIOBUILDFILES'] and not COMMAND_LINE_TARGETS: - sys.stderr.write( - "Error: Nothing to build. Please put your source code files " - "to '%s' folder\n" % env.subst("$PROJECTSRC_DIR")) - env.Exit(1) - program = env.Program( join("$BUILD_DIR", env.subst("$PROGNAME")), env['PIOBUILDFILES']) @@ -275,7 +288,7 @@ def BuildFrameworks(env, frameworks): env.ConvertInoToCpp() if f in board_frameworks: - SConscript(env.GetFrameworkScript(f)) + SConscript(env.GetFrameworkScript(f), exports="env") else: sys.stderr.write( "Error: This board doesn't support %s framework!\n" % f) diff --git a/tests/test_builder.py b/tests/test_builder.py index cafd1cee..4048c065 100644 --- a/tests/test_builder.py +++ b/tests/test_builder.py @@ -29,8 +29,9 @@ build_flags = %s """ % " ".join([f[0] for f in build_flags])) tmpdir.join("extra.py").write(""" -Import("env") -env.Append(CPPDEFINES="POST_SCRIPT_MACRO") +Import("projenv") + +projenv.Append(CPPDEFINES="POST_SCRIPT_MACRO") """) tmpdir.mkdir("src").join("main.cpp").write(""" From f9fde5d627f608ea514fcd496b146e8cd1e0a1b4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 9 Jun 2018 00:48:42 +0300 Subject: [PATCH 3/6] Fixed issue with invalid LD script if path contains space --- HISTORY.rst | 1 + platformio/builder/tools/piomisc.py | 25 ++++++++++++++++++------- platformio/builder/tools/platformio.py | 5 ++--- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index a1bf404b..f402b3e3 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,6 +9,7 @@ PlatformIO 3.0 * Don't export ``CPPPATH`` of project dependent libraries to frameworks (`issue #1665 `_) +* Fixed issue with invalid LD script if path contains space 3.5.3 (2018-06-01) ~~~~~~~~~~~~~~~~~~ diff --git a/platformio/builder/tools/piomisc.py b/platformio/builder/tools/piomisc.py index 87331f5d..373efbd3 100644 --- a/platformio/builder/tools/piomisc.py +++ b/platformio/builder/tools/piomisc.py @@ -231,14 +231,25 @@ def GetActualLDScript(env): return None script = None + script_in_next = False for f in env.get("LINKFLAGS", []): - if f.startswith("-Wl,-T"): - script = env.subst(f[6:].replace('"', "").strip()) - if isfile(script): - return script - path = _lookup_in_ldpath(script) - if path: - return path + raw_script = None + if f == "-T": + script_in_next = True + continue + elif script_in_next: + script_in_next = False + raw_script = f + elif f.startswith("-Wl,-T"): + raw_script = f[6:] + else: + continue + script = env.subst(raw_script.replace('"', "").strip()) + if isfile(script): + return script + path = _lookup_in_ldpath(script) + if path: + return path if script: sys.stderr.write( diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 543d36a9..6ab49af2 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -109,9 +109,8 @@ def BuildProgram(env): _build_project_deps(env) # append specified LD_SCRIPT - if ("LDSCRIPT_PATH" in env - and not any("-Wl,-T" in f for f in env['LINKFLAGS'])): - env.Append(LINKFLAGS=['-Wl,-T"$LDSCRIPT_PATH"']) + if "LDSCRIPT_PATH" in env and not any("-T" in f for f in env['LINKFLAGS']): + env.Append(LINKFLAGS=["-T", "$LDSCRIPT_PATH"]) # enable "cyclic reference" for linker if env.get("LIBS") and env.GetCompilerType() == "gcc": From 46c904e67dc849c99b492637ba7d1794b49e205a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 9 Jun 2018 01:37:38 +0300 Subject: [PATCH 4/6] Bump version to 3.5.4a1 --- platformio/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 6de67c99..da19c94d 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, 3) +VERSION = (3, 5, "4a1") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" From 00c0eaed8a8a8236e3c0f9740221d97a3c5039de Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 9 Jun 2018 14:50:54 +0300 Subject: [PATCH 5/6] Append a main LD script at the beginning --- platformio/builder/tools/platformio.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 6ab49af2..7b6e23ed 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -108,9 +108,10 @@ def BuildProgram(env): # build project with dependencies _build_project_deps(env) - # append specified LD_SCRIPT - if "LDSCRIPT_PATH" in env and not any("-T" in f for f in env['LINKFLAGS']): - env.Append(LINKFLAGS=["-T", "$LDSCRIPT_PATH"]) + # append into the beginning a main LD script + if (env.get("LDSCRIPT_PATH") + and not any("-Wl,-T" in f for f in env['LINKFLAGS'])): + env.Prepend(LINKFLAGS=["-T", "$LDSCRIPT_PATH"]) # enable "cyclic reference" for linker if env.get("LIBS") and env.GetCompilerType() == "gcc": From 786d505ecb2d7dc5c57d4c496ab09dd166590c06 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sun, 10 Jun 2018 01:27:50 +0300 Subject: [PATCH 6/6] Isolate build environment for "BuildSources" nodes --- platformio/builder/tools/piomisc.py | 3 --- platformio/builder/tools/platformio.py | 32 +++++++++++++------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/platformio/builder/tools/piomisc.py b/platformio/builder/tools/piomisc.py index 373efbd3..4ac533cf 100644 --- a/platformio/builder/tools/piomisc.py +++ b/platformio/builder/tools/piomisc.py @@ -306,9 +306,6 @@ def ProcessTest(env): src_filter.append("+<%s%s>" % (env['PIOTEST'], sep)) env.Replace(PIOTEST_SRC_FILTER=src_filter) - return env.CollectBuildFiles("$BUILDTEST_DIR", "$PROJECTTEST_DIR", - "$PIOTEST_SRC_FILTER") - def GetExtraScripts(env, scope): items = [] diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 7b6e23ed..e60e41aa 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -43,33 +43,32 @@ def scons_patched_match_splitext(path, suffixes=None): def _build_project_deps(env): deps = env.BuildProjectLibraries() - srcnodes = None - if "__test" in COMMAND_LINE_TARGETS: - srcnodes = env.ProcessTest() - else: - srcnodes = env.CollectBuildFiles( - "$BUILDSRC_DIR", - "$PROJECTSRC_DIR", - src_filter=env.get("SRC_FILTER")) + # prepend dependent libs before built-in + env.Prepend(LIBS=deps['LIBS']) - projenv = env.Clone() - Export("projenv") + if "__test" in COMMAND_LINE_TARGETS: + env.ProcessTest() + projenv = env.Clone() + projenv.BuildSources("$BUILDTEST_DIR", "$PROJECTTEST_DIR", + "$PIOTEST_SRC_FILTER") + else: + projenv = env.Clone() + projenv.BuildSources("$BUILDSRC_DIR", "$PROJECTSRC_DIR", + env.get("SRC_FILTER")) # CPPPATH from dependencies projenv.PrependUnique(CPPPATH=deps['CPPPATH']) # extra build flags from `platformio.ini` projenv.ProcessFlags(env.get("SRC_BUILD_FLAGS")) - # prepend dependent libs before built-in - env.Prepend( - LIBS=deps['LIBS'], PIOBUILDFILES=[projenv.Object(n) for n in srcnodes]) - - if not env['PIOBUILDFILES'] and not COMMAND_LINE_TARGETS: + if not env.get("PIOBUILDFILES") and not COMMAND_LINE_TARGETS: sys.stderr.write( "Error: Nothing to build. Please put your source code files " "to '%s' folder\n" % env.subst("$PROJECTSRC_DIR")) env.Exit(1) + Export("projenv") + def BuildProgram(env): @@ -302,8 +301,9 @@ 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.CollectBuildFiles(variant_dir, src_dir, src_filter)) + PIOBUILDFILES=[env.Object(node) for node in nodes]) def exists(_):