diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f9dd98312..3e3e637c6 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -95,7 +95,7 @@ jobs:
mkdir -p $HOST_CCACHE_DIR
- name: Build wheels (ARM)
if: matrix.os == 'ubuntu-24.04-arm'
- uses: pypa/cibuildwheel@v4.1.0
+ uses: pypa/cibuildwheel@v4.1.1
env:
# override the default CentOS “yum install … ccache” and drop ccache
CIBW_BEFORE_ALL_LINUX: |
@@ -110,7 +110,7 @@ jobs:
- name: Build wheels (all other platforms)
if: matrix.os != 'ubuntu-24.04-arm'
- uses: pypa/cibuildwheel@v4.1.0
+ uses: pypa/cibuildwheel@v4.1.1
env:
CIBW_BUILD: ${{ matrix.cibuild }}
CIBW_ARCHS_MACOS: ${{ matrix.macos-arch }}
@@ -158,7 +158,7 @@ jobs:
merge-multiple: true
path: dist
- - uses: pypa/gh-action-pypi-publish@v1.14.0
+ - uses: pypa/gh-action-pypi-publish@v1.14.2
continue-on-error: true # might fail if we don't bump the version
with:
user: __token__
@@ -175,7 +175,7 @@ jobs:
merge-multiple: true
path: dist
- - uses: pypa/gh-action-pypi-publish@v1.14.0
+ - uses: pypa/gh-action-pypi-publish@v1.14.2
with:
user: __token__
password: ${{ secrets.pypi_password }}
diff --git a/macbuild/ReadMe.md b/macbuild/ReadMe.md
index 4bf2aeb5b..f11a326ab 100644
--- a/macbuild/ReadMe.md
+++ b/macbuild/ReadMe.md
@@ -1,16 +1,17 @@
-Relevant KLayout version: 0.30.5
+Relevant KLayout version: 0.30.9
Author: Kazzz-S
-Last modified: 2025-11-10
+Last modified: 2026-07-26
# 1. Introduction
-This directory **`macbuild`** contains various files required for building KLayout (http://www.klayout.de/) version 0.30.5 or later for different 64-bit macOS, including:
+This directory **`macbuild`** contains various files required for building KLayout (http://www.klayout.de/) version 0.30.9 or later for different 64-bit macOS, including:
+* Golden Gate (27.x) : really experimental (on M4 Mac Mini)
* Tahoe (26.x) : really experimental (on M4 Mac Mini)
* Sequoia (15.x) : the primary development environment
* Sonoma (14.x) : experimental
Building KLayout for the previous operating systems listed below has been discontinued.
Pre-built DMG packages are also not provided.
-As of today (November 2025), Homebrew classifies macOS Catalina 10.15 - Ventura 13 as Tier 3.
+As of November 2025, Homebrew classifies macOS Catalina 10.15 - Ventura 13 as Tier 3.
* Ventura (13.7.8; the build would still be possible)
* Monterey (12.7.6; the build would still be possible)
* Big Sur (11.7.10)
@@ -47,7 +48,7 @@ Then, follow the instructions in Section 6F.
The migration work to "Qt6" is ongoing. You can try to use it; however, you might encounter some build or runtime errors.
If you use **Homebrew** to build KLayout >= 0.29.0, you need "Qt6" to address [the compilation issue](https://github.com/KLayout/klayout/issues/1599).
-I have also tried migrating to "Python 3.13.x" (earlier, Python 3.12.x) in this version.
+I have also tried migrating to "Python 3.14.x" (earlier, Python 3.13.x) in this version.
# 3. Script language support: Ruby and Python
@@ -72,7 +73,7 @@ The operating system type is detected automatically.
```
-----------------------------------------------------------------------------------------------------------
<< Usage of 'build4mac.py' >>
- for building KLayout 0.30.5 or later on different Apple macOS platforms.
+ for building KLayout 0.30.9 or later on different Apple macOS platforms.
$ [python] ./build4mac.py
option & argument : descriptions (refer to 'macbuild/build4mac_env.py' for details) | default value
@@ -88,27 +89,27 @@ $ [python] ./build4mac.py
: (*) migration to Qt6 is ongoing |
[-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP34', 'HB34', 'Ana3'] | sys
: nil: don't bind Ruby |
- : Sys: use [Tahoe|Sequoia|Sonoma]-bundled Ruby 2.6 |
+ : Sys: use [GoldenGate|Tahoe|Sequoia|Sonoma]-bundled Ruby 2.6 |
: MP34: use Ruby 3.4 from MacPorts |
: HB34: use Ruby 3.4 from Homebrew |
: Ana3: use Ruby 3.4 from Anaconda3 |
- [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP313', 'HB313', 'Ana3', | sys
- : 'MP312', 'MP312', |
- : 'MP311', 'HB311', 'HBAuto'] |
+ [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP314', 'HB314', 'Ana3', | sys
+ : 'MP314', 'HB314', |
+ : 'HB311', 'HBAuto'] |
: nil: don't bind Python |
- : Sys: use [Tahoe|Sequoia|Sonoma]-bundled Python 3.9 |
- : MP313: use Python 3.13 from MacPorts |
- : HB313: use Python 3.13 from Homebrew |
- : Ana3: use Python 3.13 from Anaconda3 |
- : MP312: use Python 3.12 from MacPorts |
- : HB312: use Python 3.12 from Homebrew |
- : MP311: use Python 3.11 from MacPorts |
+ : Sys: use [GoldenGate|Tahoe|Sequoia|Sonoma]-bundled Python 3.9 |
+ : MP314: use Python 3.14 from MacPorts |
+ : HB314: use Python 3.14 from Homebrew |
+ : Ana3: use Python 3.14 from Anaconda3 |
+ : MP314: use Python 3.14 from MacPorts |
+ : HB314: use Python 3.14 from Homebrew |
: HB311: use Python 3.11 from Homebrew (+) |
: (+) required to provide the legacy pip in HW-*.dmg |
: HBAuto: use the latest Python 3.x auto-detected from Homebrew |
[-P|--buildPymod] : build and deploy Pymod (*.whl) for LW-*.dmg | disabled
[-n|--noqtbinding] : don't create Qt bindings for ruby scripts | disabled
[-u|--noqtuitools] : don't include uitools in Qt binding | disabled
+ [-s|--no32bitcoord] : don't use short (32bit) coordinates; use long (64bit) instead | disabled
[-g|--nolibgit2] : don't include libgit2 for Git package support | disabled
[-m|--make ] : option passed to 'make' | '--jobs=4'
[-d|--debug] : enable debug mode build; AddressSanitizer (ASAN) is linked | disabled
@@ -160,27 +161,28 @@ $ ./build4mac.py -q qt5macports -r sys -p sys
$ ./build4mac.py -q qt5macports -r sys -p sys -y
```
The application bundle **`klayout.app`** is located under:
- **`ST-qt5MP.pkg.macos-Sequoia-release-RsysPsys`** directory, where
+ **`ST-qt5MP.pkg.macos-Sequoia-C32-release-RsysPsys`** directory, where
* "ST-" means this is a standard package.
* "qt5MP" means that Qt5 from MacPorts is used.
+* "C32" means that the coordinate representation is a 32-bit integer (C64, for 64-bit).
* "RsysPsys" means that Ruby is 2.6 provided by OS; Python is 3.9 provided by OS.
4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation.
-### 6B. Fully MacPorts-flavored build with MacPorts Ruby 3.4 and MacPorts Python 3.13
-0. Install MacPorts, then install Qt5, Ruby 3.4, Python 3.13, and libgit2 by
+### 6B. Fully MacPorts-flavored build with MacPorts Ruby 3.4 and MacPorts Python 3.14
+0. Install MacPorts, then install Qt5, Ruby 3.4, Python 3.14, and libgit2 by
```
$ sudo port install coreutils
$ sudo port install findutils
$ sudo port install qt5
$ sudo port install ruby34
-$ sudo port install python313
-$ sudo port install py313-pip
+$ sudo port install python314
+$ sudo port install py314-pip
$ sudo port install libgit2
```
1. Invoke **`build4mac.py`** with the following options:
```
$ cd /where/'build.sh'/exists
-$ ./build4mac.py -q qt5macports -r mp34 -p mp313
+$ ./build4mac.py -q qt5macports -r mp34 -p mp314
```
2. Confirm successful build (it will take about one hour, depending on your machine spec).
3. Rerun **`build4mac.py`** with the same options used in 1. PLUS "-Y" to deploy executables and libraries under **`klayout.app`** bundle.
@@ -188,50 +190,52 @@ $ ./build4mac.py -q qt5macports -r mp34 -p mp313
If you use `--buildPymod` option in Step-1 and Step-3, the KLayout Standalone Python Package (\*.whl) will be built and deployed under **klayout.app/Contents/pymod-dist/**.
```
-$ ./build4mac.py -q qt5macports -r mp34 -p mp313 -Y
+$ ./build4mac.py -q qt5macports -r mp34 -p mp314 -Y
```
The application bundle **`klayout.app`** is located under:
- **`LW-qt5MP.pkg.macos-Sequoia-release-Rmp34Pmp313`** directory, where
+ **`LW-qt5MP.pkg.macos-Sequoia-C32-release-Rmp34Pmp314`** directory, where
* "LW-" means this is a lightweight package.
* "qt5MP" means that Qt5 from MacPorts is used.
-* "Rmp34Pmp313" means that Ruby is 3.4 from MacPorts; Python is 3.13 from MacPorts.
+* "C32" means that the coordinate representation is a 32-bit integer (C64, for 64-bit).
+* "Rmp34Pmp314" means that Ruby is 3.4 from MacPorts; Python is 3.14 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 3.4 and Homebrew Python 3.13
+### 6C. Fully Homebrew-flavored build with Homebrew Ruby 3.4 and Homebrew Python 3.14
> [!IMPORTANT]
> To build KLayout >= 0.29.0, you need "Qt6" >= 6.7.0 to address [the compilation issue](https://github.com/KLayout/klayout/issues/1599).
-0. Install Homebrew, then install Qt6, Ruby 3.4, Python 3.13, and libgit2 by
+0. Install Homebrew, then install Qt6, Ruby 3.4, Python 3.14, and libgit2 by
```
$ brew install qt@6
$ brew install ruby@3.4
-$ brew install python@3.13
+$ brew install python@3.14
$ brew install libgit2
$ cd /where/'build.sh'/exists
$ cd macbuild
-$ ./python3HB.py -v 3.13
+$ ./python3HB.py -v 3.14
```
1. Invoke **`build4mac.py`** with the following options:
```
$ cd /where/'build.sh'/exists
-$ ./build4mac.py -q qt6brew -r hb34 -p hb313
+$ ./build4mac.py -q qt6brew -r hb34 -p hb314
```
2. Confirm successful build (it will take about one hour, depending on your machine spec).
3. Rerun **`build4mac.py`** with the same options used in 1. PLUS "-Y" to deploy executables and libraries 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 hb34 -p hb313 -Y
+$ ./build4mac.py -q qt6brew -r hb34 -p hb314 -Y
```
The application bundle **`klayout.app`** is located under:
- **`LW-qt6Brew.pkg.macos-Sequoia-release-Rhb34Phb313`** directory, where
+ **`LW-qt6Brew.pkg.macos-Sequoia-C32-release-Rhb34Phb314`** directory, where
* "LW-" means this is a lightweight package.
* "qt6Brew" means that Qt6 from Homebrew is used.
-* "Rhb34Phb313" means that Ruby is 3.4 from Homebrew; Python is 3.13 from Homebrew.
+* "C32" means that the coordinate representation is a 32-bit integer (C64, for 64-bit).
+* "Rhb34Phb314" means that Ruby is 3.4 from Homebrew; Python is 3.14 from Homebrew.
4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation.
> [!WARNING]
-> We can no longer use the legacy **pip** command with Homebew Python@3.13, and we will get,
+> We can no longer use the legacy **pip** command with Homebew Python@3.12-, and we will get,
> ```
> error: externally-managed-environment
> ```
@@ -264,9 +268,10 @@ $ ./build4mac.py -q qt6brew -r sys -p hb311
$ ./build4mac.py -q qt6brew -r sys -p hb311 -y
```
The application bundle **`klayout.app`** is located under:
- **`HW-qt6Brew.pkg.macos-Sequoia-release-RsysPhb311`** directory, where
+ **`HW-qt6Brew.pkg.macos-Sequoia-C32-release-RsysPhb311`** directory, where
* "HW-" means this is a heavyweight package because both Qt6 and Python Frameworks are deployed.
* "qt6Brew" means that Qt6 from Homebrew is used.
+* "C32" means that the coordinate representation is a 32-bit integer (C64, for 64-bit).
* "RsysPhb311" means that Ruby is OS-bundled; Python is 3.11 from Homebrew.
4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation.
> [!IMPORTANT]
@@ -306,9 +311,10 @@ $ ./build4mac.py -q qt5macports -r sys -p hb311
$ ./build4mac.py -q qt5macports -r sys -p hb311 -y
```
The application bundle **`klayout.app`** is located under:
- **`HW-qt5MP.pkg.macos-Sequoia-release-RsysPhb311`** directory, where
+ **`HW-qt5MP.pkg.macos-Sequoia-C32-release-RsysPhb311`** directory, where
* "HW-" means this is a heavyweight package because both Qt5 and Python Frameworks are deployed.
* "qt5MP" means that Qt5 from MacPorts is used.
+* "C32" means that the coordinate representation is a 32-bit integer (C64, for 64-bit).
* "RsysPhb311" means that Ruby is OS-bundled; Python is 3.11 from Homebrew.
4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation.
@@ -355,9 +361,10 @@ $ ./build4mac.py -q qt6ana3 -r ana3 -p ana3
$ ./build4mac.py -q qt6ana3 -r ana3 -p ana3 -Y
```
The application bundle **`klayout.app`** is located under:
- **`LW-qt6Ana3.pkg.macos-Sequoia-release-Rana3Pana3`** directory, where
+ **`LW-qt6Ana3.pkg.macos-Sequoia-C32-release-Rana3Pana3`** directory, where
* "LW-" means this is a lightweight package.
* "qt6Ana3" means that Qt6 from Anaconda3 is used.
+* "C32" means that the coordinate representation is a 32-bit integer (C64, for 64-bit).
* "Rana3Pana3" means that Ruby (3.4) is from Anaconda3; Python (3.13) is from Anaconda3.
4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation.
5. Now, you need to create an Automator wrapper app (Launcher) to start the application.
@@ -420,11 +427,11 @@ makeDMG4mac.py -> macbuild/makeDMG4mac.py
2. Invoke **`makeDMG4mac.py`** with -p and -m options, for example,
```
$ cd /where/'build.sh'/exists
-$ ./makeDMG4mac.py -p LW-qt5MP.pkg.macos-Sequoia-release-Rmp34Pmp313 -m
+$ ./makeDMG4mac.py -p LW-qt5MP.pkg.macos-Sequoia-C32-release-Rmp34Pmp314 -m
```
This command will generate the two files below:
-* **`LW-klayout-0.30.5-macOS-Sequoia-1-qt5MP-Rmp34Pmp313.dmg`** ---(1) the main DMG file
-* **`LW-klayout-0.30.5-macOS-Sequoia-1-qt5MP-Rmp34Pmp313.dmg.md5`** ---(2) MD5-value text file
+* **`LW-klayout-0.30.9-macOS-Sequoia-C32-1-qt5MP-Rmp34Pmp314.dmg`** ---(1) the main DMG file
+* **`LW-klayout-0.30.9-macOS-Sequoia-C32-1-qt5MP-Rmp34Pmp314.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.
diff --git a/macbuild/Resources/KLayoutDMG-BackQt5-Mx.logoist b/macbuild/Resources/KLayoutDMG-BackQt5-Mx.logoist
index 3c0a6aa8a..2b2497513 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt5-Mx.logoist and b/macbuild/Resources/KLayoutDMG-BackQt5-Mx.logoist differ
diff --git a/macbuild/Resources/KLayoutDMG-BackQt5-Mx.png b/macbuild/Resources/KLayoutDMG-BackQt5-Mx.png
index 239bac023..35104b9a2 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt5-Mx.png and b/macbuild/Resources/KLayoutDMG-BackQt5-Mx.png differ
diff --git a/macbuild/Resources/KLayoutDMG-BackQt5-X86.logoist b/macbuild/Resources/KLayoutDMG-BackQt5-X86.logoist
index a2a6f5fd2..ebe600916 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt5-X86.logoist and b/macbuild/Resources/KLayoutDMG-BackQt5-X86.logoist differ
diff --git a/macbuild/Resources/KLayoutDMG-BackQt5-X86.png b/macbuild/Resources/KLayoutDMG-BackQt5-X86.png
index 49c9d6365..75e04fac8 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt5-X86.png and b/macbuild/Resources/KLayoutDMG-BackQt5-X86.png differ
diff --git a/macbuild/Resources/KLayoutDMG-BackQt6-Mx.logoist b/macbuild/Resources/KLayoutDMG-BackQt6-Mx.logoist
index fd54e99c2..c106f9dcc 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt6-Mx.logoist and b/macbuild/Resources/KLayoutDMG-BackQt6-Mx.logoist differ
diff --git a/macbuild/Resources/KLayoutDMG-BackQt6-Mx.png b/macbuild/Resources/KLayoutDMG-BackQt6-Mx.png
index 3c90f7394..ee82af618 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt6-Mx.png and b/macbuild/Resources/KLayoutDMG-BackQt6-Mx.png differ
diff --git a/macbuild/Resources/KLayoutDMG-BackQt6-X86.logoist b/macbuild/Resources/KLayoutDMG-BackQt6-X86.logoist
index 14ad62250..057691342 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt6-X86.logoist and b/macbuild/Resources/KLayoutDMG-BackQt6-X86.logoist differ
diff --git a/macbuild/Resources/KLayoutDMG-BackQt6-X86.png b/macbuild/Resources/KLayoutDMG-BackQt6-X86.png
index d266966e5..c03eeb31c 100644
Binary files a/macbuild/Resources/KLayoutDMG-BackQt6-X86.png and b/macbuild/Resources/KLayoutDMG-BackQt6-X86.png differ
diff --git a/macbuild/Resources/script-bundle-A.zip b/macbuild/Resources/script-bundle-A.zip
index ec40f25b0..ab8995a9e 100644
Binary files a/macbuild/Resources/script-bundle-A.zip and b/macbuild/Resources/script-bundle-A.zip differ
diff --git a/macbuild/Resources/script-bundle-B.zip b/macbuild/Resources/script-bundle-B.zip
index 4428a3f0e..c36c28205 100644
Binary files a/macbuild/Resources/script-bundle-B.zip and b/macbuild/Resources/script-bundle-B.zip differ
diff --git a/macbuild/Resources/script-bundle-H.zip b/macbuild/Resources/script-bundle-H.zip
index b25794db4..e04e7ac85 100644
Binary files a/macbuild/Resources/script-bundle-H.zip and b/macbuild/Resources/script-bundle-H.zip differ
diff --git a/macbuild/Resources/script-bundle-P.zip b/macbuild/Resources/script-bundle-P.zip
index faa4c33e6..511ef145b 100644
Binary files a/macbuild/Resources/script-bundle-P.zip and b/macbuild/Resources/script-bundle-P.zip differ
diff --git a/macbuild/Resources/script-bundle-S.zip b/macbuild/Resources/script-bundle-S.zip
index c9f66a282..4cf6283f5 100644
Binary files a/macbuild/Resources/script-bundle-S.zip and b/macbuild/Resources/script-bundle-S.zip differ
diff --git a/macbuild/build4mac.py b/macbuild/build4mac.py
index 056fc29e2..c62eda994 100755
--- a/macbuild/build4mac.py
+++ b/macbuild/build4mac.py
@@ -5,7 +5,7 @@
# File: "macbuild/build4mac.py"
#
# The top Python script for building KLayout (http://www.klayout.de/index.php).
-# version 0.30.5 or later on different Apple Mac OSX platforms.
+# version 0.30.9 or later on different Apple Mac OSX platforms.
#===============================================================================
import sys
import os
@@ -36,7 +36,7 @@ from bundle_qtconf import generate_qtconf, QtConfError
# @return (usage, moduleset)-tuple
#-------------------------------------------------------------------------------
def GenerateUsage(platform):
- if platform.upper() in [ "TAHOE", "SEQUOIA", "SONOMA", "VENTURA", "MONTEREY" ]: # with Xcode [13.1 .. ]
+ if platform.upper() in [ "GOLDENGATE", "TAHOE", "SEQUOIA", "SONOMA", "VENTURA", "MONTEREY" ]: # with Xcode [13.1 .. ]
myQt56 = "qt5macports"
myRuby = "sys"
myPython = "sys"
@@ -47,7 +47,7 @@ def GenerateUsage(platform):
usage = "\n"
usage += "-----------------------------------------------------------------------------------------------------------\n"
usage += "<< Usage of 'build4mac.py' >>\n"
- usage += " for building KLayout 0.30.5 or later on different Apple macOS platforms.\n"
+ usage += " for building KLayout 0.30.9 or later on different Apple macOS platforms.\n"
usage += "\n"
usage += "$ [python] ./build4mac.py\n"
usage += " option & argument : descriptions (refer to 'macbuild/build4mac_env.py' for details) | default value\n"
@@ -63,27 +63,27 @@ def GenerateUsage(platform):
usage += " : (*) migration to Qt6 is ongoing |\n"
usage += " [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP34', 'HB34', 'Ana3'] | %s\n" % myRuby
usage += " : nil: don't bind Ruby |\n"
- usage += " : Sys: use [Tahoe|Sequoia|Sonoma]-bundled Ruby 2.6 |\n"
+ usage += " : Sys: use [GoldenGate|Tahoe|Sequoia|Sonoma]-bundled Ruby 2.6 |\n"
usage += " : MP34: use Ruby 3.4 from MacPorts |\n"
usage += " : HB34: use Ruby 3.4 from Homebrew |\n"
usage += " : Ana3: use Ruby 3.4 from Anaconda3 |\n"
- usage += " [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP313', 'HB313', 'Ana3', | %s\n" % myPython
- usage += " : 'MP312', 'MP312', |\n"
- usage += " : 'MP311', 'HB311', 'HBAuto'] |\n"
+ usage += " [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP314', 'HB314', 'Ana3', | %s\n" % myPython
+ usage += " : 'MP313', 'HB313', |\n"
+ usage += " : 'HB311', 'HBAuto'] |\n"
usage += " : nil: don't bind Python |\n"
- usage += " : Sys: use [Tahoe|Sequoia|Sonoma]-bundled Python 3.9 |\n"
+ usage += " : Sys: use [GoldenGate|Tahoe|Sequoia|Sonoma]-bundled Python 3.9 |\n"
+ usage += " : MP314: use Python 3.14 from MacPorts |\n"
+ usage += " : HB314: use Python 3.14 from Homebrew |\n"
+ usage += " : Ana3: use Python 3.13 from Anaconda3 |\n"
usage += " : MP313: use Python 3.13 from MacPorts |\n"
usage += " : HB313: use Python 3.13 from Homebrew |\n"
- usage += " : Ana3: use Python 3.13 from Anaconda3 |\n"
- usage += " : MP312: use Python 3.12 from MacPorts |\n"
- usage += " : HB312: use Python 3.12 from Homebrew |\n"
- usage += " : MP311: use Python 3.11 from MacPorts |\n"
usage += " : HB311: use Python 3.11 from Homebrew (+) |\n"
usage += " : (+) required to provide the legacy pip in HW-*.dmg |\n"
usage += " : HBAuto: use the latest Python 3.x auto-detected from Homebrew |\n"
usage += " [-P|--buildPymod] : build and deploy Pymod (*.whl) for LW-*.dmg | disabled\n"
usage += " [-n|--noqtbinding] : don't create Qt bindings for ruby scripts | disabled\n"
usage += " [-u|--noqtuitools] : don't include uitools in Qt binding | disabled\n"
+ usage += " [-s|--no32bitcoord] : don't use short (32bit) coordinates; use long (64bit) instead | disabled\n"
usage += " [-g|--nolibgit2] : don't include libgit2 for Git package support | disabled\n"
usage += " [-m|--make ] : option passed to 'make' | '--jobs=4'\n"
usage += " [-d|--debug] : enable debug mode build; AddressSanitizer (ASAN) is linked | disabled\n"
@@ -123,7 +123,9 @@ def Get_Default_Config():
# Dropped [ElCapitan - BigSur] (2023-10-24).
# See 415b5aa2efca04928f1148a69e77efd5d76f8c1d for the previous states.
#----------------------------------------------------------------------------
- if release == 25:
+ if release == 27:
+ Platform = "GoldenGate"
+ elif release == 25:
Platform = "Tahoe"
elif release == 24:
Platform = "Sequoia"
@@ -142,7 +144,7 @@ def Get_Default_Config():
if not Machine == "x86_64":
# with an Apple Silicon Chip?
- if Machine == "arm64" and Platform in ["Tahoe", "Sequoia", "Sonoma", "Ventura", "Monterey"]:
+ if Machine == "arm64" and Platform in ["GoldenGate", "Tahoe", "Sequoia", "Sonoma", "Ventura", "Monterey"]:
print("")
print( "### Your Mac equips an Apple Silicon Chip ###" )
print( " Setting QMAKE_APPLE_DEVICE_ARCHS=arm64\n")
@@ -160,7 +162,11 @@ def Get_Default_Config():
ToolDebug = list()
# Set the default modules
- if Platform == "Tahoe":
+ if Platform == "GoldenGate":
+ ModuleQt = "Qt5MacPorts"
+ ModuleRuby = "Sys"
+ ModulePython = "Sys"
+ elif Platform == "Tahoe":
ModuleQt = "Qt5MacPorts"
ModuleRuby = "Sys"
ModulePython = "Sys"
@@ -189,6 +195,7 @@ def Get_Default_Config():
NonOSStdLang = False
NoQtBindings = False
NoQtUiTools = False
+ No32bitCoord = False
NoLibGit2 = False
MakeOptions = "--jobs=4"
DebugMode = False
@@ -214,6 +221,7 @@ def Get_Default_Config():
config['NonOSStdLang'] = NonOSStdLang # True if non-OS-standard language is chosen
config['NoQtBindings'] = NoQtBindings # True if not creating Qt bindings for Ruby scripts
config['NoQtUiTools'] = NoQtUiTools # True if not to include QtUiTools in Qt binding
+ config['No32bitCoord'] = No32bitCoord # True if not use the short (32bit) coordinate
config['NoLibGit2'] = NoLibGit2 # True if not to include libgit2 for Git package support
config['MakeOptions'] = MakeOptions # options passed to `make`
config['DebugMode'] = DebugMode # True if debug mode build
@@ -259,6 +267,7 @@ def Parse_CLI_Args(config):
NonOSStdLang = config['NonOSStdLang']
NoQtBindings = config['NoQtBindings']
NoQtUiTools = config['NoQtUiTools']
+ No32bitCoord = config['No32bitCoord']
NoLibGit2 = config['NoLibGit2']
MakeOptions = config['MakeOptions']
DebugMode = config['DebugMode']
@@ -287,7 +296,7 @@ def Parse_CLI_Args(config):
p.add_option( '-p', '--python',
dest='type_python',
- help="Python type=['nil', 'Sys', 'MP313', 'HB313', 'Ana3', 'MP312', 'HB312', 'MP311', 'HB311', 'HBAuto']" )
+ help="Python type=['nil', 'Sys', 'MP314', 'HB314', 'Ana3', 'MP313', 'HB313', 'HB311', 'HBAuto']" )
p.add_option( '-P', '--buildPymod',
action='store_true',
@@ -307,6 +316,12 @@ def Parse_CLI_Args(config):
default=False,
help="don't include uitools in Qt binding" )
+ p.add_option( '-s', '--no32bitcoord',
+ action='store_true',
+ dest='no_32_bitcoord',
+ default=False,
+ help="don't use short (32bit) coordinates; use long (64bit) instead " )
+
p.add_option( '-g', '--nolibgit2',
action='store_true',
dest='no_libgit2',
@@ -356,13 +371,14 @@ def Parse_CLI_Args(config):
default=False,
help='check usage' )
- if Platform.upper() in [ "TAHOE", "SEQUOIA", "SONOMA", "VENTURA", "MONTEREY" ]: # with Xcode [13.1 .. ]
+ if Platform.upper() in [ "GOLDENGATE", "TAHOE", "SEQUOIA", "SONOMA", "VENTURA", "MONTEREY" ]: # with Xcode [13.1 .. ]
p.set_defaults( type_qt = "qt5macports",
type_ruby = "sys",
type_python = "sys",
build_pymod_whl = False,
no_qt_binding = False,
no_qt_uitools = False,
+ no_32_bitcoord = False,
no_libgit2 = False,
make_option = "--jobs=4",
debug_build = False,
@@ -432,7 +448,9 @@ def Parse_CLI_Args(config):
if choiceRuby == "nil":
ModuleRuby = 'nil'
elif choiceRuby == "Sys":
- if Platform == "Tahoe":
+ if Platform == "GoldenGate":
+ ModuleRuby = 'RubyGoldenGate'
+ elif Platform == "Tahoe":
ModuleRuby = 'RubyTahoe'
elif Platform == "Sequoia":
ModuleRuby = 'RubySequoia'
@@ -465,12 +483,11 @@ def Parse_CLI_Args(config):
candidates = dict()
candidates['NIL'] = 'nil'
candidates['SYS'] = 'Sys'
+ candidates['MP314'] = 'MP314'
+ candidates['HB314'] = 'HB314'
+ candidates['ANA3'] = 'Ana3'
candidates['MP313'] = 'MP313'
candidates['HB313'] = 'HB313'
- candidates['ANA3'] = 'Ana3'
- candidates['MP312'] = 'MP312'
- candidates['HB312'] = 'HB312'
- candidates['MP311'] = 'MP311'
candidates['HB311'] = 'HB311'
candidates['HBAUTO'] = 'HBAuto'
try:
@@ -484,7 +501,10 @@ def Parse_CLI_Args(config):
ModulePython = 'nil'
OSPython3FW = None
elif choicePython == "Sys":
- if Platform == "Tahoe":
+ if Platform == "GoldenGate":
+ ModulePython = 'PythonGoldenGate'
+ OSPython3FW = GoldenGatePy3FW
+ elif Platform == "Tahoe":
ModulePython = 'PythonTahoe'
OSPython3FW = TahoePy3FW
elif Platform == "Sequoia":
@@ -499,12 +519,12 @@ def Parse_CLI_Args(config):
elif Platform == "Monterey":
ModulePython = 'PythonMonterey'
OSPython3FW = MontereyPy3FW
- elif choicePython == "MP313":
- ModulePython = 'Python313MacPorts'
+ elif choicePython == "MP314":
+ ModulePython = 'Python314MacPorts'
OSPython3FW = None
NonOSStdLang = True
- elif choicePython == "HB313":
- ModulePython = 'Python313Brew'
+ elif choicePython == "HB314":
+ ModulePython = 'Python314Brew'
OSPython3FW = None
NonOSStdLang = True
elif choicePython == "Ana3":
@@ -514,12 +534,12 @@ def Parse_CLI_Args(config):
ModulePython = 'PythonAnaconda3V6'
OSPython3FW = None
NonOSStdLang = True
- elif choicePython == "MP312":
- ModulePython = 'Python312MacPorts'
+ elif choicePython == "MP313":
+ ModulePython = 'Python313MacPorts'
OSPython3FW = None
NonOSStdLang = True
- elif choicePython == "HB312":
- ModulePython = 'Python312Brew'
+ elif choicePython == "HB313":
+ ModulePython = 'Python313Brew'
OSPython3FW = None
NonOSStdLang = True
elif choicePython == "HB311":
@@ -544,6 +564,7 @@ def Parse_CLI_Args(config):
BuildPymodWhl = opt.build_pymod_whl
NoQtBindings = opt.no_qt_binding
NoQtUiTools = opt.no_qt_uitools
+ No32bitCoord = opt.no_32_bitcoord
NoLibGit2 = opt.no_libgit2
MakeOptions = opt.make_option
DebugMode = opt.debug_build
@@ -630,6 +651,7 @@ def Parse_CLI_Args(config):
config['NonOSStdLang'] = NonOSStdLang
config['NoQtBindings'] = NoQtBindings
config['NoQtUiTools'] = NoQtUiTools
+ config['No32bitCoord'] = No32bitCoord
config['NoLibGit2'] = NoLibGit2
config['MakeOptions'] = MakeOptions
config['DebugMode'] = DebugMode
@@ -674,6 +696,7 @@ def Get_Build_Parameters(config):
ModuleSet = config['ModuleSet']
NoQtBindings = config['NoQtBindings']
NoQtUiTools = config['NoQtUiTools']
+ No32bitCoord = config['No32bitCoord']
NoLibGit2 = config['NoLibGit2']
MakeOptions = config['MakeOptions']
DebugMode = config['DebugMode']
@@ -701,34 +724,46 @@ def Get_Build_Parameters(config):
(qt, ruby, python) = ModuleSet # ( 'qt6Brew', 'Sys', 'Sys' )
ruby_python = "R%sP%s" % ( ruby.lower(), python.lower() )
- # (C) Target directories and files
- MacPkgDir = "%s%s.pkg.macos-%s-%s-%s" % (PackagePrefix, qt, Platform, mode, ruby_python)
- MacBinDir = "%s.bin.macos-%s-%s-%s" % ( qt, Platform, mode, ruby_python)
- MacBuildDir = "%s.build.macos-%s-%s-%s" % ( qt, Platform, mode, ruby_python)
- MacBuildLog = "%s.build.macos-%s-%s-%s.log" % ( qt, Platform, mode, ruby_python)
+ # (C) Coordinate size
+ if No32bitCoord:
+ coordSize = "C64"
+ else:
+ coordSize = "C32"
+
+ # (D) Target directories and files
+ MacPkgDir = "%s%s.pkg.macos-%s-%s-%s-%s" % (PackagePrefix, qt, Platform, coordSize, mode, ruby_python)
+ MacBinDir = "%s.bin.macos-%s-%s-%s-%s" % ( qt, Platform, coordSize, mode, ruby_python)
+ MacBuildDir = "%s.build.macos-%s-%s-%s-%s" % ( qt, Platform, coordSize, mode, ruby_python)
+ MacBuildLog = "%s.build.macos-%s-%s-%s-%s.log" % ( qt, Platform, coordSize, mode, ruby_python)
MacBuildDirQAT = MacBuildDir + ".macQAT"
parameters['bin'] = MacBinDir
parameters['build'] = MacBuildDir
parameters['logfile'] = MacBuildLog
- # (D) about Qt[5|6]
+ # (E) about Qt[5|6]
parameters['qmake'] = Qt56Dictionary[ModuleQt]['qmake']
parameters['deploy_tool'] = Qt56Dictionary[ModuleQt]['deploy']
parameters['qt_lib_root'] = Qt56Dictionary[ModuleQt]['libdir']
- # (E) rpath
+ # (F) rpath
if OSPython3FW in [ MontereyPy3FW, VenturaPy3FW, SonomaPy3FW, SequoiaPy3FW, TahoePy3FW ]:
parameters['rpath'] = OSPython3FW
else:
parameters['rpath'] = "@executable_path/../Frameworks"
- # (F) want Qt bindings with Ruby scripts?
+ # (G) want Qt bindings with Ruby scripts?
parameters['no_qt_bindings'] = NoQtBindings
- # (G) want QtUiTools?
+ # (H) want QtUiTools?
parameters['no_qt_uitools'] = NoQtUiTools
- # (H) options to `make` tool
+ # (I) want 32bitCoord?
+ parameters['no_32_bitcoord'] = No32bitCoord
+
+ # (J) want libgit2?
+ parameters['no_libgit2'] = NoLibGit2
+
+ # (K) options to `make` tool
if not MakeOptions == "":
parameters['make_options'] = MakeOptions
try:
@@ -739,7 +774,7 @@ def Get_Build_Parameters(config):
else:
parameters['num_parallel'] = pnum
- # (I) about Ruby
+ # (L) about Ruby
if ModuleRuby != "nil":
parameters['ruby'] = RubyDictionary[ModuleRuby]['exe']
parameters['rbinc'] = RubyDictionary[ModuleRuby]['inc']
@@ -747,7 +782,7 @@ def Get_Build_Parameters(config):
if 'inc2' in RubyDictionary[ModuleRuby]:
parameters['rbinc2'] = RubyDictionary[ModuleRuby]['inc2']
- # (J) about Python
+ # (M) about Python
if ModulePython != "nil":
parameters['python'] = PythonDictionary[ModulePython]['exe']
parameters['pyinc'] = PythonDictionary[ModulePython]['inc']
@@ -759,28 +794,28 @@ def Get_Build_Parameters(config):
config['MacBuildDirQAT'] = MacBuildDirQAT # relative path to build directory for QATest
config['MacBuildLog'] = MacBuildLog # relative path to build log file
- # (K) Extra parameters needed for deployment
+ # (N) Extra parameters needed for deployment
parameters['project_dir'] = ProjectDir
- # (L) Extra parameters needed for
+ # (O) Extra parameters needed for
# will be built if:
# BuildPymodWhl = True
- # Platform = [ 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]
- # ModuleRuby = [ 'Ruby34MacPorts', 'Ruby34Brew', 'RubyAnaconda3' ]
- # ModulePython = [ 'Python313MacPorts', 'Python312MacPorts', 'Python311MacPorts',
- # 'Python313Brew', 'Python312Brew', 'Python311Brew',
- # 'PythonAnaconda3' ]
+ # Platform = [ 'GoldenGate', 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]
+ # ModuleRuby = [ 'Ruby34MacPorts', 'Ruby34Brew', 'RubyAnaconda3V5', 'RubyAnaconda3V6' ]
+ # ModulePython = [ 'Python314MacPorts', 'Python313MacPorts',
+ # 'Python314Brew', 'Python313Brew', 'Python311Brew',
+ # 'PythonAnaconda3V5', 'PythonAnaconda3V6' ]
parameters['BuildPymodWhl'] = BuildPymodWhl
parameters['Platform'] = Platform
parameters['ModuleRuby'] = ModuleRuby
parameters['ModulePython'] = ModulePython
PymodDistDir = dict()
- if Platform in [ 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]:
+ if Platform in [ 'GoldenGate', 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]:
if ModuleRuby in [ 'Ruby34MacPorts', 'Ruby34Brew', 'RubyAnaconda3V5', 'RubyAnaconda3V6' ]:
- if ModulePython in [ 'Python313MacPorts', 'Python312MacPorts', 'Python311MacPorts' ]:
+ if ModulePython in [ 'Python314MacPorts', 'Python313MacPorts' ]:
PymodDistDir[ModulePython] = 'dist-MP3-%s' % ModuleQt
- elif ModulePython in [ 'Python313Brew', 'Python312Brew', 'Python311Brew' ]:
+ elif ModulePython in [ 'Python314Brew', 'Python313Brew', 'Python311Brew' ]:
PymodDistDir[ModulePython] = 'dist-HB3-%s' % ModuleQt
elif ModulePython in [ 'PythonAnaconda3V5', 'PythonAnaconda3V6' ]:
PymodDistDir[ModulePython] = 'dist-ana3-%s' % ModuleQt
@@ -799,10 +834,10 @@ def Build_pymod_wheel(parameters):
#-----------------------------------------------------------------------------------------------------------
# [1] will be built if:
# BuildPymodWhl = True
- # Platform = [ 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]
+ # Platform = [ 'GoldenGate', 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]
# ModuleRuby = [ 'Ruby34MacPorts', 'Ruby34Brew', 'RubyAnaconda3V5', 'RubyAnaconda3V6' ]
- # ModulePython = [ 'Python313MacPorts', 'Python312MacPorts', 'Python311MacPorts',
- # 'Python313Brew', 'Python312Brew', 'Python311Brew',
+ # ModulePython = [ 'Python314MacPorts', 'Python313MacPorts',
+ # 'Python314Brew', 'Python313Brew', 'Python311Brew',
# 'PythonAnaconda3V5', 'PythonAnaconda3V6' ]
#-----------------------------------------------------------------------------------------------------------
BuildPymodWhl = parameters['BuildPymodWhl']
@@ -811,12 +846,12 @@ def Build_pymod_wheel(parameters):
ModulePython = parameters['ModulePython']
if not BuildPymodWhl:
return 0
- if not Platform in [ 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]:
+ if not Platform in [ 'GoldenGate', 'Tahoe', 'Sequoia', 'Sonoma', 'Ventura', 'Monterey' ]:
return 0
elif not ModuleRuby in [ 'Ruby34MacPorts', 'Ruby34Brew', 'RubyAnaconda3V5', 'RubyAnaconda3V6' ]:
return 0
- elif not ModulePython in [ 'Python313MacPorts', 'Python312MacPorts', 'Python311MacPorts', \
- 'Python313Brew', 'Python312Brew', 'Python311Brew', \
+ elif not ModulePython in [ 'Python314MacPorts', 'Python313MacPorts', \
+ 'Python314Brew', 'Python313Brew', 'Python311Brew', \
'PythonAnaconda3V5', 'PythonAnaconda3V6' ]:
return 0
@@ -1124,25 +1159,31 @@ def Run_Build_Command(config, parameters):
cmd_args += " \\\n -build %s" % parameters['build']
cmd_args += " \\\n -rpath %s" % parameters['rpath']
- # (E) want Qt bindings with Ruby scripts?
+ # (F) want Qt bindings with Ruby scripts?
if parameters['no_qt_bindings']:
cmd_args += " \\\n -without-qtbinding"
else:
cmd_args += " \\\n -with-qtbinding"
- # (F) want QtUiTools?
+ # (G) want QtUiTools?
if parameters['no_qt_uitools']:
cmd_args += " \\\n -without-qt-uitools"
- # (G) don't want to use libgit2?
- if NoLibGit2:
- cmd_args += " \\\n -libgit2"
+ # (I) want 32bitCoord?
+ if parameters['no_32_bitcoord']:
+ cmd_args += " \\\n -with-64bit-coord" # EXPERIMENTAL FEATURE
+ else:
+ cmd_args += " \\\n -without-64bit-coord" # default
- # (H) options to `make` tool
+ # (J) want libgit2?
+ if parameters['no_libgit2']:
+ cmd_args += " \\\n -nolibgit2"
+
+ # (K) options to `make` tool
if 'make_options' in parameters:
cmd_args += " \\\n -option %s" % parameters['make_options']
- # (I) about Ruby
+ # (L) about Ruby
if 'ruby' in parameters:
cmd_args += " \\\n -ruby %s" % parameters['ruby']
cmd_args += " \\\n -rbinc %s" % parameters['rbinc']
@@ -1152,7 +1193,7 @@ def Run_Build_Command(config, parameters):
else:
cmd_args += " \\\n -noruby"
- # (J) about Python
+ # (M) about Python
if 'python' in parameters:
cmd_args += " \\\n -python %s" % parameters['python']
cmd_args += " \\\n -pyinc %s" % parameters['pyinc']
@@ -1645,9 +1686,10 @@ def Deploy_Binaries_For_Bundle(config, parameters):
regQt = re.compile(patQt)
# (4) Python frameworks (only for Homebrew) # in the case of Intel Mac...
- libPy3_1 = "%s/" % HBPython312FrameworkPath # /usr/local/opt/python@3.12/Frameworks/Python.framework/
- libPy3_2 = "%s/" % HBPython311FrameworkPath # /usr/local/opt/python@3.11/Frameworks/Python.framework/
- patPy3 = r'^(%s|%s)(.+)' % (libPy3_1, libPy3_2)
+ libPy3_1 = "%s/" % HBPython314FrameworkPath # /usr/local/opt/python@3.14/Frameworks/Python.framework/
+ libPy3_2 = "%s/" % HBPython313FrameworkPath # /usr/local/opt/python@3.13/Frameworks/Python.framework/
+ libPy3_3 = "%s/" % HBPython311FrameworkPath # /usr/local/opt/python@3.11/Frameworks/Python.framework/
+ patPy3 = r'^(%s|%s|%s)(.+)' % (libPy3_1, libPy3_2, libPy3_3)
regPy3 = re.compile(patPy3)
#-------------------------------------------------------------------------------
@@ -2285,7 +2327,7 @@ def Deploy_Binaries_For_Bundle(config, parameters):
#-------------------------------------------------------------
# [11] Sign the application bundle
#-------------------------------------------------------------
- if Platform in ['Tahoe']:
+ if Platform in ['GoldenGate', 'Tahoe']:
print( " [11] Signing the macOS application bundle (ad-hoc) after all post-build edits (install_name_tool/strip)..." )
appbundle = "%s/klayout.app" % AbsMacPkgDir
res = Sign_App_Bundle(appbundle)
diff --git a/macbuild/build4mac_env.py b/macbuild/build4mac_env.py
index f09f8bbb4..9b3e7fcd3 100755
--- a/macbuild/build4mac_env.py
+++ b/macbuild/build4mac_env.py
@@ -6,7 +6,7 @@
#
# Here are dictionaries of ...
# different modules for building KLayout (http://www.klayout.de/index.php)
-# version 0.30.5 or later on different Apple Mac OSX platforms.
+# version 0.30.9 or later on different Apple Mac OSX platforms.
#
# This file is imported by the 'build4mac.py' script.
#===============================================================================
@@ -255,7 +255,7 @@ Qt56Dictionary = { 'Qt5MacPorts': Qt5MacPorts,
# for the previous states.
#-----------------------------------------------------
RubyNil = [ 'nil' ]
-RubySys = [ 'RubyMonterey', 'RubyVentura', 'RubySonoma', 'RubySequoia', 'RubyTahoe' ]
+RubySys = [ 'RubyMonterey', 'RubyVentura', 'RubySonoma', 'RubySequoia', 'RubyTahoe', 'RubyGoldenGate' ]
RubyExt = [ 'Ruby34MacPorts', 'Ruby34Brew', 'RubyAnaconda3' ]
Rubies = RubyNil + RubySys + RubyExt
@@ -324,11 +324,21 @@ RubyTahoe = { 'exe': '/System/Library/Frameworks/Ruby.framework/Versions
'lib': '%s/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.tbd' % TahoeXcSDK
}
+# Bundled with Golden Gate (27.x)
+# [Key Type Name] = 'Sys'
+GoldenGateXcSDK = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"
+GoldenGateCLTSDK = "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"
+RubyGoldenGate = { 'exe': '/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby',
+ 'inc': '%s/System/Library/Frameworks/Ruby.framework/Headers' % GoldenGateXcSDK,
+ 'inc2': '%s/System/Library/Frameworks/Ruby.framework/Headers/ruby' % GoldenGateXcSDK,
+ 'lib': '%s/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.tbd' % GoldenGateXcSDK
+ }
+
# Ruby 3.4 from MacPorts (https://www.macports.org/)
# install with 'sudo port install ruby34'
# [Key Type Name] = 'MP34'
Ruby34MacPorts = { 'exe': '/opt/local/bin/ruby3.4',
- 'inc': '/opt/local/include/ruby-3.4.9',
+ 'inc': '/opt/local/include/ruby-3.4.10',
'lib': '/opt/local/lib/libruby.3.4.dylib'
}
@@ -361,6 +371,7 @@ RubyDictionary = { 'nil' : None,
'RubySonoma' : RubySonoma,
'RubySequoia' : RubySequoia,
'RubyTahoe' : RubyTahoe,
+ 'RubyGoldenGate' : RubyGoldenGate,
'Ruby34MacPorts' : Ruby34MacPorts,
'Ruby34Brew' : Ruby34Brew,
'RubyAnaconda3V5' : RubyAnaconda3V5,
@@ -376,9 +387,9 @@ RubyDictionary = { 'nil' : None,
# for the previous states.
#-----------------------------------------------------
PythonNil = [ 'nil' ]
-PythonSys = [ 'PythonMonterey', 'PythonVentura', 'PythonSonoma', 'PythonSequoia', 'PythonTahoe' ]
-PythonExt = [ 'Python311MacPorts', 'Python312MacPorts', 'Python313MacPorts' ]
-PythonExt += [ 'Python311Brew', 'Python312Brew', 'Python313Brew', 'PythonAutoBrew' ]
+PythonSys = [ 'PythonMonterey', 'PythonVentura', 'PythonSonoma', 'PythonSequoia', 'PythonTahoe', 'PythonGoldenGate' ]
+PythonExt = [ 'Python314MacPorts', 'Python313MacPorts' ]
+PythonExt += [ 'Python314Brew', 'Python313Brew', 'Python311Brew', 'PythonAutoBrew' ]
PythonExt += [ 'PythonAnaconda3' ]
Pythons = PythonNil + PythonSys + PythonExt
@@ -430,20 +441,21 @@ PythonTahoe = { 'exe': '%s/Python3.framework/Versions/3.9/bin/python3.9' %
'lib': '%s/Python3.framework/Versions/3.9/lib/libpython3.9.dylib' % TahoePy3FW
}
-# Python 3.11 from MacPorts (https://www.macports.org/)
-# install with 'sudo port install python311'
-# [Key Type Name] = 'MP311'
-Python311MacPorts = { 'exe': '/opt/local/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11',
- 'inc': '/opt/local/Library/Frameworks/Python.framework/Versions/3.11/include/python3.11',
- 'lib': '/opt/local/Library/Frameworks/Python.framework/Versions/3.11/lib/libpython3.11.dylib'
+# Bundled with Golden Gate (27.x)
+# [Key Type Name] = 'Sys'
+GoldenGatePy3FWXc = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks"
+GoldenGatePy3FW = "/Library/Developer/CommandLineTools/Library/Frameworks"
+PythonGoldenGate = { 'exe': '%s/Python3.framework/Versions/3.9/bin/python3.9' % GoldenGatePy3FW,
+ 'inc': '%s/Python3.framework/Versions/3.9/include/python3.9' % GoldenGatePy3FW,
+ 'lib': '%s/Python3.framework/Versions/3.9/lib/libpython3.9.dylib' % GoldenGatePy3FW
}
-# Python 3.12 from MacPorts (https://www.macports.org/)
-# install with 'sudo port install python312'
-# [Key Type Name] = 'MP312'
-Python312MacPorts = { 'exe': '/opt/local/Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12',
- 'inc': '/opt/local/Library/Frameworks/Python.framework/Versions/3.12/include/python3.12',
- 'lib': '/opt/local/Library/Frameworks/Python.framework/Versions/3.12/lib/libpython3.12.dylib'
+# Python 3.14 from MacPorts (https://www.macports.org/)
+# install with 'sudo port install python314'
+# [Key Type Name] = 'MP314'
+Python314MacPorts = { 'exe': '/opt/local/Library/Frameworks/Python.framework/Versions/3.14/bin/python3.14',
+ 'inc': '/opt/local/Library/Frameworks/Python.framework/Versions/3.14/include/python3.14',
+ 'lib': '/opt/local/Library/Frameworks/Python.framework/Versions/3.14/lib/libpython3.14.dylib'
}
# Python 3.13 from MacPorts (https://www.macports.org/)
@@ -454,22 +466,13 @@ Python313MacPorts = { 'exe': '/opt/local/Library/Frameworks/Python.framework/Ver
'lib': '/opt/local/Library/Frameworks/Python.framework/Versions/3.13/lib/libpython3.13.dylib'
}
-# Python 3.11 from Homebrew
-# install with 'brew install python@3.11'
-# [Key Type Name] = 'HB311'
-HBPython311FrameworkPath = '%s/opt/python@3.11/Frameworks/Python.framework' % DefaultHomebrewRoot
-Python311Brew = { 'exe': '%s/Versions/3.11/bin/python3.11' % HBPython311FrameworkPath,
- 'inc': '%s/Versions/3.11/include/python3.11' % HBPython311FrameworkPath,
- 'lib': '%s/Versions/3.11/lib/libpython3.11.dylib' % HBPython311FrameworkPath
- }
-
-# Python 3.12 from Homebrew
-# install with 'brew install python@3.12'
-# [Key Type Name] = 'HB312'
-HBPython312FrameworkPath = '%s/opt/python@3.12/Frameworks/Python.framework' % DefaultHomebrewRoot
-Python312Brew = { 'exe': '%s/Versions/3.12/bin/python3.12' % HBPython312FrameworkPath,
- 'inc': '%s/Versions/3.12/include/python3.12' % HBPython312FrameworkPath,
- 'lib': '%s/Versions/3.12/lib/libpython3.12.dylib' % HBPython312FrameworkPath
+# Python 3.14 from Homebrew
+# install with 'brew install python@3.14'
+# [Key Type Name] = 'HB314'
+HBPython314FrameworkPath = '%s/opt/python@3.14/Frameworks/Python.framework' % DefaultHomebrewRoot
+Python314Brew = { 'exe': '%s/Versions/3.14/bin/python3.14' % HBPython314FrameworkPath,
+ 'inc': '%s/Versions/3.14/include/python3.14' % HBPython314FrameworkPath,
+ 'lib': '%s/Versions/3.14/lib/libpython3.14.dylib' % HBPython314FrameworkPath
}
# Python 3.13 from Homebrew
@@ -481,6 +484,15 @@ Python313Brew = { 'exe': '%s/Versions/3.13/bin/python3.13' % HBPython313Fram
'lib': '%s/Versions/3.13/lib/libpython3.13.dylib' % HBPython313FrameworkPath
}
+# Python 3.11 from Homebrew
+# install with 'brew install python@3.11'
+# [Key Type Name] = 'HB311'
+HBPython311FrameworkPath = '%s/opt/python@3.11/Frameworks/Python.framework' % DefaultHomebrewRoot
+Python311Brew = { 'exe': '%s/Versions/3.11/bin/python3.11' % HBPython311FrameworkPath,
+ 'inc': '%s/Versions/3.11/include/python3.11' % HBPython311FrameworkPath,
+ 'lib': '%s/Versions/3.11/lib/libpython3.11.dylib' % HBPython311FrameworkPath
+ }
+
# Python 3.13 installed under [/opt|/Applications]/anaconda3/klayout-qt[5|6]
# See the [Qt5] [Qt6] section above.
# [Key Type Name] = 'Ana3'
@@ -551,13 +563,13 @@ PythonDictionary = { 'nil' : None,
'PythonSonoma' : PythonSonoma,
'PythonSequoia' : PythonSequoia,
'PythonTahoe' : PythonTahoe,
+ 'PythonGoldenGate' : PythonGoldenGate,
+ 'Python314MacPorts' : Python314MacPorts,
'Python313MacPorts' : Python313MacPorts,
+ 'Python314Brew' : Python314Brew,
'Python313Brew' : Python313Brew,
'PythonAnaconda3V5' : PythonAnaconda3V5,
'PythonAnaconda3V6' : PythonAnaconda3V6,
- 'Python312MacPorts' : Python312MacPorts,
- 'Python312Brew' : Python312Brew,
- 'Python311MacPorts' : Python311MacPorts,
'Python311Brew' : Python311Brew
}
if _have_Homebrew_Python:
diff --git a/macbuild/build4mac_util.py b/macbuild/build4mac_util.py
index 545c0dc4a..0043682ef 100755
--- a/macbuild/build4mac_util.py
+++ b/macbuild/build4mac_util.py
@@ -6,7 +6,7 @@
#
# Here are utility functions and classes ...
# for building KLayout (http://www.klayout.de/index.php)
-# version 0.30.5 or later on different Apple Mac OSX platforms.
+# version 0.30.9 or later on different Apple Mac OSX platforms.
#
# This file is imported by 'build4mac.py' script.
#========================================================================================
diff --git a/macbuild/makeDMG4mac.py b/macbuild/makeDMG4mac.py
index b0e567240..d69b926f8 100755
--- a/macbuild/makeDMG4mac.py
+++ b/macbuild/makeDMG4mac.py
@@ -78,13 +78,13 @@ def SetGlobals():
Usage = "\n"
Usage += "---------------------------------------------------------------------------------------------------------\n"
Usage += "<< Usage of 'makeDMG4mac.py' >>\n"
- Usage += " for making a DMG file of KLayout 0.30.5 or later on different Apple macOS platforms.\n"
+ Usage += " for making a DMG file of KLayout 0.30.9 or later on different Apple macOS 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 'LW-qt5MP.pkg.macos-Sequoia-release-Rmp34Pmp313' | \n"
+ Usage += " : like 'LW-qt5MP.pkg.macos-Sequoia-C32-release-Rmp34Pmp314' | \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"
@@ -106,7 +106,11 @@ def SetGlobals():
release = int( Release.split(".")[0] ) # take the first of ['21', '0', '0']
LatestOS = ""
- if release == 25:
+ if release == 27:
+ GenOSName = "macOS"
+ Platform = "GoldenGate"
+ LatestOS = Platform
+ elif release == 25:
GenOSName = "macOS"
Platform = "Tahoe"
LatestOS = Platform
@@ -135,7 +139,7 @@ def SetGlobals():
if not Machine == "x86_64":
# with an Apple Silicon Chip?
- if Machine == "arm64" and Platform in ["Tahoe", "Sequoia", "Sonoma", "Ventura", "Monterey"]:
+ if Machine == "arm64" and Platform in ["GoldenGate", "Tahoe", "Sequoia", "Sonoma", "Ventura", "Monterey"]:
print("")
print( "### Your Mac equips an Apple Silicon Chip ###" )
print("")
@@ -222,17 +226,17 @@ def SetGlobals():
## To check the contents of the package directory
#
# The package directory name should look like:
-# * ST-qt5MP.pkg.macos-Sequoia-release-RsysPsys
-# * LW-qt5Ana3.pkg.macos-Sequoia-release-Rana3Pana3
-# * LW-qt6Brew.pkg.macos-Sequoia-release-Rhb34Phb312 --- (1)
-# * LW-qt5MP.pkg.macos-Sequoia-release-Rmp33Pmp312
-# * HW-qt6Brew.pkg.macos-Sequoia-release-RsysPhb311
+# * ST-qt5MP.pkg.macos-Sequoia-C32-release-RsysPsys
+# * LW-qt5Ana3.pkg.macos-Sequoia-C32-release-Rana3Pana3
+# * LW-qt6Brew.pkg.macos-Sequoia-C32-release-Rhb34Phb312 --- (1)
+# * LW-qt5MP.pkg.macos-Sequoia-C32-release-Rmp33Pmp312
+# * HW-qt6Brew.pkg.macos-Sequoia-C32-release-RsysPhb311
#
-# * ST-qt6MP.pkg.macos-Sequoia-release-RsysPsys
-# * LW-qt6MP.pkg.macos-Sequoia-release-Rmp33Pmp312
+# * ST-qt6MP.pkg.macos-Sequoia-C32-release-RsysPsys
+# * LW-qt6MP.pkg.macos-Sequoia-C32-release-Rmp33Pmp312
#
# Generated DMG will be, for example,
-# (1) ---> LW-klayout-0.30.2-macOS-Sequoia-1-qt6Brew-Rhb34Phb312.dmg
+# (1) ---> LW-klayout-0.30.2-macOS-Sequoia-C32-1-qt6Brew-Rhb34Phb312.dmg
#
# @return on success, positive integer in [MB] that tells approx. occupied disc space;
# on failure, -1
@@ -247,6 +251,7 @@ def CheckPkgDirectory():
global BundleName
global PackagePrefix
global QtIdentification
+ global CoordSize
global BuildType
global RubyPythonID
global BackgroundPNG
@@ -272,18 +277,18 @@ def CheckPkgDirectory():
#-----------------------------------------------------------------------------------------------
# [2] Identify (Qt, Ruby, Python) from PkgDir
- # * ST-qt5MP.pkg.macos-Sequoia-release-RsysPsys
- # * LW-qt5Ana3.pkg.macos-Sequoia-release-Rana3Pana3
- # * LW-qt6Brew.pkg.macos-Sequoia-release-Rhb34Phb312
- # * LW-qt5MP.pkg.macos-Sequoia-release-Rmp33Pmp312
- # * HW-qt6Brew.pkg.macos-Sequoia-release-RsysPhb311
- # * EX-qt5MP.pkg.macos-Sequoia-release-Rhb34Pmp312
+ # * ST-qt5MP.pkg.macos-Sequoia-C32-release-RsysPsys
+ # * LW-qt5Ana3.pkg.macos-Sequoia-C32-release-Rana3Pana3
+ # * LW-qt6Brew.pkg.macos-Sequoia-C32-release-Rhb34Phb312
+ # * LW-qt5MP.pkg.macos-Sequoia-C32-release-Rmp33Pmp312
+ # * HW-qt6Brew.pkg.macos-Sequoia-C32-release-RsysPhb311
+ # * EX-qt5MP.pkg.macos-Sequoia-C32-release-Rhb34Pmp312
#
- # * ST-qt6MP.pkg.macos-Sequoia-release-RsysPsys
- # * LW-qt6MP.pkg.macos-Sequoia-release-Rmp33Pmp312
+ # * ST-qt6MP.pkg.macos-Sequoia-C32-release-RsysPsys
+ # * LW-qt6MP.pkg.macos-Sequoia-C32-release-Rmp33Pmp312
#-----------------------------------------------------------------------------------------------
- # 0 1 2 3 4 5 6 7
- patQRP = r'(ST|LW|HW|EX)([-])([qt5|qt6][0-9A-Za-z]+)([.]pkg[.])([A-Za-z]+[-][A-Za-z]+[-])(release|debug)([-])([0-9A-Za-z]+)'
+ # 0 1 2 3 4 5 6 7 8 9
+ patQRP = r'(ST|LW|HW|EX)([-])([qt5|qt6][0-9A-Za-z]+)([.]pkg[.])([A-Za-z]+[-][A-Za-z]+[-])(C32|C64)([-])(release|debug)([-])([0-9A-Za-z]+)'
regQRP = re.compile(patQRP)
if not regQRP.match(PkgDir):
print( "! Cannot identify (Qt, Ruby, Python) from the package directory name" )
@@ -309,14 +314,25 @@ def CheckPkgDirectory():
else:
BackgroundPNG = None
raise Exception( "! neither qt5 nor qt6" )
- if pkgdirComponents[5] == 'release':
+
+ if pkgdirComponents[5] == 'C32':
+ CoordSize = 'C32'
+ elif pkgdirComponents[5] == 'C64':
+ CoordSize = 'C64'
+ else:
+ CoordSize = None
+ raise Exception( "! neither C32 nor C64" )
+
+ RubyPythonID = pkgdirComponents[7]
+ if pkgdirComponents[7] == 'release':
BuildType = 'release'
- elif pkgdirComponents[5] == 'debug':
+ elif pkgdirComponents[7] == 'debug':
BuildType = 'debug'
else:
BuildType = None
raise Exception( "! neither release nor debug" )
- RubyPythonID = pkgdirComponents[7]
+
+ RubyPythonID = pkgdirComponents[9]
#-----------------------------------------------------------------------------
# [3] Check if the "LatestOS" with MacPorts / Homebrew / Anaconda3
@@ -329,12 +345,12 @@ def CheckPkgDirectory():
LatestOSMacPorts = Platform == LatestOS
LatestOSMacPorts &= PackagePrefix == "LW"
LatestOSMacPorts &= QtIdentification in [ "qt5MP", "qt6MP" ]
- LatestOSMacPorts &= RubyPythonID in [ "Rmp34Pmp313", "Rmp34Pmp312", "Rmp34Pmp311" ]
+ LatestOSMacPorts &= RubyPythonID in [ "Rmp34Pmp314", "Rmp34Pmp313" ]
LatestOSHomebrew = Platform == LatestOS
LatestOSHomebrew &= PackagePrefix == "LW"
LatestOSHomebrew &= QtIdentification in [ "qt5Brew", "qt6Brew", "qt5MP", "qt6MP" ] # "qt[5|6]MP" are the alternatives
- LatestOSHomebrew &= RubyPythonID in [ "Rhb34Phb313", "Rhb34Phb312", "Rhb34Phb311", "Rhb34Phbauto" ]
+ LatestOSHomebrew &= RubyPythonID in [ "Rhb34Phb314", "Rhb34Phb313", "Rhb34Phb311", "Rhb34Phbauto" ]
LatestOSAnaconda3 = Platform == LatestOS
LatestOSAnaconda3 &= PackagePrefix == "LW"
@@ -555,8 +571,8 @@ def ParseCommandLineArguments():
if opt.target_dmg != "":
TargetDMG = opt.target_dmg
else:
- TargetDMG = "%s-klayout-%s-%s-%s-%d-%s-%s.dmg" \
- % (PackagePrefix, KLVersion, GenOSName, Platform, DMGSerialNum, QtIdentification, RubyPythonID)
+ TargetDMG = "%s-klayout-%s-%s-%s-%s-%d-%s-%s.dmg" \
+ % (PackagePrefix, KLVersion, GenOSName, Platform, CoordSize, DMGSerialNum, QtIdentification, RubyPythonID)
if Machine == "arm64": # with an Apple Silicon Chip
TargetDMG = Machine + TargetDMG
if BuildType == "debug": # in the case of 'debug' build
diff --git a/macbuild/nightlyBuild.py b/macbuild/nightlyBuild.py
index 994dbc941..dad9a44d8 100755
--- a/macbuild/nightlyBuild.py
+++ b/macbuild/nightlyBuild.py
@@ -30,14 +30,16 @@ import pandas as pd
#
# @return matching platform name on success; "" on failure
#------------------------------------------------------------------------------
-def Test_My_Platform( platforms=[ 'Monterey', 'Ventura', 'Sonoma', 'Sequoia', 'Tahoe' ] ):
+def Test_My_Platform( platforms=[ 'Monterey', 'Ventura', 'Sonoma', 'Sequoia', 'Tahoe', 'GoldenGate' ] ):
(System, Node, Release, MacVersion, Machine, Processor) = platform.uname()
if not System == "Darwin":
return ""
release = int( Release.split(".")[0] ) # take the first of ['21', '0', '0']
- if release == 25:
+ if release == 27:
+ Platform = "GoldenGate"
+ elif release == 25:
Platform = "Tahoe"
elif release == 24:
Platform = "Sequoia"
@@ -80,12 +82,13 @@ def Get_Build_Target_Dict():
#
# @param[in] targetDic build target dictionary
# @param[in] platform platform name
+# @param[in] coordsize coordinate size (default='C32')
#
# @return (dictionary1, dictionary2)-tupple
# dictionary1: key=(qtVer, mnemonic, bdType), value=build option list
# dictionary2: key=(qtVer, mnemonic, bdType), value=log file name
#------------------------------------------------------------------------------
-def Get_Build_Options( targetDic, platform ):
+def Get_Build_Options( targetDic, platform, coordsize='C32'):
buildOp = dict()
logfile = dict()
@@ -99,49 +102,49 @@ def Get_Build_Options( targetDic, platform ):
target = targetDic[key]
if target == "std":
buildOp[(qtVer, "std", "r")] = [ '-q', '%sMacPorts' % qtType, '-r', 'sys', '-p', 'sys' ]
- logfile[(qtVer, "std", "r")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPsys")
+ logfile[(qtVer, "std", "r")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "RsysPsys")
buildOp[(qtVer, "std", "d")] = [ '-q', '%sMacPorts' % qtType, '-r', 'sys', '-p', 'sys', '--debug' ]
- logfile[(qtVer, "std", "d")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "RsysPsys")
+ logfile[(qtVer, "std", "d")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "RsysPsys")
elif target == "ports":
- buildOp[(qtVer, "ports", "r")] = [ '-q', '%sMacPorts' % qtType, '-r', 'MP34', '-p', 'MP313' ]
- logfile[(qtVer, "ports", "r")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rmp34Pmp313")
- buildOp[(qtVer, "ports", "d")] = [ '-q', '%sMacPorts' % qtType, '-r', 'MP34', '-p', 'MP313', '--debug' ]
- logfile[(qtVer, "ports", "d")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "Rmp34Pmp313")
+ buildOp[(qtVer, "ports", "r")] = [ '-q', '%sMacPorts' % qtType, '-r', 'MP34', '-p', 'MP314' ]
+ logfile[(qtVer, "ports", "r")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "Rmp34Pmp314")
+ buildOp[(qtVer, "ports", "d")] = [ '-q', '%sMacPorts' % qtType, '-r', 'MP34', '-p', 'MP314', '--debug' ]
+ logfile[(qtVer, "ports", "d")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "Rmp34Pmp314")
elif target == "brew":
- buildOp[(qtVer, "brew", "r")] = [ '-q', '%sBrew' % qtType, '-r', 'HB34', '-p', 'HB313' ]
- logfile[(qtVer, "brew", "r")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rhb34Phb313")
- buildOp[(qtVer, "brew", "d")] = [ '-q', '%sBrew' % qtType, '-r', 'HB34', '-p', 'HB313', '--debug' ]
- logfile[(qtVer, "brew", "d")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "Rhb34Phb313")
+ buildOp[(qtVer, "brew", "r")] = [ '-q', '%sBrew' % qtType, '-r', 'HB34', '-p', 'HB314' ]
+ logfile[(qtVer, "brew", "r")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "Rhb34Phb314")
+ buildOp[(qtVer, "brew", "d")] = [ '-q', '%sBrew' % qtType, '-r', 'HB34', '-p', 'HB314', '--debug' ]
+ logfile[(qtVer, "brew", "d")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "Rhb34Phb314")
elif target == "brewHW":
buildOp[(qtVer, "brewHW", "r")] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HB311' ]
- logfile[(qtVer, "brewHW", "r")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPhb311")
+ logfile[(qtVer, "brewHW", "r")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "RsysPhb311")
buildOp[(qtVer, "brewHW", "d")] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HB311', '--debug' ]
- logfile[(qtVer, "brewHW", "d")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "RsysPhb311")
+ logfile[(qtVer, "brewHW", "d")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "RsysPhb311")
elif target == "ana3":
buildOp[(qtVer, "ana3", "r")] = [ '-q', '%sAna3' % qtType, '-r', 'Ana3', '-p', 'Ana3' ]
- logfile[(qtVer, "ana3", "r")] = "%sAna3.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rana3Pana3")
+ logfile[(qtVer, "ana3", "r")] = "%sAna3.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "Rana3Pana3")
buildOp[(qtVer, "ana3", "d")] = [ '-q', '%sAna3' % qtType, '-r', 'Ana3', '-p', 'Ana3', '--debug' ]
- logfile[(qtVer, "ana3", "d")] = "%sAna3.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "Rana3Pana3")
+ logfile[(qtVer, "ana3", "d")] = "%sAna3.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "Rana3Pana3")
elif target == "brewA":
buildOp[(qtVer, "brewA", "r")] = [ '-q', '%sBrew' % qtType, '-r', 'HB34', '-p', 'HBAuto' ]
- logfile[(qtVer, "brewA", "r")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rhb34Phbauto")
+ logfile[(qtVer, "brewA", "r")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "Rhb34Phbauto")
buildOp[(qtVer, "brewA", "d")] = [ '-q', '%sBrew' % qtType, '-r', 'HB34', '-p', 'HBAuto', '--debug' ]
- logfile[(qtVer, "brewA", "d")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "Rhb34Phbauto")
+ logfile[(qtVer, "brewA", "d")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "Rhb34Phbauto")
elif target == "brewAHW":
buildOp[(qtVer, "brewAHW", "r")] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HBAuto' ]
- logfile[(qtVer, "brewAHW", "r")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPhbauto")
+ logfile[(qtVer, "brewAHW", "r")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "RsysPhbauto")
buildOp[(qtVer, "brewAHW", "d")] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HBAuto', '--debug' ]
- logfile[(qtVer, "brewAHW", "d")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "RsysPhbauto")
+ logfile[(qtVer, "brewAHW", "d")] = "%sBrew.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "RsysPhbauto")
elif target == "pbrew":
- buildOp[(qtVer, "pbrew", "r")] = [ '-q', '%sMacPorts' % qtType, '-r', 'HB34', '-p', 'HB313' ]
- logfile[(qtVer, "pbrew", "r")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rhb34Phb313")
- buildOp[(qtVer, "pbrew", "d")] = [ '-q', '%sMacPorts' % qtType, '-r', 'HB34', '-p', 'HB313', '--debug' ]
- logfile[(qtVer, "pbrew", "d")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "Rhb34Phb313")
+ buildOp[(qtVer, "pbrew", "r")] = [ '-q', '%sMacPorts' % qtType, '-r', 'HB34', '-p', 'HB314' ]
+ logfile[(qtVer, "pbrew", "r")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "Rhb34Phb314")
+ buildOp[(qtVer, "pbrew", "d")] = [ '-q', '%sMacPorts' % qtType, '-r', 'HB34', '-p', 'HB314', '--debug' ]
+ logfile[(qtVer, "pbrew", "d")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "Rhb34Phb314")
elif target == "pbrewHW":
buildOp[(qtVer, "pbrewHW", "r")] = [ '-q', '%sMacPorts' % qtType, '-r', 'sys', '-p', 'HB311' ]
- logfile[(qtVer, "pbrewHW", "r")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPhb311")
+ logfile[(qtVer, "pbrewHW", "r")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "release", "RsysPhb311")
buildOp[(qtVer, "pbrewHW", "d")] = [ '-q', '%sMacPorts' % qtType, '-r', 'sys', '-p', 'HB311', '--debug' ]
- logfile[(qtVer, "pbrewHW", "d")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "debug", "RsysPhb311")
+ logfile[(qtVer, "pbrewHW", "d")] = "%sMP.build.macos-%s-%s-%s-%s.log" % (qtType.lower(), platform, coordsize, "debug", "RsysPhb311")
if WithPymod:
buildOp[(qtVer, "ports", "r")] = buildOp[(qtVer, "ports", "r")] + ['--buildPymod']
@@ -161,10 +164,11 @@ def Get_Build_Options( targetDic, platform ):
#
# @param[in] targetDic build target dictionary
# @param[in] platform platform name
+# @param[in] coordsize coordinate size (default='C32')
#
# @return a dictionary; key=(qtVer, mnemonic, bdType), value=".macQAT" directory
#------------------------------------------------------------------------------
-def Get_QAT_Directory( targetDic, platform ):
+def Get_QAT_Directory( targetDic, platform, coordsize='C32' ):
dirQAT = dict()
for qtVer in [5, 6]:
@@ -176,32 +180,32 @@ def Get_QAT_Directory( targetDic, platform ):
for key in targetDic.keys():
target = targetDic[key]
if target == "std":
- dirQAT[(qtVer, "std", "r")] = '%sMP.build.macos-%s-release-RsysPsys.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "std", "d")] = '%sMP.build.macos-%s-debug-RsysPsys.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "std", "r")] = '%sMP.build.macos-%s-%s-release-RsysPsys.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "std", "d")] = '%sMP.build.macos-%s-%s-debug-RsysPsys.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "ports":
- dirQAT[(qtVer, "ports", "r")] = '%sMP.build.macos-%s-release-Rmp34Pmp313.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "ports", "d")] = '%sMP.build.macos-%s-debug-Rmp34Pmp313.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "ports", "r")] = '%sMP.build.macos-%s-%s-release-Rmp34Pmp314.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "ports", "d")] = '%sMP.build.macos-%s-%s-debug-Rmp34Pmp314.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "brew":
- dirQAT[(qtVer, "brew", "r")] = '%sBrew.build.macos-%s-release-Rhb34Phb313.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "brew", "d")] = '%sBrew.build.macos-%s-debug-Rhb34Phb313.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "brew", "r")] = '%sBrew.build.macos-%s-%s-release-Rhb34Phb314.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "brew", "d")] = '%sBrew.build.macos-%s-%s-debug-Rhb34Phb314.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "brewHW":
- dirQAT[(qtVer, "brewHW", "r")] = '%sBrew.build.macos-%s-release-RsysPhb311.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "brewHW", "d")] = '%sBrew.build.macos-%s-debug-RsysPhb311.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "brewHW", "r")] = '%sBrew.build.macos-%s-%s-release-RsysPhb311.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "brewHW", "d")] = '%sBrew.build.macos-%s-%s-debug-RsysPhb311.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "ana3":
- dirQAT[(qtVer, "ana3", "r")] = '%sAna3.build.macos-%s-release-Rana3Pana3.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "ana3", "d")] = '%sAna3.build.macos-%s-debug-Rana3Pana3.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "ana3", "r")] = '%sAna3.build.macos-%s-%s-release-Rana3Pana3.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "ana3", "d")] = '%sAna3.build.macos-%s-%s-debug-Rana3Pana3.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "brewA":
- dirQAT[(qtVer, "brewA", "r")] = '%sBrew.build.macos-%s-release-Rhb34Phbauto.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "brewA", "d")] = '%sBrew.build.macos-%s-debug-Rhb34Phbauto.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "brewA", "r")] = '%sBrew.build.macos-%s-%s-release-Rhb34Phbauto.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "brewA", "d")] = '%sBrew.build.macos-%s-%s-debug-Rhb34Phbauto.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "brewAHW":
- dirQAT[(qtVer, "brewAHW", "r")] = '%sBrew.build.macos-%s-release-RsysPhbauto.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "brewAHW", "d")] = '%sBrew.build.macos-%s-debug-RsysPhbauto.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "brewAHW", "r")] = '%sBrew.build.macos-%s-%s-release-RsysPhbauto.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "brewAHW", "d")] = '%sBrew.build.macos-%s-%s-debug-RsysPhbauto.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "pbrew":
- dirQAT[(qtVer, "pbrew", "r")] = '%sMP.build.macos-%s-release-Rhb34Phb313.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "pbrew", "d")] = '%sMP.build.macos-%s-debug-Rhb34Phb313.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "pbrew", "r")] = '%sMP.build.macos-%s-%s-release-Rhb34Phb314.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "pbrew", "d")] = '%sMP.build.macos-%s-%s-debug-Rhb34Phb314.macQAT' % (qtType.lower(), platform, coordsize)
elif target == "pbrewHW":
- dirQAT[(qtVer, "pbrewHW", "r")] = '%sMP.build.macos-%s-release-RsysPhb311.macQAT' % (qtType.lower(), platform)
- dirQAT[(qtVer, "pbrewHW", "d")] = '%sMP.build.macos-%s-debug-RsysPhb311.macQAT' % (qtType.lower(), platform)
+ dirQAT[(qtVer, "pbrewHW", "r")] = '%sMP.build.macos-%s-%s-release-RsysPhb311.macQAT' % (qtType.lower(), platform, coordsize)
+ dirQAT[(qtVer, "pbrewHW", "d")] = '%sMP.build.macos-%s-%s-debug-RsysPhb311.macQAT' % (qtType.lower(), platform, coordsize)
return dirQAT
@@ -212,10 +216,11 @@ def Get_QAT_Directory( targetDic, platform ):
# @param[in] platform platform name
# @param[in] srlDMG serial number of DMG
# @param[in] makeflag True to make; False to clean
+# @param[in] coordsize coordinate size (default='C32')
#
# @return a dictionary; key=(qtVer, mnemonic, bdType), value=build option list
#------------------------------------------------------------------------------
-def Get_Package_Options( targetDic, platform, srlDMG, makeflag ):
+def Get_Package_Options( targetDic, platform, srlDMG, makeflag, coordsize='C32' ):
packOp = dict()
if makeflag:
@@ -232,49 +237,49 @@ def Get_Package_Options( targetDic, platform, srlDMG, makeflag ):
for key in targetDic.keys():
target = targetDic[key]
if target == "std":
- packOp[(qtVer, "std", "r")] = [ '-p', 'ST-%sMP.pkg.macos-%s-release-RsysPsys' % (qtType.lower(), platform),
+ packOp[(qtVer, "std", "r")] = [ '-p', 'ST-%sMP.pkg.macos-%s-%s-release-RsysPsys' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "std", "d")] = [ '-p', 'ST-%sMP.pkg.macos-%s-debug-RsysPsys' % (qtType.lower(), platform),
+ packOp[(qtVer, "std", "d")] = [ '-p', 'ST-%sMP.pkg.macos-%s-%s-debug-RsysPsys' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "ports":
- packOp[(qtVer, "ports", "r")] = [ '-p', 'LW-%sMP.pkg.macos-%s-release-Rmp34Pmp313' % (qtType.lower(), platform),
+ packOp[(qtVer, "ports", "r")] = [ '-p', 'LW-%sMP.pkg.macos-%s-%s-release-Rmp34Pmp314' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "ports", "d")] = [ '-p', 'LW-%sMP.pkg.macos-%s-debug-Rmp34Pmp313' % (qtType.lower(), platform),
+ packOp[(qtVer, "ports", "d")] = [ '-p', 'LW-%sMP.pkg.macos-%s-%s-debug-Rmp34Pmp314' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "brew":
- packOp[(qtVer, "brew", "r")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-release-Rhb34Phb313' % (qtType.lower(), platform),
+ packOp[(qtVer, "brew", "r")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-%s-release-Rhb34Phb314' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "brew", "d")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-debug-Rhb34Phb313' % (qtType.lower(), platform),
+ packOp[(qtVer, "brew", "d")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-%s-debug-Rhb34Phb314' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "brewHW":
- packOp[(qtVer, "brewHW", "r")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-release-RsysPhb311' % (qtType.lower(), platform),
+ packOp[(qtVer, "brewHW", "r")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-%s-release-RsysPhb311' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "brewHW", "d")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-debug-RsysPhb311' % (qtType.lower(), platform),
+ packOp[(qtVer, "brewHW", "d")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-%s-debug-RsysPhb311' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "ana3":
- packOp[(qtVer, "ana3", "r")] = [ '-p', 'LW-%sAna3.pkg.macos-%s-release-Rana3Pana3' % (qtType.lower(), platform),
+ packOp[(qtVer, "ana3", "r")] = [ '-p', 'LW-%sAna3.pkg.macos-%s-%s-release-Rana3Pana3' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "ana3", "d")] = [ '-p', 'LW-%sAna3.pkg.macos-%s-debug-Rana3Pana3' % (qtType.lower(), platform),
+ packOp[(qtVer, "ana3", "d")] = [ '-p', 'LW-%sAna3.pkg.macos-%s-%s-debug-Rana3Pana3' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "brewA":
- packOp[(qtVer, "brewA", "r")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-release-Rhb34Phbauto' % (qtType.lower(), platform),
+ packOp[(qtVer, "brewA", "r")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-%s-release-Rhb34Phbauto' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "brewA", "d")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-debug-Rhb34Phbauto' % (qtType.lower(), platform),
+ packOp[(qtVer, "brewA", "d")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-%s-debug-Rhb34Phbauto' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "brewAHW":
- packOp[(qtVer, "brewAHW", "r")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-release-RsysPhbauto' % (qtType.lower(), platform),
+ packOp[(qtVer, "brewAHW", "r")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-%s-release-RsysPhbauto' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "brewAHW", "d")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-debug-RsysPhbauto' % (qtType.lower(), platform),
+ packOp[(qtVer, "brewAHW", "d")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-%s-debug-RsysPhbauto' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "pbrew":
- packOp[(qtVer, "pbrew", "r")] = [ '-p', 'LW-%sMP.pkg.macos-%s-release-Rhb34Phb313' % (qtType.lower(), platform),
+ packOp[(qtVer, "pbrew", "r")] = [ '-p', 'LW-%sMP.pkg.macos-%s-%s-release-Rhb34Phb314' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "pbrew", "d")] = [ '-p', 'LW-%sMP.pkg.macos-%s-debug-Rhb34Phb313' % (qtType.lower(), platform),
+ packOp[(qtVer, "pbrew", "d")] = [ '-p', 'LW-%sMP.pkg.macos-%s-%s-debug-Rhb34Phb314' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
elif target == "pbrewHW":
- packOp[(qtVer, "pbrewHW", "r")] = [ '-p', 'HW-%sMP.pkg.macos-%s-release-RsysPhb311' % (qtType.lower(), platform),
+ packOp[(qtVer, "pbrewHW", "r")] = [ '-p', 'HW-%sMP.pkg.macos-%s-%s-release-RsysPhb311' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
- packOp[(qtVer, "pbrewHW", "d")] = [ '-p', 'HW-%sMP.pkg.macos-%s-debug-RsysPhb311' % (qtType.lower(), platform),
+ packOp[(qtVer, "pbrewHW", "d")] = [ '-p', 'HW-%sMP.pkg.macos-%s-%s-debug-RsysPhb311' % (qtType.lower(), platform, coordsize),
'-s', '%d' % srlDMG, '%s' % flag ]
return packOp
@@ -299,7 +304,7 @@ def Parse_CommandLine_Arguments():
global DryRun # True for dry-run
platform = Test_My_Platform()
- if platform in [ "Tahoe", "Sequoia", "Sonoma", "Ventura", "Monterey" ]:
+ if platform in [ "GoldenGate", "Tahoe", "Sequoia", "Sonoma", "Ventura", "Monterey" ]:
targetopt = "0,1,2,13,4"
else:
targetopt = ""
@@ -308,7 +313,7 @@ def Parse_CommandLine_Arguments():
Usage += "----------------------------------------------------------------------------------------------------------\n"
Usage += " nightlyBuild.py [EXPERIMENTAL]\n"
Usage += " << To execute the jobs for making KLayout's DMGs for\n"
- Usage += " macOS Monterey, Ventura, Sonoma, or Sequoia >>\n"
+ Usage += " macOS Monterey, Ventura, Sonoma, Sequoia, Tahoe, or GoldenGate >>\n"
Usage += "\n"
Usage += "$ [python] nightlyBuild.py\n"
Usage += " option & argument : comment on option if any | default value\n"
@@ -343,7 +348,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.30.2' |\n"
+ Usage += " (6) $ ./nightlyBuild.py --upload '0.30.9' |\n"
Usage += " (7) $ ./nightlyBuild.py --cleandmg 1 |\n"
Usage += "-----------------------------------------------------------------------------+----------------------------\n"
@@ -434,7 +439,7 @@ def Parse_CommandLine_Arguments():
print(Usage)
sys.exit(0)
- myPlatform = Test_My_Platform( [ 'Monterey', 'Ventura', 'Sonoma', 'Sequoia', 'Tahoe' ] )
+ myPlatform = Test_My_Platform( [ '', 'Monterey', 'Ventura', 'Sonoma', 'Sequoia', 'Tahoe' ] )
if myPlatform == "":
print( "! Current platform is not [ 'Monterey', 'Ventura', 'Sonoma', 'Sequoia', 'Tahoe' ]" )
print(Usage)
diff --git a/macbuild/python3HB.py b/macbuild/python3HB.py
index 7015618b4..88f8b9b74 100755
--- a/macbuild/python3HB.py
+++ b/macbuild/python3HB.py
@@ -33,7 +33,7 @@ def SetGlobals():
Usage += "\n"
Usage += " option & argument : descriptions | default value\n"
Usage += " -------------------------------------------------------------------+---------------\n"
- Usage += " <-v|--version >: in ['3.11', '3.12','3.13'] | ''\n"
+ Usage += " <-v|--version >: in ['3.11', '3.12','3.13', '3.14'] | ''\n"
Usage += " [-u|-unlink] : unlink only | disabled\n"
Usage += " [-?|--?] : print this usage and exit | disabled\n"
Usage += "----------------------------------------------------------------------+-----------------\n"
@@ -49,7 +49,7 @@ def Parse_CLI_Args():
p.add_option( '-v', '--version',
dest='version',
- help="python3 version=['3.11', '3.12', '3.13']" )
+ help="python3 version=['3.11', '3.12', '3.13', '3.14']" )
p.add_option( '-u', '--unlink',
action='store_true',
@@ -74,7 +74,7 @@ def Parse_CLI_Args():
Version = opt.version
UnlinkOnly = opt.unlink
- if not Version in [ '3.11', '3.12', '3.13' ]:
+ if not Version in [ '3.11', '3.12', '3.13', '3.14' ]:
print( "! Unsupported Python 3 version <%s>" % Version )
print(Usage)
sys.exit(0)
diff --git a/src/buddies/src/bd/bdReaderOptions.cc b/src/buddies/src/bd/bdReaderOptions.cc
index f0a090310..11faf2573 100644
--- a/src/buddies/src/bd/bdReaderOptions.cc
+++ b/src/buddies/src/bd/bdReaderOptions.cc
@@ -112,6 +112,7 @@ GenericReaderOptions::GenericReaderOptions ()
m_lefdef_produce_special_routing = load_options.get_option_by_name ("lefdef_config.produce_special_routing").to_bool ();
m_lefdef_special_routing_suffix = load_options.get_option_by_name ("lefdef_config.special_routing_suffix_str").to_string ();
m_lefdef_special_routing_datatype = load_options.get_option_by_name ("lefdef_config.special_routing_datatype_str").to_string ();
+ m_lefdef_skip_duplicate_macros = load_options.get_option_by_name ("lefdef_config.skip_duplicate_macros").to_bool ();
tl::Variant lef_files = load_options.get_option_by_name ("lefdef_config.lef_files");
for (tl::Variant::const_iterator i = lef_files.begin (); i != lef_files.end (); ++i) {
@@ -653,9 +654,9 @@ GenericReaderOptions::add_options (tl::CommandLineOptions &cmd)
"\n"
"The following values are accepted for this option:\n"
"\n"
- "* 0: produce LEF geometry unless a FOREIGN cell is specified (the default)\n"
+ "* 0: produce LEF geometry unless a FOREIGN cell is specified\n"
"* 1: produce LEF geometry always and ignore FOREIGN\n"
- "* 2: Never produce LEF geometry and assume FOREIGN always\n"
+ "* 2: Never produce LEF geometry and assume FOREIGN always (the default)\n"
"\n"
"In case of FOREIGN macros in mode 0 or always in mode 2, the '--" + m_long_prefix + "lefdef-lef-layouts' option is available to specify "
"external layout files for providing the LEF macro layouts.\n"
@@ -686,6 +687,15 @@ GenericReaderOptions::add_options (tl::CommandLineOptions &cmd)
"See also '--" + m_long_prefix + "lefdef-read-lef-with-def' for an option to implicitly read all LEF files in the same "
"place than the DEF file.\n"
)
+ << tl::arg (group +
+ "#--" + m_long_prefix + "lefdef-skip-duplicate-macros", &m_lefdef_skip_duplicate_macros, "Skip duplicate LEF macros",
+ "This option applies when reading DEF files.\n"
+ "\n"
+ "If this option is present, having the same macro in different LEF files is a warning rather than being an error. "
+ "In that case, the first occurance is used. Use this option with care, as it may render invalid layouts when "
+ "the versions of the macro are defined differently. It is intended for cases, when macros with the same name are guaranteed "
+ "to be identical. KLayout does not check, if that is actually the case."
+ )
;
}
@@ -814,6 +824,7 @@ GenericReaderOptions::configure (db::LoadLayoutOptions &load_options)
load_options.set_option_by_name ("lefdef_config.macro_resolution_mode", m_lefdef_macro_resolution_mode);
load_options.set_option_by_name ("lefdef_config.macro_resolution_mode", m_lefdef_macro_resolution_mode);
load_options.set_option_by_name ("lefdef_config.paths_relative_to_cwd", true);
+ load_options.set_option_by_name ("lefdef_config.skip_duplicate_macros", m_lefdef_skip_duplicate_macros);
tl::Variant lef_layout_files = tl::Variant::empty_list ();
for (std::vector::const_iterator l = m_lefdef_lef_layout_files.begin (); l != m_lefdef_lef_layout_files.end (); ++l) {
diff --git a/src/buddies/src/bd/bdReaderOptions.h b/src/buddies/src/bd/bdReaderOptions.h
index 1bffd06fd..727778f6f 100644
--- a/src/buddies/src/bd/bdReaderOptions.h
+++ b/src/buddies/src/bd/bdReaderOptions.h
@@ -189,6 +189,7 @@ private:
std::vector m_lefdef_map_files;
int m_lefdef_macro_resolution_mode;
std::vector m_lefdef_lef_layout_files;
+ bool m_lefdef_skip_duplicate_macros;
};
/**
diff --git a/src/db/db/dbAsIfFlatRegion.cc b/src/db/db/dbAsIfFlatRegion.cc
index 37b1708ee..7ba74217e 100644
--- a/src/db/db/dbAsIfFlatRegion.cc
+++ b/src/db/db/dbAsIfFlatRegion.cc
@@ -1237,7 +1237,12 @@ AsIfFlatRegion::run_check (db::edge_relation_type rel, bool different_polygons,
different_polygons = true;
}
- bool needs_merged_primary = (! other && different_polygons) || options.needs_merged ();
+ // in some cases we need merged primary polygons:
+ // 1.) isolated check (same layer, but different polygons)
+ // 2.) options need merged edges (projection limits, rectangle filter, opposite filter)
+ // 3.) prop_ne constraint - in that case, merge must not be applied internally after properties have been separated
+ bool needs_merged_primary = (! other && different_polygons) || options.needs_merged () || pc_always_different (options.prop_constraint);
+
bool primary_is_merged = is_merged ();
db::RegionIterator polygons;
diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc
index bb739ed54..ea984a1a8 100644
--- a/src/db/db/dbDeepRegion.cc
+++ b/src/db/db/dbDeepRegion.cc
@@ -2405,7 +2405,12 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
// primary input
- bool needs_merged_primary = (! other_deep && different_polygons) || options.needs_merged ();
+ // in some cases we need merged primary polygons:
+ // 1.) isolated check (same layer, but different polygons)
+ // 2.) options need merged edges (projection limits, rectangle filter, opposite filter)
+ // 3.) prop_ne constraint - in that case, merge must not be applied internally after properties have been separated
+ bool needs_merged_primary = (! other_deep && different_polygons) || options.needs_merged () || pc_always_different (options.prop_constraint);
+
bool primary_is_merged = false;
db::DeepLayer polygons;
diff --git a/src/drc/unit_tests/drcSimpleTests.cc b/src/drc/unit_tests/drcSimpleTests.cc
index 5c61f7aa1..69a5c1d8b 100644
--- a/src/drc/unit_tests/drcSimpleTests.cc
+++ b/src/drc/unit_tests/drcSimpleTests.cc
@@ -2144,6 +2144,18 @@ TEST(151d_edges_from_region_with_properties)
run_test (_this, "151", true);
}
+// issue #2416
+TEST(152_sep_with_props)
+{
+ run_test (_this, "152", false);
+}
+
+TEST(152d_sep_with_props)
+{
+ run_test (_this, "152", true);
+}
+
+// issue #2423
TEST(153_issue_2423)
{
run_test (_this, "153", false);
diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc
index 299a24252..8657d3596 100644
--- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc
+++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.cc
@@ -597,6 +597,7 @@ LEFDEFReaderOptions::LEFDEFReaderOptions ()
m_special_routing_datatype (0),
m_separate_groups (false),
m_joined_paths (false),
+ m_skip_duplicate_macros (false),
m_macro_resolution_mode (0),
m_read_lef_with_def (true),
m_paths_relative_to_cwd (false),
@@ -682,6 +683,7 @@ LEFDEFReaderOptions &LEFDEFReaderOptions::operator= (const LEFDEFReaderOptions &
m_macro_layout_files = d.m_macro_layout_files;
m_read_lef_with_def = d.m_read_lef_with_def;
m_paths_relative_to_cwd = d.m_paths_relative_to_cwd;
+ m_skip_duplicate_macros = d.m_skip_duplicate_macros;
set_macro_layouts (d.macro_layouts ());
}
return *this;
@@ -1070,6 +1072,9 @@ LEFDEFReaderState::ensure_lef_importer (int warn_level)
{
if (! mp_lef_importer.get ()) {
mp_lef_importer.reset (new db::LEFImporter (warn_level));
+ if (mp_tech_comp) {
+ mp_lef_importer->set_skip_duplicate_macros (mp_tech_comp->skip_duplicate_macros ());
+ }
}
}
diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h
index 743612e68..25e8e058f 100644
--- a/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h
+++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFDEFImporter.h
@@ -896,6 +896,16 @@ public:
m_map_files = f;
}
+ bool skip_duplicate_macros () const
+ {
+ return m_skip_duplicate_macros;
+ }
+
+ void set_skip_duplicate_macros (bool v)
+ {
+ m_skip_duplicate_macros = v;
+ }
+
std::string single_map_file () const
{
return m_map_files.empty () ? std::string () : m_map_files.front ();
@@ -1055,6 +1065,7 @@ private:
bool m_separate_groups;
bool m_joined_paths;
std::vector m_map_files;
+ bool m_skip_duplicate_macros;
unsigned int m_macro_resolution_mode;
bool m_read_lef_with_def;
std::vector m_lef_files;
diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc
index ff4ceb531..4fb7de9d0 100644
--- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc
+++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc
@@ -34,7 +34,8 @@ namespace db
// LEFImporter implementation
LEFImporter::LEFImporter (int warn_level)
- : LEFDEFImporter (warn_level)
+ : LEFDEFImporter (warn_level),
+ m_skip_duplicate_macros (false)
{
// .. nothing yet ..
}
@@ -884,15 +885,20 @@ void
LEFImporter::read_macro (Layout &layout)
{
std::string mn = get ();
-
- if (m_macros.find (mn) != m_macros.end ()) {
- error (tl::to_string (tr ("Duplicate MACRO name: ")) + mn);
- }
-
set_cellname (mn);
- GeometryBasedLayoutGenerator *mg = new GeometryBasedLayoutGenerator ();
- reader_state ()->register_macro_cell (mn, mg);
+ GeometryBasedLayoutGenerator *mg = 0;
+
+ if (m_macros.find (mn) != m_macros.end ()) {
+ if (m_skip_duplicate_macros) {
+ warn (tl::to_string (tr ("Skipping duplicate MACRO: : ")) + mn + tl::to_string (tr (" (skip option is enabled by user)")));
+ } else {
+ error (tl::to_string (tr ("Duplicate MACRO name: ")) + mn);
+ }
+ } else {
+ mg = new GeometryBasedLayoutGenerator ();
+ reader_state ()->register_macro_cell (mn, mg);
+ }
db::Trans foreign_trans;
std::string foreign_name;
@@ -965,7 +971,7 @@ LEFImporter::read_macro (Layout &layout)
read_geometries (mg, layout.dbu (), LEFPins, &boxes_for_labels, prop_id);
for (std::map ::const_iterator b = boxes_for_labels.begin (); b != boxes_for_labels.end (); ++b) {
- if (! b->second.empty ()) {
+ if (mg && ! b->second.empty ()) {
mg->add_text (b->first, LEFLabel, db::Text (label.c_str (), db::Trans (b->second.center () - db::Point ())), 0, 0);
}
}
@@ -1052,7 +1058,9 @@ LEFImporter::read_macro (Layout &layout)
} else if (test ("FIXEDMASK")) {
- mg->set_fixedmask (true);
+ if (mg) {
+ mg->set_fixedmask (true);
+ }
expect (";");
} else {
@@ -1075,8 +1083,10 @@ LEFImporter::read_macro (Layout &layout)
}
- mg->add_box (std::string (), Outline, db::Box (-origin, -origin + size), 0, 0);
- mg->subtract_overlap_from_outline (m_overlap_layers);
+ if (mg) {
+ mg->add_box (std::string (), Outline, db::Box (-origin, -origin + size), 0, 0);
+ mg->subtract_overlap_from_outline (m_overlap_layers);
+ }
MacroDesc macro_desc;
macro_desc.foreign_name = foreign_name;
diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h
index 176648099..c3d04efdc 100644
--- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h
+++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h
@@ -147,6 +147,31 @@ public:
*/
void finish_lef (db::Layout &layout);
+ /**
+ * @brief Sets a flag indicating whether to skip duplicate macros
+ *
+ * With this flag set to true, macros are ignored when there already
+ * is a macro with the same name. Use this option with caution, as
+ * skipping is only permitted if both macros are identical. The
+ * LEF reader does not check this condition.
+ *
+ * The default is "false" (raise an error on duplicate macros).
+ */
+ void set_skip_duplicate_macros (bool f)
+ {
+ m_skip_duplicate_macros = f;
+ }
+
+ /**
+ * @brief Gets a flag indicating whether to skip duplicate macros
+ *
+ * See set_skip_duplicate_macros for an explanation of this flag.
+ */
+ bool skip_duplicate_macros () const
+ {
+ return m_skip_duplicate_macros;
+ }
+
protected:
void do_read (db::Layout &layout);
@@ -159,6 +184,7 @@ private:
std::map m_vias;
std::set m_routing_layers, m_cut_layers, m_overlap_layers;
std::map m_num_masks;
+ bool m_skip_duplicate_macros;
std::vector get_iteration (double dbu);
void read_geometries (GeometryBasedLayoutGenerator *lg, double dbu, LayerPurpose purpose, std::map *collect_bboxes = 0, properties_id_type prop_id = 0);
diff --git a/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc b/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc
index 0d1efba6b..a726396eb 100644
--- a/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc
+++ b/src/plugins/streamers/lefdef/db_plugin/gsiDeclDbLEFDEF.cc
@@ -967,6 +967,24 @@ gsi::Class decl_lefdef_config ("db", "LEFDEFReaderConfi
"\n"
"This property has been added in version 0.27. The ability to supply multiple files has been added in version 0.30.6.\n"
) +
+ gsi::method ("skip_duplicate_macros", &db::LEFDEFReaderOptions::skip_duplicate_macros,
+ "@brief Gets a value indicating wether to skip duplicate LEF Macro definitions.\n"
+ "If this property is 'true', having the same macro in different LEF files is a warning rather than being an error. "
+ "In that case, the first occurance is used. Use this option with care, as it may render invalid layouts when "
+ "the versions of the macro are defined differently. It is intended for cases, when macros with the same name are guaranteed "
+ "to be identical. KLayout does not check, if that is actually the case."
+ "\n"
+ "The default is 'false' (duplicate macro names are an error).\n"
+ "\n"
+ "This property has been added in version 0.30.x.\n"
+ ) +
+ gsi::method ("skip_duplicate_macros=", &db::LEFDEFReaderOptions::set_skip_duplicate_macros, gsi::arg ("skip_duplicate_macros"),
+ "@brief Sets a value indicating wether to skip duplicate LEF Macro definitions.\n"
+ "\n"
+ "See \\skip_duplicate_macros for a description of this property.\n"
+ "\n"
+ "This property has been added in version 0.30.11.\n"
+ ) +
gsi::method ("macro_resolution_mode", &db::LEFDEFReaderOptions::macro_resolution_mode,
"@brief Gets the macro resolution mode (LEF macros into DEF).\n"
"This property describes the way LEF macros are turned into layout cells when reading DEF. There "
diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc
index e5552338c..81c790077 100644
--- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc
+++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc
@@ -1199,3 +1199,54 @@ TEST(216_line_extensions)
run_test (_this, "issue-2075", "map:test.map+lef:test.lef+def:test.def", "au.oas", default_options (), false);
}
+// issue-2374 (skip duplicate LEF macro option)
+TEST(217_skip_duplicate_macro)
+{
+ std::string fn_path (tl::testdata ());
+ fn_path += "/lefdef/issue-2374/";
+
+ db::LEFDEFReaderOptions lefdef_opt = default_options ();
+ lefdef_opt.set_single_map_file ("tech.map");
+ std::vector lf;
+ lf.push_back ("tech.lef");
+ lf.push_back ("lib1.lef"); // macros a,b
+ lf.push_back ("lib2.lef"); // macros b,c
+ lefdef_opt.set_lef_files (lf);
+ lefdef_opt.set_read_lef_with_def (false);
+
+ db::Layout ly;
+
+ try {
+
+ db::LoadLayoutOptions opt;
+ opt.set_options (lefdef_opt);
+ EXPECT_EQ (lefdef_opt.skip_duplicate_macros (), false);
+
+ tl::InputStream is (fn_path + "top.def");
+ db::Reader reader (is);
+ reader.read (ly, opt);
+
+ // must throw an exception because of duplicate macros
+ EXPECT_EQ (1, 0);
+
+ } catch (...) { }
+
+ ly = db::Layout ();
+
+ {
+
+ db::LEFDEFReaderOptions lo = lefdef_opt;
+ lo.set_skip_duplicate_macros (true);
+ EXPECT_EQ (lo.skip_duplicate_macros (), true);
+ db::LoadLayoutOptions opt;
+ opt.set_options (lo);
+
+ tl::InputStream is (fn_path + "top.def");
+ db::Reader reader (is);
+ reader.read (ly, opt);
+
+ }
+
+ db::compare_layouts (_this, ly, fn_path + "au.oas", db::WriteOAS);
+}
+
diff --git a/testdata/drc/drcSimpleTests_152.drc b/testdata/drc/drcSimpleTests_152.drc
new file mode 100644
index 000000000..17f0b6af2
--- /dev/null
+++ b/testdata/drc/drcSimpleTests_152.drc
@@ -0,0 +1,25 @@
+source $drc_test_source
+target $drc_test_target
+
+if $drc_test_deep
+ deep
+end
+
+deep
+
+l1 = input(1, 0, enable_props)
+l1.output(1, 0)
+
+l2 = input(2, 0, enable_props)
+l2.output(2, 0)
+
+l1.sep(l2, 1.um, props_ne).output(100, 0)
+l1.sep(l2, 1.um, props_eq).output(101, 0)
+l1.sep(l2, 1.um).output(102, 0)
+l2.sep(l1, 1.um, props_ne).output(110, 0)
+l2.sep(l1, 1.um, props_eq).output(111, 0)
+l2.sep(l1, 1.um).output(112, 0)
+l1.space(1.um, props_ne).output(120, 0)
+l1.space(1.um, props_eq).output(121, 0)
+l1.space(1.um).output(122, 0)
+
diff --git a/testdata/drc/drcSimpleTests_152.gds b/testdata/drc/drcSimpleTests_152.gds
new file mode 100644
index 000000000..9835938cd
Binary files /dev/null and b/testdata/drc/drcSimpleTests_152.gds differ
diff --git a/testdata/drc/drcSimpleTests_au152.gds b/testdata/drc/drcSimpleTests_au152.gds
new file mode 100644
index 000000000..523f55b6b
Binary files /dev/null and b/testdata/drc/drcSimpleTests_au152.gds differ
diff --git a/testdata/drc/drcSimpleTests_au152d.gds b/testdata/drc/drcSimpleTests_au152d.gds
new file mode 100644
index 000000000..71b367404
Binary files /dev/null and b/testdata/drc/drcSimpleTests_au152d.gds differ
diff --git a/testdata/lefdef/issue-2374/au.oas b/testdata/lefdef/issue-2374/au.oas
new file mode 100644
index 000000000..02bb44686
Binary files /dev/null and b/testdata/lefdef/issue-2374/au.oas differ
diff --git a/testdata/lefdef/issue-2374/lib1.lef b/testdata/lefdef/issue-2374/lib1.lef
new file mode 100644
index 000000000..88d2463d7
--- /dev/null
+++ b/testdata/lefdef/issue-2374/lib1.lef
@@ -0,0 +1,20 @@
+VERSION 5.8 ;
+
+MACRO a
+ ORIGIN 0 0 ;
+ SIZE 600 BY 600 ;
+ OBS
+ LAYER M1 ;
+ RECT 10 10 590 590 ;
+ END
+END a
+
+MACRO b
+ ORIGIN -600 0 ;
+ SIZE 400 BY 500 ;
+ OBS
+ LAYER M1 ;
+ RECT 610 10 990 490 ;
+ END
+END b
+
diff --git a/testdata/lefdef/issue-2374/lib2.lef b/testdata/lefdef/issue-2374/lib2.lef
new file mode 100644
index 000000000..659694c36
--- /dev/null
+++ b/testdata/lefdef/issue-2374/lib2.lef
@@ -0,0 +1,22 @@
+VERSION 5.8 ;
+
+MACRO b
+ ORIGIN -600 0 ;
+ SIZE 400 BY 500 ;
+ OBS
+ LAYER M1 ;
+ RECT 610 10 990 590 ;
+ END
+END b
+
+MACRO c
+ ORIGIN -500 -500 ;
+ SIZE 500 BY 500 ;
+ OBS
+ LAYER M1 ;
+ POLYGON 510 610 610 610 610 510 990 510 990 990 510 990 ;
+ LAYER overlap ;
+ RECT 500 700 1000 1000 ;
+ POLYGON 500 600 600 600 600 500 1000 500 1000 700 500 700 ;
+ END
+END c
diff --git a/testdata/lefdef/issue-2374/tech.lef b/testdata/lefdef/issue-2374/tech.lef
new file mode 100644
index 000000000..606730c96
--- /dev/null
+++ b/testdata/lefdef/issue-2374/tech.lef
@@ -0,0 +1,12 @@
+VERSION 5.8 ;
+
+LAYER M1
+ TYPE ROUTING ;
+ DIRECTION HORIZONTAL ;
+ WIDTH 0.1 ;
+ PITCH 0.1 ;
+END M1
+
+LAYER overlap
+ TYPE OVERLAP ;
+END overlap
diff --git a/testdata/lefdef/issue-2374/tech.map b/testdata/lefdef/issue-2374/tech.map
new file mode 100644
index 000000000..e848325a6
--- /dev/null
+++ b/testdata/lefdef/issue-2374/tech.map
@@ -0,0 +1,6 @@
+DIEAREA ALL 1 0
+#BOUNDARY DIEAREA 1 0
+BOUNDARY MACRO 1 0
+#M1 LEFOBS 2 0
+M1 LEFOBS 3 0
+M1 BLOCKAGE 3 0
diff --git a/testdata/lefdef/issue-2374/top.def b/testdata/lefdef/issue-2374/top.def
new file mode 100644
index 000000000..1e1cd5c32
--- /dev/null
+++ b/testdata/lefdef/issue-2374/top.def
@@ -0,0 +1,10 @@
+VERSION 5.8 ;
+DESIGN top ;
+UNITS DISTANCE MICRONS 1000 ;
+DIEAREA ( 0 0 ) ( 1000000 1000000 ) ;
+COMPONENTS 3 ;
+- a a + PLACED ( 0 0 ) N ;
+- b b + PLACED ( 600000 0 ) N ;
+- c c + PLACED ( 500000 500000 ) N ;
+END COMPONENTS
+END DESIGN
diff --git a/testdata/ruby/dbReaders.rb b/testdata/ruby/dbReaders.rb
index 9a787d25f..e01e03696 100644
--- a/testdata/ruby/dbReaders.rb
+++ b/testdata/ruby/dbReaders.rb
@@ -392,6 +392,10 @@ class DBReaders_TestClass < TestBase
conf.read_lef_with_def = false
assert_equal(conf.read_lef_with_def, false)
+ assert_equal(conf.skip_duplicate_macros, false)
+ conf.skip_duplicate_macros = true
+ assert_equal(conf.skip_duplicate_macros, true)
+
end
# MAG Options