blob: 6bf504bf01be5a2d811b621b7c8bdef29962119f [file] [log] [blame]
# ignore-cross-compile
include ../tools.mk
# Ensure that crates compiled with different rustc versions cannot
# be dynamically linked.
FLAGS := -Cprefer-dynamic -Csymbol-mangling-version=v0
UNAME := $(shell uname)
ifeq ($(UNAME),Linux)
EXT=".so"
NM_CMD := nm -D
endif
ifeq ($(UNAME),Darwin)
EXT=".dylib"
NM_CMD := nm
endif
ifndef NM_CMD
all:
exit 0
else
all:
# a.rs is a dylib
$(RUSTC) a.rs --crate-type=dylib $(FLAGS)
# Write symbols to disk.
$(NM_CMD) $(call DYLIB,a) > $(TMPDIR)/symbolsbefore
# b.rs is a binary
$(RUSTC) b.rs --extern a=$(TMPDIR)/liba$(EXT) --crate-type=bin -Crpath $(FLAGS)
$(call RUN,b)
# Now re-compile a.rs with another rustc version
RUSTC_FORCE_RUSTC_VERSION=deadfeed $(RUSTC) a.rs --crate-type=dylib $(FLAGS)
# After compiling with a different rustc version, write symbols to disk again.
$(NM_CMD) $(call DYLIB,a) > $(TMPDIR)/symbolsafter
# As a sanity check, test if the symbols changed:
# If the symbols are identical, there's been an error.
if diff $(TMPDIR)/symbolsbefore $(TMPDIR)/symbolsafter; then exit 1; fi
$(call FAIL,b)
endif