about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-08-26 16:57:56 -0700
committerAlex Crichton <alex@alexcrichton.com>2015-09-17 08:40:33 -0700
commit0675dffac48101faa2bdb634682b2ddf3975bf31 (patch)
treef297fbeb63271859634dc2ffeb8139cf21546a60
parent3887ca27f16771b960b57e1c80997b2482ba5b76 (diff)
downloadrust-0675dffac48101faa2bdb634682b2ddf3975bf31.tar.gz
rust-0675dffac48101faa2bdb634682b2ddf3975bf31.zip
rmake: Get all tests passing on MSVC
-rw-r--r--mk/tests.mk9
-rw-r--r--src/etc/maketest.py12
-rw-r--r--src/test/run-make/archive-duplicate-names/Makefile4
-rw-r--r--src/test/run-make/c-dynamic-dylib/cfoo.c3
-rw-r--r--src/test/run-make/c-dynamic-rlib/cfoo.c4
-rw-r--r--src/test/run-make/c-link-to-rust-dylib/Makefile17
-rw-r--r--src/test/run-make/c-link-to-rust-staticlib/Makefile6
-rw-r--r--src/test/run-make/c-static-dylib/Makefile4
-rw-r--r--src/test/run-make/c-static-rlib/Makefile4
-rw-r--r--src/test/run-make/crate-name-priority/Makefile2
-rw-r--r--src/test/run-make/extern-fn-generic/Makefile8
-rw-r--r--src/test/run-make/extern-fn-mangle/Makefile6
-rw-r--r--src/test/run-make/extern-fn-with-packed-struct/Makefile6
-rw-r--r--src/test/run-make/extern-fn-with-packed-struct/test.c10
-rw-r--r--src/test/run-make/extern-fn-with-union/Makefile8
-rw-r--r--src/test/run-make/interdependent-c-libraries/Makefile2
-rw-r--r--src/test/run-make/issue-12446/Makefile2
-rw-r--r--src/test/run-make/issue-14500/Makefile2
-rw-r--r--src/test/run-make/issue-15460/Makefile2
-rw-r--r--src/test/run-make/issue-15460/foo.c4
-rw-r--r--src/test/run-make/issue-15460/foo.rs2
-rw-r--r--src/test/run-make/issue-25581/Makefile6
-rw-r--r--src/test/run-make/issue-26092/Makefile2
-rw-r--r--src/test/run-make/link-path-order/Makefile8
-rw-r--r--src/test/run-make/linkage-attr-on-static/Makefile6
-rw-r--r--src/test/run-make/linkage-attr-on-static/bar.rs1
-rw-r--r--src/test/run-make/lto-smoke-c/Makefile4
-rw-r--r--src/test/run-make/no-duplicate-libs/Makefile5
-rw-r--r--src/test/run-make/no-duplicate-libs/bar.c4
-rw-r--r--src/test/run-make/no-duplicate-libs/foo.c2
-rw-r--r--src/test/run-make/output-type-permutations/Makefile14
-rw-r--r--src/test/run-make/relocation-model/Makefile14
-rw-r--r--src/test/run-make/static-dylib-by-default/Makefile9
-rw-r--r--src/test/run-make/tools.mk41
34 files changed, 155 insertions, 78 deletions
diff --git a/mk/tests.mk b/mk/tests.mk
index e0984cfe86f..d004558d1bf 100644
--- a/mk/tests.mk
+++ b/mk/tests.mk
@@ -1047,6 +1047,10 @@ $$(call TEST_OK_FILE,$(1),$(2),$(3),rmake): \
 	@touch $$@
 
 $(3)/test/run-make/%-$(1)-T-$(2)-H-$(3).ok: \
+	export INCLUDE := $$(CFG_MSVC_INCLUDE_PATH_$$(HOST_$(3)))
+$(3)/test/run-make/%-$(1)-T-$(2)-H-$(3).ok: \
+	export LIB := $$(CFG_MSVC_LIB_PATH_$$(HOST_$(3)))
+$(3)/test/run-make/%-$(1)-T-$(2)-H-$(3).ok: \
 		$(S)src/test/run-make/%/Makefile \
 		$$(CSREQ$(1)_T_$(2)_H_$(3))
 	@rm -rf $(3)/test/run-make/$$*
@@ -1056,7 +1060,7 @@ $(3)/test/run-make/%-$(1)-T-$(2)-H-$(3).ok: \
         $$(MAKE) \
 	    $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
 	    $(3)/test/run-make/$$* \
-	    $$(CC_$(3)) \
+	    '$$(CC_$(3))' \
 	    "$$(CFG_GCCISH_CFLAGS_$(3))" \
 	    $$(HBIN$(1)_H_$(3))/rustdoc$$(X_$(3)) \
 	    "$$(TESTNAME)" \
