build.bat 5.42 KB
Newer Older
1
@echo off
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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
21 22
echo.      Extension modules that depend on external libraries will not attempt
echo.      to build if this flag is not present
23 24 25 26 27
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)
28 29 30
echo.  --pgo          Build with Profile-Guided Optimization.  This flag
echo.                 overrides -c and -d
echo.  --test-marker  Enable the test marker within the build.
31
echo.
32 33 34 35 36
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.
37 38 39 40 41 42 43
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
44 45
echo.  --pgo-job  The job to use for PGO training; implies --pgo
echo.             (default: "-m test --pgo")
46
exit /b 127
47

48
:Run
49 50
setlocal
set platf=Win32
51
set vs_platf=x86
52
set conf=Release
53
set target=Build
54
set dir=%~dp0
55 56
set parallel=/m
set verbose=/nologo /v:m
57
set kill=
58 59 60 61 62 63
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)
64 65

:CheckOpts
66
if "%~1"=="-h" goto Usage
67 68 69 70 71 72 73 74 75
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
76 77
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
78
if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts
79
if "%~1"=="-V" shift & goto Version
80 81 82
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
83
if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts
84 85 86 87 88 89
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
90

91 92
if "%IncludeExternals%"=="true" call "%dir%get_externals.bat"

93 94 95 96 97 98 99 100 101 102 103 104 105 106
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
    )
)
107 108 109

rem Setup the environment
call "%dir%env.bat" %vs_platf% >nul
110

111 112 113 114 115 116 117 118 119 120 121 122
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
123
)
124
goto Build
125

126 127 128 129 130 131 132 133 134 135
:Kill
echo on
msbuild "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^
 /p:Configuration=%conf% /p:Platform=%platf%^
 /p:KillPython=true

@echo off
goto :eof

:Build
136 137 138 139
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
140 141 142 143
msbuild "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^
 /p:Configuration=%conf% /p:Platform=%platf%^
 /p:IncludeExternals=%IncludeExternals%^
 /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^
144
 /p:UseTestMarker=%UseTestMarker%^
145
 %1 %2 %3 %4 %5 %6 %7 %8 %9
146

147 148
@echo off
goto :eof
149 150 151 152

: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