Skip to content

Commit e216454

Browse files
bruchar1dcbaker
authored andcommitted
Allow compiler methods to accept strings for include_directories
1 parent 64eb003 commit e216454

File tree

4 files changed

+29
-23
lines changed

4 files changed

+29
-23
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## Methods from compiler object now accept strings for include_directories
2+
3+
The various [[@compiler]] methods with a `include_directories` keyword argument
4+
now accept stings or array of strings, in addition to [[@inc]] objects
5+
generated from [[include_directories]] function, as it was already the case for
6+
[[build_target]] family of functions.

docs/yaml/objects/compiler.yaml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,12 @@ methods:
6161
description: You have found a bug if you can see this!
6262
kwargs:
6363
include_directories:
64-
type: inc | array[inc]
64+
type: array[inc | str]
6565
since: 0.38.0
66-
description: Extra directories for header searches.
66+
description: |
67+
Extra directories for header searches, created with the
68+
[[include_directories]] function.
69+
*(Since 1.10.0)* Strings are also accepted.
6770
6871
- name: _dependencies
6972
returns: void
@@ -484,11 +487,12 @@ methods:
484487
When the `has_headers` kwarg is also used, this argument is passed to
485488
[[compiler.has_header]] as `args`.
486489
header_include_directories:
487-
type: inc | array[inc]
490+
type: array[inc | str]
488491
since: 0.51.0
489492
description: |
490493
When the `has_headers` kwarg is also used, this argument is passed to
491494
[[compiler.has_header]] as `include_directories`.
495+
*(Since 1.10.0)* Strings are also accepted.
492496
header_dependencies:
493497
type: dep | array[dep]
494498
since: 0.51.0

mesonbuild/interpreter/compiler.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from ..interpreterbase.decorators import ContainerTypeInfo, typed_kwargs, KwargInfo, typed_pos_args
2424
from ..options import OptionKey
2525
from .interpreterobjects import (extract_required_kwarg, extract_search_dirs)
26-
from .type_checking import REQUIRED_KW, in_set_validator, NoneType
26+
from .type_checking import INCLUDE_DIRECTORIES, REQUIRED_KW, in_set_validator, NoneType
2727

2828
if T.TYPE_CHECKING:
2929
from ..interpreter import Interpreter
@@ -86,15 +86,15 @@ class FindLibraryKW(ExtractRequired, ExtractSearchDirs):
8686
# prepended to the key
8787
header_args: T.List[str]
8888
header_dependencies: T.List[dependencies.Dependency]
89-
header_include_directories: T.List[build.IncludeDirs]
89+
header_include_directories: T.List[T.Union[build.IncludeDirs, str]]
9090
header_no_builtin_args: bool
9191
header_prefix: str
9292
header_required: T.Union[bool, options.UserFeatureOption]
9393

9494
class PreprocessKW(TypedDict):
9595
output: str
9696
compile_args: T.List[str]
97-
include_directories: T.List[build.IncludeDirs]
97+
include_directories: T.List[T.Union[build.IncludeDirs, str]]
9898
dependencies: T.List[dependencies.Dependency]
9999
depends: T.List[build.BuildTargetTypes]
100100

