aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/build.py23
-rw-r--r--mesonbuild/compilers/compilers.py13
-rw-r--r--mesonbuild/interpreter.py20
-rw-r--r--mesonbuild/mesonlib.py4
-rw-r--r--mesonbuild/mlog.py29
-rw-r--r--mesonbuild/modules/pkgconfig.py2
-rwxr-xr-xrun_unittests.py20
7 files changed, 82 insertions, 29 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 08e0c9d..8d16c95 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -803,12 +803,16 @@ This will become a hard error in a future Meson release.''')
def get_extra_args(self, language):
return self.extra_args.get(language, [])
- def get_dependencies(self):
+ def get_dependencies(self, exclude=None):
transitive_deps = []
+ if exclude is None:
+ exclude = []
for t in itertools.chain(self.link_targets, self.link_whole_targets):
+ if t in transitive_deps or t in exclude:
+ continue
transitive_deps.append(t)
if isinstance(t, StaticLibrary):
- transitive_deps += t.get_dependencies()
+ transitive_deps += t.get_dependencies(transitive_deps + exclude)
return transitive_deps
def get_source_subdir(self):
@@ -851,13 +855,14 @@ This will become a hard error in a future Meson release.''')
self.link(l)
for l in dep.whole_libraries:
self.link_whole(l)
- # Those parts that are external.
- extpart = dependencies.InternalDependency('undefined',
- [],
- dep.compile_args,
- dep.link_args,
- [], [], [], [])
- self.external_deps.append(extpart)
+ if dep.compile_args or dep.link_args:
+ # Those parts that are external.
+ extpart = dependencies.InternalDependency('undefined',
+ [],
+ dep.compile_args,
+ dep.link_args,
+ [], [], [], [])
+ self.external_deps.append(extpart)
# Deps of deps.
self.add_deps(dep.ext_deps)
elif isinstance(dep, dependencies.Dependency):
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index a28a225..69ab6ef 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -526,15 +526,22 @@ class CompilerArgs(list):
def append_direct(self, arg):
'''
Append the specified argument without any reordering or de-dup
+ except for absolute paths where the order of include search directories
+ is not relevant
'''
- super().append(arg)
+ if os.path.isabs(arg):
+ self.append(arg)
+ else:
+ super().append(arg)
def extend_direct(self, iterable):
'''
Extend using the elements in the specified iterable without any
- reordering or de-dup
+ reordering or de-dup except for absolute paths where the order of
+ include search directories is not relevant
'''
- super().extend(iterable)
+ for elem in iterable:
+ self.append_direct(elem)
def __add__(self, args):
new = CompilerArgs(self, self.compiler)
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 6ecd285..b99a413 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1862,21 +1862,23 @@ external dependencies (including libraries) must go to "dependencies".''')
subdir = os.path.join(self.subproject_dir, resolved)
os.makedirs(os.path.join(self.build.environment.get_build_dir(), subdir), exist_ok=True)
self.global_args_frozen = True
- mlog.log('\nExecuting subproject ', mlog.bold(dirname), '.\n', sep='')
- subi = Interpreter(self.build, self.backend, dirname, subdir, self.subproject_dir,
- mesonlib.stringlistify(kwargs.get('default_options', [])))
- subi.subprojects = self.subprojects
-
- subi.subproject_stack = self.subproject_stack + [dirname]
- current_active = self.active_projectname
- subi.run()
+ mlog.log()
+ with mlog.nested():
+ mlog.log('Executing subproject ', mlog.bold(dirname), '.\n', sep='')
+ subi = Interpreter(self.build, self.backend, dirname, subdir, self.subproject_dir,
+ mesonlib.stringlistify(kwargs.get('default_options', [])))
+ subi.subprojects = self.subprojects
+
+ subi.subproject_stack = self.subproject_stack + [dirname]
+ current_active = self.active_projectname
+ subi.run()
+ mlog.log('\nSubproject', mlog.bold(dirname), 'finished.')
if 'version' in kwargs:
pv = subi.project_version
wanted = kwargs['version']
if pv == 'undefined' or not mesonlib.version_compare(pv, wanted):
raise InterpreterException('Subproject %s version is %s but %s required.' % (dirname, pv, wanted))
self.active_projectname = current_active
- mlog.log('\nSubproject', mlog.bold(dirname), 'finished.')
self.build.subprojects[dirname] = subi.project_version
self.subprojects.update(subi.subprojects)
self.subprojects[dirname] = SubprojectHolder(subi)
diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py
index 9b00c28..8a2b67c 100644
--- a/mesonbuild/mesonlib.py
+++ b/mesonbuild/mesonlib.py
@@ -749,7 +749,9 @@ def expand_arguments(args):
return expended_args
def Popen_safe(args, write=None, stderr=subprocess.PIPE, **kwargs):
- if sys.version_info < (3, 6) or not sys.stdout.encoding:
+ import locale
+ encoding = locale.getpreferredencoding()
+ if sys.version_info < (3, 6) or not sys.stdout.encoding or encoding.upper() != 'UTF-8':
return Popen_safe_legacy(args, write=write, stderr=stderr, **kwargs)
p = subprocess.Popen(args, universal_newlines=True,
close_fds=False,
diff --git a/mesonbuild/mlog.py b/mesonbuild/mlog.py
index 347cede..6cbaf60 100644
--- a/mesonbuild/mlog.py
+++ b/mesonbuild/mlog.py
@@ -13,6 +13,7 @@
# limitations under the License.
import sys, os, platform, io
+from contextlib import contextmanager
"""This is (mostly) a standalone module used to write logging
information about Meson runs. Some output goes to screen,
@@ -25,6 +26,7 @@ else:
log_dir = None
log_file = None
log_fname = 'meson-log.txt'
+log_depth = 0
def initialize(logdir):
global log_dir, log_file
@@ -77,15 +79,21 @@ def process_markup(args, keep):
return arr
def force_print(*args, **kwargs):
+ iostr = io.StringIO()
+ kwargs['file'] = iostr
+ print(*args, **kwargs)
+
+ raw = iostr.getvalue()
+ if log_depth > 0:
+ prepend = '|' * log_depth
+ raw = prepend + raw.replace('\n', '\n' + prepend, raw.count('\n') - 1)
+
# _Something_ is going to get printed.
try:
- print(*args, **kwargs)
+ print(raw, end='')
except UnicodeEncodeError:
- iostr = io.StringIO()
- kwargs['file'] = iostr
- print(*args, **kwargs)
- cleaned = iostr.getvalue().encode('ascii', 'replace').decode('ascii')
- print(cleaned)
+ cleaned = raw.encode('ascii', 'replace').decode('ascii')
+ print(cleaned, end='')
def debug(*args, **kwargs):
arr = process_markup(args, False)
@@ -146,3 +154,12 @@ def format_list(list):
return list[0]
else:
return ''
+
+@contextmanager
+def nested():
+ global log_depth
+ log_depth += 1
+ try:
+ yield
+ finally:
+ log_depth -= 1
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py
index 11fa80d..6a7e962 100644
--- a/mesonbuild/modules/pkgconfig.py
+++ b/mesonbuild/modules/pkgconfig.py
@@ -91,7 +91,7 @@ class DependenciesHelper:
if hasattr(obj, 'pcdep'):
pcdeps = mesonlib.listify(obj.pcdep)
for d in pcdeps:
- processed_reqs += d.name
+ processed_reqs.append(d.name)
self.add_version_reqs(d.name, obj.version_reqs)
elif hasattr(obj, 'generated_pc'):
processed_reqs.append(obj.generated_pc)
diff --git a/run_unittests.py b/run_unittests.py
index 4f688cd..1e8a778 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -42,6 +42,7 @@ from mesonbuild.mesonlib import (
from mesonbuild.environment import Environment, detect_ninja
from mesonbuild.mesonlib import MesonException, EnvironmentException
from mesonbuild.dependencies import PkgConfigDependency, ExternalProgram
+import mesonbuild.modules.pkgconfig
from run_tests import exe_suffix, get_fake_options
from run_tests import get_builddir_target_args, get_backend_commands, Backend
@@ -198,6 +199,12 @@ class InternalTests(unittest.TestCase):
# Direct-adding the same library again still adds it
l.append_direct('-lbar')
self.assertEqual(l, ['-Lfoodir', '-lfoo', '-Lbardir', '-lbar', '-lbar'])
+ # Direct-adding with absolute path deduplicates
+ l.append_direct('/libbaz.a')
+ self.assertEqual(l, ['-Lfoodir', '-lfoo', '-Lbardir', '-lbar', '-lbar', '/libbaz.a'])
+ # Adding libbaz again does nothing
+ l.append_direct('/libbaz.a')
+ self.assertEqual(l, ['-Lfoodir', '-lfoo', '-Lbardir', '-lbar', '-lbar', '/libbaz.a'])
def test_string_templates_substitution(self):
dictfunc = mesonbuild.mesonlib.get_filenames_templates_dict
@@ -448,6 +455,19 @@ class InternalTests(unittest.TestCase):
if f.name != 'add_release_note_snippets_here':
self.assertTrue(False, 'A file without .md suffix in snippets dir: ' + f.name)
+ def test_pkgconfig_module(self):
+ deps = mesonbuild.modules.pkgconfig.DependenciesHelper("thislib")
+
+ class Mock:
+ pass
+
+ mock = Mock()
+ mock.pcdep = Mock()
+ mock.pcdep.name = "some_name"
+ mock.version_reqs = []
+ deps.add_pub_libs([mock])
+ self.assertEqual(deps.format_reqs(deps.pub_reqs), "some_name")
+
class BasePlatformTests(unittest.TestCase):
def setUp(self):