# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

PortSystem                  1.0
PortGroup                   active_variants 1.1
PortGroup                   qt6_info 1.0
PortGroup                   compiler_blacklist_versions 1.0

name                        qt6

categories                  aqua
platforms                   {macosx >= 23} ; # upon change, please update qt6 PG
maintainers                 {mcalhoun @MarcusCalhoun-Lopez} \
                            {reneeotten @reneeotten} openmaintainer

# for OpenSSLException, see source and header files in src/network/ssl of qtbase
# see also https://doc.qt.io/qt-6.8/qtnetwork-index.html#licenses-and-attributions
license                     {LGPL-3 GPL-3 OpenSSLException}

homepage                    https://www.qt.io

version                     6.8.1

# get Qt's version numbers
set branch                  [join [lrange [split ${version} .] 0 1] .]
set qt_major                [lindex [split ${version} .] 0]

# see https://www.qt.io/blog/qt-6.8-released
compiler.c_standard         2011
compiler.cxx_standard       2017

# qcompilerdetection.h emits:
#     error: "Unsupported Apple Clang version"
# which also means Q_CC_CLANG will not be set.
# That causes the check for __has_feature(cxx_unicode_literals) to be skipped, causing
#     error: "Qt6 requires Unicode string support in both the compiler and the standard library"
# to be emitted, even when the unsupported Apple Clang version does support Unicode string literals.
compiler.blacklist-append   {clang < 1100}

master_sites                https://download.qt.io/official_releases/qt/${branch}/${version}/submodules
# file sizes are significantly smaller using xz
use_xz                      yes

supported_archs             arm64 x86_64

# conflict with all other versions of qt6
foreach {qt_base qt_info} ${qt6::available_versions} {
    if { ${qt_base} ne ${name} } {
        conflicts-append    ${qt_base}-qtbase
    }
}

if {${os.platform} eq "darwin" && [vercmp ${macosx_deployment_target} >= 15.0]} {
    macosx_deployment_target 14.0
}

# MacPorts LLVM/Clang version to use when required
set llvm_version            18

# MacPorts Python branch & version to use when required
set python_branch           3.12
set python_version          [join [split ${python_branch} .] ""]

############################################################################### Modules Not Considered
#
# No qtactiveqt      (Windows Only)
# No qtwayland       (Linux Only)
#
###############################################################################

############################################################################### Qt Dependencies
#
# https://code.qt.io/cgit/qt/qt5.git/tree/.gitmodules?h=6.8.1
#
###############################################################################

