paddle_build.bat 33.1 KB
Newer Older
1
@ECHO OFF
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
rem Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
rem
rem Licensed under the Apache License, Version 2.0 (the "License");
rem you may not use this file except in compliance with the License.
rem You may obtain a copy of the License at
rem
rem     http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.

rem =================================================
rem       Paddle CI Task On Windows Platform
rem =================================================

20
@ECHO ON
21
setlocal enabledelayedexpansion
22

23
rem -------clean up environment-----------
24
set work_dir=%cd%
Z
Zhou Wei 已提交
25
if not defined cache_dir set cache_dir=%work_dir:Paddle=cache%
26 27 28
if not exist %cache_dir%\tools (
    git clone https://github.com/zhouwei25/tools.git %cache_dir%\tools
)
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
taskkill /f /im cmake.exe /t 2>NUL
taskkill /f /im ninja.exe /t 2>NUL
taskkill /f /im MSBuild.exe /t 2>NUL
taskkill /f /im cl.exe /t 2>NUL
taskkill /f /im lib.exe /t 2>NUL
taskkill /f /im link.exe /t 2>NUL
taskkill /f /im vctip.exe /t 2>NUL
taskkill /f /im cvtres.exe /t 2>NUL
taskkill /f /im rc.exe /t 2>NUL
taskkill /f /im mspdbsrv.exe /t 2>NUL
taskkill /f /im csc.exe /t 2>NUL
taskkill /f /im python.exe /t 2>NUL
taskkill /f /im nvcc.exe /t 2>NUL
taskkill /f /im cicc.exe /t 2>NUL
taskkill /f /im ptxas.exe /t 2>NUL
taskkill /f /im op_function_generator.exe /t 2>NUL
45 46
taskkill /f /im eager_generator.exe /t 2>NUL
taskkill /f /im eager_op_function_generator.exe /t 2>NUL
47
wmic process where name="op_function_generator.exe" call terminate 2>NUL
48 49
wmic process where name="eager_generator.exe" call terminate 2>NUL
wmic process where name="eager_op_function_generator.exe" call terminate 2>NUL
50 51
wmic process where name="cvtres.exe" call terminate 2>NUL
wmic process where name="rc.exe" call terminate 2>NUL
52 53
wmic process where name="cl.exe" call terminate 2>NUL
wmic process where name="lib.exe" call terminate 2>NUL
54
wmic process where name="python.exe" call terminate 2>NUL
55

56
rem ------initialize common variable------
57
if not defined GENERATOR set GENERATOR="Visual Studio 15 2017 Win64"
58
if not defined WITH_TENSORRT set WITH_TENSORRT=ON
59 60
if not defined TENSORRT_ROOT set TENSORRT_ROOT=D:/TensorRT
if not defined WITH_GPU set WITH_GPU=ON
61 62 63
if not defined WITH_MKL set WITH_MKL=ON
if not defined WITH_AVX set WITH_AVX=ON
if not defined WITH_TESTING set WITH_TESTING=ON
64
if not defined MSVC_STATIC_CRT set MSVC_STATIC_CRT=ON
65 66
if not defined WITH_PYTHON set WITH_PYTHON=ON
if not defined ON_INFER set ON_INFER=ON
67
if not defined WITH_ONNXRUNTIME set WITH_ONNXRUNTIME=OFF
68
if not defined WITH_INFERENCE_API_TEST set WITH_INFERENCE_API_TEST=ON
69
if not defined WITH_STATIC_LIB set WITH_STATIC_LIB=ON
70
if not defined WITH_TPCACHE set WITH_TPCACHE=OFF
71
if not defined WITH_CACHE set WITH_CACHE=OFF
72
if not defined WITH_SCCACHE set WITH_SCCACHE=OFF
73
if not defined WITH_UNITY_BUILD set WITH_UNITY_BUILD=OFF
74
if not defined INFERENCE_DEMO_INSTALL_DIR set INFERENCE_DEMO_INSTALL_DIR=%cache_dir:\=/%/inference_demo
75
if not defined LOG_LEVEL set LOG_LEVEL=normal
76
if not defined PRECISION_TEST set PRECISION_TEST=OFF
77
if not defined NIGHTLY_MODE set NIGHTLY_MODE=OFF
78
if not defined retry_times set retry_times=1
79
if not defined PYTHON_ROOT set PYTHON_ROOT=C:\Python37
80
if not defined BUILD_DIR set BUILD_DIR=build
S
Sing_chan 已提交
81 82 83 84
if not defined NEW_RELEASE_ALL set NEW_RELEASE_ALL=ON
if not defined NEW_RELEASE_PYPI set NEW_RELEASE_PYPI=OFF
if not defined NEW_RELEASE_JIT set NEW_RELEASE_JIT=OFF

85
set task_name=%1
86
set UPLOAD_TP_FILE=OFF
87

88 89 90
set error_code=0
type %cache_dir%\error_code.txt

91 92 93
rem ------initialize set git config------
git config --global core.longpaths true

94 95 96 97 98 99 100
rem ------initialize the python environment------
set PYTHON_EXECUTABLE=%PYTHON_ROOT%\python.exe
set PATH=%PYTHON_ROOT%\Scripts;%PYTHON_ROOT%;%PATH%
if "%WITH_PYTHON%" == "ON" (
    where python
    where pip
    pip install wheel --user
101
    pip install pyyaml --user
102
    pip install wget --user
103 104 105
    pip install -r %work_dir%\python\requirements.txt --user
    if !ERRORLEVEL! NEQ 0 (
        echo pip install requirements.txt failed!
106
        exit /b 5
107 108 109 110
    )
)

rem -------Caching strategy 1: keep build directory for incremental compilation-----------
111 112 113 114 115 116 117
rmdir %BUILD_DIR%\python /s/q
rmdir %BUILD_DIR%\paddle\third_party\externalError /s/q
rem rmdir %BUILD_DIR%\paddle\fluid\pybind /s/q
rmdir %BUILD_DIR%\paddle_install_dir /s/q
rmdir %BUILD_DIR%\paddle_inference_install_dir /s/q
rmdir %BUILD_DIR%\paddle_inference_c_install_dir /s/q
del %BUILD_DIR%\CMakeCache.txt
118

