Clean up/refactor the batch scripts used for building on Windows.

This is mostly a backport of issue #21907, but also includes a few
extras necessary to make the bulidbot scripts as thin as possible.
This commit is contained in:
Zachary Ware 2015-06-09 23:16:52 -05:00
parent 17d5f47423
commit 6250df81bf
14 changed files with 261 additions and 199 deletions

View file

@ -1,19 +1,107 @@
@echo off
rem A batch program to build or rebuild a particular configuration.
rem A batch program to build or rebuild a particular configuration,
rem just for convenience.
rem Arguments:
rem -c Set the configuration (default: Release)
rem -p Set the platform (x64 or Win32, default: Win32)
rem -r Target Rebuild instead of Build
rem -t Set the target manually (Build, Rebuild, or Clean)
rem -d Set the configuration to Debug
rem -e Pull in external libraries using get_externals.bat
rem -m Enable parallel build
rem -M Disable parallel build (disabled by default)
rem -v Increased output messages
rem -k Attempt to kill any running Pythons before building
setlocal
set platf=Win32
set vs_platf=x86
set conf=Release
set target=build
set target=Build
set dir=%~dp0
set parallel=
set verbose=/nologo /v:m
set kill=
set build_tkinter=
:CheckOpts
if "%1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts
if "%1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts
if "%1"=="-r" (set target=rebuild) & shift & goto CheckOpts
if "%1"=="-d" (set conf=Debug) & shift & goto CheckOpts
if '%1'=='-c' (set conf=%2) & shift & shift & goto CheckOpts
if '%1'=='-p' (set platf=%2) & shift & shift & goto CheckOpts
if '%1'=='-r' (set target=Rebuild) & shift & goto CheckOpts
if '%1'=='-t' (set target=%2) & shift & shift & goto CheckOpts
if '%1'=='-d' (set conf=Debug) & shift & goto CheckOpts
if '%1'=='-e' call "%dir%get_externals.bat" & (set build_tkinter=true) & shift & goto CheckOpts
if '%1'=='-m' (set parallel=/m) & shift & goto CheckOpts
if '%1'=='-M' (set parallel=) & shift & goto CheckOpts
if '%1'=='-v' (set verbose=/v:n) & shift & goto CheckOpts
if '%1'=='-k' (set kill=true) & shift & goto CheckOpts
set cmd=msbuild /p:useenv=true %dir%pcbuild.sln /t:%target% /p:Configuration=%conf% /p:Platform=%platf%
echo %cmd%
%cmd%
if '%conf%'=='Debug' (set dbg_ext=_d) else (set dbg_ext=)
if '%platf%'=='x64' (
set vs_platf=x86_amd64
set builddir=%dir%amd64\
) else (
set builddir=%dir%
)
rem Setup the environment
call "%dir%env.bat" %vs_platf%
if '%kill%'=='true' (
msbuild "%dir%kill_python.vcxproj" %verbose% /p:Configuration=%conf% /p:Platform=%platf% && "%builddir%kill_python%dbg_ext%.exe"
)
set externals_dir=%dir%..\externals
if '%build_tkinter%'=='true' (
if '%platf%'=='x64' (
set tcltkdir=%externals_dir%\tcltk64
set machine=AMD64
) else (
set tcltkdir=%externals_dir%\tcltk
set machine=IX86
)
if '%conf%'=='Debug' (
set tcl_dbg_ext=g
set debug_flag=1
set options=symbols
) else (
set tcl_dbg_ext=
set debug_flag=0
set options=
)
set tcldir=%externals_dir%\tcl-8.6.1.0
set tkdir=%externals_dir%\tk-8.6.1.0
set tixdir=%externals_dir%\tix-8.4.3.4
)
if '%build_tkinter%'=='true' (
if not exist "%tcltkdir%\bin\tcl86t%tcl_dbg_ext%.dll" (
@rem all and install need to be separate invocations, otherwise nmakehlp is not found on install
pushd "%tcldir%\win"
nmake -f makefile.vc MACHINE=%machine% OPTS=%options% INSTALLDIR="%tcltkdir%" clean all
nmake -f makefile.vc MACHINE=%machine% OPTS=%options% INSTALLDIR="%tcltkdir%" install-binaries install-libraries
popd
)
if not exist "%tcltkdir%\bin\tk86t%tcl_dbg_ext%.dll" (
pushd "%tkdir%\win"
nmake -f makefile.vc MACHINE=%machine% OPTS=%options% INSTALLDIR="%tcltkdir%" TCLDIR="%tcldir%" clean
nmake -f makefile.vc MACHINE=%machine% OPTS=%options% INSTALLDIR="%tcltkdir%" TCLDIR="%tcldir%" all
nmake -f makefile.vc MACHINE=%machine% OPTS=%options% INSTALLDIR="%tcltkdir%" TCLDIR="%tcldir%" install-binaries install-libraries
popd
)
if not exist "%tcltkdir%\lib\tix8.4.3\tix84%tcl_dbg_ext%.dll" (
pushd "%tixdir%\win"
nmake -f python.mak DEBUG=%debug_flag% MACHINE=%machine% TCL_DIR="%tcldir%" TK_DIR="%tkdir%" INSTALL_DIR="%tcltkdir%" clean
nmake -f python.mak DEBUG=%debug_flag% MACHINE=%machine% TCL_DIR="%tcldir%" TK_DIR="%tkdir%" INSTALL_DIR="%tcltkdir%" all
nmake -f python.mak DEBUG=%debug_flag% MACHINE=%machine% TCL_DIR="%tcldir%" TK_DIR="%tkdir%" INSTALL_DIR="%tcltkdir%" install
popd
)
)
rem Call on MSBuild to do the work, echo the command.
rem Passing %1-9 is not the preferred option, but argument parsing in
rem batch is, shall we say, "lackluster"
echo on
msbuild "%dir%pcbuild.sln" /t:%target% %parallel% %verbose% /p:Configuration=%conf% /p:Platform=%platf% %1 %2 %3 %4 %5 %6 %7 %8 %9

