[MacPorts] #46238: co-installable qt4-mac and qt5-mac step1 : qt4-mac +concurrent

MacPorts noreply at macports.org
Sun Dec 14 14:15:42 PST 2014


#46238: co-installable qt4-mac and qt5-mac step1 : qt4-mac +concurrent
-------------------------+--------------------------------
 Reporter:  rjvbertin@…  |      Owner:  macports-tickets@…
     Type:  enhancement  |     Status:  new
 Priority:  Normal       |  Milestone:
Component:  ports        |    Version:  2.3.3
 Keywords:  haspatch     |       Port:  qt4-mac
-------------------------+--------------------------------
 Lots has been said about this on the users and dev MLs, but here it is
 finally, a draft Portfile that explores a way to make qt4-mac and qt5-mac
 co-installable, starting with qt4-mac .

 At the moment this is done as a non-optional variant, +concurrent, but the
 goal would of course be to merge that variant into the port's default
 behaviour. My intention is to tackle qt5-mac after we have reached some
 form of consensus about qt4-mac.

 The basic logic could have been very simple: instead of setting the Qt
 root directory `qt_dir` to ${prefix}, we set it to
 `${prefix}/libexec/qt4`. However, since the current version already
 installs a good number of components in Qt-version-specific places that
 approach would have been overkill. I'm thus proposing to keep those paths
 identical, to reduce the amount of breakage in dependent ports that for
 some unfathomable reason do not use the variables defined in the qt4
 PortGroup.

 Changes to the PortGroup file, qt4-1.0.tcl:

 Where we had

 {{{
     set qt_dir              ${prefix}
     set qt_docs_dir         ${qt_dir}/share/doc/${qt_name}
     set qt_plugins_dir      ${qt_dir}/share/${qt_name}/plugins
     set qt_mkspecs_dir      ${qt_dir}/share/${qt_name}/mkspecs
     set qt_imports_dir      ${qt_dir}/share/${qt_name}/imports
     set qt_includes_dir     ${qt_dir}/include
     set qt_libs_dir         ${qt_dir}/lib
     set qt_frameworks_dir   ${qt_dir}/Library/Frameworks
     set qt_bins_dir         ${qt_dir}/bin
     set qt_data_dir         ${qt_dir}/share/${qt_name}
     set qt_translations_dir ${qt_dir}/share/${qt_name}/translations
     set qt_sysconf_dir      ${qt_dir}/etc/${qt_name}
     set qt_examples_dir     ${qt_dir}/share/${qt_name}/examples
     set qt_demos_dir        ${qt_dir}/share/${qt_name}/demos
     set qt_cmake_module_dir ${qt_dir}/share/cmake/Modules
     set qt_qmake_cmd        ${qt_dir}/bin/qmake
     set qt_moc_cmd          ${qt_dir}/bin/moc
     set qt_uic_cmd          ${qt_dir}/bin/uic
     set qt_lrelease_cmd     ${qt_dir}/bin/lrelease
 }}}

 We get

 {{{
     set qt_dir              ${prefix}/libexec/${qt_name}
     set qt_docs_dir         ${prefix}/share/doc/${qt_name}
     set qt_plugins_dir      ${prefix}/share/${qt_name}/plugins
     set qt_mkspecs_dir      ${prefix}/share/${qt_name}/mkspecs
     set qt_imports_dir      ${prefix}/share/${qt_name}/imports
     set qt_includes_dir     ${prefix}/include/${qt_name}
     set qt_libs_dir         ${qt_dir}/lib
     set qt_frameworks_dir   ${qt_dir}/Library/Frameworks
     set qt_bins_dir         ${qt_dir}/bin
     set qt_data_dir         ${prefix}/share/${qt_name}
     set qt_translations_dir ${prefix}/share/${qt_name}/translations
     set qt_sysconf_dir      ${prefix}/etc/${qt_name}
     set qt_examples_dir     ${prefix}/share/${qt_name}/examples
     set qt_demos_dir        ${prefix}/share/${qt_name}/demos
     # no need to change the cmake_module_dir, though I'd have preferred to
     # put it into ${prefix}/lib/cmake as qt5-mac also does, and which is
 the place Linux uses
     set qt_cmake_module_dir ${prefix}/share/cmake/Modules
     set qt_qmake_cmd        ${qt_dir}/bin/qmake
     set qt_moc_cmd          ${qt_dir}/bin/moc
     set qt_uic_cmd          ${qt_dir}/bin/uic
     set qt_lrelease_cmd     ${qt_dir}/bin/lrelease
 }}}

 `qt_apps_dir` remains the same, of course, as does `qt_pkg_config_dir` for
 obvious reasons (but we'll put a symlink to ${prefix/lib/pkgconfig into
 ${qt_libs_dir} because that's where installers will try to put their `.pc`
 files).

 We'll also put symlinks to `qt_qmake_cmd`, `qt_moc_cmd` etc. into
 ${prefix}/bin (qmake4.8, moc4.8 etc) ... and if port:qtchooser is
 installed there will also be ${prefix}/bin/qmake (etc) that will resolve
 the appropriate qmake (etc) version depending on the options it is invoked
 with and/or the configured defaults.

 Qt client ports will of course need to see the correct values for the
 above variables, so the variant is declared in the PortGroup file, and a
 bit of logic introduced that will check for
 ${prefix}/libexec/${qt_name}/bin/qmake to set a global state variable even
 if a port is not installed explicitly as +concurrent. This is a
 convenience feature so that we don't have to specify the variant during
 testing (and then reinstall everything without once +concurrent becomes
 the default). A note is printed about this (which should happen only once,
 but I must not understand something about the scope of global variables).


 Changes to the Portfile itself

 When I started I thought I'd do good to separate a few base definitions
 from the brunt of the Portfile, making Portfile a tiny skeleton that
 included the much larger Portfile.qt4 payload. There no longer is any
 reason to do so, but I kept this for now because it allows to modify the
 main file at will without change to the Portfile hash tag which determines
 if an automatic `port clean` has to be done.

 The main points of interest in Portfile(.qt4) are:

 - conflicts declarations are made only when concurrent isn't set
 - a symlink is made so that client ports installing a pkgconfig file do so
 in the proper location and not under the new ${qt_libs_dir}
 - links are made to expose qmake (moc, ...) in ${prefix}/bin (qmake4.8,
 moc4.8, ...)

 - A subport qt4-mac-transitional is defined. This is a pure convenience
 construct that only creates a number of symlinks in the destroot phase.
 Those symlinks make the qt4-mac+concurrent frameworks and shared libraries
 appear where they used to be, in order to remove the need to rebuild all
 Qt client ports (including all of KDE4) immediately after installing
 +concurrent. Indeed, the post-install rev-upgrade phase reports 0 broken
 ports when the install is done correctly. This subport of course
 introduces conflicts with other qt ports.
 Out-commented bits remain of the older +libsymlinks variant that did the
 same thing as the subport.

 - I introduced an optional +htmldocs variant that has to be set to install
 the html documentation. Since that amounts to almost 220Mb of lots of
 smallish files, they are in fact deleted from the source directory in the
 pre-destroot phase in order to speed up the destroot phase. Not the nicest
 approach, but since the official dogma is to do a port clean before
 installing a port with a different variants selection it shouldn't be too
 problematic.

 - I'm still working on another variant, +noexceptions, which build Qt with
 -fno-exceptions. This is supposed to be ABI compatible, and reduce memory
 overhead for a feature that is mostly unused. KDE apparently requires
 exceptions support in QtConcurrent, so I have to figure out if it's
 possible to reintroduce it there and not in the rest of QtCore.

 How to install:

 I'd advise to

 - port -v configure qt4-mac +concurrent
   check if everything looks fine
 - port -v destroot qt4-mac +concurrent
   (some time later...) check if everything looks fine in the destroot dir

 If all went well, do

 - sudo port -v -k install qt4-mac +concurrent [qt4-mac-transitional]

 qt4-mac-transitional ought not install when qt4-mac has not been installed
 with +concurrent, but can best be installed in the same command that
 installs qt4-mac+concurrent, to avoid issues during rev-upgrade.

-- 
Ticket URL: <https://trac.macports.org/ticket/46238>
MacPorts <https://www.macports.org/>
Ports system for OS X


More information about the macports-tickets mailing list