Stabilize native library modifier verbatim
This commit is contained in:
parent
454784afba
commit
5b0e80ecf3
@ -377,12 +377,8 @@ fn link_rlib<'a>(
|
|||||||
find_native_static_library(name.as_str(), lib.verbatim, &lib_search_paths, sess);
|
find_native_static_library(name.as_str(), lib.verbatim, &lib_search_paths, sess);
|
||||||
if sess.opts.unstable_opts.packed_bundled_libs && flavor == RlibFlavor::Normal {
|
if sess.opts.unstable_opts.packed_bundled_libs && flavor == RlibFlavor::Normal {
|
||||||
let filename = lib.filename.unwrap();
|
let filename = lib.filename.unwrap();
|
||||||
let lib_path = find_native_static_library(
|
let lib_path =
|
||||||
filename.as_str(),
|
find_native_static_library(filename.as_str(), true, &lib_search_paths, sess);
|
||||||
Some(true),
|
|
||||||
&lib_search_paths,
|
|
||||||
sess,
|
|
||||||
);
|
|
||||||
let src = read(lib_path)
|
let src = read(lib_path)
|
||||||
.map_err(|e| sess.emit_fatal(errors::ReadFileError { message: e }))?;
|
.map_err(|e| sess.emit_fatal(errors::ReadFileError { message: e }))?;
|
||||||
let (data, _) = create_wrapper_file(sess, b".bundled_lib".to_vec(), &src);
|
let (data, _) = create_wrapper_file(sess, b".bundled_lib".to_vec(), &src);
|
||||||
@ -465,7 +461,7 @@ fn collate_raw_dylibs<'a, 'b>(
|
|||||||
|
|
||||||
for lib in used_libraries {
|
for lib in used_libraries {
|
||||||
if lib.kind == NativeLibKind::RawDylib {
|
if lib.kind == NativeLibKind::RawDylib {
|
||||||
let ext = if matches!(lib.verbatim, Some(true)) { "" } else { ".dll" };
|
let ext = if lib.verbatim { "" } else { ".dll" };
|
||||||
let name = format!("{}{}", lib.name.expect("unnamed raw-dylib library"), ext);
|
let name = format!("{}{}", lib.name.expect("unnamed raw-dylib library"), ext);
|
||||||
let imports = dylib_table.entry(name.clone()).or_default();
|
let imports = dylib_table.entry(name.clone()).or_default();
|
||||||
for import in &lib.dll_imports {
|
for import in &lib.dll_imports {
|
||||||
@ -1335,7 +1331,7 @@ fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLib]) {
|
|||||||
NativeLibKind::Static { bundle: Some(false), .. }
|
NativeLibKind::Static { bundle: Some(false), .. }
|
||||||
| NativeLibKind::Dylib { .. }
|
| NativeLibKind::Dylib { .. }
|
||||||
| NativeLibKind::Unspecified => {
|
| NativeLibKind::Unspecified => {
|
||||||
let verbatim = lib.verbatim.unwrap_or(false);
|
let verbatim = lib.verbatim;
|
||||||
if sess.target.is_like_msvc {
|
if sess.target.is_like_msvc {
|
||||||
Some(format!("{}{}", name, if verbatim { "" } else { ".lib" }))
|
Some(format!("{}{}", name, if verbatim { "" } else { ".lib" }))
|
||||||
} else if sess.target.linker_flavor.is_gnu() {
|
} else if sess.target.linker_flavor.is_gnu() {
|
||||||
@ -2306,7 +2302,7 @@ fn add_native_libs_from_crate(
|
|||||||
_ => &codegen_results.crate_info.native_libraries[&cnum],
|
_ => &codegen_results.crate_info.native_libraries[&cnum],
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut last = (None, NativeLibKind::Unspecified, None);
|
let mut last = (None, NativeLibKind::Unspecified, false);
|
||||||
for lib in native_libs {
|
for lib in native_libs {
|
||||||
let Some(name) = lib.name else {
|
let Some(name) = lib.name else {
|
||||||
continue;
|
continue;
|
||||||
@ -2323,7 +2319,7 @@ fn add_native_libs_from_crate(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let name = name.as_str();
|
let name = name.as_str();
|
||||||
let verbatim = lib.verbatim.unwrap_or(false);
|
let verbatim = lib.verbatim;
|
||||||
match lib.kind {
|
match lib.kind {
|
||||||
NativeLibKind::Static { bundle, whole_archive } => {
|
NativeLibKind::Static { bundle, whole_archive } => {
|
||||||
if link_static {
|
if link_static {
|
||||||
|
@ -515,7 +515,7 @@ fn link_whole_staticlib(&mut self, lib: &str, verbatim: bool, search_path: &[Pat
|
|||||||
// -force_load is the macOS equivalent of --whole-archive, but it
|
// -force_load is the macOS equivalent of --whole-archive, but it
|
||||||
// involves passing the full path to the library to link.
|
// involves passing the full path to the library to link.
|
||||||
self.linker_arg("-force_load");
|
self.linker_arg("-force_load");
|
||||||
let lib = find_native_static_library(lib, Some(verbatim), search_path, &self.sess);
|
let lib = find_native_static_library(lib, verbatim, search_path, &self.sess);
|
||||||
self.linker_arg(&lib);
|
self.linker_arg(&lib);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ pub struct NativeLib {
|
|||||||
pub name: Option<Symbol>,
|
pub name: Option<Symbol>,
|
||||||
pub filename: Option<Symbol>,
|
pub filename: Option<Symbol>,
|
||||||
pub cfg: Option<ast::MetaItem>,
|
pub cfg: Option<ast::MetaItem>,
|
||||||
pub verbatim: Option<bool>,
|
pub verbatim: bool,
|
||||||
pub dll_imports: Vec<cstore::DllImport>,
|
pub dll_imports: Vec<cstore::DllImport>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ fn from(lib: &cstore::NativeLib) -> Self {
|
|||||||
filename: lib.filename,
|
filename: lib.filename,
|
||||||
name: lib.name,
|
name: lib.name,
|
||||||
cfg: lib.cfg.clone(),
|
cfg: lib.cfg.clone(),
|
||||||
verbatim: lib.verbatim,
|
verbatim: lib.verbatim.unwrap_or(false),
|
||||||
dll_imports: lib.dll_imports.clone(),
|
dll_imports: lib.dll_imports.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -237,6 +237,8 @@ macro_rules! declare_features {
|
|||||||
(accepted, native_link_modifiers, "1.61.0", Some(81490), None),
|
(accepted, native_link_modifiers, "1.61.0", Some(81490), None),
|
||||||
/// Allows specifying the bundle link modifier
|
/// Allows specifying the bundle link modifier
|
||||||
(accepted, native_link_modifiers_bundle, "1.63.0", Some(81490), None),
|
(accepted, native_link_modifiers_bundle, "1.63.0", Some(81490), None),
|
||||||
|
/// Allows specifying the verbatim link modifier
|
||||||
|
(accepted, native_link_modifiers_verbatim, "CURRENT_RUSTC_VERSION", Some(81490), None),
|
||||||
/// Allows specifying the whole-archive link modifier
|
/// Allows specifying the whole-archive link modifier
|
||||||
(accepted, native_link_modifiers_whole_archive, "1.61.0", Some(81490), None),
|
(accepted, native_link_modifiers_whole_archive, "1.61.0", Some(81490), None),
|
||||||
/// Allows using non lexical lifetimes (RFC 2094).
|
/// Allows using non lexical lifetimes (RFC 2094).
|
||||||
|
@ -455,8 +455,6 @@ pub fn set(&self, features: &mut Features, span: Span) {
|
|||||||
(active, naked_functions, "1.9.0", Some(32408), None),
|
(active, naked_functions, "1.9.0", Some(32408), None),
|
||||||
/// Allows specifying the as-needed link modifier
|
/// Allows specifying the as-needed link modifier
|
||||||
(active, native_link_modifiers_as_needed, "1.53.0", Some(81490), None),
|
(active, native_link_modifiers_as_needed, "1.53.0", Some(81490), None),
|
||||||
/// Allows specifying the verbatim link modifier
|
|
||||||
(active, native_link_modifiers_verbatim, "1.53.0", Some(81490), None),
|
|
||||||
/// Allow negative trait implementations.
|
/// Allow negative trait implementations.
|
||||||
(active, negative_impls, "1.44.0", Some(68318), None),
|
(active, negative_impls, "1.44.0", Some(68318), None),
|
||||||
/// Allows the `!` type. Does not imply 'exhaustive_patterns' (below) any more.
|
/// Allows the `!` type. Does not imply 'exhaustive_patterns' (below) any more.
|
||||||
|
@ -29,11 +29,11 @@
|
|||||||
|
|
||||||
pub fn find_native_static_library(
|
pub fn find_native_static_library(
|
||||||
name: &str,
|
name: &str,
|
||||||
verbatim: Option<bool>,
|
verbatim: bool,
|
||||||
search_paths: &[PathBuf],
|
search_paths: &[PathBuf],
|
||||||
sess: &Session,
|
sess: &Session,
|
||||||
) -> PathBuf {
|
) -> PathBuf {
|
||||||
let formats = if verbatim.unwrap_or(false) {
|
let formats = if verbatim {
|
||||||
vec![("".into(), "".into())]
|
vec![("".into(), "".into())]
|
||||||
} else {
|
} else {
|
||||||
let os = (sess.target.staticlib_prefix.clone(), sess.target.staticlib_suffix.clone());
|
let os = (sess.target.staticlib_prefix.clone(), sess.target.staticlib_suffix.clone());
|
||||||
@ -52,7 +52,7 @@ pub fn find_native_static_library(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sess.emit_fatal(MissingNativeLibrary::new(name, verbatim.unwrap_or(false)));
|
sess.emit_fatal(MissingNativeLibrary::new(name, verbatim));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_bundled_library(
|
fn find_bundled_library(
|
||||||
@ -66,7 +66,7 @@ fn find_bundled_library(
|
|||||||
let NativeLibKind::Static { bundle: Some(true) | None, .. } = kind {
|
let NativeLibKind::Static { bundle: Some(true) | None, .. } = kind {
|
||||||
find_native_static_library(
|
find_native_static_library(
|
||||||
name.unwrap().as_str(),
|
name.unwrap().as_str(),
|
||||||
verbatim,
|
verbatim.unwrap_or(false),
|
||||||
&sess.target_filesearch(PathKind::Native).search_path_dirs(),
|
&sess.target_filesearch(PathKind::Native).search_path_dirs(),
|
||||||
sess,
|
sess,
|
||||||
).file_name().and_then(|s| s.to_str()).map(Symbol::intern)
|
).file_name().and_then(|s| s.to_str()).map(Symbol::intern)
|
||||||
@ -311,10 +311,7 @@ fn process_item(&mut self, id: rustc_hir::ItemId) {
|
|||||||
sess.emit_err(BundleNeedsStatic { span });
|
sess.emit_err(BundleNeedsStatic { span });
|
||||||
}
|
}
|
||||||
|
|
||||||
("verbatim", _) => {
|
("verbatim", _) => assign_modifier(&mut verbatim),
|
||||||
report_unstable_modifier!(native_link_modifiers_verbatim);
|
|
||||||
assign_modifier(&mut verbatim)
|
|
||||||
}
|
|
||||||
|
|
||||||
("whole-archive", Some(NativeLibKind::Static { whole_archive, .. })) => {
|
("whole-archive", Some(NativeLibKind::Static { whole_archive, .. })) => {
|
||||||
assign_modifier(whole_archive)
|
assign_modifier(whole_archive)
|
||||||
|
@ -2029,10 +2029,7 @@ fn parse_native_lib_modifiers(
|
|||||||
"linking modifier `bundle` is only compatible with `static` linking kind",
|
"linking modifier `bundle` is only compatible with `static` linking kind",
|
||||||
),
|
),
|
||||||
|
|
||||||
("verbatim", _) => {
|
("verbatim", _) => assign_modifier(&mut verbatim),
|
||||||
report_unstable_modifier();
|
|
||||||
assign_modifier(&mut verbatim)
|
|
||||||
}
|
|
||||||
|
|
||||||
("whole-archive", NativeLibKind::Static { whole_archive, .. }) => {
|
("whole-archive", NativeLibKind::Static { whole_archive, .. }) => {
|
||||||
assign_modifier(whole_archive)
|
assign_modifier(whole_archive)
|
||||||
|
@ -104,6 +104,33 @@ This modifier has no effect when building other targets like executables or dyna
|
|||||||
|
|
||||||
The default for this modifier is `+bundle`.
|
The default for this modifier is `+bundle`.
|
||||||
|
|
||||||
|
### Linking modifiers: `verbatim`
|
||||||
|
|
||||||
|
This modifier is compatible with all linking kinds.
|
||||||
|
|
||||||
|
`+verbatim` means that rustc itself won't add any target-specified library prefixes or suffixes
|
||||||
|
(like `lib` or `.a`) to the library name, and will try its best to ask for the same thing from the
|
||||||
|
linker.
|
||||||
|
|
||||||
|
For `ld`-like linkers supporting GNU extensions rustc will use the `-l:filename` syntax (note the
|
||||||
|
colon) when passing the library, so the linker won't add any prefixes or suffixes to it.
|
||||||
|
See [`-l namespec`](https://sourceware.org/binutils/docs/ld/Options.html) in ld documentation for
|
||||||
|
more details. \
|
||||||
|
For linkers not supporting any verbatim modifiers (e.g. `link.exe` or `ld64`) the library name will
|
||||||
|
be passed as is. So the most reliable cross-platform use scenarios for this option are when no
|
||||||
|
linker is involved, for example bundling native libraries into rlibs.
|
||||||
|
|
||||||
|
`-verbatim` means that rustc will either add a target-specific prefix and suffix to the library
|
||||||
|
name before passing it to linker, or won't prevent linker from implicitly adding it. \
|
||||||
|
In case of `raw-dylib` kind in particular `.dll` will be added to the library name on Windows.
|
||||||
|
|
||||||
|
The default for this modifier is `-verbatim`.
|
||||||
|
|
||||||
|
NOTE: Even with `+verbatim` and `-l:filename` syntax `ld`-like linkers do not typically support
|
||||||
|
passing absolute paths to libraries. Usually such paths need to be passed as input files without
|
||||||
|
using any options like `-l`, e.g. `ld /my/absolute/path`. \
|
||||||
|
`-Clink-arg=/my/absolute/path` can be used for doing this from stable `rustc`.
|
||||||
|
|
||||||
<a id="option-crate-type"></a>
|
<a id="option-crate-type"></a>
|
||||||
## `--crate-type`: a list of types of crates for the compiler to emit
|
## `--crate-type`: a list of types of crates for the compiler to emit
|
||||||
|
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
# `native_link_modifiers_verbatim`
|
|
||||||
|
|
||||||
The tracking issue for this feature is: [#81490]
|
|
||||||
|
|
||||||
[#81490]: https://github.com/rust-lang/rust/issues/81490
|
|
||||||
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
The `native_link_modifiers_verbatim` feature allows you to use the `verbatim` modifier.
|
|
||||||
|
|
||||||
`+verbatim` means that rustc itself won't add any target-specified library prefixes or suffixes (like `lib` or `.a`) to the library name, and will try its best to ask for the same thing from the linker.
|
|
||||||
|
|
||||||
For `ld`-like linkers rustc will use the `-l:filename` syntax (note the colon) when passing the library, so the linker won't add any prefixes or suffixes as well.
|
|
||||||
See [`-l namespec`](https://sourceware.org/binutils/docs/ld/Options.html) in ld documentation for more details.
|
|
||||||
For linkers not supporting any verbatim modifiers (e.g. `link.exe` or `ld64`) the library name will be passed as is.
|
|
||||||
|
|
||||||
The default for this modifier is `-verbatim`.
|
|
||||||
|
|
||||||
This RFC changes the behavior of `raw-dylib` linking kind specified by [RFC 2627](https://github.com/rust-lang/rfcs/pull/2627). The `.dll` suffix (or other target-specified suffixes for other targets) is now added automatically.
|
|
||||||
If your DLL doesn't have the `.dll` suffix, it can be specified with `+verbatim`.
|
|
@ -6,10 +6,10 @@ include ../../run-make-fulldeps/tools.mk
|
|||||||
all:
|
all:
|
||||||
# Verbatim allows specify precise name.
|
# Verbatim allows specify precise name.
|
||||||
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/local_some_strange_name.ext
|
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/local_some_strange_name.ext
|
||||||
$(RUSTC) main.rs -Zunstable-options -l static:+verbatim=local_some_strange_name.ext
|
$(RUSTC) main.rs -l static:+verbatim=local_some_strange_name.ext
|
||||||
|
|
||||||
# With verbatim any other name cannot be used (local).
|
# With verbatim any other name cannot be used (local).
|
||||||
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/liblocal_native_dep.a
|
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/liblocal_native_dep.a
|
||||||
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/local_native_dep.a
|
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/local_native_dep.a
|
||||||
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/local_native_dep.lib
|
$(RUSTC) local_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/local_native_dep.lib
|
||||||
$(RUSTC) main.rs -Zunstable-options -l static:+verbatim=local_native_dep 2>&1 | $(CGREP) "local_native_dep"
|
$(RUSTC) main.rs -l static:+verbatim=local_native_dep 2>&1 | $(CGREP) "local_native_dep"
|
||||||
|
@ -3,10 +3,10 @@ include ../../run-make-fulldeps/tools.mk
|
|||||||
all:
|
all:
|
||||||
# Verbatim allows specify precise name.
|
# Verbatim allows specify precise name.
|
||||||
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/upstream_some_strange_name.ext
|
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/upstream_some_strange_name.ext
|
||||||
$(RUSTC) rust_dep.rs -Zunstable-options -l static:+verbatim=upstream_some_strange_name.ext --crate-type rlib
|
$(RUSTC) rust_dep.rs -l static:+verbatim=upstream_some_strange_name.ext --crate-type rlib
|
||||||
|
|
||||||
# With verbatim any other name cannot be used (upstream).
|
# With verbatim any other name cannot be used (upstream).
|
||||||
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/libupstream_native_dep.a
|
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/libupstream_native_dep.a
|
||||||
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/upstream_native_dep.a
|
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/upstream_native_dep.a
|
||||||
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/upstream_native_dep.lib
|
$(RUSTC) upstream_native_dep.rs --crate-type=staticlib -o $(TMPDIR)/upstream_native_dep.lib
|
||||||
$(RUSTC) rust_dep.rs -Zunstable-options -l static:+verbatim=upstream_native_dep --crate-type rlib 2>&1 | $(CGREP) "upstream_native_dep"
|
$(RUSTC) rust_dep.rs -l static:+verbatim=upstream_native_dep --crate-type rlib 2>&1 | $(CGREP) "upstream_native_dep"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#![feature(raw_dylib, native_link_modifiers_verbatim)]
|
#![feature(raw_dylib)]
|
||||||
|
|
||||||
#[link(name = "extern_1.dll", kind = "raw-dylib", modifiers = "+verbatim")]
|
#[link(name = "extern_1.dll", kind = "raw-dylib", modifiers = "+verbatim")]
|
||||||
extern {
|
extern {
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#![feature(native_link_modifiers_verbatim)]
|
|
||||||
#[link(name = "native_dep.ext", kind = "static", modifiers = "+verbatim")]
|
#[link(name = "native_dep.ext", kind = "static", modifiers = "+verbatim")]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn native_f1() -> i32;
|
fn native_f1() -> i32;
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
#[link(name = "foo", modifiers = "+verbatim")]
|
|
||||||
//~^ ERROR: linking modifier `verbatim` is unstable
|
|
||||||
extern "C" {}
|
|
||||||
|
|
||||||
fn main() {}
|
|
@ -1,12 +0,0 @@
|
|||||||
error[E0658]: linking modifier `verbatim` is unstable
|
|
||||||
--> $DIR/feature-gate-native_link_modifiers_verbatim.rs:1:34
|
|
||||||
|
|
|
||||||
LL | #[link(name = "foo", modifiers = "+verbatim")]
|
|
||||||
| ^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: see issue #81490 <https://github.com/rust-lang/rust/issues/81490> for more information
|
|
||||||
= help: add `#![feature(native_link_modifiers_verbatim)]` to the crate attributes to enable
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
|
@ -1,4 +1,3 @@
|
|||||||
#![feature(native_link_modifiers_verbatim)]
|
|
||||||
#![feature(link_cfg)]
|
#![feature(link_cfg)]
|
||||||
|
|
||||||
// Top-level ill-formed
|
// Top-level ill-formed
|
||||||
|
@ -1,143 +1,143 @@
|
|||||||
error: unexpected `#[link]` argument, expected one of: name, kind, modifiers, cfg, wasm_import_module, import_name_type
|
error: unexpected `#[link]` argument, expected one of: name, kind, modifiers, cfg, wasm_import_module, import_name_type
|
||||||
--> $DIR/link-attr-validation-late.rs:5:22
|
--> $DIR/link-attr-validation-late.rs:4:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", "literal")]
|
LL | #[link(name = "...", "literal")]
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
error: unexpected `#[link]` argument, expected one of: name, kind, modifiers, cfg, wasm_import_module, import_name_type
|
error: unexpected `#[link]` argument, expected one of: name, kind, modifiers, cfg, wasm_import_module, import_name_type
|
||||||
--> $DIR/link-attr-validation-late.rs:6:22
|
--> $DIR/link-attr-validation-late.rs:5:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", unknown)]
|
LL | #[link(name = "...", unknown)]
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
||||||
error: multiple `name` arguments in a single `#[link]` attribute
|
error: multiple `name` arguments in a single `#[link]` attribute
|
||||||
--> $DIR/link-attr-validation-late.rs:10:22
|
--> $DIR/link-attr-validation-late.rs:9:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "foo", name = "bar")]
|
LL | #[link(name = "foo", name = "bar")]
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
error: multiple `kind` arguments in a single `#[link]` attribute
|
error: multiple `kind` arguments in a single `#[link]` attribute
|
||||||
--> $DIR/link-attr-validation-late.rs:11:38
|
--> $DIR/link-attr-validation-late.rs:10:38
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", kind = "dylib", kind = "bar")]
|
LL | #[link(name = "...", kind = "dylib", kind = "bar")]
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
error: multiple `modifiers` arguments in a single `#[link]` attribute
|
error: multiple `modifiers` arguments in a single `#[link]` attribute
|
||||||
--> $DIR/link-attr-validation-late.rs:12:47
|
--> $DIR/link-attr-validation-late.rs:11:47
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", modifiers = "+verbatim", modifiers = "bar")]
|
LL | #[link(name = "...", modifiers = "+verbatim", modifiers = "bar")]
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: multiple `cfg` arguments in a single `#[link]` attribute
|
error: multiple `cfg` arguments in a single `#[link]` attribute
|
||||||
--> $DIR/link-attr-validation-late.rs:13:34
|
--> $DIR/link-attr-validation-late.rs:12:34
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", cfg(FALSE), cfg(FALSE))]
|
LL | #[link(name = "...", cfg(FALSE), cfg(FALSE))]
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
error: multiple `wasm_import_module` arguments in a single `#[link]` attribute
|
error: multiple `wasm_import_module` arguments in a single `#[link]` attribute
|
||||||
--> $DIR/link-attr-validation-late.rs:14:36
|
--> $DIR/link-attr-validation-late.rs:13:36
|
||||||
|
|
|
|
||||||
LL | #[link(wasm_import_module = "foo", wasm_import_module = "bar")]
|
LL | #[link(wasm_import_module = "foo", wasm_import_module = "bar")]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: link name must be of the form `name = "string"`
|
error: link name must be of the form `name = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:18:8
|
--> $DIR/link-attr-validation-late.rs:17:8
|
||||||
|
|
|
|
||||||
LL | #[link(name)]
|
LL | #[link(name)]
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
||||||
error[E0459]: `#[link]` attribute requires a `name = "string"` argument
|
error[E0459]: `#[link]` attribute requires a `name = "string"` argument
|
||||||
--> $DIR/link-attr-validation-late.rs:18:1
|
--> $DIR/link-attr-validation-late.rs:17:1
|
||||||
|
|
|
|
||||||
LL | #[link(name)]
|
LL | #[link(name)]
|
||||||
| ^^^^^^^^^^^^^ missing `name` argument
|
| ^^^^^^^^^^^^^ missing `name` argument
|
||||||
|
|
||||||
error: link name must be of the form `name = "string"`
|
error: link name must be of the form `name = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:20:8
|
--> $DIR/link-attr-validation-late.rs:19:8
|
||||||
|
|
|
|
||||||
LL | #[link(name())]
|
LL | #[link(name())]
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error[E0459]: `#[link]` attribute requires a `name = "string"` argument
|
error[E0459]: `#[link]` attribute requires a `name = "string"` argument
|
||||||
--> $DIR/link-attr-validation-late.rs:20:1
|
--> $DIR/link-attr-validation-late.rs:19:1
|
||||||
|
|
|
|
||||||
LL | #[link(name())]
|
LL | #[link(name())]
|
||||||
| ^^^^^^^^^^^^^^^ missing `name` argument
|
| ^^^^^^^^^^^^^^^ missing `name` argument
|
||||||
|
|
||||||
error: link kind must be of the form `kind = "string"`
|
error: link kind must be of the form `kind = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:22:22
|
--> $DIR/link-attr-validation-late.rs:21:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", kind)]
|
LL | #[link(name = "...", kind)]
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
||||||
error: link kind must be of the form `kind = "string"`
|
error: link kind must be of the form `kind = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:23:22
|
--> $DIR/link-attr-validation-late.rs:22:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", kind())]
|
LL | #[link(name = "...", kind())]
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error: link modifiers must be of the form `modifiers = "string"`
|
error: link modifiers must be of the form `modifiers = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:24:22
|
--> $DIR/link-attr-validation-late.rs:23:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", modifiers)]
|
LL | #[link(name = "...", modifiers)]
|
||||||
| ^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
||||||
error: link modifiers must be of the form `modifiers = "string"`
|
error: link modifiers must be of the form `modifiers = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:25:22
|
--> $DIR/link-attr-validation-late.rs:24:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", modifiers())]
|
LL | #[link(name = "...", modifiers())]
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
|
||||||
error: link cfg must be of the form `cfg(/* predicate */)`
|
error: link cfg must be of the form `cfg(/* predicate */)`
|
||||||
--> $DIR/link-attr-validation-late.rs:26:22
|
--> $DIR/link-attr-validation-late.rs:25:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", cfg)]
|
LL | #[link(name = "...", cfg)]
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error: link cfg must be of the form `cfg(/* predicate */)`
|
error: link cfg must be of the form `cfg(/* predicate */)`
|
||||||
--> $DIR/link-attr-validation-late.rs:27:22
|
--> $DIR/link-attr-validation-late.rs:26:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", cfg = "literal")]
|
LL | #[link(name = "...", cfg = "literal")]
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: link cfg must have a single predicate argument
|
error: link cfg must have a single predicate argument
|
||||||
--> $DIR/link-attr-validation-late.rs:28:22
|
--> $DIR/link-attr-validation-late.rs:27:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", cfg("literal"))]
|
LL | #[link(name = "...", cfg("literal"))]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: wasm import module must be of the form `wasm_import_module = "string"`
|
error: wasm import module must be of the form `wasm_import_module = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:29:22
|
--> $DIR/link-attr-validation-late.rs:28:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", wasm_import_module)]
|
LL | #[link(name = "...", wasm_import_module)]
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: wasm import module must be of the form `wasm_import_module = "string"`
|
error: wasm import module must be of the form `wasm_import_module = "string"`
|
||||||
--> $DIR/link-attr-validation-late.rs:30:22
|
--> $DIR/link-attr-validation-late.rs:29:22
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", wasm_import_module())]
|
LL | #[link(name = "...", wasm_import_module())]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: invalid linking modifier syntax, expected '+' or '-' prefix before one of: bundle, verbatim, whole-archive, as-needed
|
error: invalid linking modifier syntax, expected '+' or '-' prefix before one of: bundle, verbatim, whole-archive, as-needed
|
||||||
--> $DIR/link-attr-validation-late.rs:34:34
|
--> $DIR/link-attr-validation-late.rs:33:34
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", modifiers = "")]
|
LL | #[link(name = "...", modifiers = "")]
|
||||||
| ^^
|
| ^^
|
||||||
|
|
||||||
error: invalid linking modifier syntax, expected '+' or '-' prefix before one of: bundle, verbatim, whole-archive, as-needed
|
error: invalid linking modifier syntax, expected '+' or '-' prefix before one of: bundle, verbatim, whole-archive, as-needed
|
||||||
--> $DIR/link-attr-validation-late.rs:35:34
|
--> $DIR/link-attr-validation-late.rs:34:34
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", modifiers = "no-plus-minus")]
|
LL | #[link(name = "...", modifiers = "no-plus-minus")]
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: unknown linking modifier `unknown`, expected one of: bundle, verbatim, whole-archive, as-needed
|
error: unknown linking modifier `unknown`, expected one of: bundle, verbatim, whole-archive, as-needed
|
||||||
--> $DIR/link-attr-validation-late.rs:36:34
|
--> $DIR/link-attr-validation-late.rs:35:34
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", modifiers = "+unknown")]
|
LL | #[link(name = "...", modifiers = "+unknown")]
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
error: multiple `verbatim` modifiers in a single `modifiers` argument
|
error: multiple `verbatim` modifiers in a single `modifiers` argument
|
||||||
--> $DIR/link-attr-validation-late.rs:37:34
|
--> $DIR/link-attr-validation-late.rs:36:34
|
||||||
|
|
|
|
||||||
LL | #[link(name = "...", modifiers = "+verbatim,+verbatim")]
|
LL | #[link(name = "...", modifiers = "+verbatim,+verbatim")]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Loading…
Reference in New Issue
Block a user