From 7afc69254d6b7240406cb1112ab57355bd9d32cd Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Tue, 25 Apr 2023 14:47:37 -0400 Subject: fix implicit_reexport issues and enforce them going forward This detects cases where module A imports a function from B, and C imports that same function from A instead of B. It's not part of the API contract of A, and causes innocent refactoring to break things. --- mesonbuild/backend/backends.py | 14 +++++++------- mesonbuild/build.py | 21 +++++++++++---------- mesonbuild/compilers/mixins/clike.py | 3 +-- mesonbuild/compilers/vala.py | 5 ++--- mesonbuild/dependencies/boost.py | 3 ++- mesonbuild/dependencies/coarrays.py | 3 ++- mesonbuild/dependencies/misc.py | 8 ++++---- mesonbuild/dependencies/mpi.py | 3 ++- mesonbuild/dependencies/pkgconfig.py | 4 +--- mesonbuild/dependencies/scalapack.py | 3 ++- mesonbuild/interpreter/interpreter.py | 15 +++++++-------- mesonbuild/interpreter/interpreterobjects.py | 10 +++++----- mesonbuild/interpreter/kwargs.py | 12 ++++++------ mesonbuild/interpreter/mesonmain.py | 13 ++++++------- mesonbuild/interpreterbase/decorators.py | 3 +-- mesonbuild/interpreterbase/interpreterbase.py | 15 +++++++-------- mesonbuild/mconf.py | 4 ++-- mesonbuild/mdevenv.py | 4 ++-- mesonbuild/minstall.py | 8 ++++---- mesonbuild/mintro.py | 2 +- mesonbuild/modules/__init__.py | 11 +++++------ mesonbuild/modules/external_project.py | 5 +++-- mesonbuild/modules/gnome.py | 8 ++++---- mesonbuild/modules/hotdoc.py | 2 +- mesonbuild/modules/pkgconfig.py | 2 +- mesonbuild/modules/python.py | 2 +- mesonbuild/mtest.py | 4 ++-- mesonbuild/programs.py | 3 +-- mesonbuild/utils/posix.py | 2 +- mesonbuild/utils/vsenv.py | 3 ++- mesonbuild/utils/win32.py | 2 +- 31 files changed, 97 insertions(+), 100 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index 73741a4..e18906c 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -202,7 +202,7 @@ class TestSerialisation: needs_exe_wrapper: bool is_parallel: bool cmd_args: T.List[str] - env: build.EnvironmentVariables + env: mesonlib.EnvironmentVariables should_fail: bool timeout: T.Optional[int] workdir: T.Optional[str] @@ -512,7 +512,7 @@ class Backend: extra_bdeps: T.Optional[T.List[build.BuildTarget]] = None, capture: T.Optional[bool] = None, feed: T.Optional[bool] = None, - env: T.Optional[build.EnvironmentVariables] = None, + env: T.Optional[mesonlib.EnvironmentVariables] = None, tag: T.Optional[str] = None, verbose: bool = False, installdir_map: T.Optional[T.Dict[str, str]] = None) -> 'ExecutableSerialisation': @@ -585,7 +585,7 @@ class Backend: capture: T.Optional[bool] = None, feed: T.Optional[bool] = None, force_serialize: bool = False, - env: T.Optional[build.EnvironmentVariables] = None, + env: T.Optional[mesonlib.EnvironmentVariables] = None, verbose: bool = False) -> T.Tuple[T.Sequence[T.Union[str, File, build.Target, programs.ExternalProgram]], str]: ''' Serialize an executable for running with a generator or a custom target @@ -1588,8 +1588,8 @@ class Backend: cmd = [i.replace('\\', '/') for i in cmd] return inputs, outputs, cmd - def get_run_target_env(self, target: build.RunTarget) -> build.EnvironmentVariables: - env = target.env if target.env else build.EnvironmentVariables() + def get_run_target_env(self, target: build.RunTarget) -> mesonlib.EnvironmentVariables: + env = target.env if target.env else mesonlib.EnvironmentVariables() if target.default_env: introspect_cmd = join_args(self.environment.get_build_command() + ['introspect']) env.set('MESON_SOURCE_ROOT', [self.environment.get_source_dir()]) @@ -1959,8 +1959,8 @@ class Backend: return [] - def get_devenv(self) -> build.EnvironmentVariables: - env = build.EnvironmentVariables() + def get_devenv(self) -> mesonlib.EnvironmentVariables: + env = mesonlib.EnvironmentVariables() extra_paths = set() library_paths = set() build_machine = self.environment.machines[MachineChoice.BUILD] diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 0a4160f..d588c9d 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -39,7 +39,7 @@ from .mesonlib import ( MesonBugException, EnvironmentVariables, pickle_load, ) from .compilers import ( - is_object, clink_langs, sort_clink, all_languages, + is_header, is_object, is_source, clink_langs, sort_clink, all_languages, is_known_suffix, detect_static_linker ) from .interpreterbase import FeatureNew, FeatureDeprecated @@ -47,12 +47,13 @@ from .interpreterbase import FeatureNew, FeatureDeprecated if T.TYPE_CHECKING: from typing_extensions import Literal from ._typing import ImmutableListProtocol - from .backend.backends import Backend, ExecutableSerialisation + from .backend.backends import Backend from .compilers import Compiler - from .interpreter.interpreter import Test, SourceOutputs, Interpreter + from .interpreter.interpreter import SourceOutputs, Interpreter + from .interpreter.interpreterobjects import Test from .interpreterbase import SubProject from .linkers.linkers import StaticLinker - from .mesonlib import FileMode, FileOrString + from .mesonlib import ExecutableSerialisation, FileMode, FileOrString from .modules import ModuleState from .mparser import BaseNode from .wrap import WrapMode @@ -434,7 +435,7 @@ class ExtractedObjects(HoldableObject): sources.append(s) # Filter out headers and all non-source files - return [s for s in sources if environment.is_source(s)] + return [s for s in sources if is_source(s)] def classify_all_sources(self, sources: T.List[FileOrString], generated_sources: T.Sequence['GeneratedTypes']) -> T.Dict['Compiler', T.List['FileOrString']]: sources_ = self.get_sources(sources, generated_sources) @@ -1494,14 +1495,14 @@ You probably should put it in link_with instead.''') if not pchlist: return elif len(pchlist) == 1: - if not environment.is_header(pchlist[0]): + if not is_header(pchlist[0]): raise InvalidArguments(f'PCH argument {pchlist[0]} is not a header.') elif len(pchlist) == 2: - if environment.is_header(pchlist[0]): - if not environment.is_source(pchlist[1]): + if is_header(pchlist[0]): + if not is_source(pchlist[1]): raise InvalidArguments('PCH definition must contain one header and at most one source.') - elif environment.is_source(pchlist[0]): - if not environment.is_header(pchlist[1]): + elif is_source(pchlist[0]): + if not is_header(pchlist[1]): raise InvalidArguments('PCH definition must contain one header and at most one source.') pchlist = [pchlist[1], pchlist[0]] else: diff --git a/mesonbuild/compilers/mixins/clike.py b/mesonbuild/compilers/mixins/clike.py index da36185..251a7bf 100644 --- a/mesonbuild/compilers/mixins/clike.py +++ b/mesonbuild/compilers/mixins/clike.py @@ -36,8 +36,7 @@ from ... import arglist from ... import mesonlib from ... import mlog from ...linkers.linkers import GnuLikeDynamicLinkerMixin, SolarisDynamicLinker, CompCertDynamicLinker -from ...mesonlib import LibType -from ...coredata import OptionKey +from ...mesonlib import LibType, OptionKey from .. import compilers from ..compilers import CompileCheckMode from .visualstudio import VisualStudioLikeCompiler diff --git a/mesonbuild/compilers/vala.py b/mesonbuild/compilers/vala.py index c6af04a..ded158e 100644 --- a/mesonbuild/compilers/vala.py +++ b/mesonbuild/compilers/vala.py @@ -17,9 +17,8 @@ import os.path import typing as T from .. import mlog -from ..mesonlib import EnvironmentException, version_compare, OptionKey - -from .compilers import CompileCheckMode, Compiler, LibType +from ..mesonlib import EnvironmentException, version_compare, LibType, OptionKey +from .compilers import CompileCheckMode, Compiler if T.TYPE_CHECKING: from ..envconfig import MachineInfo diff --git a/mesonbuild/dependencies/boost.py b/mesonbuild/dependencies/boost.py index 0e4dab9..0a936e6 100644 --- a/mesonbuild/dependencies/boost.py +++ b/mesonbuild/dependencies/boost.py @@ -28,7 +28,8 @@ from .pkgconfig import PkgConfigDependency from .misc import threads_factory if T.TYPE_CHECKING: - from ..environment import Environment, Properties + from ..envconfig import Properties + from ..environment import Environment # On windows 3 directory layouts are supported: # * The default layout (versioned) installed: diff --git a/mesonbuild/dependencies/coarrays.py b/mesonbuild/dependencies/coarrays.py index 5cb8556..1c59792 100644 --- a/mesonbuild/dependencies/coarrays.py +++ b/mesonbuild/dependencies/coarrays.py @@ -24,7 +24,8 @@ from .factory import factory_methods if T.TYPE_CHECKING: from . factory import DependencyGenerator - from ..environment import Environment, MachineChoice + from ..environment import Environment + from ..mesonlib import MachineChoice @factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE, DependencyMethods.SYSTEM}) diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index d775669..1a5502f 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -30,13 +30,13 @@ from .factory import DependencyFactory, factory_methods from .pkgconfig import PkgConfigDependency if T.TYPE_CHECKING: - from ..environment import Environment, MachineChoice + from ..environment import Environment from .factory import DependencyGenerator @factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE}) def netcdf_factory(env: 'Environment', - for_machine: 'MachineChoice', + for_machine: 'mesonlib.MachineChoice', kwargs: T.Dict[str, T.Any], methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']: language = kwargs.get('language', 'c') @@ -475,7 +475,7 @@ class OpensslSystemDependency(SystemDependency): @factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CONFIG_TOOL, DependencyMethods.SYSTEM}) def curses_factory(env: 'Environment', - for_machine: 'MachineChoice', + for_machine: 'mesonlib.MachineChoice', kwargs: T.Dict[str, T.Any], methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']: candidates: T.List['DependencyGenerator'] = [] @@ -501,7 +501,7 @@ packages['curses'] = curses_factory @factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM}) def shaderc_factory(env: 'Environment', - for_machine: 'MachineChoice', + for_machine: 'mesonlib.MachineChoice', kwargs: T.Dict[str, T.Any], methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']: """Custom DependencyFactory for ShaderC. diff --git a/mesonbuild/dependencies/mpi.py b/mesonbuild/dependencies/mpi.py index 9100681..240e6fd 100644 --- a/mesonbuild/dependencies/mpi.py +++ b/mesonbuild/dependencies/mpi.py @@ -27,7 +27,8 @@ from .pkgconfig import PkgConfigDependency if T.TYPE_CHECKING: from .factory import DependencyGenerator - from ..environment import Environment, MachineChoice + from ..environment import Environment + from ..mesonlib import MachineChoice @factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CONFIG_TOOL, DependencyMethods.SYSTEM}) diff --git a/mesonbuild/dependencies/pkgconfig.py b/mesonbuild/dependencies/pkgconfig.py index 0c40847..37f2ecb 100644 --- a/mesonbuild/dependencies/pkgconfig.py +++ b/mesonbuild/dependencies/pkgconfig.py @@ -16,7 +16,7 @@ from __future__ import annotations from pathlib import Path from .base import ExternalDependency, DependencyException, sort_libpaths, DependencyTypeName -from ..mesonlib import OptionKey, OrderedSet, PerMachine, Popen_safe, Popen_safe_logged +from ..mesonlib import EnvironmentVariables, OptionKey, OrderedSet, PerMachine, Popen_safe, Popen_safe_logged from ..programs import find_external_program, ExternalProgram from .. import mlog from pathlib import PurePath @@ -30,7 +30,6 @@ if T.TYPE_CHECKING: from ..mesonlib import MachineChoice from ..utils.core import EnvironOrDict from .._typing import ImmutableListProtocol - from ..build import EnvironmentVariables class PkgConfigDependency(ExternalDependency): # The class's copy of the pkg-config path. Avoids having to search for it @@ -128,7 +127,6 @@ class PkgConfigDependency(ExternalDependency): @staticmethod def get_env(environment: 'Environment', for_machine: MachineChoice, uninstalled: bool = False) -> 'EnvironmentVariables': - from ..build import EnvironmentVariables env = EnvironmentVariables() key = OptionKey('pkg_config_path', machine=for_machine) extra_paths: T.List[str] = environment.coredata.options[key].value[:] diff --git a/mesonbuild/dependencies/scalapack.py b/mesonbuild/dependencies/scalapack.py index 257e4aa..2442ede 100644 --- a/mesonbuild/dependencies/scalapack.py +++ b/mesonbuild/dependencies/scalapack.py @@ -27,7 +27,8 @@ from .pkgconfig import PkgConfigDependency from .factory import factory_methods if T.TYPE_CHECKING: - from ..environment import Environment, MachineChoice + from ..environment import Environment + from ..mesonlib import MachineChoice from .factory import DependencyGenerator diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 363de54..efca123 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -23,7 +23,7 @@ from .. import compilers from .. import envconfig from ..wrap import wrap, WrapMode from .. import mesonlib -from ..mesonlib import (MesonBugException, MesonException, HoldableObject, +from ..mesonlib import (EnvironmentVariables, ExecutableSerialisation, MesonBugException, MesonException, HoldableObject, FileMode, MachineChoice, OptionKey, listify, extract_as_list, has_path_sep, PerMachine) from ..programs import ExternalProgram, NonExistingExternalProgram @@ -36,7 +36,6 @@ from ..interpreterbase import Disabler, disablerIfNotFound from ..interpreterbase import FeatureNew, FeatureDeprecated, FeatureBroken, FeatureNewKwargs, FeatureDeprecatedKwargs from ..interpreterbase import ObjectHolder, ContextManagerObject from ..modules import ExtensionModule, ModuleObject, MutableModuleObject, NewExtensionModule, NotFoundExtensionModule -from ..backend.backends import ExecutableSerialisation from . import interpreterobjects as OBJ from . import compiler as compilerOBJ @@ -458,7 +457,7 @@ class Interpreter(InterpreterBase, HoldableObject): build.SymlinkData: OBJ.SymlinkDataHolder, build.InstallDir: OBJ.InstallDirHolder, build.IncludeDirs: OBJ.IncludeDirsHolder, - build.EnvironmentVariables: OBJ.EnvironmentVariablesHolder, + mesonlib.EnvironmentVariables: OBJ.EnvironmentVariablesHolder, build.StructuredSources: OBJ.StructuredSourcesHolder, compilers.RunResult: compilerOBJ.TryRunResultHolder, dependencies.ExternalLibrary: OBJ.ExternalLibraryHolder, @@ -2166,10 +2165,10 @@ class Interpreter(InterpreterBase, HoldableObject): kwargs: 'kwtypes.FuncTest') -> None: self.add_test(node, args, kwargs, True) - def unpack_env_kwarg(self, kwargs: T.Union[build.EnvironmentVariables, T.Dict[str, 'TYPE_var'], T.List['TYPE_var'], str]) -> build.EnvironmentVariables: + def unpack_env_kwarg(self, kwargs: T.Union[EnvironmentVariables, T.Dict[str, 'TYPE_var'], T.List['TYPE_var'], str]) -> EnvironmentVariables: envlist = kwargs.get('env') if envlist is None: - return build.EnvironmentVariables() + return EnvironmentVariables() msg = ENV_KW.validator(envlist) if msg: raise InvalidArguments(f'"env": {msg}') @@ -2687,7 +2686,7 @@ class Interpreter(InterpreterBase, HoldableObject): mlog.log('Configuring', mlog.bold(output), 'with command') cmd, *args = _cmd res = self.run_command_impl(node, (cmd, args), - {'capture': True, 'check': True, 'env': build.EnvironmentVariables()}, + {'capture': True, 'check': True, 'env': EnvironmentVariables()}, True) if kwargs['capture']: dst_tmp = ofile_abs + '~' @@ -2967,7 +2966,7 @@ class Interpreter(InterpreterBase, HoldableObject): @typed_pos_args('environment', optargs=[(str, list, dict)]) @typed_kwargs('environment', ENV_METHOD_KW, ENV_SEPARATOR_KW.evolve(since='0.62.0')) def func_environment(self, node: mparser.FunctionNode, args: T.Tuple[T.Union[None, str, T.List['TYPE_var'], T.Dict[str, 'TYPE_var']]], - kwargs: 'TYPE_kwargs') -> build.EnvironmentVariables: + kwargs: 'TYPE_kwargs') -> EnvironmentVariables: init = args[0] if init is not None: FeatureNew.single_use('environment positional arguments', '0.52.0', self.subproject, location=node) @@ -2977,7 +2976,7 @@ class Interpreter(InterpreterBase, HoldableObject): if isinstance(init, dict) and any(i for i in init.values() if isinstance(i, list)): FeatureNew.single_use('List of string in dictionary value', '0.62.0', self.subproject, location=node) return env_convertor_with_method(init, kwargs['method'], kwargs['separator']) - return build.EnvironmentVariables() + return EnvironmentVariables() @typed_pos_args('join_paths', varargs=str, min_varargs=1) @noKwargs diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index fac3b0e..8648b48 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -203,7 +203,7 @@ class RunProcess(MesonInterpreterObject): def __init__(self, cmd: ExternalProgram, args: T.List[str], - env: build.EnvironmentVariables, + env: mesonlib.EnvironmentVariables, source_dir: str, build_dir: str, subdir: str, @@ -224,7 +224,7 @@ class RunProcess(MesonInterpreterObject): def run_command(self, cmd: ExternalProgram, args: T.List[str], - env: build.EnvironmentVariables, + env: mesonlib.EnvironmentVariables, source_dir: str, build_dir: str, subdir: str, @@ -280,9 +280,9 @@ class RunProcess(MesonInterpreterObject): def stderr_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: return self.stderr -class EnvironmentVariablesHolder(ObjectHolder[build.EnvironmentVariables], MutableInterpreterObject): +class EnvironmentVariablesHolder(ObjectHolder[mesonlib.EnvironmentVariables], MutableInterpreterObject): - def __init__(self, obj: build.EnvironmentVariables, interpreter: 'Interpreter'): + def __init__(self, obj: mesonlib.EnvironmentVariables, interpreter: 'Interpreter'): super().__init__(obj, interpreter) self.methods.update({'set': self.set_method, 'append': self.append_method, @@ -711,7 +711,7 @@ class Test(MesonInterpreterObject): depends: T.List[T.Union[build.CustomTarget, build.BuildTarget]], is_parallel: bool, cmd_args: T.List[T.Union[str, mesonlib.File, build.Target]], - env: build.EnvironmentVariables, + env: mesonlib.EnvironmentVariables, should_fail: bool, timeout: int, workdir: T.Optional[str], protocol: str, priority: int, verbose: bool): super().__init__() diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py index cf476ce..cc48e7a 100644 --- a/mesonbuild/interpreter/kwargs.py +++ b/mesonbuild/interpreter/kwargs.py @@ -12,7 +12,7 @@ from typing_extensions import TypedDict, Literal, Protocol from .. import build from .. import coredata from ..compilers import Compiler -from ..mesonlib import MachineChoice, File, FileMode, FileOrString, OptionKey +from ..mesonlib import EnvironmentVariables, MachineChoice, File, FileMode, FileOrString, OptionKey from ..modules.cmake import CMakeSubprojectOptions from ..programs import ExternalProgram @@ -42,7 +42,7 @@ class BaseTest(TypedDict): workdir: T.Optional[str] depends: T.List[T.Union[build.CustomTarget, build.BuildTarget]] priority: int - env: build.EnvironmentVariables + env: EnvironmentVariables suite: T.List[str] @@ -164,7 +164,7 @@ class RunTarget(TypedDict): command: T.List[T.Union[str, build.BuildTarget, build.CustomTarget, ExternalProgram, File]] depends: T.List[T.Union[build.BuildTarget, build.CustomTarget]] - env: build.EnvironmentVariables + env: EnvironmentVariables class CustomTarget(TypedDict): @@ -179,7 +179,7 @@ class CustomTarget(TypedDict): depend_files: T.List[FileOrString] depends: T.List[T.Union[build.BuildTarget, build.CustomTarget]] depfile: T.Optional[str] - env: build.EnvironmentVariables + env: EnvironmentVariables feed: bool input: T.List[T.Union[str, build.BuildTarget, build.CustomTarget, build.CustomTargetIndex, build.ExtractedObjects, build.GeneratedList, ExternalProgram, File]] @@ -196,7 +196,7 @@ class AddTestSetup(TypedDict): timeout_multiplier: int is_default: bool exclude_suites: T.List[str] - env: build.EnvironmentVariables + env: EnvironmentVariables class Project(TypedDict): @@ -240,7 +240,7 @@ class RunCommand(TypedDict): check: bool capture: T.Optional[bool] - env: build.EnvironmentVariables + env: EnvironmentVariables class FeatureOptionRequire(TypedDict): diff --git a/mesonbuild/interpreter/mesonmain.py b/mesonbuild/interpreter/mesonmain.py index 73df5ed..66029a0 100644 --- a/mesonbuild/interpreter/mesonmain.py +++ b/mesonbuild/interpreter/mesonmain.py @@ -21,14 +21,13 @@ from .primitives import MesonVersionString from .type_checking import NATIVE_KW, NoneType if T.TYPE_CHECKING: - from typing_extensions import Literal - from ..backend.backends import ExecutableSerialisation + from typing_extensions import Literal, TypedDict + from ..compilers import Compiler from ..interpreterbase import TYPE_kwargs, TYPE_var + from ..mesonlib import ExecutableSerialisation from .interpreter import Interpreter - from typing_extensions import TypedDict - class FuncOverrideDependency(TypedDict): native: mesonlib.MachineChoice @@ -456,15 +455,15 @@ class MesonMain(MesonInterpreterObject): @FeatureNew('add_devenv', '0.58.0') @typed_kwargs('environment', ENV_METHOD_KW, ENV_SEPARATOR_KW.evolve(since='0.62.0')) - @typed_pos_args('add_devenv', (str, list, dict, build.EnvironmentVariables)) - def add_devenv_method(self, args: T.Tuple[T.Union[str, list, dict, build.EnvironmentVariables]], + @typed_pos_args('add_devenv', (str, list, dict, mesonlib.EnvironmentVariables)) + def add_devenv_method(self, args: T.Tuple[T.Union[str, list, dict, mesonlib.EnvironmentVariables]], kwargs: 'AddDevenvKW') -> None: env = args[0] msg = ENV_KW.validator(env) if msg: raise build.InvalidArguments(f'"add_devenv": {msg}') converted = env_convertor_with_method(env, kwargs['method'], kwargs['separator']) - assert isinstance(converted, build.EnvironmentVariables) + assert isinstance(converted, mesonlib.EnvironmentVariables) self.build.devenv.append(converted) @noPosargs diff --git a/mesonbuild/interpreterbase/decorators.py b/mesonbuild/interpreterbase/decorators.py index 64e02c2..10683fd 100644 --- a/mesonbuild/interpreterbase/decorators.py +++ b/mesonbuild/interpreterbase/decorators.py @@ -29,8 +29,7 @@ if T.TYPE_CHECKING: from typing_extensions import Protocol from .. import mparser - from .baseobjects import InterpreterObject, TV_func, TYPE_var, TYPE_kwargs - from .interpreterbase import SubProject + from .baseobjects import InterpreterObject, SubProject, TV_func, TYPE_var, TYPE_kwargs from .operator import MesonOperator _TV_IntegerObject = T.TypeVar('_TV_IntegerObject', bound=InterpreterObject, contravariant=True) diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py index 5f854d0..d039f6d 100644 --- a/mesonbuild/interpreterbase/interpreterbase.py +++ b/mesonbuild/interpreterbase/interpreterbase.py @@ -36,7 +36,6 @@ from .exceptions import ( InterpreterException, InvalidArguments, InvalidCode, - MesonException, SubdirDoneRequest, ) @@ -319,12 +318,12 @@ class InterpreterBase: def evaluate_comparison(self, node: mparser.ComparisonNode) -> InterpreterObject: val1 = self.evaluate_statement(node.left) if val1 is None: - raise MesonException('Cannot compare a void statement on the left-hand side') + raise mesonlib.MesonException('Cannot compare a void statement on the left-hand side') if isinstance(val1, Disabler): return val1 val2 = self.evaluate_statement(node.right) if val2 is None: - raise MesonException('Cannot compare a void statement on the right-hand side') + raise mesonlib.MesonException('Cannot compare a void statement on the right-hand side') if isinstance(val2, Disabler): return val2 @@ -350,7 +349,7 @@ class InterpreterBase: def evaluate_andstatement(self, cur: mparser.AndNode) -> InterpreterObject: l = self.evaluate_statement(cur.left) if l is None: - raise MesonException('Cannot compare a void statement on the left-hand side') + raise mesonlib.MesonException('Cannot compare a void statement on the left-hand side') if isinstance(l, Disabler): return l l_bool = l.operator_call(MesonOperator.BOOL, None) @@ -358,7 +357,7 @@ class InterpreterBase: return self._holderify(l_bool) r = self.evaluate_statement(cur.right) if r is None: - raise MesonException('Cannot compare a void statement on the right-hand side') + raise mesonlib.MesonException('Cannot compare a void statement on the right-hand side') if isinstance(r, Disabler): return r return self._holderify(r.operator_call(MesonOperator.BOOL, None)) @@ -366,7 +365,7 @@ class InterpreterBase: def evaluate_orstatement(self, cur: mparser.OrNode) -> InterpreterObject: l = self.evaluate_statement(cur.left) if l is None: - raise MesonException('Cannot compare a void statement on the left-hand side') + raise mesonlib.MesonException('Cannot compare a void statement on the left-hand side') if isinstance(l, Disabler): return l l_bool = l.operator_call(MesonOperator.BOOL, None) @@ -374,7 +373,7 @@ class InterpreterBase: return self._holderify(l_bool) r = self.evaluate_statement(cur.right) if r is None: - raise MesonException('Cannot compare a void statement on the right-hand side') + raise mesonlib.MesonException('Cannot compare a void statement on the right-hand side') if isinstance(r, Disabler): return r return self._holderify(r.operator_call(MesonOperator.BOOL, None)) @@ -413,7 +412,7 @@ class InterpreterBase: assert isinstance(node, mparser.TernaryNode) result = self.evaluate_statement(node.condition) if result is None: - raise MesonException('Cannot use a void statement as condition for ternary operator.') + raise mesonlib.MesonException('Cannot use a void statement as condition for ternary operator.') if isinstance(result, Disabler): return result result.current_node = node diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index ddd2ee2..d4ecce8 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -26,7 +26,7 @@ from . import environment from . import mesonlib from . import mintro from . import mlog -from .ast import AstIDGenerator +from .ast import AstIDGenerator, IntrospectionInterpreter from .mesonlib import MachineChoice, OptionKey if T.TYPE_CHECKING: @@ -81,7 +81,7 @@ class Conf: # Make sure that log entries in other parts of meson don't interfere with the JSON output with mlog.no_logging(): self.source_dir = os.path.abspath(os.path.realpath(self.build_dir)) - intr = mintro.IntrospectionInterpreter(self.source_dir, '', 'ninja', visitors = [AstIDGenerator()]) + intr = IntrospectionInterpreter(self.source_dir, '', 'ninja', visitors = [AstIDGenerator()]) intr.analyze() self.coredata = intr.coredata self.default_values_only = True diff --git a/mesonbuild/mdevenv.py b/mesonbuild/mdevenv.py index 9c29847..46b1b60 100644 --- a/mesonbuild/mdevenv.py +++ b/mesonbuild/mdevenv.py @@ -8,7 +8,7 @@ import itertools from pathlib import Path from . import build, minstall -from .mesonlib import (MesonException, is_windows, setup_vsenv, OptionKey, +from .mesonlib import (EnvironmentVariables, MesonException, is_windows, setup_vsenv, OptionKey, get_wine_shortpath, MachineChoice) from . import mlog @@ -55,7 +55,7 @@ def reduce_winepath(env: T.Dict[str, str]) -> None: mlog.log('Meson detected wine and has set WINEPATH accordingly') def get_env(b: build.Build, dump_fmt: T.Optional[str]) -> T.Tuple[T.Dict[str, str], T.Set[str]]: - extra_env = build.EnvironmentVariables() + extra_env = EnvironmentVariables() extra_env.set('MESON_DEVENV', ['1']) extra_env.set('MESON_PROJECT_NAME', [b.project_name]) diff --git a/mesonbuild/minstall.py b/mesonbuild/minstall.py index 4900691..a9c561f 100644 --- a/mesonbuild/minstall.py +++ b/mesonbuild/minstall.py @@ -25,7 +25,7 @@ import sys import typing as T import re -from . import build, coredata, environment +from . import build, environment from .backend.backends import InstallData from .mesonlib import (MesonException, Popen_safe, RealPathAction, is_windows, is_aix, setup_vsenv, pickle_load, is_osx, OptionKey) @@ -40,10 +40,10 @@ except ImportError: if T.TYPE_CHECKING: from .backend.backends import ( - ExecutableSerialisation, InstallDataBase, InstallEmptyDir, + InstallDataBase, InstallEmptyDir, InstallSymlinkData, TargetInstallData ) - from .mesonlib import FileMode, EnvironOrDict + from .mesonlib import FileMode, EnvironOrDict, ExecutableSerialisation try: from typing import Protocol @@ -847,7 +847,7 @@ def run(opts: 'ArgumentType') -> int: b = build.load(opts.wd) need_vsenv = T.cast('bool', b.environment.coredata.get_option(OptionKey('vsenv'))) setup_vsenv(need_vsenv) - backend = T.cast('str', b.environment.coredata.get_option(coredata.OptionKey('backend'))) + backend = T.cast('str', b.environment.coredata.get_option(OptionKey('backend'))) if not rebuild_all(opts.wd, backend): sys.exit(-1) os.chdir(opts.wd) diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index ab303b3..1d1e858 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -444,7 +444,7 @@ def get_test_list(testdata: T.List[backends.TestSerialisation]) -> T.List[T.Dict else: fname = t.fname to['cmd'] = fname + t.cmd_args - if isinstance(t.env, build.EnvironmentVariables): + if isinstance(t.env, mesonlib.EnvironmentVariables): to['env'] = t.env.get_env({}) else: to['env'] = t.env diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py index daac9ed..b46b300 100644 --- a/mesonbuild/modules/__init__.py +++ b/mesonbuild/modules/__init__.py @@ -30,7 +30,6 @@ if T.TYPE_CHECKING: from ..interpreterbase import TYPE_var, TYPE_kwargs from ..programs import OverrideProgram from ..wrap import WrapMode - from ..build import Executable from ..dependencies import Dependency class ModuleState: @@ -87,16 +86,16 @@ class ModuleState: def find_program(self, prog: T.Union[mesonlib.FileOrString, T.List[mesonlib.FileOrString]], required: bool = True, - version_func: T.Optional[T.Callable[[T.Union[ExternalProgram, Executable, OverrideProgram]], str]] = None, + version_func: T.Optional[T.Callable[[T.Union[ExternalProgram, build.Executable, OverrideProgram]], str]] = None, wanted: T.Optional[str] = None, silent: bool = False, - for_machine: MachineChoice = MachineChoice.HOST) -> T.Union[ExternalProgram, Executable, OverrideProgram]: + for_machine: MachineChoice = MachineChoice.HOST) -> T.Union[ExternalProgram, build.Executable, OverrideProgram]: if not isinstance(prog, list): prog = [prog] return self._interpreter.find_program_impl(prog, required=required, version_func=version_func, wanted=wanted, silent=silent, for_machine=for_machine) def find_tool(self, name: str, depname: str, varname: str, required: bool = True, - wanted: T.Optional[str] = None) -> T.Union['Executable', ExternalProgram, 'OverrideProgram']: + wanted: T.Optional[str] = None) -> T.Union['build.Executable', ExternalProgram, 'OverrideProgram']: # Look in overrides in case it's built as subproject progobj = self._interpreter.program_from_overrides([name], []) if progobj is not None: @@ -256,10 +255,10 @@ def is_module_library(fname: mesonlib.FileOrString) -> bool: class ModuleReturnValue: def __init__(self, return_value: T.Optional['TYPE_var'], - new_objects: T.Sequence[T.Union['TYPE_var', 'build.ExecutableSerialisation']]) -> None: + new_objects: T.Sequence[T.Union['TYPE_var', 'mesonlib.ExecutableSerialisation']]) -> None: self.return_value = return_value assert isinstance(new_objects, list) - self.new_objects: T.List[T.Union['TYPE_var', 'build.ExecutableSerialisation']] = new_objects + self.new_objects: T.List[T.Union['TYPE_var', 'mesonlib.ExecutableSerialisation']] = new_objects class GResourceTarget(build.CustomTarget): pass diff --git a/mesonbuild/modules/external_project.py b/mesonbuild/modules/external_project.py index a1d8514..fd7e7c8 100644 --- a/mesonbuild/modules/external_project.py +++ b/mesonbuild/modules/external_project.py @@ -39,6 +39,7 @@ if T.TYPE_CHECKING: from ..build import BuildTarget, CustomTarget from ..interpreter import Interpreter from ..interpreterbase import TYPE_var + from ..mesonlib import EnvironmentVariables class Dependency(TypedDict): @@ -49,7 +50,7 @@ if T.TYPE_CHECKING: configure_options: T.List[str] cross_configure_options: T.List[str] verbose: bool - env: build.EnvironmentVariables + env: EnvironmentVariables depends: T.List[T.Union[BuildTarget, CustomTarget]] @@ -62,7 +63,7 @@ class ExternalProject(NewExtensionModule): configure_command: str, configure_options: T.List[str], cross_configure_options: T.List[str], - env: build.EnvironmentVariables, + env: EnvironmentVariables, verbose: bool, extra_depends: T.List[T.Union['BuildTarget', 'CustomTarget']]): super().__init__() diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 755bf24..32d53ef 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -272,7 +272,7 @@ class GnomeModule(ExtensionModule): self.install_gtk_update_icon_cache = False self.install_update_desktop_database = False self.install_update_mime_database = False - self.devenv: T.Optional[build.EnvironmentVariables] = None + self.devenv: T.Optional[mesonlib.EnvironmentVariables] = None self.native_glib_version: T.Optional[str] = None self.methods.update({ 'post_install': self.post_install, @@ -328,7 +328,7 @@ class GnomeModule(ExtensionModule): @noPosargs @FeatureNew('gnome.post_install', '0.57.0') def post_install(self, state: 'ModuleState', args: T.List['TYPE_var'], kwargs: 'PostInstall') -> ModuleReturnValue: - rv: T.List['build.ExecutableSerialisation'] = [] + rv: T.List['mesonlib.ExecutableSerialisation'] = [] datadir_abs = os.path.join(state.environment.get_prefix(), state.environment.get_datadir()) if kwargs['glib_compile_schemas'] and not self.install_glib_compile_schemas: self.install_glib_compile_schemas = True @@ -769,7 +769,7 @@ class GnomeModule(ExtensionModule): def _devenv_prepend(self, varname: str, value: str) -> None: if self.devenv is None: - self.devenv = build.EnvironmentVariables() + self.devenv = mesonlib.EnvironmentVariables() self.devenv.prepend(varname, [value]) def postconf_hook(self, b: build.Build) -> None: @@ -1522,7 +1522,7 @@ class GnomeModule(ExtensionModule): check_args = (targetname + '-check', check_cmd) check_workdir = os.path.join(state.environment.get_build_dir(), state.subdir) state.test(check_args, env=check_env, workdir=check_workdir, depends=[custom_target]) - res: T.List[T.Union[build.Target, build.ExecutableSerialisation]] = [custom_target, alias_target] + res: T.List[T.Union[build.Target, mesonlib.ExecutableSerialisation]] = [custom_target, alias_target] if kwargs['install']: res.append(state.backend.get_executable_serialisation(command + t_args, tag='doc')) return ModuleReturnValue(custom_target, res) diff --git a/mesonbuild/modules/hotdoc.py b/mesonbuild/modules/hotdoc.py index ad5ae30..cf1a247 100644 --- a/mesonbuild/modules/hotdoc.py +++ b/mesonbuild/modules/hotdoc.py @@ -20,7 +20,7 @@ import subprocess from mesonbuild import mesonlib from mesonbuild import mlog, build -from mesonbuild.coredata import MesonException +from mesonbuild.mesonlib import MesonException from . import ModuleReturnValue, ModuleInfo from . import ExtensionModule from ..dependencies import Dependency, InternalDependency diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index 9f71d95..c6bc42d 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -381,7 +381,7 @@ class PkgConfigModule(NewExtensionModule): # Track already generated pkg-config files This is stored as a class # variable so that multiple `import()`s share metadata - devenv: T.Optional[build.EnvironmentVariables] = None + devenv: T.Optional[mesonlib.EnvironmentVariables] = None _metadata: T.ClassVar[T.Dict[str, MetaData]] = {} def __init__(self) -> None: diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index ac74e13..1f05f08 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -43,7 +43,7 @@ if T.TYPE_CHECKING: from ..dependencies import Dependency from ..interpreter import Interpreter from ..interpreter.kwargs import ExtractRequired - from ..interpreterbase.interpreterbase import TYPE_var, TYPE_kwargs + from ..interpreterbase.baseobjects import TYPE_var, TYPE_kwargs class PyInstallKw(TypedDict): diff --git a/mesonbuild/mtest.py b/mesonbuild/mtest.py index 88995c0..0e1086c 100644 --- a/mesonbuild/mtest.py +++ b/mesonbuild/mtest.py @@ -44,9 +44,9 @@ import xml.etree.ElementTree as et from . import build from . import environment from . import mlog -from .coredata import MesonVersionMismatchException, OptionKey, major_versions_differ +from .coredata import MesonVersionMismatchException, major_versions_differ from .coredata import version as coredata_version -from .mesonlib import (MesonException, OrderedSet, RealPathAction, +from .mesonlib import (MesonException, OptionKey, OrderedSet, RealPathAction, get_wine_shortpath, join_args, split_args, setup_vsenv) from .mintro import get_infodir, load_info_file from .programs import ExternalProgram diff --git a/mesonbuild/programs.py b/mesonbuild/programs.py index 9bf1844..13b9981 100644 --- a/mesonbuild/programs.py +++ b/mesonbuild/programs.py @@ -103,13 +103,12 @@ class ExternalProgram(mesonlib.HoldableObject): def get_version(self, interpreter: T.Optional['Interpreter'] = None) -> str: if not self.cached_version: - from . import build raw_cmd = self.get_command() + ['--version'] if interpreter: res = interpreter.run_command_impl(interpreter.current_node, (self, ['--version']), {'capture': True, 'check': True, - 'env': build.EnvironmentVariables()}, + 'env': mesonlib.EnvironmentVariables()}, True) o, e = res.stdout, res.stderr else: diff --git a/mesonbuild/utils/posix.py b/mesonbuild/utils/posix.py index 51c3cd0..cd05d27 100644 --- a/mesonbuild/utils/posix.py +++ b/mesonbuild/utils/posix.py @@ -20,7 +20,7 @@ from __future__ import annotations import fcntl import typing as T -from .universal import MesonException +from .core import MesonException from .platform import BuildDirLock as BuildDirLockBase __all__ = ['BuildDirLock'] diff --git a/mesonbuild/utils/vsenv.py b/mesonbuild/utils/vsenv.py index 3c26878..550a8cf 100644 --- a/mesonbuild/utils/vsenv.py +++ b/mesonbuild/utils/vsenv.py @@ -8,7 +8,8 @@ import shutil import tempfile from .. import mlog -from .universal import MesonException, is_windows, windows_detect_native_arch +from .core import MesonException +from .universal import is_windows, windows_detect_native_arch __all__ = [ diff --git a/mesonbuild/utils/win32.py b/mesonbuild/utils/win32.py index 2bd4cba..18ee0d0 100644 --- a/mesonbuild/utils/win32.py +++ b/mesonbuild/utils/win32.py @@ -20,7 +20,7 @@ from __future__ import annotations import msvcrt import typing as T -from .universal import MesonException +from .core import MesonException from .platform import BuildDirLock as BuildDirLockBase __all__ = ['BuildDirLock'] -- cgit v1.1