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

Reply via email to