def _run_scons(self, variables, targets, jobs): args = [ get_pythonexe_path(), join(get_core_package_dir("tool-scons"), "script", "scons"), "-Q", "--warn=no-no-parallel-support", "--jobs", str(jobs), "--sconstruct", join(fs.get_source_dir(), "builder", "main.py") ] # yapf: disable args.append("PIOVERBOSE=%d" % (1 if self.verbose else 0)) # pylint: disable=protected-access args.append("ISATTY=%d" % (1 if click._compat.isatty(sys.stdout) else 0)) args += targets # encode and append variables for key, value in variables.items(): args.append("%s=%s" % (key.upper(), self.encode_scons_arg(value))) def _write_and_flush(stream, data): try: stream.write(data) stream.flush() except IOError: pass copy_pythonpath_to_osenv() result = exec_command( args, stdout=BuildAsyncPipe( line_callback=self._on_stdout_line, data_callback=lambda data: _write_and_flush(sys.stdout, data)), stderr=BuildAsyncPipe( line_callback=self._on_stderr_line, data_callback=lambda data: _write_and_flush(sys.stderr, data))) return result
def get_supported_ides(): tpls_dir = os.path.join(fs.get_source_dir(), "ide", "tpls") return sorted( [ d for d in os.listdir(tpls_dir) if os.path.isdir(os.path.join(tpls_dir, d)) ] )
def get_tpls(self): tpls = [] tpls_dir = join(fs.get_source_dir(), "ide", "tpls", self.ide) for root, _, files in os.walk(tpls_dir): for f in files: if not f.endswith(".tpl"): continue _relpath = root.replace(tpls_dir, "") if _relpath.startswith(os.sep): _relpath = _relpath[1:] tpls.append((_relpath, join(root, f))) return tpls
def check_platformio_upgrade(): last_check = app.get_state_item("last_check", {}) interval = int(app.get_setting("check_platformio_interval")) * 3600 * 24 if (time() - interval) < last_check.get("platformio_upgrade", 0): return last_check["platformio_upgrade"] = int(time()) app.set_state_item("last_check", last_check) util.internet_on(raise_exception=True) # Update PlatformIO's Core packages update_core_packages(silent=True) latest_version = get_latest_version() if semantic_version.Version.coerce(util.pepver_to_semver( latest_version)) <= semantic_version.Version.coerce( util.pepver_to_semver(__version__)): return terminal_width, _ = click.get_terminal_size() click.echo("") click.echo("*" * terminal_width) click.secho( "There is a new version %s of PlatformIO available.\n" "Please upgrade it via `" % latest_version, fg="yellow", nl=False, ) if getenv("PLATFORMIO_IDE"): click.secho("PlatformIO IDE Menu: Upgrade PlatformIO", fg="cyan", nl=False) click.secho("`.", fg="yellow") elif join("Cellar", "platformio") in fs.get_source_dir(): click.secho("brew update && brew upgrade", fg="cyan", nl=False) click.secho("` command.", fg="yellow") else: click.secho("platformio upgrade", fg="cyan", nl=False) click.secho("` or `", fg="yellow", nl=False) click.secho("pip install -U platformio", fg="cyan", nl=False) click.secho("` command.", fg="yellow") click.secho("Changes: ", fg="yellow", nl=False) click.secho("https://docs.platformio.org/en/latest/history.html", fg="cyan") click.echo("*" * terminal_width) click.echo("")
def pioplus_call(args, **kwargs): if WINDOWS and sys.version_info < (2, 7, 6): raise exception.PlatformioException( "PlatformIO Core Plus v%s does not run under Python version %s.\n" "Minimum supported version is 2.7.6, please upgrade Python.\n" "Python 3 is not yet supported.\n" % (__version__, sys.version)) pioplus_path = join(get_core_package_dir("tool-pioplus"), "pioplus") pythonexe_path = get_pythonexe_path() os.environ["PYTHONEXEPATH"] = pythonexe_path os.environ["PYTHONPYSITEDIR"] = get_core_package_dir("contrib-pysite") os.environ["PIOCOREPYSITEDIR"] = dirname(fs.get_source_dir() or "") if dirname(pythonexe_path) not in os.environ["PATH"].split(os.pathsep): os.environ["PATH"] = (os.pathsep).join( [dirname(pythonexe_path), os.environ["PATH"]]) copy_pythonpath_to_osenv() code = subprocess.call([pioplus_path] + args, **kwargs) # handle remote update request if code == 13: count_attr = "_update_count" try: count_value = getattr(pioplus_call, count_attr) except AttributeError: count_value = 0 setattr(pioplus_call, count_attr, 1) count_value += 1 setattr(pioplus_call, count_attr, count_value) if count_value < PIOPLUS_AUTO_UPDATES_MAX: update_core_packages() return pioplus_call(args, **kwargs) # handle reload request elif code == 14: return pioplus_call(args, **kwargs) if code != 0: raise exception.ReturnErrorCode(1) return True
def update_project_examples(): platform_readme_tpl = """ # {title}: development platform for [PlatformIO](https://platformio.org) {description} * [Home](https://platformio.org/platforms/{name}) (home page in PlatformIO Registry) * [Documentation](https://docs.platformio.org/page/platforms/{name}.html) (advanced usage, packages, boards, frameworks, etc.) # Examples {examples} """ framework_readme_tpl = """ # {title}: framework for [PlatformIO](https://platformio.org) {description} * [Home](https://platformio.org/frameworks/{name}) (home page in PlatformIO Registry) * [Documentation](https://docs.platformio.org/page/frameworks/{name}.html) # Examples {examples} """ project_examples_dir = join(fs.get_source_dir(), "..", "examples") framework_examples_md_lines = {} embedded = [] desktop = [] for manifest in PLATFORM_MANIFESTS: p = PlatformFactory.newPlatform(manifest['name']) github_url = p.repository_url[:-4] # Platform README platform_examples_dir = join(p.get_dir(), "examples") examples_md_lines = [] if isdir(platform_examples_dir): for item in sorted(os.listdir(platform_examples_dir)): example_dir = join(platform_examples_dir, item) if not isdir(example_dir) or not os.listdir(example_dir): continue url = "%s/tree/master/examples/%s" % (github_url, item) examples_md_lines.append("* [%s](%s)" % (item, url)) readme_dir = join(project_examples_dir, "platforms", p.name) if not isdir(readme_dir): os.makedirs(readme_dir) with open(join(readme_dir, "README.md"), "w") as fp: fp.write( platform_readme_tpl.format( name=p.name, title=p.title, description=p.description, examples="\n".join(examples_md_lines))) # Framework README for framework in API_FRAMEWORKS: if not is_compat_platform_and_framework(p.name, framework['name']): continue if framework['name'] not in framework_examples_md_lines: framework_examples_md_lines[framework['name']] = [] lines = [] lines.append("- [%s](%s)" % (p.title, github_url)) lines.extend(" %s" % l for l in examples_md_lines) lines.append("") framework_examples_md_lines[framework['name']].extend(lines) # Root README line = "* [%s](%s)" % (p.title, "%s/tree/master/examples" % github_url) if p.is_embedded(): embedded.append(line) else: desktop.append(line) # Frameworks frameworks = [] for framework in API_FRAMEWORKS: readme_dir = join(project_examples_dir, "frameworks", framework['name']) if not isdir(readme_dir): os.makedirs(readme_dir) with open(join(readme_dir, "README.md"), "w") as fp: fp.write( framework_readme_tpl.format( name=framework['name'], title=framework['title'], description=framework['description'], examples="\n".join( framework_examples_md_lines[framework['name']]))) url = campaign_url( "https://docs.platformio.org/en/latest/frameworks/%s.html#examples" % framework['name'], source="github", medium="examples") frameworks.append("* [%s](%s)" % (framework['title'], url)) with open(join(project_examples_dir, "README.md"), "w") as fp: fp.write("""# PlatformIO Project Examples - [Development platforms](#development-platforms): - [Embedded](#embedded) - [Desktop](#desktop) - [Frameworks](#frameworks) ## Development platforms ### Embedded %s ### Desktop %s ## Frameworks %s """ % ("\n".join(embedded), "\n".join(desktop), "\n".join(frameworks)))
def update_debugging(): tool_to_platforms = {} tool_to_boards = {} vendors = {} platforms = [] frameworks = [] for data in BOARDS: if not data['debug']: continue for tool in data['debug']['tools']: tool = str(tool) if tool not in tool_to_platforms: tool_to_platforms[tool] = [] tool_to_platforms[tool].append(data['platform']) if tool not in tool_to_boards: tool_to_boards[tool] = [] tool_to_boards[tool].append(data['id']) platforms.append(data['platform']) frameworks.extend(data['frameworks']) vendor = data['vendor'] if vendor in vendors: vendors[vendor].append(data) else: vendors[vendor] = [data] platforms = sorted(set(platforms)) frameworks = sorted(set(frameworks)) lines = [".. _debugging_platforms:"] lines.extend(generate_platforms_contents(platforms)) lines.extend(generate_frameworks_contents(frameworks)) # Boards lines.append(""" Boards ------ .. note:: For more detailed ``board`` information please scroll tables below by horizontal. """) for vendor, boards in sorted(vendors.items()): lines.append(str(vendor)) lines.append("~" * len(vendor)) lines.extend(generate_boards_table(boards)) # save with open(join(fs.get_source_dir(), "..", "docs", "plus", "debugging.rst"), "r+") as fp: content = fp.read() fp.seek(0) fp.truncate() fp.write(content[:content.index(".. _debugging_platforms:")] + "\n".join(lines)) # Debug tools for tool, platforms in tool_to_platforms.items(): tool_path = join(DOCS_ROOT_DIR, "plus", "debug-tools", "%s.rst" % tool) if not isfile(tool_path): click.secho("Unknown debug tool `%s`" % tool, fg="red") continue platforms = sorted(set(platforms)) lines = [".. begin_platforms"] lines.extend(generate_platforms_contents(platforms)) tool_frameworks = [] for platform in platforms: for framework in frameworks: if is_compat_platform_and_framework(platform, framework): tool_frameworks.append(framework) lines.extend(generate_frameworks_contents(tool_frameworks)) lines.append(""" Boards ------ .. note:: For more detailed ``board`` information please scroll tables below by horizontal. """) lines.extend( generate_boards_table( [b for b in BOARDS if b['id'] in tool_to_boards[tool]], skip_columns=None)) with open(tool_path, "r+") as fp: content = fp.read() fp.seek(0) fp.truncate() fp.write(content[:content.index(".. begin_platforms")] + "\n".join(lines))
def device_monitor(**kwargs): # pylint: disable=too-many-branches # load default monitor filters filters_dir = os.path.join(fs.get_source_dir(), "commands", "device", "filters") for name in os.listdir(filters_dir): if not name.endswith(".py"): continue device_helpers.load_monitor_filter(os.path.join(filters_dir, name)) project_options = {} try: with fs.cd(kwargs["project_dir"]): project_options = device_helpers.get_project_options(kwargs["environment"]) kwargs = device_helpers.apply_project_monitor_options(kwargs, project_options) except NotPlatformIOProjectError: pass platform = None if "platform" in project_options: with fs.cd(kwargs["project_dir"]): platform = PlatformFactory.newPlatform(project_options["platform"]) device_helpers.register_platform_filters( platform, kwargs["project_dir"], kwargs["environment"] ) if not kwargs["port"]: ports = util.get_serial_ports(filter_hwid=True) if len(ports) == 1: kwargs["port"] = ports[0]["port"] elif "platform" in project_options and "board" in project_options: board_hwids = device_helpers.get_board_hwids( kwargs["project_dir"], platform, project_options["board"], ) for item in ports: for hwid in board_hwids: hwid_str = ("%s:%s" % (hwid[0], hwid[1])).replace("0x", "") if hwid_str in item["hwid"]: kwargs["port"] = item["port"] break if kwargs["port"]: break elif kwargs["port"] and (set(["*", "?", "[", "]"]) & set(kwargs["port"])): for item in util.get_serial_ports(): if fnmatch(item["port"], kwargs["port"]): kwargs["port"] = item["port"] break # override system argv with patched options sys.argv = ["monitor"] + device_helpers.options_to_argv( kwargs, project_options, ignore=("port", "baud", "rts", "dtr", "environment", "project_dir"), ) if not kwargs["quiet"]: click.echo( "--- Available filters and text transformations: %s" % ", ".join(sorted(miniterm.TRANSFORMATIONS.keys())) ) click.echo("--- More details at http://bit.ly/pio-monitor-filters") try: miniterm.main( default_port=kwargs["port"], default_baudrate=kwargs["baud"] or 9600, default_rts=kwargs["rts"], default_dtr=kwargs["dtr"], ) except Exception as e: raise exception.MinitermException(e)
"ar", "gas", "gcc", "g++", "gnulink", "platformio", "pioplatform", "pioproject", "piomaxlen", "piolib", "pioupload", "piomisc", "pioide", "piosize", ], toolpath=[join(fs.get_source_dir(), "builder", "tools")], variables=clivars, # Propagating External Environment ENV=environ, UNIX_TIME=int(time()), BUILD_DIR=join("$PROJECT_BUILD_DIR", "$PIOENV"), BUILD_SRC_DIR=join("$BUILD_DIR", "src"), BUILD_TEST_DIR=join("$BUILD_DIR", "test"), LIBPATH=["$BUILD_DIR"], PROGNAME="program", PROG_PATH=join("$BUILD_DIR", "$PROGNAME$PROGSUFFIX"), PYTHONEXE=get_pythonexe_path(), ) if not int(ARGUMENTS.get("PIOVERBOSE", 0)): DEFAULT_ENV_OPTIONS["ARCOMSTR"] = "Archiving $TARGET"
def _run_scons(self, variables, targets, jobs): scons_dir = get_core_package_dir("tool-scons") script_path = (os.path.join(scons_dir, "script", "scons") if PY2 else os.path.join(scons_dir, "scons.py")) args = [ proc.get_pythonexe_path(), script_path, "-Q", "--warn=no-no-parallel-support", "--jobs", str(jobs), "--sconstruct", os.path.join(fs.get_source_dir(), "builder", "main.py"), ] args.append("PIOVERBOSE=%d" % (1 if self.verbose else 0)) # pylint: disable=protected-access args.append("ISATTY=%d" % (1 if click._compat.isatty(sys.stdout) else 0)) args += targets # encode and append variables for key, value in variables.items(): args.append("%s=%s" % (key.upper(), self.encode_scons_arg(value))) proc.copy_pythonpath_to_osenv() if targets and "menuconfig" in targets: return proc.exec_command(args, stdout=sys.stdout, stderr=sys.stderr, stdin=sys.stdin) if click._compat.isatty(sys.stdout): def _write_and_flush(stream, data): try: stream.write(data) stream.flush() except IOError: pass return proc.exec_command( args, stdout=proc.BuildAsyncPipe( line_callback=self._on_stdout_line, data_callback=lambda data: None if self.silent else _write_and_flush(sys.stdout, data), ), stderr=proc.BuildAsyncPipe( line_callback=self._on_stderr_line, data_callback=lambda data: _write_and_flush( sys.stderr, data), ), ) return proc.exec_command( args, stdout=proc.LineBufferedAsyncPipe( line_callback=self._on_stdout_line), stderr=proc.LineBufferedAsyncPipe( line_callback=self._on_stderr_line), )