blob: 45e189b537f6935c38d2e50f65b244cffc3b5c95 [file] [log] [blame]
Zachary Ware6b6e6872017-06-10 14:58:42 -05001@setlocal
2@echo off
3
4rem This script is intended for building official releases of Python.
5rem To use it to build alternative releases, you should clone this file
6rem and modify the following three URIs.
7
8rem These two will ensure that your release can be installed
9rem alongside an official Python release, by modifying the GUIDs used
10rem for all components.
11rem
12rem The following substitutions will be applied to the release URI:
13rem Variable Description Example
14rem {arch} architecture amd64, win32
15set RELEASE_URI=http://www.python.org/{arch}
16
17rem This is the URL that will be used to download installation files.
18rem The files available from the default URL *will* conflict with your
19rem installer. Trust me, you don't want them, even if it seems like a
20rem good idea.
21rem
22rem The following substitutions will be applied to the download URL:
23rem Variable Description Example
24rem {version} version number 3.5.0
25rem {arch} architecture amd64, win32
26rem {releasename} release name a1, b2, rc3 (or blank for final)
27rem {msi} MSI filename core.msi
28set DOWNLOAD_URL=https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi}
29
30set D=%~dp0
Stefan Grönkef1502d02017-09-25 18:58:10 +020031set PCBUILD=%D%..\..\PCbuild\
Steve Dowerf0851912017-07-26 09:09:01 -070032if "%Py_OutDir%"=="" set Py_OutDir=%PCBUILD%
Zachary Ware6b6e6872017-06-10 14:58:42 -050033set EXTERNALS=%D%..\..\externals\windows-installer\
34
35set BUILDX86=
36set BUILDX64=
37set TARGET=Rebuild
38set TESTTARGETDIR=
39set PGO=-m test -q --pgo
Steve Dower0cd63912018-12-10 18:52:57 -080040set BUILDMSI=1
Zachary Ware6b6e6872017-06-10 14:58:42 -050041set BUILDNUGET=1
42set BUILDZIP=1
43
44
45:CheckOpts
46if "%1" EQU "-h" goto Help
47if "%1" EQU "-c" (set CERTNAME=%~2) && shift && shift && goto CheckOpts
48if "%1" EQU "--certificate" (set CERTNAME=%~2) && shift && shift && goto CheckOpts
49if "%1" EQU "-o" (set OUTDIR=%~2) && shift && shift && goto CheckOpts
50if "%1" EQU "--out" (set OUTDIR=%~2) && shift && shift && goto CheckOpts
51if "%1" EQU "-D" (set SKIPDOC=1) && shift && goto CheckOpts
52if "%1" EQU "--skip-doc" (set SKIPDOC=1) && shift && goto CheckOpts
53if "%1" EQU "-B" (set SKIPBUILD=1) && shift && goto CheckOpts
54if "%1" EQU "--skip-build" (set SKIPBUILD=1) && shift && goto CheckOpts
55if "%1" EQU "--download" (set DOWNLOAD_URL=%~2) && shift && shift && goto CheckOpts
56if "%1" EQU "--test" (set TESTTARGETDIR=%~2) && shift && shift && goto CheckOpts
57if "%1" EQU "-b" (set TARGET=Build) && shift && goto CheckOpts
58if "%1" EQU "--build" (set TARGET=Build) && shift && goto CheckOpts
59if "%1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts
60if "%1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts
61if "%1" EQU "--pgo" (set PGO=%~2) && shift && shift && goto CheckOpts
62if "%1" EQU "--skip-pgo" (set PGO=) && shift && goto CheckOpts
63if "%1" EQU "--skip-nuget" (set BUILDNUGET=) && shift && goto CheckOpts
64if "%1" EQU "--skip-zip" (set BUILDZIP=) && shift && goto CheckOpts
Steve Dower0cd63912018-12-10 18:52:57 -080065if "%1" EQU "--skip-msi" (set BUILDMSI=) && shift && goto CheckOpts
Zachary Ware6b6e6872017-06-10 14:58:42 -050066
67if "%1" NEQ "" echo Invalid option: "%1" && exit /B 1
68
69if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1)
70
71if not exist "%GIT%" where git > "%TEMP%\git.loc" 2> nul && set /P GIT= < "%TEMP%\git.loc" & del "%TEMP%\git.loc"
72if not exist "%GIT%" echo Cannot find Git on PATH && exit /B 1
73
74call "%D%get_externals.bat"
Steve Dower40a23e82017-06-19 10:34:25 -070075call "%PCBUILD%find_msbuild.bat" %MSBUILD%
76if ERRORLEVEL 1 (echo Cannot locate MSBuild.exe on PATH or as MSBUILD variable & exit /b 2)
Zachary Ware6b6e6872017-06-10 14:58:42 -050077
78:builddoc
79if "%SKIPBUILD%" EQU "1" goto skipdoc
80if "%SKIPDOC%" EQU "1" goto skipdoc
81
Zachary Ware6b6e6872017-06-10 14:58:42 -050082call "%D%..\..\doc\make.bat" htmlhelp
83if errorlevel 1 goto :eof
84:skipdoc
85
86where dlltool /q && goto skipdlltoolsearch
87set _DLLTOOL_PATH=
88where /R "%EXTERNALS%\" dlltool > "%TEMP%\dlltool.loc" 2> nul && set /P _DLLTOOL_PATH= < "%TEMP%\dlltool.loc" & del "%TEMP%\dlltool.loc"
89if not exist "%_DLLTOOL_PATH%" echo Cannot find binutils on PATH or in external && exit /B 1
90for %%f in (%_DLLTOOL_PATH%) do set PATH=%PATH%;%%~dpf
91set _DLLTOOL_PATH=
92:skipdlltoolsearch
93
94if defined BUILDX86 (
95 call :build x86
96 if errorlevel 1 exit /B
97)
98
99if defined BUILDX64 (
100 call :build x64 "%PGO%"
101 if errorlevel 1 exit /B
102)
103
104if defined TESTTARGETDIR (
105 call "%D%testrelease.bat" -t "%TESTTARGETDIR%"
106)
107
108exit /B 0
109
110:build
111@setlocal
112@echo off
113
114if "%1" EQU "x86" (
115 set PGO=
Steve Dowerf0851912017-07-26 09:09:01 -0700116 set BUILD=%Py_OutDir%win32\
Zachary Ware6b6e6872017-06-10 14:58:42 -0500117 set BUILD_PLAT=Win32
118 set OUTDIR_PLAT=win32
119 set OBJDIR_PLAT=x86
120) else (
Steve Dowerf0851912017-07-26 09:09:01 -0700121 set BUILD=%Py_OutDir%amd64\
Zachary Ware6b6e6872017-06-10 14:58:42 -0500122 set PGO=%~2
123 set BUILD_PLAT=x64
124 set OUTDIR_PLAT=amd64
125 set OBJDIR_PLAT=x64
126)
127
128if exist "%BUILD%en-us" (
129 echo Deleting %BUILD%en-us
130 rmdir /q/s "%BUILD%en-us"
131 if errorlevel 1 exit /B
132)
133
134if exist "%D%obj\Debug_%OBJDIR_PLAT%" (
135 echo Deleting "%D%obj\Debug_%OBJDIR_PLAT%"
136 rmdir /q/s "%D%obj\Debug_%OBJDIR_PLAT%"
137 if errorlevel 1 exit /B
138)
139
140if exist "%D%obj\Release_%OBJDIR_PLAT%" (
141 echo Deleting "%D%obj\Release_%OBJDIR_PLAT%"
142 rmdir /q/s "%D%obj\Release_%OBJDIR_PLAT%"
143 if errorlevel 1 exit /B
144)
145
146if not "%CERTNAME%" EQU "" (
147 set CERTOPTS="/p:SigningCertificate=%CERTNAME%"
148) else (
149 set CERTOPTS=
150)
151if not "%PGO%" EQU "" (
152 set PGOOPTS=--pgo-job "%PGO%"
153) else (
154 set PGOOPTS=
155)
156if not "%SKIPBUILD%" EQU "1" (
157 @echo call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS%
158 @call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS%
159 @if errorlevel 1 exit /B
160 @rem build.bat turns echo back on, so we disable it again
161 @echo off
162
163 @echo call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET%
164 @call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET%
165 @if errorlevel 1 exit /B
166 @rem build.bat turns echo back on, so we disable it again
167 @echo off
168)
169
Zachary Ware6b6e6872017-06-10 14:58:42 -0500170if "%OUTDIR_PLAT%" EQU "win32" (
Steve Dower40a23e82017-06-19 10:34:25 -0700171 %MSBUILD% "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI%
Zachary Ware6b6e6872017-06-10 14:58:42 -0500172 if errorlevel 1 exit /B
Steve Dowerf0851912017-07-26 09:09:01 -0700173) else if not exist "%Py_OutDir%win32\en-us\launcher.msi" (
Steve Dower40a23e82017-06-19 10:34:25 -0700174 %MSBUILD% "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI%
Zachary Ware6b6e6872017-06-10 14:58:42 -0500175 if errorlevel 1 exit /B
176)
177
178set BUILDOPTS=/p:Platform=%1 /p:BuildForRelease=true /p:DownloadUrl=%DOWNLOAD_URL% /p:DownloadUrlBase=%DOWNLOAD_URL_BASE% /p:ReleaseUri=%RELEASE_URI%
Steve Dower0cd63912018-12-10 18:52:57 -0800179if defined BUILDMSI (
180 %MSBUILD% "%D%bundle\releaselocal.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=true
181 if errorlevel 1 exit /B
182 %MSBUILD% "%D%bundle\releaseweb.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=false
183 if errorlevel 1 exit /B
184)
Zachary Ware6b6e6872017-06-10 14:58:42 -0500185
186if defined BUILDZIP (
Steve Dower40a23e82017-06-19 10:34:25 -0700187 %MSBUILD% "%D%make_zip.proj" /t:Build %BUILDOPTS% %CERTOPTS% /p:OutputPath="%BUILD%en-us"
Zachary Ware6b6e6872017-06-10 14:58:42 -0500188 if errorlevel 1 exit /B
189)
190
191if defined BUILDNUGET (
Steve Dower40a23e82017-06-19 10:34:25 -0700192 %MSBUILD% "%D%..\nuget\make_pkg.proj" /t:Build /p:Configuration=Release /p:Platform=%1 /p:OutputPath="%BUILD%en-us"
Zachary Ware6b6e6872017-06-10 14:58:42 -0500193 if errorlevel 1 exit /B
194)
195
196if not "%OUTDIR%" EQU "" (
197 mkdir "%OUTDIR%\%OUTDIR_PLAT%"
198 mkdir "%OUTDIR%\%OUTDIR_PLAT%\binaries"
199 mkdir "%OUTDIR%\%OUTDIR_PLAT%\symbols"
200 robocopy "%BUILD%en-us" "%OUTDIR%\%OUTDIR_PLAT%" /XF "*.wixpdb"
201 robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\binaries" *.exe *.dll *.pyd /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*"
202 robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\symbols" *.pdb /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*"
203)
204
205exit /B 0
206
207:Help
208echo buildrelease.bat [--out DIR] [-x86] [-x64] [--certificate CERTNAME] [--build] [--pgo COMMAND]
209echo [--skip-build] [--skip-doc] [--skip-nuget] [--skip-zip] [--skip-pgo]
210echo [--download DOWNLOAD URL] [--test TARGETDIR]
211echo [-h]
212echo.
213echo --out (-o) Specify an additional output directory for installers
214echo -x86 Build x86 installers
215echo -x64 Build x64 installers
216echo --build (-b) Incrementally build Python rather than rebuilding
217echo --skip-build (-B) Do not build Python (just do the installers)
218echo --skip-doc (-D) Do not build documentation
219echo --pgo Specify PGO command for x64 installers
220echo --skip-pgo Build x64 installers without using PGO
Steve Dower0cd63912018-12-10 18:52:57 -0800221echo --skip-msi Do not build executable/MSI packages
Zachary Ware6b6e6872017-06-10 14:58:42 -0500222echo --skip-nuget Do not build Nuget packages
223echo --skip-zip Do not build embeddable package
224echo --download Specify the full download URL for MSIs
225echo --test Specify the test directory to run the installer tests
226echo -h Display this help information
227echo.
228echo If no architecture is specified, all architectures will be built.
229echo If --test is not specified, the installer tests are not run.
230echo.
231echo For the --pgo option, any Python command line can be used, or 'default' to
232echo use the default task (-m test --pgo).
233echo.
234echo The following substitutions will be applied to the download URL:
235echo Variable Description Example
236echo {version} version number 3.5.0
237echo {arch} architecture amd64, win32
238echo {releasename} release name a1, b2, rc3 (or blank for final)
239echo {msi} MSI filename core.msi