diff --git a/make/py-topdir.mk b/make/py-topdir.mk index a58e1207..acbcb8aa 100644 --- a/make/py-topdir.mk +++ b/make/py-topdir.mk @@ -1,10 +1,10 @@ -include $(JWBDIR)/make/ldlibpath.mk +include $(JWBDIR)/make/projects.mk TD_GENERATE_FILES += pyproject.toml PY_CHECK_EXCLUDE ?= -MYPY_CONFIG_PATH = $(subst :,:$$MYPY_CONFIG_FILE_DIR/,:$(PYTHONPATH)) +MYPY_CONFIG_PATH = $(shell $(JW_PKG_PY) --topdir-format relative projects pythonpath --prefix '$$MYPY_CONFIG_FILE_DIR/' $(PROJECT)) MYPY_PATH_DIRECTIVE = mypy_path = "$(MYPY_CONFIG_PATH)" ifndef PY_CHECK_ROOTS diff --git a/src/python/jw/pkg/App.py b/src/python/jw/pkg/App.py index c7775ae5..a018fddb 100644 --- a/src/python/jw/pkg/App.py +++ b/src/python/jw/pkg/App.py @@ -83,6 +83,8 @@ class App(Base): match fmt: case 'unaltered': return path + case 'relative': + return os.path.relpath(path) case None | 'absolute': return os.path.abspath(path) case _: @@ -135,6 +137,8 @@ class App(Base): return os.path.abspath(pd) if self.__topdir_fmt == 'unaltered': return pd + if self.__topdir_fmt == 'relative': + return os.path.relpath(pd, self.__pretty_topdir) if name == self.__top_name: return self.__pretty_topdir raise NotImplementedError( @@ -151,7 +155,10 @@ class App(Base): if os.path.isdir(path): ret = format_pd(name, pd, pretty) if sd and sd[0] != '/': - ret += '/' + if ret == '.': + ret = '' + else: + ret += '/' ret += sd return ret for ret in search_absdirs: @@ -345,7 +352,7 @@ class App(Base): default = 'absolute', help = ( 'Output references to topdir as one of "make:", ' - '"unaltered", "absolute". Absolute topdir by default' + '"unaltered", "relative", "absolute". Absolute topdir by default' ), ) parser.add_argument( diff --git a/src/python/jw/pkg/cmds/projects/CmdPythonpath.py b/src/python/jw/pkg/cmds/projects/CmdPythonpath.py index 9ddd6463..1b02a83b 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPythonpath.py +++ b/src/python/jw/pkg/cmds/projects/CmdPythonpath.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from ...App import Scope from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING if TYPE_CHECKING: from argparse import ArgumentParser, Namespace @@ -16,6 +17,25 @@ class CmdPythonpath(Cmd): # export def add_arguments(self, parser: ArgumentParser) -> None: super().add_arguments(parser) + parser.add_argument( + '--subdir', + action = 'append', + help = ( + 'Directories to look for relative to the ' + 'respective project root directory' + ), + default = ['src/python', 'tools/python'], + ) + parser.add_argument( + '--delimiter', + default = ':', + help = 'Delimiter between paths', + ) + parser.add_argument( + '--prefix', + help = 'Prefix to prepend before every path component', + dest = 'path_component_prefix', + ) parser.add_argument('module', help = 'Modules', nargs = '*') async def _run(self, args: Namespace) -> None: @@ -29,8 +49,10 @@ class CmdPythonpath(Cmd): # export ) out = [] for m in deps: - path = self.app.find_dir(m, ['src/python', 'tools/python']) + path = self.app.find_dir(m, args.subdir) if path is not None: + if args.path_component_prefix is not None: + path = f'{args.path_component_prefix}{path}' out.append(path) if out: - print(':'.join(out)) + print(args.delimiter.join(out)) diff --git a/src/python/jw/pkg/cmds/projects/CmdPythonpathOrig.py b/src/python/jw/pkg/cmds/projects/CmdPythonpathOrig.py deleted file mode 100644 index 8a7bb2c8..00000000 --- a/src/python/jw/pkg/cmds/projects/CmdPythonpathOrig.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations -import os - -from ...App import Scope -from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from argparse import ArgumentParser, Namespace - -class CmdPythonpathOrig(Cmd): # export - - def __init__(self, parent: Parent) -> None: - super().__init__(parent, 'pythonpath_orig', help = 'pythonpath') - - def add_arguments(self, parser: ArgumentParser) -> None: - super().add_arguments(parser) - parser.add_argument('module', nargs = '*', help = 'Modules') - - async def _run(self, args: Namespace) -> None: - deps = self.app.get_project_refs( - args.module, - ['pkg.requires.jw'], - ['run', 'build'], - scope = Scope.Subtree, - add_self = True, - names_only = True, - ) - r = '' - for m in deps: - pd = self.app.find_dir(m, pretty = False) - if pd is None: - continue - for subdir in ['src/python', 'tools/python']: - cand = pd + '/' + subdir - if os.path.isdir(cand): - r = r + ':' + cand - print(r[1:])