Skip to content

Commit 1232ec1

Browse files
FFY00mgorny
authored andcommitted
python: add a python.build_config option (PEP 739)
Signed-off-by: Filipe Laíns <lains@riseup.net> Signed-off-by: Michał Górny <mgorny@quansight.com>
1 parent 6e379f0 commit 1232ec1

File tree

8 files changed

+421
-89
lines changed

8 files changed

+421
-89
lines changed

docs/markdown/Builtin-options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@ install prefix. For example: if the install prefix is `/usr` and the
444444
| platlibdir | | Directory path | Directory for site-specific, platform-specific files (Since 0.60.0) |
445445
| purelibdir | | Directory path | Directory for site-specific, non-platform-specific files (Since 0.60.0) |
446446
| allow_limited_api | true | true, false | Disables project-wide use of the Python Limited API (Since 1.3.0) |
447+
| build_config | | File path | Specifies the Python build configuration file (PEP 739) (Since 1.9.0) |
447448

448449
*Since 0.60.0* The `python.platlibdir` and `python.purelibdir` options are used
449450
by the python module methods `python.install_sources()` and

mesonbuild/dependencies/pkgconfig.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ def set_program_override(pkg_bin: ExternalProgram, for_machine: MachineChoice) -
4141
PkgConfigInterface.pkg_bin_per_machine[for_machine] = pkg_bin
4242

4343
@staticmethod
44-
def instance(env: Environment, for_machine: MachineChoice, silent: bool) -> T.Optional[PkgConfigInterface]:
44+
def instance(env: Environment, for_machine: MachineChoice, silent: bool,
45+
extra_paths: T.Optional[T.List[str]] = None) -> T.Optional[PkgConfigInterface]:
4546
'''Return a pkg-config implementation singleton'''
4647
for_machine = for_machine if env.is_cross_build() else MachineChoice.HOST
4748
impl = PkgConfigInterface.class_impl[for_machine]
4849
if impl is False:
49-
impl = PkgConfigCLI(env, for_machine, silent, PkgConfigInterface.pkg_bin_per_machine[for_machine])
50+
impl = PkgConfigCLI(env, for_machine, silent, PkgConfigInterface.pkg_bin_per_machine[for_machine], extra_paths)
5051
if not impl.found():
5152
impl = None
5253
if not impl and not silent:
@@ -55,7 +56,9 @@ def instance(env: Environment, for_machine: MachineChoice, silent: bool) -> T.Op
5556
return impl
5657

5758
@staticmethod
58-
def _cli(env: Environment, for_machine: MachineChoice, silent: bool = False) -> T.Optional[PkgConfigCLI]:
59+
def _cli(env: Environment, for_machine: MachineChoice,
60+
extra_paths: T.Optional[T.List[str]] = None,
61+
silent: bool = False) -> T.Optional[PkgConfigCLI]:
5962
'''Return the CLI pkg-config implementation singleton
6063
Even when we use another implementation internally, external tools might
6164
still need the CLI implementation.
@@ -66,15 +69,16 @@ def _cli(env: Environment, for_machine: MachineChoice, silent: bool = False) ->
6669
if impl and not isinstance(impl, PkgConfigCLI):
6770
impl = PkgConfigInterface.class_cli_impl[for_machine]
6871
if impl is False:
69-
impl = PkgConfigCLI(env, for_machine, silent, PkgConfigInterface.pkg_bin_per_machine[for_machine])
72+
impl = PkgConfigCLI(env, for_machine, silent, PkgConfigInterface.pkg_bin_per_machine[for_machine], extra_paths)
7073
if not impl.found():
7174
impl = None
7275
PkgConfigInterface.class_cli_impl[for_machine] = impl
7376
return T.cast('T.Optional[PkgConfigCLI]', impl) # Trust me, mypy
7477

7578
@staticmethod
76-
def get_env(env: Environment, for_machine: MachineChoice, uninstalled: bool = False) -> EnvironmentVariables:
77-
cli = PkgConfigInterface._cli(env, for_machine)
79+
def get_env(env: Environment, for_machine: MachineChoice, uninstalled: bool = False,
80+
extra_paths: T.Optional[T.List[str]] = None) -> EnvironmentVariables:
81+
cli = PkgConfigInterface._cli(env, for_machine, extra_paths)
7882
return cli._get_env(uninstalled) if cli else EnvironmentVariables()
7983

8084
@staticmethod
@@ -123,11 +127,13 @@ class PkgConfigCLI(PkgConfigInterface):
123127
'''pkg-config CLI implementation'''
124128

125129
def __init__(self, env: Environment, for_machine: MachineChoice, silent: bool,
126-
pkgbin: T.Optional[ExternalProgram] = None) -> None:
130+
pkgbin: T.Optional[ExternalProgram] = None,
131+
extra_paths: T.Optional[T.List[str]] = None) -> None:
127132
super().__init__(env, for_machine)
128133
self._detect_pkgbin(pkgbin)
129134
if self.pkgbin and not silent:
130135
mlog.log('Found pkg-config:', mlog.green('YES'), mlog.bold(f'({self.pkgbin.get_path()})'), mlog.blue(self.pkgbin_version))
136+
self.extra_paths = extra_paths or []
131137

132138
def found(self) -> bool:
133139
return bool(self.pkgbin)
@@ -258,7 +264,7 @@ def _get_env(self, uninstalled: bool = False) -> EnvironmentVariables:
258264
key = OptionKey('pkg_config_path', machine=self.for_machine)
259265
pathlist = self.env.coredata.optstore.get_value_for(key)
260266
assert isinstance(pathlist, list)
261-
extra_paths: T.List[str] = pathlist[:]
267+
extra_paths: T.List[str] = pathlist + self.extra_paths
262268
if uninstalled:
263269
bpath = self.env.get_build_dir()
264270
if bpath is not None:
@@ -297,11 +303,13 @@ def _call_pkgbin(self, args: T.List[str], env: T.Optional[EnvironOrDict] = None)
297303
class PkgConfigDependency(ExternalDependency):
298304

299305
def __init__(self, name: str, environment: Environment, kwargs: T.Dict[str, T.Any],
300-
language: T.Optional[str] = None) -> None:
306+
language: T.Optional[str] = None,
307+
extra_paths: T.Optional[T.List[str]] = None) -> None:
301308
super().__init__(DependencyTypeName('pkgconfig'), environment, kwargs, language=language)
302309
self.name = name
303310
self.is_libtool = False
304-
pkgconfig = PkgConfigInterface.instance(self.env, self.for_machine, self.silent)
311+
self.extra_paths = extra_paths or []
312+
pkgconfig = PkgConfigInterface.instance(self.env, self.for_machine, self.silent, self.extra_paths)
305313
if not pkgconfig:
306314
msg = f'Pkg-config for machine {self.for_machine} not found. Giving up.'
307315
if self.required:

0 commit comments

Comments
 (0)