diff --git a/README.md b/README.md index 32bcfbc1c..8873c3dce 100644 --- a/README.md +++ b/README.md @@ -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 +``` diff --git a/build.bat b/build.bat new file mode 100644 index 000000000..bdee5a50a --- /dev/null +++ b/build.bat @@ -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 diff --git a/setup.py b/setup.py index 122bfda60..f817cf5b0 100644 --- a/setup.py +++ b/setup.py @@ -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])