from __future__ import print_function Import("env") import os import sys TRAVIS = os.environ.get("TRAVIS") PIO_PLATFORM = env.PioPlatform() class ExtraScriptError(Exception): pass # Most portable way, without depending on platformio internals def subprocess_libdeps(lib_deps, storage=None, silent=True): import subprocess args = [env.subst("$PYTHONEXE"), "-mplatformio", "lib"] if not storage: args.append("-g") else: args.extend(["-d", storage]) args.append("install") if silent: args.append("-s") args.extend(lib_deps) subprocess.check_call(args) # Avoid spawning pio lib every time, hook into the LibraryManager API (sort-of internal) def library_manager_libdeps(lib_deps, storage=None): from platformio.managers.lib import LibraryManager from platformio.project.helpers import get_project_global_lib_dir if not storage: manager = LibraryManager(get_project_global_lib_dir()) else: manager = LibraryManager(storage) for lib in lib_deps: if manager.get_package_dir(*manager.parse_pkg_uri(lib)): continue print("installing: {}".format(lib), file=sys.stderr) manager.install(lib) def get_shared_libdeps_dir(section, name): cfg = env.GetProjectConfig() if not cfg.has_option(section, name): raise ExtraScriptError("{}.{} is required to be set".format(section, name)) opt = cfg.get(section, name) if not opt in env.GetProjectOption("lib_extra_dirs"): raise ExtraScriptError( "lib_extra_dirs must contain {}.{}".format(section, name) ) return os.path.join(env["PROJECT_DIR"], opt) def ensure_platform_updated(): try: if PIO_PLATFORM.are_outdated_packages(): print("updating platform packages", file=sys.stderr) PIO_PLATFORM.update_packages() except Exception: print("Warning: no connection, cannot check for outdated packages", file=sys.stderr) # latest toolchain is still optional with PIO (TODO: recheck after 2.6.0!) ensure_platform_updated() # to speed-up build process, install libraries in either global or local shared storage if os.environ.get("ESPURNA_PIO_SHARED_LIBRARIES"): if TRAVIS: storage = None print("using global library storage", file=sys.stderr) else: storage = get_shared_libdeps_dir("common", "shared_libdeps_dir") print("using shared library storage: ", storage, file=sys.stderr) subprocess_libdeps(env.GetProjectOption("lib_deps"), storage)