Print dependencies being used for compiler checks

It is a common idiom to look for a function or a specific type or
a header in various locations/libraries, and it can be confusing to
see the (seemingly) identical compiler check being done multiple
times.

Now we print the dependencies being used when a compiler check is run

Before:
Checking for function "fbGetDisplay": NO
Checking for type "GLeglImageOES": YES
Checking for function "asinh": YES

After:
Checking for function "fbGetDisplay" with dependency egl: NO
Checking for type "GLeglImageOES" with dependencies glesv2, gl: YES
Checking for function "asinh" with dependency -lm: YES
pull/4454/head
Nirbheek Chauhan 6 years ago committed by Jussi Pakkanen
parent edccb11f01
commit a52cd31a6c
  1. 77
      mesonbuild/interpreter.py
  2. 2
      mesonbuild/mlog.py

@ -937,6 +937,23 @@ class CompilerHolder(InterpreterObject):
'symbols_have_underscore_prefix': self.symbols_have_underscore_prefix_method, 'symbols_have_underscore_prefix': self.symbols_have_underscore_prefix_method,
}) })
def _dep_msg(self, deps, endl):
msg_single = 'with dependency {}'
msg_many = 'with dependencies {}'
if not deps:
return endl
if endl is None:
endl = ''
tpl = msg_many if len(deps) > 1 else msg_single
names = []
for d in deps:
if isinstance(d, dependencies.ExternalLibrary):
name = '-l' + d.name
else:
name = d.name
names.append(name)
return tpl.format(', '.join(names)) + endl
@noPosargs @noPosargs
@permittedKwargs({}) @permittedKwargs({})
def version_method(self, args, kwargs): def version_method(self, args, kwargs):
@ -967,7 +984,7 @@ class CompilerHolder(InterpreterObject):
args += mesonlib.stringlistify(kwargs.get('args', [])) args += mesonlib.stringlistify(kwargs.get('args', []))
return args return args
def determine_dependencies(self, kwargs): def determine_dependencies(self, kwargs, endl=':'):
deps = kwargs.get('dependencies', None) deps = kwargs.get('dependencies', None)
if deps is not None: if deps is not None:
deps = listify(deps) deps = listify(deps)
@ -981,7 +998,7 @@ class CompilerHolder(InterpreterObject):
raise InterpreterException('Dependencies must be external dependencies') 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, self._dep_msg(deps, endl)
@permittedKwargs({ @permittedKwargs({
'prefix', 'prefix',
@ -997,9 +1014,9 @@ 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 = mesonlib.stringlistify(kwargs.get('args', [])) extra_args = mesonlib.stringlistify(kwargs.get('args', []))
deps = self.determine_dependencies(kwargs) deps, msg = self.determine_dependencies(kwargs)
result = self.compiler.alignment(typename, prefix, self.environment, extra_args, deps) result = self.compiler.alignment(typename, prefix, self.environment, extra_args, deps)
mlog.log('Checking for alignment of', mlog.bold(typename, True), ':', result) mlog.log('Checking for alignment of', mlog.bold(typename, True), msg, result)
return result return result
@permittedKwargs({ @permittedKwargs({
@ -1022,7 +1039,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) deps, msg = self.determine_dependencies(kwargs, endl=None)
result = self.compiler.run(code, self.environment, extra_args, deps) result = self.compiler.run(code, self.environment, extra_args, deps)
if len(testname) > 0: if len(testname) > 0:
if not result.compiled: if not result.compiled:
@ -1031,7 +1048,7 @@ class CompilerHolder(InterpreterObject):
h = mlog.green('YES') h = mlog.green('YES')
else: else:
h = mlog.red('NO (%d)' % result.returncode) h = mlog.red('NO (%d)' % result.returncode)
mlog.log('Checking if', mlog.bold(testname, True), 'runs:', h) mlog.log('Checking if', mlog.bold(testname, True), msg, 'runs:', h)
return TryRunResultHolder(result) return TryRunResultHolder(result)
@noPosargs @noPosargs
@ -1077,7 +1094,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) deps, msg = 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:
@ -1085,7 +1102,7 @@ class CompilerHolder(InterpreterObject):
else: else:
hadtxt = mlog.red('NO') hadtxt = mlog.red('NO')
mlog.log('Checking whether type', mlog.bold(typename, True), mlog.log('Checking whether type', mlog.bold(typename, True),
'has member', mlog.bold(membername, True), ':', hadtxt) 'has member', mlog.bold(membername, True), msg, hadtxt)
return had return had
@permittedKwargs({ @permittedKwargs({
@ -1105,7 +1122,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) deps, msg = 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:
@ -1114,7 +1131,7 @@ class CompilerHolder(InterpreterObject):
hadtxt = mlog.red('NO') hadtxt = mlog.red('NO')
members = mlog.bold(', '.join(['"{}"'.format(m) for m in membernames])) members = mlog.bold(', '.join(['"{}"'.format(m) for m in membernames]))
mlog.log('Checking whether type', mlog.bold(typename, True), mlog.log('Checking whether type', mlog.bold(typename, True),
'has members', members, ':', hadtxt) 'has members', members, msg, hadtxt)
return had return had
@permittedKwargs({ @permittedKwargs({
@ -1133,13 +1150,13 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_function must be a string.') raise InterpreterException('Prefix argument of has_function must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs) deps, msg = self.determine_dependencies(kwargs)
had = self.compiler.has_function(funcname, prefix, self.environment, extra_args, deps) had = self.compiler.has_function(funcname, prefix, self.environment, extra_args, deps)
if had: if had:
hadtxt = mlog.green('YES') hadtxt = mlog.green('YES')
else: else:
hadtxt = mlog.red('NO') hadtxt = mlog.red('NO')
mlog.log('Checking for function', mlog.bold(funcname, True), ':', hadtxt) mlog.log('Checking for function', mlog.bold(funcname, True), msg, hadtxt)
return had return had
@permittedKwargs({ @permittedKwargs({
@ -1158,13 +1175,13 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_type must be a string.') raise InterpreterException('Prefix argument of has_type must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs) deps, msg = self.determine_dependencies(kwargs)
had = self.compiler.has_type(typename, prefix, self.environment, extra_args, deps) had = self.compiler.has_type(typename, prefix, self.environment, extra_args, deps)
if had: if had:
hadtxt = mlog.green('YES') hadtxt = mlog.green('YES')
else: else:
hadtxt = mlog.red('NO') hadtxt = mlog.red('NO')
mlog.log('Checking for type', mlog.bold(typename, True), ':', hadtxt) mlog.log('Checking for type', mlog.bold(typename, True), msg, hadtxt)
return had return had
@FeatureNew('compiler.compute_int', '0.40.0') @FeatureNew('compiler.compute_int', '0.40.0')
@ -1196,9 +1213,9 @@ class CompilerHolder(InterpreterObject):
if guess is not None and not isinstance(guess, int): if guess is not None and not isinstance(guess, int):
raise InterpreterException('Guess argument of compute_int must be an int.') raise InterpreterException('Guess argument of compute_int must be an int.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs) deps, msg = self.determine_dependencies(kwargs)
res = self.compiler.compute_int(expression, low, high, guess, prefix, self.environment, extra_args, deps) res = self.compiler.compute_int(expression, low, high, guess, prefix, self.environment, extra_args, deps)
mlog.log('Computing int of "%s": %d' % (expression, res)) mlog.log('Computing int of', mlog.bold(expression, True), msg, res)
return res return res
@permittedKwargs({ @permittedKwargs({
@ -1217,9 +1234,9 @@ 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) deps, msg = 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', mlog.bold(element, True), msg, esize)
return esize return esize
@FeatureNew('compiler.get_define', '0.40.0') @FeatureNew('compiler.get_define', '0.40.0')
@ -1239,9 +1256,9 @@ class CompilerHolder(InterpreterObject):
if not isinstance(prefix, str): if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of get_define() must be a string.') raise InterpreterException('Prefix argument of get_define() must be a string.')
extra_args = self.determine_args(kwargs) extra_args = self.determine_args(kwargs)
deps = self.determine_dependencies(kwargs) deps, msg = self.determine_dependencies(kwargs)
value = self.compiler.get_define(element, prefix, self.environment, extra_args, deps) value = self.compiler.get_define(element, prefix, self.environment, extra_args, deps)
mlog.log('Fetching value of define "%s": %s' % (element, value)) mlog.log('Fetching value of define', mlog.bold(element, True), msg, value)
return value return value
@permittedKwargs({ @permittedKwargs({
@ -1264,14 +1281,14 @@ 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) deps, msg = self.determine_dependencies(kwargs, endl=None)
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:
h = mlog.green('YES') h = mlog.green('YES')
else: else:
h = mlog.red('NO') h = mlog.red('NO')
mlog.log('Checking if', mlog.bold(testname, True), 'compiles:', h) mlog.log('Checking if', mlog.bold(testname, True), msg, 'compiles:', h)
return result return result
@permittedKwargs({ @permittedKwargs({
@ -1294,14 +1311,14 @@ 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) deps, msg = self.determine_dependencies(kwargs, endl=None)
result = self.compiler.links(code, self.environment, extra_args, deps) result = self.compiler.links(code, self.environment, extra_args, deps)
if len(testname) > 0: if len(testname) > 0:
if result: if result:
h = mlog.green('YES') h = mlog.green('YES')
else: else:
h = mlog.red('NO') h = mlog.red('NO')
mlog.log('Checking if', mlog.bold(testname, True), 'links:', h) mlog.log('Checking if', mlog.bold(testname, True), msg, 'links:', h)
return result return result
@FeatureNew('compiler.check_header', '0.47.0') @FeatureNew('compiler.check_header', '0.47.0')
@ -1321,13 +1338,13 @@ 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) deps, msg = self.determine_dependencies(kwargs)
haz = self.compiler.check_header(hname, prefix, self.environment, extra_args, deps) haz = self.compiler.check_header(hname, prefix, self.environment, extra_args, deps)
if haz: if haz:
h = mlog.green('YES') h = mlog.green('YES')
else: else:
h = mlog.red('NO') h = mlog.red('NO')
mlog.log('Check usable header "%s":' % hname, h) mlog.log('Check usable header', mlog.bold(hname, True), msg, h)
return haz return haz
@permittedKwargs({ @permittedKwargs({
@ -1346,13 +1363,13 @@ 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) deps, msg = 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')
else: else:
h = mlog.red('NO') h = mlog.red('NO')
mlog.log('Has header "%s":' % hname, h) mlog.log('Has header', mlog.bold(hname, True), msg, h)
return haz return haz
@permittedKwargs({ @permittedKwargs({
@ -1372,13 +1389,13 @@ 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) deps, msg = 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')
else: else:
h = mlog.red('NO') h = mlog.red('NO')
mlog.log('Header <{0}> has symbol "{1}":'.format(hname, symbol), h) mlog.log('Header <{0}> has symbol'.format(hname), mlog.bold(symbol, True), msg, h)
return haz return haz
@FeatureNewKwargs('compiler.find_library', '0.49.0', ['disabler']) @FeatureNewKwargs('compiler.find_library', '0.49.0', ['disabler'])

@ -104,6 +104,8 @@ def process_markup(args, keep):
if log_timestamp_start is not None: if log_timestamp_start is not None:
arr = ['[{:.3f}]'.format(time.monotonic() - log_timestamp_start)] arr = ['[{:.3f}]'.format(time.monotonic() - log_timestamp_start)]
for arg in args: for arg in args:
if arg is None:
continue
if isinstance(arg, str): if isinstance(arg, str):
arr.append(arg) arr.append(arg)
elif isinstance(arg, AnsiDecorator): elif isinstance(arg, AnsiDecorator):

Loading…
Cancel
Save