$$(RMAKE_TESTS:%=$(3)/test/run-make/%-$(1)-T-$(2)-H-$(3).ok)
@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))
$$(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)" \
"$$(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
import os
import sys
+target_triple = sys.argv[14]
def normalize_path(v):
"""msys1/msys2 automatically converts `/abs/path1:/abs/path2` into
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
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)
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
// ignore-license
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
int foo() { return 0; }
// ignore-license
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
int foo() { return 0; }
-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
-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)
-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)
-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)
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)
-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
-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
-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
// 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;
-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
# 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
-include ../tools.mk
-all: $(call STATICLIB,foo)
+all: $(call NATIVE_STATICLIB,foo)
$(RUSTC) foo.rs
$(RUSTC) bar.rs
$(call RUN,bar)
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)
-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)
// ignore-license
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
void foo() {}
// 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();
}
-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
all:
$(RUSTC) -o "" blank.rs 2>&1 | \
- grep 'No such file or directory'
+ grep -i 'No such file or directory'
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)
-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
#[linkage = "external"]
static BAZ: i32 = 21;
+#[link(name = "foo", kind = "static")]
extern {
fn what() -> i32;
}
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)
-include ../tools.mk
+ifdef IS_MSVC
+# FIXME(#27979)
+all:
+else
all:
$(RUSTC) foo.rs
$(RUSTC) bar.rs
$(RUSTC) main.rs
$(call RUN,main)
+endif
+++ /dev/null
-// ignore-license
-extern void foo();
-
-void bar() { foo(); }
+++ /dev/null
-// ignore-license
-void foo() {}
$(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" ]
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" ]
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" ]
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.
-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
-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)
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
# 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)
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
%.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,$@,$<)