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

name                qt5

categories          aqua
platforms           macosx
maintainers         {mcalhoun @MarcusCalhoun-Lopez} {reneeotten @reneeotten} openmaintainer

# for OpenSSLException, see source and header files in src/network/ssl of qtbase
license             {LGPL-3 GPL-3 OpenSSLException}

homepage            https://www.qt.io

# When updating, also update py-pyside2
set qt_version      5.15.18
version             ${qt_version}
set middle_name     everywhere-opensource
set worksrcdir_middle_name everywhere

# qt5-qtbase is broken on macOS 15+, so fix needs to be done at the top level as all subports depends on it.
# because of `error: 'CGDisplayCreateImageForRect' is unavailable: obsoleted in macOS 15.0 - Please use ScreenCaptureKit instead.`
if {${os.platform} eq "darwin" && [vercmp ${macosx_deployment_target} >= 15.0]} {
    macosx_deployment_target 14.0
}

if { ${subport} eq "${name}-qtwebkit" ||
     ${subport} eq "${name}-qtwebkit-docs" } {
    version         5.9.2
    set middle_name opensource
}
# qtwebkit-examples only has no download for 5.9.2...
if { ${subport} eq "${name}-qtwebkit-examples" } {
    version         5.9.1
    set middle_name opensource
}

PortGroup qt5_variables 1.0

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

# see https://wiki.qt.io/New_Features_in_Qt_5.7
compiler.cxx_standard 2011

master_sites        \
    https://download.qt.io/archive/qt/${branch}/${version}/submodules \
    https://download.qt.io/snapshots/ci/qtwebkit/${branch}/latest/src/submodules/

# latest qtwebengine 5.15.x releases are only tagged on git
if { ${subport} in [list "${name}-qtwebengine" "${name}-qtwebengine-docs"] } {

    version         5.15.19
    # set revision in module info below

    # fetch archives generated by GitHub mirrors: repository uses submodule qtwebengine-chromium
    # which has to be fetched separately and extracted into src/3rdparty
    set qtwebengine_ref v${version}-lts
    # keep this ref synchronized with qt5-qtwebengine-gn to allow distfile reuse
    set qtwebengine_chromium_ref 6d29e9cfcfffa7632cc3858ceaf8940677ba9c91

    distname        qtwebengine-${version}-lts
    set qtwebengine_distfile ${distname}${extract.suffix}
    set qtwebengine_chromium_distname qtwebengine-chromium-${qtwebengine_chromium_ref}
    set qtwebengine_chromium_distfile ${qtwebengine_chromium_distname}${extract.suffix}

    distfiles       \
       ${qtwebengine_distfile}:tagone \
       ${qtwebengine_chromium_distfile}:tagtwo

    master_sites    \
       https://github.com/qt/qtwebengine/archive/${qtwebengine_ref}:tagone \
       https://github.com/qt/qtwebengine-chromium/archive/${qtwebengine_chromium_ref}:tagtwo

    checksums       ${qtwebengine_distfile} \
                    rmd160  6e1a94af2bc76ed012d98ce1fabe7fcb00bcd172 \
                    sha256  33cd20f4a87874f34ef3f9c8d767e006498acc3e6cff89a9c64a9e3387bbfaa5 \
                    size    3778796 \
                    ${qtwebengine_chromium_distfile} \
                    rmd160  a0def2100f9cc956d172c5e77d98450b52a5d272 \
                    sha256  05c17d2facae807577b0b1eeb31bbbb27a02256e7c058f364ede5b67677f3974 \
                    size    469042157

    # Backport fix for https://bugreports.qt.io/browse/QTBUG-138486
    patchfiles-append   patch-qtwebengine-patch-zlib.diff

    # Backport fix for bundled libpng
    patchfiles-append   patch-qtwebengine-libpng.diff

    # fixes for newer LLVM/Clang; Sequoia or newer
    if {${os.platform} eq "darwin" && ${os.major} >= 24} {
        patchfiles-append \
                        patch-qtwebengine-libc++19.diff \
                        patch-qtwebengine-src_3rdparty_chromium_third__party_perfetto_include_perfetto_tracing_internal_track__event__data__source.h.diff \
                        patch-qtwebengine-src_3rdparty_chromium_third__party_blink_renderer_platform_wtf_hash__table.h.diff
    }

    # fix building crc32c on arm64
    patchfiles-append   patch-qtwebengine-crc32c-arm64.diff

    # Using system ninja: no need to extract bundled ninja
    extract.post_args-append --exclude=${distname}/ninja/

    # Using separately-built GN: no need to extract
    extract.post_args-append --exclude=${distname}/gn/

    post-extract {
        ui_debug "delete ${worksrcpath}/src/3rdparty"
        delete ${worksrcpath}/src/3rdparty
        ui_debug "move ${workpath}/${qtwebengine_chromium_distname} ${worksrcpath}/src/3rdparty"
        move ${workpath}/${qtwebengine_chromium_distname} ${worksrcpath}/src/3rdparty
    }
}

# file sizes are significantly smaller using xz
if { ${subport} ni [list ${name} "${name}-docs" "${name}-qtwebengine" "${name}-qtwebengine-docs"] } {
    use_xz yes
}

conflicts qt3 qt3-mac
# conflict with all other version of qt5
foreach {qt_test_name qt_test_info} [array get available_qt_versions] {
    if {${name} ne ${qt_test_name}} {
        conflicts-append [lindex ${qt_test_info} 0]
    }
}

# MacPorts LLVM/Clang version to use when required.
# see: https://trac.macports.org/ticket/70682
if {${os.platform} eq "darwin" && ${os.major} < 19} {
    set llvm_version 18
} else {
    set llvm_version 19
}

############################################################################### Modules Not Considered
#
# No qtactiveqt      (Windows Only)
# No qtandroidextras (Android Only)
# No qtwayland       (Linux Only)
# No qtx11extras     (X11 Only)
# No qtwinextras     (Windows Only)
#
###############################################################################

############################################################################### Finding Dependencies
#
# grep -r "%dependencies" *
# find ./ -name sync.profile
#
# grep -r qtCompileTest *
#
# find ./ -name config.tests
#
# find ./ -name Find\*.cmake
#
# grep -r qtHaveModule *
#
# grep -r packagesExist *
#
# port provides `find ./ -name \*.dylib -exec otool -L {} \; | grep /opt/local/libexec/qt5 | cut -d ' ' -f1` | cut -d : -f2 | sort -u
# port provides `find ./ -name \*.dylib -exec otool -L {} \; | grep /opt/local/lib/ | cut -d ' ' -f1` | cut -d : -f2 | sort -u
#
# https://code.qt.io/cgit/qt/qt5.git/tree/.gitmodules?h=5.14
#
###############################################################################

############################################################################### Notes
#
# qtconnectivity checks for bluetooth libraries
#    bluez and bluez_le (Linux Only)
#
# qtconnectivity depends on
#    qtandroidextras    (Android Only)
#
# qtserialport depends on
#    ntddmodm           (Windows Only)
#
# qttools depends on
#    qtactiveqt         (Windows Only)
#
# qtwebkit has tests for libraries in:
#     Tools/qmake/mkspecs/features/configure.prf
#     Tools/qmake/config.tests/
#
###############################################################################

############################################################################### TODO
#
# TODO: possible to trim dependencies of qtbase?
#
###############################################################################

