blob: 7c24e0b155578138d2f66f10773ec13a9590da0e [file] [log] [blame]
Zachary Ware6b6e6872017-06-10 14:58:42 -05001@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).
Zachary Ware6b6e6872017-06-10 14:58:42 -05008echo.
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
Zachary Wared01db1c2017-09-06 17:29:37 -070023echo. -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.
Zachary Ware6b6e6872017-06-10 14:58:42 -050027echo. -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.
Anthony Shaw9e365892019-12-18 08:21:20 +110035echo. --regen Regenerate all opcodes, grammar and tokens
Zachary Ware6b6e6872017-06-10 14:58:42 -050036echo.
37echo.Available flags to avoid building certain modules.
38echo.These flags have no effect if '-e' is not given:
Paul Monsonf96e7fd2019-05-17 10:07:24 -070039echo. --no-ctypes Do not attempt to build _ctypes
Zachary Ware6b6e6872017-06-10 14:58:42 -050040echo. --no-ssl Do not attempt to build _ssl
41echo. --no-tkinter Do not attempt to build Tkinter
42echo.
43echo.Available arguments:
44echo. -c Release ^| Debug ^| PGInstrument ^| PGUpdate
45echo. Set the configuration (default: Release)
Paul Monsonf96e7fd2019-05-17 10:07:24 -070046echo. -p x64 ^| Win32 ^| ARM ^| ARM64
Zachary Ware6b6e6872017-06-10 14:58:42 -050047echo. Set the platform (default: Win32)
48echo. -t Build ^| Rebuild ^| Clean ^| CleanAll
49echo. Set the target manually
50echo. --pgo-job The job to use for PGO training; implies --pgo
51echo. (default: "-m test --pgo")
52exit /b 127
53
54:Run
55setlocal
56set platf=Win32
Zachary Ware6b6e6872017-06-10 14:58:42 -050057set conf=Release
58set target=Build
59set dir=%~dp0
60set parallel=/m
Steve Dowerde148f22019-11-20 09:30:47 -080061set verbose=/nologo /v:m /clp:summary
Zachary Ware6b6e6872017-06-10 14:58:42 -050062set kill=
63set do_pgo=
64set pgo_job=-m test --pgo
Zachary Ware6b6e6872017-06-10 14:58:42 -050065
66:CheckOpts
67if "%~1"=="-h" goto Usage
68if "%~1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts
69if "%~1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts
70if "%~1"=="-r" (set target=Rebuild) & shift & goto CheckOpts
71if "%~1"=="-t" (set target=%2) & shift & shift & goto CheckOpts
72if "%~1"=="-d" (set conf=Debug) & shift & goto CheckOpts
73if "%~1"=="-m" (set parallel=/m) & shift & goto CheckOpts
74if "%~1"=="-M" (set parallel=) & shift & goto CheckOpts
75if "%~1"=="-v" (set verbose=/v:n) & shift & goto CheckOpts
76if "%~1"=="-k" (set kill=true) & shift & goto CheckOpts
77if "%~1"=="--pgo" (set do_pgo=true) & shift & goto CheckOpts
78if "%~1"=="--pgo-job" (set do_pgo=true) & (set pgo_job=%~2) & shift & shift & goto CheckOpts
79if "%~1"=="--test-marker" (set UseTestMarker=true) & shift & goto CheckOpts
Anthony Shaw9e365892019-12-18 08:21:20 +110080if "%~1"=="-V" shift & goto Version
81if "%~1"=="--regen" (set Regen=true) & shift & goto CheckOpts
Zachary Ware6b6e6872017-06-10 14:58:42 -050082rem These use the actual property names used by MSBuild. We could just let
83rem them in through the environment, but we specify them on the command line
84rem anyway for visibility so set defaults after this
85if "%~1"=="-e" (set IncludeExternals=true) & shift & goto CheckOpts
Zachary Wared01db1c2017-09-06 17:29:37 -070086if "%~1"=="-E" (set IncludeExternals=false) & shift & goto CheckOpts
Paul Monsonf96e7fd2019-05-17 10:07:24 -070087if "%~1"=="--no-ctypes" (set IncludeCTypes=false) & shift & goto CheckOpts
Zachary Ware6b6e6872017-06-10 14:58:42 -050088if "%~1"=="--no-ssl" (set IncludeSSL=false) & shift & goto CheckOpts
89if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts
90
Steve Dower05f01d82017-09-07 11:49:23 -070091if "%IncludeExternals%"=="" set IncludeExternals=true
Paul Monsonf96e7fd2019-05-17 10:07:24 -070092if "%IncludeCTypes%"=="" set IncludeCTypes=true
Zachary Ware6b6e6872017-06-10 14:58:42 -050093if "%IncludeSSL%"=="" set IncludeSSL=true
94if "%IncludeTkinter%"=="" set IncludeTkinter=true
95
96if "%IncludeExternals%"=="true" call "%dir%get_externals.bat"
97
Steve Dower40a23e82017-06-19 10:34:25 -070098if "%do_pgo%" EQU "true" if "%platf%" EQU "x64" (
99 if "%PROCESSOR_ARCHITEW6432%" NEQ "AMD64" if "%PROCESSOR_ARCHITECTURE%" NEQ "AMD64" (
100 echo.ERROR: Cannot cross-compile with PGO
101 echo. 32bit operating system detected. Ensure your PROCESSOR_ARCHITECTURE
102 echo. and PROCESSOR_ARCHITEW6432 environment variables are correct.
103 exit /b 1
Zachary Ware6b6e6872017-06-10 14:58:42 -0500104 )
105)
106
107if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc"
108if exist "%GIT%" set GITProperty=/p:GIT="%GIT%"
109if not exist "%GIT%" echo Cannot find Git on PATH & set GITProperty=
110
111rem Setup the environment
Steve Dower40a23e82017-06-19 10:34:25 -0700112call "%dir%find_msbuild.bat" %MSBUILD%
113if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2)
Zachary Ware6b6e6872017-06-10 14:58:42 -0500114
115if "%kill%"=="true" call :Kill
Steve Dower21a92f82019-06-14 08:29:20 -0700116if ERRORLEVEL 1 exit /B 3
Zachary Ware6b6e6872017-06-10 14:58:42 -0500117
118if "%do_pgo%"=="true" (
119 set conf=PGInstrument
120 call :Build %1 %2 %3 %4 %5 %6 %7 %8 %9
Steve Dower21a92f82019-06-14 08:29:20 -0700121)
122rem %VARS% are evaluated eagerly, which would lose the ERRORLEVEL
123rem value if we didn't split it out here.
124if "%do_pgo%"=="true" if ERRORLEVEL 1 exit /B %ERRORLEVEL%
125if "%do_pgo%"=="true" (
Zachary Ware6b6e6872017-06-10 14:58:42 -0500126 del /s "%dir%\*.pgc"
127 del /s "%dir%\..\Lib\*.pyc"
128 echo on
129 call "%dir%\..\python.bat" %pgo_job%
130 @echo off
131 call :Kill
132 set conf=PGUpdate
133 set target=Build
134)
Steve Dower21a92f82019-06-14 08:29:20 -0700135goto :Build
136
Zachary Ware6b6e6872017-06-10 14:58:42 -0500137:Kill
138echo on
Steve Dower40a23e82017-06-19 10:34:25 -0700139%MSBUILD% "%dir%\pythoncore.vcxproj" /t:KillPython %verbose%^
Zachary Ware6b6e6872017-06-10 14:58:42 -0500140 /p:Configuration=%conf% /p:Platform=%platf%^
141 /p:KillPython=true
142
143@echo off
Steve Dower21a92f82019-06-14 08:29:20 -0700144exit /B %ERRORLEVEL%
Zachary Ware6b6e6872017-06-10 14:58:42 -0500145
146:Build
147rem Call on MSBuild to do the work, echo the command.
148rem Passing %1-9 is not the preferred option, but argument parsing in
149rem batch is, shall we say, "lackluster"
150echo on
Steve Dower40a23e82017-06-19 10:34:25 -0700151%MSBUILD% "%dir%pcbuild.proj" /t:%target% %parallel% %verbose%^
Zachary Ware6b6e6872017-06-10 14:58:42 -0500152 /p:Configuration=%conf% /p:Platform=%platf%^
153 /p:IncludeExternals=%IncludeExternals%^
Paul Monsonf96e7fd2019-05-17 10:07:24 -0700154 /p:IncludeCTypes=%IncludeCTypes%^
Zachary Ware6b6e6872017-06-10 14:58:42 -0500155 /p:IncludeSSL=%IncludeSSL% /p:IncludeTkinter=%IncludeTkinter%^
156 /p:UseTestMarker=%UseTestMarker% %GITProperty%^
157 %1 %2 %3 %4 %5 %6 %7 %8 %9
158
Steve Dowera9d0a6a2019-12-17 14:14:13 -0800159@if not ERRORLEVEL 1 @if "%Regen%"=="true" (
160 %MSBUILD% "%dir%regen.vcxproj" /t:%target% %parallel% %verbose%^
161 /p:IncludeExternals=%IncludeExternals%^
162 /p:Configuration=%conf% /p:Platform=%platf%^
163 /p:UseTestMarker=%UseTestMarker% %GITProperty%^
164 %1 %2 %3 %4 %5 %6 %7 %8 %9
165)
166
Zachary Ware6b6e6872017-06-10 14:58:42 -0500167@echo off
Steve Dower21a92f82019-06-14 08:29:20 -0700168exit /b %ERRORLEVEL%
Zachary Ware6b6e6872017-06-10 14:58:42 -0500169
170:Version
171rem Display the current build version information
Jeremy Klothf46eccd2018-12-09 20:59:32 -0700172call "%dir%find_msbuild.bat" %MSBUILD%
Steve Dower21a92f82019-06-14 08:29:20 -0700173if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2)
174%MSBUILD% "%dir%pythoncore.vcxproj" /t:ShowVersionInfo /v:m /nologo %1 %2 %3 %4 %5 %6 %7 %8 %9
175if ERRORLEVEL 1 exit /b 3