Merge pull request #19867 from echesakovMSFT/BuildCrossBitnessCrossGenAsWell
[platform/upstream/coreclr.git] / build-test.cmd
1 @if not defined _echo @echo off
2 setlocal EnableDelayedExpansion EnableExtensions
3
4 :: Define a prefix for most output progress messages that come from this script. That makes
5 :: it easier to see where these are coming from. Note that there is a trailing space here.
6 set "__MsgPrefix=BUILDTEST: "
7
8 echo %__MsgPrefix%Starting Build at %TIME%
9
10 set __ThisScriptDir="%~dp0"
11
12 call "%__ThisScriptDir%"\setup_vs_tools.cmd
13 if NOT '%ERRORLEVEL%' == '0' exit /b 1
14
15 if defined VS150COMNTOOLS (
16     set "__VSToolsRoot=%VS150COMNTOOLS%"
17     set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
18     set __VSVersion=vs2017
19 ) else (
20     set "__VSToolsRoot=%VS140COMNTOOLS%"
21     set "__VCToolsRoot=%VS140COMNTOOLS%\..\..\VC"
22     set __VSVersion=vs2015
23 )
24
25 :: Set the default arguments for build
26 set __BuildArch=x64
27 set __BuildType=Debug
28 set __BuildOS=Windows_NT
29
30 set "__ProjectDir=%~dp0"
31 :: remove trailing slash
32 if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
33 set "__TestDir=%__ProjectDir%\tests"
34 set "__ProjectFilesDir=%__TestDir%"
35 set "__SourceDir=%__ProjectDir%\src"
36 set "__PackagesDir=%__ProjectDir%\packages"
37 set "__RootBinDir=%__ProjectDir%\bin"
38 set "__LogsDir=%__RootBinDir%\Logs"
39
40 :: Default __Exclude to issues.targets
41 set __Exclude=%__TestDir%\issues.targets
42
43 REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:__BuildArch=x64)
44 set "__args= %*"
45 set processedArgs=
46 set __UnprocessedBuildArgs=
47 set __RunArgs=
48
49 set __BuildAgainstPackagesArg=
50 set __BuildAgainstPackagesMsbuildArg=
51 set __SkipRestorePackages=
52 set __SkipManaged=
53 set __SkipNative=
54 set __RuntimeId=
55 set __ZipTests=
56 set __TargetsWindows=1
57 set __DoCrossgen=
58
59 @REM CMD has a nasty habit of eating "=" on the argument list, so passing:
60 @REM    -priority=1
61 @REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
62 @REM and allow the "-priority=1" syntax.
63 set __Priority=0
64 set __PriorityArg=
65 set __PassThroughArg=
66
67 :Arg_Loop
68 if "%1" == "" goto ArgsDone
69
70 if /i "%1" == "/?"     goto Usage
71 if /i "%1" == "-?"     goto Usage
72 if /i "%1" == "/h"     goto Usage
73 if /i "%1" == "-h"     goto Usage
74 if /i "%1" == "/help"  goto Usage
75 if /i "%1" == "-help"  goto Usage
76 if /i "%1" == "--help" goto Usage
77
78 if /i "%1" == "x64"                   (set __BuildArch=x64&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
79 if /i "%1" == "x86"                   (set __BuildArch=x86&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
80 if /i "%1" == "arm"                   (set __BuildArch=arm&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
81 if /i "%1" == "arm64"                 (set __BuildArch=arm64&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
82
83 if /i "%1" == "debug"                 (set __BuildType=Debug&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
84 if /i "%1" == "release"               (set __BuildType=Release&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
85 if /i "%1" == "checked"               (set __BuildType=Checked&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
86
87 if /i "%1" == "skipmanaged"           (set __SkipManaged=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
88 if /i "%1" == "skipnative"            (set __SkipNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
89 if /i "%1" == "buildtesthostonly"     (set __SkipNative=1&set __SkipManaged=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
90 if /i "%1" == "buildagainstpackages"  (set __ZipTests=1&set __BuildAgainstPackagesArg=-BuildTestsAgainstPackages&set __BuildAgainstPackagesMsbuildArg=/p:BuildTestsAgainstPackages=true&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
91 if /i "%1" == "skiprestorepackages"   (set __SkipRestorePackages=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
92 if /i "%1" == "ziptests"              (set __ZipTests=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
93 if /i "%1" == "crossgen"              (set __DoCrossgen=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
94 if /i "%1" == "runtimeid"             (set __RuntimeId=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
95 if /i "%1" == "targetsNonWindows"     (set __TargetsWindows=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
96 if /i "%1" == "Exclude"               (set __Exclude=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
97 if /i "%1" == "-priority"             (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
98 if /i "%1" == "--"                    (set __PassThroughArg=%1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
99
100 if [!processedArgs!]==[] (
101     set __UnprocessedBuildArgs=%__args%
102 ) else (
103     set __UnprocessedBuildArgs=%__args%
104     for %%t in (!processedArgs!) do (
105         set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
106     )
107 )
108
109 :ArgsDone
110
111 @REM Special handling for -priority=N argument.
112 if %__Priority% GTR 0 (
113     set "__PriorityArg=-priority=%__Priority%"
114     set "__PriorityMsbuildArg=/p:CLRTestPriorityToBuild=%__Priority%"
115 )
116
117 if defined __BuildAgainstPackagesArg (
118     if not defined __RuntimeID (
119         echo %__MsgPrefix%Error: When building against packages, you must supply a target Runtime ID.
120         exit /b 1
121     )
122 )
123
124 @if defined _echo @echo on
125
126 set __RunArgs=-BuildOS=%__BuildOS% -BuildType=%__BuildType% -BuildArch=%__BuildArch%
127 REM As we move from buildtools to arcade, __RunArgs should be replaced with __msbuildArgs
128 set __msbuildArgs=/p:__BuildOS=%__BuildOS% /p:__BuildType=%__BuildType% /p:__BuildArch=%__BuildArch% /nologo /verbosity:minimal /clp:Summary /maxcpucount
129
130 echo %__MsgPrefix%Commencing CoreCLR test build
131
132 set "__BinDir=%__RootBinDir%\Product\%__BuildOS%.%__BuildArch%.%__BuildType%"
133 set "__TestRootDir=%__RootBinDir%\tests"
134 set "__TestBinDir=%__TestRootDir%\%__BuildOS%.%__BuildArch%.%__BuildType%"
135
136 REM We have different managed and native intermediate dirs because the managed bits will include
137 REM the configuration information deeper in the intermediates path.
138 REM These variables are used by the msbuild project files.
139
140 if not defined __TestIntermediateDir (
141     set "__TestIntermediateDir=tests\obj\%__BuildOS%.%__BuildArch%.%__BuildType%"
142 )
143 set "__NativeTestIntermediatesDir=%__RootBinDir%\%__TestIntermediateDir%\Native"
144 set "__ManagedTestIntermediatesDir=%__RootBinDir%\%__TestIntermediateDir%\Managed"
145
146 REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
147 set "__CMakeBinDir=%__TestBinDir%"
148 set "__CMakeBinDir=%__CMakeBinDir:\=/%"
149
150 if not exist "%__TestBinDir%"                   md "%__TestBinDir%"
151 if not exist "%__NativeTestIntermediatesDir%"   md "%__NativeTestIntermediatesDir%"
152 if not exist "%__ManagedTestIntermediatesDir%"  md "%__ManagedTestIntermediatesDir%"
153 if not exist "%__LogsDir%"                      md "%__LogsDir%"
154
155 echo %__MsgPrefix%Checking prerequisites
156
157 REM Eval the output from probe-win1.ps1
158 for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\probe-win.ps1"""') do %%a
159
160 REM =========================================================================================
161 REM ===
162 REM === Restore Build Tools
163 REM ===
164 REM =========================================================================================
165
166 call "%__ProjectDir%\init-tools.cmd"
167 @if defined _echo @echo on
168
169 set "__ToolsDir=%__ProjectDir%\Tools"
170 set "DotNetCli=%__ToolsDir%\dotnetcli\dotnet.exe"
171 if not exist "%DotNetCli%" (
172     echo %__MsgPrefix%"%DotNetCli%" not found after init-tools.
173     exit /b 1
174 )
175
176 REM =========================================================================================
177 REM ===
178 REM === Resolve runtime dependences
179 REM ===
180 REM =========================================================================================
181
182 call "%__TestDir%\setup-stress-dependencies.cmd" /arch %__BuildArch% /outputdir %__BinDir%
183 @if defined _echo @echo on
184
185 REM =========================================================================================
186 REM ===
187 REM === Native test build section
188 REM ===
189 REM =========================================================================================
190
191 if defined __SkipNative goto skipnative
192
193 echo %__MsgPrefix%Commencing build of native test components for %__BuildArch%/%__BuildType%
194
195 REM Set the environment for the native build
196 set __VCBuildArch=x86_amd64
197 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
198 if /i "%__BuildArch%" == "arm" ( set __VCBuildArch=x86_arm )
199 if /i "%__BuildArch%" == "arm64" ( set __VCBuildArch=x86_arm64 )
200
201 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" %__VCBuildArch%
202 call                                 "%__VCToolsRoot%\vcvarsall.bat" %__VCBuildArch%
203 @if defined _echo @echo on
204
205 if not defined VSINSTALLDIR (
206     echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
207     exit /b 1
208 )
209 if not exist "%VSINSTALLDIR%DIA SDK" goto NoDIA
210
211 pushd "%__NativeTestIntermediatesDir%"
212 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" ""%__ProjectFilesDir%"" %__VSVersion% %__BuildArch%
213 @if defined _echo @echo on
214 popd
215
216 if not exist "%__NativeTestIntermediatesDir%\install.vcxproj" (
217     echo %__MsgPrefix%Failed to generate test native component build project!
218     exit /b 1
219 )
220
221 set __BuildLogRootName=Tests_Native
222 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
223 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
224 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
225 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
226 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
227 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
228 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
229
230 call "%__ProjectDir%\run.cmd" build -Project="%__NativeTestIntermediatesDir%\install.vcxproj" !__Logging! -configuration=%__BuildType% -platform=%__BuildArch% %__RunArgs% %__PriorityArg% %__PassThroughArg% %__UnprocessedBuildArgs%
231 if errorlevel 1 (
232     echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
233     echo     %__BuildLog%
234     echo     %__BuildWrn%
235     echo     %__BuildErr%
236     exit /b 1
237 )
238
239 :skipnative
240
241 REM =========================================================================================
242 REM ===
243 REM === Restore product binaries from packages
244 REM ===
245 REM =========================================================================================
246
247 if "%__SkipRestorePackages%" == 1 goto SkipRestoreProduct
248
249 echo %__MsgPrefix%Restoring CoreCLR product from packages
250
251 if not defined XunitTestBinBase set XunitTestBinBase=%__TestBinDir%
252 set "CORE_ROOT=%XunitTestBinBase%\Tests\Core_Root"
253
254 set __BuildLogRootName=Restore_Product
255 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
256 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
257 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
258 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
259 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
260 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
261 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
262
263 call "%__ProjectDir%\run.cmd" build -Project=%__ProjectDir%\tests\build.proj -BatchRestorePackages !__Logging! %__RunArgs% %__BuildAgainstPackagesArg% %__PriorityArg% %__PassThroughArg% %__UnprocessedBuildArgs%
264
265 if not defined __BuildAgainstPackagesArg goto SkipRestoreProduct
266
267 echo %__MsgPrefix%BinPlacing CoreLib
268
269 set __BuildLogRootName=Tests_GenerateRuntimeLayout
270 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
271 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
272 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
273 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
274 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
275 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
276 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
277
278 call "%__ProjectDir%\run.cmd" build -Project=%__ProjectDir%\tests\runtest.proj -BinPlaceRef -BinPlaceProduct -CopyCrossgenToProduct -RuntimeId="%__RuntimeId%" !__Logging! %__RunArgs% %__BuildAgainstPackagesArg% %__PriorityArg% %__PassThroughArg% %__UnprocessedBuildArgs%
279 if errorlevel 1 (
280     echo %__MsgPrefix%Error: BinPlace of mscorlib.dll failed. Refer to the build log files for details:
281     echo     %__BuildLog%
282     echo     %__BuildWrn%
283     echo     %__BuildErr%
284     exit /b 1
285 )
286
287 :SkipRestoreProduct
288
289 REM =========================================================================================
290 REM ===
291 REM === Managed test build section
292 REM ===
293 REM =========================================================================================
294
295 if defined __SkipManaged goto SkipManagedBuild
296
297 echo %__MsgPrefix%Starting the Managed Tests Build
298
299 if not defined VSINSTALLDIR (
300     echo %__MsgPrefix%Error: build-test.cmd should be run from a Visual Studio Command Prompt.  Please see https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md for build instructions.
301     exit /b 1
302 )
303 set __AppendToLog=false
304 set __BuildLogRootName=Tests_Managed
305 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
306 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
307 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
308
309 REM Execute msbuild test build in stages - workaround for excessive data retention in MSBuild ConfigCache
310 REM See https://github.com/Microsoft/msbuild/issues/2993
311
312 set __SkipPackageRestore=false
313 set __SkipTargetingPackBuild=false
314 set __BuildLoopCount=2
315 set __TestGroupToBuild=1
316
317 if %__Priority% GTR 0 (set __BuildLoopCount=16&set __TestGroupToBuild=2)
318 echo %__MsgPrefix%Building tests group %__TestGroupToBuild% with %__BuildLoopCount% subgroups
319
320 for /l %%G in (1, 1, %__BuildLoopCount%) do (
321
322     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%";Append=!__AppendToLog!
323     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%";Append=!__AppendToLog!
324     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%";Append=!__AppendToLog!
325
326     set TestBuildSlice=%%G
327     echo Running: msbuild %__ProjectDir%\tests\build.proj !__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! %__msbuildArgs% %__BuildAgainstPackagesMsbuildArg% !__PriorityMsbuildArg! %__UnprocessedBuildArgs%
328     call msbuild %__ProjectDir%\tests\build.proj !__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! %__msbuildArgs% %__BuildAgainstPackagesMsbuildArg% !__PriorityMsbuildArg! %__UnprocessedBuildArgs%
329
330     if errorlevel 1 (
331         echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
332         echo     %__BuildLog%
333         echo     %__BuildWrn%
334         echo     %__BuildErr%
335         exit /b 1
336     )
337
338     set __SkipPackageRestore=true
339     set __SkipTargetingPackBuild=true
340     set __AppendToLog=true
341 )
342
343 REM Check that we've built about as many tests as we expect. This is primarily intended to prevent accidental changes that cause us to build
344 REM drastically fewer Pri-1 tests than expected.
345 echo %__MsgPrefix%Check the managed tests build
346 echo Running: msbuild %__ProjectDir%\tests\runtest.proj /t:CheckTestBuild /p:CLRTestPriorityToBuild=%__Priority% %__msbuildArgs% %__unprocessedBuildArgs%
347 call msbuild %__ProjectDir%\tests\runtest.proj /t:CheckTestBuild /p:CLRTestPriorityToBuild=%__Priority% %__msbuildArgs% %__unprocessedBuildArgs%
348 if errorlevel 1 (
349     echo %__MsgPrefix%Error: build failed.
350     exit /b 1
351 )
352
353 :SkipManagedBuild
354
355 REM =========================================================================================
356 REM ===
357 REM === Prepare the test drop
358 REM ===
359 REM =========================================================================================
360
361 echo %__MsgPrefix%Removing 'ni' files and 'lock' folders from %__TestBinDir%
362 REM Remove any NI from previous runs.
363 powershell -NoProfile "Get-ChildItem -path %__TestBinDir% -Include '*.ni.*' -Recurse -Force | Remove-Item -force"
364 REM Remove any lock folder used for synchronization from previous runs.
365 powershell -NoProfile "Get-ChildItem -path %__TestBinDir% -Include 'lock' -Recurse -Force |  where {$_.Attributes -eq 'Directory'}| Remove-Item -force -Recurse"
366
367 set CORE_ROOT=%__TestBinDir%\Tests\Core_Root
368 set CORE_ROOT_STAGE=%__TestBinDir%\Tests\Core_Root_Stage
369 if exist "%CORE_ROOT%" rd /s /q "%CORE_ROOT%"
370 if exist "%CORE_ROOT_STAGE%" rd /s /q "%CORE_ROOT_STAGE%"
371 md "%CORE_ROOT%"
372 md "%CORE_ROOT_STAGE%"
373 xcopy "%__BinDir%" "%CORE_ROOT_STAGE%"
374
375 if defined __BuildAgainstPackagesArg ( 
376     if "%__TargetsWindows%"=="0" (
377
378         if not exist %__PackagesDir%\TestNativeBins (
379             echo %__MsgPrefix%Error: Ensure you have run sync.cmd -ab before building a non-Windows test overlay against packages
380             exit /b 1
381         )
382
383         for /R %__PackagesDir%\TestNativeBins\%__RuntimeId%\%__BuildType% %%f in (*.so) do copy %%f %CORE_ROOT_STAGE%
384         for /R %__PackagesDir%\TestNativeBins\%__RuntimeId%\%__BuildType% %%f in (*.dylib) do copy %%f %CORE_ROOT_STAGE%
385     )
386 )
387
388 REM =========================================================================================
389 REM ===
390 REM === Create the test overlay
391 REM ===
392 REM =========================================================================================
393
394 echo %__MsgPrefix%Creating test overlay
395
396 set RuntimeIdArg=
397 if defined __RuntimeId (
398     set RuntimeIdArg=-RuntimeID="%__RuntimeId%"
399 )
400
401 set TargetsWindowsArg=
402 set TargetsWindowsMsbuildArg=
403 if "%__TargetsWindows%"=="1" (
404     set TargetsWindowsArg=-TargetsWindows=true
405     set TargetsWindowsMsbuildArg=/p:TargetsWindows=true
406 ) else if "%__TargetsWindows%"=="0" (
407     set TargetsWindowsArg=-TargetsWindows=false
408     set TargetsWindowsMsbuildArg=/p:TargetsWindows=false
409 )
410
411 set __BuildLogRootName=Tests_Overlay_Managed
412 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
413 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
414 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
415 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
416 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
417 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
418 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
419
420 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\tests\runtest.proj -testOverlay !__Logging! %__RunArgs% %RuntimeIdArg% %__PriorityArg% %__PassThroughArg% %__UnprocessedBuildArgs%
421 if errorlevel 1 (
422     echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
423     echo     %__BuildLog%
424     echo     %__BuildWrn%
425     echo     %__BuildErr%
426     exit /b 1
427 )
428
429 xcopy /s /y "%CORE_ROOT_STAGE%" "%CORE_ROOT%"
430
431 REM =========================================================================================
432 REM ===
433 REM === Create the test host necessary for running CoreFX tests.
434 REM === The test host includes a dotnet executable, system libraries and CoreCLR assemblies found in CORE_ROOT.
435 REM ===
436 REM =========================================================================================
437
438 echo %__MsgPrefix%Building CoreFX test host
439
440 set __BuildLogRootName=Tests_CoreFX_Testhost
441 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
442 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
443 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
444 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
445 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
446 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
447 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
448
449 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\tests\runtest.proj -testHost !__Logging! %__RunArgs% %RuntimeIdArg% %__PriorityArg% %__PassThroughArg% %__UnprocessedBuildArgs%
450 if errorlevel 1 (
451     echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
452     echo     %__BuildLog%
453     echo     %__BuildWrn%
454     echo     %__BuildErr%
455     exit /b 1
456 )
457
458 REM =========================================================================================
459 REM ===
460 REM === Create test wrappers.
461 REM ===
462 REM =========================================================================================
463
464 if defined __SkipManaged goto SkipBuildingWrappers
465
466 echo %__MsgPrefix%Creating test wrappers
467
468 set __BuildLogRootName=Tests_XunitWrapper
469 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
470 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
471 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
472 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
473 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
474 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
475 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
476
477 REM Build wrappers using the local SDK's msbuild. As we move to arcade, the other builds should be moved away from run.exe as well.
478 call %DotNetCli% msbuild %__ProjectDir%\tests\runtest.proj /p:RestoreAdditionalProjectSources=https://dotnet.myget.org/F/dotnet-core/  /p:BuildWrappers=true !__Logging! %__msbuildArgs% %TargetsWindowsMsbuildArg% %__BuildAgainstPackagesMsbuildArg% %__UnprocessedBuildArgs%
479 if errorlevel 1 (
480     echo %__MsgPrefix%Error: Xunit wrapper build failed. Refer to the build log files for details:
481     echo     %__BuildLog%
482     echo     %__BuildWrn%
483     echo     %__BuildErr%
484     exit /b 1
485 )
486
487 echo { "build_os": "%__BuildOS%", "build_arch": "%__BuildArch%", "build_type": "%__BuildType%" } > "%__TestBinDir%/build_info.json"
488
489 :SkipBuildingWrappers
490
491 REM =========================================================================================
492 REM ===
493 REM === Crossgen assemblies if needed.
494 REM ===
495 REM =========================================================================================
496
497 set __CrossgenArg = ""
498 if defined __DoCrossgen (
499     set __CrossgenArg="-Crossgen"
500     if "%__TargetsWindows%" == "1" (
501         echo %__MsgPrefix%Running crossgen on framework assemblies
502         call :PrecompileFX
503     ) else (
504         echo "%__MsgPrefix%Crossgen only supported on Windows, for now"
505     )
506 )
507
508 rd /s /q "%CORE_ROOT_STAGE%"
509
510 REM =========================================================================================
511 REM ===
512 REM === Prep test binaries for Helix publishing
513 REM ===
514 REM =========================================================================================
515
516 if not defined __ZipTests goto SkipPrepForPublish
517
518 echo %__MsgPrefix%Preparing test binaries for Helix publishing
519
520 set __BuildLogRootName=Helix_Prep
521 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
522 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
523 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
524 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
525 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
526 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
527 set __Logging=-MsBuildLog=!__MsbuildLog! -MsBuildWrn=!__MsbuildWrn! -MsBuildErr=!__MsbuildErr!
528
529 call %__ProjectDir%\run.cmd build -Project=%__ProjectDir%\tests\helixprep.proj !__Logging! %__RunArgs% %__BuildAgainstPackagesArg% %RuntimeIdArg% %TargetsWindowsArg% %__CrossgenArg% %__PriorityArg% %__PassThroughArg% %__UnprocessedBuildArgs%
530 if errorlevel 1 (
531     echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
532     echo     %__BuildLog%
533     echo     %__BuildWrn%
534     echo     %__BuildErr%
535     exit /b 1
536 )
537
538 :SkipPrepForPublish
539
540 REM =========================================================================================
541 REM ===
542 REM === All builds complete!
543 REM ===
544 REM =========================================================================================
545
546 echo %__MsgPrefix%Test build succeeded.  Finished at %TIME%
547 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
548 exit /b 0
549
550 :Usage
551 echo.
552 echo Build the CoreCLR tests.
553 echo.
554 echo Usage:
555 echo     %0 [option1] [option2] ...
556 echo All arguments are optional. Options are case-insensitive. The options are:
557 echo.
558 echo.-? -h -help --help: view this message.
559 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
560 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
561 echo skipmanaged: skip the managed tests build
562 echo skipnative: skip the native tests build
563 echo buildtesthostonly: build the CoreFX testhost only
564 echo buildagainstpackages: builds tests against restored packages, instead of against a built product.
565 echo skiprestorepackages: skip package restore
566 echo runtimeid ^<ID^>: Builds a test overlay for the specified OS ^(Only supported when building against packages^). Supported IDs are:
567 echo     alpine.3.4.3-x64: Builds overlay for Alpine 3.4.3
568 echo     debian.8-x64: Builds overlay for Debian 8
569 echo     fedora.24-x64: Builds overlay for Fedora 24
570 echo     linux-x64: Builds overlay for portable linux
571 echo     opensuse.42.1-x64: Builds overlay for OpenSUSE 42.1
572 echo     osx.10.12-x64: Builds overlay for OSX 10.12
573 echo     osx-x64: Builds overlay for portable OSX
574 echo     rhel.7-x64: Builds overlay for RHEL 7 or CentOS
575 echo     ubuntu.14.04-x64: Builds overlay for Ubuntu 14.04
576 echo     ubuntu.16.04-x64: Builds overlay for Ubuntu 16.04
577 echo     ubuntu.16.10-x64: Builds overlay for Ubuntu 16.10
578 echo     win-x64: Builds overlay for portable Windows
579 echo     win7-x64: Builds overlay for Windows 7
580 echo ziptests: zips CoreCLR tests and Core_Root for a Helix run
581 echo crossgen: Precompiles the framework managed assemblies
582 echo targetsNonWindows:
583 echo Exclude- Optional parameter - specify location of default exclusion file ^(defaults to tests\issues.targets if not specified^)
584 echo     Set to "" to disable default exclusion file.
585 echo -- ... : all arguments following this tag will be passed directly to msbuild.
586 echo -priority=^<N^> : specify a set of tests that will be built and run, with priority N.
587 echo     0: Build only priority 0 cases as essential testcases (default)
588 echo     1: Build all tests with priority 0 and 1
589 echo     666: Build all tests with priority 0, 1 ... 666
590 echo -verbose: enables detailed file logging for the msbuild tasks into the msbuild log file.
591 exit /b 1
592
593 :NoDIA
594 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
595 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
596 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
597 of the previous version to "%VSINSTALLDIR%" and then build.
598 REM DIA SDK not included in Express editions
599 echo Visual Studio Express does not include the DIA SDK. ^
600 You need Visual Studio 2015 or 2017 (Community is free).
601 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
602 exit /b 1
603
604 :PrecompileFX
605 for %%F in (%CORE_ROOT%\*.dll) do call :PrecompileAssembly "%%F" %%~nF%%~xF
606 exit /b 0
607
608 REM Compile the managed assemblies in Core_ROOT before running the tests
609 :PrecompileAssembly
610
611 REM Skip mscorlib since it is already precompiled.
612 if /I "%2" == "mscorlib.dll" exit /b 0
613 if /I "%2" == "mscorlib.ni.dll" exit /b 0
614 REM don't precompile anything from CoreCLR
615 if /I exist %CORE_ROOT_STAGE%\%2 exit /b 0
616
617 "%CORE_ROOT_STAGE%\crossgen.exe" /Platform_Assemblies_Paths "%CORE_ROOT%" /in "%1" /out "%CORE_ROOT%/temp.ni.dll" >nul 2>nul
618 set /a __exitCode = %errorlevel%
619 if "%__exitCode%" == "-2146230517" (
620     echo %2 is not a managed assembly.
621     exit /b 0
622 )
623
624 if %__exitCode% neq 0 (
625     echo Unable to precompile %2
626     exit /b 0
627 )
628
629 REM Delete original .dll & replace it with the Crossgened .dll
630 del %1
631 ren "%CORE_ROOT%\temp.ni.dll" %2
632     
633 echo Successfully precompiled %2
634 exit /b 0