############################################################################### 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-5.14/qtmodules.html
#
###############################################################################
array set modules {
    qt3d {
        {
            d71d48b3ec73e845e2eadee55d1022a8c4a32c67
            642433ce7a058f537d93766a72b40f838efc897f9e442a825824d094ede1b3a3
            118255028
        }
        ""
        "port:assimp"
        "qtbase qtdeclarative qtimageformats qtgamepad"
        {"Qt 3D"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtbase {
        {
            efce9deb6b60be8271dde4b45ae02385f7099b83
            7b632550ea1048fc10c741e46e2e3b093e5ca94dfa6209e9e0848800e247023b
            51492796
        }
        ""
        "port:zlib port:libpng path:include/turbojpeg.h:libjpeg-turbo port:freetype path:bin/dbus-daemon:dbus path:lib/pkgconfig/glib-2.0.pc:glib2 path:lib/pkgconfig/icu-uc.pc:icu port:pcre2 path:lib/pkgconfig/harfbuzz.pc:harfbuzz port:double-conversion port: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 0"
        "License: "
    }
    qtcharts {
        {
            cc0165e3b77def5e306fe013798531d57a0125e0
            0248addca0838115e13fc5522f1955792f9799742cdcb6abc0fce2f3b1332655
            4232420
        }
        ""
        ""
        "qtbase qtdeclarative qtmultimedia"
        {"Qt Charts"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtconnectivity {
        {
            cb5ee9efc3dba9c2956b05e0b98ba3b26e7e4b67
            3593e1c4ca9976b44baf61502bdd97d29ec2ecb06a2a5e7075045626ba90cd55
            2807316
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Bluetooth" "Qt NFC"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtdatavis3d {
        {
            990beafd82005f4b4004727a9133787f03cf71d3
            56058a3d1f8e30e675aa62775e7fd4234b4de6b1a76e2759be13b3509e160010
            5169520
        }
        ""
        ""
        "qtbase qtdeclarative qtmultimedia"
        {"Qt Data Visualization"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtdeclarative {
        {
            a6b9243b06fa3799dd92da3b9aeba078c5c78226
            876f20c476f07a07c53756b84c8ede7162d455ee0927b995acceb7c64e5c17a7
            21588352
        }
        "port:python312"
        ""
        "qtbase qtsvg"
        {"Qt QML" "Qt Quick" "Qt Quick Layouts" "Qt Quick Widgets"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtdoc {
        {
            2d2f4d0358227b4a7b9922138675e13a520e62d0
            5a335ac20c1d7cdd3fcec7724d9488c9abaf4824cddad2f5a20238bde33f5172
            5766900
        }
        ""
        ""
        "qtdeclarative qttools qtmultimedia qtquickcontrols qtquickcontrols2 sqlite-plugin"
        {"Qt Reference Documentation"}
        "requires all documentation"
        "variant overrides: ~examples ~tests ~debug noarch ~docs"
        "revision 0"
        "License: "
    }
    qtgamepad {
        {
            76a9a1f331a69b48ee28421fac770d463ba8619e
            7f5cf698b7e21a076f78e4bad0d463ef1bdc58b64b9c31262b74556f56b5bf99
            366792
        }
        ""
        "port:libsdl2"
        "qtbase qtdeclarative"
        {"Qt Gamepad"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtgraphicaleffects {
        {
            bab48f79396b0e082cc4a4d4efb581d8f802b6c0
            dbefca590ef1d1f1c79c396f0f28f73cc16465c3a80803acc4a3ffa2f6d63225
            14021560
        }
        ""
        ""
        "qtdeclarative"
        {"Qt Graphical Effects"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtimageformats {
        {
            725ea148a6f5e62a6d43a49fcb50d71eec30aef9
            bf86000a21a1280f7a8aaf12dd9a10e59e778169653b53c86ad8f346fb39c066
            1903016
        }
        ""
        "port:jasper port:libmng port:tiff port:webp"
        "qtbase"
        {"Qt Image Formats"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtlocation {
        {
            23b09c2c8f631676fffdc73661b8ef91832e5d84
            ea2ed52b085989fe38d0e7f9080da4104d4707d60d8d3b5f5a478b9bec325a3c
            6534556
        }
        ""
        "path:lib/pkgconfig/icu-uc.pc:icu port:zlib"
        "qtbase qtdeclarative qtquickcontrols qtquickcontrols2 qtserialport"
        {"Qt Location" "Qt Positioning"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtlottie  {
        {
            63156ccd3cfe1e5d1032e532249704dce32348ef
            637e53489b4ff4c1f5b3840f6e07b5f050940aea087bfc32e23eb14f7f894ca5
            62160
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"A QML API for rendering graphics and animations in JSON format"}
        "technology preview module"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtmacextras {
        {
            dad5e97f50d74834e93227e7a7d2b0b6f09e113c
            382526f8d761af9fc2dab3f84c9df68972df6a78b8413860ce686dcbc32fd4e5
            49600
        }
        ""
        ""
        "qtbase"
        {"Qt Mac Extras"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtmultimedia {
        {
            1baf2e05873f9859d307b2f839ca94e60e0009d1
            4c77fb601d10fdffe4a4749f9008a969d778c3bb0e6734bda39e7f46cd11c38c
            3810252
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Multimedia" "Qt Multimedia Widgets"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtnetworkauth {
        {
            9d2040e4c4e54b72f993c56cd3f6f13a9972d06a
            6ad3083e2bb61f7f265932d9521b5b8cb156b18bae9eead71f7c8bb0d4d59c86
            121828
        }
        ""
        ""
        "qtbase"
        {"Qt Network Authorization"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtpurchasing {
        {
            4283f36d5183e9023f826092d88964052d74c606
            bb470fe068984c9f2446121e9278081cd6e3dab05a32e48da0510f1c324e8439
            501352
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Purchasing"}
        "in-app purchases is of limited value on desktop"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtquick3d {
        {
            a20b4ea2ad7c332860ceaf2617ec5b0dbc246e77
            24743512942e882973abfc71f60e77c350b66d41cc8c9e315171cb84fb638e0c
            55755332
        }
        ""
        "port:assimp"
        "qtbase qtdeclarative"
        {"Provides a high-level API for creating 3D content or UIs based on Qt Quick."}
        "technology preview module; GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtquickcontrols {
        {
            9ac2ac41871cf13e71363c691004514533d1d70e
            78b05bfac92bef099209aa56fdf4ca4558172583752f6736450fc0368bde01df
            5960964
        }
        ""
        ""
        "qtdeclarative qtgraphicaleffects"
        {"Qt Quick Controls" "Qt Quick Dialogs" "Qt Quick Extras"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtquickcontrols2 {
        {
            756a97df3765c7ba405921ae2e91320d9a857bab
            3dfc92cb64fb330ff4538bec7f5c34906289728d53b046f478f05787ddc00db9
            8272372
        }
        ""
        ""
        "qtgraphicaleffects qtimageformats"
        {"Qt Quick Controls 2"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtquicktimeline {
        {
            4fbda687d8ba05eb656a1e18aab53ee87b80bae8
            c602d9af068d415d04822f62a321efd5293f2e9fbef19aa90d2488b3a23bd22b
            82404
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"A platform target to compile Qt applications for the web browsers using WebAssembly."}
        "technology preview module; GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtremoteobjects {
        {
            66f0d20b8585a09fe87339084ccd014a79da4b99
            66b41538740a517973219d882d1ddf7288f3fdcbd5919205d86f539c2fb6b2f6
            356972
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Remote Objects"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtscript {
        {
            48b2918667679b4ca29c0c3ffa8e06d59ff89b2e
            6716d2878d2146f13f11f0fb12f3437c09d85033bdd0684efacb43ea00fa1828
            2644892
        }
        ""
        ""
        "qtbase"
        {"Qt Script" "Qt Script Tools"}
        "deprecated in favor QJS* in Qt QML"
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtscxml {
        {
            89b9204b07bb56ecf4ce04654bcfb108e0f92199
            0a825e5a0cdea0cfa3c162931965c6f8dc6516920cf045591d0f702e8ac6cf38
            415812
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt SCXML"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtsensors {
        {
            9fd76e1b596315ae9cc956ea271b433cc7a310e6
            c804836942c1cb363e71bb42d32cd78f4e8c32b11b712715dae191b9cd372040
            2037808
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt Sensors"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtserialbus {
        {
            0f0eb137bc673cba48256fbba05b328e1a5b17c4
            41630fd283814bdf94d1c53887e46667a374e97e5aebbb4975b26a701cf5fde8
            337096
        }
        ""
        ""
        "qtbase qtserialport"
        {"Qt Serial Bus"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtserialport {
        {
            d434ad634a969099ac035846819d0489a64cf894
            2227339d6e5f42cd3fbac5eb6290f2b768cc7f32c493b587c5735e342ef3a58f
            301032
        }
        ""
        ""
        "qtbase"
        {"Qt Serial Port"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtspeech {
        {
            be7b6deb0ed8037a554664296147484b633a4629
            08721b75b2513f74ad9b5b05b928540e4fb37887e6fa30ff4f8ba8132df47ed1
            81340
        }
        ""
        "port:flite"
        "qtbase qtdeclarative qtmultimedia"
        {"Qt Speech"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtsvg {
        {
            c36815784c494ec52a59f0354eef1913da852ac9
            f40d88ff792512af3500563b05f37b7b83591135b9413454fd308857594d89e9
            1867656
        }
        ""
        ""
        "qtbase"
        {"Qt SVG"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qttools {
        {
            796a064648d781af43554961c3205fb0c4b63e4e
            931e0969d9f9d8f233e5e9bf9db0cea9ce9914d49982f1795fe6191010113568
            8876416
        }
        ""
        "port:clang-${llvm_version}"
        "qtbase qtdeclarative"
        {"Qt Designer" "Qt Help" "Qt UI Tools"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qttranslations {
        {
            8a84388352dc94d11eb0f176b14c2e73dd882723
            e5625757913caf66a9d702ba102ae92cb165d8dde17759b6de9fdea84a1f857f
            1612872
        }
        "port:qt5-qttools"
        ""
        ""
        {"translation files"}
        ""
        "variant overrides: ~examples ~tests ~debug noarch ~docs"
        "revision 0"
        "License: "
    }
    qtvirtualkeyboard {
        {
            414b7a8920e487f16a0db3c7c714999700c377ab
            45dbd864033051dc7cabae365f4855d8fede51ef553c5e66cdf87c439390fc6c
            10938608
        }
        ""
        "port:hunspell"
        "qtbase qtdeclarative qtsvg qtmultimedia qtquickcontrols"
        {"Qt Virtual Keyboard"}
        "GPLv3 license only"
        "variant overrides: "
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtwebchannel {
        {
            6de6b74f219ed15378393cc7c69e7e4b578b8b14
            80d6c00c773e7ded828eb9d6d6d9b08d498307d99110dd229dc9b8b3ed0f142f
            189272
        }
        ""
        ""
        "qtbase qtdeclarative qtwebsockets"
        {"Qt WebChannel"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtwebengine {
        {}
        "port:python27 port:py27-ply path:bin/ninja:ninja port:gperf port:bison port:flex port:qt5-qtwebengine-gn"
        "port:fontconfig port:dbus path:lib/pkgconfig/harfbuzz.pc:harfbuzz path:lib/pkgconfig/glib-2.0.pc:glib2 port:zlib port:minizip port:libevent port:libxml2 path:lib/pkgconfig/poppler.pc:poppler port:pulseaudio port:ffmpeg4 port:libopus port:webp port:libpng port:lcms2 port:freetype port:re2 port:snappy"
        "qtdeclarative qtquickcontrols qtquickcontrols2 qtlocation qtwebchannel qttools"
        {"Qt WebEngine"}
        "very large and relatively new"
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtwebglplugin {
        {
            1ead99bf3430399fb00ccbbb120cfe6c38cbe412
            07c71e71b2ff12ef7c0aa914761c8a5b3eadb64537bd7d351272077a75af9b2a
            53924
        }
        ""
        ""
        "qtbase qtwebsockets qtdeclarative"
        {"QPA plugin for running an application via a browser using streamed WebGL commands"}
        "technology preview module; GPLv3 license only"
        "variant overrides: ~docs ~examples"
        "revision 0"
        "License: {GPL-3 OpenSSLException}"
    }
    qtwebkit {
        {
            8a26829a50529383256107133bd2bee44981b547 \
            c7ce0bbaea5ed89bba04fdf893e3030c8887f15f45dee5958d645a9f577952e1 \
            35301876
        }
        "port:python27 port:bison port:flex"
        "port:fontconfig path:lib/pkgconfig/icu-uc.pc:icu port:leveldb port:webp port:libxml2 port:libxslt port:zlib port:sqlite3 path:include/turbojpeg.h:libjpeg-turbo"
        "qtbase qtdeclarative qtlocation qtmultimedia qtsensors qtwebchannel qtxmlpatterns"
        {"Qt WebKit" "Qt WebKit Widgets"}
        "community support only (use Qt WebEngine)"
        "variant overrides: "
        "revision 9"
        "License: "
    }
    qtwebkit-examples {
        {
            21e9ec7d6b6ebe0e96dde0f59324a814b57048bc
            e4ce4de6b468243abad2baabbe8ddfb05d25b186529bfe88cb8662fc983f54d0
            3426504
        }
        ""
        ""
        "qtwebkit qtdeclarative qtlocation qttools qtwebchannel"
        {"examples for Qt WebKit"}
        "community support only (use Qt WebEngine)"
        "variant overrides: ++examples ~docs "
        "revision 5"
        "License: "
    }
    qtwebsockets {
        {
            41b3177621fdecfeef070451502097ff44b8b587
            8cfc13d6465ab43717c508a90b6be15c5cec4952afb3b8c6e5192dabe83ec610
            239240
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt WebSockets"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtwebview {
        {
            4b0f4796c3e263e8031ab6bc73237f464eb987d4
            0cc3ead5422619c557977135062cc74db3bda056b54d3eabd260e7baa730cf29
            114332
        }
        ""
        ""
        "qtdeclarative qtwebengine"
        {"Qt WebView"}
        "new in 5.6.0; requires qtwebengine"
        "variant overrides: "
        "revision 0"
        "License: "
    }
    qtxmlpatterns {
        {
            e74fce13a0b9079c6f3da9d55a66e958cf842509
            b69fb91faacd130e9051742dd3a032429d01cc6df400560acd394da9ffcf8f23
            5169388
        }
        ""
        ""
        "qtbase qtdeclarative"
        {"Qt XML Patterns"}
        ""
        "variant overrides: "
        "revision 0"
        "License: "
    }
}

############################################################################### SQL Plugin Format
#
# {
#     variant name
#     dependency, library
#     include directory
#     library directory
#     library name
#     obsolete? (empty string is no)
# }
#
###############################################################################
array set sql_plugins {
    {sqlite SQLite "revision 0"} {
        {
            "sqlite3"
            "port:sqlite3"
            "${prefix}/include"
            "${prefix}/lib"
            "-lsqlite3"
            ""
        }
    }
    {psql PostgreSQL "revision 0"} {
        {
            "postgresql16"
            "port:postgresql16"
            "${prefix}/include/postgresql16"
            "${prefix}/lib/postgresql16"
            "-lpq"
            ""
        }
        {
            "postgresql15"
            "port:postgresql15"
            "${prefix}/include/postgresql15"
            "${prefix}/lib/postgresql15"
            "-lpq"
            ""
        }
        {
            "postgresql14"
            "port:postgresql14"
            "${prefix}/include/postgresql14"
            "${prefix}/lib/postgresql14"
            "-lpq"
            ""
        }
        {
            "postgresql13"
            "port:postgresql13"
            "${prefix}/include/postgresql13"
            "${prefix}/lib/postgresql13"
            "-lpq"
            ""
        }
    }
    {mysql MySQL "revision 0"} {
        {
            "mariadb55"
            "port:mariadb"
            "${prefix}/include/mariadb/mysql"
            "${prefix}/lib/mariadb/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_11"
            "port:mariadb-10.11"
            "${prefix}/include/mariadb-10.11/mysql"
            "${prefix}/lib/mariadb-10.11/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_10"
            "port:mariadb-10.10"
            "${prefix}/include/mariadb-10.10/mysql"
            "${prefix}/lib/mariadb-10.10/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_9"
            "port:mariadb-10.9"
            "${prefix}/include/mariadb-10.9/mysql"
            "${prefix}/lib/mariadb-10.9/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_8"
            "port:mariadb-10.8"
            "${prefix}/include/mariadb-10.8/mysql"
            "${prefix}/lib/mariadb-10.8/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_7"
            "port:mariadb-10.7"
            "${prefix}/include/mariadb-10.7/mysql"
            "${prefix}/lib/mariadb-10.7/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_6"
            "port:mariadb-10.6"
            "${prefix}/include/mariadb-10.6/mysql"
            "${prefix}/lib/mariadb-10.6/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_5"
            "port:mariadb-10.5"
            "${prefix}/include/mariadb-10.5/mysql"
            "${prefix}/lib/mariadb-10.5/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_4"
            "port:mariadb-10.4"
            "${prefix}/include/mariadb-10.4/mysql"
            "${prefix}/lib/mariadb-10.4/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mariadb10_3"
            "port:mariadb-10.3"
            "${prefix}/include/mariadb-10.3/mysql"
            "${prefix}/lib/mariadb-10.3/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mysql8"
            "port:mysql8"
            "${prefix}/include/mysql8/mysql"
            "${prefix}/lib/mysql8/mysql"
            "-lmysqlclient"
            ""
        }
        {
            "mysql57"
            "port:mysql57"
            "${prefix}/include/mysql57/mysql"
            "${prefix}/lib/mysql57/mysql"
            "-lmysqlclient_r"
            ""
        }
        {
            "mysql56"
            "port:mysql56"
            "${prefix}/include/mysql56/mysql"
            "${prefix}/lib/mysql56/mysql"
            "-lmysqlclient_r"
            ""
        }
    }
}

# 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

if { ${os.platform} eq "darwin" && ${os.major} < 16 } {
    known_fail  yes
    pre-fetch {
        ui_error "${subport} requires macOS 10.12 or later"
        return -code error "incompatible OS version"
    }
}

foreach {module module_info} [array get modules] {

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

    subport ${name}-${module} {

        if { ${module} ne "qtwebengine" } {
            distname ${module}-${middle_name}-src-${version}
            if { ${module} ni [list "qtwebkit" "qtwebkit-examples"] } {
                worksrcdir ${module}-${worksrcdir_middle_name}-src-${version}
            }
        }

        revision ${revision_string}

        # see https://bugreports.qt.io/browse/QTBUG-35514
        build.target

        if { ${module} ne "qtwebengine" } {
            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] {
            if { ${qtdeps} ne "qtbase" } {
                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 { ${module} eq "qtbase" } {
            # this subport uses configure script (NOT qmake)
            PortGroup           qt5 1.0

            PortGroup           developerversion 1.0

            if { ${os.platform} ne "darwin" } {
                pre-fetch {
                    ui_warn "${subport} is untested on \"${os.platform}\"."
                }
            }

            if { [variant_isset universal] } {
                pre-fetch {
                    ui_warn "Multiple architectures is not a Reference Configuration for Qt."
                    ui_warn "See https://doc.qt.io/qt-5/supported-platforms.html#reference-configurations"
                }
            }


            # patches for CVEs, see: https://wiki.qt.io/List_of_known_vulnerabilities_in_Qt_products

            # TODO: remove when updating to 5.15.19
            patchfiles-append   CVE-2025-4211-qtbase-5.15.diff
            patchfiles-append   CVE-2025-5455-qtbase-5.15.patch
            patchfiles-append   CVE-2025-30348-qtbase-5.15.diff

            # see https://trac.macports.org/ticket/59315
            minimum_developerversions 16 9

            # see https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=270715
            patchfiles-append qtbase-5.15.9-work-around-pyside2-brokenness.patch

            # Neither "pkg-config --cflags Qt5Core" nor "pkg-config --cflags-only-I Qt5Core" will allow
            #     a configure script to find CPPFLAGS since the include mechanism relies on
            #     -F and -framework BOTH being set
            # See e.g. octave
            # See the files mkspecs/features/qt_module.prf and qmake/generators/makefile.cpp
            patchfiles-append patch-pc_files.diff

            # fix build where "backtrace_from_fp" is not defined
            # this patch is specific to version 5.15
            patchfiles-append patch-qt515-highsierra1.diff

            # macOS Tahoe removed AGL.framework
            # https://trac.macports.org/ticket/72729
            patchfiles-append patch-qtbase-tahoe-no-agl-framework.diff

            # find the Rez program
            patchfiles-append patch-find_rez.diff
            post-patch {
                reinplace \
                    "s|__MACPORTS_Rez__|[exec -ignorestderr xcrun --find Rez]|g" \
                    mkspecs/common/mac.conf \
                    mkspecs/features/mac/rez.prf
            }

            #-----------------------------------------------------------------------------
            # qtbase is used for:
            #    1) building qtbase
            #    2) building MacPorts projects via qmake
            #    3) building end-user projects
            #
            # 1 & 2 require consistency with the MacPorts environment
            # 3 requires consistency with the default Qt installation
            #
            # 2 can be achieved via environment variables
            #    (e.g. QMAKE_MACOSX_DEPLOYMENT_TARGET=${macosx_deployment_target})
            #
            # the only way 3 can be achieved is if no changes are made to the build system
            #
            # the following is an attempt to achieve 1 without destroying 3
            #-----------------------------------------------------------------------------

            # save default spec files
            post-extract {
                copy ${worksrcpath}/mkspecs ${worksrcpath}/mkspecs-save
            }

            # ensure qmake builds for the correct architecture
            patchfiles-append patch-qmake_flags.diff
            post-patch {
                if {[variant_exists universal] && [variant_isset universal]} {
                    set arch_replace_cxx [portconfigure::configure_get_universal_archflags]
                    set arch_replace_ld  [portconfigure::configure_get_universal_archflags]
                } else {
                    set arch_replace_cxx [portconfigure::configure_get_archflags cxx]
                    set arch_replace_ld  [portconfigure::configure_get_ld_archflags]
                }
                reinplace \
                    "s|__MACPORTS_CXX_ARCH_FLAGS__|${arch_replace_cxx}|g" \
                    ${worksrcpath}/qmake/Makefile.unix.macos
                reinplace \
                    "s|__MACPORTS_LD_ARCH_FLAGS__|${arch_replace_ld}|g" \
                    ${worksrcpath}/qmake/Makefile.unix.macos
            }

            # respect MacPorts build variables
            patchfiles-append patch-mkspecs.diff

            # respect configure.compiler
            post-patch {
                reinplace \
                    "s|__MACPORTS_CC__|${configure.cc}|g" \
                    ${worksrcpath}/mkspecs/common/clang.conf

                reinplace \
                    "s|__MACPORTS_CXX__|${configure.cxx}|g" \
                    ${worksrcpath}/mkspecs/common/clang.conf
            }

            post-patch {
                # respect configure.cxx_stdlib
                reinplace \
                    "s|__MACPORTS_CXX_STDLIB__|${configure.cxx_stdlib}|g" \
                    ${worksrcpath}/mkspecs/common/clang-mac.conf

                # respect macosx_deployment_target
                reinplace \
                    "s|__MACPORTS_DEPLOYMENT_TARGET__|${macosx_deployment_target}|g" \
                    ${worksrcpath}/mkspecs/common/macx.conf

                #respect configure.optflags
                reinplace \
                    "s|__MACPORTS_OPTFLAGS__|${configure.optflags}|g" \
                    ${worksrcpath}/mkspecs/common/gcc-base.conf
            }

            # respect configure.sdk_version
            post-patch {
                reinplace \
                    "s|__MACPORTS_MAC_SDK__|${qt5.mac_sdk}|g" \
                    ${worksrcpath}/mkspecs/common/macx.conf
            }

            # respect configure.universal_archs or build_arch
            post-patch {
                if {[variant_exists universal] && [variant_isset universal]} {
                    set arch_replace ${configure.universal_archs}
                } else {
                    set arch_replace ${build_arch}
                }
                reinplace \
                    "s|__MACPORTS_DEVICE_ARCHS__|${arch_replace}|g" \
                    ${worksrcpath}/mkspecs/common/macx.conf
            }

            # use MacPorts X11
            post-patch {
                foreach spec {macx-clang} {
                    reinplace \
                        "s|__MACPORTS_PREFIX__|${prefix}|g" \
                        ${worksrcpath}/mkspecs/${spec}/qmake.conf
                }
            }

            # see https://bugreports.qt.io/browse/QTBUG-72903
            post-configure {
                foreach del {QMAKE_LIBS_OPENGL QMAKE_INCDIR_OPENGL} {
                    reinplace \
                        "/${del}\ =/d" \
                        ${worksrcpath}/src/gui/qtgui-config.pri
                }
            }
            post-destroot {
                foreach del {QMAKE_LIBS_OPENGL QMAKE_INCDIR_OPENGL} {
                    reinplace \
                        "/${del}\ =/d" \
                        ${destroot}${qt_mkspecs_dir}/modules/qt_lib_gui_private.pri
                }
            }

            # return modified spec files to the default values
            post-build {
                foreach conf {clang.conf macx.conf clang-mac.conf gcc-base.conf} {
                    move -force ${worksrcpath}/mkspecs-save/common/${conf} ${worksrcpath}/mkspecs/common/${conf}
                }
                foreach spec {macx-clang macx-g++ macx-icc} {
                        move -force ${worksrcpath}/mkspecs-save/${spec}/qmake.conf ${worksrcpath}/mkspecs/${spec}/qmake.conf
                    }
                }

            # --prefix is not recognized.
            configure.pre_args-delete       --prefix=${prefix}

            # --disable-dependency-tracking is not recognized.
            configure.universal_args-delete --disable-dependency-tracking

            # Installation options:
            #-extprefix     SYSROOT/PREFIX
            #-hostprefix    EXTPREFIX
            #-libexecdir    ARCHDATADIR/libexec
            #-hostbindir    HOSTPREFIX/bin
            #-hostlibdir    HOSTPREFIX/lib
            configure.args-append                      \
                -prefix         ${qt_dir}              \
                -bindir         ${qt_bins_dir}         \
                -headerdir      ${qt_includes_dir}     \
                -libdir         ${qt_libs_dir}         \
                -archdatadir    ${qt_archdata_dir}     \
                -plugindir      ${qt_plugins_dir}      \
                -importdir      ${qt_imports_dir}      \
                -qmldir         ${qt_qml_dir}          \
                -datadir        ${qt_data_dir}         \
                -docdir         ${qt_docs_dir}         \
                -translationdir ${qt_translations_dir} \
                -sysconfdir     ${qt_sysconf_dir}      \
                -examplesdir    ${qt_examples_dir}     \
                -testsdir       ${qt_tests_dir}        \
                -hostdatadir    ${qt_host_data_dir}

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

            foreach driver { db2 ibase mysql oci odbc psql sqlite sqlite2 tds } {
                configure.args-append -no-sql-${driver}
            }

                configure.args-append "-platform ${qt_qmake_spec}"

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

            configure.args-append \
                -no-testcocoon    \
                -no-gcov          \
                -force-pkg-config

            # turn off CFG_CLOEXEC if gnulib is installed

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

            # from the configure script:
            #     NOTE: -optimized-tools is not useful in -release mode.

            # http://lists.qt-project.org/pipermail/development/2017-January/028392.html
            # Prefer ICU over iconv
            # ICU requires C++17
            compiler.cxx_standard   2017
            configure.args-append   QMAKE_CXXFLAGS_GNUCXX11=-std=c++17
            patchfiles-append       patch-qtbase-icu-cxx11.diff

            # Additional options:
            configure.args-append       \
                {-make libs}            \
                {-make tools}           \
                {-nomake examples}      \
                {-nomake tests}         \
                -gui                    \
                -widgets                \
                -no-rpath               \
                -verbose                \
                -cups                   \
                -no-iconv               \
                -no-evdev               \
                -no-tslib               \
                -icu                    \
                -no-fontconfig          \
                -strip                  \
                -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-xkbcommon           \
                -no-system-proxies

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

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

            # do not use ${configure.sdk_version}
            # SDK is recorded in ${qt_mkspecs_dir}/qdevice.pri
            # SDK may then be removed if Xcode is updated
            # see https://trac.macports.org/ticket/54044
            # see https://trac.macports.org/ticket/55195
            configure.args-append \
                -sdk macosx

            # configure options that don't show up in configure --help
            configure.args-append \
                -no-libudev       \
                -no-egl

            # 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 no}
            proc portconfigure::should_add_cxx_abi {} {return no}
            compiler.limit_flags yes
            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

            # configure script looks for perl but doesn't seem to use it for our configuration

            # configure script uses gawk if it can find it,
            #    so require it for consistency
            depends_build-append port:gawk

            # unless overridden, configure script uses gmake if it can find it
            configure.env-append MAKE=${build.cmd}

            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

                # see https://trac.macports.org/ticket/51358
                #     for why not a path dependency
                depends_lib-append path:lib/libssl.dylib:openssl
            }
            default_variants-append +openssl

        } else {
            # these subports use qmake
            PortGroup            qmake5 1.0

            # determine which variants are to be turned off
            set request_examples true
            set request_tests    true
            set def_var          ""

            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 } {
                qt5.debug_variant no
            }

            if { [lsearch -exact [lindex ${module_info} 6] "~examples"] != -1 } {
                set request_examples false
            }

            if { [lsearch -exact [lindex ${module_info} 6] "~tests"] != -1 } {
                set request_tests    false
            }

            if { [lsearch -exact [lindex ${module_info} 6] "++examples"] != -1 } {
                set request_examples true
                lappend def_var "+examples"
            }

            if { ${request_examples} } {
                variant examples description {Build examples} {}
            }

            if { ${request_tests} } {
                variant tests description {Enable tests} {}
            }

            if { ${def_var} ne "" } {
                default_variants-append ${def_var}
            }

            # accommodating variant request varies depending on how qtbase was built
            pre-configure {

                # determine if qmake builds examples by default (set via variants)
                if {[active_variants ${name}-qtbase examples ""]} {
                    set base_examples true
                } else {
                    set base_examples false
                }

                # determine if qmake runs tests by default (set via variants)
                if {[active_variants ${name}-qtbase tests ""]} {
                    set base_tests true
                } else {
                    set base_tests false
                }

                # determine if the user wants to build examples
                if { [variant_exists examples] && [variant_isset examples] } {
                    set this_examples true
                } else {
                    set this_examples false
                }

                # determine if the user wants to run tests
                if { [variant_exists tests] && [variant_isset tests] } {
                    set this_tests true
                } else {
                    set this_tests false
                }

                # determine if qmake's default and user requests are compatible; override qmake if necessary
                if { ${this_examples} && !${base_examples}  } {
                    configure.args-append "QT_BUILD_PARTS+=\"examples\""
                }

                if { !${this_examples} && ${base_examples}  } {
                    configure.args-append "QT_BUILD_PARTS-=\"examples\""
                }

                if { ${this_tests} && !${base_tests}  } {
                    configure.args-append "QT_BUILD_PARTS+=\"tests\""
                }

                if { !${this_tests} && ${base_tests}  } {
                    configure.args-append "QT_BUILD_PARTS-=\"tests\""
                }
            }

            ###############################################################################
            # Special Cases
            ###############################################################################

            # special case
            if { ${module} eq "qtdoc" } {
                build.target    docs
                destroot.target install_docs

                # in the process of building the html files, qtdoc looks for all installed modules
                #    with no clear way to select only a subset
                # unless a way is found, ReproducibleBuilds (https://trac.macports.org/wiki/ReproducibleBuilds)
                #    requires qtdoc depend on all the documentation modules
                foreach {module_doc module_doc_info} [array get modules] {
                    if { [lsearch -exact [lindex ${module_doc_info} 6] "~docs"] == -1 } {
                        depends_lib-append port:${name}-${module_doc}-docs
                    }
                }
            }

            # special case
            if { ${module} eq "qtquickcontrols2" } {
                # attempts to link against installed version, which causes an error when upgrading 5.8.0->5.9.1
                qt5.frameworkpaths-append ${worksrcpath}/lib
            }

            # special case
            if { ${module} eq "qtdeclarative" } {
                # https://trac.macports.org/ticket/62806
                # error: typedef redefinition with different types ('char16_t' vs 'unsigned short')
                patchfiles-append  patch-qtdeclarative-masm.diff

                # attempts to link against installed version, which causes an error when upgrading 5.9.3->5.10.0
                qt5.frameworkpaths-append ${worksrcpath}/lib
            }

            # special case
            if { ${module} eq "qtlocation" } {
                PortGroup   boost 1.0

                # use MacPorts' default version of boost
                # remove the includes of headers of vendored version, and since nothing links with boost set it as build dependency
                patchfiles-append patch-qt5location-boost.diff
                boost.depends_type build

                # https://trac.macports.org/ticket/68508
                # do not allow ${prefix}/include/rapidjson to conflict with bundled rapidjson (in bundled mapbox-gl-native)
                configure.cppflags-replace  -I${prefix}/include -isystem${prefix}/include

                # https://trac.macports.org/ticket/67417
                # include/mbgl/util/unique_any.hpp: error: no member named 'move' in namespace 'std'
                patchfiles-append   patch-qtlocation-mbgl-unique_any.hpp.diff

                # https://trac.macports.org/ticket/73016
                patchfiles-append   patch-qtlocation-narrowing-const-reference.diff

                # qtlocation uses
                #    Gypsy (https://gypsy.freedesktop.org/wiki/)
                #    if they can be found
                # Ensure that test fails even if software is installed
                post-patch {
                    foreach test { gypsy } {
                        reinplace "s|return 0;|return 0;\\\n#error turn off test|g" ${worksrcpath}/config.tests/${test}/main.cpp
                    }
                }

                # avoid unnecessary dependency on OpenSSL
                configure.args-append "QMAKE_LIBS_OPENSSL="

                # ICU requires C++17
                compiler.cxx_standard   2017
                configure.args-append   QMAKE_CXXFLAGS_CXX14=-std=c++17
            }

            # special case
            if { ${module} eq "qtquick3d" } {
                # see https://bugreports.qt.io/browse/QTBUG-84037
                patchfiles-append patch-qtquick3d-assimp.diff

                # see config_help.txt
                configure.post_args-append   -- \
                                             -system-quick3d-assimp
            }

            # special case
            if { ${module} eq "qtwebkit" } {

                # Compile fails on case insensitve filesystems due to similar header files from other
                # macports headers found on the include search path.  In particular event.h and archive.h

                post-patch {
                    ui_debug "qt5 Portfile: Forcing qtwebkit's Archive.h and Event.h to the front of the header search path."
                    file mkdir "${worksrcpath}/preferredheaders"
                    file copy ${worksrcpath}/Source/WebCore/loader/archive/Archive.h ${worksrcpath}/preferredheaders/
                    file copy ${worksrcpath}/Source/WebCore/dom/Event.h ${worksrcpath}/preferredheaders/
                }

                configure.cppflags-prepend -I${worksrcpath}/preferredheaders
                configure.ldflags-append -lxml2

                # use MacPorts icu
                #
                # qmake uses pkgconfig to look for icu
                # this feature does not work without "CONFIG += link_pkgconfig"
                patchfiles-append patch-icu.diff

                # QtWebKit is supported by the community and
                #    relies on "implementation detail[s]," which
                #    "may change from version to version"
                patchfiles-append patch-qtwebkit_internal_api.diff

                # find OpenGL headers
                patchfiles-append patch-qtwebkit_opengl_location.diff

                # see https://bugs.webkit.org/show_bug.cgi?id=171612
                patchfiles-append patch-qtwebkit_fix_icu.diff

                # avoid: Project ERROR: Could not find feature mirclient.
                patchfiles-append patch-qtwebkit_fix_mirclient_test.diff

                # work around https://trac.macports.org/ticket/60975
                patchfiles-append patch-webkit_XPathGrammar.y.diff
                patchfiles-append patch-webkit_makegrammar.pl.diff

                # fix compiling with C++17
                patchfiles-append patch-qtwebkit-cxx17.diff

                # work around changed vm_param.h in MacOSX.sdk 11+ -- the older code in 2014-vintage qtwebkit expects
                # PAGE_SHIFT to be set to I386_PAGE_SHIFT when on x86_64
                # the 11.0 + SDK defines that only if MAC_OS_X_VERSION_MIN_REQUIRED is < 101600 (to support arm64 after that)
                if {${os.platform} eq "darwin" && ${os.major} >= 20} {
                    patchfiles-append patch-qtwebkit-FastMalloc.diff
                    patchfiles-append patch-qtwebkit-Platform.h.diff
                    patchfiles-append patch-qtwebkit-MachineStackMarker.cpp.diff
                }

                # qtwebkit uses
                #    glx
                #    libXcomposite
                #    libXrender
                #    if they can be found
                # Ensure that test fails even if software is installed
                post-patch {
                    foreach test { glx libXcomposite libXrender } {
                        reinplace "s|return 0;|return 0;\\\n#error turn off test|g" ${worksrcpath}/Tools/qmake/config.tests/${test}/${test}.cpp
                    }
                }

                # ICU requires C++17
                compiler.cxx_standard   2017
                configure.args-append   QMAKE_CXXFLAGS+=-Wno-error=register
            }

            # special case
            if { ${module} eq "qtwebkit-examples" } {
                # in Qt 5.12, qmake changed how it generated Makefiles
                patchfiles-append patch-qtwebkit-examples_header_location.diff

                # in Qt 5.15.2, need one additional header
                patchfiles-append patch-qtwebkit-examples-browser-qpainterpath.diff
            }

            # special case
            if { ${module} eq "qttools" } {
                # prevent qttools from opportunistically using qtwebkit if it can be found
                patchfiles-append patch-no_qtwebkit.diff

                variant qtwebkit description {build with QtWebkit support} {
                    patchfiles-delete patch-no_qtwebkit.diff
                    depends_lib-append port:${name}-qtwebkit
                }

                post-extract {
                    # these folders are installed and conflict with ${name}-qttools-docs
                    delete ${worksrcpath}/examples/assistant/simpletextviewer/documentation
                    delete ${worksrcpath}/examples/help/contextsensitivehelp/docs
                }

                # see #44934 (and #35067 for the qt4-mac version)
                set framework_list [split ${qt_frameworks_dir} '/']
                set qt_list        [split ${qt_dir} '/']

                while {[llength ${qt_list}] && [llength ${framework_list}]} {
                    set var_qt        [lindex $qt_list        0]
                    set var_framework [lindex $framework_list 0]

                    if { ${var_qt} ne ${var_framework} } {
                        break
                    }

                    # remove first element from list
                    set qt_list        [lreplace ${qt_list}        0 0]
                    set framework_list [lreplace ${framework_list} 0 0]
                }

                set libreplace [string repeat ../ [llength ${qt_list}]][join ${framework_list} /]
                if { ${libreplace} ne "lib" } {
                    patchfiles-append patch-shared.diff
                    post-patch {
                        reinplace "s|__MACPORTS_FRAMWORK_DIR__|${libreplace}|g" ${worksrcpath}/src/macdeployqt/shared/shared.cpp
                    }
                }

                # see: https://trac.macports.org/ticket/70682
                if {${os.platform} eq "darwin" && ${os.major} < 19} {
                    configure.compiler macports-clang-${llvm_version}
                }

                # qdoc now uses libclang for parsing C/C++ code
                # see https://wiki.qt.io/New_Features_in_Qt_5.11
                configure.env-append LLVM_INSTALL_DIR=${prefix}/libexec/llvm-${llvm_version}
            }

            # special case
            if { ${module} eq "qtwebengine" } {
                PortGroup           conflicts_build 1.0

                # see https://doc.qt.io/qt-5/qtwebengine-platform-notes.html
                PortGroup           xcodeversion 1.0

                # see https://trac.macports.org/ticket/61921
                minimum_xcodeversions   {17 10.0.0}

                if { ${os.platform} eq "darwin" && ${os.major} < 17 } {
                    known_fail  yes
                    pre-fetch {
                        ui_error "${subport} requires macOS 10.13 or later"
                        return -code error "incompatible OS version"
                    }
                }

                # build requires Node.js as of 5.15.3
                # nodejs12 (which chromium 87 uses by default) or later are known to work
                # prefer latest LTS Node.js as fallback
                depends_build-append path:bin/node:nodejs20

                # UsingTheRightCompiler (https://trac.macports.org/wiki/UsingTheRightCompiler)
                build.env-append      CXX=${configure.cxx}
                build.env-append      CC=${configure.cc}
                build.env-append      SAMUFLAGS=-j${build.jobs}
                configure.args-append QMAKE_LINK=${configure.cxx}

                # avoid
                #     Undefined symbols for architecture x86_64
                #conflicts_build-append ${subport}
                #
                # Disabled for now; not sure why this was needed
                # See https://github.com/macports/macports-ports/commit/bd858ac96b41#commitcomment-61755245

                # do not opportunistically find MacPorts libraries (e.g. X11 libraries)
                patchfiles-append patch-qtwebengine_tests.diff

                # Fix build with gperf ≥ 3.2
                # See also https://trac.macports.org/ticket/72447
                patchfiles-append gperf.patch

                # Fix missing header files
                # from fix recommended in https://bugreports.qt.io/browse/QTBUG-124375
                patchfiles-append patch-qtwebengine-browser-build.gn.diff

                # Suppress following warnings to avoid Warnings-as-errors:
                # -Wenum-constexpr-conversion
                # -Wunused-but-set-variable
                patchfiles-append patch-qtwebengine_v8_build.gn_error.diff

                # run syncqt.pl to generate headers needed to build from git snapshot (rather than release tarball)
                # system Perl is sufficient, since syncqt.pl only uses standard core modules
                # (although future macOS may not include Perl)
                depends_patch-append port:${name}-qtbase
                post-patch {
                    system -W ${worksrcpath} \
                        "/usr/bin/perl ${prefix}/libexec/${name}/bin/syncqt.pl -version ${version} ."
                }

                # chromium/base/process/process_metrics_mac.cc assumes PAGE_SIZE is a constexpr
                patchfiles-append patch-qtwebengine_chromium_static_page_size.diff

                # Fix build on macOS 15+
                patchfiles-append patch-qtwebengine-chromium-freetype-gzip.diff

                # see https://trac.macports.org/ticket/59294
                use_xcode yes

                # see config_help.txt
                configure.post_args-append         \
                    --                             \
                    -webengine-native-spellchecker \
                    -webengine-kerberos \
                    -webengine-proprietary-codecs \
                    -system-webengine-icu \
                    -system-webengine-ffmpeg

                configure.pkg_config_path   ${prefix}/libexec/ffmpeg4/lib/pkgconfig

                # missing file spell_check_host_chrome_impl_mac.cc
                # TODO: investigate further
                configure.post_args-delete \
                    -webengine-native-spellchecker

                # GN bundled with qtwebengine-chromium has Qt-specific additions
                # To avoid building the bundled GN from scratch when building qtwebengine,
                # the bundled GN is built separately as the qt5-qtwebengine-gn port
                # and qtwebengine is patched to build using the separately-built GN
                # These steps are duplicated in special case for qt5-qtwebengine-docs
                patchfiles-append patch-qtwebengine_gn_binary_path.diff
                post-patch {
                    reinplace -W ${worksrcpath} \
                        "s|@@GN_BINARY@@|${qt_bins_dir}/gn-qtwebengine5.15|g" \
                        configure.pri \
                        src/core/gn_run.pro \
                        src/pdf/gn_run.pro
                }
                # override `"autoDetect": "false"` in src/buildtools/configure.json
                configure.post_args-append \
                    -feature-webengine-system-gn

                # do not depend on commercial LTS release version, as described in
                # https://www.qt.io/blog/building-qt-webengine-against-other-qt-versions
                # based on example in Arch Linux: https://git.io/JMScA
                post-build {
                    foreach webengine_module [list Pdf PdfWidgets WebEngine WebEngineCore WebEngineWidgets] {
                        reinplace "s|${version} |${qt_version} |g" \
                            ${worksrcpath}/lib/cmake/Qt5${webengine_module}/Qt5${webengine_module}Config.cmake
                    }
                }
            }

            # special case
            if { ${module} eq "qtmultimedia" } {
                PortGroup           conflicts_build 1.0

                # avfmediaplayerserviceplugin.h:55: Error: Undefined interface
                conflicts_build-append ${subport}

                # In the file config.tests/openal/openal.pro, defining HEADER_OPENAL_PREFIX means
                #    include directives use macOS OpenAL Framework.
                # In src/multimedia/configure.json, pkgconfig is relied upon, which finds MacPorts openal
                #    for linking.
                # We must choose one or the other.
                # see https://trac.macports.org/ticket/54592
                patchfiles-append patch-qtmultimedia_no_macports_openal.diff

                variant pulseaudio description {Compile PulseAudio support} {
                    depends_lib-append port:pulseaudio
                }

                variant gstreamer description {Compile GStreamer support} {
                    depends_lib-append port:gstreamer1 port:gstreamer1-gst-plugins-base port:gstreamer1-gst-plugins-bad
                }

                # for commands must follow -spec set in PortGroup
                configure.post_args-append --
                if { ![variant_isset pulseaudio] } {
                    configure.post_args-append -no-pulseaudio
                }
                if { ![variant_isset gstreamer] } {
                    configure.post_args-append -no-gstreamer
                }
            }

            # special case
            if { ${module} eq "qt3d" } {
                # the following libraries, even when available, do not seem to affect the build
                # so turn them off
                configure.post_args-append  \
                    --                      \
                    -system-assimp
            }

            # special case
            if { ${module} eq "qtwebkit-examples" && ![variant_isset examples] } {
                # create a dummy file so the port can be successfully activated
                post-destroot {
                    xinstall -d -m 0755 ${destroot}${prefix}/share/doc/${subport}
                    set docfile [open ${destroot}${prefix}/share/doc/${subport}/README.txt "w"]
                    puts ${docfile} "Without the examples variant, no examples are installed"
                    puts ${docfile} "${long_description}"
                    close ${docfile}
                }
            }

            # special case
            if { ${module} eq "qtscript" } {
                # see https://trac.macports.org/ticket/54453
                patchfiles-append patch-qtscript_ceil.diff

                # See https://code.qt.io/cgit/qt/qt5.git/commit/?id=758d922716ebdedeaa6fa26369c8dbb9dff4bae4
                if {[variant_isset examples]} {
                    depends_lib-append  port:${name}-qttools
                }
            }

            # special case
            if { ${module} eq "qtspeech" } {
                # see https://trac.macports.org/ticket/67593
                # error: library not found for -lasound
                configure.post_args-append  \
                    --                      \
                    -no-flite-alsa
            }
        }
    }

    if { [lsearch -exact [lindex ${module_info} 6] "~docs"] == -1 } {

        subport ${name}-${module}-docs {

            supported_archs   noarch
            installs_libs     no
            platforms         any

            if { ${module} ne "qtwebengine" } {
                distname    ${module}-${middle_name}-src-${version}
                if { ${module} ne "qtwebkit" } {
                    worksrcdir ${module}-${worksrcdir_middle_name}-src-${version}
                }
            }

            revision ${revision_string}

            description       Documentation for the port ${name}-${module}
            long_description  {*}${description}

            build.target    docs
            destroot.target install_docs

            if { ${module} ne "qtwebengine" } {
                checksums                                        \
                    rmd160  [lindex [lindex ${module_info} 0] 0] \
                    sha256  [lindex [lindex ${module_info} 0] 1] \
                    size    [lindex [lindex ${module_info} 0] 2]
            }

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

            # depend on the modules for which this subport provides documentation
            # also have the same build dependencies
            depends_build-append port:${name}-${module}
            foreach deps [lindex ${module_info} 1] {
                depends_build-append [subst ${deps}]
            }

            PortGroup           qmake5 1.0

            qt5.debug_variant   no

            # special cases
            if { ${module} eq "qttools" } {
                post-extract {
                    # generated makefiles assume full Qt was built locally
                    xinstall -d -m 0755             ${worksrcpath}/bin/
                    foreach bin {qdoc qhelpgenerator qtattributionsscanner} {
                        ln -s ${qt_bins_dir}/${bin} ${worksrcpath}/bin/
                    }
                }
            } elseif { ${module} eq "qtwebengine" } {
                # UsingTheRightCompiler (https://trac.macports.org/wiki/UsingTheRightCompiler)
                build.env-append      CXX=${configure.cxx}
                build.env-append      CC=${configure.cc}
                configure.args-append QMAKE_LINK=${configure.cxx}
                # see https://trac.macports.org/ticket/59294
                use_xcode yes
                # Use bundled GN from separately-built qt5-qtwebengine-gn port
                # Duplicated from special case for qt5-qtwebengine
                patchfiles-append patch-qtwebengine_gn_binary_path.diff
                post-patch {
                    reinplace -W ${worksrcpath} "s|@@GN_BINARY@@|${qt_bins_dir}/gn-qtwebengine5.15|g" \
                        configure.pri src/core/gn_run.pro src/pdf/gn_run.pro
                }
                configure.post_args-append -- -feature-webengine-system-gn
            } elseif { ${module} eq "qtwebkit" } {
                # avoid: Project ERROR: Could not find feature mirclient.
                patchfiles-append patch-qtwebkit_fix_mirclient_test.diff
                post-extract {
                    # without this file, the makefile ${worksrcpath}/qtwebkit/Source/WebCore/Makefile.WebCore.Target
                    #    keeps generating itself over and over again
                    # this file is only created when the library is being built, however
                    xinstall -d -m 0755 ${worksrcpath}/Source/WebCore/generated
                    touch ${worksrcpath}/Source/WebCore/generated/InspectorBackendCommands.qrc
                }
            } elseif { ${module} eq "qtquick3d" } {
                # see https://bugreports.qt.io/browse/QTBUG-84037
                patchfiles-append patch-qtquick3d-assimp.diff
            } elseif { ${module} eq "qtconnectivity" } {
                # TODO: remove when updating to 5.15.19
                patchfiles-append CVE-2025-23050-qtconnectivity-5.15.diff
            }
        }
    }
}

# see https://doc.qt.io/qt-5/sql-driver.html for info on building SQL Database Drivers
foreach {sql_names sql_info} [array get sql_plugins] {
    set driver          [lindex ${sql_names} 0]
    set dbms            [lindex ${sql_names} 1]
    set revision_string [lindex ${sql_names} 2]
    set revision_string [string range ${revision_string} 1+[string last " " ${revision_string}] end]

    subport ${name}-${driver}-plugin {

        PortGroup qmake5 1.0

        distname qtbase-${middle_name}-src-${version}
        worksrcdir qtbase-${worksrcdir_middle_name}-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]

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

        # special case
        if {${driver} eq "sqlite"} {
        patchfiles-append patch-sql_plugins.diff
        }

        # if there is more than one version of the database system, create variants for each version
        if { [llength ${sql_info}] > 1 } {

            set any_variant_set false

            foreach variant_info ${sql_info} {

                set varName [lindex ${variant_info} 0]

                # find every other variant so it can be marked as conflicting
                set conflicts_list ""
                foreach variant_info2 ${sql_info} {
                    set varName2 [lindex ${variant_info2} 0]

                    if { ${varName} ne ${varName2} } {
                        lappend conflicts_list ${varName2}
                    }
                }

                # get only the numbers from the name
                regexp {[0-9].} ${varName} varVer

                variant ${varName} conflicts ${conflicts_list} description "use version ${varVer} of ${dbms}" {}

                # check if any variant has been set
                if { [variant_isset ${varName}] } {
                    set any_variant_set true
                }
            }

            # ensure at least one variant is set
            if { !${any_variant_set} } {
                default_variants-append +[lindex [lindex ${sql_info} 0] 0]
            }
        }

        # as of Qt 5.8, QMAKE_USE is used to find external libraries
        set use_name [string toupper ${driver}]

        foreach variant_info ${sql_info} {
            set varName [lindex ${variant_info} 0]

            if { ( [variant_exists ${varName}] && [variant_isset ${varName}] ) || [llength ${sql_info}]==1 } {
                depends_lib-append [lindex ${variant_info} 1]

                configure.args-append                                                                \
                    [subst QMAKE_INCDIR_${use_name}+=\"[lindex ${variant_info} 2]\"]  \
                    [subst QMAKE_LIBDIR+=\"[lindex ${variant_info} 3]\"]  \
                    [subst QMAKE_LIBS_${use_name}+=\"[lindex ${variant_info} 4]\"]
            }
        }

        # see https://trac.macports.org/ticket/53248
        # N.B.: changing worksrcdir must come *after* changing qt5.top_level
        qt5.top_level ${worksrcpath}/src/plugins/sqldrivers

        worksrcdir ${worksrcdir}/src/plugins/sqldrivers/${driver}
    }
}

subport ${name}-docs {
    # meta-port to install documentation for various modules

    revision          0

    description       Documentation for Qt Tool Kit ${qt_major}
    long_description  {*}${description}

    master_sites
    distfiles
    use_configure     no
    supported_archs   noarch
    installs_libs     no
    platforms         any

    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 "" } {
            if { [lsearch -exact [lindex ${module_info} 6] "~docs"] == -1 } {
                depends_run-append port:${name}-${module}-docs
            }
        }
    }
}

if { ${subport} eq ${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
    installs_libs     no
    platforms         any

    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
}

set python_framework ""
set depends_check ""
if { [info exists depends_build] } {
    set depends_check "${depends_check} ${depends_build}"
}
if { [info exists depends_lib] } {
    set depends_check "${depends_check} ${depends_lib}"
}

foreach deps ${depends_check} {
    if { [string first ":python27" ${deps}] >= 0 } {
        # If Qt components use Python, ensure that MacPorts python27 is used
        #
        # a better solution would be to force components to use a specific python program
        # how to accomplish such a thing is not entirely clear
        #
        # see #49838
        #
        # version 5.5.1 (at least) of qtwebengine must find a python version in the interval [2.7, 3)
        #    (see mkspecs/features/functions.prf)
        # versions 5.5.1 of qtdeclarative and qtwebkit also use python with no way of specifying which one
        #
        set python_framework ${frameworks_dir}/Python.framework/Versions/2.7
    }
    if { [string first ":python312" ${deps}] >= 0 } {
        # If Qt components use Python 3, ensure that MacPorts python312 is used
        #
        # a better solution would be to force components to use a specific python program
        # how to accomplish such a thing is not entirely clear
        #
        # see #49838
        #
        set python_framework ${frameworks_dir}/Python.framework/Versions/3.12
    }
}
if { ${python_framework} ne "" } {
    configure.env-append PATH=${python_framework}/bin:$env(PATH)
    build.env-append     PATH=${python_framework}/bin:$env(PATH)
}
unset python_framework

post-destroot {
    # see #44204
    foreach f [glob -nocomplain -tails -directory ${destroot}${qt_libs_dir} *.framework] {
        set framework [file rootname ${f}]

        set include_list   [split ${qt_includes_dir}   '/']
        set framework_list [split ${qt_libs_dir} '/']

        while {[llength ${include_list}] && [llength ${framework_list}]} {
            set var_include   [lindex $include_list   0]
            set var_framework [lindex $framework_list 0]

            if { ${var_include} ne ${var_framework} } {
                break
            }

            # remove first element from list
            set include_list   [lreplace ${include_list} 0 0]
            set framework_list [lreplace ${framework_list} 0 0]
        }

        xinstall -d -m 0755 ${destroot}${qt_includes_dir}
        ln -s [string repeat ../ [llength ${include_list}]][join ${framework_list} /]/${f}/Headers ${destroot}${qt_includes_dir}/${framework}
    }

    # .app and non-.app programs are both put in qt_bins_dir
    # put a link of any .app programs in the ${qt_apps_dir}
    if { ${qt_bins_dir} ne ${qt_apps_dir} } {
        xinstall -d -m 0755 ${destroot}${qt_apps_dir}
        foreach app [glob -nocomplain -tails -directory ${destroot}${qt_bins_dir} *.app] {
            ln -s ${qt_bins_dir}/${app} ${destroot}${qt_apps_dir}
        }
    }

    # put configuration files in places they will be found automatically
    if { ${qt_libs_dir} ne "${prefix}/lib" } {

        # put link to pkgconfig files in place where pkgconfig will find it
        # most Qt 5 pkgconfig files begin with Qt5, so link should not conflict with any other Qt installations
        #    exceptions: Enginio (new in Qt 5.3, removed in Qt 5.7)
        xinstall -d -m 0755 ${destroot}${prefix}/lib/pkgconfig
        foreach pcfile [glob -nocomplain -tails -directory ${destroot}${qt_libs_dir}/pkgconfig *.pc] {
            ln -s ${qt_libs_dir}/pkgconfig/${pcfile} ${destroot}${prefix}/lib/pkgconfig
        }

        # put link to cmake files in place where cmake will find it
        # most Qt 5 cmake directories begin with Qt5, so link should not conflict with any other Qt installations
        #    exceptions: Enginio (new in Qt 5.3, removed in Qt 5.7)
        xinstall -d -m 0755 ${destroot}${prefix}/lib/cmake
        foreach cmakedir [glob -type d -nocomplain -tails -directory ${destroot}${qt_libs_dir}/cmake *] {
            xinstall -d -m 0755 ${destroot}${prefix}/lib/cmake/${cmakedir}
            foreach cmakefile [glob -tails -directory ${destroot}${qt_libs_dir}/cmake/${cmakedir} *.cmake] {
                ln -s ${qt_libs_dir}/cmake/${cmakedir}/${cmakefile} ${destroot}${prefix}/lib/cmake/${cmakedir}/
            }
        }

        # if cmake finds configuration files in ${prefix}/lib/cmake, CMAKE_CURRENT_LIST_DIR expands to ${prefix}/lib/cmake/xxx
        # cmake configuration files actually installed in ${qt_cmake_module_dir}/xxx
        foreach cmakedir [glob -type d -nocomplain -tails -directory ${destroot}${qt_libs_dir}/cmake *] {
            foreach cmakefile [glob -nocomplain -directory ${destroot}${qt_libs_dir}/cmake/${cmakedir} *.cmake] {
                reinplace -q "s|\\\${CMAKE_CURRENT_LIST_DIR}|${qt_cmake_module_dir}/${cmakedir}|g" ${cmakefile}
            }
        }
    }
}

if {${subport} eq ${name}} {
    livecheck.type      regex
    livecheck.url       https://download.qt.io/archive/qt/${branch}/
    livecheck.regex     (\\d+(\\.\\d+)+)/
} elseif {${subport} eq "${name}-qtwebengine"} {
    livecheck.type      regex
    livecheck.url       https://api.github.com/repos/qt/qtwebengine/git/refs/tags
    livecheck.regex     \"refs/tags/v(\\d+(\\.\\d+)+)-lts\"
} else {
    livecheck.type      none
}

foreach {component component_info} [array get qt5pg::qt5_component_lib] {

    set suffix [lindex ${component_info} 3]

    set qt_version_introduced [lindex ${component_info} 0]
    set qt_version_removed    [lindex ${component_info} 1]

    if { [vercmp ${qt_version_removed} ${qt_version}] <= 0 } {
        subport ${name}-${component}${suffix} {
            PortGroup obsolete 1.0

        }

        if { ${component} ne "qtquick1" && ${component} ne "qtwebkit-examples" && ${component} ne "qtdoc" && ${suffix} ne "-plugin" } {
            subport ${name}-${component}${suffix}-docs {
                PortGroup obsolete 1.0

            }
        }
    }
}

# Qt 5.7 will not work on Mac OS X 10.7
# Qt 5.8 will not work on OS X 10.8
# Qt 5.9 will not work on OS X 10.9
# Qt 5.10 will not work on OS X 10.10
# Qt 5.12 will not work on OS X 10.11
# Qt 5.14 will not work on OS X 10.12
# replace qt5-XYZ port with qt5{6,7,8,9,11,13}-XYZ port
if { ${os.platform} eq "darwin" && ${os.major} < 17} {

    if { ${os.major} < 12 } {
        set qt_replace_version 5.6
    } elseif { ${os.major} < 13 } {
        set qt_replace_version 5.7
    } elseif { ${os.major} < 14 } {
        set qt_replace_version 5.8
    } elseif { ${os.major} < 15 } {
        set qt_replace_version 5.9
    } elseif { ${os.major} < 16 } {
        set qt_replace_version 5.11
    } else {
        set qt_replace_version 5.13
    }

    set qt_replace_name qt[join [split ${qt_replace_version} .] ""]
    set qt_replace_port ${qt_replace_name}[string range ${subport} 3 end]

    set suffix [string range ${subport} [string last - ${subport}] end]
    if { ${suffix} eq "-docs" } {
        set component [string range ${subport} 4 end-5]
    } else {
        set component [string range ${subport} 4 end]
    }

    if { ${component} eq "" } {
        replaced_by      ${qt_replace_port}
        conflicts-delete ${qt_replace_port}
    } else {
        set component_info $qt5pg::qt5_component_lib(${component})
        set qt_version_introduced [lindex ${component_info} 0]
        set qt_version_removed    [lindex ${component_info} 1]

        if { [vercmp ${qt_version_introduced} ${qt_replace_version}] <= 0 && [vercmp ${qt_version_removed} ${qt_replace_version}] > 0 } {
            replaced_by      ${qt_replace_port}
            conflicts-delete ${qt_replace_port}
        } elseif {[vercmp ${qt_version_introduced} ${qt_replace_version}] > 0 && ![catch {set installed [lindex [registry_active ${subport}] 0]}]} {
            # this should not really be possible
            # Qt 5.14.0 built on macOS Sierra, but Qt 5.14.1 did not
            # so the upgrade path could be qt5 (5.14.0) --> qt513 (5.13.2)
            # this is a problem for qtquick3d and qtquicktimeline because they were introduced in 5.14.0
            # see https://trac.macports.org/ticket/60045
            replaced_by      ${qt_replace_name}-qtbase
            conflicts-delete ${qt_replace_name}-qtbase
        }
    }
}