119
if "%WITH_CACHE%"=="OFF" (
120
    rmdir %BUILD_DIR% /s/q
121 122 123
    goto :mkbuild
)

124
: set /p error_code=< %cache_dir%\error_code.txt
Z
Zhou Wei 已提交
125
if %error_code% NEQ 0 (
126
    rmdir %BUILD_DIR% /s/q
Z
Zhou Wei 已提交
127 128 129
    goto :mkbuild
)

130
setlocal enabledelayedexpansion
Z
Zhou Wei 已提交
131 132 133
git show-ref --verify --quiet refs/heads/last_pr
if %ERRORLEVEL% EQU 0 (
    git diff HEAD last_pr --stat --name-only
134
    git diff HEAD last_pr --stat --name-only | findstr "setup.py.in"
135
    if !ERRORLEVEL! EQU 0 (
136
        rmdir %BUILD_DIR% /s/q
137
    )
Z
Zhou Wei 已提交
138 139 140
    git branch -D last_pr
    git branch last_pr
) else (
141
    rmdir %BUILD_DIR% /s/q
Z
Zhou Wei 已提交
142 143 144
    git branch last_pr
)

145 146 147 148 149 150 151
for /F %%# in ('wmic os get localdatetime^|findstr 20') do set datetime=%%#
set day_now=%datetime:~6,2%
set day_before=-1
set /p day_before=< %cache_dir%\day.txt
if %day_now% NEQ %day_before% (
    echo %day_now% > %cache_dir%\day.txt
    type %cache_dir%\day.txt
152
    rmdir %BUILD_DIR% /s/q
153 154 155
    goto :mkbuild
)

156
:mkbuild
157
if not exist %BUILD_DIR% (
Z
Zhou Wei 已提交
158
    echo Windows build cache FALSE
Z
zhangchunle 已提交
159
    set Windows_Build_Cache=FALSE
160
    mkdir %BUILD_DIR%
Z
Zhou Wei 已提交
161 162
) else (
    echo Windows build cache TRUE
Z
zhangchunle 已提交
163
    set Windows_Build_Cache=TRUE
164
)
Z
zhangchunle 已提交
165
echo ipipe_log_param_Windows_Build_Cache: %Windows_Build_Cache%
166
cd /d %BUILD_DIR%
167
dir .
Z
Zhou Wei 已提交
168
dir %cache_dir%
169
dir paddle\fluid\pybind\Release
170 171
rem -------Caching strategy 1: End --------------------------------

172

173
rem -------Caching strategy 2: sccache decorate compiler-----------
174
if not defined SCCACHE_ROOT set SCCACHE_ROOT=D:\sccache
175
if "%WITH_SCCACHE%"=="ON" (
176
    cmd /C sccache -V || call :install_sccache
177
    sccache --stop-server 2> NUL
178
    del %SCCACHE_ROOT%\sccache_log.txt
179 180

    :: Localy storage on windows
181 182
    if not exist %SCCACHE_ROOT% mkdir %SCCACHE_ROOT%
    set SCCACHE_DIR=%SCCACHE_ROOT%\.cache
183 184
    
    :: Sccache will shut down if a source file takes more than 10 mins to compile
zhouweiwei2014's avatar
zhouweiwei2014 已提交
185
    set SCCACHE_IDLE_TIMEOUT=0
186
    set SCCACHE_CACHE_SIZE=100G
187
    set SCCACHE_ERROR_LOG=%SCCACHE_ROOT%\sccache_log.txt
188
    set SCCACHE_LOG=quiet
189 190 191 192 193 194 195

    :: Distributed storage on windows
    set SCCACHE_ENDPOINT=s3.bj.bcebos.com
    set SCCACHE_BUCKET=paddle-windows
    set SCCACHE_S3_KEY_PREFIX=sccache/
    set SCCACHE_S3_USE_SSL=true

196 197 198 199
    sccache --start-server
    sccache -z
    goto :CASE_%1
) else (
200
    del %PYTHON_ROOT%\sccache.exe 2> NUL
201 202
    goto :CASE_%1
)
203

204 205 206 207
:install_sccache
echo There is not sccache in this PC, will install sccache.
echo Download package from https://paddle-ci.gz.bcebos.com/window_requirement/sccache.exe
%PYTHON_ROOT%\python.exe -c "import wget;wget.download('https://paddle-ci.gz.bcebos.com/window_requirement/sccache.exe')"
208
xcopy sccache.exe %PYTHON_ROOT%\ /Y
209
del sccache.exe
210 211
goto:eof
rem -------Caching strategy 2: End --------------------------------
212 213 214

echo "Usage: paddle_build.bat [OPTION]"
echo "OPTION:"
215 216
echo "wincheck_mkl: run Windows MKL/GPU PR CI tasks on Windows"
echo "wincheck_openbals: run Windows OPENBLAS/CPU PR CI tasks on Windows"
217 218
echo "build_avx_whl: build Windows avx whl package on Windows"
echo "build_no_avx_whl: build Windows no avx whl package on Windows"
219
echo "build_inference_lib: build Windows inference library on Windows"
220 221
exit /b 1

222
rem ------PR CI windows check for MKL/GPU----------
223
:CASE_wincheck_mkl
224
set WITH_MKL=ON
225
set WITH_GPU=ON
226
set WITH_AVX=ON
227
set MSVC_STATIC_CRT=OFF
228
set ON_INFER=OFF
S
Sing_chan 已提交
229
set WITH_TENSORRT=ON
230
set WITH_INFERENCE_API_TEST=OFF
231
if not defined CUDA_ARCH_NAME set CUDA_ARCH_NAME=Auto
232

233 234 235
call :cmake || goto cmake_error
call :build || goto build_error
call :test_whl_pacakage || goto test_whl_pacakage_error
236
call :test_unit || goto test_unit_error
237 238
goto:success

239
rem ------PR CI windows check for OPENBLAS/CPU------
240
:CASE_wincheck_openblas
241
set WITH_MKL=OFF
242
set WITH_GPU=OFF
243
set WITH_AVX=OFF
244
set MSVC_STATIC_CRT=ON
Z
Zhou Wei 已提交
245
set ON_INFER=OFF
246
if not defined CUDA_ARCH_NAME set CUDA_ARCH_NAME=Auto
247

