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