Update ab.

This commit is contained in:
David Given
2024-10-09 22:36:42 +02:00
parent 4c2fa27717
commit 259c5d67e6
4 changed files with 84 additions and 53 deletions

View File

@@ -3,57 +3,68 @@ from types import SimpleNamespace
import os
import subprocess
emit(
"""
PKG_CONFIG ?= pkg-config
PACKAGES := $(shell $(PKG_CONFIG) --list-all | cut -d' ' -f1 | sort)
HOST_PKG_CONFIG ?= pkg-config
HOST_PACKAGES := $(shell $(HOST_PKG_CONFIG) --list-all | cut -d' ' -f1 | sort)
"""
)
class _PkgConfig:
package_present = set()
package_properties = {}
pkgconfig = None
def __init__(self, cmd):
assert cmd, "no pkg-config environment variable supplied"
self.pkgconfig = cmd
r = subprocess.run(f"{cmd} --list-all", shell=True, capture_output=True)
ps = r.stdout.decode("utf-8")
self.package_present = {l.split(" ", 1)[0] for l in ps.splitlines()}
def has_package(self, name):
return name in self.package_present
def get_property(self, name, flag):
p = f"{name}.{flag}"
if p not in self.package_properties:
r = subprocess.run(
f"{self.pkgconfig} {flag} {name}",
shell=True,
capture_output=True,
)
self.package_properties[p] = r.stdout.decode("utf-8").strip()
return self.package_properties[p]
def _package(self, name, package, fallback, prefix=""):
emit(f"ifeq ($(filter {package}, $({prefix}PACKAGES)),)")
if fallback:
emit(f"{prefix}PACKAGE_DEPS_{package} := ", *filenamesof([fallback]))
emit(
f"{prefix}PACKAGE_CFLAGS_{package} :=",
*fallback.args.get("caller_cflags", []),
)
emit(
f"{prefix}PACKAGE_LDFLAGS_{package} := ",
*fallback.args.get("caller_ldflags", []),
f"$(filter %.a, $({prefix}PACKAGE_DEPS_{package}))",
)
else:
emit(f"$(error Required package '{package}' not installed.)")
emit("else")
emit(
f"{prefix}PACKAGE_CFLAGS_{package} := $(shell $({prefix}PKG_CONFIG) --cflags {package})"
)
emit(
f"{prefix}PACKAGE_LDFLAGS_{package} := $(shell $({prefix}PKG_CONFIG) --libs {package})"
)
emit(f"{prefix}PACKAGE_DEPS_{package} :=")
emit("endif")
emit(f"{self.name}:")
TargetPkgConfig = _PkgConfig(os.getenv("PKG_CONFIG"))
HostPkgConfig = _PkgConfig(os.getenv("HOST_PKG_CONFIG"))
self.args["caller_cflags"] = [f"$({prefix}PACKAGE_CFLAGS_{package})"]
self.args["caller_ldflags"] = [f"$({prefix}PACKAGE_LDFLAGS_{package})"]
def _package(self, name, package, fallback, pkgconfig):
if pkgconfig.has_package(package):
cflags = pkgconfig.get_property(package, "--cflags")
ldflags = pkgconfig.get_property(package, "--libs")
if cflags:
self.args["caller_cflags"] = [cflags]
if ldflags:
self.args["caller_ldflags"] = [ldflags]
self.traits.add("clibrary")
self.traits.add("cheaders")
return
assert fallback, f"Required package '{package}' not installed"
self.args["cheader_deps"] = {fallback}
self.args["clibrary_deps"] = {fallback}
self.ins = []
self.outs = []
self.deps = [fallback]
self.traits.add("clibrary")
self.traits.add("cheaders")
self.ins = []
self.outs = [f"$({prefix}PACKAGE_DEPS_{package})"]
@Rule
def package(self, name, package=None, fallback: Target = None):
_package(self, name, package, fallback)
_package(self, name, package, fallback, TargetPkgConfig)
@Rule
def hostpackage(self, name, package=None, fallback: Target = None):
_package(self, name, package, fallback, "HOST_")
_package(self, name, package, fallback, HostPkgConfig)