| # 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 |