@@ -1064,7 +1068,8 @@ $(3)/test/run-make/%-$(1)-T-$(2)-H-$(3).ok: \
 	    "$$(LD_LIBRARY_PATH_ENV_HOSTDIR$(1)_T_$(2)_H_$(3))" \
 	    "$$(LD_LIBRARY_PATH_ENV_TARGETDIR$(1)_T_$(2)_H_$(3))" \
 	    $(1) \
-	    $$(S)
+	    $$(S) \
+	    $(3)
 	@touch -r $$@.start_time $$@ && rm $$@.start_time
 else
 # FIXME #11094 - The above rule doesn't work right for multiple targets
diff --git a/src/etc/maketest.py b/src/etc/maketest.py
index 04bf81a96aa..c2958caddc4 100644
--- a/src/etc/maketest.py
+++ b/src/etc/maketest.py
@@ -12,6 +12,7 @@ import subprocess
 import os
 import sys
 
+target_triple = sys.argv[14]
 
 def normalize_path(v):
     """msys1/msys2 automatically converts `/abs/path1:/abs/path2` into
@@ -22,8 +23,11 @@ def normalize_path(v):
     windows paths so it is really error-prone. revert it for peace."""
     v = v.replace('\\', '/')
     # c:/path -> /c/path
-    if ':/' in v:
-        v = '/' + v.replace(':/', '/')
+    # "c:/path" -> "/c/path"
+    start = v.find(':/')
+    while start != -1:
+        v = v[:start - 1] + '/' + v[start - 1:start] + v[start + 1:]
+        start = v.find(':/')
     return v
 
 
@@ -50,6 +54,10 @@ putenv('TARGET_RPATH_DIR', os.path.abspath(sys.argv[11]))
 putenv('RUST_BUILD_STAGE', sys.argv[12])
 putenv('S', os.path.abspath(sys.argv[13]))
 putenv('PYTHON', sys.executable)
+os.putenv('TARGET', target_triple)
+
+if 'msvc' in target_triple:
+    os.putenv('IS_MSVC', '1')
 
 if filt not in sys.argv[1]:
     sys.exit(0)
diff --git a/src/test/run-make/archive-duplicate-names/Makefile b/src/test/run-make/archive-duplicate-names/Makefile
index 72c2d389e2a..5202e6dea54 100644
--- a/src/test/run-make/archive-duplicate-names/Makefile
+++ b/src/test/run-make/archive-duplicate-names/Makefile
@@ -3,8 +3,8 @@
 all:
 	mkdir $(TMPDIR)/a
 	mkdir $(TMPDIR)/b
-	$(CC) -c -o $(TMPDIR)/a/foo.o foo.c
-	$(CC) -c -o $(TMPDIR)/b/foo.o bar.c
+	$(call COMPILE_OBJ,$(TMPDIR)/a/foo.o,foo.c)
+	$(call COMPILE_OBJ,$(TMPDIR)/b/foo.o,bar.c)
 	ar crus $(TMPDIR)/libfoo.a $(TMPDIR)/a/foo.o $(TMPDIR)/b/foo.o
 	$(RUSTC) foo.rs
 	$(RUSTC) bar.rs
diff --git a/src/test/run-make/c-dynamic-dylib/cfoo.c b/src/test/run-make/c-dynamic-dylib/cfoo.c
index 113717a776a..a9755493541 100644
--- a/src/test/run-make/c-dynamic-dylib/cfoo.c
+++ b/src/test/run-make/c-dynamic-dylib/cfoo.c
@@ -1,2 +1,5 @@
 // ignore-license
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
 int foo() { return 0; }
diff --git a/src/test/run-make/c-dynamic-rlib/cfoo.c b/src/test/run-make/c-dynamic-rlib/cfoo.c
index 113717a776a..b2849326a75 100644
--- a/src/test/run-make/c-dynamic-rlib/cfoo.c
+++ b/src/test/run-make/c-dynamic-rlib/cfoo.c
@@ -1,2 +1,6 @@
 // ignore-license
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
 int foo() { return 0; }
diff --git a/src/test/run-make/c-link-to-rust-dylib/Makefile b/src/test/run-make/c-link-to-rust-dylib/Makefile
index 2a6cc039485..7b2130cd4ed 100644
--- a/src/test/run-make/c-link-to-rust-dylib/Makefile
+++ b/src/test/run-make/c-link-to-rust-dylib/Makefile
@@ -1,10 +1,17 @@
 -include ../tools.mk
 
