@echo off | |
goto Run | |
:Usage | |
echo.%~nx0 [flags and arguments] [quoted MSBuild options] | |
echo. | |
echo.Build CPython from the command line. Requires the appropriate | |
echo.version(s) of Microsoft Visual Studio to be installed (see readme.txt). | |
echo.Also requires Subversion (svn.exe) to be on PATH if the '-e' flag is | |
echo.given. | |
echo. | |
echo.After the flags recognized by this script, up to 9 arguments to be passed | |
echo.directly to MSBuild may be passed. If the argument contains an '=', the | |
echo.entire argument must be quoted (e.g. `%~nx0 "/p:PlatformToolset=v100"`) | |
echo. | |
echo.Available flags: | |
echo. -h Display this help message | |
echo. -V Display version information for the current build | |
echo. -r Target Rebuild instead of Build | |
echo. -d Set the configuration to Debug | |
echo. -e Build external libraries fetched by get_externals.bat | |
echo. Extension modules that depend on external libraries will not attempt | |
echo. to build if this flag is not present | |
echo. -m Enable parallel build (enabled by default) | |
echo. -M Disable parallel build | |
echo. -v Increased output messages | |
echo. -k Attempt to kill any running Pythons before building (usually done | |
echo. automatically by the pythoncore project) | |
echo. --pgo Build with Profile-Guided Optimization. This flag | |
echo. overrides -c and -d | |
echo. --test-marker Enable the test marker within the build. | |
echo. | |
echo.Available flags to avoid building certain modules. | |
echo.These flags have no effect if '-e' is not given: | |
echo. --no-ssl Do not attempt to build _ssl | |
echo. --no-tkinter Do not attempt to build Tkinter | |
echo. | |
echo.Available arguments: | |
echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate | |
echo. Set the configuration (default: Release) | |
echo. -p x64 ^| Win32 | |
echo. Set the platform (default: Win32) | |
echo. -t Build ^| Rebuild ^| Clean ^| CleanAll | |
echo. Set the target manually | |
echo. --pgo-job The job to use for PGO training; implies --pgo | |
echo. (default: "-m test --pgo") | |
exit /b 127 | |
:Run | |
setlocal | |
set platf=Win32 | |
set vs_platf=x86 | |
set conf=Release | |
set target=Build | |
set dir=%~dp0 | |
set parallel=/m | |
set verbose=/nologo /v:m | |
set kill= | |
set do_pgo= | |
set pgo_job=-m test --pgo | |
set on_64_bit=true | |
rem This may not be 100% accurate, but close enough. | |
if "%ProgramFiles(x86)%"=="" (set on_64_bit=false) | |
:CheckOpts | |
if "%~1"=="-h" goto Usage | |
if "%~1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts | |
if "%~1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts | |
if "%~1"=="-r" (set target=Rebuild) & shift & goto CheckOpts | |
if "%~1"=="-t" (set target=%2) & shift & shift & goto CheckOpts | |
if "%~1"=="-d" (set conf=Debug) & shift & goto CheckOpts | |
if "%~1"=="-m" (set parallel=/m) & shift & goto CheckOpts | |
if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts | |
if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts | |
if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts | |
if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts | |
if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts | |
if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts | |
if "%~1"=="-V" shift & goto Version | |
rem These use the actual property names used by MSBuild. We could just let | |
rem them in through the environment, but we specify them on the command line | |
rem anyway for visibility so set defaults after this | |
if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts | |
if "%~1"=="--no-ssl" (set IncludeSSL=false) & shift & goto CheckOpts | |
if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts | |
if "%IncludeExternals%"=="" set IncludeExternals=false | |
if "%IncludeSSL%"=="" set IncludeSSL=true | |
if "%IncludeTkinter%"=="" set IncludeTkinter=true | |
if "%IncludeExternals%"=="true" call "%dir%get_externals.bat" | |
if "%platf%"=="x64" ( | |
if "%on_64_bit%"=="true" ( | |
rem This ought to always be correct these days... | |
set vs_platf=amd64 | |
) else ( | |
if "%do_pgo%"=="true" ( | |
echo.ERROR: Cannot cross-compile with PGO | |
echo. 32bit operating system detected, if this is incorrect, | |
echo. make sure the ProgramFiles(x86^) environment variable is set | |
exit /b 1 | |
) | |
set vs_platf=x86_amd64 | |
) | |
) | |
if not exist "%HG%" where hg > "%TEMP%\hg.loc" 2> nul && set /P HG= < "%TEMP%\hg.loc" & del "%TEMP%\hg.loc" | |
if exist "%HG%" set HGProperty=/p:HG="%HG%" | |
if not exist "%HG%" echo Cannot find Mercurial on PATH & set HGProperty= | |
rem Setup the environment | |
call "%dir%env.bat" %vs_platf% >nul | |
if "%kill%"=="true" call :Kill | |
if "%do_pgo%"=="true" ( | |
set conf=PGInstrument | |
call :Build | |
del /s "%dir%\*.pgc" | |
del /s "%dir%\..\Lib\*.pyc" | |
echo on | |
call "%dir%\..\python.bat" %pgo_job% | |
@echo off | |
call :Kill | |
set conf=PGUpdate | |
set target=Build | |
) | |
goto Build | |
:Kill | |
echo on | |
msbuild "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^ | |
/p:Configuration=%conf% /p:Platform=%platf%^ | |
/p:KillPython=true | |
@echo off | |
goto :eof | |
:Build | |
rem Call on MSBuild to do the work, echo the command. | |
rem Passing %1-9 is not the preferred option, but argument parsing in | |
rem batch is, shall we say, "lackluster" | |
echo on | |
msbuild "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^ | |
/p:Configuration=%conf% /p:Platform=%platf%^ | |
/p:IncludeExternals=%IncludeExternals%^ | |
/p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^ | |
/p:UseTestMarker=%UseTestMarker% %HGProperty%^ | |
%1 %2 %3 %4 %5 %6 %7 %8 %9 | |
@echo off | |
goto :eof | |
:Version | |
rem Display the current build version information | |
msbuild "%dir%python.props" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9 |