include ../tools.mk # The following command will: # 1. dump the symbols of a library using `nm` # 2. extract only those lines that we are interested in via `grep` # 3. from those lines, extract just the symbol name via `sed`, which: # * always starts with "_ZN" and ends with "E" (`legacy` mangling) # * always starts with "_R" (`v0` mangling) # 4. sort those symbol names for deterministic comparison # 5. write the result into a file dump-symbols = nm "$(TMPDIR)/lib$(1).rlib" \ | grep -E "$(2)" \ | sed -E "s/.*(_ZN.*E|_R[a-zA-Z0-9_]*).*/\1/" \ | sort \ > "$(TMPDIR)/$(1)$(3).nm" # This test # - compiles each of the two crates 2 times and makes sure each time we get # exactly the same symbol names # - makes sure that both crates agree on the same symbol names for monomorphic # functions all: $(RUSTC) stable-symbol-names1.rs $(call dump-symbols,stable_symbol_names1,generic_|mono_,_v1) rm $(TMPDIR)/libstable_symbol_names1.rlib $(RUSTC) stable-symbol-names1.rs $(call dump-symbols,stable_symbol_names1,generic_|mono_,_v2) cmp "$(TMPDIR)/stable_symbol_names1_v1.nm" "$(TMPDIR)/stable_symbol_names1_v2.nm" $(RUSTC) stable-symbol-names2.rs $(call dump-symbols,stable_symbol_names2,generic_|mono_,_v1) rm $(TMPDIR)/libstable_symbol_names2.rlib $(RUSTC) stable-symbol-names2.rs $(call dump-symbols,stable_symbol_names2,generic_|mono_,_v2) cmp "$(TMPDIR)/stable_symbol_names2_v1.nm" "$(TMPDIR)/stable_symbol_names2_v2.nm" $(call dump-symbols,stable_symbol_names1,mono_,_cross) $(call dump-symbols,stable_symbol_names2,mono_,_cross) cmp "$(TMPDIR)/stable_symbol_names1_cross.nm" "$(TMPDIR)/stable_symbol_names2_cross.nm"