View file

@ -1,9 +1,4 @@
@echo off
set VS10=%ProgramFiles(x86)%\Microsoft Visual Studio 10.0
IF EXIST "%VS10%" GOTO ok
set VS10=%ProgramFiles%\Microsoft Visual Studio 10.0
:ok
echo Build environments: x86, ia64, amd64, x86_amd64, x86_ia64
echo.
call "%VS10%\VC\vcvarsall.bat" %1
call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" %*

103
PCbuild/get_externals.bat Normal file
View file

@ -0,0 +1,103 @@
@echo off
setlocal
rem Simple script to fetch source for external libraries
if not exist "%~dp0..\externals" mkdir "%~dp0..\externals"
pushd "%~dp0..\externals"
if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/
rem Optionally clean up first. Be warned that this can be very destructive!
if not "%1"=="" (
for %%c in (-c --clean --clean-only) do (
if "%1"=="%%c" goto clean
)
goto usage
)
goto fetch
:clean
echo.Cleaning up external libraries.
for /D %%d in (
bzip2-*
db-*
nasm-*
openssl-*
tcl-*
tcltk*
tk-*
tix-*
sqlite-*
xz-*
) do (
echo.Removing %%d
rmdir /s /q %%d
)
if "%1"=="--clean-only" (
goto end
)
:fetch
rem Fetch current versions
svn --version > nul 2>&1
if ERRORLEVEL 9009 (
echo.svn.exe must be on your PATH.
echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the
echo.command line tools option.
popd
exit /b 1
)
echo.Fetching external libraries...
for %%e in (
bzip2-1.0.6
nasm-2.11.06
openssl-1.0.2a
tcl-8.6.1.0
tk-8.6.1.0
tix-8.4.3.4
sqlite-3.8.3.1
xz-5.0.5
) do (
if exist %%e (
echo.%%e already exists, skipping.
) else (
echo.Fetching %%e...
svn export %SVNROOT%%%e
)
)
goto end
:usage
echo.invalid argument: %1
echo.usage: %~n0 [[ -c ^| --clean ] ^| --clean-only ]
echo.
echo.Pull all sources necessary for compiling optional extension modules
echo.that rely on external libraries. Requires svn.exe to be on your PATH
echo.and pulls sources from %SVNROOT%.
echo.
echo.Use the -c or --clean option to clean up all external library sources
echo.before pulling in the current versions.
echo.
echo.Use the --clean-only option to do the same cleaning, without pulling in
echo.anything new.
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
:end
echo Finished.
popd

