from argparse import ArgumentParser, Namespace from ...App import Scope from .Cmd import Cmd, Parent class CmdLdflags(Cmd): # export def __init__(self, parent: Parent) -> None: super().__init__(parent, 'ldflags', help = 'ldflags') def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) parser.add_argument('module', nargs = '*', help = 'Modules') parser.add_argument( '--exclude', action = 'append', help = 'Exclude Modules', default = [] ) parser.add_argument( '-s', '--add-self', action = 'store_true', default = False, help = ( 'Include libflags of specified modules, too, ' 'not only their dependencies' ), ) # -L needs to contain more paths than libs linked with -l would require def __get_ldpathflags( self, names: list[str], exclude: list[str] = [] ) -> str | None: deps = self.app.get_project_refs( names, ['pkg.requires.jw'], 'build', scope = Scope.Subtree, add_self = True, names_only = True, ) ret = [] for m in deps: if m in exclude: continue libname = self.app.get_libname([m]) if not len(libname): continue path = self.app.find_dir(m, ['/lib']) if not path: continue ret.append('-L' + path) if not ret: return None return ' '.join(ret) async def _run(self, args: Namespace) -> None: deps = self.app.get_project_refs( args.module, ['pkg.requires.jw'], 'build', scope = Scope.One, add_self = args.add_self, names_only = True, ) out = [] for m in reversed(deps): if m in args.exclude: continue libname = self.app.get_libname([m]) if len(libname): out.append('-l' + libname) if not out: return ldpathflags = self.__get_ldpathflags(args.module, args.exclude) if ldpathflags is not None: out.insert(0, ldpathflags) print(' '.join(out))