85 lines
3.1 KiB
Python
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)
|