rustc: Allow cdylibs to link against dylibs
Previously, rustc mandated that cdylibs could only link against rlibs as dependencies (not dylibs). This commit disables that restriction and tests that it works in a simple case.
This commit is contained in:
parent
c0e02ad724
commit
72aaa3a414
8 changed files with 66 additions and 24 deletions
27
src/test/run-make-fulldeps/cdylib-dylib-linkage/Makefile
Normal file
27
src/test/run-make-fulldeps/cdylib-dylib-linkage/Makefile
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
include ../tools.mk
|
||||
|
||||
TARGET_SYSROOT := $(shell $(RUSTC) --print sysroot)/lib/rustlib/$(TARGET)/lib
|
||||
|
||||
ifdef IS_MSVC
|
||||
LIBSTD := $(wildcard $(TARGET_SYSROOT)/libstd-*.dll.lib)
|
||||
else
|
||||
LIBSTD := $(wildcard $(TARGET_SYSROOT)/$(call DYLIB_GLOB,std))
|
||||
STD := $(basename $(patsubst lib%,%, $(notdir $(LIBSTD))))
|
||||
endif
|
||||
|
||||
all: $(call RUN_BINFILE,foo)
|
||||
$(call RUN,foo)
|
||||
|
||||
ifdef IS_MSVC
|
||||
CLIBS := $(TMPDIR)/foo.dll.lib $(TMPDIR)/bar.dll.lib $(LIBSTD)
|
||||
$(call RUN_BINFILE,foo): $(call DYLIB,foo)
|
||||
$(CC) $(CFLAGS) foo.c $(CLIBS) $(call OUT_EXE,foo)
|
||||
else
|
||||
CLIBS := -lfoo -lbar -l$(STD) -L $(TMPDIR) -L $(TARGET_SYSROOT)
|
||||
$(call RUN_BINFILE,foo): $(call DYLIB,foo)
|
||||
$(CC) $(CFLAGS) foo.c $(CLIBS) -o $(call RUN_BINFILE,foo)
|
||||
endif
|
||||
|
||||
$(call DYLIB,foo):
|
||||
$(RUSTC) -C prefer-dynamic bar.rs
|
||||
$(RUSTC) foo.rs
|
||||
5
src/test/run-make-fulldeps/cdylib-dylib-linkage/bar.rs
Normal file
5
src/test/run-make-fulldeps/cdylib-dylib-linkage/bar.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#![crate_type = "dylib"]
|
||||
|
||||
pub fn bar() {
|
||||
println!("hello!");
|
||||
}
|
||||
10
src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.c
Normal file
10
src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.c
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#include <assert.h>
|
||||
|
||||
extern void foo();
|
||||
extern unsigned bar(unsigned a, unsigned b);
|
||||
|
||||
int main() {
|
||||
foo();
|
||||
assert(bar(1, 2) == 3);
|
||||
return 0;
|
||||
}
|
||||
13
src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.rs
Normal file
13
src/test/run-make-fulldeps/cdylib-dylib-linkage/foo.rs
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#![crate_type = "cdylib"]
|
||||
|
||||
extern crate bar;
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn foo() {
|
||||
bar::bar();
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn bar(a: u32, b: u32) -> u32 {
|
||||
a + b
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
#![crate_type = "dylib"]
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
// build-fail
|
||||
// error-pattern: crate `cdylib_dep` required to be available in rlib format, but was not found
|
||||
// aux-build:cdylib-dep.rs
|
||||
// ignore-musl
|
||||
// ignore-cloudabi
|
||||
// ignore-emscripten
|
||||
// ignore-sgx no dynamic libraries
|
||||
#![crate_type = "cdylib"]
|
||||
|
||||
extern crate cdylib_dep;
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
error: crate `cdylib_dep` required to be available in rlib format, but was not found in this form
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue