jw-pkg/src/python/jw/pkg/cmds/projects/CmdCreatePkgConfig.py
Jan Lindemann 81e71bc5c1
cmds.projects.lib.templates.tmpl_render(): RenderValues

tmpl_render()'s "values" argument currently understands dict[str,str|list[str]]. Enhance that to understand the broader RenderValues type, which also includes Iterable[tuple[str, str]], as produced by argparse.add_argument(action='append').

This commit also adds proper type-checking for the values argument. Before, its type had gone unchecked entirely.

Signed-off-by: Jan Lindemann <jan@janware.com>
2026-06-09 07:45:49 +02:00

87 lines
2.9 KiB
Python

from __future__ import annotations
from typing import TYPE_CHECKING
from .Cmd import Cmd, Parent
from .lib.templates import tmpl_render
if TYPE_CHECKING:
from argparse import ArgumentParser, Namespace
class CmdCreatePkgConfig(Cmd): # export
def __init__(self, parent: Parent) -> None:
super().__init__(
parent,
'create-pkg-config',
help = 'Generate a pkg-config file for a module'
)
@staticmethod
def __cleanup_requires(string: str) -> str:
import re
regexes = [
(r'^ +', ''),
(r'([ \t]|$)+', ', '),
(r', $', ''),
(r', $', ''),
(r' *,* *([<>=]+) *,* *', r' \1 '),
]
for patt, replacement in regexes:
string = re.sub(patt, replacement, string)
return string
def add_arguments(self, parser: ArgumentParser) -> None:
super().add_arguments(parser)
parser.add_argument('-F', '--project-descr-file', default = None)
parser.add_argument('-d', '--description', default = None)
parser.add_argument('-n', '--name', default = None)
parser.add_argument('-s', '--summary', default = None)
parser.add_argument('-p', '--prefix', default = None)
parser.add_argument('-v', '--version', default = None)
parser.add_argument('-c', '--cflags', default = None)
parser.add_argument('-l', '--libflags', default = None)
parser.add_argument('-r', '--requires-run', default = None)
parser.add_argument('-R', '--requires-build', default = None)
parser.add_argument('-V', '--variables', nargs = '*')
async def _run(self, args: Namespace) -> None:
project_conf_var_keys = [
'description',
'summary',
'requires_run',
'requires_build',
]
merged: dict[str, str | None] = {}
for key in project_conf_var_keys:
val = getattr(args, key)
if val is not None and args.project_descr_file:
val = self.app.get_value(args.name, key, None)
merged[key] = val
contents = tmpl_render(
'pkg-config',
[
{
'prefix': args.prefix,
'name': args.name,
'description': merged['summary'] or '',
'version': args.version,
}
]
)
if args.cflags is not None:
contents += f'Cflags: {args.cflags}\n'
if args.libflags is not None:
contents += f'Libs: {args.libflags}\n'
val = merged.get('requires_run')
if val is not None:
contents += f'Requires: {self.__cleanup_requires(val)}'
val = merged.get('requires_build')
if val is not None:
contents += (f'Requires.private: {self.__cleanup_requires(val)}')
# not sure what to do with requires_devel
print(contents)