-HOST_LIB_DIR=$(TMPDIR)/../../../stage$(RUST_BUILD_STAGE)/lib
-
-all:
-	$(RUSTC) foo.rs
-	$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) $(call RPATH_LINK_SEARCH,$(HOST_LIB_DIR)) -Wl,-rpath,$(TMPDIR) $(EXTRACFLAGS)
+all: $(TMPDIR)/$(call BIN,bar)
 	$(call RUN,bar)
 	$(call REMOVE_DYLIBS,foo)
 	$(call FAIL,bar)
+
+ifdef IS_MSVC
+$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
+	$(CC) bar.c $(TMPDIR)/foo.lib $(call OUT_EXE,bar)
+else
+$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
+	$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) -L $(TMPDIR)
+endif
+
+$(call DYLIB,foo): foo.rs
+	$(RUSTC) foo.rs
diff --git a/src/test/run-make/c-link-to-rust-staticlib/Makefile b/src/test/run-make/c-link-to-rust-staticlib/Makefile
index 2b927e3e4a7..3d44b3c256e 100644
--- a/src/test/run-make/c-link-to-rust-staticlib/Makefile
+++ b/src/test/run-make/c-link-to-rust-staticlib/Makefile
@@ -1,12 +1,12 @@
 -include ../tools.mk
 
-EXTRAFLAGS := $(EXTRACFLAGS)
-
 # FIXME: ignore freebsd
 ifneq ($(shell uname),FreeBSD)
 all:
 	$(RUSTC) foo.rs
-	$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) $(EXTRAFLAGS) $(EXTRACXXFLAGS)
+	cp $(TMPDIR)/libfoo.a $(call NATIVE_STATICLIB,foo2)
+	$(CC) bar.c $(call NATIVE_STATICLIB,foo2) $(call OUT_EXE,bar) \
+		$(EXTRACFLAGS) $(EXTRACXXFLAGS)
 	$(call RUN,bar)
 	rm $(call STATICLIB,foo*)
 	$(call RUN,bar)
diff --git a/src/test/run-make/c-static-dylib/Makefile b/src/test/run-make/c-static-dylib/Makefile
index 9914e12d569..f88786857cc 100644
--- a/src/test/run-make/c-static-dylib/Makefile
+++ b/src/test/run-make/c-static-dylib/Makefile
@@ -1,9 +1,9 @@
 -include ../tools.mk
 
-all: $(call STATICLIB,cfoo)
+all: $(call NATIVE_STATICLIB,cfoo)
 	$(RUSTC) foo.rs -C prefer-dynamic
 	$(RUSTC) bar.rs
-	rm $(TMPDIR)/$(call STATICLIB_GLOB,cfoo)
+	rm $(call NATIVE_STATICLIB,cfoo)
 	$(call RUN,bar)
 	$(call REMOVE_DYLIBS,foo)
 	$(call FAIL,bar)
diff --git a/src/test/run-make/c-static-rlib/Makefile b/src/test/run-make/c-static-rlib/Makefile
index 02b24ef9846..be22b2728f0 100644
--- a/src/test/run-make/c-static-rlib/Makefile
+++ b/src/test/run-make/c-static-rlib/Makefile
@@ -1,8 +1,8 @@
 -include ../tools.mk
 
-all: $(call STATICLIB,cfoo)
+all: $(call NATIVE_STATICLIB,cfoo)
 	$(RUSTC) foo.rs
 	$(RUSTC) bar.rs
 	$(call REMOVE_RLIBS,foo)
-	rm $(TMPDIR)/$(call STATICLIB_GLOB,cfoo)
+	rm $(call NATIVE_STATICLIB,cfoo)
 	$(call RUN,bar)
diff --git a/src/test/run-make/crate-name-priority/Makefile b/src/test/run-make/crate-name-priority/Makefile
index 2fe51832433..17ecb33ab28 100644
--- a/src/test/run-make/crate-name-priority/Makefile
+++ b/src/test/run-make/crate-name-priority/Makefile
@@ -7,5 +7,5 @@ all:
 	rm $(TMPDIR)/$(call BIN,bar)
 	$(RUSTC) foo1.rs
 	rm $(TMPDIR)/$(call BIN,foo)
-	$(RUSTC) foo1.rs -o $(TMPDIR)/bar1
+	$(RUSTC) foo1.rs -o $(TMPDIR)/$(call BIN,bar1)
 	rm $(TMPDIR)/$(call BIN,bar1)
diff --git a/src/test/run-make/extern-fn-generic/Makefile b/src/test/run-make/extern-fn-generic/Makefile
index a325acbf687..cf897dba1f2 100644
--- a/src/test/run-make/extern-fn-generic/Makefile
+++ b/src/test/run-make/extern-fn-generic/Makefile
@@ -1,8 +1,6 @@
 -include ../tools.mk
 