View file

@ -9,7 +9,8 @@ rem -q runs the tests just once, and without deleting .py[co] files.
rem -x64 Run the 64-bit build of python (or python_d if -d was specified)
rem from the 'amd64' dir instead of the 32-bit build in this dir.
rem All leading instances of these switches are shifted off, and
rem whatever remains is passed to regrtest.py. For example,
rem whatever remains (up to 9 arguments) is passed to regrtest.py.
rem For example,
rem rt -O -d -x test_thread
rem runs
rem python_d -O ../lib/test/regrtest.py -x test_thread
@ -26,7 +27,8 @@ rem rt -u "network,largefile"
setlocal
set prefix=.\
set pcbuild=%~dp0
set prefix=%pcbuild%
set suffix=
set qmode=
set dashO=
@ -36,15 +38,15 @@ set tcltk=tcltk
if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts
if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts
if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts
if "%1"=="-x64" (set prefix=amd64) & (set tcltk=tcltk64) & shift & goto CheckOpts
if "%1"=="-x64" (set prefix=%prefix%amd64) & (set tcltk=tcltk64) & shift & goto CheckOpts
PATH %PATH%;%~dp0..\externals\%tcltk%\bin
set exe=%prefix%\python%suffix%
set cmd=%exe% %dashO% -Wd -E -bb ../lib/test/regrtest.py %1 %2 %3 %4 %5 %6 %7 %8 %9
PATH %PATH%;%pcbuild%..\externals\%tcltk%\bin
set exe="%prefix%\python%suffix%"
set cmd=%exe% %dashO% -Wd -E -bb "%pcbuild%..\lib\test\regrtest.py" %1 %2 %3 %4 %5 %6 %7 %8 %9
if defined qmode goto Qmode
echo Deleting .pyc/.pyo files ...
%exe% rmpyc.py
%exe% "%pcbuild%\rmpyc.py"
echo on
%cmd%

View file

@ -1,36 +0,0 @@
Comments on building tcl/tk for AMD64 with the MS SDK compiler
==============================================================
I did have to build tcl/tk manually.
First, I had to build the nmakehlp.exe helper utility manually by executing
cl nmakehlp.c /link bufferoverflowU.lib
in both the tcl8.4.12\win and tk8.4.12\win directories.
Second, the AMD64 compiler refuses to compile the file
tcl8.4.12\generic\tclExecute.c because it insists on using intrinsics
for the 'ceil' and 'floor' functions:
..\generic\tclExecute.c(394) : error C2099: initializer is not a constant
..\generic\tclExecute.c(398) : error C2099: initializer is not a constant
I did comment out these lines; an alternative would have been to use
the /Oi- compiler flag to disable the intrinsic functions.
The commands then used were these:
svn export http://svn.python.org/projects/external/tcl8.4.12
cd tcl8.4.12\win
REM
echo patch the tcl8.4.12\generic\tclExecute.c file
pause
REM
cl nmakehlp.c /link bufferoverflowU.lib
nmake -f makefile.vc MACHINE=AMD64
nmake -f makefile.vc INSTALLDIR=..\..\tcltk install
cd ..\..
svn export http://svn.python.org/projects/external/tk8.4.12
cd tk8.4.12\win
cl nmakehlp.c /link bufferoverflowU.lib
nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 MACHINE=AMD64
nmake -f makefile.vc TCLDIR=..\..\tcl8.4.12 INSTALLDIR=..\..\tcltk install
cd ..\..

View file

@ -1,6 +1,2 @@
@rem Used by the buildbot "compile" step.
cmd /c Tools\buildbot\external-amd64.bat
call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
cmd /c Tools\buildbot\clean-amd64.bat
msbuild PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=x64
call "%~dp0build.bat" -p x64 %*

View file

@ -1,7 +1,17 @@
@rem Used by the buildbot "compile" step.
cmd /c Tools\buildbot\external.bat
call "%VS100COMNTOOLS%vsvars32.bat"
cmd /c Tools\buildbot\clean.bat
msbuild PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=Win32
@rem Clean up
call "%~dp0clean.bat" %*
@rem If you need the buildbots to start fresh (such as when upgrading to
@rem a new version of an external library, especially Tcl/Tk):
@rem 1) uncomment the following line:
@rem call "%~dp0..\..\PCbuild\get_externals.bat" --clean-only
@rem 2) commit and push
@rem 3) wait for all Windows bots to start a build with that changeset
@rem 4) re-comment, commit and push again
@rem Do the build
call "%~dp0..\..\PCbuild\build.bat" -e -d -k -v %*

