[kde-freebsd] maintainer-feedback requested: [Bug 199297] devel/qmake5: package may leak WRKSRC references in qt_targspec and qt_hostspec, breaking Qt5 ports
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Wed Apr 8 15:22:47 UTC 2015
Alexey Dokuchaev <danfe at FreeBSD.org> has reassigned Bugzilla Automation
<bugzilla at FreeBSD.org>'s request for maintainer-feedback to kde at FreeBSD.org:
Bug 199297: devel/qmake5: package may leak WRKSRC references in qt_targspec and
qt_hostspec, breaking Qt5 ports
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=199297
--- Description ---
I normally build my ports with WRKDIRPREFIX=/usr/obj (central scratch-space for
building world, kernel, and ports). On machines with lots of RAM, I make
/usr/obj a symlink to /tmp. It turns out that this combination leads to
producing silently broken qt5-qmake package, which in turn breaks Qt5 consumer
ports.
The problem typically exhibits itself like this, when you start building some
software that is based on Qt5:
> CMake Error at /usr/local/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:15 (message):
> The imported target "Qt5::Core" references the file
>
>
"/usr/local/lib/qt5//mkspecs//usr/obj/usr/ports/devel/qmake5/work/qtbase-openso
urce-src-5.4.1/mkspecs/freebsd-clang"
Looks like CMake-related bits of Qt5 had become tainted somehow. Doing "grep
-R /usr/local/lib/cmake/Qt5Core" shows only one bad file:
>
/usr/local/lib/cmake/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake:set(_qt5_coreli
b_extra_includes
"${_qt5Core_install_prefix}/lib/qt5//mkspecs//usr/obj/usr/ports/devel/qmake5/wo
rk/qtbase-opensource-src-5.4.1/mkspecs/freebsd-clang")
This file is generated (while building devel/qt5-core) port from
src/corelib/Qt5CoreConfigExtrasMkspecDir.cmake.in:
> !!IF isEmpty(CMAKE_HOST_DATA_DIR_IS_ABSOLUTE)
> set(_qt5_corelib_extra_includes
\"${_qt5Core_install_prefix}/$${CMAKE_HOST_DATA_DIR}/mkspecs/$${CMAKE_MKSPEC}\"
)
> !!ELSE
> set(_qt5_corelib_extra_includes
\"$${CMAKE_HOST_DATA_DIR}mkspecs/$${CMAKE_MKSPEC}\")
> !!ENDIF
CMAKE_MKSPEC is set to QMAKE_XSPEC during the build; in turn, QMAKE_XSPEC value
is provided by qmake; let's see what it yields:
> /usr/local/lib/qt5/bin/qmake -query QMAKE_XSPEC
>
/usr/obj/usr/ports/devel/qmake5/work/qtbase-opensource-src-5.4.1/mkspecs/freebs
d-clang
Running strings(1) over qmake binary indeed shows that bogus paths are embedded
in it:
> strings /usr/local/lib/qt5/bin/qmake | grep spec=
>
qt_targspec=/usr/obj/usr/ports/devel/qmake5/work/qtbase-opensource-src-5.4.1/mk
specs/freebsd-clang
>
qt_hostspec=/usr/obj/usr/ports/devel/qmake5/work/qtbase-opensource-src-5.4.1/mk
specs/freebsd-clang
Why does it happen? Let's take a look at configure script:
> # the directory of this script is the "source tree"
> relpath=`dirname $0`
> relpath=`(cd "$relpath"; /bin/pwd)`
> ...
> shortxspec=`echo $XQMAKESPEC | sed "s,^${relpath}/mkspecs/,,"`
> shortspec=`echo $QMAKESPEC | sed "s,^${relpath}/mkspecs/,,"`
> ...
> "qt_targspec=$shortxspec",
> "qt_hostspec=$shortspec",
At this point it becomes fairly obvious. Calling dirname(1) won't expand the
symlinked path (/usr/obj), but pwd(1) will! So $relpath now starts with /tmp,
while $XQMAKESPEC and $QMAKESPEC are relative to /usr/obj; this confused sed(1)
and it cannot strip the prefix.
Quick and dirty fix is to patch devel/qmake5/Makefile like this:
> -QMAKESPEC= ${WRKSRC}/mkspecs/freebsd-${QMAKE_COMPILER}
> +QMAKESPEC= ${WRKSRC:tA}/mkspecs/freebsd-${QMAKE_COMPILER}
This trick won't work on systems with old make(1), e.g. FreeBSD 8.x. The
problem, however, is not really about just qmake. I suspect that there might
be more hidden bombs in our framework, not necessarily Qt5-related, that can
cause similar breakages. I do not have a clean solution at hands for the
moment.
I'm not attaching any test cases or patches; I hope my analysis and description
are clear enough for our Qt/Mk maintainers, so they can work out the best
solution.
More information about the kde-freebsd
mailing list