diff --git a/HISTORY.rst b/HISTORY.rst index 225b42bd..c63cd919 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -29,6 +29,14 @@ PlatformIO 4.0 - Override default source and include directories for a library via `library.json `__ manifest using ``includeDir`` and ``srcDir`` fields - Switched to workspace ``.pio/libdeps`` folder for project dependencies instead of ``.piolibdeps`` +* **Build System** + + - Print platform package details, such as version, VSC source and commit (`issue #2155 `_) + +* **PIO Remote** + + - Added support for `shared_dir `__ where you can place an extra files (extra scripts, LD scripts, etc.) which should be transferred to a remote machine + * **Infrastructure** - Python 3 support (`issue #895 `_) @@ -42,10 +50,6 @@ PlatformIO 4.0 - Fixed an issue with hardcoded C standard version when generating project for CLion IDE (`issue #2527 `_) - Fixed an issue with Project Generator when include path search order is inconsistent to what passed to the compiler (`issue #2509 `_) -* **PIO Remote** - - - Added support for `shared_dir `__ where you can place an extra files (extra scripts, LD scripts, etc.) which should be transferred to a remote machine - * **Miscellaneous** - Deprecated ``--only-check`` PlatformIO Core CLI option for "update" sub-commands, please use ``--dry-run`` instead diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index 5b2c2e2b..c7629f11 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -22,7 +22,6 @@ import hashlib import os import re import sys -from glob import glob from os.path import (basename, commonprefix, dirname, expanduser, isdir, isfile, join, realpath, sep) @@ -35,7 +34,6 @@ from platformio import exception, util from platformio.builder.tools import platformio as piotool from platformio.compat import PY2, WINDOWS, get_file_contents, string_types from platformio.managers.lib import LibraryManager -from platformio.managers.package import PackageManager class LibBuilderFactory(object): @@ -148,13 +146,6 @@ class LibBuilderBase(object): def version(self): return self._manifest.get("version") - @property - def vcs_info(self): - items = glob(join(self.path, ".*", PackageManager.SRC_MANIFEST_NAME)) - if not items: - return None - return util.load_json(items[0]) - @property def dependencies(self): return LibraryManager.normalize_dependencies( @@ -990,7 +981,11 @@ def GetLibBuilders(env): # pylint: disable=too-many-branches def ConfigureProjectLibBuilder(env): - def correct_found_libs(lib_builders): + def _get_vcs_info(lb): + path = LibraryManager.get_src_manifest_path(lb.path) + return util.load_json(path) if path else None + + def _correct_found_libs(lib_builders): # build full dependency graph found_lbs = [lb for lb in lib_builders if lb.dependent] for lb in lib_builders: @@ -1001,11 +996,11 @@ def ConfigureProjectLibBuilder(env): if deplb not in found_lbs: lb.depbuilders.remove(deplb) - def print_deps_tree(root, level=0): + def _print_deps_tree(root, level=0): margin = "| " * (level) for lb in root.depbuilders: title = "<%s>" % lb.name - vcs_info = lb.vcs_info + vcs_info = _get_vcs_info(lb) if lb.version: title += " %s" % lb.version if vcs_info and vcs_info.get("version"): @@ -1019,13 +1014,13 @@ def ConfigureProjectLibBuilder(env): sys.stdout.write(")") sys.stdout.write("\n") if lb.depbuilders: - print_deps_tree(lb, level + 1) + _print_deps_tree(lb, level + 1) project = ProjectAsLibBuilder(env, "$PROJECT_DIR") ldf_mode = LibBuilderBase.lib_ldf_mode.fget(project) - print("Library Dependency Finder -> http://bit.ly/configure-pio-ldf") - print("LDF MODES: FINDER(%s) COMPATIBILITY(%s)" % + print("LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf") + print("LDF Modes: Finder [%s] Compatibility [%s]" % (ldf_mode, project.lib_compat_mode)) lib_builders = env.GetLibBuilders() @@ -1035,11 +1030,11 @@ def ConfigureProjectLibBuilder(env): project.search_deps_recursive() if ldf_mode.startswith("chain") and project.depbuilders: - correct_found_libs(lib_builders) + _correct_found_libs(lib_builders) if project.depbuilders: print("Dependency Graph") - print_deps_tree(project) + _print_deps_tree(project) else: print("No dependencies") diff --git a/platformio/builder/tools/pioplatform.py b/platformio/builder/tools/pioplatform.py index 6d0d1c59..56b27da4 100644 --- a/platformio/builder/tools/pioplatform.py +++ b/platformio/builder/tools/pioplatform.py @@ -17,6 +17,7 @@ from __future__ import absolute_import import sys from os.path import isdir, isfile, join +from SCons.Script import ARGUMENTS # pylint: disable=import-error from SCons.Script import COMMAND_LINE_TARGETS # pylint: disable=import-error from platformio import exception, util @@ -118,58 +119,98 @@ def LoadPioPlatform(env): def PrintConfiguration(env): platform = env.PioPlatform() - platform_data = ["PLATFORM: %s >" % platform.title] - hardware_data = ["HARDWARE:"] - configuration_data = ["CONFIGURATION:"] - mcu = env.subst("$BOARD_MCU") - f_cpu = env.subst("$BOARD_F_CPU") - if mcu: - hardware_data.append(mcu.upper()) - if f_cpu: - f_cpu = int("".join([c for c in str(f_cpu) if c.isdigit()])) - hardware_data.append("%dMHz" % (f_cpu / 1000000)) + board_config = env.BoardConfig() if "BOARD" in env else None - debug_tools = None - if "BOARD" in env: - board_config = env.BoardConfig() - platform_data.append(board_config.get("name")) + def _get_configuration_data(): + return None if not board_config else [ + "CONFIGURATION:", + "https://docs.platformio.org/page/boards/%s/%s.html" % + (platform.name, board_config.id) + ] - debug_tools = board_config.get("debug", {}).get("tools") + def _get_plaform_data(): + data = ["PLATFORM: %s @ %s" % (platform.title, platform.version)] + src_manifest_path = platform.pm.get_src_manifest_path( + platform.get_dir()) + if src_manifest_path: + src_manifest = util.load_json(src_manifest_path) + if "version" in src_manifest: + data.append("#" + src_manifest['version']) + if int(ARGUMENTS.get("PIOVERBOSE", 0)): + data.append("(%s)" % src_manifest['url']) + if board_config: + data.extend([">", board_config.get("name")]) + return data + + def _get_hardware_data(): + data = ["HARDWARE:"] + mcu = env.subst("$BOARD_MCU") + f_cpu = env.subst("$BOARD_F_CPU") + if mcu: + data.append(mcu.upper()) + if f_cpu: + f_cpu = int("".join([c for c in str(f_cpu) if c.isdigit()])) + data.append("%dMHz" % (f_cpu / 1000000)) + if not board_config: + return data ram = board_config.get("upload", {}).get("maximum_ram_size") flash = board_config.get("upload", {}).get("maximum_size") - hardware_data.append( - "%s RAM (%s Flash)" % - (util.format_filesize(ram), util.format_filesize(flash))) - configuration_data.append( - "https://docs.platformio.org/page/boards/%s/%s.html" % - (platform.name, board_config.id)) + data.append("%s RAM [%s Flash]" % + (util.format_filesize(ram), util.format_filesize(flash))) + return data - for data in (configuration_data, platform_data, hardware_data): - if len(data) > 1: + def _get_debug_data(): + debug_tools = board_config.get( + "debug", {}).get("tools") if board_config else None + if not debug_tools: + return None + data = [ + "DEBUG:", + "CURRENT(%s)" % board_config.get_debug_tool_name( + env.GetProjectOption("debug_tool")) + ] + onboard = [] + external = [] + for key, value in debug_tools.items(): + if value.get("onboard"): + onboard.append(key) + else: + external.append(key) + if onboard: + data.append("ON-BOARD(%s)" % ", ".join(sorted(onboard))) + if external: + data.append("EXTERNAL(%s)" % ", ".join(sorted(external))) + return data + + def _get_packages_data(): + data = [] + for name, options in platform.packages.items(): + if options.get("optional"): + continue + pkg_dir = platform.get_package_dir(name) + if not pkg_dir: + continue + manifest = platform.pm.load_manifest(pkg_dir) + original_version = util.get_original_version(manifest['version']) + info = "%s %s %s" % (manifest['name'], + "#" if "__src_url" in manifest else "@", + manifest['version']) + extra = [] + if original_version: + extra.append(original_version) + if "__src_url" in manifest and int(ARGUMENTS.get("PIOVERBOSE", 0)): + extra.append(manifest['__src_url']) + if extra: + info += "(%s)" % ", ".join(extra) + data.append(info) + return ["PACKAGES:", ", ".join(data)] + + for data in (_get_configuration_data(), _get_plaform_data(), + _get_hardware_data(), _get_debug_data(), + _get_packages_data()): + if data and len(data) > 1: print(" ".join(data)) - # Debugging - if not debug_tools: - return - - data = [ - "CURRENT(%s)" % - board_config.get_debug_tool_name(env.GetProjectOption("debug_tool")) - ] - onboard = [] - external = [] - for key, value in debug_tools.items(): - if value.get("onboard"): - onboard.append(key) - else: - external.append(key) - if onboard: - data.append("ON-BOARD(%s)" % ", ".join(sorted(onboard))) - if external: - data.append("EXTERNAL(%s)" % ", ".join(sorted(external))) - - print("DEBUG: %s" % " ".join(data)) - def exists(_): return True diff --git a/platformio/exception.py b/platformio/exception.py index 09d7d2f9..823f68af 100644 --- a/platformio/exception.py +++ b/platformio/exception.py @@ -318,9 +318,11 @@ class CygwinEnvDetected(PlatformioException): class DebugSupportError(PlatformioException): - MESSAGE = ("Currently, PlatformIO does not support debugging for `{0}`.\n" - "Please contact support@pioplus.com or visit " - "< https://docs.platformio.org/page/plus/debugging.html >") + MESSAGE = ( + "Currently, PlatformIO does not support debugging for `{0}`.\n" + "Please request support at https://github.com/platformio/" + "platformio-core/issues \nor visit -> https://docs.platformio.org" + "/page/plus/debugging.html") class DebugInvalidOptions(PlatformioException): diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 905fb32f..3e9495e7 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -330,14 +330,15 @@ class PkgInstallerMixin(object): name += "_ID%d" % manifest['id'] return str(name) - def get_src_manifest_path(self, pkg_dir): + @classmethod + def get_src_manifest_path(cls, pkg_dir): if not isdir(pkg_dir): return None for item in os.listdir(pkg_dir): if not isdir(join(pkg_dir, item)): continue - if isfile(join(pkg_dir, item, self.SRC_MANIFEST_NAME)): - return join(pkg_dir, item, self.SRC_MANIFEST_NAME) + if isfile(join(pkg_dir, item, cls.SRC_MANIFEST_NAME)): + return join(pkg_dir, item, cls.SRC_MANIFEST_NAME) return None def get_manifest_path(self, pkg_dir):