summaryrefslogtreecommitdiffstats
path: root/Tools/msi/buildrelease.bat
blob: 4659a32b838cc1793cc0bbb3d4edec308055b46e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
@setlocal
@echo off

rem This script is intended for building official releases of Python.

rem To use it to build alternative releases, you should clone this file

rem and modify the following three URIs.


rem These two will ensure that your release can be installed

rem alongside an official Python release, by modifying the GUIDs used

rem for all components.

rem

rem The following substitutions will be applied to the release URI:

rem     Variable        Description         Example

rem     {arch}          architecture        amd64, win32

set RELEASE_URI=http://www.python.org/{arch}

rem This is the URL that will be used to download installation files.

rem The files available from the default URL *will* conflict with your

rem installer. Trust me, you don't want them, even if it seems like a

rem good idea.

rem

rem The following substitutions will be applied to the download URL:

rem     Variable        Description         Example

rem     {version}       version number      3.5.0

rem     {arch}          architecture        amd64, win32

rem     {releasename}   release name        a1, b2, rc3 (or blank for final)

rem     {msi}           MSI filename        core.msi

set DOWNLOAD_URL=https://www.python.org/ftp/python/{version}/{arch}{releasename}/{msi}

set D=%~dp0
set PCBUILD=%D%..\..\PCBuild\
set EXTERNALS=%D%..\..\externals\windows-installer\

set BUILDX86=
set BUILDX64=
set TARGET=Rebuild
set TESTTARGETDIR=
set PGO=-m test -q --pgo
set BUILDNUGET=1
set BUILDZIP=1


:CheckOpts
if "%1" EQU "-h" goto Help

if "%1" EQU "-c" (set CERTNAME=%~2) && shift && shift && goto CheckOpts
if "%1" EQU "--certificate" (set CERTNAME=%~2) && shift && shift && goto CheckOpts

if "%1" EQU "-o" (set OUTDIR=%~2) && shift && shift && goto CheckOpts
if "%1" EQU "--out" (set OUTDIR=%~2) && shift && shift && goto CheckOpts

if "%1" EQU "-D" (set SKIPDOC=1) && shift && goto CheckOpts
if "%1" EQU "--skip-doc" (set SKIPDOC=1) && shift && goto CheckOpts

if "%1" EQU "-B" (set SKIPBUILD=1) && shift && goto CheckOpts
if "%1" EQU "--skip-build" (set SKIPBUILD=1) && shift && goto CheckOpts

if "%1" EQU "--download" (set DOWNLOAD_URL=%~2) && shift && shift && goto CheckOpts
if "%1" EQU "--test" (set TESTTARGETDIR=%~2) && shift && shift && goto CheckOpts

if "%1" EQU "-b" (set TARGET=Build) && shift && goto CheckOpts
if "%1" EQU "--build" (set TARGET=Build) && shift && goto CheckOpts

if "%1" EQU "-x86" (set BUILDX86=1) && shift && goto CheckOpts
if "%1" EQU "-x64" (set BUILDX64=1) && shift && goto CheckOpts

if "%1" EQU "--pgo" (set PGO=%~2) && shift && shift && goto CheckOpts
if "%1" EQU "--skip-pgo" (set PGO=) && shift && goto CheckOpts

if "%1" EQU "--skip-nuget" (set BUILDNUGET=) && shift && goto CheckOpts
if "%1" EQU "--skip-zip" (set BUILDZIP=) && shift && goto CheckOpts



if "%1" NEQ "" echo Invalid option: "%1" && exit /B 1



if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX64=1)



if not exist "%HG%" where hg > "%TEMP%\hg.loc" 2> nul && set /P HG= < "%TEMP%\hg.loc" & del "%TEMP%\hg.loc"

if not exist "%HG%" echo Cannot find Mercurial on PATH && exit /B 1

call "%D%get_externals.bat"



:builddoc

if "%SKIPBUILD%" EQU "1" goto skipdoc
if "%SKIPDOC%" EQU "1" goto skipdoc



if not defined PYTHON where py -q || echo Cannot find py on path and PYTHON is not set. && exit /B 1

if not defined SPHINXBUILD where sphinx-build -q || echo Cannot find sphinx-build on path and SPHINXBUILD is not set. && exit /B 1



call "%D%..\..\doc\make.bat" htmlhelp
if errorlevel 1 goto :eof
:skipdoc

where dlltool /q && goto skipdlltoolsearch
set _DLLTOOL_PATH=
where /R "%EXTERNALS%\" dlltool > "%TEMP%\dlltool.loc" 2> nul && set /P _DLLTOOL_PATH= < "%TEMP%\dlltool.loc" & del "%TEMP%\dlltool.loc" 
if not exist "%_DLLTOOL_PATH%" echo Cannot find binutils on PATH or in external && exit /B 1

for %%f in (%_DLLTOOL_PATH%) do set PATH=%PATH%;%%~dpf

set _DLLTOOL_PATH=

:skipdlltoolsearch



if defined BUILDX86 (

    call :build x86

    if errorlevel 1 exit /B

)



if defined BUILDX64 (

    call :build x64 "%PGO%"
    if errorlevel 1 exit /B
)

if defined TESTTARGETDIR (
    call "%D%testrelease.bat" -t "%TESTTARGETDIR%"
)

exit /B 0

:build
@setlocal
@echo off

if "%1" EQU "x86" (

    set PGO=

    set BUILD=%PCBUILD%win32\

    set BUILD_PLAT=Win32

    set OUTDIR_PLAT=win32

    set OBJDIR_PLAT=x86

) else (

    set BUILD=%PCBUILD%amd64\

    set PGO=%~2

    set BUILD_PLAT=x64

    set OUTDIR_PLAT=amd64

    set OBJDIR_PLAT=x64

)