-all:
-	$(CC) -std=c99 test.c -c -o $(TMPDIR)/test.o
-	$(AR) rcs $(TMPDIR)/libtest.a $(TMPDIR)/test.o
-	$(RUSTC) testcrate.rs -L $(TMPDIR)
-	$(RUSTC) test.rs -L $(TMPDIR)
+all: $(call NATIVE_STATICLIB,test)
+	$(RUSTC) testcrate.rs
+	$(RUSTC) test.rs
 	$(call RUN,test) || exit 1
diff --git a/src/test/run-make/extern-fn-mangle/Makefile b/src/test/run-make/extern-fn-mangle/Makefile
index ea6971853fe..042048ec25f 100644
--- a/src/test/run-make/extern-fn-mangle/Makefile
+++ b/src/test/run-make/extern-fn-mangle/Makefile
@@ -1,7 +1,5 @@
 -include ../tools.mk
 
-all:
-	$(CC) -std=c99 test.c -c -o $(TMPDIR)/test.o
-	$(AR) rcs $(TMPDIR)/libtest.a $(TMPDIR)/test.o
-	$(RUSTC) test.rs -L $(TMPDIR)
+all: $(call NATIVE_STATICLIB,test)
+	$(RUSTC) test.rs
 	$(call RUN,test) || exit 1
diff --git a/src/test/run-make/extern-fn-with-packed-struct/Makefile b/src/test/run-make/extern-fn-with-packed-struct/Makefile
index ea6971853fe..042048ec25f 100644
--- a/src/test/run-make/extern-fn-with-packed-struct/Makefile
+++ b/src/test/run-make/extern-fn-with-packed-struct/Makefile
@@ -1,7 +1,5 @@
 -include ../tools.mk
 
-all:
-	$(CC) -std=c99 test.c -c -o $(TMPDIR)/test.o
-	$(AR) rcs $(TMPDIR)/libtest.a $(TMPDIR)/test.o
-	$(RUSTC) test.rs -L $(TMPDIR)
+all: $(call NATIVE_STATICLIB,test)
+	$(RUSTC) test.rs
 	$(call RUN,test) || exit 1
diff --git a/src/test/run-make/extern-fn-with-packed-struct/test.c b/src/test/run-make/extern-fn-with-packed-struct/test.c
index 121e48e84e4..506954fca46 100644
--- a/src/test/run-make/extern-fn-with-packed-struct/test.c
+++ b/src/test/run-make/extern-fn-with-packed-struct/test.c
@@ -1,11 +1,21 @@
 // ignore-license
 // Pragma needed cause of gcc bug on windows: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991
+
+#ifdef _MSC_VER
+#pragma pack(push,1)
+struct Foo {
+    char a;
+    short b;
+    char c;
+};
+#else
 #pragma pack(1)
 struct __attribute__((packed)) Foo {
     char a;
     short b;
     char c;
 };
