Skip to content

Commit cc776fb

Browse files
committed
cargo: add support for [package]:links
1 parent 5386f95 commit cc776fb

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

mesonbuild/cargo/cargo.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ def __parse_lib(self, builder: NodeBuilder) -> None:
361361
# We always call the list of dependencies "dependencies",
362362
# if there are dependencies we can add them. There could
363363
# be an empty dependencies section, so account for that
364-
if self.manifest.get('dependencies') or self.manifest.get('target'):
364+
if self.manifest.get('dependencies') or self.manifest.get('target') or self.manifest['package'].get('links'):
365365
fbuilder.keyword('dependencies', builder.id('dependencies'))
366366

367367
# Always mark everything as build by default false, that way meson will
@@ -586,6 +586,18 @@ def __emit_dependencies(self, builder: NodeBuilder) -> None:
586586
if isinstance(dep, str) or not dep.get('optional', False):
587587
arbuilder.positional(self.__get_dependency(builder, name))
588588

589+
# If we need to link with a system library, we'll first try a
590+
# dependency
591+
#
592+
# TODO: if that doesn't work, we need to fall back to adding a C
593+
# compiler and running c.find_library()
594+
if self.manifest['package'].get('links'):
595+
with builder.assignment_builder('link_library') as abuilder:
596+
with abuilder.function_builder('dependency') as argbuilder:
597+
argbuilder.positional(self.manifest['package']['links'])
598+
with builder.plus_assignment_builder('dependencies') as pabuilder:
599+
pabuilder.reference('link_library')
600+
589601
# If it's optional, then we need to check that the feature that
590602
# it depends on is available, then add it to the dependency array.
591603
for name, requires in self.features_to_deps.items():
@@ -691,7 +703,7 @@ def parse(self) -> T.Tuple['mparser.CodeBlockNode', 'mparser.CodeBlockNode']:
691703

692704
# Create a list of dependencies which will be added to the library (if
693705
# there is one).
694-
if self.manifest.get('dependencies') or self.manifest.get('target'):
706+
if self.manifest.get('dependencies') or self.manifest.get('target') or self.manifest['package'].get('links'):
695707
self.__emit_dependencies(builder)
696708
if self.manifest.get('dev-dependencies'):
697709
self.__emit_dev_dependencies(builder)

mesonbuild/cargo/nodebuilder.py

+3
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ def array_builder(self) -> T.Iterator[ArgumentBuilder]:
215215
array = mparser.ArrayNode(b.finalize(), 0, 0, 0, 0) # _builder.array expects raw arguments
216216
self._node = self._builder.plus_assign(self.name, array)
217217

218+
def reference(self, name: str) -> None:
219+
self._node = self._builder.plus_assign(self.name, self._builder.id(name))
220+
218221
def finalize(self) -> mparser.PlusAssignmentNode:
219222
assert self._node is not None, 'You need to build an assignment before finalizing'
220223
return self._node

0 commit comments

Comments
 (0)