Files
libretiny/platform.py
2022-04-23 21:13:47 +02:00

85 lines
3.1 KiB
Python

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"
# make ArduinoCore-API required
if "arduino" in framework:
self.packages["framework-arduino-api"]["optional"] = False
# save platform packages for later
global libretuya_packages
libretuya_packages = self.packages
return super().configure_default_packages(options, targets)