Windows build script and setup.py for Anaconda (install needs testing).

This commit is contained in:
Matthias Köfferlein 2018-09-13 01:11:18 +02:00
parent 06c0b8f6e1
commit f7664c09d5
3 changed files with 327 additions and 17 deletions

View File

@ -9,9 +9,20 @@ For more details see http://www.klayout.org.
## Building requirements
Building on Linux:
* Qt 4.7 or later (4.6 with some restrictions) or Qt 5
* gcc 4.6 or later or clang 3.8 or later
Building on Windows with MSYS2:
* MSYS2 with gcc, Qt4 or 5, zlib, ruby and python packages installed
Building on Windows with MSVC 2017:
* MSVC 2017
* Build requisites from klayout-kit
For more build instructions see http://www.klayout.de/build.html.
## Build options
@ -25,16 +36,16 @@ For more build instructions see http://www.klayout.de/build.html.
### Plain building for Qt4
./build.sh
./build.sh
### Plain building for Qt5
./build.sh -qt5
./build.sh -qt5
### Building without Qt binding
./build.sh -without-qtbinding
### Debug build
./build.sh -debug
@ -63,8 +74,8 @@ For more build instructions see http://www.klayout.de/build.html.
### Pass make options
./build.sh -j4
./build.sh -j4
(for running 4 jobs in parallel)
### More options
@ -80,9 +91,54 @@ Go to the build directory (i.e. "bin-release") and enter
export TESTTMP=testtmp # path to a directory that will hold temporary data (will be created)
export TESTSRC=.. # path to the source directory
./ut_runner
For more options use
./ut_runner -h
## Build instructions (Windows, MSYS2)
From the MSYS2 MinGW bash (32 bit or 64 bit) use the same commands as for Linux to build the
binaries.
## Build instructions (Windows, MSVC 2017)
The combination supported and tested was Qt 5.11/MSVC 2017 64bit.
It's sufficient to install the build tools from MSVC's community edition.
A build script similar to build.sh is provided for Windows
(build.bat).
For details about this build script use
```
build.bat -h
```
For MSVC builds a number of third party libraries are required:
* Ruby
* Python
* zlib
* expat
* curl
* pthread-win
The "klayout-bits4msvc2017" project (https://github.com/klayoutmatthias/klayout_bits4msvc2017) targets towards providing a binary distribution for this purpose.
See the release notes there for download links. Download the .zip archive from there and unpack it to some folder, e.g. "c:\klayout-bits".
The build script needs the path to this package. "qmake" and (for obtaining the build version) "git" should be in the path. If qmake is not in the path, you can use "build.bat -qmake ..." to specify qmake's path.
Here is an example for the build.bat call:
```
build.bat -bits c:\klayout-bits
```
The 3rd party bits kit can also be used to build the Python
standalone package on setuptools. Specify the full path to the 3rd party package up to the compiler and architecture. On 64bit with the bits package installed in "c:\klayout-bits" the build call is this:
```
set KLAYOUT_BITS=c:\klayout-bits\msvc2017\x64
python setup.py build
```

255
build.bat Normal file
View File

@ -0,0 +1,255 @@
@echo off
setlocal EnableDelayedExpansion
rem ----------------------------------------------------------
rem KLAYOUT build script
rem See build.bat -h for details
rem
rem ----------------------------------------------------------
rem parse command lines
set CONFIG=release
set HAVE_QTBINDINGS=1
set HAVE_QT=1
set HAVE_64BIT_COORD=0
set HAVE_PYTHON=1
set HAVE_RUBY=1
set MAKE_OPT=
set arch=x64
set compiler=msvc2017
set dry_run=0
set option-qmake=qmake
set "option-bits=c:\klayout-bits"
set "option-build=%TEMP%\klayout-build"
set "option-bin=%TEMP%\klayout-bin"
set "option="
for %%a in (%*) do (
if not defined option (
set arg=%%a
if "!arg:~0,1!" equ "-" (
if "!arg!" equ "-h" (
set "option-h=1"
set "option="
) else if "!arg!" equ "--help" (
set "option-h=1"
set "option="
) else if "!arg!" equ "-help" (
set "option-h=1"
set "option="
) else if "!arg!" equ "-bits" (
set "option=!arg!"
) else if "!arg!" equ "-qmake" (
set "option=!arg!"
) else if "!arg!" equ "-build" (
set "option=!arg!"
) else if "!arg!" equ "-bin" (
set "option-bin=%TEMP%\klayout-bin"
set "option=!arg!"
) else if "!arg!" equ "-prefix" (
set "option-bin=%TEMP%\klayout-bin"
set "option=!arg!"
) else if "!arg!" equ "-build" (
set "option=!arg!"
) else if "!arg!" equ "-debug" (
set "CONFIG=debug"
) else if "!arg!" equ "-release" (
set "CONFIG=release"
) else if "!arg!" equ "-with-qtbinding" (
set "HAVE_QTBINDINGS=1"
) else if "!arg!" equ "-without-qtbinding" (
set "HAVE_QTBINDINGS=0"
) else if "!arg!" equ "-without-qt" (
set "HAVE_QT=0"
) else if "!arg!" equ "-with-64bit-coord" (
set "HAVE_64BIT_COORD=1"
) else if "!arg!" equ "-without-64bit-coord" (
set "HAVE_64BIT_COORD=0"
) else if "!arg!" equ "-nopython" (
set "HAVE_PYTHON=0"
) else if "!arg!" equ "-noruby" (
set "HAVE_RUBY=0"
) else if "!arg!" equ "-dry-run" (
set "dry_run=1"
) else if "!arg!" equ "-x64" (
set "arch=x64"
) else if "!arg!" equ "-x86" (
set "arch=x86"
)
) else (
set "MAKE_OPT=!MAKE_OPT! !arg!"
)
) else (
set "option!option!=%%a"
set "option="
)
)
if defined option-h (
echo build.bat - KLayout build script
echo.
echo Mandatory options:
echo -bits [path] Path to the 3rd party binary kit
echo -build [path] Path to the build directory
echo -bin [path] Path to the installation directory
echo -prefix [path] Same as -bin
echo -x86 32 bit build
echo -x64 64 bit build [default]
echo.
echo Other options:
echo -h -help --help Show this help
echo -qmake [path] Path to the qmake binary
echo -debug Perform a debug build
echo -release Perform a release build [the default]
echo -with-qtbinding Enable Qt support for Ruby/Python [the default]
echo -without-qtbinding Disable Qt support for Ruby/Python
echo -without-qt Entirely Qt-free build of a tool subset
echo -with-64bit-coord Enable 64bit coordinate support [experimental]
echo -without-64bit-coord Disable 64bit coordinate support [default]
echo -nopython Dont include Python support
echo -noruby Dont include Ruby support
echo -dry-run Dont actually make
goto :eof
)
echo Analysing installation ...
echo.
rem ----------------------------------------------------------
rem locate MSVC 2017 on the system
set MSVC2017_COMPILER_INST=notfound
rem VS 2017 sets exactly one install as the "main" install, so we may find MSBuild in there.
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v 15.0 /reg:32 >nul 2>nul
if NOT ERRORLEVEL 1 (
for /F "tokens=1,2*" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v 15.0 /reg:32') DO (
if "%%i"=="15.0" (
if exist "%%k\VC\Auxiliary\Build" (
set "MSVC2017_COMPILER_INST=%%k\VC\Auxiliary\Build"
set "msg=Found MSVC installation at !MSVC2017_COMPILER_INST!"
echo !msg!
)
)
)
)
if "%MSVC2017_COMPILER_INST%" == "notfound" (
echo ERROR: Unable to find MSVC 2017 installation
goto :eof
)
if %arch% equ x64 (
call "%MSVC2017_COMPILER_INST%\vcvars64"
) else (
call "%MSVC2017_COMPILER_INST%\vcvars32"
)
rem ----------------------------------------------------------
rem check the kit
if not exist "%option-bits%"\%compiler%\%arch% (
echo ERROR: no 3rd party binary kit found in %option-bits%\%compiler%\%arch%
goto :eof
)
if not exist "%option-bits%\%compiler%\%arch%\ruby\bin\ruby.exe" (
echo ERROR: %option-bits% not installed properly or
echo path does not point to architecture folder.
echo Use -bits to specfiy the path to the 3rd party binary kit.
goto :eof
)
echo Using bits from %option-bits%\%compiler%\%arch%
rem ----------------------------------------------------------
rem check the qmake binary
"%option-qmake%" -v >nul 2>nul
if ERRORLEVEL 1 (
echo ERROR: Not a valid qmake: %option-qmake%
echo Use -qmake option to specify the path to the qmake binary.
goto :eof
)
echo Using qmake from %option-qmake%
rem ----------------------------------------------------------
rem read klayout Version
for /F "tokens=1" %%i in ('type version.sh') do (
set line=%%i
if "!line:~0,16!" equ "KLAYOUT_VERSION=" (
set "version=!line:~16,100!"
set "KLAYOUT_VERSION=!version:"=!"
)
)
date /t >%TEMP%\klayout-build-tmp.txt
set /P KLAYOUT_VERSION_DATE=<%TEMP%\klayout-build-tmp.txt
del %TEMP%\klayout-build-tmp.txt
rem The short SHA hash of the commit
git rev-parse --short HEAD 2>nul >%TEMP%\klayout-build-tmp.txt
set /P KLAYOUT_VERSION_REV=<%TEMP%\klayout-build-tmp.txt
if ERRORLEVEL 1 (
set "KLAYOUT_VERSION_REV=LatestSourcePackage"
)
del %TEMP%\klayout-build-tmp.txt
rem ----------------------------------------------------------
rem dump settings
echo.
echo Architecture: %arch%
echo Compiler: %compiler%
echo.
echo CONFIG: %CONFIG%
echo KLAYOUT_VERSION: %KLAYOUT_VERSION%
echo KLAYOUT_VERSION_DATE: %KLAYOUT_VERSION_DATE%
echo KLAYOUT_VERSION_REV: %KLAYOUT_VERSION_REV%
echo HAVE_QTBINDINGS: %HAVE_QTBINDINGS%
echo HAVE_QT: %HAVE_QT%
echo HAVE_64BIT_COORD: %HAVE_64BIT_COORD%
echo HAVE_PYTHON: %HAVE_PYTHON%
echo HAVE_RUBY: %HAVE_RUBY%
echo MAKE_OPT: %MAKE_OPT%
echo.
echo qmake binary: %option-qmake%
echo Build directory: %option-build%
echo Installation directory: %option-bin%
if %dry_run% equ 1 (
echo.
echo Dry run ... stopping now.
goto :eof
)
rem ----------------------------------------------------------
rem Run qmake
set "inst_path=%~dp0"
mkdir "%option-build%" 2>nul
cd "%option-build%"
if not exist "%option-build%" (
echo ERROR: build directory does not exists and cannot be created
goto :eof
)
echo on
"%option-qmake%" ^
HAVE_QT5=1 ^
-recursive ^
-spec win32-msvc ^
"CONFIG+=%CONFIG%" ^
"KLAYOUT_VERSION=%KLAYOUT_VERSION%" ^
"KLAYOUT_VERSION_DATE=%KLAYOUT_VERSION_DATE%" ^
"KLAYOUT_VERSION_REV=%KLAYOUT_VERSION_REV%" ^
"HAVE_QTBINDINGS=%HAVE_QTBINDINGS%" ^
"HAVE_QT=%HAVE_QT%" ^
"HAVE_RUBY=%HAVE_RUBY%" ^
"HAVE_PYTHON=%HAVE_PYTHON%" ^
"HAVE_64BIT_COORD=%HAVE_64BIT_COORD%" ^
"PREFIX=%option-bin%" ^
"BITS_PATH=%option-bits%\%compiler%\%arch%" ^
%inst_path%\src\klayout.pro ^
&& nmake %MAKE_OPT% ^
&& nmake install

View File

@ -344,12 +344,11 @@ rdb = Extension(config.root + '.rdb',
# Core setup function
if __name__ == '__main__':
print("Number of cores", N_cores)
setup(name=config.root,
version=config.version(),
description='KLayout standalone Python package',
author='Matthias Koefferlein',
author_email='matthias@klayout.de',
packages=[config.root],
package_dir={config.root: 'src/pymod/distutils_src'},
ext_modules=[_tl, _gsi, _pya, _db, _rdb] + db_plugins + [tl, db, rdb])
setup(name = config.root,
version = config.version(),
description = 'KLayout standalone Python package',
author = 'Matthias Koefferlein',
author_email = 'matthias@klayout.de',
packages = [config.root],
package_dir = {config.root: 'src/pymod/distutils_src'},
ext_modules = [_tl, _gsi, _pya, _db, _rdb] + db_plugins + [tl, db, rdb])