diff --git a/.azure-pipelines/windows-visual-studio.sh b/.azure-pipelines/windows-visual-studio.sh new file mode 100644 index 0000000000..c1c26eb429 --- /dev/null +++ b/.azure-pipelines/windows-visual-studio.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash + +set -euxo pipefail + +CURL_USER_AGENT="DMD-CI $(curl --version | head -n 1)" +DMD_DIR="$PWD" + +download() { + local url="$1" + local path="$2" + curl -fsSL -A "$CURL_USER_AGENT" --connect-timeout 5 --speed-time 30 --speed-limit 1024 --retry 5 --retry-delay 5 "$url" -o "$path" +} + +clone() { + local url="$1" + local path="$2" + local branch="$3" + for i in {0..4}; do + if git clone --depth 1 --branch "$branch" "$url" "$path" "${@:4}" --quiet; then + break + elif [ $i -lt 4 ]; then + sleep $((1 << $i)) + else + echo "Failed to clone: ${url}" + exit 1 + fi + done +} + +################################################################################ +# Download LDC +################################################################################ + +ldc() { + LDC_DIR="ldc2-${LDC_VERSION}-windows-multilib" + LDC_INSTALLER="${LDC_DIR}.7z" + LDC_URL="https://github.com/ldc-developers/ldc/releases/download/v${LDC_VERSION}/${LDC_INSTALLER}" + + if [ ! -e "$LDC_INSTALLER" ] ; then + download "$LDC_URL" "$LDC_INSTALLER" + fi + + 7z x "$LDC_INSTALLER" > /dev/null + if [ ! -e "$LDC_DIR/bin/ldmd2.exe" ] ; then + echo "Unexpected LDC installation, $LDC_INSTALLER/bin/ldmd2.exe missing" + exit 1 + fi +} + +################################################################################ +# Download VisualD +################################################################################ + +visuald() { + local VISUALD_INSTALLER="VisualD-${VISUALD_VER}.exe" + local VISUALD_URL="https://github.com/dlang/visuald/releases/download/${VISUALD_VER}/${VISUALD_INSTALLER}" + if [ ! -e "$VISUALD_INSTALLER" ] ; then + download "$VISUALD_URL" "$VISUALD_INSTALLER" + fi +} + +################################################################################ +# Download DigitalMars Make +################################################################################ + +dm_make() { + download "http://downloads.dlang.org/other/dm857c.zip" dmc.zip + unzip dmc.zip > /dev/null + export DMC="$PWD/dm/bin/dmc.exe" + export DM_MAKE="$PWD/dm/bin/make.exe" + mkdir -p dm/path + cp "$DMC" "$DM_MAKE" "dm/path" +} + +################################################################################ +# Download DigitalMars Make +################################################################################ + +install_grep() { + local tools_dir="${DMD_DIR}/tools" + mkdir -p "$tools_dir" + cd "$tools_dir" + download "http://downloads.dlang.org/other/grep-3.1.zip" "grep-3.1.zip" + unzip "grep-3.1.zip" # contains grep.exe + #export PATH="${tools_dir}:$PATH" +} + +################################################################################ +# Checkout other repositories +################################################################################ + +clone_repos() { + local REPO_BRANCH="$SYSTEM_PULLREQUEST_TARGETBRANCH" + + for proj in druntime phobos; do + if [ "$REPO_BRANCH" != master ] && [ "$REPO_BRANCH" != stable ] && + ! git ls-remote --exit-code --heads "https://github.com/dlang/$proj.git" "$REPO_BRANCH" > /dev/null; then + # use master as fallback for other repos to test feature branches + clone "https://github.com/dlang/$proj.git" "${DMD_DIR}/../$proj" master + echo "[GIT_CLONE] Switched $proj to branch master \$(REPO_BRANCH=$REPO_BRANCH)" + else + clone "https://github.com/dlang/$proj.git" "${DMD_DIR}/../$proj" "$REPO_BRANCH" + echo "[GIT_CLONE] Switched $proj to branch $REPO_BRANCH" + fi + done +} + +echo "[STEP]: Downloading LDC" +ldc + +echo "[STEP]: Downloading VisualD" +visuald + +echo "[STEP]: Downloading DigitalMars make" +dm_make + +echo "[STEP]: Downloading grep" +install_grep + +echo "[STEP]: Cloning repositories" +clone_repos diff --git a/.azure-pipelines/windows-visual-studio.yml b/.azure-pipelines/windows-visual-studio.yml new file mode 100644 index 0000000000..55847cb7f1 --- /dev/null +++ b/.azure-pipelines/windows-visual-studio.yml @@ -0,0 +1,84 @@ +steps: + - script: | + :: Use Windows CRLF line endings for checked-out text files + git config --global core.autocrlf true + set + displayName: Print environment variables + - checkout: self + fetchDepth: 1 + - script: | + bash --version + sh --login .azure-pipelines/windows-visual-studio.sh + displayName: Download requires binaries + - script: | + @echo on + call "%VSINSTALLDIR%\VC\Auxiliary\Build\vcvarsall.bat" %ARCH% + set LDC_DIR=ldc2-%LDC_VERSION%-windows-multilib + set VISUALD_INSTALLER=VisualD-%VISUALD_VER%.exe + set DMD_DIR=%cd% + set DMD=%DMD_DIR%\generated\Windows\Release\Win32\dmd.exe + set DMD_TESTSUITE_MAKE_ARGS=-j3 + set DM_MAKE=%DMD_DIR%\dm\path\make.exe + + FOR /F "tokens=* USEBACKQ" %%F IN (`where cl.exe`) DO (SET MSVC_CC=%%~fsF) + FOR /F "tokens=* USEBACKQ" %%F IN (`where lib.exe`) DO (SET MSVC_AR=%%~fsF) + REM this returns two lines (GNU's link.exe is on the second line) + REM Just take the first one + FOR /F "tokens=* USEBACKQ" %%F IN (`where link.exe`) DO (SET MSVC_LD=%%~fsF + GOTO :Next) + :Next + FOR /F "tokens=* USEBACKQ" %%F IN (`where make.exe`) DO (SET GNU_MAKE=%%~fsF) + + REM WORKAROUND: move files to a directory without spaces + copy "%MSVC_AR%" "%DMD_DIR%\dm\path\lib.exe" + copy "%MSVC_LD%" "%DMD_DIR%\dm\path\link.exe" + copy "%MSVC_CC%" "%DMD_DIR%\dm\path\cl.exe" + set MSVC_AR=%DMD_DIR%\dm\path\lib.exe + set MSVC_CC=%DMD_DIR%\dm\path\cl.exe + set MSVC_LD=%DMD_DIR%\dm\path\link.exe + + REM expose dm_make as default make + set PATH=%DMD_DIR%\dm\path;%DMD_DIR%\tools;%PATH% + dir "%DMD_DIR%\tools" + "%DMD_DIR%\tools\grep.exe --version + echo %PATH% + grep --version + exit 1 + + .\%VISUALD_INSTALLER% /S + REM configure DMD path + REM reg add "HKLM\SOFTWARE\DMD" /v InstallationFolder /t REG_SZ /d "%DMD_DIR%\dmd2" /reg:32 /f + REM configure LDC path + reg add "HKLM\SOFTWARE\LDC" /v InstallationFolder /t REG_SZ /d "%DMD_DIR%\%LDC_DIR%" /reg:32 /f + + REM build via VS projects with LDC + cd src + REM unfortunately, multilib version of LDC and Visual D don't work together seamlessly (anymore?) + set LDC_ARGS="/p:ExternalLinkerOptions=phobos2-ldc.lib druntime-ldc.lib" + set LDC_ARGS=%LDC_ARGS% /p:DCompiler=LDC + msbuild /target:dmd /p:Configuration=Release /p:Platform=Win32 %LDC_ARGS% vcbuild\dmd.sln + + %DMD% --version + grep --version + + REM Check: run druntime unittests + cd "%DMD_DIR%\..\druntime" + "%DM_MAKE%" -f win64.mak MODEL=32mscoff DMD="%DMD%" VCDIR="%VCINSTALLDIR%." CC="%MSVC_CC%" SDKDIR=unused MAKE="%DM_MAKE%" target + echo "[DRUNTIME] running tests..." + "%DM_MAKE%" -f win64.mak MODEL=32mscoff DMD="%DMD%" VCDIR="%VCINSTALLDIR%." CC="%MSVC_CC%" SDKDIR=unused MAKE="%DM_MAKE%" unittest32mscoff + + REM build zlib first (to workaround DigitalMars's whitespace limitations) + cd "%DMD_DIR%\..\phobos\etc\c\zlib" + "%DM_MAKE%" -f win64.mak "zlib32mscoff.lib" MODEL=32mscoff DMD="%DMD%" VCDIR="%VCINSTALLDIR%." CC="%MSVC_CC%" LIB="%MSVC_AR%" LD="%MSVC_LD%" + + REM Check: build phobos unittests + cd "%DMD_DIR%\..\phobos" + "%DM_MAKE%" -f win64.mak MODEL=32mscoff DMD="%DMD%" VCDIR="%VCINSTALLDIR%." CC="%MSVC_CC%" "MAKE=%DM_MAKE%" CFLAGS="/C7" SDKDIR=unused + + REM Build DMD VERSION + string imports (not built by VisualD) + copy "%DMD_DIR%\VERSION" "%DMD_DIR%\generated\Windows\Release\Win32\VERSION" + + REM Run DMD testsuite + cd "%DMD_DIR%\test" + cp %DMD_DIR%\..\phobos\phobos32mscoff.lib . + "%GNU_MAKE%" -j1 all MODEL=32mscoff ARGS="-O -inline -g" OS=win32 DMD="%DMD%" DMD_MODEL=win32 diff --git a/.azure-pipelines/windows.yml b/.azure-pipelines/windows.yml index 191e578786..16cc506d69 100644 --- a/.azure-pipelines/windows.yml +++ b/.azure-pipelines/windows.yml @@ -7,7 +7,7 @@ steps: - checkout: self fetchDepth: 1 - script: | - echo on + @echo on call "%VSINSTALLDIR%\VC\Auxiliary\Build\vcvarsall.bat" %ARCH% FOR /F "tokens=* USEBACKQ" %%F IN (`where cl.exe`) DO (SET MSVC_CC=%%~fsF) FOR /F "tokens=* USEBACKQ" %%F IN (`where lib.exe`) DO (SET MSVC_AR=%%~fsF) diff --git a/appveyor.sh b/appveyor.sh deleted file mode 100644 index 1b818319a8..0000000000 --- a/appveyor.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/sh - -set -e -v - -clone() { - local url="$1" - local path="$2" - local branch="$3" - for i in {0..4}; do - if git clone --branch "$branch" "$url" "$path" "${@:4}" --quiet; then - break - elif [ $i -lt 4 ]; then - sleep $((1 << $i)) - else - echo "Failed to clone: ${url}" - exit 1 - fi - done -} - -echo "C_COMPILER: $C_COMPILER" -echo "D_COMPILER: $D_COMPILER" -echo "D_VERSION: $D_VERSION" - -cd /c/projects/ - -if [ ! -f "gnumake/make.exe" ]; then - mkdir gnumake - cd gnumake - - appveyor DownloadFile "https://ftp.gnu.org/gnu/make/make-4.2.tar.gz" -FileName make.tar.gz - - 7z x make.tar.gz -so | 7z x -si -ttar > /dev/null - cd make-4.2 - - # usr/bin/link overriding VS's link.exe, give priority to VS's in PATH - export PATH="/c/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/:$PATH" - ./build_w32.bat > /dev/null - - cp WinRel/gnumake.exe ../make.exe - cd ../.. - - gnumake/make.exe --version -fi - -if [ $D_COMPILER == "dmd" ]; then - appveyor DownloadFile "http://downloads.dlang.org/releases/2.x/${D_VERSION}/dmd.${D_VERSION}.windows.7z" -FileName dmd2.7z - #appveyor DownloadFile "http://nightlies.dlang.org/dmd-master-2017-12-22/dmd.master.windows.7z" -FileName dmd2.7z - 7z x dmd2.7z > /dev/null - export PATH=$PWD/dmd2/windows/bin/:$PATH - export DMD=/c/projects/dmd2/windows/bin/dmd.exe - dmd --version -fi - -for proj in druntime phobos; do - if [ $APPVEYOR_REPO_BRANCH != master ] && [ $APPVEYOR_REPO_BRANCH != stable ] && - ! git ls-remote --exit-code --heads https://github.com/dlang/$proj.git $APPVEYOR_REPO_BRANCH > /dev/null; then - # use master as fallback for other repos to test feature branches - clone https://github.com/dlang/$proj.git $proj master - echo "+++ Switched $proj to branch master (APPVEYOR_REPO_BRANCH=$APPVEYOR_REPO_BRANCH)" - else - clone https://github.com/dlang/$proj.git $proj $APPVEYOR_REPO_BRANCH - echo "+++ Switched $proj to branch $APPVEYOR_REPO_BRANCH" - fi -done - -# build via makefile -cd /c/projects/dmd/src -make -f win64.mak reldmd DMD=../src/dmd - -cd /c/projects/druntime -make -f win64.mak DMD=../dmd/src/dmd - -cd /c/projects/phobos -make -f win64.mak DMD=../dmd/src/dmd - -cp /c/projects/phobos/phobos64.lib /c/projects/dmd/ - -export OS="Win_64" -export CC='c:/"Program Files (x86)"/"Microsoft Visual Studio 14.0"/VC/bin/amd64/cl.exe' -export MODEL="64" -export MODEL_FLAG="-m64" - -cd /c/projects/dmd/test -DMD_TESTSUITE_MAKE_ARGS=-j3 ../../gnumake/make -j1 start_all_tests MODEL=$MODEL ARGS="-O -inline -g" MODEL_FLAG=$MODEL_FLAG LIB="../../phobos;$LIB" diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 5f0a830782..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,85 +0,0 @@ - -os: Visual Studio 2015 - -environment: - matrix: - - ARCH: x64 - D_COMPILER: dmd - D_VERSION: 2.079.1 - C_COMPILER: MSVC - VISUALD_VER: v0.45.1-rc2 - LDC_VERSION: 1.8.0 - -cache: - - C:\projects\gnumake\make.exe - - C:\projects\VisualD-v0.45.1-rc2.exe - - C:\projects\ldc2-1.8.0-windows-multilib.7z - -skip_commits: - # Avoid retesting the merged PR on `master` or `stable` - message: /^Merge pull request/ - -artifacts: - - path: src/dmd.exe - name: dmd 64-bit - - path: generated/Windows/Release/Win32/dmd.exe - name: dmd 32-bit built with LDC - -init: - - git config --global core.autocrlf input - -build_script: - - cd c:/projects/ - - call "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64 - - - set LDC_DIR=ldc2-%LDC_VERSION%-windows-multilib - - set LDC_INSTALLER=%LDC_DIR%.7z - - set LDC_URL=https://github.com/ldc-developers/ldc/releases/download/v%LDC_VERSION%/%LDC_INSTALLER% - - ps: | - If (-not (Test-Path $Env:LDC_INSTALLER)) { - Start-FileDownload $Env:LDC_URL -FileName $Env:LDC_INSTALLER - } - 7z x $Env:LDC_INSTALLER > $null - If (-not (Test-Path $Env:LDC_DIR/bin/ldmd2.exe)) { - echo "Unexpected LDC installation, $Env:LDC_INSTALLER/bin/ldmd2.exe missing" - } - - # Download & install Visual D (needs admin rights?) - - set VISUALD_INSTALLER=VisualD-%VISUALD_VER%.exe - - set VISUALD_URL=https://github.com/dlang/visuald/releases/download/%VISUALD_VER%/%VISUALD_INSTALLER% - - ps: | - If (-not (Test-Path $Env:VISUALD_INSTALLER)) { - Start-FileDownload $Env:VISUALD_URL -FileName $Env:VISUALD_INSTALLER - } - - .\%VISUALD_INSTALLER% /S - # configure DMD path - - reg add "HKCU\SOFTWARE\Microsoft\VisualStudio\14.0\ToolsOptionsPages\Projects\Visual D Settings" /v DMDInstallDir /t REG_SZ /d c:\projects\dmd2 /reg:32 /f - # configure LDC path - - reg add "HKCU\SOFTWARE\Microsoft\VisualStudio\14.0\ToolsOptionsPages\Projects\Visual D Settings" /v LDCInstallDir /t REG_SZ /d c:\projects\%LDC_DIR%\ /reg:32 /f - # disable link dependencies monitoring, fails on AppVeyor server - - reg add "HKLM\SOFTWARE\Microsoft\VisualStudio\14.0\ToolsOptionsPages\Projects\Visual D Settings" /v optlinkDeps /t REG_DWORD /d 0 /reg:32 /f - - - bash --version - - sh --login /c/projects/dmd/appveyor.sh - - # build via VS projects with LDC - - cd c:\projects\dmd\src - # unfortunately, multilib version of LDC and Visual D don't work together seamlessly (anymore?) - - set LDC_ARGS="/p:ExternalLinkerOptions=phobos2-ldc.lib druntime-ldc.lib" - - set LDC_ARGS=%LDC_ARGS% /p:DCompiler=LDC - - msbuild /target:dmd /p:Configuration=Release /p:Platform=Win32 %LDC_ARGS% vcbuild\dmd.sln - - # check: build druntime unittests and dmd test suite - - cd c:\projects\druntime - - set PATH=c:\projects\dmd2\windows\bin;%PATH% - - make -f win64.mak MODEL=32mscoff DMD=..\dmd\generated\Windows\Release\Win32\dmd.exe VCDIR="%VCINSTALLDIR%." "CC=%VCINSTALLDIR%/bin/cl.exe" SDKDIR=unused clean - - make -f win64.mak MODEL=32mscoff DMD=..\dmd\generated\Windows\Release\Win32\dmd.exe VCDIR="%VCINSTALLDIR%." "CC=%VCINSTALLDIR%/bin/cl.exe" SDKDIR=unused target unittest32mscoff - - cd c:\projects\phobos - - make -f win64.mak MODEL=32mscoff DMD=..\dmd\generated\Windows\Release\Win32\dmd.exe VCDIR="%VCINSTALLDIR%." "CC=%VCINSTALLDIR%/bin/cl.exe" SDKDIR=unused clean - - make -f win64.mak MODEL=32mscoff DMD=..\dmd\generated\Windows\Release\Win32\dmd.exe VCDIR="%VCINSTALLDIR%." "CC=%VCINSTALLDIR%/bin/cl.exe" SDKDIR=unused - - cd c:\projects\dmd\test - - set CC=c:/"Program Files (x86)"/"Microsoft Visual Studio 14.0"/VC/bin/cl.exe - - set DMD_TESTSUITE_MAKE_ARGS=-j3 - - ..\..\gnumake\make -j1 start_all_tests MODEL=32mscoff ARGS="-O -inline -g" "OS=win32" DMD=..\generated\Windows\Release\Win32\dmd.exe LIB="../../phobos;%LIB%" RESULTS_DIR=test_m32mscoff - -test_script: true diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a7e2021d1a..c9c68d4961 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -23,3 +23,20 @@ jobs: #D_COMPILER: dmd steps: - template: .azure-pipelines/windows.yml + - job: Windows_VisualD + timeoutInMinutes: 120 + pool: + vmImage: 'vs2017-win2016' + variables: + VSINSTALLDIR: C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\ + strategy: + matrix: + visuald-ldc: + OS: Win_32 + MODEL: 32 + ARCH: x86 + D_COMPILER: ldc + VISUALD_VER: v0.48.1 + LDC_VERSION: 1.14.0 + steps: + - template: .azure-pipelines/windows-visual-studio.yml diff --git a/src/vcbuild/dmd_backend.vcxproj b/src/vcbuild/dmd_backend.vcxproj index 8ce464a5b5..545e9fc2ae 100644 --- a/src/vcbuild/dmd_backend.vcxproj +++ b/src/vcbuild/dmd_backend.vcxproj @@ -59,6 +59,9 @@ <_ProjectFileVersion>10.0.30319.1 ..\..\generated\Windows\$(Configuration)\$(PlatformName)\ $(OutDir)\backend\ + <_DCompilerExe Condition="'$(DCompiler)' == 'LDC' and '$(Platform)'=='x64'">$(LDCBinDir)ldmd2.exe -m64 + <_DCompilerExe Condition="'$(DCompiler)' == 'LDC' and '$(Platform)'=='Win32'">$(LDCBinDir)ldmd2.exe -m32 + <_DCompilerExe Condition="'$(_DCompilerExe)' == ''">$(DMDBinDir)dmd.exe @@ -99,7 +102,7 @@ Building and running $(IntDir)%(Filename).exe - $(DMDBinDir)\dmd.exe -I.. -version=MARS -of"$(IntDir)generated\%(Filename).exe" "%(FullPath)" + $(_DCompilerExe) -I.. -version=MARS -of"$(IntDir)generated\%(Filename).exe" "%(FullPath)" if errorlevel 1 exit /B %ERRORLEVEL% pushd $(IntDir)generated "%(Filename).exe" @@ -153,4 +156,4 @@ popd - \ No newline at end of file + diff --git a/test/tools/paths.d b/test/tools/paths.d index cc6b8e739c..c29d4dee92 100644 --- a/test/tools/paths.d +++ b/test/tools/paths.d @@ -60,7 +60,8 @@ string dmdModel() return dmdModel; const prefix = generatedDir.buildPath(os, build); - return dmdModel = prefix.buildPath("64", dmdFilename).exists ? "64" : "32"; + return dmdModel = environment.get("DMD_MODEL", + prefix.buildPath("64", dmdFilename).exists ? "64" : "32"); } string model()