aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2023-08-18 09:56:13 -0400
committerXavier Claessens <xclaesse@gmail.com>2023-09-18 13:51:27 -0400
commitf1c35b561f80174ae1ea936da282d8736c19e247 (patch)
tree81efdf677e76fc32e7531470caf80235fa04d24b /mesonbuild
parent6a56f6d98fb7806a59967b0df3ede26544eac4a4 (diff)
downloadmeson-f1c35b561f80174ae1ea936da282d8736c19e247.zip
meson-f1c35b561f80174ae1ea936da282d8736c19e247.tar.gz
meson-f1c35b561f80174ae1ea936da282d8736c19e247.tar.bz2
pkgconfig: Set PKG_CONFIG in env for devenv and g-ir-scanner
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/dependencies/pkgconfig.py56
-rw-r--r--mesonbuild/modules/external_project.py9
-rw-r--r--mesonbuild/modules/gnome.py4
-rw-r--r--mesonbuild/modules/pkgconfig.py4
4 files changed, 51 insertions, 22 deletions
diff --git a/mesonbuild/dependencies/pkgconfig.py b/mesonbuild/dependencies/pkgconfig.py
index 89442af..7035eab 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 EnvironmentVariables, OptionKey, OrderedSet, PerMachine, Popen_safe, Popen_safe_logged, MachineChoice
+from ..mesonlib import EnvironmentVariables, OptionKey, OrderedSet, PerMachine, Popen_safe, Popen_safe_logged, MachineChoice, join_args
from ..programs import find_external_program, ExternalProgram
from .. import mlog
from pathlib import PurePath
@@ -37,9 +37,11 @@ class PkgConfigInterface:
'''Base class wrapping a pkg-config implementation'''
class_impl: PerMachine[T.Union[Literal[False], T.Optional[PkgConfigInterface]]] = PerMachine(False, False)
+ class_cli_impl: PerMachine[T.Union[Literal[False], T.Optional[PkgConfigCLI]]] = PerMachine(False, False)
@staticmethod
def instance(env: Environment, for_machine: MachineChoice, silent: bool) -> T.Optional[PkgConfigInterface]:
+ '''Return a pkg-config implementation singleton'''
for_machine = for_machine if env.is_cross_build() else MachineChoice.HOST
impl = PkgConfigInterface.class_impl[for_machine]
if impl is False:
@@ -51,6 +53,35 @@ class PkgConfigInterface:
PkgConfigInterface.class_impl[for_machine] = impl
return impl
+ @staticmethod
+ def _cli(env: Environment, for_machine: MachineChoice, silent: bool = False) -> T.Optional[PkgConfigCLI]:
+ '''Return the CLI pkg-config implementation singleton
+ Even when we use another implementation internally, external tools might
+ still need the CLI implementation.
+ '''
+ for_machine = for_machine if env.is_cross_build() else MachineChoice.HOST
+ impl: T.Union[Literal[False], T.Optional[PkgConfigInterface]] # Help confused mypy
+ impl = PkgConfigInterface.instance(env, for_machine, silent)
+ if impl and not isinstance(impl, PkgConfigCLI):
+ impl = PkgConfigInterface.class_cli_impl[for_machine]
+ if impl is False:
+ impl = PkgConfigCLI(env, for_machine, silent)
+ if not impl.found():
+ impl = None
+ PkgConfigInterface.class_cli_impl[for_machine] = impl
+ return T.cast('T.Optional[PkgConfigCLI]', impl) # Trust me, mypy
+
+ @staticmethod
+ def get_env(env: Environment, for_machine: MachineChoice, uninstalled: bool = False) -> EnvironmentVariables:
+ cli = PkgConfigInterface._cli(env, for_machine)
+ return cli._get_env(uninstalled) if cli else EnvironmentVariables()
+
+ @staticmethod
+ def setup_env(environ: EnvironOrDict, env: Environment, for_machine: MachineChoice,
+ uninstalled: bool = False) -> EnvironOrDict:
+ cli = PkgConfigInterface._cli(env, for_machine)
+ return cli._setup_env(environ, uninstalled) if cli else environ
+
def __init__(self, env: Environment, for_machine: MachineChoice) -> None:
self.env = env
self.for_machine = for_machine
@@ -211,29 +242,26 @@ class PkgConfigCLI(PkgConfigInterface):
return None
return out.strip()
- @staticmethod
- def get_env(environment: Environment, for_machine: MachineChoice,
- uninstalled: bool = False) -> EnvironmentVariables:
+ def _get_env(self, uninstalled: bool = False) -> EnvironmentVariables:
env = EnvironmentVariables()
- key = OptionKey('pkg_config_path', machine=for_machine)
- extra_paths: T.List[str] = environment.coredata.options[key].value[:]
+ key = OptionKey('pkg_config_path', machine=self.for_machine)
+ extra_paths: T.List[str] = self.env.coredata.options[key].value[:]
if uninstalled:
- uninstalled_path = Path(environment.get_build_dir(), 'meson-uninstalled').as_posix()
+ uninstalled_path = Path(self.env.get_build_dir(), 'meson-uninstalled').as_posix()
if uninstalled_path not in extra_paths:
extra_paths.append(uninstalled_path)
env.set('PKG_CONFIG_PATH', extra_paths)
- sysroot = environment.properties[for_machine].get_sys_root()
+ sysroot = self.env.properties[self.for_machine].get_sys_root()
if sysroot:
env.set('PKG_CONFIG_SYSROOT_DIR', [sysroot])
- pkg_config_libdir_prop = environment.properties[for_machine].get_pkg_config_libdir()
+ pkg_config_libdir_prop = self.env.properties[self.for_machine].get_pkg_config_libdir()
if pkg_config_libdir_prop:
env.set('PKG_CONFIG_LIBDIR', pkg_config_libdir_prop)
+ env.set('PKG_CONFIG', [join_args(self.pkgbin.get_command())])
return env
- @staticmethod
- def setup_env(env: EnvironOrDict, environment: Environment, for_machine: MachineChoice,
- uninstalled: bool = False) -> T.Dict[str, str]:
- envvars = PkgConfigCLI.get_env(environment, for_machine, uninstalled)
+ def _setup_env(self, env: EnvironOrDict, uninstalled: bool = False) -> T.Dict[str, str]:
+ envvars = self._get_env(uninstalled)
env = envvars.get_env(env)
# Dump all PKG_CONFIG environment variables
for key, value in env.items():
@@ -244,7 +272,7 @@ class PkgConfigCLI(PkgConfigInterface):
def _call_pkgbin(self, args: T.List[str], env: T.Optional[EnvironOrDict] = None) -> T.Tuple[int, str, str]:
assert isinstance(self.pkgbin, ExternalProgram)
env = env or os.environ
- env = self.setup_env(env, self.env, self.for_machine)
+ env = self._setup_env(env)
cmd = self.pkgbin.get_command() + args
p, out, err = Popen_safe_logged(cmd, env=env)
return p.returncode, out.strip(), err.strip()
diff --git a/mesonbuild/modules/external_project.py b/mesonbuild/modules/external_project.py
index e7b7c43..bd6eba4 100644
--- a/mesonbuild/modules/external_project.py
+++ b/mesonbuild/modules/external_project.py
@@ -24,7 +24,7 @@ from .. import mlog, build
from ..compilers.compilers import CFLAGS_MAPPING
from ..envconfig import ENV_VAR_PROG_MAP
from ..dependencies import InternalDependency
-from ..dependencies.pkgconfig import PkgConfigCLI
+from ..dependencies.pkgconfig import PkgConfigInterface
from ..interpreterbase import FeatureNew
from ..interpreter.type_checking import ENV_KW, DEPENDS_KW
from ..interpreterbase.decorators import ContainerTypeInfo, KwargInfo, typed_kwargs, typed_pos_args
@@ -40,6 +40,7 @@ if T.TYPE_CHECKING:
from ..interpreter import Interpreter
from ..interpreterbase import TYPE_var
from ..mesonlib import EnvironmentVariables
+ from ..utils.core import EnvironOrDict
class Dependency(TypedDict):
@@ -144,7 +145,7 @@ class ExternalProject(NewExtensionModule):
# Set common env variables like CFLAGS, CC, etc.
link_exelist: T.List[str] = []
link_args: T.List[str] = []
- self.run_env = os.environ.copy()
+ self.run_env: EnvironOrDict = os.environ.copy()
for lang, compiler in self.env.coredata.compilers[MachineChoice.HOST].items():
if any(lang not in i for i in (ENV_VAR_PROG_MAP, CFLAGS_MAPPING)):
continue
@@ -165,8 +166,8 @@ class ExternalProject(NewExtensionModule):
self.run_env['LDFLAGS'] = self._quote_and_join(link_args)
self.run_env = self.user_env.get_env(self.run_env)
- self.run_env = PkgConfigCLI.setup_env(self.run_env, self.env, MachineChoice.HOST,
- uninstalled=True)
+ self.run_env = PkgConfigInterface.setup_env(self.run_env, self.env, MachineChoice.HOST,
+ uninstalled=True)
self.build_dir.mkdir(parents=True, exist_ok=True)
self._run('configure', configure_cmd, workdir)
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index 7de9d46..b0bca15 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -34,7 +34,7 @@ from .. import mesonlib
from .. import mlog
from ..build import CustomTarget, CustomTargetIndex, Executable, GeneratedList, InvalidArguments
from ..dependencies import Dependency, InternalDependency
-from ..dependencies.pkgconfig import PkgConfigDependency, PkgConfigCLI
+from ..dependencies.pkgconfig import PkgConfigDependency, PkgConfigInterface
from ..interpreter.type_checking import DEPENDS_KW, DEPEND_FILES_KW, ENV_KW, INSTALL_DIR_KW, INSTALL_KW, NoneType, SOURCES_KW, in_set_validator
from ..interpreterbase import noPosargs, noKwargs, FeatureNew, FeatureDeprecated
from ..interpreterbase import typed_kwargs, KwargInfo, ContainerTypeInfo
@@ -980,7 +980,7 @@ class GnomeModule(ExtensionModule):
# -uninstalled.pc files Meson generated. It also must respect pkgconfig
# settings user could have set in machine file, like PKG_CONFIG_LIBDIR,
# SYSROOT, etc.
- run_env = PkgConfigCLI.get_env(state.environment, MachineChoice.HOST, uninstalled=True)
+ run_env = PkgConfigInterface.get_env(state.environment, MachineChoice.HOST, uninstalled=True)
# g-ir-scanner uses Python's distutils to find the compiler, which uses 'CC'
cc_exelist = state.environment.coredata.compilers.host['c'].get_exelist()
run_env.set('CC', [quote_arg(x) for x in cc_exelist], ' ')
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py
index 44182d7..75521b8 100644
--- a/mesonbuild/modules/pkgconfig.py
+++ b/mesonbuild/modules/pkgconfig.py
@@ -26,7 +26,7 @@ from .. import dependencies
from .. import mesonlib
from .. import mlog
from ..coredata import BUILTIN_DIR_OPTIONS
-from ..dependencies.pkgconfig import PkgConfigDependency, PkgConfigCLI
+from ..dependencies.pkgconfig import PkgConfigDependency, PkgConfigInterface
from ..interpreter.type_checking import D_MODULE_VERSIONS_KW, INSTALL_DIR_KW, VARIABLES_KW, NoneType
from ..interpreterbase import FeatureNew, FeatureDeprecated
from ..interpreterbase.decorators import ContainerTypeInfo, KwargInfo, typed_kwargs, typed_pos_args
@@ -741,7 +741,7 @@ class PkgConfigModule(NewExtensionModule):
self._metadata[lib.get_id()] = MetaData(
filebase, name, state.current_node)
if self.devenv is None:
- self.devenv = PkgConfigCLI.get_env(state.environment, mesonlib.MachineChoice.HOST, uninstalled=True)
+ self.devenv = PkgConfigInterface.get_env(state.environment, mesonlib.MachineChoice.HOST, uninstalled=True)
return ModuleReturnValue(res, [res])