############################################################################### Module Format
#
# "Qt Module Name" {
#     {
#         checksum, rmd160
#         checksum, sha256
#         checksum, size
#     }
#     dependencies, build
#     dependencies, lib
#     dependencies, Qt module name
#     Qt components provided
#     included in "standard" installation of Qt (empty string is no, explanation string is yes)
#     variant overrides
#     revision number
#     license replacement
# }
#
# module info found at https://doc.qt.io/qt-6.8/qtmodules.html
#
###############################################################################
array set modules {
    qtbase {
        {
            b072164e9f652d4e0cddce1cd209f98289f82448 \
            40b14562ef3bd779bc0e0418ea2ae08fa28235f8ea6e8c0cb3bce1d6ad58dcaf \
            48220752
        }
        ""
        "port:brotli path:bin/dbus-daemon:dbus port:double-conversion port:freetype
            path:lib/pkgconfig/glib-2.0.pc:glib2 path:lib/pkgconfig/harfbuzz.pc:harfbuzz
            path:lib/pkgconfig/icu-uc.pc:icu path:include/turbojpeg.h:libjpeg-turbo port:libb2
            port:libpng port:md4c path:lib/pkgconfig/libpcre2-posix.pc:pcre2
            port:zlib path:lib/pkgconfig/libzstd.pc:zstd"
        ""
        {"Qt Core" "Qt GUI" "Qt Network" "Qt SQL" "Qt Test" "Qt Widgets" "Qt Concurrent" "Qt D-Bus" \
         "Qt OpenGL" "Qt Platform Headers" "Qt Print Support" "Qt XML"}
        ""
        "variant overrides: "
        "revision 1"
        "License: "
    }
    qtsvg {
        {
            58b218ef51fc4362474dea36eb2424dcd89b0b1a \
            3d0de73596e36b2daa7c48d77c4426bb091752856912fba720215f756c560dd0 \
            2006760
        }
        ""
        "port:zlib"
        "qtbase"
        {"Qt SVG"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtdeclarative {
        {
            a1ee70903d445840a3dd27d053cb240695a2f9f1 \
            95d15d5c1b6adcedb1df6485219ad13b8dc1bb5168b5151f2f1f7246a4c039fc \
            36463572
        }
        ""
        ""
        "qtbase qtimageformats qtshadertools qtsvg qtlanguageserver"
        {"Qt QML" "Qt Quick" "Qt Quick Layouts" "Qt Quick Widgets"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtmultimedia {
        {
            396231e4d57a893ee751380c60b19c11699bf780 \
            75fa87134f9afab7f0a62c55a4744799ac79519560d19c8e1d4c32bdd173f953 \
            9664564
        }
        ""
        "port:ffmpeg7 port:pulseaudio"
        "qtbase qtshadertools qtdeclarative qtquick3d"
        {"Qt Multimedia"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qttools {
        {
            da1318133858f7939b54483c64d6d1a69585e2eb \
            9d43d409be08b8681a0155a9c65114b69c9a3fc11aef6487bb7fdc5b283c432d \
            10293192
        }
        ""
        "port:clang-${llvm_version} path:lib/pkgconfig/libzstd.pc:zstd"
        "qtbase qtdeclarative"
        {"Qt Designer" "Qt Help" "Qt UI Tools"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qttranslations {
        {
            c0c567f5d08f173835a9edde49dc3a4d198cf1e2 \
            635a6093e99152243b807de51077485ceadd4786d4acb135b9340b2303035a4a \
            1550288
        }
        ""
        ""
        "qttools"
        {"translation files"}
        ""
        "variant overrides: ~examples ~tests ~debug noarch ~docs"
        "revision 0"
        "License: "
    }
    qtdoc {
        {
            a2367391cefea63ce6f41b55d4a71d2de4297462 \
            70a74663db3989913e547fa17130bdc8c2ccfa36441b5041db406c31eccd7bb2 \
            46007920
        }
        ""
        ""
        "qtdeclarative qttools qtmultimedia"
        {"documentation and examples"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtlocation {
        {
            bdf6d11672b04ad276dc08799b8f901df4ba2ab8 \
            9070db5eb8bb873a1d4e49d3aa922e37e22771c6636d031d3a9f6addae4b59ef \
            3164180
        }
        ""
        ""
        "qtbase qtpositioning qtdeclarative"
        {"Qt Location"}
        "status = preview"
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtpositioning {
        {
            8db0294cab811b699d7f812dbea7b9aefcb269a8 \
            e310e7232591d4beb1785bfff8ff3e77430bdf5e9a17f56694b732f5267df78d \
            661544
        }
        ""
        "port:gconf port:gettext-runtime path:lib/pkgconfig/glib-2.0.pc:glib2"
        "qtbase qtdeclarative qtserialport"
        {"Qt Positioning"}
        ""
        "variant overrides: ~examples ~tests"
        "revision 0"
        "License: "
    }
    qtsensors {
        {
            24dd8619a10fb014399a4fe2198f42e71381b858 \
            41f49b614850d40c647b80e70ef6be759e8fc90ac6cce3ab6f82a357201d9750 \
            1498024
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Sensors"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtconnectivity {
        {
            064805d822ec240d9f9e68970721a839deb2cd6c \
            ccfd46e7ad2290710788274e145fb1f224d8a5ce360764ec10824b5908a6441c \
            1067952
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Bluetooth" "Qt NFC"}
        ""
        "variant overrides: "
        "revision 1"
        "License: "
    }
    qt3d {
        {
            e56f6a52296b843df4504d71095de0f047afb516 \
            08b006871b7bad92597c6b588ca921f630131e579e25079e49c0b34c0d7c4236 \
            141818588
        }
        ""
        "port:assimp port:zlib port:minizip port:pugixml"
        "qtbase qtdeclarative qtshadertools"
        {"Qt 3D"}
        "status = deprecated"
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtimageformats {
        {
            6e64065ce261a84631326cd8968e48439618d7a5 \
            138cc2909aa98f5ff7283e36eb3936eb5e625d3ca3b4febae2ca21d8903dd237 \
            2024820
        }
        ""
        "path:lib/pkgconfig/jasper.pc:jasper port:libmng port:tiff port:webp
            path:include/turbojpeg.h:libjpeg-turbo"
        "qtbase"
        {"Qt Image Formats"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtserialbus {
        {
            a814e354164298f3fb46b2aa6e90b73314ffa67a \
            40788d92ec5c3ae297818e9f9eea9d21e398a54fa3fd8ddd530d324548ed15da \
            548316
        }
        ""
        ""
        "qtbase qtserialport"
        {"Qt Serial Bus"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtserialport {
        {
            c99755a261190e0da52fc4c4f416c923abca8bd1 \
            098e72a5c06d7db003e3eea1b0ed72d7308e3ea9cb9e89b538816dc96c938395 \
            273504
        }
        ""
        ""
        "qtbase"
        {"Qt Serial Port"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtwebsockets {
        {
            51223915d8a3affcef37b48ae41443305e9fa053 \
            e4cfdae8760bedd1c2b00429a6c9bf88cc11c5018dcb46bde277fb1edf341e3f \
            460488
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt WebSockets"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtwebchannel {
        {
            e883f39b6b64495c397ab5c88fc9d3c771916dec \
            6b139f7f9128309e924da145023fa8ea87922bd79693392b3b2e4ba568a5763a \
            207412
        }
        ""
        ""
        "qtbase qtdeclarative qtwebsockets"
        {"Qt WebChannel"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtwebengine {
        {
            a377a8c9afa72c5f081ac61f4fd4c6f93a167753 \
            1ba8e03ac8edcf50ce830e49b63db983de22e96757452975c1d3e6d120ae91bc \
            566480152
        }
        "path:bin/node:nodejs20 port:python${python_version} port:py${python_version}-html5lib port:py${python_version}-ply"
        "port:libpng port:zlib"
        "qtdeclarative qtwebchannel qttools qtpositioning"
        {"Qt WebEngine Qt" "Qt PDF"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtwebview {
        {
            7d4df00b8daf0072520d9e03aa30a124dbce077e \
            f56bc09e9c84fa06f3955871ba37065556696c72be9c7620925eb0fd83569e22 \
            139068
        }
        ""
        ""
        "qtdeclarative qtwebengine"
        {"Qt WebView"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtcharts {
        {
            4f51f3bd597ab7a121d161cc3865be2626626334 \
            2edea3f16e248ef508d99332798645b7f5ab6edbbf2e3d7d78fb674156f07d29 \
            4662224
        }
        ""
        ""
        "qtbase qtdeclarative qtmultimedia"
        {"Qt Charts"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtdatavis3d {
        {
            6b6693d6e2d1f39674e27c34af85e4b793ad1869 \
            dae68fe06db8aa3adedb3067c733352bcb29e42c8afcdc02cfda6755da504b0e \
            3952600
        }
        ""
        ""
        "qtbase qtdeclarative qtmultimedia"
        {"Qt Data Visualization"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtvirtualkeyboard {
        {
            8bd5834b5174b9dd86a4f30d7d8df605f5276ec1 \
            1022a3bc4093ec732e85b659158c8a70a31eecbd0dfef4e4f6c67f474f89a264 \
            3264444
        }
        ""
        "port:hunspell"
        "qtbase qtdeclarative qtsvg qtmultimedia"
        {"Qt Virtual Keyboard"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtscxml {
        {
            96165c245503229065345370da03548ec39bb8f4 \
            2f406f44cfacd6eddb90468012a5d1d99d7a64ec05a21a2a7eda9dfc12614fd6 \
            558424
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt SCXML"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtspeech {
        {
            f3e0a772e0b9f27e1cdc6feec9898c278bb8eccc \
            b0c5fe36c157b0b0cceb89d0d6325e539652f33963f7424cc70300870ce1acdf \
            262512
        }
        ""
        "port:flite"
        "qtbase qtdeclarative qtmultimedia"
        {"Qt TextToSpeech"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtnetworkauth {
        {
            618400a54094a0e90996e08417966d6f85023192 \
            118664ba929c5fbbdf822438bd69bd43674cfee82e504e143da600fe47c74024 \
            253260
        }
        ""
        ""
        "qtbase"
        {"Qt Network Authorization"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtremoteobjects {
        {
            c4171ec120151909e485e428506c6c0d9fb6199b \
            7ef2870f05614b71d1cfdd7ac12acef5294abc43da244a6e9e411f21208f59f8 \
            537132
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Remote Objects"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtlottie {
        {
            a36b0bed2716b331f461ebbdbeb64db5cbb5e3e3 \
            824344c5fcbfdf92b424c21ac96a56b736d5e96afa838689b6207f58e170174a \
            83812
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Lottie Animation"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtquicktimeline {
        {
            e4fb95b152a1bbb3a15cf7397f468f06250e3444 \
            fdbc198e27fd7bce0801fb3cfa336e81932607e6a36c97ae8394880eedfe12a3 \
            110612
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Quick Timeline"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtquick3d {
        {
            6a21bc869ad2bffcc5f7d39f80f8d467d4ec6629 \
            3f3d345e6c95fcd40ab37e6a37cd31811e5d239dea8e142e632d4ea41bf20ce7 \
            75292284
        }
        ""
        "port:assimp"
        "qtbase qtdeclarative qtshadertools"
        {"Qt Quick 3D"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtshadertools {
        {
            6aacd53eecfa4890f47b20cc8a615884ba6a93ba \
            55b70cd632473a8043c74ba89310f7ba9c5041d253bc60e7ae1fa789169c4846 \
            1138644
        }
        ""
        ""
        "qtbase"
        {"Qt Shader Tools"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qt5compat {
        {
            af47ecdd1e3ac8df57036f765e4830c4d9421182 \
            05c8c088b4cd8331fa8a9c8b7ff7c42a088cb112e673eae5708048d0131264fc \
            14632944
        }
        ""
        "path:lib/pkgconfig/icu-uc.pc:icu port:libiconv"
        "qtbase qtdeclarative"
        {"Qt 5 Core Compatibility APIs"}
        "status = deprecated"
        "variant overrides: "
        "revision 1"
        "License: "
    }
    qtlanguageserver {
        {
            7584894aec387dc37c8e5d6883e88caab87a33dc \
            865e9436c1432a53e38a30625b6cee60bf72553ff508047115513a233c8e6d7e \
            150260
        }
        ""
        ""
        "qtbase"
        {"Qt Language Server"}
        "status = preview"
        "variant overrides: ~docs"
        "revision 0"
        "License: "
    }
    qthttpserver {
        {
            fd17f866740e16d7dcf717cd3c78325ff85925e9 \
            5d8cb90fddc359b1c74d1e344656785c418483b185d32d97c12d834ec39b0b27 \
            183724
        }
        ""
        ""
        "qtbase"
        {"Qt HTTP Server"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtquick3dphysics {
        {
            b5e3f720d781dad4313259df65805f4187392479 \
            652e8edb572f0322fb4ab221ed6f7205df5c045e47500990e3c7b748975f0a6e \
            4709588
        }
        ""
        ""
        "qtbase qtdeclarative qtquick3d qtshadertools"
        {"Qt Quick 3D Physics"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtquickeffectmaker {
        {
            c3ab0c991a288ffa8130e84a274cf79e97e5ec01 \
            2d4fdf13356abd90b272cc1836bccb6d6ec8849b72173ea3daef0a5c42fb51f6 \
            4348024
        }
        ""
        ""
        "qtbase qtdeclarative qtquick3d qtshadertools"
        {"Qt Quick Effects"}
        ""
        "variant overrides: "
        "revision 0"
        ""
    }
    qtgraphs {
        {
            f58b8d104373c3575c3df960f6ec235fa8b8f946 \
            1e46e3de69936835652ab40ef8caf5824ea71e26871274561fb65ec142d54a80 \
            4826412
        }
        ""
        ""
        "qtbase qtdeclarative qtquick3d"
        {"Qt Graphs"}
        ""
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
}

############################################################################### SQL Plugin Format
#
# {
#     module name
#     {
#         SQL name
#         revision string
#         {list of feature names}
#         {
#             variant name
#             {
#                 variant name
#                 library dependencies
#                 {list of CMake options to find library}
#             }
#         }
#     }
# }
#
###############################################################################
array set sql_plugins {
    sqlite {
        SQLite
        "revision 0"
        {sql-sqlite system-sqlite}
        {
            sqlite3 {
                "port:sqlite3"
                {
                    -DSQLite3_INCLUDE_DIR=${prefix}/include
                    -DSQLite3_LIBRARY=${prefix}/lib/libsqlite3.dylib
                }
            }
        }
    }
    psql {
        PostgreSQL
        "revision 0"
        {sql-psql}
        {
            postgresql15 {
                "port:postgresql15"
                {
                    -DPostgreSQL_INCLUDE_DIR=${prefix}/include/postgresql15
                    -DPostgreSQL_TYPE_INCLUDE_DIR=${prefix}/include/postgresql15
                    -DCMAKE_LIBRARY_PATH=${prefix}/lib/postgresql15
                }
            }
            postgresql14 {
                "port:postgresql14"
                {
                    -DPostgreSQL_INCLUDE_DIR=${prefix}/include/postgresql14
                    -DPostgreSQL_TYPE_INCLUDE_DIR=${prefix}/include/postgresql14
                    -DCMAKE_LIBRARY_PATH=${prefix}/lib/postgresql14
                }
            }
            postgresql13 {
                "port:postgresql13"
                {
                    -DPostgreSQL_INCLUDE_DIR=${prefix}/include/postgresql13
                    -DPostgreSQL_TYPE_INCLUDE_DIR=${prefix}/include/postgresql13
                    -DCMAKE_LIBRARY_PATH=${prefix}/lib/postgresql13
                }
            }
            postgresql12 {
                "port:postgresql12"
                {
                    -DPostgreSQL_INCLUDE_DIR=${prefix}/include/postgresql12
                    -DPostgreSQL_TYPE_INCLUDE_DIR=${prefix}/include/postgresql12
                    -DCMAKE_LIBRARY_PATH=${prefix}/lib/postgresql12
                }
            }
            postgresql11 {
                "port:postgresql11"
                {
                    -DPostgreSQL_INCLUDE_DIR=${prefix}/include/postgresql11
                    -DPostgreSQL_TYPE_INCLUDE_DIR=${prefix}/include/postgresql11
                    -DCMAKE_LIBRARY_PATH=${prefix}/lib/postgresql11
                }
            }
        }
    }
    mysql {
        MySQL
        "revision 0"
        {sql-mysql}
        {
            mariadb10_11 {
                "port:mariadb-10.11"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.11/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.11/mysql/libmariadb.dylib
                }
            }
            mariadb10_10 {
                "port:mariadb-10.10"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.10/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.10/mysql/libmariadb.dylib
                }
            }
            mariadb10_9 {
                "port:mariadb-10.9"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.9/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.9/mysql/libmariadb.dylib
                }
            }
            mariadb10_8 {
                "port:mariadb-10.8"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.8/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.8/mysql/libmariadb.dylib
                }
            }
            mariadb10_7 {
                "port:mariadb-10.7"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.7/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.7/mysql/libmariadb.dylib
                }
            }
            mariadb10_6 {
                "port:mariadb-10.6"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.6/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.6/mysql/libmariadb.dylib
                }
            }
            mariadb10_5 {
                "port:mariadb-10.5"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.5/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.5/mysql/libmariadb.dylib
                }
            }
            mariadb10_4 {
                "port:mariadb-10.6"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mariadb-10.4/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mariadb-10.4/mysql/libmariadb.dylib
                }
            }
            mysql8 {
                "port:mysql8"
                {
                    -DMySQL_INCLUDE_DIR=${prefix}/include/mysql8/mysql
                    -DMySQL_LIBRARY=${prefix}/lib/mysql8/mysql/libmysqlclient.dylib
                }
            }
        }
    }
}

foreach {module module_info} [array get modules] {
    subport ${name}-${module} {
        distname                            ${module}-everywhere-src-${version}

        revision                            [regexp -inline {[0-9]+} [lindex ${module_info} 7]]

        checksums                           rmd160  [lindex [lindex ${module_info} 0] 0] \
                                            sha256  [lindex [lindex ${module_info} 0] 1] \
                                            size    [lindex [lindex ${module_info} 0] 2]

        set license_string                  [lindex ${module_info} 8]
        set license_string                  [string range ${license_string} 1+[string first ":" ${license_string}] end]
        set license_string                  [string trim ${license_string}]
        if { ${license_string} ne "" } {
            license                         {*}${license_string}
        }

        foreach deps [lindex ${module_info} 1] {
            depends_build-append            [subst ${deps}]
        }

        foreach deps [lindex ${module_info} 2] {
            depends_lib-append              [subst ${deps}]
        }

        foreach qtdeps [lindex ${module_info} 3] {
            depends_lib-append              port:${name}-${qtdeps}
        }

        description                         Tools and Module(s) for Qt Tool Kit ${qt_major}

        set modules_provided_list           [lindex ${module_info} 4]
        if { [llength ${modules_provided_list}] == 1 } {
            set modules_provided_join       [lindex ${modules_provided_list} 0]
        } elseif { [llength ${modules_provided_list}] == 2 } {
            set modules_provided_join       [join ${modules_provided_list} " and "]
        } else {
            set modules_provided_join       [join [list [join [lrange ${modules_provided_list} 0 end-1] ", "] [lindex ${modules_provided_list} end]] ", and "]
        }

        long_description                    Tools and Module(s) for Qt Tool Kit ${qt_major}: ${modules_provided_join}

        if { [lsearch -exact [lindex ${module_info} 6] "~universal"] != -1 } {
            universal_variant               no
        }

        if { [lsearch -exact [lindex ${module_info} 6] "noarch"] != -1 } {
            supported_archs                 noarch
            platforms                       any
        }

        if { [lsearch -exact [lindex ${module_info} 6] "~debug"] == -1 } {
            # debugging seems to be turned on if and only if it is turned on in the base
            # CMAKE_CONFIGURATION_TYPES is set with the FORCE option
            # see https://code.qt.io/cgit/qt/qtbase.git/tree/cmake/QtPostProcessHelpers.cmake
            variant debug description {Build both release and debug libraries} {
                require_active_variants     qt6-qtbase debug ""
            }
            if {![variant_isset debug]} {
                require_active_variants     qt6-qtbase "" debug
            }
        }

        if { [lsearch -exact [lindex ${module_info} 6] "~examples"] == -1 } {
            variant examples description {Build examples} {}
        }

        if { [lsearch -exact [lindex ${module_info} 6] "~tests"] == -1 } {
            variant tests description {Enable tests} {}
        }
    }
}

foreach {module module_info} [array get modules] {
    if { [lsearch -exact [lindex ${module_info} 6] "~docs"] != -1 } { continue }

    subport ${name}-${module}-docs {
        distname                            ${module}-everywhere-src-${version}

        revision                            [regexp -inline {[0-9]+} [lindex ${module_info} 7]]

        checksums                           rmd160  [lindex [lindex ${module_info} 0] 0] \
                                            sha256  [lindex [lindex ${module_info} 0] 1] \
                                            size    [lindex [lindex ${module_info} 0] 2]

        set license_string                  [lindex ${module_info} 8]
        set license_string                  [string range ${license_string} 1+[string first ":" ${license_string}] end]
        set license_string                  [string trim ${license_string}]
        if { ${license_string} ne "" } {
            license                         {*}${license_string}
        }

        depends_build-append                port:${name}-qttools \
                                            port:${name}-sqlite-plugin

        # have the same build dependencies
        foreach deps [lindex ${module_info} 1] {
            depends_build-append [subst ${deps}]
        }

        depends_lib-append                  port:${name}-${module}

        description                         Documentation for Qt Tool Kit ${qt_major}

        set modules_provided_list           [lindex ${module_info} 4]
        if { [llength ${modules_provided_list}] == 1 } {
            set modules_provided_join       [lindex ${modules_provided_list} 0]
        } elseif { [llength ${modules_provided_list}] == 2 } {
            set modules_provided_join       [join ${modules_provided_list} " and "]
        } else {
            set modules_provided_join       [join [list [join [lrange ${modules_provided_list} 0 end-1] ", "] [lindex ${modules_provided_list} end]] ", and "]
        }

        long_description                    Documentation for Qt Tool Kit ${qt_major}: ${modules_provided_join}

        supported_archs                     noarch
        platforms                           any
    }
}

# see https://doc.qt.io/qt-6/sql-driver.html for info on building SQL Database Drivers
foreach {driver driver_info} [array get sql_plugins] {
    set dbms                                [lindex ${driver_info} 0]

    set revision_string                     [string trim [lindex ${driver_info} 1]]
    set revision_string                     [string range ${revision_string} 1+[string last " " ${revision_string}] end]

    set sql_variants                        [lindex ${driver_info} 3]

    subport ${name}-${driver}-plugin {
        distname                            qtbase-everywhere-src-${version}

        revision                            ${revision_string}

        checksums                           rmd160  [lindex [lindex $modules(qtbase) 0] 0] \
                                            sha256  [lindex [lindex $modules(qtbase) 0] 1] \
                                            size    [lindex [lindex $modules(qtbase) 0] 2]

        depends_lib-append                  port:${name}-qtbase

        description                         ${dbms} Database Driver for Qt Tool Kit ${qt_major}
        long_description                    ${dbms} Database Driver for Qt Tool Kit ${qt_major}

        foreach feature {sql-db2 sql-ibase sql-mysql sql-oci sql-odbc sql-psql sql-sqlite system-sqlite} {
            if { ${feature} in [lindex ${driver_info} 2] } {
                configure.args-append       -feature-${feature}
            } else {
                configure.args-append       -no-feature-${feature}
            }
        }

        set worksrcpath                     ${worksrcpath}/src/plugins/sqldrivers

        set any_sql                         no
        foreach {variant_name variant_info} ${sql_variants} {
            set conflict_list ""

            foreach {variant_name_other variant_info_other} ${sql_variants} {
                if { ${variant_name_other} ne ${variant_name} } {
                    lappend conflict_list   ${variant_name_other}
                }
            }

            if { [llength ${conflict_list}] > 0 } {
                variant ${variant_name} conflicts {*}${conflict_list} description "use version [regexp -inline {[0-9].} ${variant_name}] of ${dbms}" {}
            }
            if { ([variant_exists ${variant_name}] && [variant_isset ${variant_name}]) || [llength ${conflict_list}]==0 } {
                set any_sql                 yes
            }
        }

        if { !${any_sql} } {
            default_variants-append         +[lindex ${sql_variants} 0]
            if { ![variant_isset [lindex ${sql_variants} 0]] } {
                known_fail                  yes
                pre-extract {
                    ui_error                "At least one SQL variant must be selected."
                    return -code error      "No SQL variant selected."
                }
            }
        }

        foreach {variant_name variant_info} ${sql_variants} {
            if { ([variant_exists ${variant_name}] && [variant_isset ${variant_name}]) || [llength ${conflict_list}]==0 } {
                depends_lib-append          {*}[lindex ${variant_info} 0]
                configure.post_args-append  {*}[subst [lindex ${variant_info} 1]]

                # :info:configure CMake Error at /opt/local/libexec/qt6/lib/cmake/Qt6/QtPublicSbomHelpers.cmake:2552 (message):
                # :info:configure   No SBOM project name was set.
                configure.post_args-append  -DQT_SBOM_VERIFY=OFF \
                                            -DQT_GENERATE_SBOM=OFF
            }
        }
    }
}

###############################################################################
# Special Cases
###############################################################################
subport ${name}-qttools {
    configure.env-append            LLVM_INSTALL_DIR=${prefix}/libexec/llvm-${llvm_version}

    post-destroot {
        # avoid having to add `-Wl,-rpath ${prefix}/libexec/llvm-${llvm_version}/lib` or something like it
        foreach bin {lupdate qdoc} {
            foreach lib {libclang.dylib libclang-cpp.dylib libLLVM.dylib} {
                system              "install_name_tool -change @rpath/${lib} ${prefix}/libexec/llvm-${llvm_version}/lib/${lib} ${destroot}${qt6.dir}/bin/${bin}"
            }
        }
    }
}

if { ${subport} in [list "${name}-qtwebengine" "${name}-qtwebengine-docs"] } {
    compiler.cxx_standard           2020
    configure.env-append            PYTHON3_PATH=${prefix}/Library/Frameworks/Python.framework/Versions/${python_branch}/bin
    # in ${worksrcpath}, `${qt6.dir}/bin/qt-configure-module . -help` and `${qt6.dir}/bin/qt-configure-module . -list-features`
    # it is not clear why, but icu and ffmpeg support must be added manually
    # native-spellchecker support is off by default
    # support for proprietary codecs could by added via `-webengine-proprietary-codecs`
    configure.args-append           -webengine-icu \
                                    -webengine-ffmpeg \
                                    -webengine-native-spellchecker

    # avoid
    #     xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer
    #     directory '/Library/Developer/CommandLineTools' is a command line tools
    #     instance
    use_xcode                       yes
}

subport ${name}-qtwebengine {
    # manually install icudtl.dat
    post-destroot {
        xinstall -m 0644 ${worksrcpath}/src/3rdparty/chromium/third_party/icu/common/icudtl.dat \
                         ${destroot}${qt6.dir}/lib/QtWebEngineCore.framework/Resources/
    }
}

subport ${name}-qtconnectivity {
    patchfiles-append       CVE-2025-23050-qtconnectivity-6.8.diff
}

subport ${name}-qtmultimedia {
    # GStreamer will be found if gstreamer1 and gstreamer1-gst-plugins-base are installed
    # however, an error will ensue since the GStreamer support requires "Linux DMA buffer support"
    # see
    #     https://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/plugins/multimedia/gstreamer/CMakeLists.txt
    #     https://code.qt.io/cgit/qt/qtmultimedia.git/tree/src/multimedia/configure.cmake
    configure.args-append           -no-gstreamer

    configure.post_args-append      -DFFMPEG_DIR=${prefix}/libexec/ffmpeg7 \
                                    -DAVCODEC_INCLUDE_DIR=${prefix}/libexec/ffmpeg7/include \
                                    -DAVCODEC_LIBRARY=${prefix}/libexec/ffmpeg7/lib/libavcodec.dylib \
                                    -DAVFORMAT_INCLUDE_DIR=${prefix}/libexec/ffmpeg7/include \
                                    -DAVFORMAT_LIBRARY=${prefix}/libexec/ffmpeg7/lib/libavformat.dylib \
                                    -DAVUTIL_INCLUDE_DIR=${prefix}/libexec/ffmpeg7/include\
                                    -DAVUTIL_LIBRARY=${prefix}/libexec/ffmpeg7/lib/libavutil.dylib
}

subport ${name}-qt5compat {
    patchfiles-append               patch-qt5compat-find_libs.diff
}

subport ${name}-qtspeech {
    # ALSA is Linux only (https://www.alsa-project.org/wiki/Main_Page)
    # Speech Dispatcher *might* be made to work on macOS (https://freebsoft.org/speechd)
    configure.args-append           -no-flite-alsa \
                                    -no-speechd
}

if { ${subport} eq "${name}-qtbase" || ${subport} eq "${name}-qtbase-docs" } {

    configure.pre_args-replace      --prefix=${prefix} \
                                    "-prefix ${qt6.dir}"

    # configure options:
    configure.args-append           -opensource \
                                    -confirm-license \
                                    -shared \
                                    -accessibility

    # SQL Options
    foreach driver {db2 ibase mysql oci odbc psql sqlite} {
        configure.args-append       -no-sql-${driver}
    }

    # use -Oz instead of -O2
    configure.args-append           -optimize-size

    configure.args-append           -pkg-config

    # Third Party Libraries:
    configure.args-append           -system-zlib \
                                    -no-mtdev \
                                    -no-journald \
                                    -no-syslog \
                                    -system-libpng \
                                    -system-libjpeg \
                                    -system-freetype \
                                    -system-harfbuzz \
                                    -system-pcre \
                                    -no-openssl \
                                    -no-libproxy \
                                    -glib \
                                    -no-gtk

    # additional options:
    configure.args-append           {-make tools} \
                                    {-nomake examples} \
                                    {-nomake tests} \
                                    -gui \
                                    -widgets \
                                    -cups \
                                    -no-evdev \
                                    -no-tslib \
                                    -icu \
                                    -no-fontconfig \
                                    -no-pch \
                                    -no-ltcg \
                                    -dbus-linked \
                                    -no-use-gold-linker \
                                    -no-separate-debug-info \
                                    -no-xcb \
                                    -no-eglfs \
                                    -no-gbm \
                                    -no-directfb \
                                    -no-linuxfb \
                                    -no-kms \
                                    -no-libinput \
                                    -no-system-proxies \
                                    -no-libudev \
                                    -no-egl

    # macOS/iOS options:
    configure.args-append           -framework \
                                    -securetransport

    # do not opportunistically enable Vulkan support
    # (TODO: is Vulkan support desirable?)
    # see https://trac.macports.org/ticket/62104
    configure.args-append           -no-feature-vulkan

    # attempt to avoid @rpath
    configure.args-append           -no-rpath \
                                    -no-feature-relocatable
}

subport ${name}-qtbase {
    # this subport uses configure script
    PortGroup                       openssl 1.0

    build.cmd                       ninja
    build.post_args-append          -v
    destroot.target                 install

    variant tests description {Enable tests} {
        configure.args-replace      {-nomake tests} \
                                    {-make tests}
    }

    variant examples description {Build examples} {
        configure.args-replace      {-nomake examples} \
                                    {-make examples}
    }

    variant debug description {Build both release and debug libraries} {
        configure.args-replace      -release \
                                    -debug-and-release
    }

    variant openssl description {Use OpenSSL instead of Secure Transport} {
        configure.args-delete       -securetransport \
                                    -no-openssl
        configure.args-append       -openssl-linked

        # configure has issues locating openssl files
        configure.pre_args-append   -DOPENSSL_ROOT_DIR=[openssl::install_area] \
                                    -DOPENSSL_INCLUDE_DIR=[openssl::include_dir] \
                                    -DOPENSSL_LIBRARIES=[openssl::install_area]/lib \
                                    -DOPENSSL_LIBS='-L[openssl::install_area]/lib -lssl -lcrypto'
    }
    default_variants-append         +openssl

    post-destroot {
        # do not record  __qt_initial_c_compiler and __qt_initial_cxx_compiler
        reinplace                   "s|${configure.cc}|/usr/bin/clang|g" \
                                    ${destroot}${qt6.dir}/lib/cmake/Qt6/qt.toolchain.cmake
        reinplace                   "s|${configure.cxx}|/usr/bin/clang++|g" \
                                    ${destroot}${qt6.dir}/lib/cmake/Qt6/qt.toolchain.cmake

        # return to default value of CMAKE_OSX_DEPLOYMENT_TARGET
        #reinplace                   "s|CMAKE_OSX_DEPLOYMENT_TARGET \"${macosx_deployment_target}\"|CMAKE_OSX_DEPLOYMENT_TARGET \"10.14\"|g" \
        #                            ${destroot}${qt6.dir}/lib/cmake/Qt6/qt.toolchain.cmake

        # do not record QT_SOURCE_TREE
        reinplace                   "s|${worksrcpath}|${qt6.dir}/src|g" \
                                    ${destroot}${qt6.dir}/lib/cmake/Qt6BuildInternals/QtBuildInternalsExtra.cmake

        # do not record original_cmake_path
        reinplace                   "s|${prefix}/bin/cmake|/Applications/CMake.app/Contents/bin/cmake|g" \
                                    ${destroot}${qt6.dir}/bin/qt-cmake
        reinplace                   "s|${prefix}/bin/cmake|/Applications/CMake.app/Contents/bin/cmake|g" \
                                    ${destroot}${qt6.dir}/bin/qt-cmake-create

        if { "${qt6.dir}" ne "${prefix}" } {
            # Add dummy cmake find modules that forward to the real ones
            file mkdir "${destroot}${prefix}/lib/cmake/Qt6"
            foreach configfile [list "Qt6Config.cmake" "Qt6ConfigVersion.cmake"] {
                set fd [open "${destroot}${prefix}/lib/cmake/Qt6/${configfile}" "w"]
                puts $fd "set(_PREFIX_PATH_BAK \${CMAKE_PREFIX_PATH})"
                puts $fd "list(APPEND CMAKE_PREFIX_PATH \"${qt6.dir}\")"
                puts $fd "include(\"${qt6.dir}/lib/cmake/Qt6/${configfile}\")"
                puts $fd "set(CMAKE_PREFIX_PATH \${_PREFIX_PATH_BAK})"
                close $fd
            }
        }
    }

    # Qt builds part of the system using environment provided by MacPorts.
    # It builds the rest using its own internal environment.
    # For consistency, clear MacPorts environment.
    configure.cxx_stdlib
    proc portconfigure::should_add_stdlib {} { return false }
    configure.sdkroot
    configure.cc_archflags
    configure.cxx_archflags
    configure.objc_archflags
    configure.objcxx_archflags
    configure.ld_archflags
    configure.cppflags
    configure.cflags
    configure.cxxflags
    configure.objcflags
    configure.objcxxflags
    configure.ldflags
    configure.pipe                  no
    configure.march
    configure.mtune
    configure.universal_ldflags
    configure.universal_cflags
    configure.universal_cxxflags
    configure.universal_cppflags
}

subport ${name}-qtbase-docs {
    # see https://wiki.qt.io/Building_Qt_Documentation
    build.cmd                      cmake --build ${build.dir}
    destroot.target
    build.target                   --target docs
    destroot.cmd                   cmake --build ${build.dir} --target install_docs
}

###############################################################################
# Applies to allmost all modules
###############################################################################
if { ${subport} ne "${name}" && ${subport} ne "${name}-qtbase" && ${subport} ne "${name}-qtbase-docs" } {
    # attempting to match module configure instructions from here: https://www.qt.io/blog/qt-6-build-system
    configure.cmd                   ${qt6.dir}/bin/qt-configure-module
    configure.dir                   ${workpath}/build
    configure.pre_args              ${worksrcpath}
    configure.args-append           -verbose

    build.dir                       ${workpath}/build
    build.cmd                       cmake --build ${build.dir}

    destroot.target

    if { [lindex [split ${subport} -] end] ne "docs" } {
        build.target
        destroot.cmd               cmake --install ${build.dir}
    } else {
        build.target               --target docs
        destroot.cmd               cmake --build ${build.dir} --target install_docs
    }

    if { [variant_exists examples] } {
        configure.post_args-append  -DQT_BUILD_EXAMPLES=[expr {[variant_isset examples] ? ON : OFF}]
    }
    if { [variant_exists tests] } {
        configure.post_args-append  -DQT_BUILD_TESTS=[expr {[variant_isset tests] ? ON : OFF}]
    }
}

###############################################################################
# Applies to all subports except ${name}
#     this code may depend on the subport specific code (e.g., configure.cc)
###############################################################################
depends_build-append                path:bin/cmake:cmake \
                                    port:ninja \
                                    port:pkgconfig

# because CPATH is set, pkgconfig does not include ${prefix}/lib and ${prefix}/include even when requested
# this means that files in ${prefix}/lib and ${prefix}/include are the *last* to be found
# this causes problems when there are files in ${worksrpath} that are unintentionally found instead
configure.env-append                PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 \
                                    PKG_CONFIG_ALLOW_SYSTEM_LIBS=1
build.env-append                    PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 \
                                    PKG_CONFIG_ALLOW_SYSTEM_LIBS=1

configure.universal_args

test.cmd                            ctest
test.args                           -V
test.target

# ninja needs the DESTDIR argument in the environment
destroot.destdir
destroot.env-append                 DESTDIR=${destroot}

# set CMake variables (similar to what cmake PortGroup does)
# to allow using ccache and controlling compiler selection
configure.post_args-prepend         --
configure.post_args-append          -DCMAKE_C_COMPILER=[option configure.cc] \
                                    -DCMAKE_CXX_COMPILER=[option configure.cxx] \
                                    -DCMAKE_OBJC_COMPILER=[option configure.objc] \
                                    -DCMAKE_OBJCXX_COMPILER=[option configure.objcxx] \
                                    -DCMAKE_OSX_DEPLOYMENT_TARGET=${macosx_deployment_target}
if { ${configure.ccache} } {
    if { ${subport} ne "${name}-qtbase" } {
        configure.post_args-append  -DQT_USE_CCACHE=ON
    } else {
        # do not use `configure.args-append -ccache`
        # or `configure.post_args-append -DQT_USE_CCACHE=1`
        # since that affects installed files.
        configure.post_args-append  -DCMAKE_C_COMPILER_LAUNCHER=${prefix}/bin/ccache \
                                    -DCMAKE_CXX_COMPILER_LAUNCHER=${prefix}/bin/ccache \
                                    -DCMAKE_OBJC_COMPILER_LAUNCHER=${prefix}/bin/ccache \
                                    -DCMAKE_OBJCXX_COMPILER_LAUNCHER=${prefix}/bin/ccache
    }
}

test.run                            [expr {[variant_exists tests] && [variant_isset tests] ? yes : no}]

if { ${universal_possible} && [variant_isset universal] } {
    configure.post_args-append      -DCMAKE_OSX_ARCHITECTURES="[join ${configure.universal_archs} \;]"
} elseif { ${configure.build_arch} ne ""  } {
    configure.post_args-append      -DCMAKE_OSX_ARCHITECTURES="${configure.build_arch}"
}

# attempt to avoid @rpath
configure.post_args-append          -DCMAKE_INSTALL_NAME_DIR=${qt6.dir}/lib

post-destroot {
    fs-traverse f ${destroot} {
        if { [file isfile ${f}] && [file extension ${f}] eq ".prl" } {
            # do not record build directory
            reinplace -q            "/^QMAKE_PRL_BUILD_DIR = /d" \
                                    ${f}
        }
    }

    # .app and non-.app programs are both put in ${qt6.dir}/bin
    # put a link of any .app programs in the ${applications_dir}/Qt6
    xinstall -d -m 0755             ${destroot}${applications_dir}/Qt6
    foreach app [glob -nocomplain -tails -directory ${destroot}${qt6.dir}/bin *.app] {
        ln -s                       ${qt6.dir}/bin/${app} \
                                    ${destroot}${applications_dir}/Qt6
    }
}

livecheck.type                      none

###############################################################################
# Special Case: must be near the end since it undoes other code
###############################################################################
subport ${name} {
    # the main port is Meta-port to install various modules
    revision                        0

    description                     Qt Tool Kit ${qt_major}
    long_description                Qt Tool Kit: A cross-platform framework \
                                    (headers, data, and libraries) for writing \
                                    cross-platform GUI-based applications.

    master_sites
    distfiles
    use_configure                   no
    supported_archs                 noarch
    platforms                       any
    installs_libs                   no
    test.run                        no
    depends_extract
    depends_build
    depends_lib
    depends_test

    build                           {}

    # create a dummy file so the port can be successfully activated
    destroot {
        xinstall -d -m 0755         ${destroot}${prefix}/share/doc/${subport}
        set docfile                 [open ${destroot}${prefix}/share/doc/${subport}/README.txt "w"]
        puts ${docfile}             "Meta-port for ${name}"
        puts ${docfile}             "${long_description}"
        close ${docfile}
    }

    foreach {module module_info} [array get modules] {
        if { [lindex ${module_info} 5] eq "" } {
            depends_run-append      port:${name}-${module}
        }
    }
    depends_run-append              port:${name}-sqlite-plugin

    livecheck.type                  regex
    livecheck.url                   https://download.qt.io/archive/qt/${branch}/
    livecheck.regex                 (\\d+(\\.\\d+)+)
}