+#endif
 
 struct Foo foo(struct Foo foo) {
     return foo;
diff --git a/src/test/run-make/extern-fn-with-union/Makefile b/src/test/run-make/extern-fn-with-union/Makefile
index a325acbf687..cf897dba1f2 100644
--- a/src/test/run-make/extern-fn-with-union/Makefile
+++ b/src/test/run-make/extern-fn-with-union/Makefile
@@ -1,8 +1,6 @@
 -include ../tools.mk
 
-all:
-	$(CC) -std=c99 test.c -c -o $(TMPDIR)/test.o
-	$(AR) rcs $(TMPDIR)/libtest.a $(TMPDIR)/test.o
-	$(RUSTC) testcrate.rs -L $(TMPDIR)
-	$(RUSTC) test.rs -L $(TMPDIR)
+all: $(call NATIVE_STATICLIB,test)
+	$(RUSTC) testcrate.rs
+	$(RUSTC) test.rs
 	$(call RUN,test) || exit 1
diff --git a/src/test/run-make/interdependent-c-libraries/Makefile b/src/test/run-make/interdependent-c-libraries/Makefile
index cf7683479f0..1268022e37b 100644
--- a/src/test/run-make/interdependent-c-libraries/Makefile
+++ b/src/test/run-make/interdependent-c-libraries/Makefile
@@ -8,7 +8,7 @@
 # correct to complete the linkage. If passed as "-lfoo -lbar", then the 'foo'
 # library will be stripped out, and the linkage will fail.
 
-all: $(call STATICLIB,foo) $(call STATICLIB,bar)
+all: $(call NATIVE_STATICLIB,foo) $(call NATIVE_STATICLIB,bar)
 	$(RUSTC) foo.rs
 	$(RUSTC) bar.rs
 	$(RUSTC) main.rs -Z print-link-args
diff --git a/src/test/run-make/issue-12446/Makefile b/src/test/run-make/issue-12446/Makefile
index e864ee0058c..c412b0479fb 100644
--- a/src/test/run-make/issue-12446/Makefile
+++ b/src/test/run-make/issue-12446/Makefile
@@ -1,6 +1,6 @@
 -include ../tools.mk
 
-all: $(call STATICLIB,foo)
+all: $(call NATIVE_STATICLIB,foo)
 	$(RUSTC) foo.rs
 	$(RUSTC) bar.rs
 	$(call RUN,bar)
diff --git a/src/test/run-make/issue-14500/Makefile b/src/test/run-make/issue-14500/Makefile
index 6ea3cf48ffb..bd94db09520 100644
--- a/src/test/run-make/issue-14500/Makefile
+++ b/src/test/run-make/issue-14500/Makefile
@@ -13,5 +13,5 @@ endif
 all:
 	$(RUSTC) foo.rs --crate-type=rlib
 	$(RUSTC) bar.rs --crate-type=staticlib -C lto -L. -o $(TMPDIR)/libbar.a
-	$(CC) foo.c -lbar -o $(call RUN_BINFILE,foo) $(EXTRACFLAGS)
+	$(CC) foo.c $(TMPDIR)/libbar.a $(EXTRACFLAGS) $(call OUT_EXE,foo)
 	$(call RUN,foo)
diff --git a/src/test/run-make/issue-15460/Makefile b/src/test/run-make/issue-15460/Makefile
index bc5e9b72869..846805686a1 100644
--- a/src/test/run-make/issue-15460/Makefile
+++ b/src/test/run-make/issue-15460/Makefile
@@ -1,6 +1,6 @@
 -include ../tools.mk
 
-all: $(TMPDIR)/libfoo.a
+all: $(call NATIVE_STATICLIB,foo)
 	$(RUSTC) foo.rs -C extra-filename=-383hf8 -C prefer-dynamic
 	$(RUSTC) bar.rs
 	$(call RUN,bar)
diff --git a/src/test/run-make/issue-15460/foo.c b/src/test/run-make/issue-15460/foo.c
index 2895ad473bf..fdf595b574e 100644
--- a/src/test/run-make/issue-15460/foo.c
+++ b/src/test/run-make/issue-15460/foo.c
@@ -1,2 +1,6 @@
 // ignore-license
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
 void foo() {}
diff --git a/src/test/run-make/issue-15460/foo.rs b/src/test/run-make/issue-15460/foo.rs
index 6917fa55579..8b96fe36824 100644
--- a/src/test/run-make/issue-15460/foo.rs
+++ b/src/test/run-make/issue-15460/foo.rs
@@ -8,9 +8,11 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(linked_from)]
 #![crate_type = "dylib"]
 
 #[link(name = "foo", kind = "static")]
+#[linked_from = "foo"]
 extern {
     pub fn foo();
 }
diff --git a/src/test/run-make/issue-25581/Makefile b/src/test/run-make/issue-25581/Makefile
index ea6971853fe..042048ec25f 100644
--- a/src/test/run-make/issue-25581/Makefile
+++ b/src/test/run-make/issue-25581/Makefile
@@ -1,7 +1,5 @@
 -include ../tools.mk
 
-all:
-	$(CC) -std=c99 test.c -c -o $(TMPDIR)/test.o
-	$(AR) rcs $(TMPDIR)/libtest.a $(TMPDIR)/test.o
-	$(RUSTC) test.rs -L $(TMPDIR)
+all: $(call NATIVE_STATICLIB,test)
+	$(RUSTC) test.rs
 	$(call RUN,test) || exit 1
diff --git a/src/test/run-make/issue-26092/Makefile b/src/test/run-make/issue-26092/Makefile
index 1e66e3a5380..0d94c99a394 100644
--- a/src/test/run-make/issue-26092/Makefile
+++ b/src/test/run-make/issue-26092/Makefile
@@ -2,4 +2,4 @@
 
 all:
 		$(RUSTC) -o "" blank.rs 2>&1 | \
-			grep 'No such file or directory'
+			grep -i 'No such file or directory'
diff --git a/src/test/run-make/link-path-order/Makefile b/src/test/run-make/link-path-order/Makefile
index 116c7ae991c..eeea0e3714e 100644
--- a/src/test/run-make/link-path-order/Makefile
+++ b/src/test/run-make/link-path-order/Makefile
@@ -6,10 +6,12 @@
 CORRECT_DIR=$(TMPDIR)/correct
 WRONG_DIR=$(TMPDIR)/wrong
 
-all: $(TMPDIR)/libcorrect.a $(TMPDIR)/libwrong.a
+F := $(call NATIVE_STATICLIB_FILE,foo)
+
+all: $(call NATIVE_STATICLIB,correct) $(call NATIVE_STATICLIB,wrong)
 	mkdir -p $(CORRECT_DIR) $(WRONG_DIR)
