diff options
author | rakuco <rakuco@FreeBSD.org> | 2015-12-29 02:51:41 +0800 |
---|---|---|
committer | rakuco <rakuco@FreeBSD.org> | 2015-12-29 02:51:41 +0800 |
commit | 9f6ab3b7c87fb99855430fa9d70c5d8c740de882 (patch) | |
tree | 76454edeccfd58aef68221933003510a0e43f678 /Mk/Uses | |
parent | fc5be368f9d302b3c9fd266e9a3e8a1836e0351a (diff) | |
download | freebsd-ports-gnome-9f6ab3b7c87fb99855430fa9d70c5d8c740de882.tar.gz freebsd-ports-gnome-9f6ab3b7c87fb99855430fa9d70c5d8c740de882.tar.zst freebsd-ports-gnome-9f6ab3b7c87fb99855430fa9d70c5d8c740de882.zip |
Make sure ${WRKSRC}/lib is passed before /usr/local/lib when linking.
This is another shot at fixing the linkage problems that have plagued our
users particularly when upgrading from Qt 5.x to 5.(x+1). Quick recap: in
Qt5, qmake will by default pass QMAKE_LIBDIR to the linker before other
directories such as ${WRKSRC}/lib, which is where the port's libraries are
built. When a user is upgrading Qt, we can end up with the following linker
line:
c++ -o SomeBinary -lfoo1 -L/usr/local/lib -L${WRKSRC}/lib -lfoo2 -lfoo3
If libfoo2.so is being built by the port and an older version is currently
installed on the system, /usr/local/lib/libfoo2.so will be picked up instead
of the newly-built ${WRKSRC}/lib/libfoo2.so. At best things just work, at
worst SomeBinary needs some new symbol that is not present in the old
libfoo2.so and linking fails. Case in point: bug 198720.
The previous approach, adopted when fixing bug 194088, was to stop setting
QMAKE_{INC,LIB}DIR in the FreeBSD mkspecs and set the CPATH and LIBRARY_PATH
environment variables in Uses/qmake.mk. This way we just did not pass
-L/usr/local/lib to the linker at all and things mostly worked. However,
people using Qt to build their own software without the ports tree were out
of luck, as they would then need need to deal with passing
/usr/local/{include,lib} to the compiler/linker themselves (bug 195105). Not
only that, but if a dependency mentioned /usr/local/lib we would still have
problems anyway (in bug 198720, the GStreamer pkg-config files contain
-L/usr/local/lib, for example).
We now solve the issue by setting the QMAKE_LIBDIR_FLAGS variable in
.qmake.cache to ${WRKSRC}/lib instead. qmake appends the value of
QMAKE_LIBDIR to QMAKE_LIBDIR_FLAGS, so we are always sure -L${WRKSRC}/lib
will come before -L/usr/local/lib in the linker options. Moreover, qmake is
smart enough to automatically call sed(1) and remove references to
${WRKSRC}/lib from .prl and .pc files when installing them.
PR: 194088
PR: 195105
PR: 198720
MFH: 2015Q4
Diffstat (limited to 'Mk/Uses')
-rw-r--r-- | Mk/Uses/qmake.mk | 13 |
1 files changed, 0 insertions, 13 deletions
diff --git a/Mk/Uses/qmake.mk b/Mk/Uses/qmake.mk index c306d4c51394..5c146ee1a807 100644 --- a/Mk/Uses/qmake.mk +++ b/Mk/Uses/qmake.mk @@ -49,19 +49,6 @@ IGNORE= Incorrect 'USES+= qmake' usage: argument '${arg}' is not recognized USE_QT${_QT_VERSION:R:R}+= qmake_build .endif -.if ${_QT_VERSION:M5*} -# We deliberately do not pass -I${LOCALBASE}/include and -L${LOCALBASE}/lib -# in the FreeBSD mkspecs because in Qt5 they are always added before the -# paths in ${WRKSRC}. In other words, if one is upgrading an existing -# installation the old headers and libraries will always be picked up. -# Those directories to be passed though, they just need to be passed last. -# See QTBUG-40825 and ports/194088 for more information. -CONFIGURE_ENV+= CPATH=${LOCALBASE}/include \ - LIBRARY_PATH=${LOCALBASE}/lib -MAKE_ENV+= CPATH=${LOCALBASE}/include \ - LIBRARY_PATH=${LOCALBASE}/lib -.endif # ${_QT_VERSION:M5*} - # QMAKESPEC belongs to bsd.qt.mk. QMAKE_ENV?= ${CONFIGURE_ENV} QMAKE_ARGS+= -spec ${QMAKESPEC} \ |