From a81bca43a6fc3c159420fc65b2cba7a059a8264e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 18 Aug 2022 20:22:02 +0200 Subject: [PATCH 1/2] Added cmath include as suggested for Slackware --- src/db/db/dbPolygon.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/db/db/dbPolygon.h b/src/db/db/dbPolygon.h index 1b59dfc5f..3d7657ba2 100644 --- a/src/db/db/dbPolygon.h +++ b/src/db/db/dbPolygon.h @@ -41,6 +41,7 @@ #include "tlAssert.h" #include +#include #include #include #include From c48c90faa87d28aef7ba204b4ec16e2ed4ed6d4c Mon Sep 17 00:00:00 2001 From: Kazunari Sekigawa Date: Thu, 1 Sep 2022 06:54:26 +0900 Subject: [PATCH 2/2] macOS LW*.dmg packages using Ruby 3.1 (#1141) * Updated the build system for Mac to change the Ruby version from 2.[5|7] to 3.1since Anaconda3 upgraded the Ruby package. * Apply a workaround patch to ./src/klayout.pri to work with Ruby 3.x. --- macbuild/ReadMe.md | 153 +++++++------- macbuild/Resources/script-bundle-A.zip | Bin 4441255 -> 4441365 bytes macbuild/Resources/script-bundle-B.zip | Bin 4442749 -> 4443221 bytes macbuild/Resources/script-bundle-P.zip | Bin 4465202 -> 4465671 bytes macbuild/build4mac.py | 263 +++++++++++++++++-------- macbuild/build4mac_env.py | 38 ++-- macbuild/makeDMG4mac.py | 40 ++-- macbuild/nightlyBuild.py | 20 +- 8 files changed, 295 insertions(+), 219 deletions(-) diff --git a/macbuild/ReadMe.md b/macbuild/ReadMe.md index adaec1b65..361aa08ca 100644 --- a/macbuild/ReadMe.md +++ b/macbuild/ReadMe.md @@ -1,9 +1,9 @@ -Relevant KLayout version: 0.27.9
+Relevant KLayout version: 0.27.10
Author: Kazzz-S
-Last modified: 2022-05-08
+Last modified: 2022-07-28
# 1. Introduction -This directory **`macbuild`** contains different files required for building KLayout (http://www.klayout.de/) version 0.27.9 or later for different 64-bit macOS, including: +This directory **`macbuild`** contains different files required for building KLayout (http://www.klayout.de/) version 0.27.10 or later for different 64-bit macOS, including: * Catalina (10.15.7) : the primary development environment * Big Sur (11.x) : experimental; Apple M1 chip is not tested since the author does not own an M1 Mac * Monterey (12.x) : -- ditto -- @@ -18,26 +18,15 @@ However, they are not actively supported, and DMG packages for them are not prov Throughout this document, the primary target machine is **Intel x86_64** with **macOS Catalina**.
A **((Notes))** marker indicates special notes for specific operating systems. -# 2. Qt6/Qt5 Frameworks -By default, the Qt framework is "Qt6" from Homebrew (https://brew.sh/), which is usually located under: -``` -/usr/local/opt/qt@6/ -``` - -"Qt5" is usually located under: -``` -/usr/local/opt/qt@5/ -``` - -Alternatively, you can use "Qt6" from MacPorts (https://www.macports.org/), which is usually located under: -``` -/opt/local/libexec/qt6/ -``` -**((Notes))** As of 2021-11-27, MacPorts' Qt6 does not provide `qt6-qtmultimedia`, which causes a build error!!! - -"Qt5" is usually located under: +# 2. Qt5 Frameworks +By default, the Qt framework is "Qt5" from MacPorts (https://www.macports.org/), which is usually located under: ``` /opt/local/libexec/qt5/ +``` + +Alternatively, you can use "Qt5" from Homebrew (https://brew.sh/), which is usually located under: +``` +/usr/local/opt/qt@5/ ``` OR @@ -51,6 +40,7 @@ If you have installed Anaconda3 under $HOME/opt/anaconda3/, make a symbolic link ``` /Applications/anaconda3/ ---> $HOME/opt/anaconda3/ ``` +**((Notes))** "Qt5" from Homebrew is chosen as the default for **Big Sur** and **Monterey**. # 3. Script language support: Ruby and Python Earlier, by default, supported script languages, i.e., Ruby and Python, were those standard ones bundled with the OS.
@@ -68,14 +58,14 @@ However, the latest Xcode 13.1 does not allow us to link the legacy Python 2.7 l Moreover, Monterey (12.3.1) finally eliminated the Python 2.7 binaries.
Therefore, Homebrew is adopted as the default environment for Big Sur and Monterey. -The build script **`build4mac.py`** provides several possible combinations of Qt[6|5], Ruy, and Python modules to accommodate such a slightly complex environment.
+The build script **`build4mac.py`** provides several possible combinations of Qt5, Ruy, and Python modules to accommodate such a slightly complex environment.
Some typical use cases are described in Section 6. # 4. Prerequisites You need to have: * the latest Xcode and command-line tool kit compliant with each OS -* Qt[6|5] package from Homebrew or MacPorts; Qt5 from Anaconda3 -* optionally Ruby and Python packages from Homebrew, MacPorts, or Anaconda3 +* Qt5 package from MacPorts, Homebrew, or Anaconda3 +* optionally Ruby and Python packages from MacPorts, Homebrew, or Anaconda3 #### For matching versions of Ruby and Python, please also refer to `build4mac_env.py`. # 5. Command-line options of **`build4mac.py`** are as shown below. @@ -83,32 +73,28 @@ You need to have: ``` --------------------------------------------------------------------------------------------------------- << Usage of 'build4mac.py' >> - for building KLayout 0.27.9 or later on different Apple macOS / Mac OSX platforms. + for building KLayout 0.27.10 or later on different Apple macOS / Mac OSX platforms. $ [python] ./build4mac.py option & argument : descriptions (refer to 'macbuild/build4mac_env.py' for details)| default value --------------------------------------------------------------------------------------+--------------- - [-q|--qt ] : case-insensitive type=['Qt6MacPorts', 'Qt6Brew', | qt6brew - : 'Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3'] | - : Qt6MacPorts: use Qt6 from MacPorts | - : Qt6Brew: use Qt6 from Homebrew | + [-q|--qt ] : case-insensitive type=['Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3'] | qt5macports : Qt5MacPorts: use Qt5 from MacPorts | : Qt5Brew: use Qt5 from Homebrew | : Qt5Ana3: use Qt5 from Anaconda3 | - [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP27', 'HB27', 'Ana3'] | sys + [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP31', 'HB31', 'Ana3'] | sys : nil: don't bind Ruby | : Sys: use OS-bundled Ruby [2.0 - 2.6] depending on OS | - : MP27: use Ruby 2.7 from MacPorts | - : HB27: use Ruby 2.7 from Homebrew | - : Ana3: use Ruby 2.5 from Anaconda3 | + : MP31: use Ruby 3.1 from MacPorts | + : HB31: use Ruby 3.1 from Homebrew | + : Ana3: use Ruby 3.1 from Anaconda3 | [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP38', 'HB38', 'Ana3', | sys - : 'HB39', HBAuto'] | + : 'HBAuto'] | : nil: don't bind Python | : Sys: use OS-bundled Python 2.7 [ElCapitan -- Catalina] | : MP38: use Python 3.8 from MacPorts | : HB38: use Python 3.8 from Homebrew | : Ana3: use Python 3.8 from Anaconda3 | - : HB39: use Python 3.9 from Homebrew | : HBAuto: use the latest Python 3.x auto-detected from Homebrew | [-P|--buildPymod] : build and deploy Pymod (*.whl and *.egg) for LW-*.dmg | disabled [-n|--noqtbinding] : don't create Qt bindings for ruby scripts | disabled @@ -135,32 +121,28 @@ $ [python] ./build4mac.py ``` --------------------------------------------------------------------------------------------------------- << Usage of 'build4mac.py' >> - for building KLayout 0.27.9 or later on different Apple macOS / Mac OSX platforms. + for building KLayout 0.27.10 or later on different Apple macOS / Mac OSX platforms. $ [python] ./build4mac.py option & argument : descriptions (refer to 'macbuild/build4mac_env.py' for details)| default value --------------------------------------------------------------------------------------+--------------- - [-q|--qt ] : case-insensitive type=['Qt6MacPorts', 'Qt6Brew', | qt6brew - : 'Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3'] | - : Qt6MacPorts: use Qt6 from MacPorts | - : Qt6Brew: use Qt6 from Homebrew | + [-q|--qt ] : case-insensitive type=['Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3'] | qt5brew : Qt5MacPorts: use Qt5 from MacPorts | : Qt5Brew: use Qt5 from Homebrew | : Qt5Ana3: use Qt5 from Anaconda3 | - [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP27', 'HB27', 'Ana3'] | hb27 + [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP31', 'HB31', 'Ana3'] | hb31 : nil: don't bind Ruby | : Sys: use OS-bundled Ruby [2.0 - 2.6] depending on OS | - : MP27: use Ruby 2.7 from MacPorts | - : HB27: use Ruby 2.7 from Homebrew | - : Ana3: use Ruby 2.5 from Anaconda3 | + : MP31: use Ruby 3.1 from MacPorts | + : HB31: use Ruby 3.1 from Homebrew | + : Ana3: use Ruby 3.1 from Anaconda3 | [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP38', 'HB38', 'Ana3', | hb38 - : 'HB39', HBAuto'] | + : 'HBAuto'] | : nil: don't bind Python | : Sys: use OS-bundled Python 2.7 [ElCapitan -- Catalina] | : MP38: use Python 3.8 from MacPorts | : HB38: use Python 3.8 from Homebrew | : Ana3: use Python 3.8 from Anaconda3 | - : HB39: use Python 3.9 from Homebrew | : HBAuto: use the latest Python 3.x auto-detected from Homebrew | [-P|--buildPymod] : build and deploy Pymod (*.whl and *.egg) for LW-*.dmg | disabled [-n|--noqtbinding] : don't create Qt bindings for ruby scripts | disabled @@ -188,9 +170,11 @@ In this section, the actual file names and directory names are those obtained on On different OS, those names differ accordingly. ### 6A. Standard build using the OS-bundled Ruby and Python -0. Install Homebrew, then install Qt6 by +0. Install MacPorts, then install Qt5 by ``` -$ brew install qt6 +$ sudo port install coreutils +$ sudo port install findutils +$ sudo port install qt5 ``` 1. Invoke **`build4mac.py`** with the default options: **((Notes))** only for Catalina ``` @@ -204,33 +188,32 @@ $ ./build4mac.py $ ./build4mac.py -y ``` The application bundle **`klayout.app`** is located under:
- **`ST-qt6Brew.pkg.macos-Catalina-release-RsysPsys`** directory, where the three name parts below are important. + **`ST-qt5MP.pkg.macos-Catalina-release-RsysPsys`** directory, where the three name parts below are important. * "ST-" means that this is a standard package (LW-, HW-, and EX- are other possibilities explained below). -* "qt6Brew" means that Qt6 from Homebrew is used. +* "qt5MP" means that Qt5 from MacPorts is used. * "RsysPsys" means that Ruby is OS-bundled; Python is OS-bundled. 4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation. -If you use the "-Y" option instead of the "-y" in Step-3, the Qt6 framework is NOT deployed in the application bundle.
-Then the directory name will be **`LW-qt6Brew.pkg.macos-Catalina-release-RsysPsys`**, where +If you use the "-Y" option instead of the "-y" in Step-3, the Qt5 framework is NOT deployed in the application bundle.
+Then the directory name will be **`LW-qt5MP.pkg.macos-Catalina-release-RsysPsys`**, where * "LW-" means that this is a lightweight package. #### If you build KLayout from the source code AND run it on the same machine, the "-Y" option is highly recommended. -### 6B. Fully MacPorts-flavored build with MacPorts Ruby 2.7 and MacPorts Python 3.8 -0. Install MacPorts, then install Qt6, Ruby 2.7, and Python 3.8 by +### 6B. Fully MacPorts-flavored build with MacPorts Ruby 3.1 and MacPorts Python 3.8 +0. Install MacPorts, then install Qt5, Ruby 3.1, and Python 3.8 by ``` $ sudo port install coreutils $ sudo port install findutils -$ sudo port install qt6 -$ sudo port install qt6-qttools -$ sudo port install ruby27 +$ sudo port install qt5 +$ sudo port install ruby31 $ sudo port install python38 $ sudo port install py38-pip ``` 1. Invoke **`build4mac.py`** with the following options: ``` $ cd /where/'build.sh'/exists -$ ./build4mac.py -q qt6macports -r mp27 -p mp38 +$ ./build4mac.py -q qt5macports -r mp31 -p mp38 ``` 2. Confirm successful build (it will take about one hour depending on your machine spec). 3. Run **`build4mac.py`** again with the same options used in 1. PLUS "-Y" to deploy executables and libraries under **`klayout.app`** bundle.
@@ -238,26 +221,26 @@ $ ./build4mac.py -q qt6macports -r mp27 -p mp38 If you use `--buildPymod` option in Step-1 and Step-3, the KLayout Python Module (\*.whl, \*.egg) will be built and deployed under **klayout.app/Contents/pymod-dist/**. ``` -$ ./build4mac.py -q qt6macports -r mp27 -p mp38 -Y +$ ./build4mac.py -q qt5macports -r mp31 -p mp38 -Y ``` The application bundle **`klayout.app`** is located under:
- **`LW-qt6MP.pkg.macos-Catalina-release-Rmp27Pmp38`** directory, where + **`LW-qt5MP.pkg.macos-Catalina-release-Rmp31Pmp38`** directory, where * "LW-" means that this is a lightweight package. -* "qt6MP" means that Qt6 from MacPorts is used. -* "Rmp27Pmp38" means that Ruby is 2.7 from MacPorts; Python is 3.8 from MacPorts. +* "qt5MP" means that Qt5 from MacPorts is used. +* "Rmp31Pmp38" means that Ruby is 3.1 from MacPorts; Python is 3.8 from MacPorts. 4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation. -### 6C. Fully Homebrew-flavored build with Homebrew Ruby 2.7 and Homebrew Python 3.8 -0. Install Homebrew, then install Qt6, Ruby 2.7, and Python 3.8 by +### 6C. Fully Homebrew-flavored build with Homebrew Ruby 3.1 and Homebrew Python 3.8 +0. Install Homebrew, then install Qt5, Ruby 3.1, and Python 3.8 by ``` -$ brew install qt6 -$ brew install ruby@2.7 +$ brew install qt@5 +$ brew install ruby@3.1 $ brew install python@3.8 ``` 1. Invoke **`build4mac.py`** with the following options: **((Notes))** These options are the default for Big Sur and Monterey. ``` $ cd /where/'build.sh'/exists -$ ./build4mac.py -q qt6brew -r hb27 -p hb38 +$ ./build4mac.py -q qt5brew -r hb31 -p hb38 ``` 2. Confirm successful build (it will take about one hour depending on your machine spec). 3. Run **`build4mac.py`** again with the same options used in 1. PLUS "-Y" to deploy executables and libraries under **`klayout.app`** bundle.
@@ -265,45 +248,45 @@ $ ./build4mac.py -q qt6brew -r hb27 -p hb38 If you use `--buildPymod` option in Step-1 and Step-3, the KLayout Python Module (\*.whl, \*.egg) will be built and deployed under **klayout.app/Contents/pymod-dist/**. ``` -$ ./build4mac.py -q qt6brew -r hb27 -p hb38 -Y +$ ./build4mac.py -q qt5brew -r hb31 -p hb38 -Y ``` The application bundle **`klayout.app`** is located under:
- **`LW-qt6Brew.pkg.macos-Catalina-release-Rhb27Phb38`** directory, where + **`LW-qt5Brew.pkg.macos-Catalina-release-Rhb31Phb38`** directory, where * "LW-" means that this is a lightweight package. -* "qt6Brew" means that Qt6 from Homebrew is used. -* "Rhb27Phb38" means that Ruby is 2.7 from Homebrew; Python is 3.8 from Homebrew. +* "qt5Brew" means that Qt5 from Homebrew is used. +* "Rhb31Phb38" means that Ruby is 3.1 from Homebrew; Python is 3.8 from Homebrew. 4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation. ### 6D. Partially Homebrew-flavored build with System Ruby and Homebrew Python 3.8 -0. Install Homebrew, then install Qt6 and Python 3.8 by +0. Install Homebrew, then install Qt5 and Python 3.8 by ``` -$ brew install qt6 +$ brew install qt@5 $ brew install python@3.8 ``` 1. Invoke **`build4mac.py`** with the following options: ``` $ cd /where/'build.sh'/exists -$ ./build4mac.py -q qt6brew -r sys -p hb38 +$ ./build4mac.py -q qt5brew -r sys -p hb38 ``` 2. Confirm successful build (it will take about one hour depending on your machine spec). 3. Run **`build4mac.py`** again with the same options used in 1. PLUS "-y" to deploy executables and libraries (including Qt's framework and Python framework) under **`klayout.app`** bundle.
The buddy command-line tools (strm*) will also be deployed under **klayout.app/Contents/Buddy/** in this step. ``` -$ ./build4mac.py -q qt6brew -r sys -p hb38 -y +$ ./build4mac.py -q qt5brew -r sys -p hb38 -y ``` The application bundle **`klayout.app`** is located under:
- **`HW-qt6Brew.pkg.macos-Catalina-release-RsysPhb38`** directory, where -* "HW-" means that this is a heavyweight package because both Qt6 and Python Frameworks are deployed. -* "qt6Brew" means that Qt6 from Homebrew is used. + **`HW-qt5Brew.pkg.macos-Catalina-release-RsysPhb38`** directory, where +* "HW-" means that this is a heavyweight package because both Qt5 and Python Frameworks are deployed. +* "qt5Brew" means that Qt5 from Homebrew is used. * "RsysPhb38" means that Ruby is OS-bundled; Python is 3.8 from Homebrew. 4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation. ### Important So far, the deployment of Homebrew Ruby is not supported.
Therefore, if you intend to use the "-y" option for deployment, you need to use the "-r sys" option for building. -### 6E. Fully Anaconda3-flavored build with Anaconda3 Ruby 2.5 and Anaconda3 Python 3.8 -0. Install Anaconda3, then install Ruby 2.5 by +### 6E. Fully Anaconda3-flavored build with Anaconda3 Ruby 3.1 and Anaconda3 Python 3.8 +0. Install Anaconda3, then install Ruby 3.1 by ``` $ conda install ruby ``` @@ -324,7 +307,7 @@ $ ./build4mac.py -q qt5ana3 -r ana3 -p ana3 -Y **`LW-qt5Ana3.pkg.macos-Catalina-release-Rana3Pana3`** directory, where * "LW-" means that this is a lightweight package. * "qt5Ana3" means that Qt5 from Anaconda3 is used. -* "Rana3Pana3" means that Ruby (2.5) is from Anaconda3; Python (3.8) is from Anaconda3. +* "Rana3Pana3" means that Ruby (3.1) is from Anaconda3; Python (3.8) is from Anaconda3. 4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation. 5. You may have to set `PYTHONHOME` environment variable like: ``` @@ -348,14 +331,14 @@ makeDMG4mac.py -> macbuild/makeDMG4mac.py 2. Invoke **`makeDMG4mac.py`** with -p and -m options, for example, ``` $ cd /where/'build.sh'/exists -$ ./makeDMG4mac.py -p ST-qt6Brew.pkg.macos-Catalina-release-RsysPsys -m +$ ./makeDMG4mac.py -p ST-qt5MP.pkg.macos-Catalina-release-RsysPsys -m ``` This command will generate the two files below:
-* **`ST-klayout-0.27.9-macOS-Catalina-1-qt5MP-RsysPsys.dmg`** ---(1) the main DMG file -* **`ST-klayout-0.27.9-macOS-Catalina-1-qt5MP-RsysPsys.dmg.md5`** ---(2) MD5-value text file +* **`ST-klayout-0.27.10-macOS-Catalina-1-qt5MP-RsysPsys.dmg`** ---(1) the main DMG file +* **`ST-klayout-0.27.10-macOS-Catalina-1-qt5MP-RsysPsys.dmg.md5`** ---(2) MD5-value text file # Known issues -Because we assume some specific versions of non-OS-standard Ruby and Python, updating Homebrew, MacPorts, or Anaconda3 may cause build- and link errors.
+Because we assume some specific versions of non-OS-standard Ruby and Python, updating MacPorts, Homebrew, or Anaconda3 may cause build- and link errors.
In such cases, you need to update the dictionary contents of **`build4mac_env.py`**. # Final comments diff --git a/macbuild/Resources/script-bundle-A.zip b/macbuild/Resources/script-bundle-A.zip index 53bbbe84bf6a789612add9bde4b617a4fb5b6cf8..b629f8daa804d3485615c8e4184574ad7b3ae6dd 100644 GIT binary patch delta 6718 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 delta 6632 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 Udg5!E2l(XeM4_&xV8MU?2an}}%>V!Z delta 10424 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 diff --git a/macbuild/Resources/script-bundle-P.zip b/macbuild/Resources/script-bundle-P.zip index e9aef5d08b994641782918480f6e4ee1126aca65..a824e5e8d9a62a3808e9512be924d8392b1a7ad8 100644 GIT binary patch delta 8152 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 diff --git a/macbuild/build4mac.py b/macbuild/build4mac.py index 66aca6e56..3ac8a9b60 100755 --- a/macbuild/build4mac.py +++ b/macbuild/build4mac.py @@ -10,6 +10,7 @@ from __future__ import print_function # to use print() of Python 3 in Python >= 2.7 import sys import os +import codecs import shutil import glob import platform @@ -34,45 +35,41 @@ from build4mac_util import * #------------------------------------------------------------------------------- def GenerateUsage(platform): if platform.upper() in [ "MONTEREY", "BIGSUR" ]: # with Xcode [13.1 .. ] - myQt65 = "qt6brew" - myRuby = "hb27" + myQt5 = "qt5brew" + myRuby = "hb31" myPython = "hb38" - moduleset = ('qt6Brew', 'HB27', 'HB38') + moduleset = ('qt5Brew', 'HB31', 'HB38') else: # with Xcode [ .. 12.4] - myQt65 = "qt6brew" + myQt5 = "qt5macports" myRuby = "sys" myPython = "sys" - moduleset = ('qt6Brew', 'Sys', 'Sys') + moduleset = ('qt5MP', 'Sys', 'Sys') usage = "\n" usage += "---------------------------------------------------------------------------------------------------------\n" usage += "<< Usage of 'build4mac.py' >>\n" - usage += " for building KLayout 0.27.9 or later on different Apple macOS / Mac OSX platforms.\n" + usage += " for building KLayout 0.27.10 or later on different Apple macOS / Mac OSX platforms.\n" usage += "\n" usage += "$ [python] ./build4mac.py\n" usage += " option & argument : descriptions (refer to 'macbuild/build4mac_env.py' for details)| default value\n" usage += " --------------------------------------------------------------------------------------+---------------\n" - usage += " [-q|--qt ] : case-insensitive type=['Qt6MacPorts', 'Qt6Brew', | %s \n" % myQt65 - usage += " : 'Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3'] | \n" - usage += " : Qt6MacPorts: use Qt6 from MacPorts | \n" - usage += " : Qt6Brew: use Qt6 from Homebrew | \n" + usage += " [-q|--qt ] : case-insensitive type=['Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3'] | %s \n" % myQt5 usage += " : Qt5MacPorts: use Qt5 from MacPorts | \n" usage += " : Qt5Brew: use Qt5 from Homebrew | \n" usage += " : Qt5Ana3: use Qt5 from Anaconda3 | \n" - usage += " [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP27', 'HB27', 'Ana3'] | %s \n" % myRuby + usage += " [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP31', 'HB31', 'Ana3'] | %s \n" % myRuby usage += " : nil: don't bind Ruby | \n" usage += " : Sys: use OS-bundled Ruby [2.0 - 2.6] depending on OS | \n" - usage += " : MP27: use Ruby 2.7 from MacPorts | \n" - usage += " : HB27: use Ruby 2.7 from Homebrew | \n" - usage += " : Ana3: use Ruby 2.5 from Anaconda3 | \n" + usage += " : MP31: use Ruby 3.1 from MacPorts | \n" + usage += " : HB31: use Ruby 3.1 from Homebrew | \n" + usage += " : Ana3: use Ruby 3.1 from Anaconda3 | \n" usage += " [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP38', 'HB38', 'Ana3', | %s \n" % myPython - usage += " : 'HB39', HBAuto'] | \n" + usage += " : 'HBAuto'] | \n" usage += " : nil: don't bind Python | \n" usage += " : Sys: use OS-bundled Python 2.7 [ElCapitan -- Catalina] | \n" usage += " : MP38: use Python 3.8 from MacPorts | \n" usage += " : HB38: use Python 3.8 from Homebrew | \n" usage += " : Ana3: use Python 3.8 from Anaconda3 | \n" - usage += " : HB39: use Python 3.9 from Homebrew | \n" usage += " : HBAuto: use the latest Python 3.x auto-detected from Homebrew | \n" usage += " [-P|--buildPymod] : build and deploy Pymod (*.whl and *.egg) for LW-*.dmg | disabled\n" usage += " [-n|--noqtbinding] : don't create Qt bindings for ruby scripts | disabled\n" @@ -134,7 +131,7 @@ def Get_Default_Config(): sys.exit(1) if not Machine == "x86_64": - if Machine == "arm64" and Platform in ["Monterey", "BigSur"]: # with an Apple Silicon Chip + if Machine == "arm64" and (Platform == "Monterey" or Platform == "BigSur"): # with an Apple Silicon Chip print("") print( "### Your Mac equips an Apple Silicon Chip ###" ) print("") @@ -149,35 +146,35 @@ def Get_Default_Config(): # Set the default modules if Platform == "Monterey": - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5Brew" ModuleRuby = "RubyMonterey" ModulePython = "PythonMonterey" elif Platform == "BigSur": - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5Brew" ModuleRuby = "RubyBigSur" ModulePython = "PythonBigSur" elif Platform == "Catalina": - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5MacPorts" ModuleRuby = "RubyCatalina" ModulePython = "PythonCatalina" elif Platform == "Mojave": - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5MacPorts" ModuleRuby = "RubyMojave" ModulePython = "PythonMojave" elif Platform == "HighSierra": - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5MacPorts" ModuleRuby = "RubyHighSierra" ModulePython = "PythonHighSierra" elif Platform == "Sierra": - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5MacPorts" ModuleRuby = "RubySierra" ModulePython = "PythonSierra" elif Platform == "ElCapitan": - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5MacPorts" ModuleRuby = "RubyElCapitan" ModulePython = "PythonElCapitan" else: - ModuleQt = "Qt6Brew" + ModuleQt = "Qt5MacPorts" ModuleRuby = "nil" ModulePython = "nil" @@ -224,6 +221,123 @@ def Get_Default_Config(): config['Processor'] = Processor # - do - return config +#------------------------------------------------------------------------------ +## To apply a workaround patch to "./src/klayout.pri" to work with Ruby 3.x. +# +# @param[in] config dictionary containing the default configuration +# +# @return void +#------------------------------------------------------------------------------ +def ApplyPatch2KLayoutQtPri4Ruby3(config): + #---------------------------------------------------------------- + # [1] Check if the previous patch exists + #---------------------------------------------------------------- + priMaster = "./src/klayout.pri" + priOriginal = "./src/klayout.pri.org" + if os.path.exists(priOriginal): + shutil.copy2( priOriginal, priMaster ) + os.remove( priOriginal ) + + #---------------------------------------------------------------- + # [2] Not using Ruby? + #---------------------------------------------------------------- + ModuleRuby = config['ModuleRuby'] + if ModuleRuby == 'nil': + return; + + #---------------------------------------------------------------- + # [3] Get the Ruby version code as done in "build.sh" + #---------------------------------------------------------------- + rubyExe = RubyDictionary[ModuleRuby]['exe'] + oneline = "puts (RbConfig::CONFIG['MAJOR'] || 0).to_i*10000+(RbConfig::CONFIG['MINOR'] || 0).to_i*100+(RbConfig::CONFIG['TEENY'] || 0).to_i" + command = [ '%s' % rubyExe, '-rrbconfig', '-e', '%s' % oneline ] + verCode = subprocess.check_output( command, encoding='utf-8' ).strip() # like 3.1.2 => "30102" + verInt = int(verCode) + verMajor = verInt // 10000 + verMinor = (verInt - verMajor * 10000) // 100 + verTeeny = (verInt - verMajor * 10000) - (verMinor * 100) + # print( verMajor, verMinor, verTeeny ) + # quit() + if verMajor < 3: + return; + + #----------------------------------------------------------------------------------------------- + # [4] The two buggy Apple compilers below flag errors like: + # + # /Applications/anaconda3/include/ruby-3.1.0/ruby/internal/intern/vm.h:383:1: error: \ + # '__declspec' attributes are not enabled; use '-fdeclspec' or '-fms-extensions' to \ + # enable support for __declspec attributes RBIMPL_ATTR_NORETURN() + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Problematic in with + # Apple clang version 12.0.0 (clang-1200.0.32.29) + # Target: x86_64-apple-darwin19.6.0 + # Thread model: posix + # + # Problematic in with + # Apple clang version 13.0.0 (clang-1300.0.29.30) + # Target: x86_64-apple-darwin20.6.0 + # Thread model: posix + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Non-problematic in with + # Apple clang version 13.1.6 (clang-1316.0.21.2.5) + # Target: x86_64-apple-darwin21.6.0 + # Thread model: posix + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # Refer to https://github.com/nginx/unit/issues/653 + # https://github.com/nginx/unit/issues/653#issuecomment-1062129080 + # + # Pass "-fdeclspec" option to the QMAKE_CXXFLAGS macro via the "./src/klayout.pri" file like: + """ + # applied this patch for Mac to work with Ruby 3.x + mac { + QMAKE_CXXFLAGS += -fdeclspec + } + # applied this patch for Mac to work with Ruby 3.x + """ + #----------------------------------------------------------------------------------------------- + #---------------------------------------------------------------- + # (A) Check Platform + #---------------------------------------------------------------- + Platform = config['Platform'] + if Platform in [ "Monterey" ]: + return + elif Platform in [ "BigSur", "Catalina" ]: # take care + pass + else: + return # the results are not tested and unknown + + #---------------------------------------------------------------- + # (B) Check ./src/klayout.pri and apply the patch if necessary + #---------------------------------------------------------------- + keystring = " applied this patch for Mac to work with Ruby 3.x" + patPatch = r"(^#)([ ]*)(%s)([ ]*$)" % keystring + regPatch = re.compile(patPatch) + foundKey1 = False + foundKey2 = False + + with codecs.open( priMaster, "r", "utf-8" ) as file: + allLines = file.readlines() + file.close() + for line in allLines: + if regPatch.match( line.strip() ): + if not foundKey1: + foundKey1 = True + continue + elif not foundKey2: + foundKey2 = True + break + if foundKey1 and foundKey2: + return + + shutil.copy2( priMaster, priOriginal ) + with codecs.open( priMaster, "a", "utf-8" ) as file: + file.write( "# %s\n" % keystring ) + file.write( "mac {\n" ) + file.write( " QMAKE_CXXFLAGS += -fdeclspec\n" ) + file.write( "}\n" ) + file.write( "# %s\n" % keystring ) + return + #------------------------------------------------------------------------------ ## To parse the command line parameters # @@ -261,15 +375,15 @@ def Parse_CLI_Args(config): p = optparse.OptionParser(usage=Usage) p.add_option( '-q', '--qt', dest='type_qt', - help="Qt type=['Qt6MacPorts', 'Qt6Brew', 'Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3']" ) + help="Qt type=['Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3']" ) p.add_option( '-r', '--ruby', dest='type_ruby', - help="Ruby type=['nil', 'Sys', 'MP27', 'HB27', 'Ana3']" ) + help="Ruby type=['nil', 'Sys', 'MP31', 'HB31', 'Ana3']" ) p.add_option( '-p', '--python', dest='type_python', - help="Python type=['nil', 'Sys', 'MP38', 'HB38', 'Ana3', 'HB39', 'HBAuto']" ) + help="Python type=['nil', 'Sys', 'MP38', 'HB38', 'Ana3', 'HBAuto']" ) p.add_option( '-P', '--buildPymod', action='store_true', @@ -328,8 +442,8 @@ def Parse_CLI_Args(config): help='check usage' ) if Platform.upper() in [ "MONTEREY", "BIGSUR" ]: # with Xcode [13.1 .. ] - p.set_defaults( type_qt = "qt6brew", - type_ruby = "hb27", + p.set_defaults( type_qt = "qt5brew", + type_ruby = "hb31", type_python = "hb38", build_pymod = False, no_qt_binding = False, @@ -342,7 +456,7 @@ def Parse_CLI_Args(config): deploy_verbose = "1", checkusage = False ) else: # with Xcode [ .. 12.4] - p.set_defaults( type_qt = "qt6brew", + p.set_defaults( type_qt = "qt5macports", type_ruby = "sys", type_python = "sys", build_pymod = False, @@ -363,8 +477,6 @@ def Parse_CLI_Args(config): # (A) Determine the Qt type candidates = dict() - candidates['QT6MACPORTS'] = 'Qt6MacPorts' - candidates['QT6BREW'] = 'Qt6Brew' candidates['QT5MACPORTS'] = 'Qt5MacPorts' candidates['QT5BREW'] = 'Qt5Brew' candidates['QT5ANA3'] = 'Qt5Ana3' @@ -379,16 +491,12 @@ def Parse_CLI_Args(config): (opt.type_qt, list(candidates.keys())), file=sys.stderr ) print(Usage) sys.exit(1) - elif ModuleQt == "Qt6MacPorts": - choiceQt65 = 'qt6MP' - elif ModuleQt == "Qt6Brew": - choiceQt65 = 'qt6Brew' elif ModuleQt == "Qt5MacPorts": - choiceQt65 = 'qt5MP' + choiceQt5 = 'qt5MP' elif ModuleQt == "Qt5Brew": - choiceQt65 = 'qt5Brew' + choiceQt5 = 'qt5Brew' elif ModuleQt == "Qt5Ana3": - choiceQt65 = 'qt5Ana3' + choiceQt5 = 'qt5Ana3' # By default, OS-standard (-bundled) script languages (Ruby and Python) are used NonOSStdLang = False @@ -397,8 +505,8 @@ def Parse_CLI_Args(config): candidates = dict() candidates['NIL'] = 'nil' candidates['SYS'] = 'Sys' - candidates['MP27'] = 'MP27' - candidates['HB27'] = 'HB27' + candidates['MP31'] = 'MP31' + candidates['HB31'] = 'HB31' candidates['ANA3'] = 'Ana3' try: choiceRuby = candidates[ opt.type_ruby.upper() ] @@ -425,11 +533,11 @@ def Parse_CLI_Args(config): ModuleRuby = 'RubySierra' elif Platform == "ElCapitan": ModuleRuby = 'RubyElCapitan' - elif choiceRuby == "MP27": - ModuleRuby = 'Ruby27MacPorts' + elif choiceRuby == "MP31": + ModuleRuby = 'Ruby31MacPorts' NonOSStdLang = True - elif choiceRuby == "HB27": - ModuleRuby = 'Ruby27Brew' + elif choiceRuby == "HB31": + ModuleRuby = 'Ruby31Brew' NonOSStdLang = True elif choiceRuby == "Ana3": ModuleRuby = 'RubyAnaconda3' @@ -448,7 +556,6 @@ def Parse_CLI_Args(config): candidates['MP38'] = 'MP38' candidates['HB38'] = 'HB38' candidates['ANA3'] = 'Ana3' - candidates['HB39'] = 'HB39' candidates['HBAUTO'] = 'HBAuto' try: choicePython = candidates[ opt.type_python.upper() ] @@ -483,9 +590,6 @@ def Parse_CLI_Args(config): elif choicePython == "Ana3": ModulePython = 'PythonAnaconda3' NonOSStdLang = True - elif choicePython == "HB39": - ModulePython = 'Python39Brew' - NonOSStdLang = True elif choicePython == "HBAuto": ModulePython = 'PythonAutoBrew' NonOSStdLang = True @@ -497,7 +601,7 @@ def Parse_CLI_Args(config): sys.exit(1) # (D) Set of modules chosen - ModuleSet = ( choiceQt65, choiceRuby, choicePython ) + ModuleSet = ( choiceQt5, choiceRuby, choicePython ) # (E) Set other parameters BuildPymod = opt.build_pymod @@ -543,10 +647,10 @@ def Parse_CLI_Args(config): elif DeploymentF: if (ModuleRuby in RubySys) and (ModulePython in PythonSys): PackagePrefix = "ST-" - message += "a standard (ST-) package including Qt[6|5] and using OS-bundled Ruby and Python..." - elif ModulePython in ['Python38Brew', 'Python39Brew', 'PythonAutoBrew']: + message += "a standard (ST-) package including Qt5 and using OS-bundled Ruby and Python..." + elif ModulePython == 'Python38Brew' or ModulePython == 'PythonAutoBrew': PackagePrefix = "HW-" - message += "a heavyweight (HW-) package including Qt[6|5] and Python3.8~ from Homebrew..." + message += "a heavyweight (HW-) package including Qt5 and Python3.8~ from Homebrew..." else: PackagePrefix = "EX-" message += "a package with exceptional (EX-) combinations of different modules..." @@ -629,7 +733,7 @@ def Get_Build_Parameters(config): mode = "release" # (B) Modules - (qt, ruby, python) = ModuleSet # ( 'qt6Brew', 'Sys', 'Sys' ) + (qt, ruby, python) = ModuleSet # ( 'qt5MP', 'Sys', 'Sys' ) ruby_python = "R%sP%s" % ( ruby.lower(), python.lower() ) # (C) Target directories and files @@ -640,14 +744,8 @@ def Get_Build_Parameters(config): MacBuildDirQAT = MacBuildDir + ".macQAT" parameters['logfile'] = MacBuildLog - # (D) Qt6|5 - if ModuleQt == 'Qt6MacPorts': - parameters['qmake'] = Qt6MacPorts['qmake'] - parameters['deploy_tool'] = Qt6MacPorts['deploy'] - elif ModuleQt == 'Qt6Brew': - parameters['qmake'] = Qt6Brew['qmake'] - parameters['deploy_tool'] = Qt6Brew['deploy'] - elif ModuleQt == 'Qt5MacPorts': + # (D) Qt5 + if ModuleQt == 'Qt5MacPorts': parameters['qmake'] = Qt5MacPorts['qmake'] parameters['deploy_tool'] = Qt5MacPorts['deploy'] elif ModuleQt == 'Qt5Brew': @@ -657,7 +755,6 @@ def Get_Build_Parameters(config): parameters['qmake'] = Qt5Ana3['qmake'] parameters['deploy_tool'] = Qt5Ana3['deploy'] - parameters['bin'] = MacBinDir parameters['build'] = MacBuildDir parameters['rpath'] = "@executable_path/../Frameworks" @@ -681,6 +778,7 @@ def Get_Build_Parameters(config): # (H) about Ruby if ModuleRuby != "nil": + ApplyPatch2KLayoutQtPri4Ruby3( config ) parameters['ruby'] = RubyDictionary[ModuleRuby]['exe'] parameters['rbinc'] = RubyDictionary[ModuleRuby]['inc'] parameters['rblib'] = RubyDictionary[ModuleRuby]['lib'] @@ -706,7 +804,7 @@ def Get_Build_Parameters(config): # will be built if: # BuildPymod = True # Platform = [ 'Monterey', 'BigSur', 'Catalina' ] - # ModuleRuby = [ 'Ruby27MacPorts', 'Ruby27Brew', 'RubyAnaconda3' ] + # ModuleRuby = [ 'Ruby31MacPorts', 'Ruby31Brew', 'RubyAnaconda3' ] # ModulePython = [ 'Python38MacPorts', 'Python38Brew', # 'PythonAnaconda3', 'PythonAutoBrew' ] parameters['BuildPymod'] = BuildPymod @@ -716,7 +814,7 @@ def Get_Build_Parameters(config): PymodDistDir = dict() if Platform in [ 'Monterey', 'BigSur', 'Catalina' ]: - if ModuleRuby in [ 'Ruby27MacPorts', 'Ruby27Brew', 'RubyAnaconda3' ]: + if ModuleRuby in [ 'Ruby31MacPorts', 'Ruby31Brew', 'RubyAnaconda3' ]: if ModulePython in ['Python38MacPorts']: PymodDistDir[ModulePython] = 'dist-MP3' elif ModulePython in [ 'Python38Brew', 'PythonAutoBrew' ]: @@ -739,7 +837,7 @@ def Build_pymod(parameters): # [1] will be built if: # BuildPymod = True # Platform = [ 'Monterey', 'BigSur', 'Catalina' ] - # ModuleRuby = [ 'Ruby27MacPorts', 'Ruby27Brew', 'RubyAnaconda3' ] + # ModuleRuby = [ 'Ruby31MacPorts', 'Ruby31Brew', 'RubyAnaconda3' ] # ModulePython = [ 'Python38MacPorts', 'Python38Brew', # 'PythonAnaconda3', 'PythonAutoBrew' ] #--------------------------------------------------------------------------- @@ -751,7 +849,7 @@ def Build_pymod(parameters): return 0 if not Platform in [ 'Monterey', 'BigSur', 'Catalina' ]: return 0 - elif not ModuleRuby in [ 'Ruby27MacPorts', 'Ruby27Brew', 'RubyAnaconda3' ]: + elif not ModuleRuby in [ 'Ruby31MacPorts', 'Ruby31Brew', 'RubyAnaconda3' ]: return 0 elif not ModulePython in [ 'Python38MacPorts', 'Python38Brew', 'PythonAnaconda3', 'PythonAutoBrew' ]: return 0 @@ -889,8 +987,8 @@ def Run_Build_Command(parameters): # (C) Target directories and files MacBuildDirQAT = parameters['build'] + ".macQAT" - # (D) Qt5 | Qt6 (Homebrew) - #cmd_args += " \\\n -qt5" # make 'build.sh' detect the Qt type automatically + # (D) Qt5 + cmd_args += " \\\n -qt5" cmd_args += " \\\n -qmake %s" % parameters['qmake'] cmd_args += " \\\n -bin %s" % parameters['bin'] cmd_args += " \\\n -build %s" % parameters['build'] @@ -1487,15 +1585,18 @@ def Deploy_Binaries_For_Bundle(config, parameters): #---------------------------------------------------------------------------------- # Typical usage of 'pip' after installation of the DMG package # - # $ cd /Applications/klayout.app/Contents/MacOS/ - # $ ./start-console.py - # - # Python 3.8.12 (default, Oct 13 2021, 06:42:19) - # [Clang 12.0.0 (clang-1200.0.32.29)] on darwin + # $ /Applications/klayout.app/Contents/MacOS/start-console.py + # Warning: Populating font family aliases took 195 ms. Replace uses of missing font\ + # family "Monospace" with one that exists to avoid this cost. + # Python 3.7.8 (default, Jul 4 2020, 10:17:17) + # [Clang 11.0.3 (clang-1103.0.32.62)] on darwin # Type "help", "copyright", "credits" or "license" for more information. # (KLayout Python Console) # >>> import pip - # >>> pip.main( ['install', 'numpy', 'scipy', 'pandas', 'matplotlib'] ) + # >>> pip.main( ['install', 'numpy'] ) + # >>> pip.main( ['install', 'scipy'] ) + # >>> pip.main( ['install', 'pandas'] ) + # >>> pip.main( ['install', 'matplotlib'] ) #---------------------------------------------------------------------------------- pip_module = "%s/Versions/%s/lib/python%s/site-packages/pip/__init__.py" % \ (pythonFrameworkPath, pythonHBVer, pythonHBVer) @@ -1521,18 +1622,18 @@ def Deploy_Binaries_For_Bundle(config, parameters): file.write(line) #------------------------------------------------------------- - # [10] Special deployment of Ruby2.7 from Homebrew? + # [10] Special deployment of Ruby3.1 from Homebrew? #------------------------------------------------------------- - deploymentRuby27HB = (ModuleRuby == 'Ruby27Brew') - if deploymentRuby27HB and NonOSStdLang: + deploymentRuby31HB = (ModuleRuby == 'Ruby31Brew') + if deploymentRuby31HB and NonOSStdLang: print( "" ) - print( " [10] You have reached optional deployment of Ruby from %s ..." % HBRuby27Path ) + print( " [10] You have reached optional deployment of Ruby from %s ..." % HBRuby31Path ) print( " [!!!] Sorry, the deployed package will not work properly since deployment of" ) print( " Ruby2.7 from Homebrew is not yet supported." ) print( " Since you have Homebrew development environment, there two options:" ) print( " (1) Retry to make a package with '-Y|--DEPLOY' option." ) - print( " This will not deploy any of Qt[6|5], Python, and Ruby from Homebrew." ) + print( " This will not deploy any of Qt5, Python, and Ruby from Homebrew." ) print( " Instead, the package will directly use those Frameworks and libraries" ) print( " in your Homebrew environment." ) print( " (2) Rebuild KLayout with '-r|--ruby ' option depending on your preference." ) diff --git a/macbuild/build4mac_env.py b/macbuild/build4mac_env.py index 501c61b07..2a30a6e9d 100755 --- a/macbuild/build4mac_env.py +++ b/macbuild/build4mac_env.py @@ -85,7 +85,7 @@ Qt5Ana3 = { 'qmake' : '/Applications/anaconda3/bin/qmake', RubyNil = [ 'nil' ] RubySys = [ 'RubyElCapitan', 'RubySierra', 'RubyHighSierra', 'RubyMojave' ] RubySys += [ 'RubyCatalina', 'RubyBigSur', 'RubyMonterey' ] -RubyExt = [ 'Ruby27MacPorts', 'Ruby27Brew', 'RubyAnaconda3' ] +RubyExt = [ 'Ruby31MacPorts', 'Ruby31Brew', 'RubyAnaconda3' ] Rubies = RubyNil + RubySys + RubyExt #----------------------------------------------------- @@ -174,30 +174,30 @@ RubyMonterey = { 'exe': '/System/Library/Frameworks/Ruby.framework/Versions/ 'lib': '%s/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.tbd' % MontereySDK } -# Ruby 2.7 from MacPorts (https://www.macports.org/) *+*+*+ EXPERIMENTAL *+*+*+ -# install with 'sudo port install ruby27' -# [Key Type Name] = 'MP27' -Ruby27MacPorts = { 'exe': '/opt/local/bin/ruby2.7', - 'inc': '/opt/local/include/ruby-2.7.0', - 'lib': '/opt/local/lib/libruby.2.7.dylib' +# Ruby 3.1 from MacPorts (https://www.macports.org/) *+*+*+ EXPERIMENTAL *+*+*+ +# install with 'sudo port install ruby31' +# [Key Type Name] = 'MP31' +Ruby31MacPorts = { 'exe': '/opt/local/bin/ruby3.1', + 'inc': '/opt/local/include/ruby-3.1.2', + 'lib': '/opt/local/lib/libruby.3.1.dylib' } -# Ruby 2.7 from Homebrew *+*+*+ EXPERIMENTAL *+*+*+ -# install with 'brew install ruby' -# [Key Type Name] = 'HB27' -HBRuby27Path = '%s/opt/ruby@2.7' % DefaultHomebrewRoot -Ruby27Brew = { 'exe': '%s/bin/ruby' % HBRuby27Path, - 'inc': '%s/include/ruby-2.7.0' % HBRuby27Path, - 'lib': '%s/lib/libruby.2.7.dylib' % HBRuby27Path +# Ruby 3.1 from Homebrew *+*+*+ EXPERIMENTAL *+*+*+ +# install with 'brew install ruby@3.1' +# [Key Type Name] = 'HB31' +HBRuby31Path = '%s/opt/ruby@3.1' % DefaultHomebrewRoot +Ruby31Brew = { 'exe': '%s/bin/ruby' % HBRuby31Path, + 'inc': '%s/include/ruby-3.1.0' % HBRuby31Path, + 'lib': '%s/lib/libruby.3.1.dylib' % HBRuby31Path } -# Ruby 2.5 bundled with anaconda3 installed under /Applications/anaconda3/ *+*+*+ EXPERIMENTAL *+*+*+ +# Ruby 3.1 bundled with anaconda3 installed under /Applications/anaconda3/ *+*+*+ EXPERIMENTAL *+*+*+ # The standard installation deploys the tool under $HOME/opt/anaconda3/. # If so, you need to make a symbolic link: /Applications/anaconda3 ---> $HOME/opt/anaconda3/ # [Key Type Name] = 'Ana3' RubyAnaconda3 = { 'exe': '/Applications/anaconda3/bin/ruby', - 'inc': '/Applications/anaconda3/include/ruby-2.5.0', - 'lib': '/Applications/anaconda3/lib/libruby.2.5.1.dylib' + 'inc': '/Applications/anaconda3/include/ruby-3.1.0', + 'lib': '/Applications/anaconda3/lib/libruby.3.1.dylib' } # Consolidated dictionary kit for Ruby @@ -210,8 +210,8 @@ RubyDictionary = { 'nil' : None, 'RubyCatalina' : RubyCatalina, 'RubyBigSur' : RubyBigSur, 'RubyMonterey' : RubyMonterey, - 'Ruby27MacPorts': Ruby27MacPorts, - 'Ruby27Brew' : Ruby27Brew, + 'Ruby31MacPorts': Ruby31MacPorts, + 'Ruby31Brew' : Ruby31Brew, 'RubyAnaconda3' : RubyAnaconda3 } diff --git a/macbuild/makeDMG4mac.py b/macbuild/makeDMG4mac.py index 3756fa823..d653baa18 100755 --- a/macbuild/makeDMG4mac.py +++ b/macbuild/makeDMG4mac.py @@ -77,13 +77,13 @@ def SetGlobals(): Usage = "\n" Usage += "---------------------------------------------------------------------------------------------------------\n" Usage += "<< Usage of 'makeDMG4mac.py' >>\n" - Usage += " for making a DMG file of KLayout 0.27.5 or later on different Apple macOS / Mac OSX platforms.\n" + Usage += " for making a DMG file of KLayout 0.27.10 or later on different Apple macOS / Mac OSX platforms.\n" Usage += "\n" Usage += "$ [python] ./makeDMG4mac.py\n" Usage += " option & argument : descriptions | default value\n" Usage += " ----------------------------------------------------------------------------------+-----------------\n" Usage += " <-p|--pkg > : package directory created by `build4mac.py` with [-y|-Y] | ``\n" - Usage += " : like 'ST-qt6MP.pkg.macos-Catalina-release-RsysPsys' | \n" + Usage += " : like 'ST-qt5MP.pkg.macos-Catalina-release-RsysPsys' | \n" Usage += " <-c|--clean> : clean the work directory | disabled\n" Usage += " <-m|--make> : make a compressed DMG file | disabled\n" Usage += " : <-c|--clean> and <-m|--make> are mutually exclusive | \n" @@ -137,7 +137,7 @@ def SetGlobals(): sys.exit(1) if not Machine == "x86_64": - if Machine == "arm64" and Platform in ["Monterey", "BigSur"]: # with an Apple Silicon Chip + if Machine == "arm64" and (Platform == "Monterey" or Platform == "BigSur"): # with an Apple Silicon Chip print("") print( "### Your Mac equips an Apple Silicon Chip ###" ) print("") @@ -195,17 +195,13 @@ def SetGlobals(): ## To check the contents of the package directory # # The package directory name should look like: -# * ST-qt6MP.pkg.macos-Catalina-release-RsysPsys --- (1) -# * LW-qt6MP.pkg.macos-Catalina-release-Rmp27Pmp38 -# * LW-qt6Brew.pkg.macos-Catalina-release-Rhb27Phb38 -# -# * ST-qt5MP.pkg.macos-Catalina-release-RsysPsys -# * LW-qt5MP.pkg.macos-Catalina-release-Rmp27Pmp38 -# * LW-qt5Brew.pkg.macos-Catalina-release-Rhb27Phb38 +# * ST-qt5MP.pkg.macos-Catalina-release-RsysPsys --- (1) # * LW-qt5Ana3.pkg.macos-Catalina-release-Rana3Pana3 +# * LW-qt5Brew.pkg.macos-Catalina-release-Rhb31Phb38 +# * LW-qt5MP.pkg.macos-Catalina-release-Rmp31Pmp38 # # Generated DMG will be, for example, -# (1) ---> ST-klayout-0.27.5-macOS-Catalina-1-qt6MP-RsysPsys.dmg +# (1) ---> ST-klayout-0.26.1-macOS-Catalina-1-qt5MP-RsysPsys.dmg # # @return on success, positive integer in [MB] that tells approx. occupied disc space; # on failure, -1 @@ -242,18 +238,14 @@ def CheckPkgDirectory(): #----------------------------------------------------------------------------- # [2] Identify (Qt, Ruby, Python) from PkgDir - # * ST-qt6MP.pkg.macos-Catalina-release-RsysPsys - # * LW-qt6MP.pkg.macos-Catalina-release-Rmp27Pmp38 - # * LW-qt6Brew.pkg.macos-Catalina-release-Rhb27Phb38 # # * ST-qt5MP.pkg.macos-Catalina-release-RsysPsys - # * LW-qt5MP.pkg.macos-Catalina-release-Rmp27Pmp38 - # * LW-qt5Brew.pkg.macos-Catalina-release-Rhb27Phb38 # * LW-qt5Ana3.pkg.macos-Catalina-release-Rana3Pana3 + # * LW-qt5Brew.pkg.macos-Catalina-release-Rhb31Phb38 # * HW-qt5Brew.pkg.macos-Catalina-release-RsysPhb38 - # * EX-qt5MP.pkg.macos-Catalina-release-Rmp27Pmp38 + # * EX-qt5MP.pkg.macos-Catalina-release-Rmp31Pmp38 #----------------------------------------------------------------------------- - patQRP = u'(ST|LW|HW|EX)([-])([qt6|qt5][0-9A-Za-z]+)([.]pkg[.])([A-Za-z]+[-][A-Za-z]+[-]release[-])([0-9A-Za-z]+)' + patQRP = u'(ST|LW|HW|EX)([-])(qt5[0-9A-Za-z]+)([.]pkg[.])([A-Za-z]+[-][A-Za-z]+[-]release[-])([0-9A-Za-z]+)' regQRP = re.compile(patQRP) if not regQRP.match(PkgDir): print( "! Cannot identify (Qt, Ruby, Python) from the package directory name" ) @@ -273,18 +265,18 @@ def CheckPkgDirectory(): #----------------------------------------------------------------------------- LatestOSMacPorts = Platform == LatestOS LatestOSMacPorts &= PackagePrefix == "LW" - LatestOSMacPorts &= QtIdentification in ["qt6MP", "qt5MP"] - LatestOSMacPorts &= RubyPythonID in ["Rmp27Pmp38"] + LatestOSMacPorts &= QtIdentification == "qt5MP" + LatestOSMacPorts &= RubyPythonID == "Rmp31Pmp38" LatestOSHomebrew = Platform == LatestOS LatestOSHomebrew &= PackagePrefix == "LW" - LatestOSHomebrew &= QtIdentification in ["qt6Brew", "qt5Brew"] - LatestOSHomebrew &= RubyPythonID in ["Rhb27Phb38", "Rhb27Phb39", "Rhb27Phbauto"] + LatestOSHomebrew &= QtIdentification == "qt5Brew" + LatestOSHomebrew &= RubyPythonID == "Rhb31Phb38" or RubyPythonID == "Rhb31Phbauto" LatestOSAnaconda3 = Platform == LatestOS LatestOSAnaconda3 &= PackagePrefix == "LW" - LatestOSAnaconda3 &= QtIdentification in ["qt5Ana3"] - LatestOSAnaconda3 &= RubyPythonID in ["Rana3Pana3"] + LatestOSAnaconda3 &= QtIdentification == "qt5Ana3" + LatestOSAnaconda3 &= RubyPythonID == "Rana3Pana3" if LatestOSMacPorts: mydic = DicLightWeight["ports"] diff --git a/macbuild/nightlyBuild.py b/macbuild/nightlyBuild.py index 7226c1f07..edd943059 100755 --- a/macbuild/nightlyBuild.py +++ b/macbuild/nightlyBuild.py @@ -77,15 +77,15 @@ def Get_Build_Options( targetDic ): if target == "std": # use 'Qt5MacPorts' that provides Qt 5.15.2~ to run on "Big Sur", too buildOp["std"] = [ '-q', 'Qt5MacPorts', '-r', 'sys', '-p', 'sys' ] elif target == "ports": - buildOp["ports"] = [ '-q', 'Qt5MacPorts', '-r', 'MP27', '-p', 'MP38' ] + buildOp["ports"] = [ '-q', 'Qt5MacPorts', '-r', 'MP31', '-p', 'MP38' ] elif target == "brew": - buildOp["brew"] = [ '-q', 'Qt5Brew', '-r', 'HB27', '-p', 'HB38' ] + buildOp["brew"] = [ '-q', 'Qt5Brew', '-r', 'HB31', '-p', 'HB38' ] elif target == "brewHW": buildOp["brewHW"] = [ '-q', 'Qt5Brew', '-r', 'sys', '-p', 'HB38' ] elif target == "ana3": buildOp["ana3"] = [ '-q', 'Qt5Ana3', '-r', 'Ana3', '-p', 'Ana3' ] elif target == "brewA": - buildOp["brewA"] = [ '-q', 'Qt5Brew', '-r', 'HB27', '-p', 'HBAuto' ] + buildOp["brewA"] = [ '-q', 'Qt5Brew', '-r', 'HB31', '-p', 'HBAuto' ] elif target == "brewAHW": buildOp["brewAHW"] = [ '-q', 'Qt5Brew', '-r', 'sys', '-p', 'HBAuto' ] @@ -110,15 +110,15 @@ def Get_QAT_Directory( targetDic, platform ): if target == "std": dirQAT["std"] = 'qt5MP.build.macos-%s-release-RsysPsys.macQAT' % platform elif target == "ports": - dirQAT["ports"] = 'qt5MP.build.macos-%s-release-Rmp27Pmp38.macQAT' % platform + dirQAT["ports"] = 'qt5MP.build.macos-%s-release-Rmp31Pmp38.macQAT' % platform elif target == "brew": - dirQAT["brew"] = 'qt5Brew.build.macos-%s-release-Rhb27Phb38.macQAT' % platform + dirQAT["brew"] = 'qt5Brew.build.macos-%s-release-Rhb31Phb38.macQAT' % platform elif target == "brewHW": dirQAT["brewHW"] = 'qt5Brew.build.macos-%s-release-RsysPhb38.macQAT' % platform elif target == "ana3": dirQAT["ana3"] = 'qt5Ana3.build.macos-%s-release-Rana3Pana3.macQAT' % platform elif target == "brewA": - dirQAT["brewA"] = 'qt5Brew.build.macos-%s-release-Rhb27Phbauto.macQAT' % platform + dirQAT["brewA"] = 'qt5Brew.build.macos-%s-release-Rhb31Phbauto.macQAT' % platform elif target == "brewAHW": dirQAT["brewAHW"] = 'qt5Brew.build.macos-%s-release-RsysPhbauto.macQAT' % platform return dirQAT @@ -146,10 +146,10 @@ def Get_Package_Options( targetDic, platform, srlDMG, makeflag ): packOp["std"] = [ '-p', 'ST-qt5MP.pkg.macos-%s-release-RsysPsys' % platform, '-s', '%d' % srlDMG, '%s' % flag ] elif target == "ports": - packOp["ports"] = [ '-p', 'LW-qt5MP.pkg.macos-%s-release-Rmp27Pmp38' % platform, + packOp["ports"] = [ '-p', 'LW-qt5MP.pkg.macos-%s-release-Rmp31Pmp38' % platform, '-s', '%d' % srlDMG, '%s' % flag ] elif target == "brew": - packOp["brew"] = [ '-p', 'LW-qt5Brew.pkg.macos-%s-release-Rhb27Phb38' % platform, + packOp["brew"] = [ '-p', 'LW-qt5Brew.pkg.macos-%s-release-Rhb31Phb38' % platform, '-s', '%d' % srlDMG, '%s' % flag ] elif target == "brewHW": packOp["brewHW"] = [ '-p', 'HW-qt5Brew.pkg.macos-%s-release-RsysPhb38' % platform, @@ -158,7 +158,7 @@ def Get_Package_Options( targetDic, platform, srlDMG, makeflag ): packOp["ana3"] = [ '-p', 'LW-qt5Ana3.pkg.macos-%s-release-Rana3Pana3' % platform, '-s', '%d' % srlDMG, '%s' % flag ] elif target == "brewA": - packOp["brewA"] = [ '-p', 'LW-qt5Brew.pkg.macos-%s-release-Rhb27Phbauto' % platform, + packOp["brewA"] = [ '-p', 'LW-qt5Brew.pkg.macos-%s-release-Rhb31Phbauto' % platform, '-s', '%d' % srlDMG, '%s' % flag ] elif target == "brewAHW": packOp["brewAHW"] = [ '-p', 'HW-qt5Brew.pkg.macos-%s-release-RsysPhbauto' % platform, @@ -216,7 +216,7 @@ def Parse_CommandLine_Arguments(): Usage += " (3) $ ./nightlyBuild.py --test | \n" Usage += " (4) $ ./nightlyBuild.py --check (confirm the QA Test results) | \n" Usage += " (5) $ ./nightlyBuild.py --makedmg 1 | \n" - Usage += " (6) $ ./nightlyBuild.py --upload '0.27.9' | \n" + Usage += " (6) $ ./nightlyBuild.py --upload '0.27.10' | \n" Usage += " (7) $ ./nightlyBuild.py --cleandmg 1 | \n" Usage += "---------------------------------------------------------------------------+----------------------\n"