• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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