[core] Allow installation of packages without manifest
This commit is contained in:
@@ -23,7 +23,10 @@
|
||||
"framework-realtek-amb1": {
|
||||
"type": "framework",
|
||||
"optional": true,
|
||||
"version": "https://github.com/kuba2k2/amb1_sdk"
|
||||
"version": "https://github.com/ambiot/amb1_sdk",
|
||||
"manifest": {
|
||||
"description": "SDK for Ameba1"
|
||||
}
|
||||
},
|
||||
"toolchain-gccarmnoneeabi": {
|
||||
"type": "toolchain",
|
||||
|
||||
71
platform.py
71
platform.py
@@ -1,9 +1,80 @@
|
||||
from platformio.managers.platform import PlatformBase
|
||||
from platformio.package.exception import MissingPackageManifestError
|
||||
from platformio.package.manager.base import BasePackageManager
|
||||
from platformio.package.meta import PackageItem, PackageSpec
|
||||
|
||||
libretuya_packages = None
|
||||
manifest_default = {"version": "0.0.0", "description": "", "keywords": []}
|
||||
|
||||
|
||||
def load_manifest(self, src):
|
||||
try:
|
||||
return BasePackageManager._load_manifest(self, src)
|
||||
except MissingPackageManifestError:
|
||||
# ignore all exceptions
|
||||
pass
|
||||
# get the installation temporary path
|
||||
path = src.path if isinstance(src, PackageItem) else src
|
||||
# raise the exception if this package is not from libretuya
|
||||
if (
|
||||
not hasattr(self, "spec_map")
|
||||
or path not in self.spec_map
|
||||
or not libretuya_packages
|
||||
):
|
||||
raise MissingPackageManifestError(", ".join(self.manifest_names))
|
||||
# get the saved spec
|
||||
spec: PackageSpec = self.spec_map[path]
|
||||
# read package data from platform.json
|
||||
manifest: dict = libretuya_packages[spec.name]
|
||||
# find additional manifest info
|
||||
manifest = manifest.get("manifest", manifest_default)
|
||||
# put info from spec
|
||||
manifest.update(
|
||||
{
|
||||
"name": spec.name,
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": spec.url,
|
||||
},
|
||||
}
|
||||
)
|
||||
# save in cache
|
||||
cache_key = "load_manifest-%s" % path
|
||||
self.memcache_set(cache_key, manifest)
|
||||
# result = ManifestParserFactory.new(json.dumps(manifest), ManifestFileType.PACKAGE_JSON).as_dict()
|
||||
return manifest
|
||||
|
||||
|
||||
def find_pkg_root(self, path: str, spec: PackageSpec):
|
||||
try:
|
||||
return BasePackageManager._find_pkg_root(self, path, spec)
|
||||
except MissingPackageManifestError as e:
|
||||
# raise the exception if this package is not from libretuya
|
||||
if not libretuya_packages or spec.name not in libretuya_packages:
|
||||
raise e
|
||||
# save the spec for later
|
||||
if not hasattr(self, "spec_map"):
|
||||
self.spec_map = {}
|
||||
self.spec_map[path] = spec
|
||||
return path
|
||||
|
||||
|
||||
class LibretuyaPlatform(PlatformBase):
|
||||
def configure_default_packages(self, options, targets):
|
||||
framework = options.get("pioframework")[0]
|
||||
# patch find_pkg root to ignore missing manifests and save PackageSpec
|
||||
BasePackageManager._find_pkg_root = BasePackageManager.find_pkg_root
|
||||
BasePackageManager.find_pkg_root = find_pkg_root
|
||||
# patch load_manifest to generate manifests from PackageSpec
|
||||
BasePackageManager._load_manifest = BasePackageManager.load_manifest
|
||||
BasePackageManager.load_manifest = load_manifest
|
||||
|
||||
# set specific compiler versions
|
||||
if framework.startswith("realtek-ambz"):
|
||||
self.packages["toolchain-gccarmnoneeabi"]["version"] = "~1.50401.0"
|
||||
|
||||
# save platform packages for later
|
||||
global libretuya_packages
|
||||
libretuya_packages = self.packages
|
||||
|
||||
return super().configure_default_packages(options, targets)
|
||||
|
||||
Reference in New Issue
Block a user