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. -vv Verbose output messages 31echo. -q Quiet output messages (errors and warnings only) 32echo. -k Attempt to kill any running Pythons before building (usually done 33echo. automatically by the pythoncore project) 34echo. --pgo Build with Profile-Guided Optimization. This flag 35echo. overrides -c and -d 36echo. --test-marker Enable the test marker within the build. 37echo. --regen Regenerate all opcodes, grammar and tokens. 38echo. 39echo.Available flags to avoid building certain modules. 40echo.These flags have no effect if '-e' is not given: 41echo. --no-ctypes Do not attempt to build _ctypes 42echo. --no-ssl Do not attempt to build _ssl 43echo. --no-tkinter Do not attempt to build Tkinter 44echo. 45echo.Available arguments: 46echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate 47echo. Set the configuration (default: Release) 48echo. -p x64 ^| Win32 ^| ARM ^| ARM64 49echo. Set the platform (default: x64) 50echo. -t Build ^| Rebuild ^| Clean ^| CleanAll 51echo. Set the target manually 52echo. --pgo-job The job to use for PGO training; implies --pgo 53echo. (default: "-m test --pgo") 54exit /b 127 55 56:Run 57setlocal 58set platf=x64 59set conf=Release 60set target=Build 61set dir=%~dp0 62set parallel=/m 63set verbose=/nologo /v:m /clp:summary 64set kill= 65set do_pgo= 66set pgo_job=-m test --pgo 67 68:CheckOpts 69if "%~1"=="-h" goto Usage 70if "%~1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts 71if "%~1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts 72if "%~1"=="-r" (set target=Rebuild) & shift & goto CheckOpts 73if "%~1"=="-t" (set target=%2) & shift & shift & goto CheckOpts 74if "%~1"=="-d" (set conf=Debug) & shift & goto CheckOpts 75if "%~1"=="-m" (set parallel=/m) & shift & goto CheckOpts 76if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts 77if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts 78if "%~1"=="-vv" (set verbose=/v:d /ds) & shift & goto CheckOpts 79if "%~1"=="-q" (set verbose=/v:q /nologo /clp:summary) & shift & goto CheckOpts 80if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts 81if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts 82if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts 83if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts 84if "%~1"=="-V" shift & goto Version 85if "%~1"=="--regen" (set Regen=true) & shift & goto CheckOpts 86rem These use the actual property names used by MSBuild. We could just let 87rem them in through the environment, but we specify them on the command line 88rem anyway for visibility so set defaults after this 89if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts 90if "%~1"=="-E" (set IncludeExternals=false) & shift & goto CheckOpts 91if "%~1"=="--no-ctypes" (set IncludeCTypes=false) & shift & goto CheckOpts 92if "%~1"=="--no-ssl" (set IncludeSSL=false) & shift & goto CheckOpts 93if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts 94 95if "%IncludeExternals%"=="" set IncludeExternals=true 96if "%IncludeCTypes%"=="" set IncludeCTypes=true 97if "%IncludeSSL%"=="" set IncludeSSL=true 98if "%IncludeTkinter%"=="" set IncludeTkinter=true 99 100if "%IncludeExternals%"=="true" call "%dir%get_externals.bat" 101 102if "%do_pgo%" EQU "true" if "%platf%" EQU "x64" ( 103 if "%PROCESSOR_ARCHITEW6432%" NEQ "AMD64" if "%PROCESSOR_ARCHITECTURE%" NEQ "AMD64" ( 104 echo.ERROR: Cannot cross-compile with PGO 105 echo. 32bit operating system detected. Ensure your PROCESSOR_ARCHITECTURE 106 echo. and PROCESSOR_ARCHITEW6432 environment variables are correct. 107 exit /b 1 108 ) 109) 110 111if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc" 112if exist "%GIT%" set GITProperty=/p:GIT="%GIT%" 113if not exist "%GIT%" echo Cannot find Git on PATH & set GITProperty= 114 115rem Setup the environment 116call "%dir%find_msbuild.bat" %MSBUILD% 117if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) 118 119call "%dir%find_python.bat" %PYTHON% 120if ERRORLEVEL 1 (echo Cannot locate python.exe on PATH or as PYTHON variable & exit /b 3) 121set PythonForBuild=%PYTHON% 122 123if "%kill%"=="true" call :Kill 124if ERRORLEVEL 1 exit /B %ERRORLEVEL% 125 126if "%regen%"=="true" goto :Regen 127 128if "%do_pgo%"=="true" ( 129 set conf=PGInstrument 130 call :Build %1 %2 %3 %4 %5 %6 %7 %8 %9 131) 132rem %VARS% are evaluated eagerly, which would lose the ERRORLEVEL 133rem value if we didn't split it out here. 134if "%do_pgo%"=="true" if ERRORLEVEL 1 exit /B %ERRORLEVEL% 135if "%do_pgo%"=="true" ( 136 del /s "%dir%\*.pgc" 137 del /s "%dir%\..\Lib\*.pyc" 138 echo on 139 call "%dir%\..\python.bat" %pgo_job% 140 @echo off 141 call :Kill 142 set conf=PGUpdate 143 set target=Build 144) 145goto :Build 146 147:Kill 148echo on 149%MSBUILD% "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^ 150 /p:Configuration=%conf% /p:Platform=%platf%^ 151 /p:KillPython=true 152 153@echo off 154exit /B %ERRORLEVEL% 155 156:Regen 157echo on 158%MSBUILD% "%dir%\pythoncore.vcxproj" /t:Regen %verbose%^ 159 /p:Configuration=%conf% /p:Platform=%platf%^ 160 /p:ForceRegen=true 161 162@echo off 163exit /B %ERRORLEVEL% 164 165:Build 166rem Call on MSBuild to do the work, echo the command. 167rem Passing %1-9 is not the preferred option, but argument parsing in 168rem batch is, shall we say, "lackluster" 169echo on 170%MSBUILD% "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ 171 /p:Configuration=%conf% /p:Platform=%platf%^ 172 /p:IncludeExternals=%IncludeExternals%^ 173 /p:IncludeCTypes=%IncludeCTypes%^ 174 /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ 175 /p:UseTestMarker=%UseTestMarker% %GITProperty%^ 176 %1 %2 %3 %4 %5 %6 %7 %8 %9 177 178@echo off 179exit /b %ERRORLEVEL% 180 181:Version 182rem Display the current build version information 183call "%dir%find_msbuild.bat" %MSBUILD% 184if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2) 185%MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 186if ERRORLEVEL 1 exit /b 3