# -*- 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} 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.15 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.` platform darwin 24 { 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/official_releases/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.17 # 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 207c2ac45ca3386d153770c6b0d2ea2ec21ca880 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 cd3d0165b4f288e023a94ef986038b3f37511832 \ sha256 4910b864d81d005ea57d96f7841270139ba33ab221128d29acb314416798a261 \ size 3778634 \ ${qtwebengine_chromium_distfile} \ rmd160 08467be550315e7f487514a64972dc9e4d91fd4b \ sha256 725f5b35f5361ce05f225e703ae02df808a29da408af16e599b8039f4faf794f \ size 463365153 # 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. set llvm_version 18 ############################################################################### 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 { { d1e37ba6de35f817bb35afc5c5430a38aae04417 \ 5a400db06eb676dab23f9d4d25805bf051e38380b9b37ade3340cc2c3130db73 \ 118255492 } "" "port:assimp" "qtbase qtdeclarative qtimageformats qtgamepad" {"Qt 3D"} "" "variant overrides: " "revision 0" "License: " } qtbase { { 7ff4cbd9d13c17acfe2afa02306a450112e07e71 \ e5f941fecf694ecba97c550b45b0634e552166cc6c815bcfdc481edd62796ba1 \ 51366204 } "" "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 { { 7acff484e6181757993edace2ebbe74ea0c7f262 \ 71276bb80db9140810cce1213edbc227a833e29390f8cb8d903d1c9e5ece0a45 \ 4246388 } "" "" "qtbase qtdeclarative qtmultimedia" {"Qt Charts"} "GPLv3 license only" "variant overrides: " "revision 0" "License: {GPL-3 OpenSSLException}" } qtconnectivity { { d3669dec8fdd051382fffd6a74fbcfee720eaea9 \ 6d014421596ecf53c341b30d256c5c65108787dcce3def41e86acb7344f615b0 \ 2820640 } "" "" "qtbase qtdeclarative" {"Qt Bluetooth" "Qt NFC"} "" "variant overrides: " "revision 0" "License: " } qtdatavis3d { { b5f202d848082dbc55168ed71daf6009ee573b8f \ c045ec186f418ab83e28fb13f89081f213058fc2f09aaaf9e39561d8d41a9c88 \ 5184772 } "" "" "qtbase qtdeclarative qtmultimedia" {"Qt Data Visualization"} "GPLv3 license only" "variant overrides: " "revision 0" "License: {GPL-3 OpenSSLException}" } qtdeclarative { { 9af037e35c3ed1470a3a6bd4514981e730c2694a \ ff5fed427aca97d24c2bb94c1ed492b16e6d5920e92a7e38ffa79c426604ac1a \ 21596972 } "port:python312" "" "qtbase qtsvg" {"Qt QML" "Qt Quick" "Qt Quick Layouts" "Qt Quick Widgets"} "" "variant overrides: " "revision 0" "License: " } qtdoc { { 9b868184254b3778e585345f39a92e928f5a4900 \ ce424b60d9bcb84826f4b17dc7ac3de073b3160f8e755742dd7b90b09e98ab83 \ 5779424 } "" "" "qtdeclarative qttools qtmultimedia qtquickcontrols qtquickcontrols2 sqlite-plugin" {"Qt Reference Documentation"} "requires all documentation" "variant overrides: ~examples ~tests ~debug noarch ~docs" "revision 0" "License: " } qtgamepad { { 2e9e9fc24f35932b6cebeee9146a9c9f2c5ec809 \ 64c7f22df2b082766be4658ab5e59e07965f1648d060598c49de5031911f2065 \ 380888 } "" "port:libsdl2" "qtbase qtdeclarative" {"Qt Gamepad"} "" "variant overrides: " "revision 0" "License: " } qtgraphicaleffects { { 0211e08283a246c379f78ffc1244a0acf6129065 \ 09a3e5e2958d1ac262318c1b0ecabf3493289213a808e80ea0c6b94a2acafdf0 \ 14034724 } "" "" "qtdeclarative" {"Qt Graphical Effects"} "" "variant overrides: " "revision 0" "License: " } qtimageformats { { 786fc0578fc0ced1ed913c1b4f3d9742e03fbf98 \ 39fa9a16477d31e3225938c8c9169cda4605dfd2e8811c5c945077bf9f0b453d \ 1890840 } "" "port:jasper port:libmng port:tiff port:webp" "qtbase" {"Qt Image Formats"} "" "variant overrides: " "revision 0" "License: " } qtlocation { { cbcd84ec454ada93f08bda9c3eb9f96e2944782c \ 62def9692fd8102293786d61a924cc8a00da2c0daf867ab485a9d3f483ce4549 \ 6549724 } "" "path:lib/pkgconfig/icu-uc.pc:icu port:zlib" "qtbase qtdeclarative qtquickcontrols qtquickcontrols2 qtserialport" {"Qt Location" "Qt Positioning"} "" "variant overrides: " "revision 0" "License: " } qtlottie { { 7d206165ec6728b7af7ea9efd4f9a38ffe172500 \ 8984a59a6732dd8daff3ffc89fde1ab8b17fc3d95a43412a8814f9d743c7f5d1 \ 76324 } "" "" "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 { { 73b7f036edb436d7292599ef2f01e679fff1540a \ fa5245ba71e6e50a41a34467f6a9a697a7f3174d65abe18af30e6340d80bec60 \ 63544 } "" "" "qtbase" {"Qt Mac Extras"} "" "variant overrides: " "revision 0" "License: " } qtmultimedia { { 4829ef0aa3c1ed3882680878223e572efe2f5237 \ a7b4a801d2400e05ca5e5ce9d15d2af9dc03262a3148dc57d8e2b29c13ffd7f8 \ 3841580 } "" "" "qtbase qtdeclarative" {"Qt Multimedia" "Qt Multimedia Widgets"} "" "variant overrides: " "revision 0" "License: " } qtnetworkauth { { 30a06b10d94dce653b7dfb1f50786077f3dd2ca9 \ 2903fd11e60cad0d4f4e0c86cae8af516db5b41f68a8736676e7ffae9a9217f1 \ 135604 } "" "" "qtbase" {"Qt Network Authorization"} "" "variant overrides: " "revision 0" "License: " } qtpurchasing { { b111c2e23448c6ea300be7d346566161fab8850c \ 59e0423a926137802c16dfb441e3c2d873a3813297fa64504d0afe6d36658844 \ 300856 } "" "" "qtbase qtdeclarative" {"Qt Purchasing"} "in-app purchases is of limited value on desktop" "variant overrides: " "revision 0" "License: {GPL-3 OpenSSLException}" } qtquick3d { { 47b3a16e3e745b7a7bdf76c85be1cc4df2e5290c \ 8642e4b3191eba7763d8a0f46272830f315fbf3d5539c5ada7fa9c1f0e8040ef \ 55783696 } "" "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 { { 7e8d893df2cf3914dde66283f9aac033eb6439ae \ b02430c25a6e543eed2ec6ffc7e0786ed8b5b169f3f679d21f2c489f4f06ce2a \ 5973656 } "" "" "qtdeclarative qtgraphicaleffects" {"Qt Quick Controls" "Qt Quick Dialogs" "Qt Quick Extras"} "" "variant overrides: " "revision 0" "License: " } qtquickcontrols2 { { f1cb96823e730ab221bb634b4f1e571da49540cf \ fe16175f55f518d358ec3c2ba10769cc0b1bfd5b28515d3305267c61127db724 \ 8285788 } "" "" "qtgraphicaleffects qtimageformats" {"Qt Quick Controls 2"} "" "variant overrides: " "revision 0" "License: " } qtquicktimeline { { 2929db63c5d4188b1169f658beee8fc6947d4b56 \ 880c1c804c15cdf621041e59a4503f8ee83e5e4abc106e947a0e7356945fea6c \ 96544 } "" "" "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 { { 02aa1a9be049d3773a8302852f96a028c7fc3546 \ cf9ab6f453c0cd20443a912a13fae48a7fdece8b4409adc1b57ffd319c5f53b7 \ 370512 } "" "" "qtbase qtdeclarative" {"Qt Remote Objects"} "" "variant overrides: " "revision 0" "License: " } qtscript { { 1d3b1e56ec6be914fd7f30a4a7075ee7441c28b4 \ ed6edb23556558fef44835a6a1ca5eb6a632f2df0373d11ca1e424d93658c2eb \ 2657832 } "" "" "qtbase" {"Qt Script" "Qt Script Tools"} "deprecated in favor QJS* in Qt QML" "variant overrides: " "revision 0" "License: " } qtscxml { { 97b75a8f6fd5ebcf36210df1cd08e5fae7a16004 \ 8e7ff0e13bbdf6bc6f3141d62cf6b21a62ed5a21a4aa2079258fb548d80885c8 \ 429200 } "" "" "qtbase qtdeclarative" {"Qt SCXML"} "" "variant overrides: " "revision 0" "License: " } qtsensors { { 2e076d7ce2149ac4ec7029cc88e14f30aee6393d \ 65deb05352c2777a3d77737985120fc70c6a7d555d4a1a6de26af7e906f161b5 \ 2051112 } "" "" "qtbase qtdeclarative" {"Qt Sensors"} "" "variant overrides: " "revision 0" "License: " } qtserialbus { { 0c241d8beb2946a59c791916f4fd4d7d1873f20d \ 6bbaed75788b382130660930938054e41d15474bbc9e4fc53dc422aa67cf5537 \ 350808 } "" "" "qtbase qtserialport" {"Qt Serial Bus"} "" "variant overrides: " "revision 0" "License: " } qtserialport { { 4e79c9f7d4114e0f86510dbba721acf918a99aa6 \ 6538fcc175c3d3b5f801d97124d693934f5a4d203e3b068a35d7ce6125bd9e98 \ 314744 } "" "" "qtbase" {"Qt Serial Port"} "" "variant overrides: " "revision 0" "License: " } qtspeech { { cd2582aae3bc20df93d6a6555b2294c0f217a975 \ 090125ce13c4219c7e2291e7a248c0923fd8534f0667fabd544ca377e9a8b305 \ 95868 } "" "port:flite" "qtbase qtdeclarative qtmultimedia" {"Qt Speech"} "" "variant overrides: " "revision 0" "License: " } qtsvg { { ae7d105efa69ad30c283fa39941c0317c052bcf7 \ 577b63c53bfb1c2a5099cf46540bb5b8ef595de9fcc390193cd239720b33d04b \ 1880732 } "" "" "qtbase" {"Qt SVG"} "" "variant overrides: " "revision 0" "License: " } qttools { { f6f08e63c6ac3143cf0cce114733e11167c7d358 \ 71946704c6bd6c925910288b97dfcc2e357d4a28e22c8651a5813aae4f238028 \ 8889004 } "" "port:clang-${llvm_version}" "qtbase qtdeclarative" {"Qt Designer" "Qt Help" "Qt UI Tools"} "" "variant overrides: " "revision 0" "License: " } qttranslations { { 0fb0784e590754ccb6616deed8a684f7d17efbc9 \ 33e077ea098c86ad5616e5ae11458484ba846db8e2f4524c0a4185c84ed6a806 \ 1627008 } "port:qt5-qttools" "" "" {"translation files"} "" "variant overrides: ~examples ~tests ~debug noarch ~docs" "revision 0" "License: " } qtvirtualkeyboard { { afcc29a259809fc458c2e9dc690181cfb020d988 \ c607b3b276acc30773771371e03febf07daedcc7f4f8bd6c3609358324ba2194 \ 10955228 } "" "port:hunspell" "qtbase qtdeclarative qtsvg qtmultimedia qtquickcontrols" {"Qt Virtual Keyboard"} "GPLv3 license only" "variant overrides: " "revision 0" "License: {GPL-3 OpenSSLException}" } qtwebchannel { { 223535c768888bfea14bab62f979dda33b70f422 \ 40d015b5fbbc11f75726f34614d89ac418455cf2fd5a177253fa7606642f8cf8 \ 203060 } "" "" "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 path:lib/pkgconfig/icu-uc.pc:icu path:lib/libavcodec.dylib:ffmpeg 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 1" "License: " } qtwebglplugin { { f724abfa2132bf397b031b0d3ea4624229b6db84 \ e699d71fc382bb13455c7c7bdb9ffdf15a4962f3ec8f873406b991aafacd9d8a \ 68172 } "" "" "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 7" "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 { { f406e3ff7714c3bc69d051fa61abe90830acc364 \ addeb8da8d831a175268367576f0ea02550681a3f11670de170352a7948fba4a \ 253040 } "" "" "qtbase qtdeclarative" {"Qt WebSockets"} "" "variant overrides: " "revision 0" "License: " } qtwebview { { 5e04149687a0a98dd779c6a876c447d64fb2a240 \ 8e65b165df6f0608d97d8d0a9a5df691aa736ae0e76e2b93887e6fe2a247ae03 \ 128192 } "" "" "qtdeclarative qtwebengine" {"Qt WebView"} "new in 5.6.0; requires qtwebengine" "variant overrides: " "revision 0" "License: " } qtxmlpatterns { { 6bbd5e281d0bba8d16cf6a39fab2a1055cfb8758 \ b8390b815b248901f86ebd5f65cee363d4977581baeba37b3b2495fab848d33d \ 5189120 } "" "" "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"} { { "postgresql13" "port:postgresql13" "${prefix}/include/postgresql13" "${prefix}/lib/postgresql13" "-lpq" "" } { "postgresql12" "port:postgresql12" "${prefix}/include/postgresql12" "${prefix}/lib/postgresql12" "-lpq" "" } { "postgresql11" "port:postgresql11" "${prefix}/include/postgresql11" "${prefix}/lib/postgresql11" "-lpq" "" } { "postgresql10" "port:postgresql10" "${prefix}/include/postgresql10" "${prefix}/lib/postgresql10" "-lpq" "" } { "postgresql96" "port:postgresql96" "${prefix}/include/postgresql96" "${prefix}/lib/postgresql96" "-lpq" "" } { "postgresql95" "port:postgresql95" "${prefix}/include/postgresql95" "${prefix}/lib/postgresql95" "-lpq" "" } { "postgresql94" "port:postgresql94" "${prefix}/include/postgresql94" "${prefix}/lib/postgresql94" "-lpq" "" } { "postgresql84" "port:postgresql84" "${prefix}/include/postgresql84" "${prefix}/lib/postgresql84" "-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" "" } { "mariadb10_2" "port:mariadb-10.2" "${prefix}/include/mariadb-10.2/mysql" "${prefix}/lib/mariadb-10.2/mysql" "-lmysqlclient_r" "" } { "mariadb10_1" "port:mariadb-10.1" "${prefix}/include/mariadb-10.1/mysql" "${prefix}/lib/mariadb-10.1/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" } } # 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 # see https://trac.macports.org/ticket/68219 patchfiles-append patch-qtbase-memory_resource.diff # see https://trac.macports.org/ticket/68204 patchfiles-append qtbase-qmake-xcode-15.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 # 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 if { ${configure.compiler} eq "clang" } { # let xargs find correct compiler (default behaviour) post-patch { # let xargs find correct compiler reinplace \ "s|__MACPORTS_CC__|clang|g" \ ${worksrcpath}/mkspecs/common/clang.conf reinplace \ "s|__MACPORTS_CXX__|clang++|g" \ ${worksrcpath}/mkspecs/common/clang.conf } } else { 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 } } if { [string match macports-clang-* ${configure.compiler}] && [vercmp ${xcodeversion} "7.0"] >= 0 } { # non-Xcode clang does not seem to be able to understand tbd files # for an explanation of tbd files, see # https://stackoverflow.com/questions/31450690/why-xcode-7-shows-tbd-instead-of-dylib # see https://trac.macports.org/ticket/53151 pre-fetch { ui_error "This configuration is known to fail" ui_error "See https://trac.macports.org/ticket/53151" ui_error "As a workaround, do not set configure.compiler manually" return -code error "incompatible configuration" } } 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 # 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 PortGroup conflicts_build 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) conflicts_build rapidjson rapidjson-devel # 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 # 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=" } # 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 # 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 # 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 } } } # 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 } } # 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 warning in ht-ff.cc causing error # Fix based on https://github.com/harfbuzz/harfbuzz/commit/d88269c827895b38f99f7cf741fa60210d4d5169 # See: https://trac.macports.org/ticket/70850 patchfiles-append patch-qtwebengine_hb-ft.cc_error.diff # 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 # 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 # 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 # std::unary_function removed in Xcode clang 15 patchfiles-append patch-qtmultimedia_no_std_unary_function.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 } } } } # 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/official_releases/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 } } }