diff options
-rw-r--r-- | docs/markdown/snippets/dep_extra_files.md | 4 | ||||
-rw-r--r-- | docs/yaml/functions/declare_dependency.yaml | 7 | ||||
-rw-r--r-- | mesonbuild/build.py | 8 | ||||
-rw-r--r-- | mesonbuild/dependencies/base.py | 13 | ||||
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 6 | ||||
-rw-r--r-- | mesonbuild/modules/external_project.py | 2 | ||||
-rw-r--r-- | mesonbuild/modules/gnome.py | 2 |
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) |