1@echo off 2goto Run 3:Usage 4echo.%~nx0 [flags and arguments] [quoted MSBuild options] 5echo. 6echo.Build CPython from the command line. Requires the appropriate 7echo.version(s) of Microsoft Visual Studio to be installed (see readme.txt). 8echo. 9echo.After the flags recognized by this script, up to 9 arguments to be passed 10echo.directly to MSBuild may be passed. If the argument contains an '=', the 11echo.entire argument must be quoted (e.g. `%~nx0 "/p:PlatformToolset=v100"`). 12echo.Alternatively you can put extra flags for MSBuild in a file named 13echo.`msbuild.rsp` in the `PCbuild` directory, one flag per line. This file 14echo.will be picked automatically by MSBuild. Flags put in this file does not 15echo.need to be quoted. You can still use environment variables inside the 16echo.response file. 17echo. 18echo.Available flags: 19echo. -h Display this help message 20echo. -V Display version information for the current build 21echo. -r Target Rebuild instead of Build 22echo. -d Set the configuration to Debug 23echo. -E Don't fetch or build external libraries. Extension modules that 24echo. depend on external libraries will not attempt to build if this flag 25echo. is present; -e is also accepted to explicitly enable fetching and 26echo. building externals. 27echo. -m Enable parallel build (enabled by default) 28echo. -M Disable parallel build 29echo. -v Increased output messages 30echo. -k Attempt to kill any running Pythons before building (usually done 31echo. automatically by the pythoncore project) 32echo. --pgo Build with Profile-Guided Optimization. This flag 33echo. overrides -c and -d 34echo. --test-marker Enable the test marker within the build. 35echo. 36echo.Available flags to avoid building certain modules. 37echo.These flags have no effect if '-e' is not given: 38echo. --no-ctypes Do not attempt to build _ctypes 39echo. --no-ssl Do not attempt to build _ssl 40echo. --no-tkinter Do not attempt to build Tkinter 41echo. 42echo.Available arguments: 43echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate 44echo. Set the configuration (default: Release) 45echo. -p x64 ^| Win32 ^| ARM ^| ARM64 46echo. Set the platform (default: Win32) 47echo. -t Build ^| Rebuild ^| Clean ^| CleanAll 48echo. Set the target manually 49echo. --pgo-job The job to use for PGO training; implies --pgo 50echo. (default: "-m test --pgo") 51exit /b 127 52 53:Run 54setlocal 55set platf=Win32 56set conf=Release 57set target=Build 58set dir=%~dp0 59set parallel=/m 60set verbose=/nologo /v:m /clp:summary 61set kill= 62set do_pgo= 63set pgo_job=-m test --pgo 64 65:CheckOpts 66if "%~1"=="-h" goto Usage 67if "%~1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts 68if "%~1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts 69if "%~1"=="-r" (set target=Rebuild) & shift & goto CheckOpts 70if "%~1"=="-t" (set target=%2) & shift & shift & goto CheckOpts 71if "%~1"=="-d" (set conf=Debug) & shift & goto CheckOpts 72if "%~1"=="-m" (set parallel=/m) & shift & goto CheckOpts 73if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts 74if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts 75if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts 76if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts 77if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts 78if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts 79if "%~1"=="-V" shift & goto :Version 80rem These use the actual property names used by MSBuild. We could just let 81rem them in through the environment, but we specify them on the command line 82rem anyway for visibility so set defaults after this 83if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts 84if "%~1"=="-E" (set IncludeExternals=false) & shift & goto CheckOpts 85if "%~1"=="--no-ctypes" (set IncludeCTypes=false) & shift & goto CheckOpts 86if "%~1"=="--no-ssl" (set IncludeSSL=false) & shift & goto CheckOpts 87if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts 88 89if "%IncludeExternals%"=="" set IncludeExternals=true 90if "%IncludeCTypes%"=="" set IncludeCTypes=true 91if "%IncludeSSL%"=="" set IncludeSSL=true 92if "%IncludeTkinter%"=="" set IncludeTkinter=true 93 94if "%IncludeExternals%"=="true" call "%dir%get_externals.bat" 95 96if "%do_pgo%" EQU "true" if "%platf%" EQU "x64" ( 97 if "%PROCESSOR_ARCHITEW6432%" NEQ "AMD64" if "%PROCESSOR_ARCHITECTURE%" NEQ "AMD64" ( 98 echo.ERROR: Cannot cross-compile with PGO 99 echo. 32bit operating system detected. Ensure your PROCESSOR_ARCHITECTURE 100 echo. and PROCESSOR_ARCHITEW6432 environment variables are correct. 101 exit /b 1 102 ) 103) 104 105if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" 106if exist "%GIT%" set GITProperty=/p:GIT="%GIT%" 107if not exist "%GIT%" echo Cannot find Git on PATH & set GITProperty= 108 109rem Setup the environment 110call "%dir%find_msbuild.bat" %MSBUILD% 111if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) 112 113if "%kill%"=="true" call :Kill 114if ERRORLEVEL 1 exit /B 3 115 116if "%do_pgo%"=="true" ( 117 set conf=PGInstrument 118 call :Build %1 %2 %3 %4 %5 %6 %7 %8 %9 119) 120rem %VARS% are evaluated eagerly, which would lose the ERRORLEVEL 121rem value if we didn't split it out here. 122if "%do_pgo%"=="true" if ERRORLEVEL 1 exit /B %ERRORLEVEL% 123if "%do_pgo%"=="true" ( 124 del /s "%dir%\*.pgc" 125 del /s "%dir%\..\Lib\*.pyc" 126 echo on 127 call "%dir%\..\python.bat" %pgo_job% 128 @echo off 129 call :Kill 130 set conf=PGUpdate 131 set target=Build 132) 133goto :Build 134 135:Kill 136echo on 137%MSBUILD% "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^ 138 /p:Configuration=%conf% /p:Platform=%platf%^ 139 /p:KillPython=true 140 141@echo off 142exit /B %ERRORLEVEL% 143 144:Build 145rem Call on MSBuild to do the work, echo the command. 146rem Passing %1-9 is not the preferred option, but argument parsing in 147rem batch is, shall we say, "lackluster" 148echo on 149%MSBUILD% "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ 150 /p:Configuration=%conf% /p:Platform=%platf%^ 151 /p:IncludeExternals=%IncludeExternals%^ 152 /p:IncludeCTypes=%IncludeCTypes%^ 153 /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ 154 /p:UseTestMarker=%UseTestMarker% %GITProperty%^ 155 %1 %2 %3 %4 %5 %6 %7 %8 %9 156 157@echo off 158exit /b %ERRORLEVEL% 159 160:Version 161rem Display the current build version information 162call "%dir%find_msbuild.bat" %MSBUILD% 163if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) 164%MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 165if ERRORLEVEL 1 exit /b 3