From d9f01ffcea142cdd9bf2bbf1f9213e40efc189b5 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 5 Aug 2017 16:44:39 -0400 Subject: [PATCH] Disallow language keyword for unsupported deps. Also, document it in the manual. --- docs/markdown/Reference-manual.md | 1 + mesonbuild/dependencies/__init__.py | 5 ++++- mesonbuild/dependencies/base.py | 8 +++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md index ebd7b394e..265f76d6a 100644 --- a/docs/markdown/Reference-manual.md +++ b/docs/markdown/Reference-manual.md @@ -193,6 +193,7 @@ Finds an external dependency with the given name with `pkg-config` if possible a - `fallback` specifies a subproject fallback to use in case the dependency is not found in the system. The value is an array `['subproj_name', 'subproj_dep']` where the first value is the name of the subproject and the second is the variable name in that subproject that contains the value of [`declare_dependency`](#declare_dependency). - `default_options` *(added 0.37.0)* an array of option values that override those set in the project's `default_options` invocation (like `default_options` in [`project()`](#project), they only have effect when Meson is run for the first time, and command line arguments override any default options in build files) - `method` defines the way the dependency is detected, the default is `auto` but can be overridden to be e.g. `qmake` for Qt development, and different dependencies support different values for this (though `auto` will work on all of them) +- `language` *(added 0.42.0)* defines what language-specific dependency to find if it's available for multiple languages. The returned object also has methods that are documented in the [object methods section](#dependency-object) below. diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py index fb57e3d95..c16b92e19 100644 --- a/mesonbuild/dependencies/__init__.py +++ b/mesonbuild/dependencies/__init__.py @@ -15,7 +15,7 @@ from .base import ( # noqa: F401 Dependency, DependencyException, DependencyMethods, ExternalProgram, ExternalDependency, ExternalLibrary, ExtraFrameworkDependency, InternalDependency, - PkgConfigDependency, find_external_dependency, get_dep_identifier, packages) + PkgConfigDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language) from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency from .misc import (BoostDependency, MPIDependency, Python3Dependency, ThreadDependency) from .platform import AppleFrameworks @@ -47,3 +47,6 @@ packages.update({ 'wxwidgets': WxDependency, 'vulkan': VulkanDependency, }) +_packages_accept_language.update({ + 'mpi', +}) diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index f98de4423..1f18c5284 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -26,8 +26,9 @@ from .. import mesonlib from ..mesonlib import MesonException, Popen_safe, flatten, version_compare_many -# This must be defined in this file to avoid cyclical references. +# These must be defined in this file to avoid cyclical references. packages = {} +_packages_accept_language = set() class DependencyException(MesonException): @@ -610,10 +611,15 @@ def find_external_dependency(name, env, kwargs): raise DependencyException('Keyword "method" must be a string.') lname = name.lower() if lname in packages: + if lname not in _packages_accept_language and 'language' in kwargs: + raise DependencyException('%s dependency does not accept "language" keyword argument' % (lname, )) dep = packages[lname](env, kwargs) if required and not dep.found(): raise DependencyException('Dependency "%s" not found' % name) return dep + if 'language' in kwargs: + # Remove check when PkgConfigDependency supports language. + raise DependencyException('%s dependency does not accept "language" keyword argument' % (lname, )) pkg_exc = None pkgdep = None try: