Set vtable offset as contained
[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 NOT [%ERRORLEVEL%]==[0] (
170     exit /b %ERRORLEVEL%
171 )
172 @if defined _echo @echo on
173
174 set "__ToolsDir=%__ProjectDir%\Tools"
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 errorlevel 1 (
184     echo %__MsgPrefix%Error: setup-stress-dependencies failed.
185     goto     :Exit_Failure
186 )
187 @if defined _echo @echo on
188
189 REM =========================================================================================
190 REM ===
191 REM === Native test build section
192 REM ===
193 REM =========================================================================================
194
195 if defined __SkipNative goto skipnative
196
197 echo %__MsgPrefix%Commencing build of native test components for %__BuildArch%/%__BuildType%
198
199 REM Set the environment for the native build
200 set __VCBuildArch=x86_amd64
201 if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
202 if /i "%__BuildArch%" == "arm" ( set __VCBuildArch=x86_arm )
203 if /i "%__BuildArch%" == "arm64" ( set __VCBuildArch=x86_arm64 )
204
205 echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" %__VCBuildArch%
206 call                                 "%__VCToolsRoot%\vcvarsall.bat" %__VCBuildArch%
207 @if defined _echo @echo on
208
209 if not defined VSINSTALLDIR (
210     echo %__MsgPrefix%Error: VSINSTALLDIR variable not defined.
211     exit /b 1
212 )
213 if not exist "%VSINSTALLDIR%DIA SDK" goto NoDIA
214
215 pushd "%__NativeTestIntermediatesDir%"
216 set __ExtraCmakeArgs="-DCMAKE_SYSTEM_VERSION=10.0"
217 call "%__SourceDir%\pal\tools\gen-buildsys-win.bat" ""%__ProjectFilesDir%"" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
218 @if defined _echo @echo on
219 popd
220
221 if not exist "%__NativeTestIntermediatesDir%\install.vcxproj" (
222     echo %__MsgPrefix%Failed to generate test native component build project!
223     exit /b 1
224 )
225
226 set __BuildLogRootName=Tests_Native
227 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
228 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
229 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
230 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
231 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
232 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
233 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
234
235 call "%__ProjectDir%\cmake_msbuild.cmd" /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
236   /l:BinClashLogger,Tools/net46/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
237   /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
238   /p:UsePartialNGENOptimization=false /maxcpucount^
239   "%__NativeTestIntermediatesDir%\install.vcxproj"^
240   !__Logging! /p:Configuration=%__BuildType% /p:Platform=%__BuildArch% %__CommonMSBuildArgs% %__PriorityArg% %__UnprocessedBuildArgs%
241 if errorlevel 1 (
242     echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
243     echo     %__BuildLog%
244     echo     %__BuildWrn%
245     echo     %__BuildErr%
246     exit /b 1
247 )
248
249 :skipnative
250
251 REM =========================================================================================
252 REM ===
253 REM === Restore product binaries from packages
254 REM ===
255 REM =========================================================================================
256
257 if "%__SkipRestorePackages%" == 1 goto SkipRestoreProduct
258
259 echo %__MsgPrefix%Restoring CoreCLR product from packages
260
261 if not defined XunitTestBinBase set XunitTestBinBase=%__TestBinDir%
262 set "CORE_ROOT=%XunitTestBinBase%\Tests\Core_Root"
263
264 set __BuildLogRootName=Restore_Product
265 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
266 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
267 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
268 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
269 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
270 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
271 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
272
273 call "%__ProjectDir%\dotnet.cmd" msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
274   /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
275   /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
276   /p:UsePartialNGENOptimization=false /maxcpucount^
277   %__ProjectDir%\tests\build.proj /t:BatchRestorePackages^
278   !__Logging! %__CommonMSBuildArgs% %__PriorityArg% %__UnprocessedBuildArgs%
279
280 :SkipRestoreProduct
281
282 REM =========================================================================================
283 REM ===
284 REM === Managed test build section
285 REM ===
286 REM =========================================================================================
287
288 if defined __SkipManaged goto SkipManagedBuild
289
290 echo %__MsgPrefix%Starting the Managed Tests Build
291
292 if not defined VSINSTALLDIR (
293     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.
294     exit /b 1
295 )
296 set __AppendToLog=false
297 set __BuildLogRootName=Tests_Managed
298 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
299 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
300 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
301
302 REM Execute msbuild test build in stages - workaround for excessive data retention in MSBuild ConfigCache
303 REM See https://github.com/Microsoft/msbuild/issues/2993
304
305 set __SkipPackageRestore=false
306 set __SkipTargetingPackBuild=false
307 set __NumberOfTestGroups=3
308
309 if %__Priority% GTR 0 (set __NumberOfTestGroups=10)
310 echo %__MsgPrefix%Building tests divided into %__NumberOfTestGroups% test groups
311
312 for /l %%G in (1, 1, %__NumberOfTestGroups%) do (
313
314     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%";Append=!__AppendToLog!
315     set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%";Append=!__AppendToLog!
316     set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%";Append=!__AppendToLog!
317
318     set __TestGroupToBuild=%%G
319     echo Running: msbuild %__ProjectDir%\tests\build.proj !__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! %TargetsWindowsMsbuildArg% %__msbuildArgs% !__PriorityArg! %__UnprocessedBuildArgs%
320
321     call "%__ProjectDir%\dotnet.cmd" msbuild %__ProjectDir%\tests\build.proj !__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! %TargetsWindowsMsbuildArg% %__msbuildArgs% !__PriorityArg! %__UnprocessedBuildArgs%
322
323     if errorlevel 1 (
324         echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
325         echo     %__BuildLog%
326         echo     %__BuildWrn%
327         echo     %__BuildErr%
328         REM This is necessary because of a(n apparent) bug in the FOR /L command.  Under certain circumstances,
329         REM such as when this script is invoke with CMD /C "build-test.cmd", a non-zero exit directly from
330         REM within the loop body will not propagate to the caller.  For some reason, goto works around it.
331         goto     :Exit_Failure
332     )
333
334     set __SkipPackageRestore=true
335     set __SkipTargetingPackBuild=true
336     set __AppendToLog=true
337 )
338
339 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
340 REM drastically fewer Pri-1 tests than expected.
341 echo %__MsgPrefix%Check the managed tests build
342 echo Running: dotnet msbuild %__ProjectDir%\tests\runtest.proj /t:CheckTestBuild /p:CLRTestPriorityToBuild=%__Priority% %__msbuildArgs% %__unprocessedBuildArgs%
343 call "%__ProjectDir%\dotnet.cmd" msbuild %__ProjectDir%\tests\runtest.proj /t:CheckTestBuild /p:CLRTestPriorityToBuild=%__Priority% %__msbuildArgs% %__unprocessedBuildArgs%
344 if errorlevel 1 (
345     echo %__MsgPrefix%Error: build failed.
346     exit /b 1
347 )
348
349 :SkipManagedBuild
350
351 REM =========================================================================================
352 REM ===
353 REM === Prepare the test drop
354 REM ===
355 REM =========================================================================================
356
357 echo %__MsgPrefix%Removing 'ni' files and 'lock' folders from %__TestBinDir%
358 REM Remove any NI from previous runs.
359 powershell -NoProfile "Get-ChildItem -path %__TestBinDir% -Include '*.ni.*' -Recurse -Force | Remove-Item -force"
360 REM Remove any lock folder used for synchronization from previous runs.
361 powershell -NoProfile "Get-ChildItem -path %__TestBinDir% -Include 'lock' -Recurse -Force |  where {$_.Attributes -eq 'Directory'}| Remove-Item -force -Recurse"
362
363 set CORE_ROOT=%__TestBinDir%\Tests\Core_Root
364 set CORE_ROOT_STAGE=%__TestBinDir%\Tests\Core_Root_Stage
365 if exist "%CORE_ROOT%" rd /s /q "%CORE_ROOT%"
366 if exist "%CORE_ROOT_STAGE%" rd /s /q "%CORE_ROOT_STAGE%"
367 md "%CORE_ROOT%"
368 md "%CORE_ROOT_STAGE%"
369 xcopy /s "%__BinDir%" "%CORE_ROOT_STAGE%"
370
371 REM =========================================================================================
372 REM ===
373 REM === Create the test overlay
374 REM ===
375 REM =========================================================================================
376
377 echo %__MsgPrefix%Creating test overlay
378
379 set RuntimeIdArg=
380 if defined __RuntimeId (
381     set RuntimeIdArg=/p:RuntimeId="%__RuntimeId%"
382 )
383
384 set __BuildLogRootName=Tests_Overlay_Managed
385 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
386 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
387 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
388 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
389 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
390 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
391 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
392
393 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
394   /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
395   /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
396   /p:UsePartialNGENOptimization=false /maxcpucount^
397   %__ProjectDir%\tests\runtest.proj /t:CreateTestOverlay^
398   !__Logging! %__CommonMSBuildArgs% %RuntimeIdArg% %__PriorityArg% %__UnprocessedBuildArgs%
399 if errorlevel 1 (
400     echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
401     echo     %__BuildLog%
402     echo     %__BuildWrn%
403     echo     %__BuildErr%
404     exit /b 1
405 )
406
407 xcopy /s /y "%CORE_ROOT_STAGE%" "%CORE_ROOT%"
408
409 REM =========================================================================================
410 REM ===
411 REM === Create the test host necessary for running CoreFX tests.
412 REM === The test host includes a dotnet executable, system libraries and CoreCLR assemblies found in CORE_ROOT.
413 REM ===
414 REM =========================================================================================
415
416 echo %__MsgPrefix%Building CoreFX test host
417
418 set __BuildLogRootName=Tests_CoreFX_Testhost
419 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
420 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
421 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
422 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
423 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
424 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
425 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
426
427 call %__ProjectDir%\dotnet.cmd msbuild /nologo /verbosity:minimal /clp:Summary /nodeReuse:false^
428   /l:BinClashLogger,Tools/Microsoft.DotNet.Build.Tasks.dll;LogFile=binclash.log^
429   /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
430   /p:UsePartialNGENOptimization=false /maxcpucount^
431   %__ProjectDir%\tests\runtest.proj /t:CreateTestHost^
432   !__Logging! %__CommonMSBuildArgs% %RuntimeIdArg% %__PriorityArg% %__UnprocessedBuildArgs%
433 if errorlevel 1 (
434     echo %__MsgPrefix%Error: build failed. Refer to the build log files for details:
435     echo     %__BuildLog%
436     echo     %__BuildWrn%
437     echo     %__BuildErr%
438     exit /b 1
439 )
440
441 REM =========================================================================================
442 REM ===
443 REM === Create test wrappers.
444 REM ===
445 REM =========================================================================================
446
447 if defined __SkipManaged goto SkipBuildingWrappers
448
449 echo %__MsgPrefix%Creating test wrappers
450
451 set __BuildLogRootName=Tests_XunitWrapper
452 set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.log
453 set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn
454 set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__BuildOS%__%__BuildArch%__%__BuildType%.err
455 set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
456 set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
457 set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
458 set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
459
460 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.
461 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%
462 if errorlevel 1 (
463     echo %__MsgPrefix%Error: Xunit wrapper build failed. Refer to the build log files for details:
464     echo     %__BuildLog%
465     echo     %__BuildWrn%
466     echo     %__BuildErr%
467     exit /b 1
468 )
469
470 echo { "build_os": "%__BuildOS%", "build_arch": "%__BuildArch%", "build_type": "%__BuildType%" } > "%__TestBinDir%/build_info.json"
471
472 :SkipBuildingWrappers
473
474 REM =========================================================================================
475 REM ===
476 REM === Crossgen assemblies if needed.
477 REM ===
478 REM =========================================================================================
479
480 set __CrossgenArg = ""
481 if defined __DoCrossgen (
482     set __CrossgenArg="/p:Crossgen=true"
483     if "%__TargetsWindows%" == "1" (
484         echo %__MsgPrefix%Running crossgen on framework assemblies
485         call :PrecompileFX
486     ) else (
487         echo "%__MsgPrefix%Crossgen only supported on Windows, for now"
488     )
489 )
490
491 rd /s /q "%CORE_ROOT_STAGE%"
492
493 REM =========================================================================================
494 REM ===
495 REM === All builds complete!
496 REM ===
497 REM =========================================================================================
498
499 echo %__MsgPrefix%Test build succeeded.  Finished at %TIME%
500 echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
501 exit /b 0
502
503 :Usage
504 echo.
505 echo Build the CoreCLR tests.
506 echo.
507 echo Usage:
508 echo     %0 [option1] [option2] ...
509 echo All arguments are optional. Options are case-insensitive. The options are:
510 echo.
511 echo.-? -h -help --help: view this message.
512 echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
513 echo Build type: one of Debug, Checked, Release ^(default: Debug^).
514 echo skipmanaged: skip the managed tests build
515 echo skipnative: skip the native tests build
516 echo buildtesthostonly: build the CoreFX testhost only
517 echo skiprestorepackages: skip package restore
518 echo runtimeid ^<ID^>: Builds a test overlay for the specified OS ^(Only supported when building against packages^). Supported IDs are:
519 echo     alpine.3.4.3-x64: Builds overlay for Alpine 3.4.3
520 echo     debian.8-x64: Builds overlay for Debian 8
521 echo     fedora.24-x64: Builds overlay for Fedora 24
522 echo     linux-x64: Builds overlay for portable linux
523 echo     opensuse.42.1-x64: Builds overlay for OpenSUSE 42.1
524 echo     osx.10.12-x64: Builds overlay for OSX 10.12
525 echo     osx-x64: Builds overlay for portable OSX
526 echo     rhel.7-x64: Builds overlay for RHEL 7 or CentOS
527 echo     ubuntu.14.04-x64: Builds overlay for Ubuntu 14.04
528 echo     ubuntu.16.04-x64: Builds overlay for Ubuntu 16.04
529 echo     ubuntu.16.10-x64: Builds overlay for Ubuntu 16.10
530 echo     win-x64: Builds overlay for portable Windows
531 echo     win7-x64: Builds overlay for Windows 7
532 echo crossgen: Precompiles the framework managed assemblies
533 echo targetsNonWindows:
534 echo Exclude- Optional parameter - specify location of default exclusion file ^(defaults to tests\issues.targets if not specified^)
535 echo     Set to "" to disable default exclusion file.
536 echo -- ... : all arguments following this tag will be passed directly to msbuild.
537 echo -priority=^<N^> : specify a set of tests that will be built and run, with priority N.
538 echo     0: Build only priority 0 cases as essential testcases (default)
539 echo     1: Build all tests with priority 0 and 1
540 echo     666: Build all tests with priority 0, 1 ... 666
541 echo -verbose: enables detailed file logging for the msbuild tasks into the msbuild log file.
542 exit /b 1
543
544 :NoDIA
545 echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
546 This is due to a bug in the Visual Studio installer. It does not install DIA SDK at "%VSINSTALLDIR%" but rather ^
547 at the install location of previous Visual Studio version. The workaround is to copy the DIA SDK folder from the Visual Studio install location ^
548 of the previous version to "%VSINSTALLDIR%" and then build.
549 REM DIA SDK not included in Express editions
550 echo Visual Studio Express does not include the DIA SDK. ^
551 You need Visual Studio 2017 or 2019 (Community is free).
552 echo See: https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/developer-guide.md#prerequisites
553 exit /b 1
554
555 :PrecompileFX
556 for %%F in (%CORE_ROOT%\*.dll) do call :PrecompileAssembly "%%F" %%~nF%%~xF
557 exit /b 0
558
559 REM Compile the managed assemblies in Core_ROOT before running the tests
560 :PrecompileAssembly
561
562 REM Skip mscorlib since it is already precompiled.
563 if /I "%2" == "mscorlib.dll" exit /b 0
564 if /I "%2" == "mscorlib.ni.dll" exit /b 0
565 REM don't precompile anything from CoreCLR
566 if /I exist %CORE_ROOT_STAGE%\%2 exit /b 0
567
568 REM Don't precompile xunit.* files
569 echo "%2" | findstr /b "xunit." >nul && (
570   exit /b 0
571 )
572
573 set __CrossgenExe="%CORE_ROOT_STAGE%\crossgen.exe"
574 if /i "%__BuildArch%" == "arm" ( set __CrossgenExe="%CORE_ROOT_STAGE%\x86\crossgen.exe" )
575 if /i "%__BuildArch%" == "arm64" ( set __CrossgenExe="%CORE_ROOT_STAGE%\x64\crossgen.exe" )
576
577 "%__CrossgenExe%" /Platform_Assemblies_Paths "%CORE_ROOT%" /in "%1" /out "%CORE_ROOT%/temp.ni.dll" >nul 2>nul
578 set /a __exitCode = %errorlevel%
579 if "%__exitCode%" == "-2146230517" (
580     echo %2 is not a managed assembly.
581     exit /b 0
582 )
583
584 if %__exitCode% neq 0 (
585     echo Unable to precompile %2, Exit Code is %__exitCode%
586     exit /b 0
587 )
588
589 REM Delete original .dll & replace it with the Crossgened .dll
590 del %1
591 ren "%CORE_ROOT%\temp.ni.dll" %2
592     
593 echo Successfully precompiled %2
594 exit /b 0
595
596 :Exit_Failure
597 exit /b 1