aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/dependencies/base.py28
-rw-r--r--mesonbuild/interpreter.py30
2 files changed, 54 insertions, 4 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index 4e95c94..e5cb4bf 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -104,6 +104,14 @@ class Dependency:
return methods
+ @classmethod
+ def _process_is_system_kw(cls, kwargs):
+ if 'is_system' not in kwargs:
+ return False
+ if not isinstance(kwargs['is_system'], bool):
+ raise DependencyException('The is_system kwarg must be a boolean type')
+ return kwargs['is_system']
+
def __init__(self, type_name, kwargs):
self.name = "null"
self.version = None
@@ -117,6 +125,7 @@ class Dependency:
self.raw_link_args = None
self.sources = []
self.methods = self._process_method_kw(kwargs)
+ self.is_system = self._process_is_system_kw(kwargs)
self.ext_deps = [] # type: List[Dependency]
def __repr__(self):
@@ -124,7 +133,21 @@ class Dependency:
return s.format(self.__class__.__name__, self.name, self.is_found)
def get_compile_args(self):
- return self.compile_args
+ if not self.is_system:
+ return self.compile_args
+
+ system_args = []
+ for i in self.compile_args:
+ if i.startswith('-I') or i.startswith('/I'):
+ # -isystem and -idirafter, both mark directories as system
+ # directories. However, both affect the search oder, which
+ # can lead to nasty bugs with -isystem:
+ # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70129
+ system_args += ['-idirafter' + i[2:]]
+ else:
+ system_args += [i]
+
+ return system_args
def get_link_args(self, raw=False):
if raw and self.raw_link_args is not None:
@@ -152,6 +175,9 @@ class Dependency:
else:
return 'unknown'
+ def get_is_system(self) -> bool:
+ return self.is_system
+
def get_exe_args(self, compiler):
return []
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 0aa4b37..adb854e 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -34,13 +34,12 @@ from .interpreterbase import ObjectHolder
from .modules import ModuleReturnValue
from .cmake import CMakeInterpreter
-from pathlib import Path
+from pathlib import Path, PurePath
import os, shutil, uuid
-import re, shlex
+import re, shlex, copy
import subprocess
from collections import namedtuple
from itertools import chain
-from pathlib import PurePath
import functools
from typing import Sequence, List, Union, Optional, Dict, Any
@@ -413,6 +412,8 @@ class DependencyHolder(InterpreterObject, ObjectHolder):
'get_configtool_variable': self.configtool_method,
'get_variable': self.variable_method,
'partial_dependency': self.partial_dependency_method,
+ 'is_system': self.is_system_method,
+ 'as_system': self.as_system_method,
})
def found(self):
@@ -474,6 +475,27 @@ class DependencyHolder(InterpreterObject, ObjectHolder):
def variable_method(self, args, kwargs):
return self.held_object.get_variable(**kwargs)
+ @FeatureNew('dep.is_system', '0.52.0')
+ @noPosargs
+ @permittedKwargs({})
+ def is_system_method(self, args, kwargs):
+ return self.held_object.get_is_system()
+
+ @FeatureNew('dep.as_system', '0.52.0')
+ @permittedKwargs({})
+ def as_system_method(self, args, kwargs):
+ args = listify(args)
+ new_is_system = True
+ if len(args) > 1:
+ raise InterpreterException('as_system takes only one optional value')
+ if len(args) == 1:
+ if not isinstance(args[0], bool):
+ raise InterpreterException('as_system takes only a boolean value')
+ new_is_system = args[0]
+ new_dep = copy.deepcopy(self.held_object)
+ new_dep.is_system = new_is_system
+ return DependencyHolder(new_dep, self.subproject)
+
class ExternalProgramHolder(InterpreterObject, ObjectHolder):
def __init__(self, ep):
InterpreterObject.__init__(self)
@@ -1998,6 +2020,7 @@ permitted_kwargs = {'add_global_arguments': {'language', 'native'},
'version',
'private_headers',
'cmake_args',
+ 'is_system',
},
'declare_dependency': {'include_directories',
'link_with',
@@ -3049,6 +3072,7 @@ external dependencies (including libraries) must go to "dependencies".''')
elif name == 'openmp':
FeatureNew('OpenMP Dependency', '0.46.0').use(self.subproject)
+ @FeatureNewKwargs('dependency', '0.52.0', ['is_system'])
@FeatureNewKwargs('dependency', '0.50.0', ['not_found_message', 'cmake_module_path', 'cmake_args'])
@FeatureNewKwargs('dependency', '0.49.0', ['disabler'])
@FeatureNewKwargs('dependency', '0.40.0', ['method'])