248 249 250
call :cmake || goto cmake_error
call :build || goto build_error
call :test_whl_pacakage || goto test_whl_pacakage_error
251
call :test_unit || goto test_unit_error
252 253
goto:success

254 255 256 257 258 259 260
rem ------PR CI windows check for unittests and inference in CUDA11-MKL-AVX----------
:CASE_wincheck_inference
set WITH_MKL=ON
set WITH_GPU=ON
set WITH_AVX=ON
set MSVC_STATIC_CRT=ON
set ON_INFER=ON
261 262
set WITH_TENSORRT=ON
set WITH_INFERENCE_API_TEST=ON
263
set WITH_ONNXRUNTIME=ON
264
if not defined CUDA_ARCH_NAME set CUDA_ARCH_NAME=Auto
265 266 267 268

call :cmake || goto cmake_error
call :build || goto build_error
call :test_whl_pacakage || goto test_whl_pacakage_error
269
call :test_unit || goto test_unit_error
270
::call :test_inference || goto test_inference_error
271
::call :test_inference_ut || goto test_inference_ut_error
272
::call :check_change_of_unittest || goto check_change_of_unittest_error
273 274
goto:success

275 276 277 278
rem ------Build windows avx whl package------
:CASE_build_avx_whl
set WITH_AVX=ON
set ON_INFER=OFF
279
if not defined CUDA_ARCH_NAME set CUDA_ARCH_NAME=All
280 281 282 283 284 285 286 287 288 289

call :cmake || goto cmake_error
call :build || goto build_error
call :test_whl_pacakage || goto test_whl_pacakage_error
goto:success

rem ------Build windows no-avx whl package------
:CASE_build_no_avx_whl
set WITH_AVX=OFF
set ON_INFER=OFF
290
if not defined CUDA_ARCH_NAME set CUDA_ARCH_NAME=All
291 292 293 294 295 296 297 298

call :cmake || goto cmake_error
call :build || goto build_error
call :test_whl_pacakage || goto test_whl_pacakage_error
goto:success

rem ------Build windows inference library------
:CASE_build_inference_lib
299
set ON_INFER=ON
300
set WITH_PYTHON=OFF
301 302
if not defined CUDA_ARCH_NAME set CUDA_ARCH_NAME=All

303 304
python %work_dir%\tools\remove_grad_op_and_kernel.py
if %errorlevel% NEQ 0 exit /b 1
305 306 307

call :cmake || goto cmake_error
call :build || goto build_error
308 309 310 311 312
call :test_inference
if %errorlevel% NEQ 0 set error_code=%errorlevel%
call :test_inference_ut
if %errorlevel% NEQ 0 set error_code=%errorlevel%

313 314
call :zip_cc_file || goto zip_cc_file_error
call :zip_c_file || goto zip_c_file_error
315
if %error_code% NEQ 0 goto test_inference_error
316 317
goto:success

318 319 320 321
rem "Other configurations are added here"
rem :CASE_wincheck_others
rem call ...

322

323 324
rem ---------------------------------------------------------------------------------------------
:cmake
325
@ECHO OFF
326 327 328
echo    ========================================
echo    Step 1. Cmake ...
echo    ========================================
329

S
Sing_chan 已提交
330 331
rem set vs language to english to block showIncludes, this need vs has installed English language package.
set VSLANG=1033
332
rem Configure the environment for 64-bit builds. 'DISTUTILS_USE_SDK' indicates that the user has selected the compiler.
333 334 335
if not defined vcvars64_dir set vcvars64_dir="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"
call %vcvars64_dir%

336
set DISTUTILS_USE_SDK=1
337 338
rem Windows 10 Kit bin dir
set PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64;%PATH%
339 340
rem Use 64-bit ToolSet to compile
set PreferredToolArchitecture=x64
341

342 343
for /F %%# in ('wmic os get localdatetime^|findstr 20') do set start=%%#
set start=%start:~4,10%
344

345 346 347 348 349 350
if not defined CUDA_TOOLKIT_ROOT_DIR set CUDA_TOOLKIT_ROOT_DIR=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2
set PATH=%TENSORRT_ROOT:/=\%\lib;%CUDA_TOOLKIT_ROOT_DIR:/=\%\bin;%CUDA_TOOLKIT_ROOT_DIR:/=\%\libnvvp;%PATH%

rem CUDA_TOOLKIT_ROOT_DIR in cmake must use / rather than \
set TENSORRT_ROOT=%TENSORRT_ROOT:\=/%
set CUDA_TOOLKIT_ROOT_DIR=%CUDA_TOOLKIT_ROOT_DIR:\=/%
351

352 353 354 355 356
rem install ninja if GENERATOR is Ninja
if %GENERATOR% == "Ninja" (
    pip install ninja
    if %errorlevel% NEQ 0 (
        echo pip install ninja failed!
357
        exit /b 5
358 359 360 361 362 363 364
    )
)

rem ------show summary of current GPU environment----------
cmake --version
if "%WITH_GPU%"=="ON" (
    nvcc --version
365
    nvidia-smi 2>NUL
366 367 368
)

rem ------set third_party cache dir------
369

370
if "%WITH_TPCACHE%"=="OFF" (
371
    set THIRD_PARTY_PATH=%work_dir:\=/%/%BUILD_DIR%/third_party
372 373 374
    goto :cmake_impl
)

375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
rem clear third party cache every ten days
for /F %%# in ('wmic os get localdatetime^|findstr 20') do set datetime=%%#
set day_now=%datetime:~6,2%
set day_before=-1
set /p day_before=< %cache_dir%\day_third_party.txt
if %day_now% NEQ %day_before% (
    echo %day_now% > %cache_dir%\day_third_party.txt
    type %cache_dir%\day_third_party.txt
    if %day_now% EQU 21 (
        rmdir %cache_dir%\third_party /s/q
    )
    if %day_now% EQU 11 (
        rmdir %cache_dir%\third_party /s/q
    )
    if %day_now% EQU 01 (
        rmdir %cache_dir%\third_party /s/q
    )
)