@@ -154,12 +154,6 @@ def stderr_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
154154
listify=True,
155155
default=[],
156156
)
157-
_INCLUDE_DIRS_KW: KwargInfo[T.List[build.IncludeDirs]] = KwargInfo(
158-
'include_directories',
159-
ContainerTypeInfo(list, build.IncludeDirs),
160-
default=[],
161-
listify=True,
162-
)
163157
_PREFIX_KW: KwargInfo[str] = KwargInfo(
164158
'prefix',
165159
(str, ContainerTypeInfo(list, str)),
@@ -173,10 +167,10 @@ def stderr_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> str:
173167

174168
# Many of the compiler methods take this kwarg signature exactly, this allows
175169
# simplifying the `typed_kwargs` calls
176-
_COMMON_KWS: T.List[KwargInfo] = [_ARGS_KW, _DEPENDENCIES_KW, _INCLUDE_DIRS_KW, _PREFIX_KW, _NO_BUILTIN_ARGS_KW]
170+
_COMMON_KWS: T.List[KwargInfo] = [_ARGS_KW, _DEPENDENCIES_KW, INCLUDE_DIRECTORIES, _PREFIX_KW, _NO_BUILTIN_ARGS_KW]
177171

178172
# Common methods of compiles, links, runs, and similar
179-
_COMPILES_KWS: T.List[KwargInfo] = [_NAME_KW, _ARGS_KW, _DEPENDENCIES_KW, _INCLUDE_DIRS_KW, _NO_BUILTIN_ARGS_KW,
173+
_COMPILES_KWS: T.List[KwargInfo] = [_NAME_KW, _ARGS_KW, _DEPENDENCIES_KW, INCLUDE_DIRECTORIES, _NO_BUILTIN_ARGS_KW,
180174
_WERROR_KW,
181175
REQUIRED_KW.evolve(since='1.5.0', default=False)]
182176

@@ -232,7 +226,7 @@ def cmd_array_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> T
232226
def _determine_args(self, kwargs: BaseCompileKW,
233227
mode: CompileCheckMode = CompileCheckMode.LINK) -> T.List[str]:
234228
args: T.List[str] = []
235-
for i in kwargs['include_directories']:
229+
for i in self.interpreter.extract_incdirs(kwargs, strings_since='1.10.0'):
236230
for idir in i.to_string_list(self.environment.get_source_dir(), self.environment.get_build_dir()):
237231
args.extend(self.compiler.get_include_args(idir, False))
238232
if not kwargs['no_builtin_args']:
@@ -687,13 +681,15 @@ def find_library_method(self, args: T.Tuple[str], kwargs: 'FindLibraryKW') -> 'd
687681
mlog.log('Library', mlog.bold(libname), 'skipped: feature', mlog.bold(feature), 'disabled')
688682
return self.notfound_library(libname)
689683

684+
include_directories = self.interpreter.extract_incdirs(kwargs, key='header_include_directories', strings_since='1.10.0')
685+
690686
# This could be done with a comprehension, but that confuses the type
691687
# checker, and having it check this seems valuable
692688
has_header_kwargs: 'HeaderKW' = {
693689
'required': required,
694690
'args': kwargs['header_args'],
695691
'dependencies': kwargs['header_dependencies'],
696-
'include_directories': kwargs['header_include_directories'],
692+
'include_directories': include_directories,
697693
'prefix': kwargs['header_prefix'],
698694
'no_builtin_args': kwargs['header_no_builtin_args'],
699695
}
@@ -890,7 +886,7 @@ def get_argument_syntax_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwa
890886
'compiler.preprocess',
891887
KwargInfo('output', str, default='@PLAINNAME@.i'),
892888
KwargInfo('compile_args', ContainerTypeInfo(list, str), listify=True, default=[]),
893-
_INCLUDE_DIRS_KW,
889+
INCLUDE_DIRECTORIES,
894890
_DEPENDENCIES_KW.evolve(since='1.1.0'),
895891
_DEPENDS_KW.evolve(since='1.4.0'),
896892
)
@@ -918,7 +914,7 @@ def preprocess_method(self, args: T.Tuple[T.List['mesonlib.FileOrString']], kwar
918914
compiler,
919915
self.interpreter.backend,
920916
kwargs['compile_args'],
921-
kwargs['include_directories'],
917+
self.interpreter.extract_incdirs(kwargs, strings_since='1.10.0'),
922918
kwargs['dependencies'],
923919
kwargs['depends'])
924920
self.interpreter.add_target(tg.name, tg)

mesonbuild/interpreter/interpreter.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ def func_files(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwa
692692
def func_declare_dependency(self, node: mparser.BaseNode, args: T.List[TYPE_var],
693693
kwargs: kwtypes.FuncDeclareDependency) -> dependencies.Dependency:
694694
deps = kwargs['dependencies']
695-
incs = self.extract_incdirs(kwargs)
695+
incs = self.extract_incdirs(kwargs, strings_since='0.50.0')
696696
libs = kwargs['link_with']
697697
libs_whole = kwargs['link_whole']
698698
objects = kwargs['objects']
@@ -2775,12 +2775,12 @@ def func_configure_file(self, node: mparser.BaseNode, args: T.List[TYPE_var],
27752775
install_tag=install_tag, data_type='configure'))
27762776
return mesonlib.File.from_built_file(self.subdir, output)
27772777

2778-
def extract_incdirs(self, kwargs, key: str = 'include_directories') -> T.List[build.IncludeDirs]:
2778+
def extract_incdirs(self, kwargs, key: str = 'include_directories', strings_since: T.Optional[str] = None) -> T.List[build.IncludeDirs]:
27792779
prospectives = extract_as_list(kwargs, key)
2780-
if key == 'include_directories':
2780+
if strings_since:
27812781
for i in prospectives:
27822782
if isinstance(i, str):
2783-
FeatureNew.single_use('include_directories kwarg of type string', '0.50.0', self.subproject,
2783+
FeatureNew.single_use(f'{key} kwarg of type string', strings_since, self.subproject,
27842784
f'Use include_directories({i!r}) instead', location=self.current_node)
27852785
break
27862786

@@ -3448,7 +3448,7 @@ def build_target(self, node: mparser.BaseNode, args: T.Tuple[str, SourcesVarargs
34483448
node=node)
34493449
outputs.update(o)
34503450

3451-
kwargs['include_directories'] = self.extract_incdirs(kwargs)
3451+
kwargs['include_directories'] = self.extract_incdirs(kwargs, strings_since='0.50.0')
34523452

34533453
if targetclass is build.Executable:
34543454
kwargs = T.cast('kwtypes.Executable', kwargs)

0 commit comments

Comments
 (0)