-	mv $(TMPDIR)/libcorrect.a $(CORRECT_DIR)/libfoo.a
-	mv $(TMPDIR)/libwrong.a $(WRONG_DIR)/libfoo.a
+	mv $(call NATIVE_STATICLIB,correct) $(CORRECT_DIR)/$(F)
+	mv $(call NATIVE_STATICLIB,wrong) $(WRONG_DIR)/$(F)
 	$(RUSTC) main.rs -o $(TMPDIR)/should_succeed -L $(CORRECT_DIR) -L $(WRONG_DIR)
 	$(call RUN,should_succeed)
 	$(RUSTC) main.rs -o $(TMPDIR)/should_fail -L $(WRONG_DIR) -L $(CORRECT_DIR)
diff --git a/src/test/run-make/linkage-attr-on-static/Makefile b/src/test/run-make/linkage-attr-on-static/Makefile
index 1871a5bbdc7..4befbe14465 100644
--- a/src/test/run-make/linkage-attr-on-static/Makefile
+++ b/src/test/run-make/linkage-attr-on-static/Makefile
@@ -1,7 +1,5 @@
 -include ../tools.mk
 
-all:
-	$(CC) foo.c -c -o $(TMPDIR)/foo.o
-	$(AR) rcs $(TMPDIR)/libfoo.a $(TMPDIR)/foo.o
-	$(RUSTC) bar.rs -lfoo -L $(TMPDIR)
+all: $(call NATIVE_STATICLIB,foo)
+	$(RUSTC) bar.rs
 	$(call RUN,bar) || exit 1
diff --git a/src/test/run-make/linkage-attr-on-static/bar.rs b/src/test/run-make/linkage-attr-on-static/bar.rs
index 6125421bdeb..274401c448b 100644
--- a/src/test/run-make/linkage-attr-on-static/bar.rs
+++ b/src/test/run-make/linkage-attr-on-static/bar.rs
@@ -14,6 +14,7 @@
 #[linkage = "external"]
 static BAZ: i32 = 21;
 
+#[link(name = "foo", kind = "static")]
 extern {
     fn what() -> i32;
 }
diff --git a/src/test/run-make/lto-smoke-c/Makefile b/src/test/run-make/lto-smoke-c/Makefile
index 6165afbeb22..72c161abe91 100644
--- a/src/test/run-make/lto-smoke-c/Makefile
+++ b/src/test/run-make/lto-smoke-c/Makefile
@@ -5,5 +5,7 @@ CC := $(CC:-g=)
 
 all:
 	$(RUSTC) foo.rs -C lto
-	$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) $(EXTRACFLAGS) $(EXTRACXXFLAGS)
+	$(CC) bar.c $(TMPDIR)/libfoo.a \
+		$(call OUT_EXE,bar) \
+		$(EXTRACFLAGS) $(EXTRACXXFLAGS)
 	$(call RUN,bar)
diff --git a/src/test/run-make/no-duplicate-libs/Makefile b/src/test/run-make/no-duplicate-libs/Makefile
index fdb6048dc4d..3f6a28c251a 100644
--- a/src/test/run-make/no-duplicate-libs/Makefile
+++ b/src/test/run-make/no-duplicate-libs/Makefile
@@ -1,7 +1,12 @@
 -include ../tools.mk
 
+ifdef IS_MSVC
+# FIXME(#27979)
+all:
+else
 all:
 	$(RUSTC) foo.rs
 	$(RUSTC) bar.rs
 	$(RUSTC) main.rs
 	$(call RUN,main)
+endif
diff --git a/src/test/run-make/no-duplicate-libs/bar.c b/src/test/run-make/no-duplicate-libs/bar.c
deleted file mode 100644
index a7b02a2f10b..00000000000
--- a/src/test/run-make/no-duplicate-libs/bar.c
+++ /dev/null
@@ -1,4 +0,0 @@
-// ignore-license
-extern void foo();
-
-void bar() { foo(); }
diff --git a/src/test/run-make/no-duplicate-libs/foo.c b/src/test/run-make/no-duplicate-libs/foo.c
deleted file mode 100644
index 2895ad473bf..00000000000
--- a/src/test/run-make/no-duplicate-libs/foo.c
+++ /dev/null
@@ -1,2 +0,0 @@
-// ignore-license
-void foo() {}
diff --git a/src/test/run-make/output-type-permutations/Makefile b/src/test/run-make/output-type-permutations/Makefile
index 4efbd9ee48d..e3c36b9c0b7 100644
--- a/src/test/run-make/output-type-permutations/Makefile
+++ b/src/test/run-make/output-type-permutations/Makefile
@@ -4,7 +4,8 @@ all:
 	$(RUSTC) foo.rs --crate-type=rlib,dylib,staticlib
 	$(call REMOVE_RLIBS,bar)
 	$(call REMOVE_DYLIBS,bar)
