diff --git a/.azure-pipelines/windows-msbuild.bat b/.azure-pipelines/windows-msbuild.bat index dd83e6d82f..5f6be9cd82 100644 --- a/.azure-pipelines/windows-msbuild.bat +++ b/.azure-pipelines/windows-msbuild.bat @@ -24,10 +24,7 @@ set LDC_DIR=%DMD_DIR%\ldc2-%LDC_VERSION%-windows-multilib if "%D_COMPILER%" == "ldc" set HOST_DMD=%LDC_DIR%\bin\ldmd2.exe if "%D_COMPILER%" == "dmd" set HOST_DMD=%DMD_DIR%\dmd2\windows\bin\dmd.exe -REM take the first found cl.exe, in case there was already one in the path when vcvarsall.bat was called -FOR /F "tokens=* USEBACKQ" %%F IN (`where cl.exe`) DO (SET MSVC_CC=%%~fsF - goto CC_DONE) -:CC_DONE +set MSVC_CC=cl.exe FOR /F "tokens=* USEBACKQ" %%F IN (`where lib.exe`) DO (SET MSVC_AR=%%~fsF) REM add grep to PATH diff --git a/.azure-pipelines/windows.sh b/.azure-pipelines/windows.sh index ee393b889b..2a19e23e33 100644 --- a/.azure-pipelines/windows.sh +++ b/.azure-pipelines/windows.sh @@ -35,7 +35,7 @@ if [ "$MODEL" == "32omf" ] ; then AR="$PWD/dm/bin/lib.exe" export CPPCMD="$PWD/dm/bin/sppn.exe" else - CC="$(where cl.exe)" + CC="cl.exe" AR="$(where lib.exe)" # must be done before installing dmd fi diff --git a/druntime/Makefile b/druntime/Makefile index 7feb67a2ff..74682f2540 100644 --- a/druntime/Makefile +++ b/druntime/Makefile @@ -416,7 +416,7 @@ ifeq ($(HAS_ADDITIONAL_TESTS),1) test/aa test/cpuid test/gc test/hash test/lifetime \ test/thread test/unittest test/imports test/betterc test/config \ test/traits test/uuid test/valgrind - ifneq (windows,$(OS)) # FIXME + ifneq (32omf,$(MODEL)) ADDITIONAL_TESTS+=test/stdcpp endif ADDITIONAL_TESTS+=$(if $(SHARED),test/shared,) diff --git a/druntime/setmscver.bat b/druntime/setmscver.bat deleted file mode 100644 index 3a38e1a47e..0000000000 --- a/druntime/setmscver.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -echo _MSC_VER > ver.c -cl /nologo /EP ver.c > ver_raw.txt -findstr /v /r /c:"^$" "ver_raw.txt" > "ver.txt" -set /P _MSC_VER=< ver.txt -echo set _MSC_VER=%_MSC_VER% -if exist cflags.txt del /q cflags.txt -if exist dflags.txt del /q dflags.txt -if exist add_tests.txt del /q add_tests.txt -if %_MSC_VER% GTR 1900 echo /std:c++17 > cflags.txt -if %_MSC_VER% GTR 1900 echo -extern-std=c++17 > dflags.txt -if %_MSC_VER% GTR 1900 echo string_view > add_tests.txt -del ver.c ver_raw.txt diff --git a/druntime/test/stdcpp/Makefile b/druntime/test/stdcpp/Makefile index a05ee35a99..f3c150bb33 100644 --- a/druntime/test/stdcpp/Makefile +++ b/druntime/test/stdcpp/Makefile @@ -1,5 +1,42 @@ include ../common.mak +.PHONY: all clean + +ifeq (windows,$(OS)) + +CC:=cl +EXTRA_CXXFLAGS:=/EHsc +EXTRA_DFLAGS:= + +TESTS:=allocator array memory new string utility vector + +MSC_VER:=$(strip $(shell $(CC) /nologo /EP msc_ver.c)) +ifeq ($(shell test $(MSC_VER) -gt 1900; echo $$?),0) + EXTRA_CXXFLAGS+=/std:c++17 + EXTRA_DFLAGS+=-extern-std=c++17 + TESTS+=string_view +endif + +all: $(addprefix $(ROOT)/,$(TESTS)) + +$(ROOT)/%: $(SRC)/%.cpp $(SRC)/%_test.d + @echo Testing $* + @mkdir -p $(dir $@) + + $(QUIET)$(CC) /MT $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $< + $(QUIET)$(DMD) -mscrtlib=libcmt $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) $@_cpp$(DOTOBJ) -run $(SRC)/$*_test.d + + $(QUIET)$(CC) /MD $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $< + $(QUIET)$(DMD) -mscrtlib=msvcrt $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) $@_cpp$(DOTOBJ) -run $(SRC)/$*_test.d + + $(QUIET)$(CC) /MTd $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $< + $(QUIET)$(DMD) -mscrtlib=libcmtd $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) $@_cpp$(DOTOBJ) -run $(SRC)/$*_test.d + + $(QUIET)$(CC) /MDd $(EXTRA_CXXFLAGS) -c /Fo$@_cpp$(DOTOBJ) $< + $(QUIET)$(DMD) -mscrtlib=msvcrtd $(DFLAGS) $(EXTRA_DFLAGS) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(MSC_VER) $@_cpp$(DOTOBJ) -run $(SRC)/$*_test.d + +else # Posix: + HASCPP17:=`echo wow | $(CXX) -std=c++17 -E -xc++ - > /dev/null 2>&1 && echo yes` TESTS:=allocator new utility @@ -8,73 +45,73 @@ TESTS17:=string_view OLDABITESTS:= ifeq (osx,$(OS)) - TESTS11+=memory -# TESTS+=string -# TESTS+=vector + TESTS11+=memory +# TESTS+=string +# TESTS+=vector endif ifeq (linux,$(OS)) - TESTS11+=exception typeinfo - TESTS+=typeinfo -# TESTS+=string -# TESTS+=vector - OLDABITESTS+=string + TESTS11+=exception typeinfo + TESTS+=typeinfo +# TESTS+=string +# TESTS+=vector + OLDABITESTS+=string endif ifeq (freebsd,$(OS)) - TESTS11+=memory - TESTS+=string -# TESTS+=vector + TESTS11+=memory + TESTS+=string +# TESTS+=vector endif # some build machines have ancient compilers, so we need to disable C++17 tests ifneq (yes,$(HASCPP17)) -TESTS17:= + TESTS17:= endif -.PHONY: all clean - -all: $(addprefix $(ROOT)/,$(addsuffix .done,$(TESTS))) $(addprefix $(ROOT)/,$(addsuffix _11.done,$(TESTS11))) $(addprefix $(ROOT)/,$(addsuffix _17.done,$(TESTS17))) $(addprefix $(ROOT)/,$(addsuffix _old.done,$(OLDABITESTS))) $(addprefix $(ROOT)/,$(addsuffix _libcpp.done,$(LIBCPPTESTS))) +all: $(addprefix $(ROOT)/,$(addsuffix .done,$(TESTS))) $(addprefix $(ROOT)/,$(addsuffix _11.done,$(TESTS11))) $(addprefix $(ROOT)/,$(addsuffix _17.done,$(TESTS17))) $(addprefix $(ROOT)/,$(addsuffix _old.done,$(OLDABITESTS))) # run C++98 tests -$(ROOT)/%.done : $(ROOT)/% +$(ROOT)/%.done: $(ROOT)/%$(DOTEXE) @echo Testing $* $(QUIET)$(TIMELIMIT)$(ROOT)/$* $(RUN_ARGS) @touch $@ # run C++11 tests -$(ROOT)/%_11.done : $(ROOT)/%_11 +$(ROOT)/%_11.done: $(ROOT)/%_11$(DOTEXE) @echo Testing $*_11 $(QUIET)$(TIMELIMIT)$(ROOT)/$*_11 $(RUN_ARGS) @touch $@ # run C++17 tests -$(ROOT)/%_17.done : $(ROOT)/%_17 +$(ROOT)/%_17.done: $(ROOT)/%_17$(DOTEXE) @echo Testing $*_17 $(QUIET)$(TIMELIMIT)$(ROOT)/$*_17 $(RUN_ARGS) @touch $@ # run libstdc++ _GLIBCXX_USE_CXX11_ABI=0 tests -$(ROOT)/%_old.done : $(ROOT)/%_old +$(ROOT)/%_old.done: $(ROOT)/%_old$(DOTEXE) @echo Testing $*_old $(QUIET)$(TIMELIMIT)$(ROOT)/$*_old $(RUN_ARGS) @touch $@ # build C++98 tests -$(ROOT)/%: $(SRC)/%.cpp $(SRC)/%_test.d - mkdir -p $(dir $@) - $(QUIET)$(DMD) $(DFLAGS) -extern-std=c++98 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_d.o $(SRC)/$*_test.d - $(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++98 -o $@ $< $(ROOT)/$*_d.o $(DRUNTIME) -lpthread $(LDL) +$(ROOT)/%$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d + @mkdir -p $(dir $@) + $(QUIET)$(DMD) $(DFLAGS) -extern-std=c++98 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_d$(DOTOBJ) $(SRC)/$*_test.d + $(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++98 -o $@ $< $(ROOT)/$*_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) # build C++11 tests -$(ROOT)/%_11: $(SRC)/%.cpp $(SRC)/%_test.d - mkdir -p $(dir $@) - $(QUIET)$(DMD) $(DFLAGS) -extern-std=c++11 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_11_d.o $(SRC)/$*_test.d - $(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++11 -o $@ $< $(ROOT)/$*_11_d.o $(DRUNTIME) -lpthread $(LDL) +$(ROOT)/%_11$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d + @mkdir -p $(dir $@) + $(QUIET)$(DMD) $(DFLAGS) -extern-std=c++11 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_11_d$(DOTOBJ) $(SRC)/$*_test.d + $(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++11 -o $@ $< $(ROOT)/$*_11_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) # build C++17 tests -$(ROOT)/%_17: $(SRC)/%.cpp $(SRC)/%_test.d - mkdir -p $(dir $@) - $(QUIET)$(DMD) $(DFLAGS) -extern-std=c++17 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_17_d.o $(SRC)/$*_test.d - $(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++17 -o $@ $< $(ROOT)/$*_17_d.o $(DRUNTIME) -lpthread $(LDL) +$(ROOT)/%_17$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d + @mkdir -p $(dir $@) + $(QUIET)$(DMD) $(DFLAGS) -extern-std=c++17 -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_17_d$(DOTOBJ) $(SRC)/$*_test.d + $(QUIET)$(CXX) $(CXXFLAGS_BASE) -std=c++17 -o $@ $< $(ROOT)/$*_17_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) # build libstdc++ _GLIBCXX_USE_CXX11_ABI=0 tests -$(ROOT)/%_old: $(SRC)/%.cpp $(SRC)/%_test.d - mkdir -p $(dir $@) - $(QUIET)$(DMD) $(DFLAGS) -version=_GLIBCXX_USE_CXX98_ABI -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_old_d.o $(SRC)/$*_test.d - $(QUIET)$(CXX) $(CXXFLAGS_BASE) -D_GLIBCXX_USE_CXX11_ABI=0 -o $@ $< $(ROOT)/$*_old_d.o $(DRUNTIME) -lpthread $(LDL) +$(ROOT)/%_old$(DOTEXE): $(SRC)/%.cpp $(SRC)/%_test.d + @mkdir -p $(dir $@) + $(QUIET)$(DMD) $(DFLAGS) -version=_GLIBCXX_USE_CXX98_ABI -main -unittest -version=CoreUnittest -c -of=$(ROOT)/$*_old_d$(DOTOBJ) $(SRC)/$*_test.d + $(QUIET)$(CXX) $(CXXFLAGS_BASE) -D_GLIBCXX_USE_CXX11_ABI=0 -o $@ $< $(ROOT)/$*_old_d$(DOTOBJ) $(DRUNTIME) -lpthread $(LDL) + +endif # end Posix clean: rm -rf $(GENERATED) diff --git a/druntime/test/stdcpp/msc_ver.c b/druntime/test/stdcpp/msc_ver.c new file mode 100644 index 0000000000..e390e3ba6b --- /dev/null +++ b/druntime/test/stdcpp/msc_ver.c @@ -0,0 +1 @@ +_MSC_VER diff --git a/druntime/test/stdcpp/win64.mak b/druntime/test/stdcpp/win64.mak deleted file mode 100644 index 04acee2e17..0000000000 --- a/druntime/test/stdcpp/win64.mak +++ /dev/null @@ -1,38 +0,0 @@ -# built from the druntime top-level folder -# to be overwritten by caller -DMD=dmd -MODEL=64 -DRUNTIMELIB=druntime64.lib -CC=cl - -TESTS=array allocator memory new string utility vector - -_MSC_VER=$(file < ..\..\ver.txt) -ADD_CFLAGS=$(file < ..\..\cflags.txt) -ADD_DFLAGS=$(file < ..\..\dflags.txt) -ADD_TESTS=$(file < ..\..\add_tests.txt) - -TESTS=$(TESTS) $(ADD_TESTS) - -test: $(TESTS) - -$(TESTS): - "$(CC)" -c /Fo$@_cpp.obj test\stdcpp\src\$@.cpp /EHsc /MT $(ADD_CFLAGS) - "$(DMD)" -of=$@.exe -m$(MODEL) -conf= -Iimport -defaultlib=$(DRUNTIMELIB) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(_MSC_VER) -mscrtlib=libcmt $(ADD_DFLAGS) test\stdcpp\src\$@_test.d $@_cpp.obj - $@.exe - del $@.exe $@.obj $@_cpp.obj - - "$(CC)" -c /Fo$@_cpp.obj test\stdcpp\src\$@.cpp /EHsc /MD $(ADD_CFLAGS) - "$(DMD)" -of=$@.exe -m$(MODEL) -conf= -Iimport -defaultlib=$(DRUNTIMELIB) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(_MSC_VER) -mscrtlib=msvcrt $(ADD_DFLAGS) test\stdcpp\src\$@_test.d $@_cpp.obj - $@.exe - del $@.exe $@.obj $@_cpp.obj - - "$(CC)" -c /Fo$@_cpp.obj test\stdcpp\src\$@.cpp /EHsc /MTd $(ADD_CFLAGS) - "$(DMD)" -of=$@.exe -m$(MODEL) -conf= -Iimport -defaultlib=$(DRUNTIMELIB) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(_MSC_VER) -mscrtlib=libcmtd $(ADD_DFLAGS) test\stdcpp\src\$@_test.d $@_cpp.obj - $@.exe - del $@.exe $@.obj $@_cpp.obj - - "$(CC)" -c /Fo$@_cpp.obj test\stdcpp\src\$@.cpp /EHsc /MDd $(ADD_CFLAGS) - "$(DMD)" -of=$@.exe -m$(MODEL) -conf= -Iimport -defaultlib=$(DRUNTIMELIB) -main -unittest -version=CoreUnittest -version=_MSC_VER_$(_MSC_VER) -mscrtlib=msvcrtd $(ADD_DFLAGS) test\stdcpp\src\$@_test.d $@_cpp.obj - $@.exe - del $@.exe $@.obj $@_cpp.obj