Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "objects" support to Rust targets #14031

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

bonzini
Copy link
Collaborator

@bonzini bonzini commented Dec 20, 2024

Because rustc does not support extract_objects, QEMU creates a static library
with all the C objects. It then passes this static library as link_whole,
together with another static library containing general purpose utility
functions which is passed as link_with.

However, this is brittle because the two have a circular dependency and
they cannot be merged because of the link_whole/link_with difference.
While lld seems to have the --start-group/--end-group semantics
automatically, ld.bfd can fail if these options are needed. This can
cause difference between distros depending on how Rust is packaged
(e.g. Ubuntu 22.04 and Debian bookworm seem to use ld.bfd).

The simplest solution is for Meson to implement "objects:" properly
for Rust. Then QEMU can use the same internal dependency objects that it
already has in place for C programs.

To limit conflicts, this PR includes part of #13933.

@@ -27,7 +27,7 @@

if T.TYPE_CHECKING:
from .. import coredata
from ..build import BuildTarget, DFeatures
from ..build import BuildTarget, BuildTargetTypes, DFeatures

Check failure

Code scanning / CodeQL

Module-level cyclic import

'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](4) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](5) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](6) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](7) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](8) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](9) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](10) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](11) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](12) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](13) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](14) of mesonbuild.compilers.compilers. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](15) of mesonbuild.compilers.compilers.
@@ -27,7 +27,7 @@

if T.TYPE_CHECKING:
from .. import coredata
from ..build import BuildTarget, DFeatures
from ..build import BuildTarget, BuildTargetTypes, DFeatures

Check failure

Code scanning / CodeQL

Module-level cyclic import

'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](4) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](5) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](6) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](7) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](8) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](9) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](10) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](11) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](12) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](13) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](14) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](15) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of BuildTargetTypes occurs after the cyclic [import](4) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of BuildTargetTypes occurs after the cyclic [import](5) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of BuildTargetTypes occurs after the cyclic [import](6) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of BuildTargetTypes occurs after the cyclic [import](7) of mesonbuild.compilers.compilers. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), a
@@ -27,7 +27,7 @@

if T.TYPE_CHECKING:
from .. import coredata
from ..build import BuildTarget, DFeatures
from ..build import BuildTarget, BuildTargetTypes, DFeatures

Check failure

Code scanning / CodeQL

Module-level cyclic import

'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](4) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](5) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](6) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](7) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](8) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](9) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](10) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](11) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](12) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](13) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](14) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](3) of DFeatures occurs after the cyclic [import](15) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of DFeatures occurs after the cyclic [import](4) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of DFeatures occurs after the cyclic [import](5) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of DFeatures occurs after the cyclic [import](6) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of DFeatures occurs after the cyclic [import](7) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2), as the [definition](16) of DFeatures occurs after the cyclic [import](8) of mesonbuild.compilers.compilers. 'DFeatures' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.compilers](2)
@@ -27,6 +28,7 @@
)

if T.TYPE_CHECKING:
from ..build import BuildTarget, BuildTargetTypes

Check failure

Code scanning / CodeQL

Module-level cyclic import

'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](4) of mesonbuild.compilers.fortran. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](5) of mesonbuild.compilers.fortran. 'BuildTarget' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](3) of BuildTarget occurs after the cyclic [import](6) of mesonbuild.compilers.fortran.
@@ -27,6 +28,7 @@
)

if T.TYPE_CHECKING:
from ..build import BuildTarget, BuildTargetTypes

Check failure

Code scanning / CodeQL

Module-level cyclic import

'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](4) of mesonbuild.compilers.fortran. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](5) of mesonbuild.compilers.fortran. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](3) of BuildTargetTypes occurs after the cyclic [import](6) of mesonbuild.compilers.fortran. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](7) of BuildTargetTypes occurs after the cyclic [import](4) of mesonbuild.compilers.fortran. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](7) of BuildTargetTypes occurs after the cyclic [import](5) of mesonbuild.compilers.fortran. 'BuildTargetTypes' may not be defined if module [mesonbuild.build](1) is imported before module [mesonbuild.compilers.fortran](2), as the [definition](7) of BuildTargetTypes occurs after the cyclic [import](6) of mesonbuild.compilers.fortran.
@bonzini bonzini changed the title Add "objects" support to Rust executables Add "objects" support to Rust targets Dec 20, 2024
@bonzini bonzini marked this pull request as ready for review December 20, 2024 17:22
@bonzini bonzini added this to the 1.7 milestone Dec 31, 2024
@bonzini bonzini force-pushed the rust-objects-kwarg branch 2 times, most recently from f7a3ed7 to 8ad3774 Compare January 8, 2025 07:13
@bonzini bonzini modified the milestones: 1.7, 1.8 Jan 9, 2025
@bonzini bonzini force-pushed the rust-objects-kwarg branch from 8ad3774 to b29f0c9 Compare January 10, 2025 09:17
@bonzini bonzini force-pushed the rust-objects-kwarg branch from b29f0c9 to 2607998 Compare January 31, 2025 15:13
@bonzini bonzini force-pushed the rust-objects-kwarg branch from 2607998 to 7f48312 Compare February 1, 2025 10:35
Allow reusing the code for doctests.  In particular, the sources are
shared between the two cases.

Signed-off-by: Paolo Bonzini <[email protected]>
All Fortran-specific handling of "objects:" is for now in generate_target();
parts of it can be reused for Rust.

Even though Rust is only supported by the ninja backend, move the Fortran
handling entirely outside ninjabackend.py: it's not specific to Ninja,
it can be implemented easily using inheritance, and it also gets better
typing this way.

Signed-off-by: Paolo Bonzini <[email protected]>
Because rustc does not support extract_objects, QEMU creates a static library
with all the C objects. It then passes this static library as link_whole,
together with another static library containing general purpose utility
functions which is passed as link_with.

However, this is brittle because the two have a circular dependency and
they cannot be merged because of the link_whole/link_with difference.
While lld seems to have the --start-group/--end-group semantics
automatically, ld.bfd can fail if these options are needed. This can
cause difference between distros depending on how Rust is packaged
(e.g. Ubuntu 22.04 and Debian bookworm seem to use ld.bfd).

The simplest solution is for Meson to implement "objects:" properly
for Rust.  Then QEMU can use the same internal dependency objects that it
already has in place for C programs.

Signed-off-by: Paolo Bonzini <[email protected]>
@bonzini bonzini force-pushed the rust-objects-kwarg branch from 7f48312 to cd9e8af Compare February 4, 2025 08:07
@bonzini bonzini mentioned this pull request Feb 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant