Compiler checks can only accept external dependencies

This is already how it should've been, but:

a) The test for this was wrong since Dependency is a base class for all
dependencies and isinstance on an InternalDependency will also be true
b) Internal dependencies can't ever be used here anyway because compiler
checks are always run at configure time and internal dependencies are
only built after that.
pull/1149/head
Nirbheek Chauhan 8 years ago
parent 541dd92ef7
commit 7b8f41ce31
  1. 21
      mesonbuild/interpreter.py
  2. 8
      test cases/failing/38 has function external dependency/meson.build
  3. 1
      test cases/failing/38 has function external dependency/mylib.c

@ -22,6 +22,7 @@ from . import optinterpreter
from . import compilers from . import compilers
from .wrap import wrap from .wrap import wrap
from . import mesonlib from . import mesonlib
from .dependencies import InternalDependency, Dependency
from mesonbuild.interpreterbase import InterpreterBase from mesonbuild.interpreterbase import InterpreterBase
from mesonbuild.interpreterbase import check_stringlist, noPosargs, noKwargs, stringArgs from mesonbuild.interpreterbase import check_stringlist, noPosargs, noKwargs, stringArgs
from mesonbuild.interpreterbase import InterpreterException, InvalidArguments, InvalidCode from mesonbuild.interpreterbase import InterpreterException, InvalidArguments, InvalidCode
@ -649,10 +650,8 @@ class CompilerHolder(InterpreterObject):
args += mesonlib.stringlistify(kwargs.get('args', [])) args += mesonlib.stringlistify(kwargs.get('args', []))
return args return args
def determine_dependencies(self, kwargs, allowed_dep_types=None): def determine_dependencies(self, kwargs):
deps = kwargs.get('dependencies', None) deps = kwargs.get('dependencies', None)
if allowed_dep_types is None:
allowed_dep_types = (dependencies.Dependency, dependencies.ExternalLibrary)
if deps is not None: if deps is not None:
if not isinstance(deps, list): if not isinstance(deps, list):
deps = [deps] deps = [deps]
@ -662,8 +661,8 @@ class CompilerHolder(InterpreterObject):
d = d.held_object d = d.held_object
except Exception: except Exception:
pass pass
if not isinstance(d, allowed_dep_types): if isinstance(d, InternalDependency) or not isinstance(d, Dependency):
raise InterpreterException('Dependencies must be external deps') raise InterpreterException('Dependencies must be external dependencies')
final_deps.append(d) final_deps.append(d)
deps = final_deps deps = final_deps
return deps return deps
@ -722,7 +721,7 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_member must be a string.') raise InterpreterException('Prefix argument of has_member must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs, allowed_dep_types=(dependencies.Dependency,)) deps = self.determine_dependencies(kwargs)
had = self.compiler.has_members(typename, [membername], prefix, had = self.compiler.has_members(typename, [membername], prefix,
self.environment, extra_args, deps) self.environment, extra_args, deps)
if had: if had:
@ -741,7 +740,7 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_members must be a string.') raise InterpreterException('Prefix argument of has_members must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs, allowed_dep_types=(dependencies.Dependency,)) deps = self.determine_dependencies(kwargs)
had = self.compiler.has_members(typename, membernames, prefix, had = self.compiler.has_members(typename, membernames, prefix,
self.environment, extra_args, deps) self.environment, extra_args, deps)
if had: if had:
@ -798,7 +797,7 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of sizeof must be a string.') raise InterpreterException('Prefix argument of sizeof must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs, allowed_dep_types=(dependencies.Dependency,)) deps = self.determine_dependencies(kwargs)
esize = self.compiler.sizeof(element, prefix, self.environment, extra_args, deps) esize = self.compiler.sizeof(element, prefix, self.environment, extra_args, deps)
mlog.log('Checking for size of "%s": %d' % (element, esize)) mlog.log('Checking for size of "%s": %d' % (element, esize))
return esize return esize
@ -816,7 +815,7 @@ class CompilerHolder(InterpreterObject):
if not isinstance(testname, str): if not isinstance(testname, str):
raise InterpreterException('Testname argument must be a string.') raise InterpreterException('Testname argument must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs, allowed_dep_types=(dependencies.Dependency,)) deps = self.determine_dependencies(kwargs)
result = self.compiler.compiles(code, self.environment, extra_args, deps) result = self.compiler.compiles(code, self.environment, extra_args, deps)
if len(testname) > 0: if len(testname) > 0:
if result: if result:
@ -858,7 +857,7 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_header must be a string.') raise InterpreterException('Prefix argument of has_header must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs, allowed_dep_types=(dependencies.Dependency,)) deps = self.determine_dependencies(kwargs)
haz = self.compiler.has_header(hname, prefix, self.environment, extra_args, deps) haz = self.compiler.has_header(hname, prefix, self.environment, extra_args, deps)
if haz: if haz:
h = mlog.green('YES') h = mlog.green('YES')
@ -877,7 +876,7 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_header_symbol must be a string.') raise InterpreterException('Prefix argument of has_header_symbol must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs, allowed_dep_types=(dependencies.Dependency,)) deps = self.determine_dependencies(kwargs)
haz = self.compiler.has_header_symbol(hname, symbol, prefix, self.environment, extra_args, deps) haz = self.compiler.has_header_symbol(hname, symbol, prefix, self.environment, extra_args, deps)
if haz: if haz:
h = mlog.green('YES') h = mlog.green('YES')

@ -0,0 +1,8 @@
project('has function ext dep', 'c')
cc = meson.get_compiler('c')
mylib = shared_library('mylib', 'mylib.c')
mylib_dep = declare_dependency(link_with : mylib)
# Only external dependencies can work here
cc.has_function('malloc', dependencies : mylib_dep)
Loading…
Cancel
Save