Skip to content

Commit 3bb01a7

Browse files
authored
Merge 63d47a3 into 9c1b6a9
2 parents 9c1b6a9 + 63d47a3 commit 3bb01a7

File tree

15 files changed

+102
-19
lines changed

15 files changed

+102
-19
lines changed

docs/markdown/snippets/dep_objects.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
## New `declare_dependency(objects: )` argument
2+
3+
A new argument to `declare_dependency` makes it possible to add objects
4+
directly to executables that use an internal dependency, without going
5+
for example through `link_whole`.

docs/markdown/snippets/gen_objects.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## Generated objects can be passed in the `objects:` keyword argument
2+
3+
In previous versions of Meson, generated objects could only be
4+
passed as sources of a build target. This was confusing, therefore
5+
generated objects can now be passed in the `objects:` keyword
6+
argument as well.

docs/yaml/functions/_build_target_base.yaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,14 @@ kwargs:
191191
(but *not* before that). On Windows, this argument has no effect.
192192
193193
objects:
194-
type: list[extracted_obj]
194+
type: list[extracted_obj | file | str]
195195
description: |
196-
List of prebuilt object files (usually for third party
197-
products you don't have source to) that should be linked in this
198-
target, **never** use this for object files that you build yourself.
196+
List of object files that should be linked in this target.
197+
198+
**Since 1.1.0** this can include generated files in addition to
199+
object files that you don't have source to or that object files
200+
produced by other build targets. In earlier release, generated
201+
object files had to be placed in `sources`.
199202
200203
name_prefix:
201204
type: str | list[void]

docs/yaml/functions/declare_dependency.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,10 @@ kwargs:
7171
description: |
7272
the directories to add to the string search path (i.e. `-J` switch for DMD).
7373
Must be [[@inc]] objects or plain strings.
74+
75+
objects:
76+
type: list[extracted_obj]
77+
since: 1.1.0
78+
description: |
79+
a list of object files, to be linked directly into the targets that use the
80+
dependency.

docs/yaml/objects/build_tgt.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ methods:
1313
source files. This is typically used to take single object files and link
1414
them to unit tests or to compile some source files with custom flags. To
1515
use the object file(s) in another build target, use the
16-
`objects:` keyword argument to a [[build_target]] or include them in the command
17-
line of a [[custom_target]].
16+
`objects:` keyword argument to a [[build_target]] or [[declare_dependency]],
17+
or include them in the command line of a [[custom_target]].
1818
varargs:
1919
name: source
2020
type: str | file

mesonbuild/build.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -774,12 +774,11 @@ def process_objectlist(self, objects):
774774
for s in objects:
775775
if isinstance(s, (str, File, ExtractedObjects)):
776776
self.objects.append(s)
777-
elif isinstance(s, (GeneratedList, CustomTarget)):
778-
msg = 'Generated files are not allowed in the \'objects\' kwarg ' + \
779-
f'for target {self.name!r}.\nIt is meant only for ' + \
780-
'pre-built object files that are shipped with the\nsource ' + \
781-
'tree. Try adding it in the list of sources.'
782-
raise InvalidArguments(msg)
777+
elif isinstance(s, (CustomTarget, CustomTargetIndex, GeneratedList)):
778+
non_objects = [o for o in s.get_outputs() if not is_object(o)]
779+
if non_objects:
780+
raise InvalidArguments(f'Generated file {non_objects[0]} in the \'objects\' kwarg is not an object.')
781+
self.generated.append(s)
783782
else:
784783
raise InvalidArguments(f'Bad object of type {type(s).__name__!r} in target {self.name!r}.')
785784

@@ -1292,6 +1291,7 @@ def add_deps(self, deps):
12921291
# Those parts that are internal.
12931292
self.process_sourcelist(dep.sources)
12941293
self.add_include_dirs(dep.include_directories, dep.get_include_type())
1294+
self.objects.extend(dep.objects)
12951295
for l in dep.libraries:
12961296
self.link(l)
12971297
for l in dep.whole_libraries:

mesonbuild/dependencies/base.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,12 @@
3131

3232
if T.TYPE_CHECKING:
3333
from .._typing import ImmutableListProtocol
34-
from ..build import StructuredSources
3534
from ..compilers.compilers import Compiler
3635
from ..environment import Environment
3736
from ..interpreterbase import FeatureCheckBase
3837
from ..build import (
3938
CustomTarget, IncludeDirs, CustomTargetIndex, LibTypes,
40-
StaticLibrary
39+
StaticLibrary, StructuredSources, ExtractedObjects
4140
)
4241
from ..mesonlib import FileOrString
4342

@@ -252,7 +251,8 @@ def __init__(self, version: str, incdirs: T.List['IncludeDirs'], compile_args: T
252251
whole_libraries: T.List[T.Union[StaticLibrary, CustomTarget, CustomTargetIndex]],
253252
sources: T.Sequence[T.Union[FileOrString, CustomTarget, StructuredSources]],
254253
ext_deps: T.List[Dependency], variables: T.Dict[str, str],
255-
d_module_versions: T.List[T.Union[str, int]], d_import_dirs: T.List['IncludeDirs']):
254+
d_module_versions: T.List[T.Union[str, int]], d_import_dirs: T.List['IncludeDirs'],
255+
objects: T.List['ExtractedObjects']):
256256
super().__init__(DependencyTypeName('internal'), {})
257257
self.version = version
258258
self.is_found = True
@@ -264,6 +264,7 @@ def __init__(self, version: str, incdirs: T.List['IncludeDirs'], compile_args: T
264264
self.sources = list(sources)
265265
self.ext_deps = ext_deps
266266
self.variables = variables
267+
self.objects = objects
267268
if d_module_versions:
268269
self.d_features['versions'] = d_module_versions
269270
if d_import_dirs:

mesonbuild/interpreter/interpreter.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,12 +670,14 @@ def func_files(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwa
670670
SOURCES_KW,
671671
VARIABLES_KW.evolve(since='0.54.0', since_values={list: '0.56.0'}),
672672
KwargInfo('version', (str, NoneType)),
673+
KwargInfo('objects', ContainerTypeInfo(list, build.ExtractedObjects), listify=True, default=[], since='1.1.0'),
673674
)
674675
def func_declare_dependency(self, node, args, kwargs):
675676
deps = kwargs['dependencies']
676677
incs = self.extract_incdirs(kwargs)
677678
libs = kwargs['link_with']
678679
libs_whole = kwargs['link_whole']
680+
objects = kwargs['objects']
679681
sources = self.source_strings_to_files(kwargs['sources'])
680682
compile_args = kwargs['compile_args']
681683
link_args = kwargs['link_args']
@@ -703,7 +705,8 @@ def func_declare_dependency(self, node, args, kwargs):
703705

704706
dep = dependencies.InternalDependency(version, incs, compile_args,
705707
link_args, libs, libs_whole, sources, deps,
706-
variables, d_module_versions, d_import_dirs)
708+
variables, d_module_versions, d_import_dirs,
709+
objects)
707710
return dep
708711

709712
@typed_pos_args('assert', bool, optargs=[str])

mesonbuild/modules/pkgconfig.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ def _process_libs(
193193
self.add_version_reqs(obj.name, obj.version_reqs)
194194
elif isinstance(obj, dependencies.InternalDependency):
195195
if obj.found():
196+
if obj.objects:
197+
raise mesonlib.MesonException('.pc file cannot refer to individual object files.')
196198
processed_libs += obj.get_link_args()
197199
processed_cflags += obj.get_compile_args()
198200
self._add_lib_dependencies(obj.libraries, obj.whole_libraries, obj.ext_deps, public, private_external_deps=True)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
void bar() {}

0 commit comments

Comments
 (0)