1. When Qt4 came in, there were almost no qmake4 users.
Now there are many:
cad/fritzing/Makefile: ${LOCALBASE}/bin/qmake4 -o Makefile phoenix.pro
cad/openscad/Makefile: ${SETENV} ${QMAKE_ENV} qmake4 ${QMAKE_FLAGS}
openscad.pro
devel/beediff/Makefile: cd ${WRKSRC} && ${LOCALBASE}/bin/qmake4 beediff.pro
devel/qt-creator/Makefile: cd ${WRKBUILD} && QTDIR=${WRKDIR}/bin qmake4
${WRKSRC}/qtcreator.pro #CONFIG+=debug
devel/qt-creator/Makefile: qmake4 ${QTCDH_SRC_DIR}/gdbmacros.pro; \
devel/qt4-eventsview/Makefile: cd ${WRKDIST} && env -i ${CONFIGURE_ENV} qmake4
devel/qt4-qtsolutions-singleinstance/Makefile: cd ${WRKSRC} &&
${LOCALBASE}/bin/qmake4
editors/focuswriter/Makefile: cd ${WRKSRC} && ${SETENV} ${MAKE_ENV}
${CONFIGURE_ENV} ${LOCALBASE}/bin/qmake4
editors/qscintilla/Makefile: cd ${WRKSRC} && ${SETENV} ${CONFIGURE_ENV}
${LOCALBASE}/bin/qmake4 \
editors/teaqt/Makefile: cd ${WRKSRC} && qmake4
editors/texmaker/Makefile: qmake4 -spec
${MODQT_LIBDIR}/mkspecs/openbsd-g++ \
editors/tiled/Makefile: qmake4 -makefile tiled.pro -config release
games/jag/Makefile: cd ${WRKSRC} && ${LOCALBASE}/bin/qmake4 Game.pro
games/pokerth/Makefile: env -i ${CONFIGURE_ENV} qmake4 ${MAKE_FLAGS} \
geo/gpsbabel/Makefile: cd ${WRKSRC}/gui && ${SETENV} ${CONFIGURE_ENV} qmake4 \
geo/merkaartor/Makefile: cd ${WRKSRC} && env ${CONFIGURE_ENV} qmake4
PROJ=1 NODEBUG=1 RELEASE=1 \
graphics/opencsg/Makefile: cd ${WRKSRC} && qmake4 src.pro
multimedia/mlt/Makefile: cd ${WRKSRC}/src/tests; ${SETENV}
${ALL_TEST_ENV} qmake4 tests.pro
net/qsynergy/Makefile: @cd ${WRKSRC} && ${LOCALBASE}/bin/qmake4
net/retroshare/Makefile: cd ${WRKSRC} && ${LOCALBASE}/bin/qmake4
RetroShare.pro
productivity/entomologist/Makefile: ${LOCALBASE}/bin/qmake4
${CONFIGURE_ARGS}
productivity/fet/Makefile: cd ${WRKSRC} && ${LOCALBASE}/bin/qmake4 fet.pro
productivity/vym/Makefile: ${LOCALBASE}/bin/qmake4
DOCDIR="${PREFIX}/share/doc/vym" vym.pro
security/fwbuilder/Makefile: --with-qmake=qmake4 \
security/kqoauth/Makefile: cd ${WRKDIST} && ${LOCALBASE}/bin/qmake4 \
security/qca-gnupg/Makefile:QMAKE = ${LOCALBASE}/bin/qmake4
security/qoauth/Makefile: cd ${WRKDIST} && ${LOCALBASE}/bin/qmake4 \
security/yubikey-personalization-gui/Makefile: cd ${WRKSRC};
CXXFLAGS="${CXXFLAGS}" qmake4
sysutils/bacula/Makefile: QMAKE=${LOCALBASE}/bin/qmake4
www/arora/Makefile: @cd ${WRKSRC} && ${LOCALBASE}/bin/qmake4 -r
www/minitube/Makefile: ${LOCALBASE}/bin/qmake4 PREFIX=${PREFIX}
x11/lumina/Makefile: cd ${WRKSRC} && ${LOCALBASE}/bin/qmake4
x11/py-qt4/Makefile: --qmake="${LOCALBASE}/bin/qmake4" \
x11/qrfcview/Makefile: ${LOCALBASE}/bin/qmake4 rfcview.pro
x11/qwt/files/Makefile.examples: qmake4 $$I.pro && env
LOCALBASE=${LOCALBASE} gmake; \
x11/qwt/Makefile: @cd ${WRKSRC} && qmake4 -d -d -d
2. Now that Qt5 is coming in, and given that some ports already (and
many more will) support both Qt4 and Qt5, it may result in
maintaince burden, to tweak each such port in the way:
.if ${FLAVOR:Mqt5}
...
.else
...
.endif
I think everything above is job for port modules instead. So I
propose to create x11/qt/qt.port.mk, that will call the right qmake.
I left out all other logic duplicated between qt4.port.mk and
qt5.port.mk, to allow print/poppler build (Qt5 support is on its
way there already).
The only real change is that MODQT*_WANTLIB becomes a trick itself:
you can set up both MODQT4_WANLTIB and MODQT5_WANTLIB in a port,
and use MODQT_WANTLIB in actual WANTLIB. This way you'll get the
WANTLIB you want depending on Qt version you're using.
The obvious downside is that we'll have a lot of "-qt5" FLAVORed
ports...
An alternative approach could be switching all Qt4 users to Qt5,
or, at least, making sure that Qt4 won't mix in otherwise Qt5-ready
software. Please remember that Qt4 will come out-of-support after
2015 ends, so we have to move quickly, and get everything clean
at the 5.8 release lock.
I don't insist on getting this in right now, but asking for ideas
and comments for now. Thank you for your time.
--
WBR,
Vadim Zhukov
Index: qt/qt.port.mk
===================================================================
RCS file: qt/qt.port.mk
diff -N qt/qt.port.mk
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ qt/qt.port.mk 19 Dec 2014 22:22:51 -0000
@@ -0,0 +1,30 @@
+# $OpenBSD$
+# This module is designed for ports that could use both Qt4 and Qt5.
+# Almost all MODQT_* logic lives in x11/qt? modules.
+# This allows simple transition between them and x11/qt port modules.
+
+MODQT_MANAGE_FLAVORS ?= Yes
+.if ${MODQT_MANAGE_FLAVORS:L} == "yes"
+FLAVORS += qt5
+.endif
+
+FLAVOR ?=
+.if ${FLAVOR:Mqt5}
+MODQT_FLAVOR ?= qt5
+.else
+MODQT_FLAVOR ?= qt4
+.endif
+
+_MODQT_FLAVORS = qt4 qt5
+.if !${_MODQT_FLAVORS:M${MODQT_FLAVOR}}
+ERRORS += "Fatal: Unsupported MODQT_FLAVOR=${MODQT_FLAVOR}.\n"
+.endif
+
+.if empty(CONFIGURE_STYLE)
+CONFIGURE_STYLE += qmake
+.endif
+.if ${CONFIGURE_STYLE:Mqmake}
+CONFIGURE_STYLE += ${MODQT_FLAVOR}
+.endif
+
+MODULES += x11/${MODQT_FLAVOR}
Index: qt4/qt4.port.mk
===================================================================
RCS file: /cvs/ports/x11/qt4/qt4.port.mk,v
retrieving revision 1.7
diff -u -p -r1.7 qt4.port.mk
--- qt4/qt4.port.mk 22 Nov 2010 08:37:04 -0000 1.7
+++ qt4/qt4.port.mk 19 Dec 2014 22:22:51 -0000
@@ -1,7 +1,7 @@
# $OpenBSD: qt4.port.mk,v 1.7 2010/11/22 08:37:04 espie Exp $
# This fragment defines MODQT_* variables to make it easier to substitute
-# qt1/qt2/qt3 in a port.
+# Qt3/Qt4/Qt5 in a port.
MODQT_OVERRIDE_UIC ?= Yes
MODQT4_OVERRIDE_UIC ?= ${MODQT_OVERRIDE_UIC}
@@ -10,9 +10,6 @@ MODQT_LIBDIR ?= ${MODQT4_LIBDIR}
MODQT4_INCDIR = ${LOCALBASE}/include/X11/qt4
MODQT_INCDIR ?= ${MODQT4_INCDIR}
MODQT_PKG_CONFIG_PATH ?= ${LOCALBASE}/lib/qt4/pkgconfig
-MODQT4_CONFIGURE_ARGS = --with-qt-includes=${MODQT4_INCDIR} \
- --with-qt-libraries=${MODQT4_LIBDIR}
-MODQT_CONFIGURE_ARGS ?= ${MODQT4_CONFIGURE_ARGS}
_MODQT4_SETUP = MOC=${MODQT4_MOC} \
MODQT_INCDIR=${MODQT4_INCDIR} \
MODQT_LIBDIR=${MODQT4_LIBDIR} \
@@ -26,6 +23,8 @@ MODQT4_MOC = ${LOCALBASE}/bin/moc4
MODQT_MOC ?= ${MODQT4_MOC}
MODQT4_UIC = ${LOCALBASE}/bin/uic4
MODQT_UIC ?= ${MODQT4_UIC}
+MODQT4_QMAKE = ${MODQT4_LIBDIR}/bin/qmake
+MODQT_QMAKE ?= ${MODQT4_QMAKE}
MODQT4_QTDIR = ${LOCALBASE}/lib/qt4
MODQT_QTDIR ?= ${MODQT4_QTDIR}
@@ -33,10 +32,58 @@ MODQT4_LIB_DEPENDS = x11/qt4
MODQT_LIB_DEPENDS ?= ${MODQT4_LIB_DEPENDS}
LIB_DEPENDS += ${MODQT4_LIB_DEPENDS}
-MODQT4_WANTLIB = lib/qt4/QtCore
+MODQT4_WANTLIB += lib/qt4/QtCore
MODQT_WANTLIB ?= ${MODQT4_WANTLIB}
WANTLIB += ${MODQT4_WANTLIB}
CONFIGURE_ENV +=${_MODQT4_SETUP}
MAKE_ENV += ${_MODQT4_SETUP}
MAKE_FLAGS += ${_MODQT4_SETUP}
+
+MODQT_QMAKE_ARGS ?= ${CONFIGURE_ARGS}
+MODQT4_QMAKE_ARGS ?= ${MODQT_QMAKE_ARGS}
+
+MODQT_PROJECTS ?=
+MODQT4_PROJECTS ?= ${MODQT_PROJECTS}
+.if ${CONFIGURE_STYLE:Mqt4}
+ ALL_TARGET ?=
+ MODQT4_ALL_TARGET ?= ${ALL_TARGET}
+ SEPARATE_BUILD ?= No
+. if ${SEPARATE_BUILD:L} == "flavored"
+ ERRORS += "Fatal: flavored builds are not supported by qmake.\n"
+. elif ${SEPARATE_BUILD:L} != "no"
+ WRKBUILD ?= ${WRKSRC}/build
+. endif
+
+. if !empty(MODQT4_PROJECTS)
+MODQT4_configure = cd ${WRKSRC}/$$d;
+MODQT4_BUILD_TARGET =
+. for _p in ${MODQT4_PROJECTS}
+MODQT4_configure += \
+ d=${_p%/*}; \
+ mkdir -p ${WRKBUILD}/$$d; \
+ env ${CONFIGURE_ENV} ${MODQT4_QMAKE} ${MODQT4_QMAKE_ARGS} \
+ -o ${WRKBUILD}/$$d/${MAKE_FILE} ${_p};
+MODQT4_BUILD_TARGET += \
+ d=${_p%/*}; \
+ cd ${WRKBUILD}/$$d; \
+ ${_SYSTRACE_CMD} ${SETENV} ${MAKE_ENV} \
+ ${MAKE_PROGRAM} ${MAKE_FLAGS} -f ${MAKE_FILE} ${MODQT4_ALL_TARGET};
+. endfor
+. else
+# assume there is only one QMake project, as recommended by Qt guideline
+MODQT4_configure = \
+ cd ${WRKSRC}; \
+ ${SETENV} ${CONFIGURE_ENV} ${MODQT4_QMAKE} ${MODQT4_QMAKE_ARGS} \
+ -o ${WRKBUILD}/${MAKE_FILE} *.pro;
+MODQT4_BUILD_TARGET += \
+ cd ${WRKBUILD}; \
+ ${_SYSTRACE_CMD} ${SETENV} ${MAKE_ENV} \
+ ${MAKE_PROGRAM} ${MAKE_FLAGS} -f ${MAKE_FILE} ${MODQT4_ALL_TARGET};
+. endif
+
+. if !target(do-build)
+do-build:
+ @${MODQT4_BUILD_TARGET}
+. endif
+.endif
Index: qt5/qt5.port.mk
===================================================================
RCS file: /cvs/ports/x11/qt5/qt5.port.mk,v
retrieving revision 1.6
diff -u -p -r1.6 qt5.port.mk
--- qt5/qt5.port.mk 11 Dec 2014 17:45:04 -0000 1.6
+++ qt5/qt5.port.mk 19 Dec 2014 22:22:51 -0000
@@ -1,7 +1,7 @@
# $OpenBSD: qt5.port.mk,v 1.6 2014/12/11 17:45:04 zhuk Exp $
# This fragment defines MODQT_* variables to make it easier to substitute
-# qt4/qt5 in a port.
+# Qt3/Qt4/Qt5 in a port.
MODQT_OVERRIDE_UIC ?= Yes
MODQT5_OVERRIDE_UIC ?= ${MODQT_OVERRIDE_UIC}
@@ -10,10 +10,6 @@ MODQT_LIBDIR ?= ${MODQT5_LIBDIR}
MODQT5_INCDIR = ${LOCALBASE}/include/X11/qt5
MODQT_INCDIR ?= ${MODQT5_INCDIR}
-MODQT5_CONFIGURE_ARGS = --with-qt-includes=${MODQT5_INCDIR} \
- --with-qt-libraries=${MODQT5_LIBDIR}
-MODQT_CONFIGURE_ARGS ?= ${MODQT5_CONFIGURE_ARGS}
-
_MODQT5_SETUP = MOC=${MODQT5_MOC} \
MODQT_INCDIR=${MODQT5_INCDIR} \
MODQT_LIBDIR=${MODQT5_LIBDIR}
@@ -27,6 +23,8 @@ MODQT5_MOC = ${LOCALBASE}/bin/moc-qt5
MODQT_MOC ?= ${MODQT5_MOC}
MODQT5_UIC = ${LOCALBASE}/bin/uic-qt5
MODQT_UIC ?= ${MODQT5_UIC}
+MODQT5_QMAKE = ${LOCALBASE}/bin/qmake-qt5
+MODQT_QMAKE ?= ${MODQT5_QMAKE}
MODQT5_QTDIR = ${LOCALBASE}/lib/qt5
MODQT_QTDIR ?= ${MODQT5_QTDIR}
@@ -77,6 +75,10 @@ MODQT5_LIB_DEPENDS = x11/qt5
MODQT_LIB_DEPENDS ?= ${MODQT5_LIB_DEPENDS}
LIB_DEPENDS += ${MODQT5_LIB_DEPENDS}
+MODQT5_WANTLIB += Qt5Core ${MODGCC4_CPPWANTLIB}
+MODQT_WANTLIB ?= ${MODQT5_WANTLIB}
+WANTLIB += ${MODQT5_WANTLIB}
+
CONFIGURE_ENV +=${_MODQT5_SETUP}
MAKE_ENV += ${_MODQT5_SETUP}
MAKE_FLAGS += ${_MODQT5_SETUP}
@@ -86,4 +88,52 @@ MODQT5_USE_GCC4_MODULE ?= Yes
MODULES += gcc4
MODGCC4_LANGS += c++
MODGCC4_ARCHS ?= *
+.endif
+
+MODQT_QMAKE_ARGS ?= ${CONFIGURE_ARGS}
+MODQT5_QMAKE_ARGS ?= ${MODQT_QMAKE_ARGS}
+
+MODQT_PROJECTS ?=
+MODQT5_PROJECTS ?= ${MODQT_PROJECTS}
+.if ${CONFIGURE_STYLE:Mqt5}
+ ALL_TARGET ?=
+ MODQT5_ALL_TARGET ?= ${ALL_TARGET}
+ SEPARATE_BUILD ?= No
+. if ${SEPARATE_BUILD:L} == "flavored"
+ ERRORS += "Fatal: flavored builds are not supported by qmake.\n"
+. elif ${SEPARATE_BUILD:L} != "no"
+ WRKBUILD ?= ${WRKSRC}/build
+. endif
+
+. if !empty(MODQT5_PROJECTS)
+MODQT5_configure = cd ${WRKSRC}/$$d;
+MODQT5_BUILD_TARGET =
+. for _p in ${MODQT5_PROJECTS}
+MODQT5_configure += \
+ d=${_p%/*}; \
+ mkdir -p ${WRKBUILD}/$$d; \
+ env ${CONFIGURE_ENV} ${MODQT5_QMAKE} ${MODQT5_QMAKE_ARGS} \
+ -o ${WRKBUILD}/$$d/${MAKE_FILE} ${_p};
+MODQT5_BUILD_TARGET += \
+ d=${_p%/*}; \
+ cd ${WRKBUILD}/$$d; \
+ ${_SYSTRACE_CMD} ${SETENV} ${MAKE_ENV} \
+ ${MAKE_PROGRAM} ${MAKE_FLAGS} -f ${MAKE_FILE} ${MODQT5_ALL_TARGET};
+. endfor
+. else
+# assume there is only one QMake project, as recommended by Qt guideline
+MODQT5_configure = \
+ cd ${WRKSRC}; \
+ ${SETENV} ${CONFIGURE_ENV} ${MODQT5_QMAKE} ${MODQT5_QMAKE_ARGS} \
+ -o ${WRKBUILD}/${MAKE_FILE} *.pro;
+MODQT5_BUILD_TARGET += \
+ cd ${WRKBUILD}; \
+ ${_SYSTRACE_CMD} ${SETENV} ${MAKE_ENV} \
+ ${MAKE_PROGRAM} ${MAKE_FLAGS} -f ${MAKE_FILE} ${MODQT5_ALL_TARGET};
+. endif
+
+. if !target(do-build)
+do-build:
+ @${MODQT5_BUILD_TARGET}
+. endif
.endif