394 395 396 397 398 399 400 401 402
echo set -ex > cache.sh
echo md5_content=$(cat %work_dir:\=/%/cmake/external/*.cmake  ^|md5sum ^| awk '{print $1}') >> cache.sh
echo echo ${md5_content}^>md5.txt >> cache.sh

%cache_dir%\tools\busybox64.exe cat cache.sh
%cache_dir%\tools\busybox64.exe bash cache.sh

set /p md5=< md5.txt
if "%WITH_GPU%"=="ON" (
403
    set cuda_version=%CUDA_TOOLKIT_ROOT_DIR:~-4%
404
    set sub_dir=cuda!cuda_version:.=!
405
) else (
406
    set sub_dir=cpu
407
)
408
set THIRD_PARTY_HOME=%cache_dir:\=/%/third_party/%sub_dir%
409
set THIRD_PARTY_PATH=%THIRD_PARTY_HOME%/%md5%
410

411 412 413 414 415 416 417
echo %task_name%|findstr build >nul && (
    echo %task_name% is a whl-build task, will only reuse local third_party cache.
    goto :cmake_impl
) || ( 
    echo %task_name% is a PR-CI-Windows task, will try to reuse bos and local third_party cache both. 
)

418 419 420 421
if not exist %THIRD_PARTY_PATH% (
    echo There is no usable third_party cache in %THIRD_PARTY_PATH%, will download from bos.
    pip install wget
    if not exist %THIRD_PARTY_HOME% mkdir "%THIRD_PARTY_HOME%"
422
    cd /d %THIRD_PARTY_HOME%
423 424 425 426 427 428
    echo Getting third party: downloading ...
    %PYTHON_ROOT%\python.exe -c "import wget;wget.download('https://paddle-windows.bj.bcebos.com/third_party/%sub_dir%/%md5%.tar.gz')" 2>nul
    if !ERRORLEVEL! EQU 0 (
        echo Getting third party: extracting ...
        tar -xf %md5%.tar.gz
        if !ERRORLEVEL! EQU 0 ( 
429
            echo Get third party from bos successfully.
430
        ) else (
431
            echo Get third party failed, reason: extract failed, will build locally.
432 433 434
        )
        del %md5%.tar.gz
    ) else (
435
        echo Get third party failed, reason: download failed, will build locally.
436
    )
437
    if not exist %THIRD_PARTY_PATH% set UPLOAD_TP_FILE=ON
438
    cd /d %work_dir%\%BUILD_DIR%
439
) else (
440
    echo Found reusable third_party cache in %THIRD_PARTY_PATH%, will reuse it.
441
)
442 443

:cmake_impl
444
echo cmake .. -G %GENERATOR% -DCMAKE_BUILD_TYPE=Release -DWITH_AVX=%WITH_AVX% -DWITH_GPU=%WITH_GPU% -DWITH_MKL=%WITH_MKL% ^
445
-DWITH_TESTING=%WITH_TESTING% -DWITH_PYTHON=%WITH_PYTHON% -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% -DON_INFER=%ON_INFER% ^
446
-DWITH_INFERENCE_API_TEST=%WITH_INFERENCE_API_TEST% -DTHIRD_PARTY_PATH=%THIRD_PARTY_PATH% ^
447
-DINFERENCE_DEMO_INSTALL_DIR=%INFERENCE_DEMO_INSTALL_DIR% -DWITH_STATIC_LIB=%WITH_STATIC_LIB% ^
448
-DWITH_TENSORRT=%WITH_TENSORRT% -DTENSORRT_ROOT="%TENSORRT_ROOT%" -DMSVC_STATIC_CRT=%MSVC_STATIC_CRT% ^
449
-DWITH_UNITY_BUILD=%WITH_UNITY_BUILD% -DCUDA_ARCH_NAME=%CUDA_ARCH_NAME% -DCUB_PATH=%THIRD_PARTY_HOME%/cub ^
S
Sing_chan 已提交
450
-DCUDA_TOOLKIT_ROOT_DIR="%CUDA_TOOLKIT_ROOT_DIR%" -DNEW_RELEASE_ALL=%NEW_RELEASE_ALL% -DNEW_RELEASE_PYPI=%NEW_RELEASE_PYPI% ^
451
-DNEW_RELEASE_JIT=%NEW_RELEASE_JIT% -DWITH_ONNXRUNTIME=%WITH_ONNXRUNTIME%
452

453
cmake .. -G %GENERATOR% -DCMAKE_BUILD_TYPE=Release -DWITH_AVX=%WITH_AVX% -DWITH_GPU=%WITH_GPU% -DWITH_MKL=%WITH_MKL% ^
454
-DWITH_TESTING=%WITH_TESTING% -DWITH_PYTHON=%WITH_PYTHON% -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% -DON_INFER=%ON_INFER% ^
455
-DWITH_INFERENCE_API_TEST=%WITH_INFERENCE_API_TEST% -DTHIRD_PARTY_PATH=%THIRD_PARTY_PATH% ^
456
-DINFERENCE_DEMO_INSTALL_DIR=%INFERENCE_DEMO_INSTALL_DIR% -DWITH_STATIC_LIB=%WITH_STATIC_LIB% ^
457
-DWITH_TENSORRT=%WITH_TENSORRT% -DTENSORRT_ROOT="%TENSORRT_ROOT%" -DMSVC_STATIC_CRT=%MSVC_STATIC_CRT% ^
458
-DWITH_UNITY_BUILD=%WITH_UNITY_BUILD% -DCUDA_ARCH_NAME=%CUDA_ARCH_NAME% -DCUB_PATH=%THIRD_PARTY_HOME%/cub ^
S
Sing_chan 已提交
459
-DCUDA_TOOLKIT_ROOT_DIR="%CUDA_TOOLKIT_ROOT_DIR%" -DNEW_RELEASE_ALL=%NEW_RELEASE_ALL% -DNEW_RELEASE_PYPI=%NEW_RELEASE_PYPI% ^
460
-DNEW_RELEASE_JIT=%NEW_RELEASE_JIT% -DWITH_ONNXRUNTIME=%WITH_ONNXRUNTIME%
461 462 463
goto:eof

:cmake_error
Z
Zhou Wei 已提交
464
echo 7 > %cache_dir%\error_code.txt
465
type %cache_dir%\error_code.txt
466
echo Cmake failed, will exit!
Z
Zhou Wei 已提交
467
exit /b 7
468 469 470

rem ---------------------------------------------------------------------------------------------
:build
471
@ECHO OFF
472
echo    ========================================
473
echo    Step 2. Build Paddle ...
474 475
echo    ========================================

476
for /F %%# in ('wmic cpu get NumberOfLogicalProcessors^|findstr [0-9]') do set /a PARALLEL_PROJECT_COUNT=%%#*4/5
477
echo "PARALLEL PROJECT COUNT is %PARALLEL_PROJECT_COUNT%"
478

479
set build_times=1
480 481 482 483 484 485 486
rem MSbuild will build third_party first to improve compiler stability.
if NOT %GENERATOR% == "Ninja" (
    goto :build_tp
) else (
    goto :build_paddle
)

487
:build_tp
488
echo Build third_party the %build_times% time:
489 490 491
if %GENERATOR% == "Ninja" (
    ninja third_party
) else (
492
    MSBuild /m /p:PreferredToolArchitecture=x64 /p:Configuration=Release /verbosity:%LOG_LEVEL% third_party.vcxproj
493
)
494

495 496
if %ERRORLEVEL% NEQ 0 (
    set /a build_times=%build_times%+1  
497
    if %build_times% GEQ %retry_times% (
Z
Zhou Wei 已提交
498
        exit /b 7
499
    ) else (
500
        echo Build third_party failed, will retry!
501 502 503
        goto :build_tp
    )
)
504
echo Build third_party successfully!
505 506

set build_times=1
507

508
:build_paddle
L
LoveAn 已提交
509
:: reset clcache zero stats for collect PR's actual hit rate
510
rem clcache.exe -z
L
LoveAn 已提交
511

512
rem -------clean up environment again-----------
513 514 515 516 517 518 519 520 521 522 523 524 525 526
taskkill /f /im cmake.exe /t 2>NUL
taskkill /f /im MSBuild.exe /t 2>NUL
taskkill /f /im cl.exe /t 2>NUL
taskkill /f /im lib.exe /t 2>NUL
taskkill /f /im link.exe /t 2>NUL
taskkill /f /im vctip.exe /t 2>NUL
taskkill /f /im cvtres.exe /t 2>NUL
taskkill /f /im rc.exe /t 2>NUL
taskkill /f /im mspdbsrv.exe /t 2>NUL
taskkill /f /im csc.exe /t 2>NUL
taskkill /f /im nvcc.exe /t 2>NUL
taskkill /f /im cicc.exe /t 2>NUL
taskkill /f /im ptxas.exe /t 2>NUL
taskkill /f /im op_function_generator.exe /t 2>NUL
527 528
taskkill /f /im eager_generator.exe /t 2>NUL
taskkill /f /im eager_op_function_generator.exe /t 2>NUL
529
wmic process where name="op_function_generator.exe" call terminate 2>NUL
530 531 532
wmic process where name="eager_generator.exe" call terminate 2>NUL
wmic process where name="eager_op_function_generator.exe" call terminate 2>NUL
wmic process where name="cmake.exe" call terminate 2>NUL
533 534
wmic process where name="cvtres.exe" call terminate 2>NUL
wmic process where name="rc.exe" call terminate 2>NUL
535 536
wmic process where name="cl.exe" call terminate 2>NUL
wmic process where name="lib.exe" call terminate 2>NUL
537

538
if "%WITH_TESTING%"=="ON" (
539
    for /F "tokens=1 delims= " %%# in ('tasklist ^| findstr /i test') do taskkill /f /im %%# /t
540 541
)

542
echo Build Paddle the %build_times% time:
543
if %GENERATOR% == "Ninja" (
544
    ninja all
545
) else (
546
    MSBuild /m:%PARALLEL_PROJECT_COUNT% /p:PreferredToolArchitecture=x64 /p:TrackFileAccess=false /p:Configuration=Release /verbosity:%LOG_LEVEL% ALL_BUILD.vcxproj
547 548
)

549
if %ERRORLEVEL% NEQ 0 (
550
    set /a build_times=%build_times%+1
551
    if %build_times% GEQ %retry_times% (
Z
Zhou Wei 已提交
552
        exit /b 7
553
    ) else (
554
        echo Build Paddle failed, will retry!
555 556 557
        goto :build_paddle
    )
)
558

559 560
if "%UPLOAD_TP_FILE%"=="ON" (
    set BCE_FILE=%cache_dir%\bce-python-sdk-0.8.33\BosClient.py
561 562 563
    echo Uploading third_party: checking bce ...
    if not exist %cache_dir%\bce-python-sdk-0.8.33 (
        echo There is no bce in this PC, will install bce.
564
        cd /d %cache_dir%
565 566 567
        echo Download package from https://paddle-windows.bj.bcebos.com/bce-python-sdk-0.8.33.tar.gz
        %PYTHON_ROOT%\python.exe -c "import wget;wget.download('https://paddle-windows.bj.bcebos.com/bce-python-sdk-0.8.33.tar.gz')"
        %PYTHON_ROOT%\python.exe -c "import shutil;shutil.unpack_archive('bce-python-sdk-0.8.33.tar.gz', extract_dir='./',format='gztar')"
568
        cd /d %cache_dir%\bce-python-sdk-0.8.33
569 570 571 572
        %PYTHON_ROOT%\python.exe setup.py install 1>nul
        del %cache_dir%\bce-python-sdk-0.8.33.tar.gz
    )
    if !errorlevel! EQU 0 (
573
        cd /d %THIRD_PARTY_HOME%
574 575 576 577
        echo Uploading third_party: compressing ...
        tar -zcf %md5%.tar.gz %md5%
        if !errorlevel! EQU 0 (
            echo Uploading third_party: uploading ...
578
            %PYTHON_ROOT%\python.exe !BCE_FILE! %md5%.tar.gz paddle-windows/third_party/%sub_dir% 1>nul
579
            if !errorlevel! EQU 0 (
580
                echo Upload third party %md5% to bos paddle-windows/third_party/%sub_dir% successfully.
581
            ) else (
582
                echo Failed upload third party to bos, reason: upload failed.
583 584
            )
        ) else (
585
            echo Failed upload third party to bos, reason: compress failed.
586 587 588
        )
        del %md5%.tar.gz
    ) else (
589
        echo Failed upload third party to bos, reason: install bce failed.
590
    )
591
    cd /d %work_dir%\%BUILD_DIR%
592 593
)

594
echo Build Paddle successfully!
Z
Zhou Wei 已提交
595 596
echo 0 > %cache_dir%\error_code.txt
type %cache_dir%\error_code.txt
597

598
:: ci will collect sccache hit rate
599 600 601
if "%WITH_SCCACHE%"=="ON" (
    call :collect_sccache_hits
)
602

603 604 605
goto:eof

:build_error
Z
Zhou Wei 已提交
606
echo 7 > %cache_dir%\error_code.txt
607
type %cache_dir%\error_code.txt
608
echo Build Paddle failed, will exit!
609
exit /b 7
610 611 612

rem ---------------------------------------------------------------------------------------------
:test_whl_pacakage
613
@ECHO OFF
614 615 616
echo    ========================================
echo    Step 3. Test pip install whl package ...
echo    ========================================
617

618 619
setlocal enabledelayedexpansion

620 621 622
for /F %%# in ('wmic os get localdatetime^|findstr 20') do set end=%%#
set end=%end:~4,10%
call :timestamp "%start%" "%end%" "Build"
623

624 625 626
%cache_dir%\tools\busybox64.exe du -h -d 0 %cd%\python\dist > whl_size.txt
set /p whlsize=< whl_size.txt
for /F %%i in ("%whlsize%") do echo "Windows PR whl Size: %%i"
Z
zhangchunle 已提交
627
for /F %%i in ("%whlsize%") do echo ipipe_log_param_Windows_PR_whl_Size: %%i
628

629 630
dir /s /b python\dist\*.whl > whl_file.txt
set /p PADDLE_WHL_FILE_WIN=< whl_file.txt
631

Z
Zhou Wei 已提交
632
@ECHO ON
Z
Zhou Wei 已提交
633 634
pip uninstall -y paddlepaddle
pip uninstall -y paddlepaddle-gpu
635
pip install %PADDLE_WHL_FILE_WIN% --user
Z
Zhou Wei 已提交
636 637 638
if %ERRORLEVEL% NEQ 0 (
    call paddle_winci\Scripts\deactivate.bat 2>NUL
    echo pip install whl package failed!
Z
Zhou Wei 已提交
639
    exit /b 1
Z
Zhou Wei 已提交
640
)
641

642
set CUDA_VISIBLE_DEVICES=0
Z
Zhou Wei 已提交
643
python %work_dir%\paddle\scripts\installation_validate.py
644 645 646
goto:eof

:test_whl_pacakage_error
647 648
::echo 1 > %cache_dir%\error_code.txt
::type %cache_dir%\error_code.txt
Z
Zhou Wei 已提交
649
echo Test import paddle failed, will exit!
Z
Zhou Wei 已提交
650
exit /b 1
651 652

rem ---------------------------------------------------------------------------------------------
653
:test_unit
Z
Zhou Wei 已提交
654
@ECHO ON
655 656 657
echo    ========================================
echo    Step 4. Running unit tests ...
echo    ========================================
658

659 660 661
: set CI_SKIP_CPP_TEST if only *.py changed
git diff --name-only %BRANCH% | findstr /V "\.py" || set CI_SKIP_CPP_TEST=ON

662 663 664
pip install -r %work_dir%\python\unittest_py\requirements.txt --user
if %ERRORLEVEL% NEQ 0 (
    echo pip install unittest requirements.txt failed!
665
    exit /b 5
666 667
)

668 669
for /F %%# in ('wmic os get localdatetime^|findstr 20') do set start=%%#
set start=%start:~4,10%
Z
Zhou Wei 已提交
670

671
set FLAGS_call_stack_level=2
672 673 674 675 676 677 678
dir %THIRD_PARTY_PATH:/=\%\install\openblas\lib
dir %THIRD_PARTY_PATH:/=\%\install\openblas\bin
dir %THIRD_PARTY_PATH:/=\%\install\zlib\bin
dir %THIRD_PARTY_PATH:/=\%\install\mklml\lib
dir %THIRD_PARTY_PATH:/=\%\install\mkldnn\bin
dir %THIRD_PARTY_PATH:/=\%\install\warpctc\bin

Y
YUNSHEN XIE 已提交
679 680
pip install requests

681 682
set PATH=%THIRD_PARTY_PATH:/=\%\install\openblas\lib;%THIRD_PARTY_PATH:/=\%\install\openblas\bin;^
%THIRD_PARTY_PATH:/=\%\install\zlib\bin;%THIRD_PARTY_PATH:/=\%\install\mklml\lib;^
683 684 685 686 687 688
%THIRD_PARTY_PATH:/=\%\install\mkldnn\bin;%THIRD_PARTY_PATH:/=\%\install\warpctc\bin;^
%THIRD_PARTY_PATH:/=\%\install\onnxruntime\lib;%THIRD_PARTY_PATH:/=\%\install\paddle2onnx\lib;^
%work_dir%\%BUILD_DIR%\paddle\fluid\inference;%PATH%

REM TODO: make ut find .dll in install\onnxruntime\lib
xcopy %THIRD_PARTY_PATH:/=\%\install\onnxruntime\lib\onnxruntime.dll %work_dir%\%BUILD_DIR%\paddle\fluid\inference\tests\api\ /Y
689 690

if "%WITH_GPU%"=="ON" (
691
    call:parallel_test_base_gpu
692
) else (
693 694 695 696 697 698 699 700 701 702 703 704 705 706
    call:parallel_test_base_cpu
)

set error_code=%ERRORLEVEL%

for /F %%# in ('wmic os get localdatetime^|findstr 20') do set end=%%#
set end=%end:~4,10%
call :timestamp "%start%" "%end%" "1 card TestCases Total"
call :timestamp "%start%" "%end%" "TestCases Total"

if %error_code% NEQ 0 (
    exit /b 8
) else ( 
    goto:eof 
707 708 709 710
)

:parallel_test_base_gpu
echo    ========================================
711
echo    Running GPU unit tests in parallel way ...
712 713
echo    ========================================

Z
Zhou Wei 已提交
714 715 716 717 718 719 720
setlocal enabledelayedexpansion

:: set PATH=C:\Windows\System32;C:\Program Files\NVIDIA Corporation\NVSMI;%PATH%
:: cmd /C nvidia-smi -L
:: if %errorlevel% NEQ 0 exit /b 8
:: for /F %%# in ('cmd /C nvidia-smi -L ^|find "GPU" /C') do set CUDA_DEVICE_COUNT=%%#
set CUDA_DEVICE_COUNT=1
Y
YUNSHEN XIE 已提交
721

W
Wilber 已提交
722 723
:: For hypothesis tests(mkldnn op and inference pass), we set use 'ci' profile
set HYPOTHESIS_TEST_PROFILE=ci
Y
YUNSHEN XIE 已提交
724 725 726 727 728
echo cmake .. -G %GENERATOR% -DCMAKE_BUILD_TYPE=Release -DWITH_AVX=%WITH_AVX% -DWITH_GPU=%WITH_GPU% -DWITH_MKL=%WITH_MKL% ^
-DWITH_TESTING=%WITH_TESTING% -DWITH_PYTHON=%WITH_PYTHON% -DON_INFER=%ON_INFER% ^
-DWITH_INFERENCE_API_TEST=%WITH_INFERENCE_API_TEST% -DTHIRD_PARTY_PATH=%THIRD_PARTY_PATH% ^
-DINFERENCE_DEMO_INSTALL_DIR=%INFERENCE_DEMO_INSTALL_DIR% -DWITH_STATIC_LIB=%WITH_STATIC_LIB% ^
-DWITH_TENSORRT=%WITH_TENSORRT% -DTENSORRT_ROOT="%TENSORRT_ROOT%" -DMSVC_STATIC_CRT=%MSVC_STATIC_CRT% ^
729
-DWITH_UNITY_BUILD=%WITH_UNITY_BUILD% -DCUDA_ARCH_NAME=%CUDA_ARCH_NAME% -DCUB_PATH=%THIRD_PARTY_HOME%/cub ^
S
Sing_chan 已提交
730 731
-DCUDA_TOOLKIT_ROOT_DIR="%CUDA_TOOLKIT_ROOT_DIR%" -DNEW_RELEASE_ALL=%NEW_RELEASE_ALL% -DNEW_RELEASE_PYPI=%NEW_RELEASE_PYPI% ^
-DNEW_RELEASE_JIT=%NEW_RELEASE_JIT% >> %work_dir%\win_cmake.sh
732

733
%cache_dir%\tools\busybox64.exe bash %work_dir%\tools\windows\run_unittests.sh %NIGHTLY_MODE% %PRECISION_TEST% %WITH_GPU%
Z
Zhou Wei 已提交
734

735 736 737 738 739 740
goto:eof

:parallel_test_base_cpu
echo    ========================================
echo    Running CPU unit tests in parallel way ...
echo    ========================================
741

W
Wilber 已提交
742 743
:: For hypothesis tests(mkldnn op and inference pass), we set use 'ci' profile
set HYPOTHESIS_TEST_PROFILE=ci
744
%cache_dir%\tools\busybox64.exe bash %work_dir%\tools\windows\run_unittests.sh %NIGHTLY_MODE% %PRECISION_TEST% %WITH_GPU%
745

746 747
goto:eof

748
:test_unit_error
749 750
:: echo 8 > %cache_dir%\error_code.txt
:: type %cache_dir%\error_code.txt
751
echo Running unit tests failed, will exit!
752
exit /b 8
753 754 755

rem ---------------------------------------------------------------------------------------------
:test_inference
756
@ECHO OFF
757 758 759
echo    ========================================
echo    Step 5. Testing fluid library for inference ...
echo    ========================================
760

zhouweiwei2014's avatar
zhouweiwei2014 已提交
761 762 763 764 765 766 767 768 769
tree /F %cd%\paddle_inference_install_dir\paddle
%cache_dir%\tools\busybox64.exe du -h -d 0 -k %cd%\paddle_inference_install_dir\paddle\lib > lib_size.txt
set /p libsize=< lib_size.txt
for /F %%i in ("%libsize%") do (
    set /a libsize_m=%%i/1024
    echo "Windows Paddle_Inference Size: !libsize_m!M"
    echo ipipe_log_param_Windows_Paddle_Inference_Size: !libsize_m!M
)

770
cd /d %work_dir%\paddle\fluid\inference\api\demo_ci
771
%cache_dir%\tools\busybox64.exe bash run.sh %work_dir:\=/% %WITH_MKL% %WITH_GPU% %cache_dir:\=/%/inference_demo %WITH_TENSORRT% %TENSORRT_ROOT% %WITH_ONNXRUNTIME% %MSVC_STATIC_CRT% "%CUDA_TOOLKIT_ROOT_DIR%"
772

773 774 775
goto:eof

:test_inference_error
776 777
::echo 1 > %cache_dir%\error_code.txt
::type %cache_dir%\error_code.txt
778 779 780
echo    ==========================================
echo    Testing inference library failed!
echo    ==========================================
Z
Zhou Wei 已提交
781
exit /b 1
782 783 784

rem ---------------------------------------------------------------------------------------------
:check_change_of_unittest
785
@ECHO OFF
786 787 788 789
echo    ========================================
echo    Step 6. Check whether deleting a unit test ...
echo    ========================================

790 791
%cache_dir%\tools\busybox64.exe bash %work_dir%\tools\windows\check_change_of_unittest.sh

792 793 794
goto:eof

:check_change_of_unittest_error
Z
Zhou Wei 已提交
795
exit /b 1
796

797 798 799 800 801 802 803
rem ---------------------------------------------------------------------------------------------
:test_inference_ut
@ECHO OFF
echo    ========================================
echo    Step 7. Testing fluid library with infer_ut for inference ...
echo    ========================================

804
cd /d %work_dir%\paddle\fluid\inference\tests\infer_ut
805
%cache_dir%\tools\busybox64.exe bash run.sh %work_dir:\=/% %WITH_MKL% %WITH_GPU% %cache_dir:\=/%/inference_demo %TENSORRT_ROOT% %WITH_ONNXRUNTIME% %MSVC_STATIC_CRT% "%CUDA_TOOLKIT_ROOT_DIR%"
806 807 808 809 810 811 812 813
goto:eof

:test_inference_ut_error
::echo 1 > %cache_dir%\error_code.txt
::type %cache_dir%\error_code.txt
echo Testing fluid library with infer_ut for inference failed!
exit /b 1

814
rem ---------------------------------------------------------------------------------------------
815
:zip_cc_file
816
cd /d %work_dir%\%BUILD_DIR%
817 818 819 820 821 822 823
tree /F %cd%\paddle_inference_install_dir\paddle
if exist paddle_inference.zip del paddle_inference.zip
python -c "import shutil;shutil.make_archive('paddle_inference', 'zip', root_dir='paddle_inference_install_dir')"
%cache_dir%\tools\busybox64.exe du -h -k paddle_inference.zip > lib_size.txt
set /p libsize=< lib_size.txt
for /F %%i in ("%libsize%") do (
    set /a libsize_m=%%i/1024
824
    echo "Windows Paddle_Inference ZIP Size: !libsize_m!M"
825 826 827
)
goto:eof

828
:zip_cc_file_error
829 830
echo Tar inference library failed!
exit /b 1
831

832 833
rem ---------------------------------------------------------------------------------------------
:zip_c_file
834
cd /d %work_dir%\%BUILD_DIR%
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849
tree /F %cd%\paddle_inference_c_install_dir\paddle
if exist paddle_inference_c.zip del paddle_inference_c.zip
python -c "import shutil;shutil.make_archive('paddle_inference_c', 'zip', root_dir='paddle_inference_c_install_dir')"
%cache_dir%\tools\busybox64.exe du -h -k paddle_inference_c.zip > lib_size.txt
set /p libsize=< lib_size.txt
for /F %%i in ("%libsize%") do (
    set /a libsize_m=%%i/1024
    echo "Windows Paddle_Inference CAPI ZIP Size: !libsize_m!M"
)
goto:eof

:zip_c_file_error
echo Tar inference capi library failed!
exit /b 1

850 851
:timestamp
setlocal enabledelayedexpansion
852
@ECHO OFF
853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883
set start=%~1
set dd=%start:~2,2%
set /a dd=100%dd%%%100
set hh=%start:~4,2%
set /a hh=100%hh%%%100
set nn=%start:~6,2%
set /a nn=100%nn%%%100
set ss=%start:~8,2%
set /a ss=100%ss%%%100
set /a start_sec=dd*86400+hh*3600+nn*60+ss
echo %start_sec%

set end=%~2
set dd=%end:~2,2%
set /a dd=100%dd%%%100
if %start:~0,2% NEQ %end:~0,2% (
    set month_day=0
    for %%i in (01 03 05 07 08 10 12) DO if %%i EQU %start:~0,2% set month_day=31
    for %%i in (04 06 09 11) DO if %%i EQU %start:~0,2% set month_day=30
    for %%i in (02) DO if %%i EQU %start:~0,2% set month_day=28
    set /a dd=%dd%+!month_day!
)
set hh=%end:~4,2%
set /a hh=100%hh%%%100
set nn=%end:~6,2%
set /a nn=100%nn%%%100
set ss=%end:~8,2%
set /a ss=100%ss%%%100
set /a end_secs=dd*86400+hh*3600+nn*60+ss
set /a cost_secs=end_secs-start_sec
echo "Windows %~3 Time: %cost_secs%s"
884
set tempTaskName=%~3
Z
zhangchunle 已提交
885
echo ipipe_log_param_Windows_%tempTaskName: =_%_Time: %cost_secs%s
886 887 888
goto:eof


889 890 891 892 893 894 895 896 897
:collect_sccache_hits
sccache -s > sccache_summary.txt
echo    ========================================
echo    sccache statistical summary ...
echo    ========================================
type sccache_summary.txt
for /f "tokens=2,3" %%i in ('type sccache_summary.txt ^| findstr "requests hits" ^| findstr /V "executed C/C++ CUDA"') do set %%i=%%j
if %requests% EQU 0 (
    echo "sccache hit rate: 0%"
898
    echo ipipe_log_param_sccache_Hit_Hate: 0%
L
LoveAn 已提交
899
) else (
900 901
    set /a rate=!hits!*10000/!requests!
    echo "sccache hit rate: !rate:~0,-2!.!rate:~-2!%%"
902
    echo ipipe_log_param_sccache_Hit_Hate: !rate:~0,-2!.!rate:~-2!%%
L
LoveAn 已提交
903
)
904

L
LoveAn 已提交
905 906 907
goto:eof


908 909 910 911 912
rem ---------------------------------------------------------------------------------------------
:success
echo    ========================================
echo    Clean up environment  at the end ...
echo    ========================================
913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
taskkill /f /im cmake.exe /t 2>NUL
taskkill /f /im ninja.exe /t 2>NUL
taskkill /f /im MSBuild.exe /t 2>NUL
taskkill /f /im git.exe /t 2>NUL
taskkill /f /im cl.exe /t 2>NUL
taskkill /f /im lib.exe /t 2>NUL
taskkill /f /im link.exe /t 2>NUL
taskkill /f /im git-remote-https.exe /t 2>NUL
taskkill /f /im vctip.exe /t 2>NUL
taskkill /f /im cvtres.exe /t 2>NUL
taskkill /f /im rc.exe /t 2>NUL
taskkill /f /im mspdbsrv.exe /t 2>NUL
taskkill /f /im csc.exe /t 2>NUL
taskkill /f /im python.exe /t 2>NUL
taskkill /f /im nvcc.exe /t 2>NUL
taskkill /f /im cicc.exe /t 2>NUL
taskkill /f /im ptxas.exe /t 2>NUL
taskkill /f /im op_function_generator.exe /t 2>NUL
931 932
taskkill /f /im eager_generator.exe /t 2>NUL
taskkill /f /im eager_op_function_generator.exe /t 2>NUL
933
wmic process where name="op_function_generator.exe" call terminate 2>NUL
934 935
wmic process where name="eager_generator.exe" call terminate 2>NUL
wmic process where name="eager_op_function_generator.exe" call terminate 2>NUL
936
wmic process where name="cvtres.exe" call terminate 2>NUL
937
wmic process where name="rc.exe" call terminate 2>NUL
938 939
wmic process where name="cl.exe" call terminate 2>NUL
wmic process where name="lib.exe" call terminate 2>NUL
940
wmic process where name="python.exe" call terminate 2>NUL
941
if "%WITH_TESTING%"=="ON" (
942
    for /F "tokens=1 delims= " %%# in ('tasklist ^| findstr /i test') do taskkill /f /im %%# /t
943
)
944 945 946 947
echo Windows CI run successfully!
exit /b 0

ENDLOCAL