mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-01 23:12:02 +00:00
Auto merge of #118448 - ZetaNumbers:link_arg_attribute, r=petrochenkov
Enable `link-arg` link kind inside of `#[link]` attribute https://github.com/rust-lang/rust/issues/99427#issuecomment-1234443468 > ... > This would help to make `link-arg` usable in `#[link]` attributes and e.g. wrap libc and libgcc into a group (*) in the libc crate like > > ``` > #[link(kind = "link-arg", name = "--start-group")] > #[link(kind = "static", name = "c")] > #[link(kind = "static", name = "gcc")] > #[link(kind = "link-arg", name = "--end-group")] > ``` > > (*) to address cyclic dependencies between them > > This is an analogue of CMake's LINKER: prefix (https://cmake.org/cmake/help/git-stage/command/target_link_options.html#handling-compiler-driver-differences), and was discussed as a possible future extension in the link modifier RFC (https://github.com/rust-lang/rfcs/blob/master/text/2951-native-link-modifiers.md#support-linkarg--string-in-addition-to-the-modifiers).
This commit is contained in:
commit
00796255c2
@ -500,6 +500,9 @@ declare_features! (
|
||||
(incomplete, lazy_type_alias, "1.72.0", Some(112792), None),
|
||||
/// Allows `if/while p && let q = r && ...` chains.
|
||||
(unstable, let_chains, "1.37.0", Some(53667), None),
|
||||
/// Allows using `#[link(kind = "link-arg", name = "...")]`
|
||||
/// to pass custom arguments to the linker.
|
||||
(unstable, link_arg_attribute, "CURRENT_RUSTC_VERSION", Some(99427), None),
|
||||
/// Allows using `reason` in lint attributes and the `#[expect(lint)]` lint check.
|
||||
(unstable, lint_reasons, "1.31.0", Some(54503), None),
|
||||
/// Give access to additional metadata about declarative macro meta-variables.
|
||||
|
@ -269,7 +269,7 @@ metadata_unknown_import_name_type =
|
||||
unknown import name type `{$import_name_type}`, expected one of: decorated, noprefix, undecorated
|
||||
|
||||
metadata_unknown_link_kind =
|
||||
unknown link kind `{$kind}`, expected one of: static, dylib, framework, raw-dylib
|
||||
unknown link kind `{$kind}`, expected one of: static, dylib, framework, raw-dylib, link-arg
|
||||
.label = unknown link kind
|
||||
|
||||
metadata_unknown_link_modifier =
|
||||
|
@ -160,6 +160,18 @@ impl<'tcx> Collector<'tcx> {
|
||||
}
|
||||
NativeLibKind::RawDylib
|
||||
}
|
||||
"link-arg" => {
|
||||
if !features.link_arg_attribute {
|
||||
feature_err(
|
||||
&sess.parse_sess,
|
||||
sym::link_arg_attribute,
|
||||
span,
|
||||
"link kind `link-arg` is unstable",
|
||||
)
|
||||
.emit();
|
||||
}
|
||||
NativeLibKind::LinkArg
|
||||
}
|
||||
kind => {
|
||||
sess.emit_err(errors::UnknownLinkKind { span, kind });
|
||||
continue;
|
||||
|
@ -934,6 +934,7 @@ symbols! {
|
||||
likely,
|
||||
line,
|
||||
link,
|
||||
link_arg_attribute,
|
||||
link_args,
|
||||
link_cfg,
|
||||
link_llvm_intrinsics,
|
||||
|
@ -0,0 +1,21 @@
|
||||
# `link_arg_attribute`
|
||||
|
||||
The tracking issue for this feature is: [#99427]
|
||||
|
||||
------
|
||||
|
||||
The `link_arg_attribute` feature allows passing arguments into the linker
|
||||
from inside of the source code. Order is preserved for link attributes as
|
||||
they were defined on a single extern block:
|
||||
|
||||
```rust,no_run
|
||||
#![feature(link_arg_attribute)]
|
||||
|
||||
#[link(kind = "link-arg", name = "--start-group")]
|
||||
#[link(kind = "static", name = "c")]
|
||||
#[link(kind = "static", name = "gcc")]
|
||||
#[link(kind = "link-arg", name = "--end-group")]
|
||||
extern "C" {}
|
||||
```
|
||||
|
||||
[#99427]: https://github.com/rust-lang/rust/issues/99427
|
@ -3,6 +3,9 @@
|
||||
include ../tools.mk
|
||||
|
||||
all:
|
||||
$(RUSTC) rs.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
|
||||
$(RUSTC) rs.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg:+verbatim=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
|
||||
$(RUSTC) rs.rs -Z unstable-options -C linker-flavor=ld -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
|
||||
$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
|
||||
$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=gnu-cc -l static=l1 -l link-arg:+verbatim=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
|
||||
$(RUSTC) empty.rs -Z unstable-options -C linker-flavor=ld -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
|
||||
$(RUSTC) attribute.rs -Z unstable-options -C linker-flavor=gnu-cc --print link-args | $(CGREP) -e 'l1.*-Wl,a1.*l2.*-Wl,a2.*d1.*-Wl,a3'
|
||||
$(RUSTC) --cfg 'feature="verbatim"' attribute.rs -Z unstable-options -C linker-flavor=gnu-cc --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*-Wl,a2.*d1.*-Wl,a3'
|
||||
$(RUSTC) attribute.rs -C linker-flavor=ld --print link-args | $(CGREP) -e 'l1.*"a1".*l2.*"a2".*d1.*"a3"'
|
||||
|
12
tests/run-make/pass-linker-flags-flavor/attribute.rs
Normal file
12
tests/run-make/pass-linker-flags-flavor/attribute.rs
Normal file
@ -0,0 +1,12 @@
|
||||
#![feature(link_arg_attribute)]
|
||||
|
||||
#[link(kind = "static", name = "l1")]
|
||||
#[cfg_attr(feature = "verbatim", link(kind = "link-arg", name = "a1", modifiers = "+verbatim"))]
|
||||
#[cfg_attr(not(feature = "verbatim"), link(kind = "link-arg", name = "a1"))]
|
||||
#[link(kind = "static", name = "l2")]
|
||||
#[link(kind = "link-arg", name = "a2")]
|
||||
#[link(kind = "dylib", name = "d1")]
|
||||
#[link(kind = "link-arg", name = "a3")]
|
||||
extern "C" {}
|
||||
|
||||
fn main() {}
|
@ -4,7 +4,9 @@ all:
|
||||
# Build deps
|
||||
$(RUSTC) native_dep_1.rs --crate-type=staticlib
|
||||
$(RUSTC) native_dep_2.rs --crate-type=staticlib
|
||||
$(RUSTC) rust_dep.rs -l static:-bundle=native_dep_1 -l link-arg=some_flag -l static:-bundle=native_dep_2 --crate-type=lib -Z unstable-options
|
||||
$(RUSTC) rust_dep_flag.rs -l static:-bundle=native_dep_1 -l link-arg=some_flag -l static:-bundle=native_dep_2 --crate-type=lib -Z unstable-options
|
||||
$(RUSTC) rust_dep_attr.rs --crate-type=lib
|
||||
|
||||
# Check sequence of linker args
|
||||
$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
|
||||
$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep_flag.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
|
||||
$(RUSTC) main.rs --extern lib=$(TMPDIR)/librust_dep_attr.rlib --crate-type=bin --print link-args | $(CGREP) -e 'native_dep_1.*some_flag.*native_dep_2'
|
||||
|
14
tests/run-make/pass-linker-flags-from-dep/rust_dep_attr.rs
Normal file
14
tests/run-make/pass-linker-flags-from-dep/rust_dep_attr.rs
Normal file
@ -0,0 +1,14 @@
|
||||
#![feature(link_arg_attribute)]
|
||||
|
||||
#[link(kind = "static", name = "native_dep_1", modifiers = "-bundle")]
|
||||
#[link(kind = "link-arg", name = "some_flag")]
|
||||
#[link(kind = "static", name = "native_dep_2", modifiers = "-bundle")]
|
||||
extern "C" {
|
||||
pub fn foo();
|
||||
}
|
||||
|
||||
pub fn f() {
|
||||
unsafe {
|
||||
foo();
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
include ../tools.mk
|
||||
|
||||
all:
|
||||
$(RUSTC) rs.rs -Z unstable-options -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
|
||||
$(RUSTC) empty.rs -Z unstable-options -l static=l1 -l link-arg=a1 -l static=l2 -l link-arg=a2 -l dylib=d1 -l link-arg=a3 --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
|
||||
$(RUSTC) attribute.rs --print link-args | $(CGREP) -e 'l1.*a1.*l2.*a2.*d1.*a3'
|
||||
|
11
tests/run-make/pass-linker-flags/attribute.rs
Normal file
11
tests/run-make/pass-linker-flags/attribute.rs
Normal file
@ -0,0 +1,11 @@
|
||||
#![feature(link_arg_attribute)]
|
||||
|
||||
#[link(kind = "static", name = "l1")]
|
||||
#[link(kind = "link-arg", name = "a1")]
|
||||
#[link(kind = "static", name = "l2")]
|
||||
#[link(kind = "link-arg", name = "a2")]
|
||||
#[link(kind = "dylib", name = "d1")]
|
||||
#[link(kind = "link-arg", name = "a3")]
|
||||
extern "C" {}
|
||||
|
||||
fn main() {}
|
@ -1,4 +1,4 @@
|
||||
error[E0458]: unknown link kind `wonderful_unicorn`, expected one of: static, dylib, framework, raw-dylib
|
||||
error[E0458]: unknown link kind `wonderful_unicorn`, expected one of: static, dylib, framework, raw-dylib, link-arg
|
||||
--> $DIR/E0458.rs:1:15
|
||||
|
|
||||
LL | #[link(kind = "wonderful_unicorn")] extern "C" {}
|
||||
|
@ -0,0 +1,5 @@
|
||||
#[link(kind = "link-arg", name = "foo")]
|
||||
//~^ ERROR link kind `link-arg` is unstable
|
||||
extern "C" {}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,12 @@
|
||||
error[E0658]: link kind `link-arg` is unstable
|
||||
--> $DIR/feature-gate-link-arg-attribute.rs:1:15
|
||||
|
|
||||
LL | #[link(kind = "link-arg", name = "foo")]
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #99427 <https://github.com/rust-lang/rust/issues/99427> for more information
|
||||
= help: add `#![feature(link_arg_attribute)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
@ -1,8 +1,7 @@
|
||||
// link-arg is not supposed to be usable in #[link] attributes
|
||||
#![feature(link_arg_attribute)]
|
||||
|
||||
// compile-flags:
|
||||
// error-pattern: error[E0458]: unknown link kind `link-arg`, expected one of: static, dylib, framework, raw-dylib
|
||||
|
||||
#[link(kind = "link-arg")]
|
||||
#[link(kind = "link-arg", name = "arg", modifiers = "+bundle")]
|
||||
//~^ ERROR linking modifier `bundle` is only compatible with `static` linking kind
|
||||
extern "C" {}
|
||||
|
||||
pub fn main() {}
|
||||
|
@ -1,16 +1,8 @@
|
||||
error[E0458]: unknown link kind `link-arg`, expected one of: static, dylib, framework, raw-dylib
|
||||
--> $DIR/link-arg-from-rs.rs:6:15
|
||||
error: linking modifier `bundle` is only compatible with `static` linking kind
|
||||
--> $DIR/link-arg-from-rs.rs:3:53
|
||||
|
|
||||
LL | #[link(kind = "link-arg")]
|
||||
| ^^^^^^^^^^ unknown link kind
|
||||
LL | #[link(kind = "link-arg", name = "arg", modifiers = "+bundle")]
|
||||
| ^^^^^^^^^
|
||||
|
||||
error[E0459]: `#[link]` attribute requires a `name = "string"` argument
|
||||
--> $DIR/link-arg-from-rs.rs:6:1
|
||||
|
|
||||
LL | #[link(kind = "link-arg")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `name` argument
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0458, E0459.
|
||||
For more information about an error, try `rustc --explain E0458`.
|
||||
|
Loading…
Reference in New Issue
Block a user