def install_features_dependencies(): load_config() for feature in FEATURE_DEPENDENCIES: if not env.MarlinFeatureIsEnabled(feature): continue if 'lib_deps' in FEATURE_DEPENDENCIES[feature]: print("Adding lib_deps for %s... " % feature) # deps to add deps_to_add = {} for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) deps_to_add[name] = dep # first check if the env already have the dep deps = env.GetProjectOption("lib_deps") for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] # check if we need ignore any lib lib_ignore = env.GetProjectOption("lib_ignore") for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] # any left? if len(deps_to_add) <= 0: continue # add only the missing deps proj = env.GetProjectConfig() proj.set("env:" + env["PIOENV"], "lib_deps", deps + list(deps_to_add.values())) if 'extra_scripts' in FEATURE_DEPENDENCIES[feature]: print("Executing extra_scripts for %s... " % feature) env.SConscript(FEATURE_DEPENDENCIES[feature]['extra_scripts'], exports="env") if 'src_filter' in FEATURE_DEPENDENCIES[feature]: print("Adding src_filter for %s... " % feature) proj = env.GetProjectConfig() src_filter = env.GetProjectOption("src_filter") # first we need to remove the references to the same folder my_srcs = re.findall(r'[+-](<.*?>)', FEATURE_DEPENDENCIES[feature]['src_filter']) cur_srcs = re.findall(r'[+-](<.*?>)', src_filter[0]) for d in my_srcs: if d in cur_srcs: src_filter[0] = re.sub(r'[+-]' + d, '', src_filter[0]) src_filter[0] = FEATURE_DEPENDENCIES[feature][ 'src_filter'] + ' ' + src_filter[0] proj.set("env:" + env["PIOENV"], "src_filter", src_filter) env.Replace(SRC_FILTER=src_filter)
def apply_features_config(): load_config() for feature in FEATURE_CONFIG: if not env.MarlinFeatureIsEnabled(feature): continue feat = FEATURE_CONFIG[feature] if 'lib_deps' in feat and len(feat['lib_deps']): print("Adding lib_deps for %s... " % feature) # feat to add deps_to_add = {} for dep in feat['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) deps_to_add[name] = dep # Does the env already have the dependency? deps = env.GetProjectOption('lib_deps') for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] # Are there any libraries that should be ignored? lib_ignore = env.GetProjectOption('lib_ignore') for dep in deps: name, _, _ = PackageManager.parse_pkg_uri(dep) if name in deps_to_add: del deps_to_add[name] # Is there anything left? if len(deps_to_add) > 0: # Only add the missing dependencies set_env_field('lib_deps', deps + list(deps_to_add.values())) if 'extra_scripts' in feat: print("Running extra_scripts for %s... " % feature) env.SConscript(feat['extra_scripts'], exports="env") if 'src_filter' in feat: print("Adding src_filter for %s... " % feature) src_filter = ' '.join(env.GetProjectOption('src_filter')) # first we need to remove the references to the same folder my_srcs = re.findall(r'[+-](<.*?>)', feat['src_filter']) cur_srcs = re.findall(r'[+-](<.*?>)', src_filter) for d in my_srcs: if d in cur_srcs: src_filter = re.sub(r'[+-]' + d, '', src_filter) src_filter = feat['src_filter'] + ' ' + src_filter set_env_field('src_filter', [src_filter]) env.Replace(SRC_FILTER=src_filter) if 'lib_ignore' in feat: print("Adding lib_ignore for %s... " % feature) lib_ignore = env.GetProjectOption('lib_ignore') + [ feat['lib_ignore'] ] set_env_field('lib_ignore', lib_ignore)
def get_all_env_libs(): env_libs = [] lib_deps = env.GetProjectOption("lib_deps") for dep in lib_deps: name, _, _ = PackageManager.parse_pkg_uri(dep) env_libs.append(name) return env_libs
def get_all_known_libs(): known_libs = [] for feature in FEATURE_DEPENDENCIES: if not 'lib_deps' in FEATURE_DEPENDENCIES[feature]: continue for dep in FEATURE_DEPENDENCIES[feature]['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) known_libs.append(name) return known_libs
def get_all_known_libs(): known_libs = [] for feature in FEATURE_CONFIG: feat = FEATURE_CONFIG[feature] if not 'lib_deps' in feat: continue for dep in feat['lib_deps']: name, _, _ = PackageManager.parse_pkg_uri(dep) known_libs.append(name) return known_libs
def parse_pkg_uri(spec): if PackageManager.__name__ == 'PackageSpec': return PackageManager(spec).name else: name, _, _ = PackageManager.parse_pkg_uri(spec) return name
def test_pkg_input_parser(): items = [ ["PkgName", ("PkgName", None, None)], [("PkgName", "!=1.2.3,<2.0"), ("PkgName", "!=1.2.3,<2.0", None)], ["[email protected]", ("PkgName", "1.2.3", None)], [("[email protected]", "1.2.5"), ("[email protected]", "1.2.5", None)], ["id=13", ("id=13", None, None)], ["id=13@~1.2.3", ("id=13", "~1.2.3", None)], [ util.get_home_dir(), (".platformio", None, "file://" + util.get_home_dir()) ], [ "LocalName=" + util.get_home_dir(), ("LocalName", None, "file://" + util.get_home_dir()) ], [ "LocalName=%s@>2.3.0" % util.get_home_dir(), ("LocalName", ">2.3.0", "file://" + util.get_home_dir()) ], [ "https://github.com/user/package.git", ("package", None, "git+https://github.com/user/package.git") ], [ "MyPackage=https://gitlab.com/user/package.git", ("MyPackage", None, "git+https://gitlab.com/user/package.git") ], [ "MyPackage=https://gitlab.com/user/[email protected],!=2", ("MyPackage", "3.2.1,!=2", "git+https://gitlab.com/user/package.git") ], [ "https://somedomain.com/path/LibraryName-1.2.3.zip", ("LibraryName-1.2.3", None, "https://somedomain.com/path/LibraryName-1.2.3.zip") ], [ "https://github.com/user/package/archive/branch.zip", ("branch", None, "https://github.com/user/package/archive/branch.zip") ], [ "https://github.com/user/package/archive/branch.zip@~1.2.3", ("branch", "~1.2.3", "https://github.com/user/package/archive/branch.zip") ], [ "https://github.com/user/package/archive/branch.tar.gz", ("branch.tar", None, "https://github.com/user/package/archive/branch.tar.gz") ], [ "https://github.com/user/package/archive/branch.tar.gz@!=5", ("branch.tar", "!=5", "https://github.com/user/package/archive/branch.tar.gz") ], [ "https://developer.mbed.org/users/user/code/package/", ("package", None, "hg+https://developer.mbed.org/users/user/code/package/") ], [ "https://os.mbed.com/users/user/code/package/", ("package", None, "hg+https://os.mbed.com/users/user/code/package/") ], [ "https://github.com/user/package#v1.2.3", ("package", None, "git+https://github.com/user/package#v1.2.3") ], [ "https://github.com/user/package.git#branch", ("package", None, "git+https://github.com/user/package.git#branch") ], [ "PkgName=https://github.com/user/package.git#a13d344fg56", ("PkgName", None, "git+https://github.com/user/package.git#a13d344fg56") ], [ "user/package", ("package", None, "git+https://github.com/user/package") ], [ "PkgName=user/package", ("PkgName", None, "git+https://github.com/user/package") ], [ "PkgName=user/package#master", ("PkgName", None, "git+https://github.com/user/package#master") ], [ "git+https://github.com/user/package", ("package", None, "git+https://github.com/user/package") ], [ "hg+https://example.com/user/package", ("package", None, "hg+https://example.com/user/package") ], [ "[email protected]:user/package.git", ("package", None, "[email protected]:user/package.git") ], [ "[email protected]:user/package.git#v1.2.0", ("package", None, "[email protected]:user/package.git#v1.2.0") ], [ "[email protected]:user/package.git#v1.2.0@~1.2.0", ("LocalName", "~1.2.0", "[email protected]:user/package.git#v1.2.0") ], [ "git+ssh://[email protected]/user/package#1.2.0", ("package", None, "git+ssh://[email protected]/user/package#1.2.0") ], [ "git+ssh://[email protected]:1234/package#1.2.0", ("package", None, "git+ssh://[email protected]:1234/package#1.2.0") ], [ "LocalName=git+ssh://[email protected]:1234" "/package#1.2.0@!=13", ("LocalName", "!=13", "git+ssh://[email protected]:1234/package#1.2.0") ] ] for params, result in items: if isinstance(params, tuple): assert PackageManager.parse_pkg_uri(*params) == result else: assert PackageManager.parse_pkg_uri(params) == result
def test_pkg_input_parser(): items = [ ["PkgName", ("PkgName", None, None)], [("PkgName", "!=1.2.3,<2.0"), ("PkgName", "!=1.2.3,<2.0", None)], ["[email protected]", ("PkgName", "1.2.3", None)], [("[email protected]", "1.2.5"), ("[email protected]", "1.2.5", None)], ["id=13", ("id=13", None, None)], ["id=13@~1.2.3", ("id=13", "~1.2.3", None)], [ get_project_core_dir(), (".platformio", None, "file://" + get_project_core_dir()), ], [ "LocalName=" + get_project_core_dir(), ("LocalName", None, "file://" + get_project_core_dir()), ], [ "LocalName=%s@>2.3.0" % get_project_core_dir(), ("LocalName", ">2.3.0", "file://" + get_project_core_dir()), ], [ "https://github.com/user/package.git", ("package", None, "git+https://github.com/user/package.git"), ], [ "MyPackage=https://gitlab.com/user/package.git", ("MyPackage", None, "git+https://gitlab.com/user/package.git"), ], [ "MyPackage=https://gitlab.com/user/[email protected],!=2", ("MyPackage", "3.2.1,!=2", "git+https://gitlab.com/user/package.git"), ], [ "https://somedomain.com/path/LibraryName-1.2.3.zip", ( "LibraryName-1.2.3", None, "https://somedomain.com/path/LibraryName-1.2.3.zip", ), ], [ "https://github.com/user/package/archive/branch.zip", ("branch", None, "https://github.com/user/package/archive/branch.zip"), ], [ "https://github.com/user/package/archive/branch.zip@~1.2.3", ("branch", "~1.2.3", "https://github.com/user/package/archive/branch.zip"), ], [ "https://github.com/user/package/archive/branch.tar.gz", ( "branch.tar", None, "https://github.com/user/package/archive/branch.tar.gz", ), ], [ "https://github.com/user/package/archive/branch.tar.gz@!=5", ( "branch.tar", "!=5", "https://github.com/user/package/archive/branch.tar.gz", ), ], [ "https://developer.mbed.org/users/user/code/package/", ("package", None, "hg+https://developer.mbed.org/users/user/code/package/"), ], [ "https://os.mbed.com/users/user/code/package/", ("package", None, "hg+https://os.mbed.com/users/user/code/package/"), ], [ "https://github.com/user/package#v1.2.3", ("package", None, "git+https://github.com/user/package#v1.2.3"), ], [ "https://github.com/user/package.git#branch", ("package", None, "git+https://github.com/user/package.git#branch"), ], [ "PkgName=https://github.com/user/package.git#a13d344fg56", ("PkgName", None, "git+https://github.com/user/package.git#a13d344fg56"), ], [ "user/package", ("package", None, "git+https://github.com/user/package") ], [ "PkgName=user/package", ("PkgName", None, "git+https://github.com/user/package"), ], [ "PkgName=user/package#master", ("PkgName", None, "git+https://github.com/user/package#master"), ], [ "git+https://github.com/user/package", ("package", None, "git+https://github.com/user/package"), ], [ "hg+https://example.com/user/package", ("package", None, "hg+https://example.com/user/package"), ], [ "[email protected]:user/package.git", ("package", None, "[email protected]:user/package.git"), ], [ "[email protected]:user/package.git#v1.2.0", ("package", None, "[email protected]:user/package.git#v1.2.0"), ], [ "[email protected]:user/package.git#v1.2.0@~1.2.0", ("LocalName", "~1.2.0", "[email protected]:user/package.git#v1.2.0"), ], [ "git+ssh://[email protected]/user/package#1.2.0", ( "package", None, "git+ssh://[email protected]/user/package#1.2.0", ), ], [ "git+ssh://[email protected]:1234/package#1.2.0", ( "package", None, "git+ssh://[email protected]:1234/package#1.2.0", ), ], [ "LocalName=git+ssh://[email protected]:1234" "/package#1.2.0@!=13", ( "LocalName", "!=13", "git+ssh://[email protected]:1234/package#1.2.0", ), ], ] for params, result in items: if isinstance(params, tuple): assert PackageManager.parse_pkg_uri(*params) == result else: assert PackageManager.parse_pkg_uri(params) == result
env = DefaultEnvironment() platform = env.PioPlatform() board = env.BoardConfig() variant = board.get("build.variant") platform_packages = env.GetProjectOption('platform_packages') # if there's no framework defined, take it from the class name of platform framewords = { "Ststm32Platform": "framework-arduinoststm32", "AtmelavrPlatform": "framework-arduino-avr" } if len(platform_packages) == 0: platform_name = framewords[platform.__class__.__name__] else: platform_name, _, _ = PackageManager.parse_pkg_uri(platform_packages[0]) FRAMEWORK_DIR = platform.get_package_dir(platform_name) assert os.path.isdir(FRAMEWORK_DIR) assert os.path.isdir("buildroot/share/PlatformIO/variants") variant_dir = os.path.join(FRAMEWORK_DIR, "variants", variant) source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) assert os.path.isdir(source_dir) if os.path.isdir(variant_dir): shutil.rmtree(variant_dir) if not os.path.isdir(variant_dir): os.mkdir(variant_dir)