Skip to content

Commit fbab148

Browse files
bruchar1jpakkane
authored andcommitted
extra_files keyword in declare_dependency()
1 parent e2c454b commit fbab148

File tree

7 files changed

+34
-8
lines changed

7 files changed

+34
-8
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## Extra files keyword in `declare_dependency`
2+
3+
`declare_dependency` have a new `extra_files` keyword,
4+
to add extra files to a target. It is used mostly for IDE integration.

docs/yaml/functions/declare_dependency.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ kwargs:
4343
(or generated header files
4444
that should be built before sources including them are built)
4545
46+
extra_files:
47+
type: list[str | file]
48+
since: 1.2.0
49+
description: |
50+
extra files to add to targets.
51+
mostly used for IDE integration.
52+
4653
version:
4754
type: str
4855
description: |

mesonbuild/build.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,7 @@ def __init__(
733733
self.extra_args: T.Dict[str, T.List['FileOrString']] = {}
734734
self.sources: T.List[File] = []
735735
self.generated: T.List['GeneratedTypes'] = []
736+
self.extra_files: T.List[File] = []
736737
self.d_features = defaultdict(list)
737738
self.pic = False
738739
self.pie = False
@@ -1168,10 +1169,12 @@ def process_kwargs(self, kwargs):
11681169
extra_files = extract_as_list(kwargs, 'extra_files')
11691170
for i in extra_files:
11701171
assert isinstance(i, File)
1172+
if i in self.extra_files:
1173+
continue
11711174
trial = os.path.join(self.environment.get_source_dir(), i.subdir, i.fname)
11721175
if not os.path.isfile(trial):
11731176
raise InvalidArguments(f'Tried to add non-existing extra file {i}.')
1174-
self.extra_files = extra_files
1177+
self.extra_files.append(i)
11751178
self.install_rpath: str = kwargs.get('install_rpath', '')
11761179
if not isinstance(self.install_rpath, str):
11771180
raise InvalidArguments('Install_rpath is not a string.')
@@ -1315,6 +1318,7 @@ def add_deps(self, deps):
13151318
if isinstance(dep, dependencies.InternalDependency):
13161319
# Those parts that are internal.
13171320
self.process_sourcelist(dep.sources)
1321+
self.extra_files.extend(f for f in dep.extra_files if f not in self.extra_files)
13181322
self.add_include_dirs(dep.include_directories, dep.get_include_type())
13191323
self.objects.extend(dep.objects)
13201324
for l in dep.libraries:
@@ -1327,7 +1331,7 @@ def add_deps(self, deps):
13271331
[],
13281332
dep.get_compile_args(),
13291333
dep.get_link_args(),
1330-
[], [], [], [], {}, [], [], [])
1334+
[], [], [], [], [], {}, [], [], [])
13311335
self.external_deps.append(extpart)
13321336
# Deps of deps.
13331337
self.add_deps(dep.ext_deps)