View file

@ -1,10 +1,2 @@
@rem Used by the buildbot "clean" step.
call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
@echo Deleting .pyc/.pyo files ...
del /s Lib\*.pyc Lib\*.pyo
@echo Deleting test leftovers ...
rmdir /s /q build
cd PCbuild
msbuild /target:clean pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x64
msbuild /target:clean pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x64
cd ..
call "%~dp0clean.bat" -p x64 %*

View file

@ -1,8 +1,16 @@
@rem Used by the buildbot "clean" step.
call "%VS100COMNTOOLS%vsvars32.bat"
@echo Deleting test leftovers ...
rmdir /s /q build
cd PCbuild
msbuild /target:clean pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x86
msbuild /target:clean pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x86
cd ..
@echo off
rem Used by the buildbot "clean" step.
setlocal
set root=%~dp0..\..
set pcbuild=%root%\PCbuild
echo Deleting build
call "%pcbuild%\build.bat" -t Clean -k %*
call "%pcbuild%\build.bat" -t Clean -k -d %*
echo Deleting .pyc/.pyo files ...
del /s "%root%\Lib\*.pyc" "%root%\Lib\*.pyo"
echo Deleting test leftovers ...
rmdir /s /q "%root%\build"

View file

@ -1,28 +1,2 @@
@rem Fetches (and builds if necessary) external dependencies
@rem Assume we start inside the Python source directory
call "Tools\buildbot\external-common.bat"
call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64
if not exist tcltk64\bin\tcl86tg.dll (
cd tcl-8.6.1.0\win
nmake -f makefile.vc OPTS=symbols MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean core shell dlls
nmake -f makefile.vc OPTS=symbols MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install-binaries install-libraries
cd ..\..
)
if not exist tcltk64\bin\tk86tg.dll (
cd tk-8.6.1.0\win
nmake -f makefile.vc OPTS=symbols MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.6.1.0 clean
nmake -f makefile.vc OPTS=symbols MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.6.1.0 all
nmake -f makefile.vc OPTS=symbols MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.6.1.0 install-binaries install-libraries
cd ..\..
)
if not exist tcltk64\lib\tix8.4.3\tix84g.dll (
cd tix-8.4.3.4\win
nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.6.1.0 TK_DIR=..\..\tk-8.6.1.0 INSTALL_DIR=..\..\tcltk64 clean
nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.6.1.0 TK_DIR=..\..\tk-8.6.1.0 INSTALL_DIR=..\..\tcltk64 all
nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.6.1.0 TK_DIR=..\..\tk-8.6.1.0 INSTALL_DIR=..\..\tcltk64 install
cd ..\..
)
@echo Please use PCbuild\get_externals.bat instead.
@"%~dp0..\..\PCbuild\get_externals.bat" %*

View file

