summaryrefslogtreecommitdiffstats
path: root/tests/run-make/crate-hash-rustc-version/Makefile
blob: 6bf504bf01be5a2d811b621b7c8bdef29962119f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 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