mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Rollup merge of #92933 - bjorn3:no_bin_lib_mixing, r=estebank
Deny mixing bin crate type with lib crate types The produced library would get a main shim too which conflicts with the main shim of the executable linking the library. ``` $ cat > main1.rs <<EOF fn main() {} pub fn bar() {} EOF $ cat > main2.rs <<EOF extern crate main1; fn main() { main1::bar(); } EOF $ rustc --crate-type bin --crate-type lib main1.rs $ rustc -L. main2.rs error: linking with `cc` failed: exit status: 1 [...] = note: /usr/bin/ld: /tmp/crate_bin_lib/libmain1.rlib(main1.main1.707747aa-cgu.0.rcgu.o): in function `main': main1.707747aa-cgu.0:(.text.main+0x0): multiple definition of `main'; main2.main2.02a148fe-cgu.0.rcgu.o:main2.02a148fe-cgu.0:(.text.main+0x0): first defined here collect2: error: ld returned 1 exit status ```
This commit is contained in:
commit
e3ded4fc4f
@ -56,7 +56,6 @@ pub fn inject(
|
|||||||
is_proc_macro_crate: bool,
|
is_proc_macro_crate: bool,
|
||||||
has_proc_macro_decls: bool,
|
has_proc_macro_decls: bool,
|
||||||
is_test_crate: bool,
|
is_test_crate: bool,
|
||||||
num_crate_types: usize,
|
|
||||||
handler: &rustc_errors::Handler,
|
handler: &rustc_errors::Handler,
|
||||||
) -> ast::Crate {
|
) -> ast::Crate {
|
||||||
let ecfg = ExpansionConfig::default("proc_macro".to_string());
|
let ecfg = ExpansionConfig::default("proc_macro".to_string());
|
||||||
@ -81,10 +80,6 @@ pub fn inject(
|
|||||||
return krate;
|
return krate;
|
||||||
}
|
}
|
||||||
|
|
||||||
if num_crate_types > 1 {
|
|
||||||
handler.err("cannot mix `proc-macro` crate type with others");
|
|
||||||
}
|
|
||||||
|
|
||||||
if is_test_crate {
|
if is_test_crate {
|
||||||
return krate;
|
return krate;
|
||||||
}
|
}
|
||||||
|
@ -393,8 +393,18 @@ pub fn configure_and_expand(
|
|||||||
});
|
});
|
||||||
|
|
||||||
let crate_types = sess.crate_types();
|
let crate_types = sess.crate_types();
|
||||||
|
let is_executable_crate = crate_types.contains(&CrateType::Executable);
|
||||||
let is_proc_macro_crate = crate_types.contains(&CrateType::ProcMacro);
|
let is_proc_macro_crate = crate_types.contains(&CrateType::ProcMacro);
|
||||||
|
|
||||||
|
if crate_types.len() > 1 {
|
||||||
|
if is_executable_crate {
|
||||||
|
sess.err("cannot mix `bin` crate type with others");
|
||||||
|
}
|
||||||
|
if is_proc_macro_crate {
|
||||||
|
sess.err("cannot mix `proc-macro` crate type with others");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// For backwards compatibility, we don't try to run proc macro injection
|
// For backwards compatibility, we don't try to run proc macro injection
|
||||||
// if rustdoc is run on a proc macro crate without '--crate-type proc-macro' being
|
// if rustdoc is run on a proc macro crate without '--crate-type proc-macro' being
|
||||||
// specified. This should only affect users who manually invoke 'rustdoc', as
|
// specified. This should only affect users who manually invoke 'rustdoc', as
|
||||||
@ -411,7 +421,6 @@ pub fn configure_and_expand(
|
|||||||
msg.emit()
|
msg.emit()
|
||||||
} else {
|
} else {
|
||||||
krate = sess.time("maybe_create_a_macro_crate", || {
|
krate = sess.time("maybe_create_a_macro_crate", || {
|
||||||
let num_crate_types = crate_types.len();
|
|
||||||
let is_test_crate = sess.opts.test;
|
let is_test_crate = sess.opts.test;
|
||||||
rustc_builtin_macros::proc_macro_harness::inject(
|
rustc_builtin_macros::proc_macro_harness::inject(
|
||||||
sess,
|
sess,
|
||||||
@ -420,7 +429,6 @@ pub fn configure_and_expand(
|
|||||||
is_proc_macro_crate,
|
is_proc_macro_crate,
|
||||||
has_proc_macro_decls,
|
has_proc_macro_decls,
|
||||||
is_test_crate,
|
is_test_crate,
|
||||||
num_crate_types,
|
|
||||||
sess.diagnostic(),
|
sess.diagnostic(),
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
-include ../tools.mk
|
|
||||||
|
|
||||||
all:
|
|
||||||
$(RUSTC) foo.rs
|
|
||||||
$(call RUN,foo)
|
|
||||||
rm $(TMPDIR)/$(call DYLIB_GLOB,foo)
|
|
@ -1,4 +0,0 @@
|
|||||||
#![crate_type = "dylib"]
|
|
||||||
#![crate_type = "bin"]
|
|
||||||
|
|
||||||
fn main() {}
|
|
@ -1,6 +1,7 @@
|
|||||||
-include ../tools.mk
|
-include ../tools.mk
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo-bar.rs
|
$(RUSTC) foo-bar.rs --crate-type bin
|
||||||
[ -f $(TMPDIR)/$(call BIN,foo-bar) ]
|
[ -f $(TMPDIR)/$(call BIN,foo-bar) ]
|
||||||
|
$(RUSTC) foo-bar.rs --crate-type lib
|
||||||
[ -f $(TMPDIR)/libfoo_bar.rlib ]
|
[ -f $(TMPDIR)/libfoo_bar.rlib ]
|
||||||
|
@ -1,4 +1 @@
|
|||||||
#![crate_type = "lib"]
|
|
||||||
#![crate_type = "bin"]
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user