diff --git a/macbuild/ReadMe.md b/macbuild/ReadMe.md
index 4d2fbea10..cfd8fe3c4 100644
--- a/macbuild/ReadMe.md
+++ b/macbuild/ReadMe.md
@@ -1,9 +1,9 @@
-Relevant KLayout version: 0.28.15
+Relevant KLayout version: 0.28.17
Author: Kazzz-S
-Last modified: 2024-01-05
+Last modified: 2024-02-16
# 1. Introduction
-This directory **`macbuild`** contains various files required for building KLayout (http://www.klayout.de/) version 0.28.13 or later for different 64-bit macOS, including:
+This directory **`macbuild`** contains various files required for building KLayout (http://www.klayout.de/) version 0.28.17 or later for different 64-bit macOS, including:
* Monterey (12.x) : the primary development environment
* Ventura (13.x) : experimental
* Sonoma (14.x) : -- ditto --
@@ -51,6 +51,8 @@ Some typical use cases are described in Section 6.
# 4. Prerequisites
You need to have the followings:
* The latest Xcode and command-line tool kit compliant with each OS
+ * https://developer.apple.com/xcode/resources/
+ * https://mac.install.guide/commandlinetools/4
* Qt5 package from Homebrew, MacPorts, or Anaconda3
* Optionally, Ruby and Python packages from Homebrew, MacPorts, or Anaconda3
#### For matching versions of Ruby and Python, please also refer to `build4mac_env.py`.
@@ -63,12 +65,12 @@ The operating system type is detected automatically.
```
---------------------------------------------------------------------------------------------------------
<< Usage of 'build4mac.py' >>
- for building KLayout 0.28.13 or later on different Apple macOS platforms.
+ for building KLayout 0.28.17 or later on different Apple macOS platforms.
$ [python] ./build4mac.py
option & argument : descriptions (refer to 'macbuild/build4mac_env.py' for details)| default value
--------------------------------------------------------------------------------------+---------------
- [-q|--qt ] : case-insensitive type=['Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3', | qt5brew
+ [-q|--qt ] : case-insensitive type=['Qt5MacPorts', 'Qt5Brew', 'Qt5Ana3', | qt5macports
: 'Qt6MacPorts', 'Qt6Brew'] |
: Qt5MacPorts: use Qt5 from MacPorts |
: Qt5Brew: use Qt5 from Homebrew |
@@ -76,20 +78,21 @@ $ [python] ./build4mac.py
: Qt6MacPorts: use Qt6 from MacPorts (*) |
: Qt6Brew: use Qt6 from Homebrew (*) |
: (*) migration to Qt6 is ongoing |
- [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP32', 'HB32', 'Ana3'] | hb32
+ [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP33', 'HB33', 'Ana3'] | sys
: nil: don't bind Ruby |
: Sys: use [Sonoma|Ventura|Monterey]-bundled Ruby 2.6 |
- : MP32: use Ruby 3.2 from MacPorts |
- : HB32: use Ruby 3.2 from Homebrew |
+ : MP33: use Ruby 3.3 from MacPorts |
+ : HB33: use Ruby 3.3 from Homebrew |
: Ana3: use Ruby 3.2 from Anaconda3 |
- [-p|--python ] : case-insensitive type=['nil', 'MP311', 'HB311', 'Ana3', | hb311
- : 'MP39', 'hb311', 'HBAuto'] |
+ [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP311', 'HB311', 'Ana3', | sys
+ : 'MP39', 'HB39', 'HBAuto'] |
: nil: don't bind Python |
+ : Sys: use [Sonoma|Ventura|Monterey]-bundled Python 3.9 |
: MP311: use Python 3.11 from MacPorts |
: HB311: use Python 3.11 from Homebrew |
: Ana3: use Python 3.11 from Anaconda3 |
: MP39: use Python 3.9 from MacPorts (+) |
- : hb311: use Python 3.9 from Homebrew (+) |
+ : HB39: use Python 3.9 from Homebrew (+) |
: (+) for the backward compatibility tests |
: HBAuto: use the latest Python 3.x auto-detected from Homebrew |
[-P|--buildPymod] : build and deploy Pymod (*.whl) for LW-*.dmg | disabled
@@ -118,24 +121,55 @@ $ [python] ./build4mac.py
In this section, the actual file and directory names are those obtained on macOS Monterey.
On different OS, those names differ accordingly.
-### 6A. Standard build using the OS-bundled Ruby and Python with MacPorts
-This build has been discontinued.
+### 6A. Standard build using the OS-bundled Ruby and Python with MacPorts Qt
+0. Install MacPorts, then install Qt5 and libgit2 by
+```
+$ sudo port install coreutils
+$ sudo port install findutils
+$ sudo port install qt5
+$ sudo port install libgit2
+```
-### 6B. Fully Homebrew-flavored build with Homebrew Ruby 3.2 and Homebrew Python 3.11
-0. Install Homebrew, then install Qt5, Ruby 3.2, Python 3.11, and libgit2 by
+Confirm that you have:
+```
+/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/*
+```
+ As of this writing, the provided Python version is `3.9.6`.
+
+1. Invoke **`build4mac.py`** with the following options: **((Notes))** These options are the default values for Monterey, Ventura, and Sonoma.
+```
+$ cd /where/'build.sh'/exists
+$ ./build4mac.py -q qt5macports -r sys -p sys
+```
+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 qt5macports -r sys -p sys -y
+```
+ The application bundle **`klayout.app`** is located under:
+ **`ST-qt5MP.pkg.macos-Monterey-release-RsysPsys`** directory, where
+* "ST-" means this is a standard package.
+* "qt5MP" means that Qt5 from MacPorts is used.
+* "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 Homebrew-flavored build with Homebrew Ruby 3.3 and Homebrew Python 3.11
+0. Install Homebrew, then install Qt5, Ruby 3.3, Python 3.11, and libgit2 by
```
$ brew install qt@5
-$ brew install ruby@3.2
+$ brew install ruby@3.3
$ brew install python@3.11
$ brew install libgit2
$ cd /where/'build.sh'/exists
$ cd macbuild
$ ./python3HB.py -v 3.11
```
-1. Invoke **`build4mac.py`** with the following options: **((Notes))** These options are the default values for Monterey, Ventura, and Sonoma.
+1. Invoke **`build4mac.py`** with the following options:
```
$ cd /where/'build.sh'/exists
-$ ./build4mac.py -q qt5brew -r hb32 -p hb311
+$ ./build4mac.py -q qt5brew -r hb33 -p hb311
```
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.
@@ -143,13 +177,13 @@ $ ./build4mac.py -q qt5brew -r hb32 -p hb311
If you use `--buildPymod` option in Step-1 and Step-3, the KLayout Python Module (\*.whl) will be built and deployed under **klayout.app/Contents/pymod-dist/**.
```
-$ ./build4mac.py -q qt5brew -r hb32 -p hb311 -Y
+$ ./build4mac.py -q qt5brew -r hb33 -p hb311 -Y
```
The application bundle **`klayout.app`** is located under:
- **`LW-qt5Brew.pkg.macos-Monterey-release-Rhb32Phb311`** directory, where
+ **`LW-qt5Brew.pkg.macos-Monterey-release-Rhb33Phb311`** directory, where
* "LW-" means this is a lightweight package.
* "qt5Brew" means that Qt5 from Homebrew is used.
-* "Rhb32Phb311" means that Ruby is 3.2 from Homebrew; Python is 3.11 from Homebrew.
+* "Rhb33Phb311" means that Ruby is 3.3 from Homebrew; Python is 3.11 from Homebrew.
4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation.
### 6C. Partially Homebrew-flavored build with System Ruby and Homebrew Python 3.11
@@ -184,13 +218,13 @@ $ ./build4mac.py -q qt5brew -r sys -p hb311 -y
So far, the deployment of Homebrew Ruby is not supported.
Therefore, if you intend to use the "-y" option for deployment, you need to use the "-r sys" option for building.
-### 6D. Fully MacPorts-flavored build with MacPorts Ruby 3.2 and MacPorts Python 3.11
-0. Install MacPorts, then install Qt5, Ruby 3.2, Python 3.11, and libgit2 by
+### 6D. Fully MacPorts-flavored build with MacPorts Ruby 3.3 and MacPorts Python 3.11
+0. Install MacPorts, then install Qt5, Ruby 3.3, Python 3.11, and libgit2 by
```
$ sudo port install coreutils
$ sudo port install findutils
$ sudo port install qt5
-$ sudo port install ruby32
+$ sudo port install ruby33
$ sudo port install python311
$ sudo port install py311-pip
$ sudo port install libgit2
@@ -198,7 +232,7 @@ $ sudo port install libgit2
1. Invoke **`build4mac.py`** with the following options:
```
$ cd /where/'build.sh'/exists
-$ ./build4mac.py -q qt5macports -r mp32 -p mp311
+$ ./build4mac.py -q qt5macports -r mp33 -p mp311
```
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.
@@ -206,13 +240,13 @@ $ ./build4mac.py -q qt5macports -r mp32 -p mp311
If you use `--buildPymod` option in Step-1 and Step-3, the KLayout Python Module (\*.whl) will be built and deployed under **klayout.app/Contents/pymod-dist/**.
```
-$ ./build4mac.py -q qt5macports -r mp32 -p mp311 -Y
+$ ./build4mac.py -q qt5macports -r mp33 -p mp311 -Y
```
The application bundle **`klayout.app`** is located under:
- **`LW-qt5MP.pkg.macos-Monterey-release-Rmp32Pmp311`** directory, where
+ **`LW-qt5MP.pkg.macos-Monterey-release-Rmp33Pmp311`** directory, where
* "LW-" means this is a lightweight package.
* "qt5MP" means that Qt5 from MacPorts is used.
-* "Rmp32Pmp311" means that Ruby is 3.2 from MacPorts; Python is 3.11 from MacPorts.
+* "Rmp33Pmp311" means that Ruby is 3.3 from MacPorts; Python is 3.11 from MacPorts.
4. Copy/move the generated application bundle **`klayout.app`** to your **`/Applications`** directory for installation.
### 6E. Fully Anaconda3-flavored build with Anaconda3 Ruby 3.2 and Anaconda3 Python 3.11
@@ -273,11 +307,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-Monterey-release-Rmp32Pmp311 -m
+$ ./makeDMG4mac.py -p LW-qt5MP.pkg.macos-Monterey-release-Rmp33Pmp311 -m
```
This command will generate the two files below:
-* **`LW-klayout-0.28.13-macOS-Monterey-1-qt5MP-Rmp32Pmp311.dmg`** ---(1) the main DMG file
-* **`LW-klayout-0.28.13-macOS-Monterey-1-qt5MP-Rmp32Pmp311.dmg.md5`** ---(2) MD5-value text file
+* **`LW-klayout-0.28.17-macOS-Monterey-1-qt5MP-Rmp33Pmp311.dmg`** ---(1) the main DMG file
+* **`LW-klayout-0.28.17-macOS-Monterey-1-qt5MP-Rmp33Pmp311.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/icon-resources/klayout-Std.Rocket.icns b/macbuild/Resources/icon-resources/klayout-Std.Rocket.icns
new file mode 100644
index 000000000..95385871f
Binary files /dev/null and b/macbuild/Resources/icon-resources/klayout-Std.Rocket.icns differ
diff --git a/macbuild/Resources/icon-resources/klayout-Std.Rocket.logoist b/macbuild/Resources/icon-resources/klayout-Std.Rocket.logoist
new file mode 100644
index 000000000..d55a0fd35
Binary files /dev/null and b/macbuild/Resources/icon-resources/klayout-Std.Rocket.logoist differ
diff --git a/macbuild/Resources/icon-resources/klayout-Std.Rocket.png b/macbuild/Resources/icon-resources/klayout-Std.Rocket.png
new file mode 100644
index 000000000..e04caba1d
Binary files /dev/null and b/macbuild/Resources/icon-resources/klayout-Std.Rocket.png differ
diff --git a/macbuild/Resources/script-bundle-A.zip b/macbuild/Resources/script-bundle-A.zip
index 5f21746d8..3f7e538fc 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 3f66e0a95..9855a5f57 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 821e0e51c..f3d73ffb4 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 def41bdc4..d8df82a29 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
new file mode 100644
index 000000000..164a970ba
Binary files /dev/null and b/macbuild/Resources/script-bundle-S.zip differ
diff --git a/macbuild/build4mac.py b/macbuild/build4mac.py
index 117d59bcd..e6336c024 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.28.13 or later on different Apple Mac OSX platforms.
+# version 0.28.17 or later on different Apple Mac OSX platforms.
#===============================================================================
import sys
import os
@@ -35,17 +35,17 @@ from build4mac_util import *
#-------------------------------------------------------------------------------
def GenerateUsage(platform):
if platform.upper() in [ "SONOMA", "VENTURA", "MONTEREY" ]: # with Xcode [13.1 .. ]
- myQt56 = "qt5brew"
- myRuby = "hb32"
- myPython = "hb311"
- moduleset = ('qt5Brew', 'HB32', 'HB311')
+ myQt56 = "qt5macports"
+ myRuby = "sys"
+ myPython = "sys"
+ moduleset = ('Qt5MacPorts', 'Sys', 'Sys')
else: # too obsolete
raise Exception( "! Too obsolete platform <%s>" % platform )
usage = "\n"
usage += "---------------------------------------------------------------------------------------------------------\n"
usage += "<< Usage of 'build4mac.py' >>\n"
- usage += " for building KLayout 0.28.13 or later on different Apple macOS platforms.\n"
+ usage += " for building KLayout 0.28.17 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"
@@ -58,15 +58,16 @@ def GenerateUsage(platform):
usage += " : Qt6MacPorts: use Qt6 from MacPorts (*) |\n"
usage += " : Qt6Brew: use Qt6 from Homebrew (*) |\n"
usage += " : (*) migration to Qt6 is ongoing |\n"
- usage += " [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP32', 'HB32', 'Ana3'] | %s\n" % myRuby
+ usage += " [-r|--ruby ] : case-insensitive type=['nil', 'Sys', 'MP33', 'HB33', 'Ana3'] | %s\n" % myRuby
usage += " : nil: don't bind Ruby |\n"
usage += " : Sys: use [Sonoma|Ventura|Monterey]-bundled Ruby 2.6 |\n"
- usage += " : MP32: use Ruby 3.2 from MacPorts |\n"
- usage += " : HB32: use Ruby 3.2 from Homebrew |\n"
+ usage += " : MP33: use Ruby 3.3 from MacPorts |\n"
+ usage += " : HB33: use Ruby 3.3 from Homebrew |\n"
usage += " : Ana3: use Ruby 3.2 from Anaconda3 |\n"
- usage += " [-p|--python ] : case-insensitive type=['nil', 'MP311', 'HB311', 'Ana3', | %s\n" % myPython
+ usage += " [-p|--python ] : case-insensitive type=['nil', 'Sys', 'MP311', 'HB311', 'Ana3', | %s\n" % myPython
usage += " : 'MP39', 'HB39', 'HBAuto'] |\n"
usage += " : nil: don't bind Python |\n"
+ usage += " : Sys: use [Sonoma|Ventura|Monterey]-bundled Python 3.9 |\n"
usage += " : MP311: use Python 3.11 from MacPorts |\n"
usage += " : HB311: use Python 3.11 from Homebrew |\n"
usage += " : Ana3: use Python 3.11 from Anaconda3 |\n"
@@ -149,19 +150,19 @@ def Get_Default_Config():
# Set the default modules
if Platform == "Sonoma":
- ModuleQt = "Qt5Brew"
- ModuleRuby = "Ruby32Brew"
- ModulePython = "Python311Brew"
+ ModuleQt = "Qt5MacPorts"
+ ModuleRuby = "Sys"
+ ModulePython = "Sys"
elif Platform == "Ventura":
- ModuleQt = "Qt5Brew"
- ModuleRuby = "Ruby32Brew"
- ModulePython = "Python311Brew"
+ ModuleQt = "Qt5MacPorts"
+ ModuleRuby = "Sys"
+ ModulePython = "Sys"
elif Platform == "Monterey":
- ModuleQt = "Qt5Brew"
- ModuleRuby = "Ruby32Brew"
- ModulePython = "Python311Brew"
+ ModuleQt = "Qt5MacPorts"
+ ModuleRuby = "Sys"
+ ModulePython = "Sys"
else:
- ModuleQt = "Qt5Brew"
+ ModuleQt = "Qt5MacPorts"
ModuleRuby = "nil"
ModulePython = "nil"
@@ -179,6 +180,7 @@ def Get_Default_Config():
DeployVerbose = 1
Version = GetKLayoutVersionFrom( "./version.sh" )
HBPythonIs39 = False # because ModulePython == "Python311Brew" by default
+ OSPython3FW = None # system Python3 frameworks in [ None, MontereyPy3FW, VenturaPy3FW, SonomaPy3FW ]
config = dict()
config['ProjectDir'] = ProjectDir # project directory where "build.sh" exists
@@ -204,6 +206,7 @@ def Get_Default_Config():
config['ModuleSet'] = ModuleSet # (Qt, Ruby, Python)-tuple
config['ToolDebug'] = ToolDebug # debug level list for this tool
config['HBPythonIs39'] = HBPythonIs39 # True if the Homebrew Python version <= 3.9
+ config['OSPython3FW'] = OSPython3FW # system Python3 frameworks in [ None, MontereyPy3FW, VenturaPy3FW, SonomaPy3FW ]
# auxiliary variables on platform
config['System'] = System # 6-tuple from platform.uname()
config['Node'] = Node # - do -
@@ -246,6 +249,7 @@ def Parse_CLI_Args(config):
ModuleSet = config['ModuleSet']
ToolDebug = config['ToolDebug']
HBPythonIs39 = config['HBPythonIs39']
+ OSPython3FW = config['OSPython3FW']
#-----------------------------------------------------
# [2] Parse the CLI arguments
@@ -257,7 +261,7 @@ def Parse_CLI_Args(config):
p.add_option( '-r', '--ruby',
dest='type_ruby',
- help="Ruby type=['nil', 'Sys', 'MP32', 'HB32', 'Ana3']" )
+ help="Ruby type=['nil', 'Sys', 'MP33', 'HB33', 'Ana3']" )
p.add_option( '-p', '--python',
dest='type_python',
@@ -331,9 +335,9 @@ def Parse_CLI_Args(config):
help='check usage' )
if Platform.upper() in [ "SONOMA", "VENTURA", "MONTEREY" ]: # with Xcode [13.1 .. ]
- p.set_defaults( type_qt = "qt5brew",
- type_ruby = "hb32",
- type_python = "hb311",
+ p.set_defaults( type_qt = "qt5macports",
+ type_ruby = "sys",
+ type_python = "sys",
build_pymod = False,
no_qt_binding = False,
no_qt_uitools = False,
@@ -390,8 +394,8 @@ def Parse_CLI_Args(config):
candidates = dict()
candidates['NIL'] = 'nil'
candidates['SYS'] = 'Sys'
- candidates['MP32'] = 'MP32'
- candidates['HB32'] = 'HB32'
+ candidates['MP33'] = 'MP33'
+ candidates['HB33'] = 'HB33'
candidates['ANA3'] = 'Ana3'
try:
choiceRuby = candidates[ opt.type_ruby.upper() ]
@@ -403,18 +407,17 @@ def Parse_CLI_Args(config):
if choiceRuby == "nil":
ModuleRuby = 'nil'
elif choiceRuby == "Sys":
- choiceRuby = "Sys"
if Platform == "Sonoma":
ModuleRuby = 'RubySonoma'
elif Platform == "Ventura":
ModuleRuby = 'RubyVentura'
elif Platform == "Monterey":
ModuleRuby = 'RubyMonterey'
- elif choiceRuby == "MP32":
- ModuleRuby = 'Ruby32MacPorts'
+ elif choiceRuby == "MP33":
+ ModuleRuby = 'Ruby33MacPorts'
NonOSStdLang = True
- elif choiceRuby == "HB32":
- ModuleRuby = 'Ruby32Brew'
+ elif choiceRuby == "HB33":
+ ModuleRuby = 'Ruby33Brew'
NonOSStdLang = True
elif choiceRuby == "Ana3":
ModuleRuby = 'RubyAnaconda3'
@@ -429,6 +432,7 @@ def Parse_CLI_Args(config):
# (C) Determine the Python type
candidates = dict()
candidates['NIL'] = 'nil'
+ candidates['SYS'] = 'Sys'
candidates['MP311'] = 'MP311'
candidates['HB311'] = 'HB311'
candidates['ANA3'] = 'Ana3'
@@ -445,29 +449,49 @@ def Parse_CLI_Args(config):
if choicePython == "nil":
ModulePython = 'nil'
HBPythonIs39 = None
+ OSPython3FW = None
+ elif choicePython == "Sys":
+ if Platform == "Sonoma":
+ ModulePython = 'PythonSonoma'
+ HBPythonIs39 = None
+ OSPython3FW = SonomaPy3FW
+ elif Platform == "Ventura":
+ ModulePython = 'PythonVentura'
+ HBPythonIs39 = None
+ OSPython3FW = VenturaPy3FW
+ elif Platform == "Monterey":
+ ModulePython = 'PythonMonterey'
+ HBPythonIs39 = None
+ OSPython3FW = MontereyPy3FW
elif choicePython == "MP311":
ModulePython = 'Python311MacPorts'
HBPythonIs39 = None
+ OSPython3FW = None
NonOSStdLang = True
elif choicePython == "HB311":
ModulePython = 'Python311Brew'
HBPythonIs39 = False
+ OSPython3FW = None
NonOSStdLang = True
elif choicePython == "Ana3":
ModulePython = 'PythonAnaconda3'
HBPythonIs39 = None
+ OSPython3FW = None
NonOSStdLang = True
elif choicePython == "MP39":
ModulePython = 'Python39MacPorts'
HBPythonIs39 = None
+ OSPython3FW = None
NonOSStdLang = True
elif choicePython == "HB39":
ModulePython = 'Python39Brew'
HBPythonIs39 = True
+ OSPython3FW = None
NonOSStdLang = True
elif choicePython == "HBAuto":
ModulePython = 'PythonAutoBrew'
HBPythonIs39 = (HBPythonAutoVersion == "3.9")
+ OSPython3FW = None
NonOSStdLang = True
if ModulePython == '':
print("")
@@ -524,7 +548,7 @@ def Parse_CLI_Args(config):
else:
message += "a lightweight (LW-) package with Pymod excluding Qt5, Ruby, and Python..."
elif DeploymentF:
- if (ModuleRuby in RubySys) and (ModulePython in PythonSys): # won't meet this condition any more!
+ if (ModuleRuby in RubySys) and (ModulePython in PythonSys):
PackagePrefix = "ST-"
message += "a standard (ST-) package including Qt[5|6] and using OS-bundled Ruby and Python..."
elif ModulePython in ['Python311Brew', 'Python39Brew', 'PythonAutoBrew']:
@@ -568,6 +592,7 @@ def Parse_CLI_Args(config):
config['ModuleSet'] = ModuleSet
config['ToolDebug'] = ToolDebug
config['HBPythonIs39'] = HBPythonIs39
+ config['OSPython3FW'] = OSPython3FW
if CheckComOnly:
pp = pprint.PrettyPrinter( indent=4, width=140 )
@@ -606,6 +631,7 @@ def Get_Build_Parameters(config):
DeploymentF = config['DeploymentF']
DeploymentP = config['DeploymentP']
PackagePrefix = config['PackagePrefix']
+ OSPython3FW = config['OSPython3FW']
#-----------------------------------------------------
# [2] Set parameters passed to the main Bash script
@@ -652,7 +678,10 @@ def Get_Build_Parameters(config):
parameters['bin'] = MacBinDir
parameters['build'] = MacBuildDir
- parameters['rpath'] = "@executable_path/../Frameworks"
+ if OSPython3FW in [ MontereyPy3FW, VenturaPy3FW, SonomaPy3FW ]:
+ parameters['rpath'] = OSPython3FW
+ else:
+ parameters['rpath'] = "@executable_path/../Frameworks"
# (E) want Qt bindings with Ruby scripts?
parameters['no_qt_bindings'] = NoQtBindings
@@ -698,7 +727,7 @@ def Get_Build_Parameters(config):
# will be built if:
# BuildPymod = True
# Platform = [ 'Sonoma', 'Ventura', 'Monterey']
- # ModuleRuby = [ 'Ruby32MacPorts', 'Ruby32Brew', 'RubyAnaconda3' ]
+ # ModuleRuby = [ 'Ruby33MacPorts', 'Ruby33Brew', 'RubyAnaconda3' ]
# ModulePython = [ 'Python311MacPorts', 'Python39MacPorts',
# 'Python311Brew', Python39Brew', 'PythonAutoBrew',
# 'PythonAnaconda3' ]
@@ -709,13 +738,13 @@ def Get_Build_Parameters(config):
PymodDistDir = dict()
if Platform in [ 'Sonoma', 'Ventura', 'Monterey' ]:
- if ModuleRuby in [ 'Ruby32MacPorts', 'Ruby32Brew', 'RubyAnaconda3' ]:
+ if ModuleRuby in [ 'Ruby33MacPorts', 'Ruby33Brew', 'RubyAnaconda3' ]:
if ModulePython in [ 'Python311MacPorts', 'Python39MacPorts' ]:
- PymodDistDir[ModulePython] = 'dist-MP3'
+ PymodDistDir[ModulePython] = 'dist-MP3-%s' % ModuleQt
elif ModulePython in [ 'Python311Brew', 'Python39Brew', 'PythonAutoBrew' ]:
- PymodDistDir[ModulePython] = 'dist-HB3'
+ PymodDistDir[ModulePython] = 'dist-HB3-%s' % ModuleQt
elif ModulePython in [ 'PythonAnaconda3' ]:
- PymodDistDir[ModulePython] = 'dist-ana3'
+ PymodDistDir[ModulePython] = 'dist-ana3-%s' % ModuleQt
parameters['pymod_dist'] = PymodDistDir
return parameters
@@ -732,7 +761,7 @@ def Build_pymod(parameters):
# [1] will be built if:
# BuildPymod = True
# Platform = [ 'Sonoma', 'Ventura', 'Monterey']
- # ModuleRuby = [ 'Ruby32MacPorts', 'Ruby32Brew', 'RubyAnaconda3' ]
+ # ModuleRuby = [ 'Ruby33MacPorts', 'Ruby33Brew', 'RubyAnaconda3' ]
# ModulePython = [ 'Python311MacPorts', 'Python39MacPorts',
# 'Python311Brew', Python39Brew', 'PythonAutoBrew',
# 'PythonAnaconda3' ]
@@ -745,7 +774,7 @@ def Build_pymod(parameters):
return 0
if not Platform in [ 'Sonoma', 'Ventura', 'Monterey' ]:
return 0
- elif not ModuleRuby in [ 'Ruby32MacPorts', 'Ruby32Brew', 'RubyAnaconda3' ]:
+ elif not ModuleRuby in [ 'Ruby33MacPorts', 'Ruby33Brew', 'RubyAnaconda3' ]:
return 0
elif not ModulePython in [ 'Python311MacPorts', 'Python39MacPorts', 'PythonAnaconda3', \
'Python311Brew', 'Python39Brew', 'PythonAutoBrew' ]:
@@ -758,17 +787,17 @@ def Build_pymod(parameters):
#--------------------------------------------------------------------
PymodDistDir = parameters['pymod_dist']
# Using MacPorts
- if PymodDistDir[ModulePython] == 'dist-MP3':
+ if PymodDistDir[ModulePython].find('dist-MP3') >= 0:
addBinPath = "/opt/local/bin"
addIncPath = "/opt/local/include"
addLibPath = "/opt/local/lib"
# Using Homebrew
- elif PymodDistDir[ModulePython] == 'dist-HB3':
+ elif PymodDistDir[ModulePython].find('dist-HB3') >= 0:
addBinPath = "%s/bin" % DefaultHomebrewRoot # defined in "build4mac_env.py"
addIncPath = "%s/include" % DefaultHomebrewRoot # -- ditto --
addLibPath = "%s/lib" % DefaultHomebrewRoot # -- ditto --
# Using Anaconda3
- elif PymodDistDir[ModulePython] == 'dist-ana3':
+ elif PymodDistDir[ModulePython].find('dist-ana3') >= 0:
addBinPath = "/Applications/anaconda3/bin"
addIncPath = "/Applications/anaconda3/include"
addLibPath = "/Applications/anaconda3/lib"
@@ -1149,7 +1178,7 @@ def Deploy_Binaries_For_Bundle(config, parameters):
if BuildPymod:
try:
PymodDistDir = parameters['pymod_dist']
- pymodDistDir = PymodDistDir[ModulePython] # [ 'dist-MP3', 'dist-HB3', 'dist-ana3' ]
+ pymodDistDir = PymodDistDir[ModulePython] # [ 'dist-MP3-${ModuleQt}', 'dist-HB3-${ModuleQt}', 'dist-ana3-${ModuleQt}' ]
except KeyError:
pymodDistDir = ""
else:
@@ -1798,15 +1827,15 @@ def Deploy_Binaries_For_Bundle(config, parameters):
return 1
#-------------------------------------------------------------
- # [10] Special deployment of Ruby3.2 from Homebrew?
+ # [10] Special deployment of Ruby3.3 from Homebrew?
#-------------------------------------------------------------
- deploymentRuby32HB = (ModuleRuby == 'Ruby32Brew')
+ deploymentRuby32HB = (ModuleRuby == 'Ruby33Brew')
if deploymentRuby32HB and NonOSStdLang:
print( "" )
- print( " [10] You have reached optional deployment of Ruby from %s ..." % HBRuby32Path )
+ print( " [10] You have reached optional deployment of Ruby from %s ..." % HBRuby33Path )
print( " [!!!] Sorry, the deployed package will not work properly since deployment of" )
- print( " Ruby3.2 from Homebrew is not yet supported." )
+ print( " Ruby3.3 from Homebrew is not yet supported." )
print( " Since you have Homebrew development environment, there two options:" )
print( " (1) Retry to make a package with '-Y|--DEPLOY' option." )
print( " This will not deploy any of Qt[5|6], Python, and Ruby from Homebrew." )
diff --git a/macbuild/build4mac_env.py b/macbuild/build4mac_env.py
index d87149133..feb04bad8 100755
--- a/macbuild/build4mac_env.py
+++ b/macbuild/build4mac_env.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python3
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#===============================================================================
@@ -6,7 +6,7 @@
#
# Here are dictionaries of ...
# different modules for building KLayout (http://www.klayout.de/index.php)
-# version 0.28.13 or later on different Apple Mac OSX platforms.
+# version 0.28.17 or later on different Apple Mac OSX platforms.
#
# This file is imported by 'build4mac.py' script.
#===============================================================================
@@ -117,7 +117,7 @@ Qt6Brew = { 'qmake' : '%s/opt/qt@6/bin/qmake' % DefaultHomebrewRoot,
#-----------------------------------------------------
RubyNil = [ 'nil' ]
RubySys = [ 'RubyMonterey', 'RubyVentura', 'RubySonoma' ]
-RubyExt = [ 'Ruby32MacPorts', 'Ruby32Brew', 'RubyAnaconda3' ]
+RubyExt = [ 'Ruby33MacPorts', 'Ruby33Brew', 'RubyAnaconda3' ]
Rubies = RubyNil + RubySys + RubyExt
#-----------------------------------------------------
@@ -150,21 +150,21 @@ RubySonoma = { 'exe': '/System/Library/Frameworks/Ruby.framework/Versions/
'lib': '%s/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/libruby.tbd' % SonomaSDK
}
-# Ruby 3.2 from MacPorts (https://www.macports.org/)
-# install with 'sudo port install ruby32'
-# [Key Type Name] = 'MP32'
-Ruby32MacPorts = { 'exe': '/opt/local/bin/ruby3.2',
- 'inc': '/opt/local/include/ruby-3.2.2',
- 'lib': '/opt/local/lib/libruby.3.2.dylib'
+# Ruby 3.3 from MacPorts (https://www.macports.org/)
+# install with 'sudo port install ruby33'
+# [Key Type Name] = 'MP33'
+Ruby33MacPorts = { 'exe': '/opt/local/bin/ruby3.3',
+ 'inc': '/opt/local/include/ruby-3.3.0',
+ 'lib': '/opt/local/lib/libruby.3.3.dylib'
}
-# Ruby 3.2 from Homebrew
-# install with 'brew install ruby@3.2'
-# [Key Type Name] = 'HB32'
-HBRuby32Path = '%s/opt/ruby@3.2' % DefaultHomebrewRoot
-Ruby32Brew = { 'exe': '%s/bin/ruby' % HBRuby32Path,
- 'inc': '%s/include/ruby-3.2.0' % HBRuby32Path,
- 'lib': '%s/lib/libruby.3.2.dylib' % HBRuby32Path
+# Ruby 3.3 from Homebrew
+# install with 'brew install ruby@3.3'
+# [Key Type Name] = 'HB33'
+HBRuby33Path = '%s/opt/ruby@3.3' % DefaultHomebrewRoot
+Ruby33Brew = { 'exe': '%s/bin/ruby' % HBRuby33Path,
+ 'inc': '%s/include/ruby-3.3.0' % HBRuby33Path,
+ 'lib': '%s/lib/libruby.3.3.dylib' % HBRuby33Path
}
# Ruby 3.2 bundled with anaconda3 installed under /Applications/anaconda3/
@@ -181,8 +181,8 @@ RubyDictionary = { 'nil' : None,
'RubyMonterey' : RubyMonterey,
'RubyVentura' : RubyVentura,
'RubySonoma' : RubySonoma,
- 'Ruby32MacPorts': Ruby32MacPorts,
- 'Ruby32Brew' : Ruby32Brew,
+ 'Ruby33MacPorts': Ruby33MacPorts,
+ 'Ruby33Brew' : Ruby33Brew,
'RubyAnaconda3' : RubyAnaconda3
}
@@ -195,7 +195,7 @@ RubyDictionary = { 'nil' : None,
# for the previous states.
#-----------------------------------------------------
PythonNil = [ 'nil' ]
-PythonSys = [ ]
+PythonSys = [ 'PythonMonterey', 'PythonVentura', 'PythonSonoma' ]
PythonExt = [ 'Python39MacPorts', 'Python39Brew' ]
PythonExt += [ 'Python311MacPorts', 'Python311Brew' ]
PythonExt += [ 'PythonAnaconda3', 'PythonAutoBrew' ]
@@ -204,6 +204,33 @@ Pythons = PythonNil + PythonSys + PythonExt
#-----------------------------------------------------
# Whereabouts of different components of Python
#-----------------------------------------------------
+# Bundled with Monterey (12.x)
+# [Key Type Name] = 'Sys'
+MontereyPy3FWXc = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks"
+MontereyPy3FW = "/Library/Developer/CommandLineTools/Library/Frameworks"
+PythonMonterey = { 'exe': '%s/Python3.framework/Versions/3.9/bin/python3.9' % MontereyPy3FW,
+ 'inc': '%s/Python3.framework/Versions/3.9/include/python3.9' % MontereyPy3FW,
+ 'lib': '%s/Python3.framework/Versions/3.9/lib/libpython3.9.dylib' % MontereyPy3FW
+ }
+
+# Bundled with Ventura (13.x)
+# [Key Type Name] = 'Sys'
+VenturaPy3FWXc = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks"
+VenturaPy3FW = "/Library/Developer/CommandLineTools/Library/Frameworks"
+PythonVentura = { 'exe': '%s/Python3.framework/Versions/3.9/bin/python3.9' % VenturaPy3FW,
+ 'inc': '%s/Python3.framework/Versions/3.9/include/python3.9' % VenturaPy3FW,
+ 'lib': '%s/Python3.framework/Versions/3.9/lib/libpython3.9.dylib' % VenturaPy3FW
+ }
+
+# Bundled with Sonoma (14.x)
+# [Key Type Name] = 'Sys'
+SonomaPy3FWXc = "/Applications/Xcode.app/Contents/Developer/Library/Frameworks"
+SonomaPy3FW = "/Library/Developer/CommandLineTools/Library/Frameworks"
+PythonSonoma = { 'exe': '%s/Python3.framework/Versions/3.9/bin/python3.9' % SonomaPy3FW,
+ 'inc': '%s/Python3.framework/Versions/3.9/include/python3.9' % SonomaPy3FW,
+ 'lib': '%s/Python3.framework/Versions/3.9/lib/libpython3.9.dylib' % SonomaPy3FW
+ }
+
# Python 3.9 from MacPorts (https://www.macports.org/)
# install with 'sudo port install python39'
# [Key Type Name] = 'MP39'
@@ -299,6 +326,9 @@ else:
# Consolidated dictionary kit for Python
PythonDictionary = { 'nil' : None,
+ 'PythonMonterey' : PythonMonterey,
+ 'PythonVentura' : PythonVentura,
+ 'PythonSonoma' : PythonSonoma,
'Python39MacPorts' : Python39MacPorts,
'Python311MacPorts': Python311MacPorts,
'Python39Brew' : Python39Brew,
@@ -312,7 +342,7 @@ if _have_Homebrew_Python:
# [4] KLayout executables including buddy tools
#-----------------------------------------------------
KLayoutExecs = [ 'klayout' ]
-KLayoutExecs += [ 'strm2cif', 'strm2dxf', 'strm2gds', 'strm2gdstxt', 'strm2oas' ]
+KLayoutExecs += [ 'strm2cif', 'strm2dxf', 'strm2gds', 'strm2gdstxt', 'strm2mag', 'strm2oas' ]
KLayoutExecs += [ 'strm2txt', 'strmclip', 'strmcmp', 'strmrun', 'strmxor' ]
#----------------
diff --git a/macbuild/build4mac_util.py b/macbuild/build4mac_util.py
index 5d12d242f..8241aebf7 100755
--- a/macbuild/build4mac_util.py
+++ b/macbuild/build4mac_util.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python3
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#========================================================================================
@@ -6,7 +6,7 @@
#
# Here are utility functions and classes ...
# for building KLayout (http://www.klayout.de/index.php)
-# version 0.26.1 or later on different Apple Mac OSX platforms.
+# version 0.28.17 or later on different Apple Mac OSX platforms.
#
# This file is imported by 'build4mac.py' script.
#========================================================================================
diff --git a/macbuild/macQAT.py b/macbuild/macQAT.py
index 6f43ed1c5..e542848b0 100755
--- a/macbuild/macQAT.py
+++ b/macbuild/macQAT.py
@@ -5,7 +5,7 @@
# File: "macbuild/macQAT.py"
#
# The top Python script to run "ut_runner" after building KLayout
-# (http://www.klayout.de/index.php) version 0.26.1 or later on different Apple
+# (http://www.klayout.de/index.php) version 0.28.17 or later on different Apple
# ßMac OSX platforms.
#
# This script must be copied to a "*.macQAT/" directory to run.
diff --git a/macbuild/macQAT.sh b/macbuild/macQAT.sh
index a44d0d6a1..273e4627c 100755
--- a/macbuild/macQAT.sh
+++ b/macbuild/macQAT.sh
@@ -4,7 +4,7 @@
# File: "macbuild/macQAT.sh"
#
# The top Bash script to run "ut_runner" after building KLayout
-# (http://www.klayout.de/index.php) version 0.26.1 or later on different Apple
+# (http://www.klayout.de/index.php) version 0.25.17 or later on different Apple
# Mac OSX platforms.
#
# This script must be copied to a "*.macQAT/" directory to run.
diff --git a/macbuild/macQAT2.sh b/macbuild/macQAT2.sh
index c2fbd5445..59f9e4d83 100755
--- a/macbuild/macQAT2.sh
+++ b/macbuild/macQAT2.sh
@@ -4,7 +4,7 @@
# File: "macbuild/macQAT2.sh"
#
# The top Bash script to run "ut_runner" after building KLayout
-# (http://www.klayout.de/index.php) version 0.26.1 or later on different Apple
+# (http://www.klayout.de/index.php) version 0.28.17 or later on different Apple
# Mac OSX platforms.
#
# This script must be copied to a directory that can be found in $PATH.
diff --git a/macbuild/makeDMG4mac.py b/macbuild/makeDMG4mac.py
index 566c9e203..1b2ae1683 100755
--- a/macbuild/makeDMG4mac.py
+++ b/macbuild/makeDMG4mac.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python3
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#=============================================================================================
@@ -63,7 +63,7 @@ def SetGlobals():
global LatestOSHomebrew # True if 'LatestOS with Homebrew' and targeting LW-*
global LatestOSAnaconda3 # True if 'LatestOS with Anaconda3' and targeting LW-*
global LatestOSHomebrewH # True if 'LatestOS with Homebrew' and targeting HW-*
- global DicLightHeavyW # dictionary for LW-* and HW-* packages
+ global DicStdLightHeavyW # dictionary for LW-* and HW-* packages
global Item3AppleScript # ITEM_3 in the Apple script
# auxiliary variables on platform
global System # 6-tuple from platform.uname()
@@ -77,13 +77,13 @@ def SetGlobals():
Usage = "\n"
Usage += "---------------------------------------------------------------------------------------------------------\n"
Usage += "<< Usage of 'makeDMG4mac.py' >>\n"
- Usage += " for making a DMG file of KLayout 0.28.13 or later on different Apple macOS platforms.\n"
+ Usage += " for making a DMG file of KLayout 0.28.17 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-Monterey-release-Rmp32Pmp311' | \n"
+ Usage += " : like 'LW-qt5MP.pkg.macos-Monterey-release-Rmp33Pmp311' | \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"
@@ -158,51 +158,59 @@ def SetGlobals():
LatestOSHomebrew = False
LatestOSAnaconda3 = False
LatestOSHomebrewH = False
- DicLightHeavyW = dict()
+ DicStdLightHeavyW = dict()
Item3AppleScript = ""
- # Populate DicLightHeavyW
- DicLightHeavyW[ "ports" ] = dict() # LW-*
- DicLightHeavyW[ "brew" ] = dict() # LW-*
- DicLightHeavyW[ "ana3" ] = dict() # LW-*
- DicLightHeavyW[ "brewH" ] = dict() # HW-*
+ # Populate DicStdLightHeavyW
+ DicStdLightHeavyW[ "std" ] = dict() # ST-*
+ DicStdLightHeavyW[ "ports" ] = dict() # LW-*
+ DicStdLightHeavyW[ "brew" ] = dict() # LW-*
+ DicStdLightHeavyW[ "ana3" ] = dict() # LW-*
+ DicStdLightHeavyW[ "brewH" ] = dict() # HW-*
- DicLightHeavyW[ "ports" ]["zip"] = "macbuild/Resources/script-bundle-P.zip"
- DicLightHeavyW[ "ports" ]["src"] = "script-bundle-P"
- DicLightHeavyW[ "ports" ]["des"] = "MacPortsUser-ReadMeFirst"
- DicLightHeavyW[ "ports" ]["item3"] = 'set position of item "MacPortsUser-ReadMeFirst" to {700, 400}'
+ DicStdLightHeavyW[ "std" ]["zip"] = "macbuild/Resources/script-bundle-S.zip"
+ DicStdLightHeavyW[ "std" ]["src"] = "script-bundle-S"
+ DicStdLightHeavyW[ "std" ]["des"] = "MacStdUser-ReadMeFirst"
+ DicStdLightHeavyW[ "std" ]["item3"] = 'set position of item "MacStdUser-ReadMeFirst" to {700, 400}'
- DicLightHeavyW[ "brew" ]["zip"] = "macbuild/Resources/script-bundle-B.zip"
- DicLightHeavyW[ "brew" ]["src"] = "script-bundle-B"
- DicLightHeavyW[ "brew" ]["des"] = "HomebrewUser-ReadMeFirst"
- DicLightHeavyW[ "brew" ]["item3"] = 'set position of item "HomebrewUser-ReadMeFirst" to {700, 400}'
+ DicStdLightHeavyW[ "ports" ]["zip"] = "macbuild/Resources/script-bundle-P.zip"
+ DicStdLightHeavyW[ "ports" ]["src"] = "script-bundle-P"
+ DicStdLightHeavyW[ "ports" ]["des"] = "MacPortsUser-ReadMeFirst"
+ DicStdLightHeavyW[ "ports" ]["item3"] = 'set position of item "MacPortsUser-ReadMeFirst" to {700, 400}'
- DicLightHeavyW[ "ana3" ]["zip"] = "macbuild/Resources/script-bundle-A.zip"
- DicLightHeavyW[ "ana3" ]["src"] = "script-bundle-A"
- DicLightHeavyW[ "ana3" ]["des"] = "Anaconda3User-ReadMeFirst"
- DicLightHeavyW[ "ana3" ]["item3"] = 'set position of item "Anaconda3User-ReadMeFirst" to {700, 400}'
+ DicStdLightHeavyW[ "brew" ]["zip"] = "macbuild/Resources/script-bundle-B.zip"
+ DicStdLightHeavyW[ "brew" ]["src"] = "script-bundle-B"
+ DicStdLightHeavyW[ "brew" ]["des"] = "HomebrewUser-ReadMeFirst"
+ DicStdLightHeavyW[ "brew" ]["item3"] = 'set position of item "HomebrewUser-ReadMeFirst" to {700, 400}'
- DicLightHeavyW[ "brewH" ]["zip"] = "macbuild/Resources/script-bundle-H.zip"
- DicLightHeavyW[ "brewH" ]["src"] = "script-bundle-H"
- DicLightHeavyW[ "brewH" ]["des"] = "Homebrew-HUser-ReadMeFirst"
- DicLightHeavyW[ "brewH" ]["item3"] = 'set position of item "Homebrew-HUser-ReadMeFirst" to {700, 400}'
+ DicStdLightHeavyW[ "ana3" ]["zip"] = "macbuild/Resources/script-bundle-A.zip"
+ DicStdLightHeavyW[ "ana3" ]["src"] = "script-bundle-A"
+ DicStdLightHeavyW[ "ana3" ]["des"] = "Anaconda3User-ReadMeFirst"
+ DicStdLightHeavyW[ "ana3" ]["item3"] = 'set position of item "Anaconda3User-ReadMeFirst" to {700, 400}'
+
+ DicStdLightHeavyW[ "brewH" ]["zip"] = "macbuild/Resources/script-bundle-H.zip"
+ DicStdLightHeavyW[ "brewH" ]["src"] = "script-bundle-H"
+ DicStdLightHeavyW[ "brewH" ]["des"] = "Homebrew-HUser-ReadMeFirst"
+ DicStdLightHeavyW[ "brewH" ]["item3"] = 'set position of item "Homebrew-HUser-ReadMeFirst" to {700, 400}'
#------------------------------------------------------------------------------
## To check the contents of the package directory
#
# The package directory name should look like:
+# * ST-qt5MP.pkg.macos-Monterey-release-RsysPsys
# * LW-qt5Ana3.pkg.macos-Monterey-release-Rana3Pana3
-# * LW-qt5Brew.pkg.macos-Monterey-release-Rhb32Phb311 --- (1)
-# * LW-qt5MP.pkg.macos-Monterey-release-Rmp32Pmp311
+# * LW-qt5Brew.pkg.macos-Monterey-release-Rhb33Phb311 --- (1)
+# * LW-qt5MP.pkg.macos-Monterey-release-Rmp33Pmp311
# * HW-qt5Brew.pkg.macos-Monterey-release-RsysPhb311
#
+# * ST-qt6MP.pkg.macos-Monterey-release-RsysPsys
# * LW-qt6Ana3.pkg.macos-Monterey-release-Rana3Pana3
-# * LW-qt6Brew.pkg.macos-Monterey-release-Rhb32Phb311
-# * LW-qt6MP.pkg.macos-Monterey-release-Rmp32Pmp311
+# * LW-qt6Brew.pkg.macos-Monterey-release-Rhb33Phb311
+# * LW-qt6MP.pkg.macos-Monterey-release-Rmp33Pmp311
# * HW-qt6Brew.pkg.macos-Monterey-release-RsysPhb311
#
# Generated DMG will be, for example,
-# (1) ---> LW-klayout-0.28.13-macOS-Monterey-1-qt5Brew-Rhb32Phb311.dmg
+# (1) ---> LW-klayout-0.28.17-macOS-Monterey-1-qt5Brew-Rhb33Phb311.dmg
#
# @return on success, positive integer in [MB] that tells approx. occupied disc space;
# on failure, -1
@@ -223,7 +231,7 @@ def CheckPkgDirectory():
global LatestOSHomebrew
global LatestOSAnaconda3
global LatestOSHomebrewH
- global DicLightHeavyW
+ global DicStdLightHeavyW
global Item3AppleScript
#-----------------------------------------------------------------------------
@@ -241,18 +249,20 @@ def CheckPkgDirectory():
#-----------------------------------------------------------------------------------------------
# [2] Identify (Qt, Ruby, Python) from PkgDir
+ # * ST-qt5MP.pkg.macos-Monterey-release-RsysPsys
# * LW-qt5Ana3.pkg.macos-Monterey-release-Rana3Pana3
- # * LW-qt5Brew.pkg.macos-Monterey-release-Rhb32Phb311
- # * LW-qt5MP.pkg.macos-Monterey-release-Rmp32Pmp311
+ # * LW-qt5Brew.pkg.macos-Monterey-release-Rhb33Phb311
+ # * LW-qt5MP.pkg.macos-Monterey-release-Rmp33Pmp311
# * HW-qt5Brew.pkg.macos-Monterey-release-RsysPhb311
- # * EX-qt5MP.pkg.macos-Monterey-release-Rhb32Pmp311
+ # * EX-qt5MP.pkg.macos-Monterey-release-Rhb33Pmp311
#
+ # * ST-qt6MP.pkg.macos-Monterey-release-RsysPsys
# * LW-qt6Ana3.pkg.macos-Monterey-release-Rana3Pana3
- # * LW-qt6Brew.pkg.macos-Monterey-release-Rhb32Phb311
- # * LW-qt6MP.pkg.macos-Monterey-release-Rmp32Pmp311
+ # * LW-qt6Brew.pkg.macos-Monterey-release-Rhb33Phb311
+ # * LW-qt6MP.pkg.macos-Monterey-release-Rmp33Pmp311
# * HW-qt6Brew.pkg.macos-Monterey-release-RsysPhb311
#-----------------------------------------------------------------------------------------------
- patQRP = u'(LW|HW|EX)([-])([qt5|qt6][0-9A-Za-z]+)([.]pkg[.])([A-Za-z]+[-][A-Za-z]+[-]release[-])([0-9A-Za-z]+)'
+ patQRP = u'(ST|LW|HW|EX)([-])([qt5|qt6][0-9A-Za-z]+)([.]pkg[.])([A-Za-z]+[-][A-Za-z]+[-]release[-])([0-9A-Za-z]+)'
regQRP = re.compile(patQRP)
if not regQRP.match(PkgDir):
print( "! Cannot identify (Qt, Ruby, Python) from the package directory name" )
@@ -277,15 +287,20 @@ def CheckPkgDirectory():
#-----------------------------------------------------------------------------
# [3] Check if the "LatestOS" with MacPorts / Homebrew / Anaconda3
#-----------------------------------------------------------------------------
+ LatestOSSys = Platform == LatestOS
+ LatestOSSys &= PackagePrefix == "ST"
+ LatestOSSys &= QtIdentification in [ "qt5MP", "qt6MP" ]
+ LatestOSSys &= RubyPythonID in [ "RsysPsys" ]
+
LatestOSMacPorts = Platform == LatestOS
LatestOSMacPorts &= PackagePrefix == "LW"
LatestOSMacPorts &= QtIdentification in [ "qt5MP", "qt6MP" ]
- LatestOSMacPorts &= RubyPythonID in [ "Rmp32Pmp311", "Rmp32Pmp39" ]
+ LatestOSMacPorts &= RubyPythonID in [ "Rmp33Pmp311", "Rmp33Pmp39" ]
LatestOSHomebrew = Platform == LatestOS
LatestOSHomebrew &= PackagePrefix == "LW"
LatestOSHomebrew &= QtIdentification in [ "qt5Brew", "qt6Brew" ]
- LatestOSHomebrew &= RubyPythonID in [ "Rhb32Phb311", "Rhb32Phb39", "Rhb32Phbauto" ]
+ LatestOSHomebrew &= RubyPythonID in [ "Rhb33Phb311", "Rhb33Phb39", "Rhb33Phbauto" ]
LatestOSAnaconda3 = Platform == LatestOS
LatestOSAnaconda3 &= PackagePrefix == "LW"
@@ -297,8 +312,23 @@ def CheckPkgDirectory():
LatestOSHomebrewH &= QtIdentification in [ "qt5Brew", "qt6Brew" ]
LatestOSHomebrewH &= RubyPythonID in [ "RsysPhb311", "RsysPhb39", "RsysPhbauto" ] # Sys-Homebre hybrid
+ if LatestOSSys:
+ mydic = DicStdLightHeavyW["std"]
+ srcDir = PkgDir + "/" + mydic["src"]
+ desDir = PkgDir + "/" + mydic["des"]
+ if OpMake:
+ with zipfile.ZipFile( mydic["zip"], 'r' ) as zip_ref:
+ zip_ref.extractall(PkgDir)
+ os.rename( srcDir, desDir )
+ if OpClean:
+ if os.path.isdir(srcDir):
+ shutil.rmtree(srcDir)
+ if os.path.isdir(desDir):
+ shutil.rmtree(desDir)
+ Item3AppleScript = mydic["item3"]
+
if LatestOSMacPorts:
- mydic = DicLightHeavyW["ports"]
+ mydic = DicStdLightHeavyW["ports"]
srcDir = PkgDir + "/" + mydic["src"]
desDir = PkgDir + "/" + mydic["des"]
if OpMake:
@@ -313,7 +343,7 @@ def CheckPkgDirectory():
Item3AppleScript = mydic["item3"]
if LatestOSHomebrew:
- mydic = DicLightHeavyW["brew"]
+ mydic = DicStdLightHeavyW["brew"]
srcDir = PkgDir + "/" + mydic["src"]
desDir = PkgDir + "/" + mydic["des"]
if OpMake:
@@ -328,7 +358,7 @@ def CheckPkgDirectory():
Item3AppleScript = mydic["item3"]
if LatestOSAnaconda3:
- mydic = DicLightHeavyW["ana3"]
+ mydic = DicStdLightHeavyW["ana3"]
srcDir = PkgDir + "/" + mydic["src"]
desDir = PkgDir + "/" + mydic["des"]
if OpMake:
@@ -343,7 +373,7 @@ def CheckPkgDirectory():
Item3AppleScript = mydic["item3"]
if LatestOSHomebrewH:
- mydic = DicLightHeavyW["brewH"]
+ mydic = DicStdLightHeavyW["brewH"]
srcDir = PkgDir + "/" + mydic["src"]
desDir = PkgDir + "/" + mydic["des"]
if OpMake:
diff --git a/macbuild/nightlyBuild.py b/macbuild/nightlyBuild.py
index 5ce1d2c9d..7ffb3d416 100755
--- a/macbuild/nightlyBuild.py
+++ b/macbuild/nightlyBuild.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python3
+#!/Applications/anaconda3/bin/python3
# -*- coding: utf-8 -*-
import sys
@@ -8,6 +8,20 @@ import glob
import platform
import optparse
import subprocess
+#------------------------------------------------------------------------------
+# In general, avoid setting the first line to '#!/usr/bin/env python3'.
+# If so, when this script is invoked in the 'KLayoutNightlyBuild.app' script
+# bundle created by Automator, the python3 will be the macOS-bundled python3,
+# where pandas is not included by default.
+# Therefore, it is better to use one of:
+# 1) #!/Applications/anaconda3/bin/python3 (Anaconda3)
+# 2) #!/usr/local/bin/python3 (Homebrew needs 'pip3 install pandas')
+# 3) #!/opt/local/bin/python3 (MacPorts needs 'sudo pip3 install pandas')
+#
+# However, if we install 'pandas' and its dependencies to the system Python
+# environment, we can also set '#!/usr/bin/env python3'.
+#------------------------------------------------------------------------------
+import pandas as pd
#------------------------------------------------------------------------------
## To test if the platform is a member of valid platforms
@@ -44,7 +58,7 @@ def Test_My_Platform( platforms=[ 'Monterey', 'Ventura', 'Sonoma' ] ):
#------------------------------------------------------------------------------
def Get_Build_Target_Dict():
buildTargetDic = dict()
- # buildTargetDic[0] = 'std'
+ buildTargetDic[0] = 'std'
buildTargetDic[1] = 'ports'
buildTargetDic[2] = 'brew'
buildTargetDic[3] = 'brewHW'
@@ -61,45 +75,47 @@ def Get_Build_Target_Dict():
# @param[in] platform platform name
#
# @return (dictionary1, dictionary2)-tupple
-# dictionary1: key=mnemonic, value=build option list
-# dictionary2: key=mnemonic, value=log file name
+# dictionary1: key=(qtVer, mnemonic), value=build option list
+# dictionary2: key=(qtVer, mnemonic), value=log file name
#------------------------------------------------------------------------------
def Get_Build_Options( targetDic, platform ):
- if QtType == 5:
- qtType = "Qt5"
- else:
- qtType = "Qt6"
-
buildOp = dict()
logfile = dict()
- for key in targetDic.keys():
- target = targetDic[key]
- if target == "std": # use 'Qt5MacPorts' that provides Qt 5.15.2~ to run on "Big Sur", too
- buildOp["std"] = [ '-q', '%sMacPorts' % qtType, '-r', 'sys', '-p', 'sys' ]
- logfile["std"] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPsys")
- elif target == "ports":
- buildOp["ports"] = [ '-q', '%sMacPorts' % qtType, '-r', 'MP32', '-p', 'MP311' ]
- logfile["ports"] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rmp32Pmp311")
- elif target == "brew":
- buildOp["brew"] = [ '-q', '%sBrew' % qtType, '-r', 'HB32', '-p', 'HB311' ]
- logfile["brew"] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rhb32Phb311")
- elif target == "brewHW":
- buildOp["brewHW"] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HB311' ]
- logfile["brewHW"] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPhb311")
- elif target == "ana3":
- buildOp["ana3"] = [ '-q', '%sAna3' % qtType, '-r', 'Ana3', '-p', 'Ana3' ]
- logfile["ana3"] = "%sAna3.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rana3Pana3")
- elif target == "brewA":
- buildOp["brewA"] = [ '-q', '%sBrew' % qtType, '-r', 'HB32', '-p', 'HBAuto' ]
- logfile["brewA"] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rhb32Phbauto")
- elif target == "brewAHW":
- buildOp["brewAHW"] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HBAuto' ]
- logfile["brewAHW"] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPhbauto")
- if WithPymod:
- buildOp["ports"] = buildOp["ports"] + ['--buildPymod']
- buildOp["brew"] = buildOp["brew"] + ['--buildPymod']
- buildOp["ana3"] = buildOp["ana3"] + ['--buildPymod']
+ for qtVer in [5, 6]:
+ if qtVer == 5:
+ qtType = "Qt5"
+ elif qtVer == 6:
+ qtType = "Qt6"
+
+ for key in targetDic.keys():
+ target = targetDic[key]
+ if target == "std":
+ buildOp[(qtVer, "std")] = [ '-q', '%sMacPorts' % qtType, '-r', 'sys', '-p', 'sys' ]
+ logfile[(qtVer, "std")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPsys")
+ elif target == "ports":
+ buildOp[(qtVer, "ports")] = [ '-q', '%sMacPorts' % qtType, '-r', 'MP33', '-p', 'MP311' ]
+ logfile[(qtVer, "ports")] = "%sMP.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rmp33Pmp311")
+ elif target == "brew":
+ buildOp[(qtVer, "brew")] = [ '-q', '%sBrew' % qtType, '-r', 'HB33', '-p', 'HB311' ]
+ logfile[(qtVer, "brew")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rhb33Phb311")
+ elif target == "brewHW":
+ buildOp[(qtVer, "brewHW")] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HB311' ]
+ logfile[(qtVer, "brewHW")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPhb311")
+ elif target == "ana3":
+ buildOp[(qtVer, "ana3")] = [ '-q', '%sAna3' % qtType, '-r', 'Ana3', '-p', 'Ana3' ]
+ logfile[(qtVer, "ana3")] = "%sAna3.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rana3Pana3")
+ elif target == "brewA":
+ buildOp[(qtVer, "brewA")] = [ '-q', '%sBrew' % qtType, '-r', 'HB33', '-p', 'HBAuto' ]
+ logfile[(qtVer, "brewA")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "Rhb33Phbauto")
+ elif target == "brewAHW":
+ buildOp[(qtVer, "brewAHW")] = [ '-q', '%sBrew' % qtType, '-r', 'sys', '-p', 'HBAuto' ]
+ logfile[(qtVer, "brewAHW")] = "%sBrew.build.macos-%s-%s-%s.log" % (qtType.lower(), platform, "release", "RsysPhbauto")
+
+ if WithPymod:
+ buildOp[(qtVer,"ports")] = buildOp[(qtVer,"ports")] + ['--buildPymod']
+ buildOp[(qtVer,"brew")] = buildOp[(qtVer,"brew")] + ['--buildPymod']
+ buildOp[(qtVer,"ana3")] = buildOp[(qtVer,"ana3")] + ['--buildPymod']
return (buildOp, logfile)
@@ -109,29 +125,34 @@ def Get_Build_Options( targetDic, platform ):
# @param[in] targetDic build target dictionary
# @param[in] platform platform name
#
-# @return a dictionary; key=mnemonic, value=".macQAT" directory
+# @return a dictionary; key=(qtVer, mnemonic), value=".macQAT" directory
#------------------------------------------------------------------------------
def Get_QAT_Directory( targetDic, platform ):
- if QtType == 5:
- qtType = "qt5"
- else:
- qtType = "qt6"
-
dirQAT = dict()
- for key in targetDic.keys():
- target = targetDic[key]
- if target == "ports":
- dirQAT["ports"] = '%sMP.build.macos-%s-release-Rmp32Pmp311.macQAT' % (qtType, platform)
- elif target == "brew":
- dirQAT["brew"] = '%sBrew.build.macos-%s-release-Rhb32Phb311.macQAT' % (qtType, platform)
- elif target == "brewHW":
- dirQAT["brewHW"] = '%sBrew.build.macos-%s-release-RsysPhb311.macQAT' % (qtType, platform)
- elif target == "ana3":
- dirQAT["ana3"] = '%sAna3.build.macos-%s-release-Rana3Pana3.macQAT' % (qtType, platform)
- elif target == "brewA":
- dirQAT["brewA"] = '%sBrew.build.macos-%s-release-Rhb32Phbauto.macQAT' % (qtType, platform)
- elif target == "brewAHW":
- dirQAT["brewAHW"] = '%sBrew.build.macos-%s-release-RsysPhbauto.macQAT' % (qtType, platform)
+
+ for qtVer in [5, 6]:
+ if qtVer == 5:
+ qtType = "Qt5"
+ elif qtVer == 6:
+ qtType = "Qt6"
+
+ for key in targetDic.keys():
+ target = targetDic[key]
+ if target == "std":
+ dirQAT[(qtVer, "std")] = '%sMP.build.macos-%s-release-RsysPsys.macQAT' % (qtType.lower(), platform)
+ elif target == "ports":
+ dirQAT[(qtVer, "ports")] = '%sMP.build.macos-%s-release-Rmp33Pmp311.macQAT' % (qtType.lower(), platform)
+ elif target == "brew":
+ dirQAT[(qtVer, "brew")] = '%sBrew.build.macos-%s-release-Rhb33Phb311.macQAT' % (qtType.lower(), platform)
+ elif target == "brewHW":
+ dirQAT[(qtVer, "brewHW")] = '%sBrew.build.macos-%s-release-RsysPhb311.macQAT' % (qtType.lower(), platform)
+ elif target == "ana3":
+ dirQAT[(qtVer, "ana3")] = '%sAna3.build.macos-%s-release-Rana3Pana3.macQAT' % (qtType.lower(), platform)
+ elif target == "brewA":
+ dirQAT[(qtVer, "brewA")] = '%sBrew.build.macos-%s-release-Rhb33Phbauto.macQAT' % (qtType.lower(), platform)
+ elif target == "brewAHW":
+ dirQAT[(qtVer, "brewAHW")] = '%sBrew.build.macos-%s-release-RsysPhbauto.macQAT' % (qtType.lower(), platform)
+
return dirQAT
#------------------------------------------------------------------------------
@@ -142,40 +163,45 @@ def Get_QAT_Directory( targetDic, platform ):
# @param[in] srlDMG serial number of DMG
# @param[in] makeflag True to make; False to clean
#
-# @return a dictionary; key=mnemonic, value=build option list
+# @return a dictionary; key=(qtVer, mnemonic), value=build option list
#------------------------------------------------------------------------------
def Get_Package_Options( targetDic, platform, srlDMG, makeflag ):
- if QtType == 5:
- qtType = "qt5"
- else:
- qtType = "qt6"
+ packOp = dict()
if makeflag:
flag = '-m'
else:
flag = '-c'
- packOp = dict()
- for key in targetDic.keys():
- target = targetDic[key]
- if target == "ports":
- packOp["ports"] = [ '-p', 'LW-%sMP.pkg.macos-%s-release-Rmp32Pmp311' % (qtType, platform),
- '-s', '%d' % srlDMG, '%s' % flag ]
- elif target == "brew":
- packOp["brew"] = [ '-p', 'LW-%sBrew.pkg.macos-%s-release-Rhb32Phb311' % (qtType, platform),
- '-s', '%d' % srlDMG, '%s' % flag ]
- elif target == "brewHW":
- packOp["brewHW"] = [ '-p', 'HW-%sBrew.pkg.macos-%s-release-RsysPhb311' % (qtType, platform),
- '-s', '%d' % srlDMG, '%s' % flag ]
- elif target == "ana3":
- packOp["ana3"] = [ '-p', 'LW-%sAna3.pkg.macos-%s-release-Rana3Pana3' % (qtType, platform),
- '-s', '%d' % srlDMG, '%s' % flag ]
- elif target == "brewA":
- packOp["brewA"] = [ '-p', 'LW-%sBrew.pkg.macos-%s-release-Rhb32Phbauto' % (qtType, platform),
- '-s', '%d' % srlDMG, '%s' % flag ]
- elif target == "brewAHW":
- packOp["brewAHW"] = [ '-p', 'HW-%sBrew.pkg.macos-%s-release-RsysPhbauto' % (qtType, platform),
- '-s', '%d' % srlDMG, '%s' % flag ]
+ for qtVer in [5, 6]:
+ if qtVer == 5:
+ qtType = "Qt5"
+ elif qtVer == 6:
+ qtType = "Qt6"
+
+ for key in targetDic.keys():
+ target = targetDic[key]
+ if target == "std":
+ packOp[(qtVer, "std")] = [ '-p', 'ST-%sMP.pkg.macos-%s-release-RsysPsys' % (qtType.lower(), platform),
+ '-s', '%d' % srlDMG, '%s' % flag ]
+ elif target == "ports":
+ packOp[(qtVer, "ports")] = [ '-p', 'LW-%sMP.pkg.macos-%s-release-Rmp33Pmp311' % (qtType.lower(), platform),
+ '-s', '%d' % srlDMG, '%s' % flag ]
+ elif target == "brew":
+ packOp[(qtVer, "brew")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-release-Rhb33Phb311' % (qtType.lower(), platform),
+ '-s', '%d' % srlDMG, '%s' % flag ]
+ elif target == "brewHW":
+ packOp[(qtVer, "brewHW")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-release-RsysPhb311' % (qtType.lower(), platform),
+ '-s', '%d' % srlDMG, '%s' % flag ]
+ elif target == "ana3":
+ packOp[(qtVer, "ana3")] = [ '-p', 'LW-%sAna3.pkg.macos-%s-release-Rana3Pana3' % (qtType.lower(), platform),
+ '-s', '%d' % srlDMG, '%s' % flag ]
+ elif target == "brewA":
+ packOp[(qtVer, "brewA")] = [ '-p', 'LW-%sBrew.pkg.macos-%s-release-Rhb33Phbauto' % (qtType.lower(), platform),
+ '-s', '%d' % srlDMG, '%s' % flag ]
+ elif target == "brewAHW":
+ packOp[(qtVer, "brewAHW")] = [ '-p', 'HW-%sBrew.pkg.macos-%s-release-RsysPhbauto' % (qtType.lower(), platform),
+ '-s', '%d' % srlDMG, '%s' % flag ]
return packOp
#------------------------------------------------------------------------------
@@ -185,6 +211,7 @@ def Parse_CommandLine_Arguments():
global Usage # usage
global QtType # Qt type
global Target # target list
+ global QtTarget # list of (Qt, target)-tuple
global Build # operation flag
global WithPymod # operation flag
global QATest # operation flag
@@ -198,9 +225,9 @@ def Parse_CommandLine_Arguments():
platform = Test_My_Platform()
if platform in [ "Sonoma", "Ventura", "Monterey" ]:
- targetopt = "1,2,3,4"
+ targetopt = "0,1,2,3,4"
else:
- targetopt = "0"
+ targetopt = None
Usage = "\n"
Usage += "----------------------------------------------------------------------------------------------------------\n"
@@ -209,33 +236,39 @@ def Parse_CommandLine_Arguments():
Usage += " macOS Monterey, Ventura, or Sonoma >>\n"
Usage += "\n"
Usage += "$ [python] nightlyBuild.py\n"
- Usage += " option & argument : comment on option if any | default value\n"
- Usage += " ------------------------------------------------------------------------+--------------\n"
- Usage += " [--qt ] : 5='qt5', 6='qt6' (migration to Qt6 is ongoing) | 5\n"
- Usage += " [--target ] : 1='ports', 2='brew', 3='brewHW', 4='ana3', | '%s'\n" % targetopt
- Usage += " 5='brewA', 6='brewAHW' |\n"
- Usage += " * with --qt=6, use --target='2,3' (4 is ignored) |\n"
- Usage += " [--build] : build and deploy | disabled\n"
- Usage += " [--pymod] : build and deploy Pymod, too | disabled\n"
- Usage += " [--test] : run the QA Test | disabled\n"
- Usage += " [--check] : check the QA Test results | disabled\n"
- Usage += " [--makedmg|--cleandmg ] : make or clean DMGs | disabled\n"
- Usage += " [--upload ] : upload DMGs to $HOME/Dropbox/klayout/ | disabled\n"
- Usage += " [--dryrun] : dry-run for --build option | disabled\n"
- Usage += " [-?|--?] : print this usage and exit | disabled\n"
- Usage += " |\n"
- Usage += " To use this script, make a symbolic link in the project root by: |\n"
- Usage += " $ ln -s ./macbuild/nightlyBuild.py . |\n"
- Usage += " |\n"
- Usage += " Regular sequence for using this script: |\n"
- Usage += " (1) $ ./nightlyBuild.py --build --pymod |\n"
- Usage += " (2) (confirm the build results) |\n"
- 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.28.12' |\n"
- Usage += " (7) $ ./nightlyBuild.py --cleandmg 1 |\n"
- Usage += "---------------------------------------------------------------------------+------------------------------\n"
+ Usage += " option & argument : comment on option if any | default value\n"
+ Usage += " --------------------------------------------------------------------------+--------------\n"
+ Usage += " [--qt ] : 5='qt5', 6='qt6' (migration to Qt6 is ongoing) | 5\n"
+ Usage += " [--target ] : 0='std', 1='ports', 2='brew', 3='brewHW', 4='ana3', | '%s'\n" % targetopt
+ Usage += " 5='brewA', 6='brewAHW' |\n"
+ Usage += " * with --qt=6, use --target='0,1,2,3' (4 is ignored) |\n"
+ Usage += " [--qttarget ] : ex. '5,1' for qt=5, target=1 | disabled\n"
+ Usage += " + This option supersedes, if used, the --qt and --target combination. |\n"
+ Usage += " + You can use this option multiple times. |\n"
+ Usage += " + Or you can pass those list by the 'nightlyBuild.csv' file. |\n"
+ Usage += " A sample file 'macbuild/nightlyBuild.sample.csv' is available. |\n"
+ Usage += " [--build] : build and deploy | disabled\n"
+ Usage += " [--pymod] : build and deploy Pymod, too | disabled\n"
+ Usage += " [--test] : run the QA Test | disabled\n"
+ Usage += " [--check] : check the QA Test results | disabled\n"
+ Usage += " [--makedmg|--cleandmg ] : make or clean DMGs | disabled\n"
+ Usage += " [--upload ] : upload DMGs to $HOME/Dropbox/klayout/ | disabled\n"
+ Usage += " [--dryrun] : dry-run for --build option | disabled\n"
+ Usage += " [-?|--?] : print this usage and exit | disabled\n"
+ Usage += " |\n"
+ Usage += " To use this script, make a symbolic link in the project root by: |\n"
+ Usage += " $ ln -s ./macbuild/nightlyBuild.py . |\n"
+ Usage += " + edit and save ./macbuild/nightlyBuild.csv (optional) |\n"
+ Usage += " |\n"
+ Usage += " Regular sequence for using this script: |\n"
+ Usage += " (1) $ ./nightlyBuild.py --build --pymod |\n"
+ Usage += " (2) (confirm the build results) |\n"
+ 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.28.17' |\n"
+ Usage += " (7) $ ./nightlyBuild.py --cleandmg 1 |\n"
+ Usage += "-----------------------------------------------------------------------------+----------------------------\n"
p = optparse.OptionParser( usage=Usage )
p.add_option( '--qt',
@@ -246,6 +279,11 @@ def Parse_CommandLine_Arguments():
dest='targets',
help='build target list' )
+ p.add_option( '--qttarget',
+ action='append',
+ dest='qt_target',
+ help='(Qt, target)-tuple' )
+
p.add_option( '--build',
action='store_true',
dest='build',
@@ -296,6 +334,7 @@ def Parse_CommandLine_Arguments():
p.set_defaults( qt_type = "5",
targets = "%s" % targetopt,
+ qt_target = list(),
build = False,
with_pymod = False,
qa_test = False,
@@ -331,9 +370,51 @@ def Parse_CommandLine_Arguments():
targetDic = Get_Build_Target_Dict()
Target = list()
for idx in targetIdx:
- if idx in range(1, 7):
+ if idx in range(0, 7):
Target.append( targetDic[idx] )
+ # Populate QtTarget
+ QtTarget = list()
+ for target in Target:
+ QtTarget.append( (QtType, target) )
+ QtType = None
+ Target = None
+ print( "# The --qt and --target combination specifies..." )
+ print(QtTarget)
+
+ if len(opt.qt_target) == 1 and opt.qt_target[0] == "nightlyBuild.csv": # reserved file name
+ QtTarget = list()
+ withqttarget = True
+ df = pd.read_csv( opt.qt_target[0], comment="#" )
+ if len(df) == 0:
+ print( "! --qttarget==nightlyBuild.csv is used but DataFrame is empty" )
+ print(Usage)
+ quit()
+ for i in range(0, len(df)):
+ qt = df.iloc[i,0]
+ idx = df.iloc[i,1]
+ if (qt == 5 and idx in range(0, 7)) or (qt == 6 and idx in [0,1,2,3, 5,6]):
+ QtTarget.append( (qt, targetDic[idx]) )
+ elif len(opt.qt_target) > 0:
+ QtTarget = list()
+ withqttarget = True
+ for item in opt.qt_target:
+ qt = int(item.split(",")[0])
+ idx = int(item.split(",")[1])
+ if (qt == 5 and idx in range(0, 7)) or (qt == 6 and idx in [0,1,2,3, 5,6]):
+ QtTarget.append( (qt, targetDic[idx]) )
+ else:
+ withqttarget = False
+
+ if withqttarget:
+ if len(QtTarget) > 0:
+ print( "# The --qttarget option superseded the --qt and --target combination" )
+ print(QtTarget)
+ else:
+ print( "! --qttarget is used but there is no valid (Qt, target)-tuple" )
+ print(Usage)
+ quit()
+
Build = opt.build
WithPymod = opt.with_pymod
QATest = opt.qa_test
@@ -373,17 +454,18 @@ def Build_Deploy():
myPlatform = Test_My_Platform()
buildOp, logfile = Get_Build_Options( Get_Build_Target_Dict(), myPlatform )
- for key in Target:
- if key == "ana3" and QtType == 6: # anaconda3 does not provide Qt6 so far
+ for qttype, key in QtTarget:
+ if key == "ana3" and qttype == 6: # anaconda3 does not provide Qt6 so far
continue
- deplog = logfile[key].replace( ".log", ".dep.log" )
- command1 = [ pyBuilder ] + buildOp[key]
+ deplog = logfile[(qttype, key)].replace( ".log", ".dep.log" )
- if key in [ "brewHW", "brewAHW" ] :
+ command1 = [ pyBuilder ] + buildOp[(qttype, key)]
+
+ if key in [ "std", "brewHW", "brewAHW" ] :
command2 = "time"
command2 += " \\\n %s" % pyBuilder
- for option in buildOp[key]:
+ for option in buildOp[(qttype, key)]:
command2 += " \\\n %s" % option
command2 += " \\\n %s" % '-y'
command2 += " 2>&1 | tee %s; \\\n" % deplog
@@ -391,7 +473,7 @@ def Build_Deploy():
else:
command2 = "time"
command2 += " \\\n %s" % pyBuilder
- for option in buildOp[key]:
+ for option in buildOp[(qttype, key)]:
command2 += " \\\n %s" % option
command2 += " \\\n %s" % '-Y'
command2 += " 2>&1 | tee %s; \\\n" % deplog
@@ -442,14 +524,14 @@ def Run_QATest( exclude ):
myPlatform = Test_My_Platform()
dirQAT = Get_QAT_Directory( Get_Build_Target_Dict(), myPlatform )
- for key in Target:
- if key == 4 and QtType == 6: # anaconda3 does not provide Qt6 so far
+ for qttype, key in QtTarget:
+ if key == "ana3" and qttype == 6: # anaconda3 does not provide Qt6 so far
continue
command1 = [ pyRunnerQAT ] + [ '--run', '--exclude', '%s' % exclude ]
- print( dirQAT[key], command1 )
+ print( dirQAT[(qttype, key)], command1 )
#continue
- os.chdir( dirQAT[key] )
+ os.chdir( dirQAT[(qttype, key)] )
if subprocess.call( command1, shell=False ) != 0:
print( "", file=sys.stderr )
@@ -477,14 +559,14 @@ def Check_QATest_Results( lines ):
myPlatform = Test_My_Platform()
dirQAT = Get_QAT_Directory( Get_Build_Target_Dict(), myPlatform )
- for key in Target:
- if key == 4 and QtType == 6: # anaconda3 does not provide Qt6 so far
+ for qttype, key in QtTarget:
+ if key == "ana3" and qttype == 6: # anaconda3 does not provide Qt6 so far
continue
- os.chdir( dirQAT[key] )
+ os.chdir( dirQAT[(qttype, key)] )
logfile = glob.glob( "*.log" )
command1 = [ tailCommand ] + [ '-n', '%d' % lines ] + logfile
- print( dirQAT[key], command1 )
+ print( dirQAT[(qttype, key)], command1 )
#continue
if subprocess.call( command1, shell=False ) != 0:
@@ -518,11 +600,11 @@ def DMG_Make( srlDMG ):
shutil.rmtree( stashDMG )
os.mkdir( stashDMG )
- for key in Target:
- if key == 4 and QtType == 6: # anaconda3 does not provide Qt6 so far
+ for qttype, key in QtTarget:
+ if key == "ana3" and qttype == 6: # anaconda3 does not provide Qt6 so far
continue
- command1 = [ pyDMGmaker ] + packOp[key]
+ command1 = [ pyDMGmaker ] + packOp[(qttype, key)]
print(command1)
#continue
@@ -558,11 +640,11 @@ def DMG_Clean( srlDMG ):
if os.path.isdir( stashDMG ):
shutil.rmtree( stashDMG )
- for key in Target:
- if key == 4 and QtType == 6: # anaconda3 does not provide Qt6 so far
+ for qttype, key in QtTarget:
+ if key == "ana3" and qttype == 6: # anaconda3 does not provide Qt6 so far
continue
- command1 = [ pyDMGmaker ] + packOp[key]
+ command1 = [ pyDMGmaker ] + packOp[(qttype, key)]
print(command1)
#continue
diff --git a/macbuild/nightlyBuild.sample.csv b/macbuild/nightlyBuild.sample.csv
new file mode 100644
index 000000000..edc13bc0a
--- /dev/null
+++ b/macbuild/nightlyBuild.sample.csv
@@ -0,0 +1,25 @@
+#-------------------------------------------------------------------------------
+# File: 'nightlyBuild.csv'
+#
+# Descriptions:
+# This file (located where "build.sh" exists) is to be passed to
+# 'nightlyBuild.py' via the --qttarget option.
+#
+# qtVer,target
+# where
+# qtVer = 5 or 6
+# target = [0='std', 1='ports', 2='brew', 3='brewHW', 4='ana3']
+# note that
+# (qtVer,target)=(6,4) will be omitted
+#-------------------------------------------------------------------------------
+qtVer,target
+5,0
+5,1
+5,2
+5,3
+5,4
+#6,0
+#6,1
+#6,2
+#6,3
+#6,4
diff --git a/macbuild/python3HB.py b/macbuild/python3HB.py
index 118fe13f0..a04f0e64a 100755
--- a/macbuild/python3HB.py
+++ b/macbuild/python3HB.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python3
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#==============================================================================