mesonbuild/dependencies/base.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ def __init__(self, type_name: DependencyTypeName, kwargs: T.Dict[str, T.Any]) ->
110110
# If None, self.link_args will be used
111111
self.raw_link_args: T.Optional[T.List[str]] = None
112112
self.sources: T.List[T.Union['FileOrString', 'CustomTarget', 'StructuredSources']] = []
113+
self.extra_files: T.List[mesonlib.File] = []
113114
self.include_type = self._process_include_type_kw(kwargs)
114115
self.ext_deps: T.List[Dependency] = []
115116
self.d_features: T.DefaultDict[str, T.List[T.Any]] = collections.defaultdict(list)
@@ -171,6 +172,10 @@ def get_sources(self) -> T.List[T.Union['FileOrString', 'CustomTarget', 'Structu
171172
As an example, gtest-all.cc when using GTest."""
172173
return self.sources
173174

175+
def get_extra_files(self) -> T.List[mesonlib.File]:
176+
"""Mostly for introspection and IDEs"""
177+
return self.extra_files
178+
174179
def get_name(self) -> str:
175180
return self.name
176181

@@ -250,6 +255,7 @@ def __init__(self, version: str, incdirs: T.List['IncludeDirs'], compile_args: T
250255
libraries: T.List[LibTypes],
251256
whole_libraries: T.List[T.Union[StaticLibrary, CustomTarget, CustomTargetIndex]],
252257
sources: T.Sequence[T.Union[FileOrString, CustomTarget, StructuredSources]],
258+
extra_files: T.Sequence[mesonlib.File],
253259
ext_deps: T.List[Dependency], variables: T.Dict[str, str],
254260
d_module_versions: T.List[T.Union[str, int]], d_import_dirs: T.List['IncludeDirs'],
255261
objects: T.List['ExtractedObjects']):
@@ -262,6 +268,7 @@ def __init__(self, version: str, incdirs: T.List['IncludeDirs'], compile_args: T
262268
self.libraries = libraries
263269
self.whole_libraries = whole_libraries
264270
self.sources = list(sources)
271+
self.extra_files = list(extra_files)
265272
self.ext_deps = ext_deps
266273
self.variables = variables
267274
self.objects = objects
@@ -303,20 +310,22 @@ def get_configtool_variable(self, variable_name: str) -> str:
303310

304311
def get_partial_dependency(self, *, compile_args: bool = False,
305312
link_args: bool = False, links: bool = False,
306-
includes: bool = False, sources: bool = False) -> 'InternalDependency':
313+
includes: bool = False, sources: bool = False,
314+
extra_files: bool = False) -> InternalDependency:
307315
final_compile_args = self.compile_args.copy() if compile_args else []
308316
final_link_args = self.link_args.copy() if link_args else []
309317
final_libraries = self.libraries.copy() if links else []
310318
final_whole_libraries = self.whole_libraries.copy() if links else []
311319
final_sources = self.sources.copy() if sources else []
320+
final_extra_files = self.extra_files.copy() if extra_files else []
312321
final_includes = self.include_directories.copy() if includes else []
313322
final_deps = [d.get_partial_dependency(
314323
compile_args=compile_args, link_args=link_args, links=links,
315324
includes=includes, sources=sources) for d in self.ext_deps]
316325
return InternalDependency(
317326
self.version, final_includes, final_compile_args,
318327
final_link_args, final_libraries, final_whole_libraries,
319-
final_sources, final_deps, self.variables, [], [], [])
328+
final_sources, final_extra_files, final_deps, self.variables, [], [], [])
320329

321330
def get_include_dirs(self) -> T.List['IncludeDirs']:
322331
return self.include_directories

mesonbuild/interpreter/interpreter.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ def func_files(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwa
691691
LINK_WITH_KW,
692692
LINK_WHOLE_KW.evolve(since='0.46.0'),
693693
SOURCES_KW,
694+
KwargInfo('extra_files', ContainerTypeInfo(list, (mesonlib.File, str)), listify=True, default=[], since='1.2.0'),
694695
VARIABLES_KW.evolve(since='0.54.0', since_values={list: '0.56.0'}),
695696
KwargInfo('version', (str, NoneType)),
696697
KwargInfo('objects', ContainerTypeInfo(list, build.ExtractedObjects), listify=True, default=[], since='1.1.0'),
@@ -702,6 +703,7 @@ def func_declare_dependency(self, node, args, kwargs):
702703
libs_whole = kwargs['link_whole']
703704
objects = kwargs['objects']
704705
sources = self.source_strings_to_files(kwargs['sources'])
706+
extra_files = self.source_strings_to_files(kwargs['extra_files'])
705707
compile_args = kwargs['compile_args']
706708
link_args = kwargs['link_args']
707709
variables = kwargs['variables']
@@ -727,8 +729,8 @@ def func_declare_dependency(self, node, args, kwargs):
727729
raise InterpreterException('Invalid dependency')
728730

729731
dep = dependencies.InternalDependency(version, incs, compile_args,
730-
link_args, libs, libs_whole, sources, deps,
731-
variables, d_module_versions, d_import_dirs,
732+
link_args, libs, libs_whole, sources, extra_files,
733+
deps, variables, d_module_versions, d_import_dirs,
732734
objects)
733735
return dep
734736

mesonbuild/modules/external_project.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ def dependency_method(self, state: 'ModuleState', args: T.Tuple[str], kwargs: 'D
274274
link_args = [f'-L{abs_libdir}', f'-l{libname}']
275275
sources = self.target
276276
dep = InternalDependency(version, [], compile_args, link_args, [],
277-
[], [sources], [], {}, [], [], [])
277+
[], [sources], [], [], {}, [], [], [])
278278
return dep
279279

280280

mesonbuild/modules/gnome.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2154,7 +2154,7 @@ def generate_vapi(self, state: 'ModuleState', args: T.Tuple[str], kwargs: 'Gener
21542154
# - add relevant directories to include dirs
21552155
incs = [build.IncludeDirs(state.subdir, ['.'] + vapi_includes, False)]
21562156
sources = [vapi_target] + vapi_depends
2157-
rv = InternalDependency(None, incs, [], [], link_with, [], sources, [], {}, [], [], [])
2157+
rv = InternalDependency(None, incs, [], [], link_with, [], sources, [], [], {}, [], [], [])
21582158
created_values.append(rv)
21592159
return ModuleReturnValue(rv, created_values)
21602160

0 commit comments

Comments
 (0)