@ -1,54 +0,0 @@
@rem Common file shared between external.bat and external-amd64.bat. Responsible for
@rem fetching external components into the root\.. buildbot directories.
if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/
if not exist externals mkdir externals
cd externals
@rem XXX: If you need to force the buildbots to start from a fresh environment, uncomment
@rem the following, check it in, then check it out, comment it out, then check it back in.
@rem if exist bzip2-1.0.6 rd /s/q bzip2-1.0.6
@rem if exist tcltk rd /s/q tcltk
@rem if exist tcltk64 rd /s/q tcltk64
@rem if exist tcl-8.6.1.0 rd /s/q tcl-8.6.1.0
@rem if exist tk-8.6.1.0 rd /s/q tk-8.6.1.0
@rem if exist tix-8.4.3.4 rd /s/q tix-8.4.3.4
@rem if exist db-4.4.20 rd /s/q db-4.4.20
@rem if exist openssl-1.0.2a rd /s/q openssl-1.0.2a
@rem if exist sqlite-3.7.12 rd /s/q sqlite-3.7.12
@rem bzip
if not exist bzip2-1.0.6 (
rd /s/q bzip2-1.0.5
svn export %SVNROOT%bzip2-1.0.6
)
@rem NASM, for OpenSSL build
@rem if exist nasm-2.11.06 rd /s/q nasm-2.11.06
if not exist nasm-2.11.06 svn export %SVNROOT%nasm-2.11.06
@rem OpenSSL
if not exist openssl-1.0.2a (
rd /s/q openssl-1.0.1l
svn export %SVNROOT%openssl-1.0.2a
)
@rem tcl/tk
if not exist tcl-8.6.1.0 (
rd /s/q tcltk tcltk64 tcl-8.5.11.0 tk-8.5.11.0
svn export %SVNROOT%tcl-8.6.1.0
)
if not exist tk-8.6.1.0 svn export %SVNROOT%tk-8.6.1.0
if not exist tix-8.4.3.4 svn export %SVNROOT%tix-8.4.3.4
@rem sqlite3
if not exist sqlite-3.8.3.1 (
rd /s/q sqlite-source-3.8.1
svn export %SVNROOT%sqlite-3.8.3.1
)
@rem lzma
if not exist xz-5.0.5 (
rd /s/q xz-5.0.3
svn export %SVNROOT%xz-5.0.5
)

View file

@ -1,29 +1,2 @@
@rem Fetches (and builds if necessary) external dependencies
@rem Assume we start inside the Python source directory
call "Tools\buildbot\external-common.bat"
call "%VS100COMNTOOLS%\vsvars32.bat"
if not exist tcltk\bin\tcl86tg.dll (
@rem all and install need to be separate invocations, otherwise nmakehlp is not found on install
cd tcl-8.6.1.0\win
nmake -f makefile.vc OPTS=symbols INSTALLDIR=..\..\tcltk clean core shell dlls
nmake -f makefile.vc OPTS=symbols INSTALLDIR=..\..\tcltk install-binaries install-libraries
cd ..\..
)
if not exist tcltk\bin\tk86tg.dll (
cd tk-8.6.1.0\win
nmake -f makefile.vc OPTS=symbols INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.6.1.0 clean
nmake -f makefile.vc OPTS=symbols INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.6.1.0 all
nmake -f makefile.vc OPTS=symbols INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.6.1.0 install-binaries install-libraries
cd ..\..
)
if not exist tcltk\lib\tix8.4.3\tix84g.dll (
cd tix-8.4.3.4\win
nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.6.1.0 TK_DIR=..\..\tk-8.6.1.0 INSTALL_DIR=..\..\tcltk clean
nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.6.1.0 TK_DIR=..\..\tk-8.6.1.0 INSTALL_DIR=..\..\tcltk all
nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.6.1.0 TK_DIR=..\..\tk-8.6.1.0 INSTALL_DIR=..\..\tcltk install
cd ..\..
)
@echo Please use PCbuild\get_externals.bat instead.
@"%~dp0..\..\PCbuild\get_externals.bat" %*

View file

@ -1,3 +1,2 @@
@rem Used by the buildbot "test" step.
cd PCbuild
call rt.bat -d -q -x64 -uall -rwW -n --timeout=3600 %1 %2 %3 %4 %5 %6 %7 %8 %9
call "%~dp0test.bat" -x64 %*

View file

@ -1,3 +1,15 @@
@rem Used by the buildbot "test" step.
cd PCbuild
call rt.bat -d -q -uall -rwW -n --timeout=3600 %1 %2 %3 %4 %5 %6 %7 %8 %9
@setlocal
@set here=%~dp0
@set rt_opts=-q -d
:CheckOpts
@if '%1'=='-x64' (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts
@if '%1'=='-d' (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts
@if '%1'=='-O' (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts
@if '%1'=='-q' (set rt_opts=%rt_opts% %1) & shift & goto CheckOpts
@if '%1'=='+d' (set rt_opts=%rt_opts:-d=%) & shift & goto CheckOpts
@if '%1'=='+q' (set rt_opts=%rt_opts:-q=%) & shift & goto CheckOpts
call "%here%..\..\PCbuild\rt.bat" %rt_opts% -uall -rwW -n --timeout=3600 %1 %2 %3 %4 %5 %6 %7 %8 %9