bpo-30450: Pull Windows dependencies from GitHub rather than svn (GH-1783)

The Windows build now depends on Python 3.6 to fetch externals, but it will be downloaded via NuGet (which is downloaded via PowerShell) if it is not available via `py -3.6`.  This means the only thing that must be installed on a modern Windows box to do a full build of CPython with all extensions is Visual Studio.

Also fixes an outdated note about _lzma in PCbuild/readme.txt
This commit is contained in:
Zachary Ware 2017-06-15 22:08:51 -05:00 committed by GitHub
parent 7a801839e9
commit 51599e2bdd
4 changed files with 239 additions and 85 deletions

60
PCbuild/get_external.py Normal file
View File

@ -0,0 +1,60 @@
#!/usr/bin/env python3
import argparse
import os
import pathlib
import zipfile
from urllib.request import urlretrieve
def fetch_zip(commit_hash, zip_dir, *, org='python', binary=False, verbose):
repo = f'cpython-{"bin" if binary else "source"}-deps'
url = f'https://github.com/{org}/{repo}/archive/{commit_hash}.zip'
reporthook = None
if verbose:
reporthook = print
zip_dir.mkdir(parents=True, exist_ok=True)
filename, headers = urlretrieve(
url,
zip_dir / f'{commit_hash}.zip',
reporthook=reporthook,
)
return filename
def extract_zip(externals_dir, zip_path):
with zipfile.ZipFile(os.fspath(zip_path)) as zf:
zf.extractall(os.fspath(externals_dir))
return externals_dir / zf.namelist()[0].split('/')[0]
def parse_args():
p = argparse.ArgumentParser()
p.add_argument('-v', '--verbose', action='store_true')
p.add_argument('-b', '--binary', action='store_true',
help='Is the dependency in the binary repo?')
p.add_argument('-O', '--organization',
help='Organization owning the deps repos', default='python')
p.add_argument('-e', '--externals-dir', type=pathlib.Path,
help='Directory in which to store dependencies',
default=pathlib.Path(__file__).parent.parent / 'externals')
p.add_argument('tag',
help='tag of the dependency')
return p.parse_args()
def main():
args = parse_args()
zip_path = fetch_zip(
args.tag,
args.externals_dir / 'zips',
org=args.organization,
binary=args.binary,
verbose=args.verbose,
)
final_name = args.externals_dir / args.tag
extract_zip(args.externals_dir, zip_path).replace(final_name)
if __name__ == '__main__':
main()

View File