-	rm $(TMPDIR)/$(call STATICLIB_GLOB,bar)
+	rm $(TMPDIR)/libbar.a
+	rm -f $(TMPDIR)/bar.{exp,lib}
 	# Check that $(TMPDIR) is empty.
 	[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
 
@@ -36,7 +37,7 @@ all:
 	rm $(TMPDIR)/foo
 	[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
 
-	$(RUSTC) foo.rs --emit=link -o $(TMPDIR)/foo
+	$(RUSTC) foo.rs --emit=link -o $(TMPDIR)/$(call BIN,foo)
 	rm $(TMPDIR)/$(call BIN,foo)
 	[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
 
@@ -44,15 +45,16 @@ all:
 	rm $(TMPDIR)/foo
 	[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
 
-	$(RUSTC) foo.rs --crate-type=dylib -o $(TMPDIR)/foo
-	rm $(TMPDIR)/$(call BIN,foo)  # FIXME 13794
+	$(RUSTC) foo.rs --crate-type=dylib -o $(TMPDIR)/$(call BIN,foo)
+	rm $(TMPDIR)/$(call BIN,foo)
+	rm -f $(TMPDIR)/foo.{exp,lib}
 	[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
 
 	$(RUSTC) foo.rs --crate-type=staticlib -o $(TMPDIR)/foo
 	rm $(TMPDIR)/foo
 	[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
 
-	$(RUSTC) foo.rs --crate-type=bin -o $(TMPDIR)/foo
+	$(RUSTC) foo.rs --crate-type=bin -o $(TMPDIR)/$(call BIN,foo)
 	rm $(TMPDIR)/$(call BIN,foo)
 	[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
 
@@ -60,7 +62,7 @@ all:
 	rm $(TMPDIR)/bar.ll
 	rm $(TMPDIR)/bar.s
 	rm $(TMPDIR)/bar.o
-	rm $(TMPDIR)/$(call STATICLIB_GLOB,bar)
+	rm $(TMPDIR)/libbar.a
 	mv $(TMPDIR)/bar.bc $(TMPDIR)/foo.bc
 	# Don't check that the $(TMPDIR) is empty - we left `foo.bc` for later
 	# comparison.
diff --git a/src/test/run-make/relocation-model/Makefile b/src/test/run-make/relocation-model/Makefile
index 2fcdd32bfcb..b22f34fa35b 100644
--- a/src/test/run-make/relocation-model/Makefile
+++ b/src/test/run-make/relocation-model/Makefile
@@ -1,15 +1,21 @@
 -include ../tools.mk
 
-all:
+all: others
 	$(RUSTC) -C relocation-model=dynamic-no-pic foo.rs
 	$(call RUN,foo)
 
 	$(RUSTC) -C relocation-model=default foo.rs
 	$(call RUN,foo)
 
+	$(RUSTC) -C relocation-model=default --crate-type=dylib foo.rs
+	$(RUSTC) -C relocation-model=dynamic-no-pic --crate-type=dylib foo.rs
+
+ifdef IS_MSVC
+# FIXME(#28026)
+others:
+else
+others:
 	$(RUSTC) -C relocation-model=static foo.rs
 	$(call RUN,foo)
-
-	$(RUSTC) -C relocation-model=default --crate-type=dylib foo.rs
 	$(RUSTC) -C relocation-model=static --crate-type=dylib foo.rs
-	$(RUSTC) -C relocation-model=dynamic-no-pic --crate-type=dylib foo.rs
+endif
diff --git a/src/test/run-make/static-dylib-by-default/Makefile b/src/test/run-make/static-dylib-by-default/Makefile
index 1505e679af0..8bd05dc201f 100644
--- a/src/test/run-make/static-dylib-by-default/Makefile
+++ b/src/test/run-make/static-dylib-by-default/Makefile
@@ -1,9 +1,16 @@
 -include ../tools.mk
 
+TO_LINK := $(call DYLIB,bar)
+ifdef IS_MSVC
+LINK_ARG = $(TO_LINK:dll=lib)
+else
+LINK_ARG = $(TO_LINK)
+endif
+
 all:
 	$(RUSTC) foo.rs
 	$(RUSTC) bar.rs
-	$(CC) main.c -o $(call RUN_BINFILE,main) -lbar $(EXTRACFLAGS)
+	$(CC) main.c $(call OUT_EXE,main) $(LINK_ARG) $(EXTRACFLAGS)
 	rm $(TMPDIR)/*.rlib
 	rm $(call DYLIB,foo)
 	$(call RUN,main)
diff --git a/src/test/run-make/tools.mk b/src/test/run-make/tools.mk
index 223296286bd..14d8e468f50 100644
--- a/src/test/run-make/tools.mk
+++ b/src/test/run-make/tools.mk
@@ -7,7 +7,7 @@ TARGET_RPATH_ENV = \
 
 BARE_RUSTC := $(HOST_RPATH_ENV) $(RUSTC)
 RUSTC := $(BARE_RUSTC) --out-dir $(TMPDIR) -L $(TMPDIR)
-CC := $(CC) -L $(TMPDIR)
+#CC := $(CC) -L $(TMPDIR)
 HTMLDOCCK := $(PYTHON) $(S)/src/etc/htmldocck.py
 
 # This is the name of the binary we will generate and run; use this
@@ -19,8 +19,6 @@ RUN_BINFILE = $(TMPDIR)/$(1)
 # variable before running the binary.
 
 RLIB_GLOB = lib$(1)*.rlib
-STATICLIB = $(TMPDIR)/lib$(1).a
-STATICLIB_GLOB = lib$(1)*.a
 BIN = $(1)
 
 UNAME = $(shell uname)
@@ -33,27 +31,48 @@ RUN = $(TARGET_RPATH_ENV) $(RUN_BINFILE)
 FAIL = $(TARGET_RPATH_ENV) $(RUN_BINFILE) && exit 1 || exit 0
 DYLIB_GLOB = lib$(1)*.dylib
 DYLIB = $(TMPDIR)/lib$(1).dylib
-RPATH_LINK_SEARCH =
+STATICLIB = $(TMPDIR)/lib$(1).a
+STATICLIB_GLOB = lib$(1)*.a
 else
 ifdef IS_WINDOWS
 RUN = PATH="$(PATH):$(TARGET_RPATH_DIR)" $(RUN_BINFILE)
 FAIL = PATH="$(PATH):$(TARGET_RPATH_DIR)" $(RUN_BINFILE) && exit 1 || exit 0
 DYLIB_GLOB = $(1)*.dll
 DYLIB = $(TMPDIR)/$(1).dll
+STATICLIB = $(TMPDIR)/$(1).lib
+STATICLIB_GLOB = $(1)*.lib
 BIN = $(1).exe
-RPATH_LINK_SEARCH =
 else
 RUN = $(TARGET_RPATH_ENV) $(RUN_BINFILE)
 FAIL = $(TARGET_RPATH_ENV) $(RUN_BINFILE) && exit 1 || exit 0
 DYLIB_GLOB = lib$(1)*.so
 DYLIB = $(TMPDIR)/lib$(1).so
-RPATH_LINK_SEARCH = -Wl,-rpath-link=$(1)
+STATICLIB = $(TMPDIR)/lib$(1).a
+STATICLIB_GLOB = lib$(1)*.a
+endif
 endif
+
+ifdef IS_MSVC
+COMPILE_OBJ = $(CC) -c -Fo:`cygpath -w $(1)` $(2)
+NATIVE_STATICLIB_FILE = $(1).lib
+NATIVE_STATICLIB = $(TMPDIR)/$(call NATIVE_STATICLIB_FILE,$(1))
+OUT_EXE=-Fe:`cygpath -w $(TMPDIR)/$(call BIN,$(1))` \
+	-Fo:`cygpath -w $(TMPDIR)/$(1).obj`
+else
+COMPILE_OBJ = $(CC) -c -o $(1) $(2)
+NATIVE_STATICLIB_FILE = lib$(1).a
+NATIVE_STATICLIB = $(call STATICLIB,$(1))
+OUT_EXE=-o $(TMPDIR)/$(1)
 endif
 
+
 # Extra flags needed to compile a working executable with the standard library
 ifdef IS_WINDOWS
+ifdef IS_MSVC
+	EXTRACFLAGS := ws2_32.lib userenv.lib shell32.lib advapi32.lib
+else
 	EXTRACFLAGS := -lws2_32 -luserenv
+endif
 else
 ifeq ($(UNAME),Darwin)
 else
@@ -80,12 +99,20 @@ REMOVE_RLIBS      = rm $(TMPDIR)/$(call RLIB_GLOB,$(1))
 
 %.a: %.o
 	ar crus $@ $<
+%.lib: lib%.o
+	ar crus $@ $<
 %.dylib: %.o
 	$(CC) -dynamiclib -Wl,-dylib -o $@ $<
 %.so: %.o
 	$(CC) -o $@ $< -shared
+
+ifdef IS_MSVC
+%.dll: lib%.o
+	$(CC) $< -link -dll -out:`cygpath -w $@`
+else
 %.dll: lib%.o
 	$(CC) -o $@ $< -shared
+endif
 
 $(TMPDIR)/lib%.o: %.c
-	$(CC) -c -o $@ $<
+	$(call COMPILE_OBJ,$@,$<)