aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Brunet <charles.brunet@optelgroup.com>2023-03-30 10:50:11 -0400
committerJussi Pakkanen <jpakkane@gmail.com>2023-04-20 18:31:39 +0300
commitfbab1488ae31ac0e3f08aa84c811cbdcd5fa68b4 (patch)
tree38b473f7f978552721d5b6eae2b0763ab2b9b8c2
parente2c454b86e5fcb2dbbabe33199dc4b877dcdb95d (diff)
downloadmeson-fbab1488ae31ac0e3f08aa84c811cbdcd5fa68b4.zip
meson-fbab1488ae31ac0e3f08aa84c811cbdcd5fa68b4.tar.gz
meson-fbab1488ae31ac0e3f08aa84c811cbdcd5fa68b4.tar.bz2
extra_files keyword in declare_dependency()
-rw-r--r--docs/markdown/snippets/dep_extra_files.md4
-rw-r--r--docs/yaml/functions/declare_dependency.yaml7
-rw-r--r--mesonbuild/build.py8
-rw-r--r--mesonbuild/dependencies/base.py13
-rw-r--r--mesonbuild/interpreter/interpreter.py6
-rw-r--r--mesonbuild/modules/external_project.py2
-rw-r--r--mesonbuild/modules/gnome.py2
7 files changed, 34 insertions, 8 deletions
diff --git a/docs/markdown/snippets/dep_extra_files.md b/docs/markdown/snippets/dep_extra_files.md
new file mode 100644
index 0000000..6366c16
--- /dev/null
+++ b/docs/markdown/snippets/dep_extra_files.md
@@ -0,0 +1,4 @@
+## Extra files keyword in `declare_dependency`
+
+`declare_dependency` have a new `extra_files` keyword,
+to add extra files to a target. It is used mostly for IDE integration.
diff --git a/docs/yaml/functions/declare_dependency.yaml b/docs/yaml/functions/declare_dependency.yaml
index b09a0c0..9d085fd 100644
--- a/docs/yaml/functions/declare_dependency.yaml
+++ b/docs/yaml/functions/declare_dependency.yaml
@@ -43,6 +43,13 @@ kwargs:
(or generated header files
that should be built before sources including them are built)
+ extra_files:
+ type: list[str | file]
+ since: 1.2.0
+ description: |
+ extra files to add to targets.
+ mostly used for IDE integration.
+
version:
type: str
description: |
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 7e8270c..d32296b 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -733,6 +733,7 @@ class BuildTarget(Target):
self.extra_args: T.Dict[str, T.List['FileOrString']] = {}
self.sources: T.List[File] = []
self.generated: T.List['GeneratedTypes'] = []
+ self.extra_files: T.List[File] = []
self.d_features = defaultdict(list)
self.pic = False
self.pie = False
@@ -1168,10 +1169,12 @@ class BuildTarget(Target):
extra_files = extract_as_list(kwargs, 'extra_files')
for i in extra_files:
assert isinstance(i, File)
+ if i in self.extra_files:
+ continue
trial = os.path.join(self.environment.get_source_dir(), i.subdir, i.fname)
if not os.path.isfile(trial):
raise InvalidArguments(f'Tried to add non-existing extra file {i}.')
- self.extra_files = extra_files
+ self.extra_files.append(i)
self.install_rpath: str = kwargs.get('install_rpath', '')
if not isinstance(self.install_rpath, str):
raise InvalidArguments('Install_rpath is not a string.')
@@ -1315,6 +1318,7 @@ class BuildTarget(Target):
if isinstance(dep, dependencies.InternalDependency):
# Those parts that are internal.
self.process_sourcelist(dep.sources)
+ self.extra_files.extend(f for f in dep.extra_files if f not in self.extra_files)
self.add_include_dirs(dep.include_directories, dep.get_include_type())
self.objects.extend(dep.objects)
for l in dep.libraries:
@@ -1327,7 +1331,7 @@ class BuildTarget(Target):
[],
dep.get_compile_args(),
dep.get_link_args(),
- [], [], [], [], {}, [], [], [])
+ [], [], [], [], [], {}, [], [], [])
self.external_deps.append(extpart)
# Deps of deps.
self.add_deps(dep.ext_deps)
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index 7e997c0..2cae8c3 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -110,6 +110,7 @@ class Dependency(HoldableObject):
# If None, self.link_args will be used
self.raw_link_args: T.Optional[T.List[str]] = None
self.sources: T.List[T.Union['FileOrString', 'CustomTarget', 'StructuredSources']] = []
+ self.extra_files: T.List[mesonlib.File] = []
self.include_type = self._process_include_type_kw(kwargs)
self.ext_deps: T.List[Dependency] = []
self.d_features: T.DefaultDict[str, T.List[T.Any]] = collections.defaultdict(list)
@@ -171,6 +172,10 @@ class Dependency(HoldableObject):
As an example, gtest-all.cc when using GTest."""
return self.sources
+ def get_extra_files(self) -> T.List[mesonlib.File]:
+ """Mostly for introspection and IDEs"""
+ return self.extra_files
+
def get_name(self) -> str:
return self.name
@@ -250,6 +255,7 @@ class InternalDependency(Dependency):
libraries: T.List[LibTypes],
whole_libraries: T.List[T.Union[StaticLibrary, CustomTarget, CustomTargetIndex]],
sources: T.Sequence[T.Union[FileOrString, CustomTarget, StructuredSources]],
+ extra_files: T.Sequence[mesonlib.File],
ext_deps: T.List[Dependency], variables: T.Dict[str, str],
d_module_versions: T.List[T.Union[str, int]], d_import_dirs: T.List['IncludeDirs'],
objects: T.List['ExtractedObjects']):
@@ -262,6 +268,7 @@ class InternalDependency(Dependency):
self.libraries = libraries
self.whole_libraries = whole_libraries
self.sources = list(sources)
+ self.extra_files = list(extra_files)
self.ext_deps = ext_deps
self.variables = variables
self.objects = objects
@@ -303,12 +310,14 @@ class InternalDependency(Dependency):
def get_partial_dependency(self, *, compile_args: bool = False,
link_args: bool = False, links: bool = False,
- includes: bool = False, sources: bool = False) -> 'InternalDependency':
+ includes: bool = False, sources: bool = False,
+ extra_files: bool = False) -> InternalDependency:
final_compile_args = self.compile_args.copy() if compile_args else []
final_link_args = self.link_args.copy() if link_args else []
final_libraries = self.libraries.copy() if links else []
final_whole_libraries = self.whole_libraries.copy() if links else []
final_sources = self.sources.copy() if sources else []
+ final_extra_files = self.extra_files.copy() if extra_files else []
final_includes = self.include_directories.copy() if includes else []
final_deps = [d.get_partial_dependency(
compile_args=compile_args, link_args=link_args, links=links,
@@ -316,7 +325,7 @@ class InternalDependency(Dependency):
return InternalDependency(
self.version, final_includes, final_compile_args,
final_link_args, final_libraries, final_whole_libraries,
- final_sources, final_deps, self.variables, [], [], [])
+ final_sources, final_extra_files, final_deps, self.variables, [], [], [])
def get_include_dirs(self) -> T.List['IncludeDirs']:
return self.include_directories
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 96d4af0..48c7d1f 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -691,6 +691,7 @@ class Interpreter(InterpreterBase, HoldableObject):
LINK_WITH_KW,
LINK_WHOLE_KW.evolve(since='0.46.0'),
SOURCES_KW,
+ KwargInfo('extra_files', ContainerTypeInfo(list, (mesonlib.File, str)), listify=True, default=[], since='1.2.0'),
VARIABLES_KW.evolve(since='0.54.0', since_values={list: '0.56.0'}),
KwargInfo('version', (str, NoneType)),
KwargInfo('objects', ContainerTypeInfo(list, build.ExtractedObjects), listify=True, default=[], since='1.1.0'),
@@ -702,6 +703,7 @@ class Interpreter(InterpreterBase, HoldableObject):
libs_whole = kwargs['link_whole']
objects = kwargs['objects']
sources = self.source_strings_to_files(kwargs['sources'])
+ extra_files = self.source_strings_to_files(kwargs['extra_files'])
compile_args = kwargs['compile_args']
link_args = kwargs['link_args']
variables = kwargs['variables']
@@ -727,8 +729,8 @@ class Interpreter(InterpreterBase, HoldableObject):
raise InterpreterException('Invalid dependency')
dep = dependencies.InternalDependency(version, incs, compile_args,
- link_args, libs, libs_whole, sources, deps,
- variables, d_module_versions, d_import_dirs,
+ link_args, libs, libs_whole, sources, extra_files,
+ deps, variables, d_module_versions, d_import_dirs,
objects)
return dep
diff --git a/mesonbuild/modules/external_project.py b/mesonbuild/modules/external_project.py
index 8b0ae93..e0c32da 100644
--- a/mesonbuild/modules/external_project.py
+++ b/mesonbuild/modules/external_project.py
@@ -274,7 +274,7 @@ class ExternalProject(NewExtensionModule):
link_args = [f'-L{abs_libdir}', f'-l{libname}']
sources = self.target
dep = InternalDependency(version, [], compile_args, link_args, [],
- [], [sources], [], {}, [], [], [])
+ [], [sources], [], [], {}, [], [], [])
return dep
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index b6577dc..d749c26 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -2154,7 +2154,7 @@ class GnomeModule(ExtensionModule):
# - add relevant directories to include dirs
incs = [build.IncludeDirs(state.subdir, ['.'] + vapi_includes, False)]
sources = [vapi_target] + vapi_depends
- rv = InternalDependency(None, incs, [], [], link_with, [], sources, [], {}, [], [], [])
+ rv = InternalDependency(None, incs, [], [], link_with, [], sources, [], [], {}, [], [], [])
created_values.append(rv)
return ModuleReturnValue(rv, created_values)