@ -2,58 +2,59 @@
setlocal setlocal
rem Simple script to fetch source for external libraries rem Simple script to fetch source for external libraries
if not exist "%~dp0..\externals" mkdir "%~dp0..\externals" if "%PCBUILD%"=="" (set PCBUILD=%~dp0)
pushd "%~dp0..\externals" if "%EXTERNALS_DIR%"=="" (set EXTERNALS_DIR=%PCBUILD%\..\externals)
if "%NUGET%"=="" (set NUGET=%EXTERNALS_DIR%\nuget.exe)
if "%NUGET_URL%"=="" (set NUGET_URL=https://aka.ms/nugetclidl)
if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/ set DO_FETCH=true
set DO_CLEAN=false
rem Optionally clean up first. Be warned that this can be very destructive! :CheckOpts
if not "%1"=="" ( if "%~1"=="--no-tkinter" (set IncludeTkinter=false) & shift & goto CheckOpts
for %%c in (-c --clean --clean-only) do ( if "%~1"=="--no-openssl" (set IncludeSSL=false) & shift & goto CheckOpts
if "%1"=="%%c" goto clean if "%~1"=="--python" (set PYTHON_FOR_BUILD=%2) & shift & shift & goto CheckOpts
) if "%~1"=="--organization" (set ORG=%2) & shift & shift & goto CheckOpts
goto usage if "%~1"=="-c" (set DO_CLEAN=true) & shift & goto CheckOpts
) if "%~1"=="--clean" (set DO_CLEAN=true) & shift & goto CheckOpts
goto fetch if "%~1"=="--clean-only" (set DO_FETCH=false) & goto clean
if "x%~1" NEQ "x" goto usage
if "%DO_CLEAN%"=="false" goto fetch
:clean :clean
echo.Cleaning up external libraries. echo.Cleaning up external libraries.
for /D %%d in ( if exist "%EXTERNALS_DIR%" (
bzip2-* rem Sometimes this fails the first time; try it twice
db-* rmdir /s /q "%EXTERNALS_DIR%" || rmdir /s /q "%EXTERNALS_DIR%"
nasm-*
openssl-*
tcl-*
tcltk*
tk-*
tix-*
sqlite-*
xz-*
) do (
echo.Removing %%d
rmdir /s /q %%d
)
if "%1"=="--clean-only" (
goto end
) )
if "%DO_FETCH%"=="false" goto end
:fetch :fetch
rem Fetch current versions
svn --version > nul 2>&1 if "%ORG%"=="" (set ORG=python)
if ERRORLEVEL 9009 (
echo.svn.exe must be on your PATH. if "%PYTHON_FOR_BUILD%"=="" (
echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the echo Checking for installed python...
echo.command line tools option. py -3.6 -V >nul 2>&1 && (set PYTHON_FOR_BUILD=py -3.6)
popd )
exit /b 1 if "%PYTHON_FOR_BUILD%"=="" (
if NOT exist "%EXTERNALS_DIR%" mkdir "%EXTERNALS_DIR%"
if NOT exist "%NUGET%" (
echo Downloading nuget...
rem NB: Must use single quotes around NUGET here, NOT double!
rem Otherwise, a space in the path would break things
powershell.exe -Command Invoke-WebRequest %NUGET_URL% -OutFile '%NUGET%'
)
echo Installing Python via nuget...
"%NUGET%" install pythonx86 -ExcludeVersion -OutputDirectory "%EXTERNALS_DIR%"
rem Quote it here; it's not quoted later because "py -3.6" wouldn't work
set PYTHON_FOR_BUILD="%EXTERNALS_DIR%\pythonx86\tools\python.exe"
) )
echo.Fetching external libraries... echo.Fetching external libraries...
set libraries= set libraries=
set libraries=%libraries% bzip2-1.0.6 set libraries=%libraries% bzip2-1.0.6
if NOT "%IncludeSSL%"=="false" set libraries=%libraries% nasm-2.11.06
if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2k if NOT "%IncludeSSL%"=="false" set libraries=%libraries% openssl-1.0.2k
set libraries=%libraries% sqlite-3.14.2.0 set libraries=%libraries% sqlite-3.14.2.0
if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-core-8.6.6.0 if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tcl-core-8.6.6.0
@ -62,43 +63,48 @@ if NOT "%IncludeTkinter%"=="false" set libraries=%libraries% tix-8.4.3.6
set libraries=%libraries% xz-5.2.2 set libraries=%libraries% xz-5.2.2
for %%e in (%libraries%) do ( for %%e in (%libraries%) do (
if exist %%e ( if exist "%EXTERNALS_DIR%\%%e" (
echo.%%e already exists, skipping. echo.%%e already exists, skipping.
) else ( ) else (
echo.Fetching %%e... echo.Fetching %%e...
svn export -q %SVNROOT%%%e %PYTHON_FOR_BUILD% "%PCBUILD%get_external.py" -O %ORG% %%e
) )
) )
echo.Fetching external binaries...
set binaries=
set binaries=%binaries%
if NOT "%IncludeSSL%"=="false" set binaries=%binaries% nasm-2.11.06
for %%b in (%binaries%) do (
if exist "%EXTERNALS_DIR%\%%b" (
echo.%%b already exists, skipping.
) else (
echo.Fetching %%b...
%PYTHON_FOR_BUILD% "%PCBUILD%get_external.py" -b -O %ORG% %%b
)
)
echo Finished.
goto end goto end
:usage :usage
echo.invalid argument: %1 echo.Valid options: -c, --clean, --clean-only, --organization, --python,
echo.usage: %~n0 [[ -c ^| --clean ] ^| --clean-only ] echo.--no-tkinter, --no-openssl
echo. echo.
echo.Pull all sources necessary for compiling optional extension modules echo.Pull all sources and binaries necessary for compiling optional extension
echo.that rely on external libraries. Requires svn.exe to be on your PATH echo.modules that rely on external libraries.
echo.and pulls sources from %SVNROOT%.
echo. echo.
echo.Use the -c or --clean option to clean up all external library sources echo.The --organization option determines which github organization to download
echo.before pulling in the current versions. echo.from, the --python option determines which Python 3.6+ interpreter to use
echo.with PCbuild\get_external.py.
echo.
echo.Use the -c or --clean option to remove the entire externals directory.
echo. echo.
echo.Use the --clean-only option to do the same cleaning, without pulling in echo.Use the --clean-only option to do the same cleaning, without pulling in
echo.anything new. echo.anything new.
echo. echo.
echo.Only the first argument is checked, all others are ignored.
echo.
echo.**WARNING**: the cleaning options unconditionally remove any directory
echo.that is a child of
echo. %CD%
echo.and matches wildcard patterns beginning with bzip2-, db-, nasm-, openssl-,
echo.tcl-, tcltk, tk-, tix-, sqlite-, or xz-, and as such has the potential
echo.to be very destructive if you are not aware of what it is doing. Use with
echo.caution!
popd
exit /b -1 exit /b -1
:end :end
echo Finished.
popd

View File

@ -2,9 +2,11 @@ Quick Start Guide
----------------- -----------------
1. Install Microsoft Visual Studio 2015, any edition. 1. Install Microsoft Visual Studio 2015, any edition.
2. Install Subversion, and make sure 'svn.exe' is on your PATH. 1a. Optionally install Python 3.6 or later. If not installed,
3. Run "build.bat -e" to build Python in 32-bit Release configuration. get_externals.bat (build.bat -e) will download and use Python via
4. (Optional, but recommended) Run the test suite with "rt.bat -q". NuGet.
2. Run "build.bat -e" to build Python in 32-bit Release configuration.
3. (Optional, but recommended) Run the test suite with "rt.bat -q".
Building Python using Microsoft Visual C++ Building Python using Microsoft Visual C++
@ -164,8 +166,7 @@ _bz2
Homepage: Homepage:
http://www.bzip.org/ http://www.bzip.org/
_lzma _lzma
Python wrapper for the liblzma compression library, using pre-built Python wrapper for version 5.2.2 of the liblzma compression library
binaries of XZ Utils version 5.0.5
Homepage: Homepage:
http://tukaani.org/xz/ http://tukaani.org/xz/
_ssl _ssl
@ -236,9 +237,16 @@ order to download the relevant source files for each project before they
can be built. However, a simple script is provided to make this as can be built. However, a simple script is provided to make this as
painless as possible, called "get_externals.bat" and located in this painless as possible, called "get_externals.bat" and located in this
directory. This script extracts all the external sub-projects from directory. This script extracts all the external sub-projects from
http://svn.python.org/projects/external https://github.com/python/cpython-source-deps
via Subversion (so you'll need svn.exe on your PATH) and places them and
in ..\externals (relative to this directory). https://github.com/python/cpython-bin-deps
via a Python script called "get_external.py", located in this directory.
If Python 3.6 or later is not available via the "py.exe" launcher, the
path or command to use for Python can be provided in the PYTHON_FOR_BUILD
environment variable, or get_externals.bat will download the latest
version of NuGet and use it to download the latest "pythonx86" package
for use with get_external.py. Everything downloaded by these scripts is
stored in ..\externals (relative to this directory).
It is also possible to download sources from each project's homepage, It is also possible to download sources from each project's homepage,
though you may have to change folder names or pass the names to MSBuild though you may have to change folder names or pass the names to MSBuild

View File

@ -1,27 +1,107 @@
@echo off @echo off
setlocal setlocal
rem Simple script to fetch source for external tools rem Simple script to fetch source for external libraries
where /Q svn set HERE=%~dp0
if ERRORLEVEL 1 ( if "%PCBUILD%"=="" (set PCBUILD=%HERE%..\..\PCbuild\)
echo.svn.exe must be on your PATH to get external tools. if "%EXTERNALS_DIR%"=="" (set EXTERNALS_DIR=%HERE%..\..\externals\windows-installer)
echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the if "%NUGET%"=="" (set NUGET=%EXTERNALS_DIR%\..\nuget.exe)
echo.command line tools option. if "%NUGET_URL%"=="" (set NUGET_URL=https://aka.ms/nugetclidl)
popd
exit /b 1 set DO_FETCH=true
set DO_CLEAN=false
:CheckOpts
if "%~1"=="--python" (set PYTHON_FOR_BUILD=%2) & shift & shift & goto CheckOpts
if "%~1"=="--organization" (set ORG=%2) & shift & shift & goto CheckOpts
if "%~1"=="-c" (set DO_CLEAN=true) & shift & goto CheckOpts
if "%~1"=="--clean" (set DO_CLEAN=true) & shift & goto CheckOpts
if "%~1"=="--clean-only" (set DO_FETCH=false) & goto clean
if "x%~1" NEQ "x" goto usage
if "%DO_CLEAN%"=="false" goto fetch
:clean
echo.Cleaning up external libraries.
if exist "%EXTERNALS_DIR%" (
rem Sometimes this fails the first time; try it twice
rmdir /s /q "%EXTERNALS_DIR%" || rmdir /s /q "%EXTERNALS_DIR%"
) )
if not exist "%~dp0..\..\externals" mkdir "%~dp0..\..\externals" if "%DO_FETCH%"=="false" goto end
pushd "%~dp0..\..\externals" :fetch
if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/ if "%ORG%"=="" (set ORG=python)
if not exist "windows-installer\.svn" ( if "%PYTHON_FOR_BUILD%"=="" (
echo.Checking out installer dependencies to %CD%\windows-installer echo Checking for installed python...
svn co %SVNROOT%windows-installer py -3.6 -V >nul 2>&1 && (set PYTHON_FOR_BUILD=py -3.6)
) else ( )
echo.Updating installer dependencies in %CD%\windows-installer if "%PYTHON_FOR_BUILD%"=="" (
svn up windows-installer if NOT exist "%EXTERNALS_DIR%" mkdir "%EXTERNALS_DIR%"
if NOT exist "%NUGET%" (
echo Downloading nuget...
rem NB: Must use single quotes around NUGET here, NOT double!
rem Otherwise, a space in the path would break things
powershell.exe -Command Invoke-WebRequest %NUGET_URL% -OutFile '%NUGET%'
)
echo Installing Python via nuget...
"%NUGET%" install pythonx86 -ExcludeVersion -OutputDirectory "%EXTERNALS_DIR%"
rem Quote it here; it's not quoted later because "py -3.6" wouldn't work
set PYTHON_FOR_BUILD="%EXTERNALS_DIR%\pythonx86\tools\python.exe"
) )
popd echo.Fetching external libraries...
set libraries=
for %%e in (%libraries%) do (
if exist "%EXTERNALS_DIR%\%%e" (
echo.%%e already exists, skipping.
) else (
echo.Fetching %%e...
%PYTHON_FOR_BUILD% "%PCBUILD%get_external.py" -e "%EXTERNALS_DIR%" -O %ORG% %%e
)
)
echo.Fetching external tools...
set binaries=
rem We always use whatever's latest in the repo for these
set binaries=%binaries% binutils
set binaries=%binaries% gpg
set binaries=%binaries% htmlhelp
set binaries=%binaries% nuget
set binaries=%binaries% redist
set binaries=%binaries% wix
for %%b in (%binaries%) do (
if exist "%EXTERNALS_DIR%\%%b" (
echo.%%b already exists, skipping.
) else (
echo.Fetching %%b...
%PYTHON_FOR_BUILD% "%PCBUILD%get_external.py" -e "%EXTERNALS_DIR%" -b -O %ORG% %%b
)
)
echo Finished.
goto end
:usage
echo.Valid options: -c, --clean, --clean-only, --organization, --python,
echo.--no-tkinter, --no-openssl
echo.
echo.Pull all sources and binaries necessary for compiling optional extension
echo.modules that rely on external libraries.
echo.
echo.The --organization option determines which github organization to download
echo.from, the --python option determines which Python 3.6+ interpreter to use
echo.with PCbuild\get_external.py.
echo.
echo.Use the -c or --clean option to remove the entire externals directory.
echo.
echo.Use the --clean-only option to do the same cleaning, without pulling in
echo.anything new.
echo.
exit /b -1
:end