if exist "%BUILD%en-us" (
    echo Deleting %BUILD%en-us
    rmdir /q/s "%BUILD%en-us"

    if errorlevel 1 exit /B

)



if exist "%D%obj\Debug_%OBJDIR_PLAT%" (
    echo Deleting "%D%obj\Debug_%OBJDIR_PLAT%"

    rmdir /q/s "%D%obj\Debug_%OBJDIR_PLAT%"
    if errorlevel 1 exit /B
)

if exist "%D%obj\Release_%OBJDIR_PLAT%" (

    echo Deleting "%D%obj\Release_%OBJDIR_PLAT%"
    rmdir /q/s "%D%obj\Release_%OBJDIR_PLAT%"

    if errorlevel 1 exit /B

)



if not "%CERTNAME%" EQU "" (
    set CERTOPTS="/p:SigningCertificate=%CERTNAME%"

) else (

    set CERTOPTS=

)

if not "%PGO%" EQU "" (
    set PGOOPTS=--pgo-job "%PGO%"

) else (

    set PGOOPTS=

)

if not "%SKIPBUILD%" EQU "1" (
    @echo call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS%

    @call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %PGOOPTS% %CERTOPTS%
    @if errorlevel 1 exit /B
    @rem build.bat turns echo back on, so we disable it again
    @echo off

    @echo call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET%

    @call "%PCBUILD%build.bat" -d -e -p %BUILD_PLAT% -t %TARGET%
    @if errorlevel 1 exit /B
    @rem build.bat turns echo back on, so we disable it again
    @echo off
)

call "%PCBUILD%env.bat"

if "%OUTDIR_PLAT%" EQU "win32" (
    msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI%

    if errorlevel 1 exit /B

) else if not exist "%PCBUILD%win32\en-us\launcher.msi" (
    msbuild "%D%launcher\launcher.wixproj" /p:Platform=x86 %CERTOPTS% /p:ReleaseUri=%RELEASE_URI%

    if errorlevel 1 exit /B

)



set BUILDOPTS=/p:Platform=%1 /p:BuildForRelease=true /p:DownloadUrl=%DOWNLOAD_URL% /p:DownloadUrlBase=%DOWNLOAD_URL_BASE% /p:ReleaseUri=%RELEASE_URI%

msbuild "%D%bundle\releaselocal.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=true
if errorlevel 1 exit /B
msbuild "%D%bundle\releaseweb.wixproj" /t:Rebuild %BUILDOPTS% %CERTOPTS% /p:RebuildAll=false

if errorlevel 1 exit /B



if defined BUILDZIP (

    msbuild "%D%make_zip.proj" /t:Build %BUILDOPTS% %CERTOPTS% /p:OutputPath="%BUILD%en-us"

    if errorlevel 1 exit /B

)



if defined BUILDNUGET (

    msbuild "%D%..\nuget\make_pkg.proj" /t:Build /p:Configuration=Release /p:Platform=%1 /p:OutputPath="%BUILD%en-us"

    if errorlevel 1 exit /B

)



if not "%OUTDIR%" EQU "" (
    mkdir "%OUTDIR%\%OUTDIR_PLAT%"

    mkdir "%OUTDIR%\%OUTDIR_PLAT%\binaries"
    mkdir "%OUTDIR%\%OUTDIR_PLAT%\symbols"

    robocopy "%BUILD%en-us" "%OUTDIR%\%OUTDIR_PLAT%" /XF "*.wixpdb"

    robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\binaries" *.exe *.dll *.pyd /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*"

    robocopy "%BUILD%\" "%OUTDIR%\%OUTDIR_PLAT%\symbols" *.pdb              /XF "_test*" /XF "*_d.*" /XF "_freeze*" /XF "tcl*" /XF "tk*" /XF "*_test.*"

)



exit /B 0



:Help

echo buildrelease.bat [--out DIR] [-x86] [-x64] [--certificate CERTNAME] [--build] [--pgo COMMAND]

echo                  [--skip-build] [--skip-doc] [--skip-nuget] [--skip-zip] [--skip-pgo]

echo                  [--download DOWNLOAD URL] [--test TARGETDIR]

echo                  [-h]

echo.

echo    --out (-o)          Specify an additional output directory for installers

echo    -x86                Build x86 installers

echo    -x64                Build x64 installers

echo    --build (-b)        Incrementally build Python rather than rebuilding

echo    --skip-build (-B)   Do not build Python (just do the installers)

echo    --skip-doc (-D)     Do not build documentation

echo    --pgo               Specify PGO command for x64 installers

echo    --skip-pgo          Build x64 installers without using PGO

echo    --skip-nuget        Do not build Nuget packages

echo    --skip-zip          Do not build embeddable package

echo    --download          Specify the full download URL for MSIs

echo    --test              Specify the test directory to run the installer tests

echo    -h                  Display this help information

echo.

echo If no architecture is specified, all architectures will be built.

echo If --test is not specified, the installer tests are not run.

echo.

echo For the --pgo option, any Python command line can be used, or 'default' to

echo use the default task (-m test --pgo).

echo.

echo The following substitutions will be applied to the download URL:

echo     Variable        Description         Example

echo     {version}       version number      3.5.0

echo     {arch}          architecture        amd64, win32

echo     {releasename}   release name        a1, b2, rc3 (or blank for final)

echo     {msi}           MSI filename        core.msi