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 -*- #==============================================================================