aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Mk/Uses/qt-dist.mk72
-rw-r--r--devel/qt5/files/pkg-change.in104
-rw-r--r--devel/qt5/files/pkg-deinstall.in15
3 files changed, 151 insertions, 40 deletions
diff --git a/Mk/Uses/qt-dist.mk b/Mk/Uses/qt-dist.mk
index 5cfbd3356a73..6b91e0fc313e 100644
--- a/Mk/Uses/qt-dist.mk
+++ b/Mk/Uses/qt-dist.mk
@@ -196,11 +196,9 @@ QT_DEFINES?= # For qconfig.h flags (without "QT_" prefix).
QT_CONFIG?= # For *.pri files QT_CONFIG flags.
. if ${QT_DEFINES}
QMAKE_ARGS+= DEFINES+="${QT_DEFINES:O:u:C/^([^-])/QT_\1/:C/^-/QT_NO_/:O}"
-. if ${QT_DEFINES:N-*}
-# Use a script to cleanup qconfig-modules.h (see qt-post-install).
-PKGDEINSTALL= ${WRKDIR}/pkg-deinstall
-. endif
. endif # ${QT_DEFINES}
+PKGDEINSTALL= ${WRKDIR}/pkg-install
+PKGINSTALL= ${WRKDIR}/pkg-deinstall
. if ${QT_CONFIG:N-*}
QMAKE_ARGS+= QT_CONFIG+="${QT_CONFIG:N-*:O:u}"
. endif
@@ -346,17 +344,55 @@ qt5-pre-configure:
. endfor
. endif
+. if ${QT_DEFINES:N-*}
+# There **are** defines, so we need to **add** this port to the
+# qconfig-modules.h header; make @need_add empty and comment out
+# the @need_remove lines in the script (see below in qt-post-install).
+# If there are no defines, do it the other way around.
+_sub_need_add=
+_sub_need_remove= \#\#
+. else
+_sub_need_add= \#\#
+_sub_need_remove=
+. endif
+# Handle misc/qtchooser wrapper installation and deinstallation
+# If a port installs Qt version-specific binaries (e.g. "designer" which
+# existed as a Qt4 application and exists as a Qt5 application and will
+# probably be a Qt6 application) which should have a qtchooser-based wrapper,
+# the port should set `QT_BINARIES=yes`.
+. if defined(QT_BINARIES)
+_sub_need_bin=
+. else
+_sub_need_bin= \#\#
+. endif
+. if ${QT_MODNAME} == core
+# QtCore (e.g. devel/qt5-core) is the one that starts the header,
+# and is also the one that can clean it up when deinstalled.
+_sub_need_clean=
+. else
+_sub_need_clean= \#\#
+. endif
post-install: qt-post-install
qt-post-install:
-. if ${QT_DEFINES:N-*}
-# We can't use SUB_FILES with a shared pkg-deinstall.in.
-# We need it to be a script instead of a group of @unexecs, otherwise
-# qconfig-modules.h cleanup will be run in pre-deinstall stage, which is
-# useless. This will probably be replaced by a Keywords/ script in the future.
+# We can't use SUB_FILES with the shared pkg-change.in.
+# We need it to be a script instead of a group of @unexecs.
+# Do two steps of processing -- introducing the Qt variables,
+# and replacing the @tags with comment (or nothing) characters
+# according to the port's settings -- in one sed and write
+# to pkg-change.tmp. Then split it up and minify for the
+# install and deinstall step.
@${SED} -e 's,%%QT_MODNAME%%,${QT_MODNAME},g' \
-e 's,%%QT_INCDIR%%,${QT_INCDIR},g' \
- ${PORTSDIR}/devel/${_QT_RELNAME}/${FILESDIR:T}/${PKGDEINSTALL:T}.in > \
- ${PKGDEINSTALL}
+ -e 's,@need_add,${_sub_need_add},' \
+ -e 's,@need_remove,${_sub_need_remove},' \
+ -e 's,@need_clean,${_sub_need_clean},' \
+ -e 's,@need_bin,${_sub_need_bin},' \
+ ${PORTSDIR}/devel/${_QT_RELNAME}/${FILESDIR:T}/pkg-change.in > \
+ ${WRKDIR}/pkg-change.tmp
+ @${SED} -e 's,@install,,' -e 's,@deinstall,##,' ${WRKDIR}/pkg-change.tmp | ${SED} -e '/##/d' > ${PKGINSTALL}
+ @${SED} -e 's,@install,##,' -e 's,@deinstall,,' ${WRKDIR}/pkg-change.tmp | ${SED} -e '/##/d' > ${PKGDEINSTALL}
+ @${REINPLACE_CMD} 's/\t//g' ${PKGINSTALL} ${PKGDEINSTALL}
+. if ${QT_DEFINES:N-*}
@${MKDIR} ${STAGEDIR}${QT_INCDIR}/QtCore/modules
@${ECHO_CMD} -n \
> ${STAGEDIR}${QT_INCDIR}/QtCore/modules/qconfig-${QT_MODNAME}.h
@@ -372,8 +408,6 @@ qt-post-install:
. endfor
@${ECHO_CMD} "${PREFIX}/${QT_INCDIR_REL}/QtCore/modules/qconfig-${QT_MODNAME}.h" \
>> ${TMPPLIST}
- @${ECHO_CMD} "@exec echo '#include <QtCore/modules/qconfig-${QT_MODNAME}.h>' >> ${PREFIX}/${QT_INCDIR_REL}/QtCore/qconfig-modules.h" \
- >> ${TMPPLIST}
. endif # ${QT_DEFINES:N-*}
. if ${QT_CONFIG:N-*}
@${MKDIR} ${STAGEDIR}${QT_MKSPECDIR}/modules
@@ -383,16 +417,4 @@ qt-post-install:
>> ${TMPPLIST}
. endif # ${QT_CONFIG:N-*}
. endif # M5
-
-# Handle misc/qtchooser wrapper installation and deinstallation
-# If a port installs Qt version-specific binaries (e.g. "designer" which existed as a Qt4 application
-# and exists as a Qt5 application and will probably be a Qt6 application) which should have a
-# qtchooser-based wrapper, the port should set `QT_BINARIES=yes`.
-#
-# When QT_BINARIES is set to yes, compatibility symlinks (designer -> qtchooser, so that
-# qtchooser can run designer-qt5 or whatever is the selected Qt version) are installed by the port.
-. if defined(QT_BINARIES)
- ${ECHO_CMD} '@postexec if type update-qtchooser-wrapper >/dev/null 2>&1; then update-qtchooser-wrapper; fi' >> ${TMPPLIST}
- ${ECHO_CMD} '@postunexec if type update-qtchooser-wrapper >/dev/null 2>&1; then update-qtchooser-wrapper; fi' >> ${TMPPLIST}
-. endif
.endif # defined(_QT_DIST_MK_INCLUDED)
diff --git a/devel/qt5/files/pkg-change.in b/devel/qt5/files/pkg-change.in
new file mode 100644
index 000000000000..58298d8affee
--- /dev/null
+++ b/devel/qt5/files/pkg-change.in
@@ -0,0 +1,104 @@
+#!/bin/sh
+##
+## ### PROCESSING
+##
+## This file is processed three ways:
+## - to replace %%variables%% with the intended values
+## - to replace @tag with ## or blank as appropriate
+## - to filter out lines containing ##
+##
+## The resulting "minified" script is used as pkg-install or pkg-deinstall
+## script in the package.
+##
+## Lines with @tag at the beginning should be read as conditional;
+## multiple @tags are read as "and", so the **rest** of the line
+## only ends up in the resulting script when all the @tags are true.
+##
+## The file is formatted for 8-wide tab stops with hard tabs,
+## so that the shell-script itself can be read in column 24,
+## e.g. v--- here
+## take care not to insert tabs in the actual shell commands.
+##
+##
+## ### ABOUT
+##
+## A Qt module should be listed in QtCore/qconfig-modules.h only once,
+## and only if that is needed (e.g. if it has a qconfig-*.h of its own).
+## In case 1 (listed), update the target file by appending and sorting:
+## - echo the new line and existing contents if any
+## - .. pipe to sort -u
+## - .. then move the sorted-uniqued output to the config-modules.h
+## In case 2 (unlisted), update the target file by deleting a line
+##
+## Removing QtCore *may* leave behind an empty file, and in that case
+## clean up the config file and directories entirely.
+##
+## A module with versionable binaries (like "designer" which might have
+## a Qt4, Qt5 and Qt6 version) can update the unversioned binary names
+## via qt-chooser.
+##
+##
+## On deinstall, we need QT_INCDIR separately, so define variables $qi and $qc
+## differently from install (which needs only $qc).
+@deinstall qi="%%QT_INCDIR%%"
+@deinstall qc="$qi/QtCore/qconfig-modules.h"
+@install qc="%%QT_INCDIR%%/QtCore/qconfig-modules.h"
+ qm="%%QT_MODNAME%%"
+##
+## Distinguish the pkg step and call the relevant shell functions defined above.
+##
+ case $2 in
+@install POST-INSTALL)
+##
+## Add the line #include qconfig-<this module>.h to the global
+## qconfig-modules.h; afterwards that global file exists.
+##
+## We might be adding to a non-existent file, which is why there
+## is the slightly-weird construction with a subshell piping to sort.
+##
+@install@need_add { echo "#include <QtCore/modules/qconfig-$qm.h>"
+@install@need_add [ -f "$qc" ] && /bin/cat "$qc"
+@install@need_add } | /usr/bin/sort -u -o "$qc.new"
+@install@need_add /bin/mv "$qc.new" "$qc"
+##
+## This removes the line that #includes qconfig-<this module>.h
+## from the global qconfig-modules.h; afterwards, that global file exists
+## although it may be empty.
+## (This code is identical in install- and deinstall-scripts, unconditional in deinstall)
+##
+@install@need_remove [ \! -e "$qc" ] && touch "$qc"
+@install@need_remove sed -i "" "/qconfig-$qm\.h/ d" "$qc"
+##
+## If there are binaries, and qtchooser is installed, update it.
+## (This code is identical in install- and deinstall-scripts)
+##
+@install@need_bin { type update-qtchooser-wrapper && update-qtchooser-wrapper ; } >/dev/null 2>&1
+@install ;;
+@deinstall POST-DEINSTALL)
+##
+## This removes the line that #includes qconfig-<this module>.h
+## from the global qconfig-modules.h; afterwards, that global file exists
+## although it may be empty.
+## (This code is identical in install- and deinstall-scripts, unconditional in deinstall)
+##
+@deinstall [ \! -e "$qc" ] && touch "$qc"
+@deinstall sed -i "" "/qconfig-$qm\.h/ d" "$qc"
+##
+## When qtcore is removed, the whole config dir can go away as well.
+##
+@deinstall [ \! -e "$qi/QtCore/qconfig.h" ] && \
+@deinstall [ \! -s "$qc" ] && (
+@deinstall rm -f "$qc"
+@deinstall rmdir "$qi/QtCore"
+@deinstall rmdir "$qi"
+@deinstall ) > /dev/null 2>&1
+##
+## If there are binaries, and qtchooser is installed, update it.
+## (This code is identical in install- and deinstall-scripts)
+##
+@deinstall@need_bin { type update-qtchooser-wrapper && update-qtchooser-wrapper ; } >/dev/null 2>&1
+@deinstall ;;
+ esac
+## Avoid exit code from any of the commands-above (e.g. checking for
+## qtchooser updates) from leaking out of this script: be true.
+ :
diff --git a/devel/qt5/files/pkg-deinstall.in b/devel/qt5/files/pkg-deinstall.in
deleted file mode 100644
index b1d91c8b298e..000000000000
--- a/devel/qt5/files/pkg-deinstall.in
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-#
-# $FreeBSD$
-
-case $2 in
-POST-DEINSTALL)
- sed -i "" '/qconfig-%%QT_MODNAME%%\.h/ d' \
- %%QT_INCDIR%%/QtCore/qconfig-modules.h 2>/dev/null || true
- [ \! -e %%QT_INCDIR%%/QtCore/qconfig.h ] &&
- [ \! -s %%QT_INCDIR%%/QtCore/qconfig-modules.h ] &&
- ( rm -f %%QT_INCDIR%%/QtCore/qconfig-modules.h 2>/dev/null
- rmdir %%QT_INCDIR%%/QtCore 2>/dev/null
- rmdir %%QT_INCDIR%% 2>/dev/null ) || true
- ;;
-esac