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)