From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id D916F138330 for ; Thu, 31 May 2018 20:31:42 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 9757DE0897; Thu, 31 May 2018 20:31:41 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 4F7ABE0897 for ; Thu, 31 May 2018 20:31:41 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 52A05335C2C for ; Thu, 31 May 2018 20:31:39 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id F0E792A0 for ; Thu, 31 May 2018 20:31:36 +0000 (UTC) From: "Andreas Sturmlechner" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Andreas Sturmlechner" Message-ID: <1527798671.e95bc6041cf9940cfecef2ffe5ed28dcd988a12c.asturm@gentoo> Subject: [gentoo-commits] proj/kde-sunset:master commit in: eclass/ X-VCS-Repository: proj/kde-sunset X-VCS-Files: eclass/qt4-build-multilib.eclass eclass/qt4-r2.eclass X-VCS-Directories: eclass/ X-VCS-Committer: asturm X-VCS-Committer-Name: Andreas Sturmlechner X-VCS-Revision: e95bc6041cf9940cfecef2ffe5ed28dcd988a12c X-VCS-Branch: master Date: Thu, 31 May 2018 20:31:36 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 23ab23e5-8d73-4fa7-9b99-f8525dc040f6 X-Archives-Hash: bc9359585affdc12715d6edfa7ba62b4 commit: e95bc6041cf9940cfecef2ffe5ed28dcd988a12c Author: Andreas Sturmlechner gentoo org> AuthorDate: Thu May 31 20:31:11 2018 +0000 Commit: Andreas Sturmlechner gentoo org> CommitDate: Thu May 31 20:31:11 2018 +0000 URL: https://gitweb.gentoo.org/proj/kde-sunset.git/commit/?id=e95bc604 qt4*eclass: Import from Gentoo ebuild repository eclass/qt4-build-multilib.eclass | 847 +++++++++++++++++++++++++++++++++++++++ eclass/qt4-r2.eclass | 139 +++++++ 2 files changed, 986 insertions(+) diff --git a/eclass/qt4-build-multilib.eclass b/eclass/qt4-build-multilib.eclass new file mode 100644 index 0000000..7666936 --- /dev/null +++ b/eclass/qt4-build-multilib.eclass @@ -0,0 +1,847 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: qt4-build-multilib.eclass +# @MAINTAINER: +# qt@gentoo.org +# @AUTHOR: +# Davide Pesavento +# @BLURB: Eclass for Qt4 split ebuilds with multilib support. +# @DESCRIPTION: +# This eclass contains various functions that are used when building Qt4. +# Requires EAPI 5. + +case ${EAPI} in + 5) : ;; + *) die "qt4-build-multilib.eclass: unsupported EAPI=${EAPI:-0}" ;; +esac + +inherit eutils flag-o-matic multilib multilib-minimal toolchain-funcs + +HOMEPAGE="https://www.qt.io/" +LICENSE="|| ( LGPL-2.1 LGPL-3 GPL-3 ) FDL-1.3" +SLOT="4" + +case ${PV} in + 4.?.9999) + # git stable branch + QT4_BUILD_TYPE="live" + EGIT_BRANCH=${PV%.9999} + ;; + *) + # official stable release + QT4_BUILD_TYPE="release" + MY_P=qt-everywhere-opensource-src-${PV/_/-} + SRC_URI="http://download.qt.io/official_releases/qt/${PV%.*}/${PV}/${MY_P}.tar.gz" + S=${WORKDIR}/${MY_P} + ;; +esac + +EGIT_REPO_URI=( + "git://code.qt.io/qt/qt.git" + "https://code.qt.io/git/qt/qt.git" + "https://github.com/qtproject/qt.git" +) +[[ ${QT4_BUILD_TYPE} == live ]] && inherit git-r3 + +if [[ ${PN} != qttranslations ]]; then + IUSE="aqua debug pch" + [[ ${PN} != qtxmlpatterns ]] && IUSE+=" +exceptions" +fi + +DEPEND=" + dev-lang/perl + virtual/pkgconfig[${MULTILIB_USEDEP}] +" +RDEPEND=" + dev-qt/qtchooser +" + + +# src_{configure,compile,test,install} are inherited from multilib-minimal +EXPORT_FUNCTIONS src_unpack src_prepare pkg_postinst pkg_postrm + +multilib_src_configure() { qt4_multilib_src_configure; } +multilib_src_compile() { qt4_multilib_src_compile; } +multilib_src_test() { qt4_multilib_src_test; } +multilib_src_install() { qt4_multilib_src_install; } +multilib_src_install_all() { qt4_multilib_src_install_all; } + + +# @ECLASS-VARIABLE: PATCHES +# @DEFAULT_UNSET +# @DESCRIPTION: +# Array variable containing all the patches to be applied. This variable +# is expected to be defined in the global scope of ebuilds. Make sure to +# specify the full path. This variable is used in src_prepare phase. +# +# Example: +# @CODE +# PATCHES=( +# "${FILESDIR}/mypatch.patch" +# "${FILESDIR}/mypatch2.patch" +# ) +# @CODE + +# @ECLASS-VARIABLE: QT4_TARGET_DIRECTORIES +# @DEFAULT_UNSET +# @DESCRIPTION: +# Space-separated list of directories that will be configured, +# compiled, and installed. All paths must be relative to ${S}. + +# @ECLASS-VARIABLE: QCONFIG_ADD +# @DEFAULT_UNSET +# @DESCRIPTION: +# List of options that must be added to QT_CONFIG in qconfig.pri + +# @ECLASS-VARIABLE: QCONFIG_REMOVE +# @DEFAULT_UNSET +# @DESCRIPTION: +# List of options that must be removed from QT_CONFIG in qconfig.pri + +# @ECLASS-VARIABLE: QCONFIG_DEFINE +# @DEFAULT_UNSET +# @DESCRIPTION: +# List of macros that must be defined in QtCore/qconfig.h + + +###### Phase functions ###### + +# @FUNCTION: qt4-build-multilib_src_unpack +# @DESCRIPTION: +# Unpacks the sources. +qt4-build-multilib_src_unpack() { + if tc-is-gcc; then + if [[ $(gcc-major-version) -lt 4 ]] || \ + [[ $(gcc-major-version) -eq 4 && $(gcc-minor-version) -lt 4 ]]; then + ewarn + ewarn "Using a GCC version lower than 4.4 is not supported" + ewarn + fi + fi + + if [[ ${PN} == qtwebkit ]]; then + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + ewarn + ewarn "You have enabled debug info (probably have -g or -ggdb in your CFLAGS/CXXFLAGS)." + ewarn "You may experience really long compilation times and/or increased memory usage." + ewarn "If compilation fails, please try removing -g/-ggdb before reporting a bug." + ewarn "For more info check out https://bugs.gentoo.org/307861" + ewarn + fi + eshopts_pop + fi + + case ${QT4_BUILD_TYPE} in + live) git-r3_src_unpack ;; + release) default ;; + esac +} + +# @FUNCTION: qt4-build-multilib_src_prepare +# @DESCRIPTION: +# Prepare the sources before the configure phase. Strip CFLAGS if necessary, and fix +# the build system in order to respect CFLAGS/CXXFLAGS/LDFLAGS specified in make.conf. +qt4-build-multilib_src_prepare() { + if [[ ${PN} != qtcore ]]; then + # avoid unnecessary qmake recompilations + sed -i -e 's/^if true;/if false;/' configure \ + || die "sed failed (skip qmake bootstrap)" + fi + + # skip X11 tests in non-gui packages to avoid spurious dependencies + if has ${PN} qtbearer qtcore qtdbus qtscript qtsql qttest qttranslations qtxmlpatterns; then + sed -i -e '/^if.*PLATFORM_X11.*CFG_GUI/,/^fi$/d' configure \ + || die "sed failed (skip X11 tests)" + fi + + # Qt4 is not safe to build with C++14 (the new gcc-6 default). + # Upstream has addressed this for Qt5, but while we continue to + # support Qt4, we need to ensure everything is built in C++98 mode. + # See bugs 582522, 582618, 583662, 583744. + append-cxxflags -std=gnu++98 + + if [[ ${PN} == qtcore ]]; then + # Bug 373061 + # qmake bus errors with -O2 or -O3 but -O1 works + if [[ ${CHOST} == *86*-apple-darwin* ]]; then + replace-flags -O[23] -O1 + fi + + # Bug 503500 + # undefined reference with -Os and --as-needed + if use x86 || use_if_iuse abi_x86_32; then + replace-flags -Os -O2 + fi + fi + + if [[ ${PN} == qtdeclarative ]]; then + # Bug 551560 + # gcc-4.8 ICE with -Os, fixed in 4.9 + if use x86 && tc-is-gcc && [[ $(gcc-version) == 4.8 ]]; then + replace-flags -Os -O2 + fi + fi + + if [[ ${PN} == qtwebkit ]]; then + # Bug 550780 + # various ICEs with graphite-related flags, gcc-5 works + if [[ $(gcc-major-version) -lt 5 ]]; then + filter-flags -fgraphite-identity -floop-strip-mine + fi + fi + + # Bug 261632 + if use ppc64; then + append-flags -mminimal-toc + fi + + # Teach configure about gcc-6 and later + sed -i -e 's:5\*|:[5-9]*|:' \ + configure || die "sed gcc version failed" + + # Read also AR from the environment + sed -i -e 's/^SYSTEM_VARIABLES="/&AR /' \ + configure || die "sed SYSTEM_VARIABLES failed" + + # Reset QMAKE_*FLAGS_{RELEASE,DEBUG} variables, + # or they will override the user's flags (via .qmake.cache) + sed -i -e '/^SYSTEM_VARIABLES=/ i \ + QMakeVar set QMAKE_CFLAGS_RELEASE\ + QMakeVar set QMAKE_CFLAGS_DEBUG\ + QMakeVar set QMAKE_CXXFLAGS_RELEASE\ + QMakeVar set QMAKE_CXXFLAGS_DEBUG\ + QMakeVar set QMAKE_LFLAGS_RELEASE\ + QMakeVar set QMAKE_LFLAGS_DEBUG\n' \ + configure || die "sed QMAKE_*FLAGS_{RELEASE,DEBUG} failed" + + # Drop -nocache from qmake invocation in all configure tests, to ensure that the + # correct toolchain and build flags are picked up from config.tests/.qmake.cache + find config.tests/unix -name '*.test' -type f -execdir \ + sed -i -e '/bin\/qmake/s/-nocache//' '{}' + || die "sed -nocache failed" + + # compile.test needs additional patching so that it doesn't create another cache file + # inside the test subdir, which would incorrectly override config.tests/.qmake.cache + sed -i -e '/echo.*QT_BUILD_TREE.*\.qmake\.cache/d' \ + -e '/bin\/qmake/s/ "$SRCDIR/ "QT_BUILD_TREE=$OUTDIR"&/' \ + config.tests/unix/compile.test || die "sed compile.test failed" + + # Delete references to the obsolete /usr/X11R6 directory + # On prefix, this also prevents looking at non-prefix stuff + sed -i -re '/^QMAKE_(LIB|INC)DIR(_X11|_OPENGL|)\s+/ s/=.*/=/' \ + mkspecs/common/linux.conf \ + mkspecs/$(qt4_get_mkspec)/qmake.conf \ + || die "sed QMAKE_(LIB|INC)DIR failed" + + if use_if_iuse aqua; then + sed -i \ + -e '/^CONFIG/s:app_bundle::' \ + -e '/^CONFIG/s:plugin_no_soname:plugin_with_soname absolute_library_soname:' \ + mkspecs/$(qt4_get_mkspec)/qmake.conf \ + || die "sed failed (aqua)" + + # we are crazy and build cocoa + qt3support + if { ! in_iuse qt3support || use qt3support; } && [[ ${CHOST##*-darwin} -ge 9 ]]; then + sed -i -e "/case \"\$PLATFORM,\$CFG_MAC_COCOA\" in/,/;;/ s|CFG_QT3SUPPORT=\"no\"|CFG_QT3SUPPORT=\"yes\"|" \ + configure || die "sed failed (cocoa + qt3support)" + fi + fi + + if [[ ${CHOST} == *-darwin* ]]; then + # Set FLAGS and remove -arch, since our gcc-apple is multilib crippled (by design) + sed -i \ + -e "s:QMAKE_CFLAGS_RELEASE.*=.*:QMAKE_CFLAGS_RELEASE=${CFLAGS}:" \ + -e "s:QMAKE_CXXFLAGS_RELEASE.*=.*:QMAKE_CXXFLAGS_RELEASE=${CXXFLAGS}:" \ + -e "s:QMAKE_LFLAGS_RELEASE.*=.*:QMAKE_LFLAGS_RELEASE=-headerpad_max_install_names ${LDFLAGS}:" \ + -e "s:-arch\s\w*::g" \ + mkspecs/common/g++-macx.conf \ + || die "sed g++-macx.conf failed" + + # Fix configure's -arch settings that appear in qmake/Makefile and also + # fix arch handling (automagically duplicates our -arch arg and breaks + # pch). Additionally disable Xarch support. + sed -i \ + -e "s:-arch i386::" \ + -e "s:-arch ppc::" \ + -e "s:-arch x86_64::" \ + -e "s:-arch ppc64::" \ + -e "s:-arch \$i::" \ + -e "/if \[ ! -z \"\$NATIVE_64_ARCH\" \]; then/,/fi/ d" \ + -e "s:CFG_MAC_XARCH=yes:CFG_MAC_XARCH=no:g" \ + -e "s:-Xarch_x86_64::g" \ + -e "s:-Xarch_ppc64::g" \ + configure mkspecs/common/gcc-base-macx.conf mkspecs/common/g++-macx.conf \ + || die "sed -arch/-Xarch failed" + + # On Snow Leopard don't fall back to 10.5 deployment target. + if [[ ${CHOST} == *-apple-darwin10 ]]; then + sed -i \ + -e "s:QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET.*:QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET 10.6:g" \ + -e "s:-mmacosx-version-min=10.[0-9]:-mmacosx-version-min=10.6:g" \ + configure mkspecs/common/g++-macx.conf \ + || die "sed deployment target failed" + fi + fi + + if [[ ${CHOST} == *-solaris* ]]; then + sed -i -e '/^QMAKE_LFLAGS_THREAD/a QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list,' \ + mkspecs/$(qt4_get_mkspec)/qmake.conf || die + fi + + # apply patches + [[ ${PATCHES[@]} ]] && epatch "${PATCHES[@]}" + epatch_user +} + +qt4_multilib_src_configure() { + qt4_prepare_env + + qt4_symlink_tools_to_build_dir + + # toolchain setup ('local -x' because of bug 532510) + local -x \ + AR="$(tc-getAR) cqs" \ + CC=$(tc-getCC) \ + CXX=$(tc-getCXX) \ + LD=$(tc-getCXX) \ + MAKEFLAGS=${MAKEOPTS} \ + OBJCOPY=$(tc-getOBJCOPY) \ + OBJDUMP=$(tc-getOBJDUMP) \ + STRIP=$(tc-getSTRIP) + + # convert tc-arch to the values supported by Qt + local arch=$(tc-arch) + case ${arch} in + amd64|x64-*) arch=x86_64 ;; + arm64|hppa) arch=generic ;; + ppc*-macos) arch=ppc ;; + ppc*) arch=powerpc ;; + sparc*) arch=sparc ;; + x86-macos) arch=x86 ;; + x86*) arch=i386 ;; + esac + + # configure arguments + local conf=( + # installation paths + -prefix "${QT4_PREFIX}" + -bindir "${QT4_BINDIR}" + -libdir "${QT4_LIBDIR}" + -docdir "${QT4_DOCDIR}" + -headerdir "${QT4_HEADERDIR}" + -plugindir "${QT4_PLUGINDIR}" + -importdir "${QT4_IMPORTDIR}" + -datadir "${QT4_DATADIR}" + -translationdir "${QT4_TRANSLATIONDIR}" + -sysconfdir "${QT4_SYSCONFDIR}" + -examplesdir "${QT4_EXAMPLESDIR}" + -demosdir "${QT4_DEMOSDIR}" + + # debug/release + $(use_if_iuse debug && echo -debug || echo -release) + -no-separate-debug-info + + # licensing stuff + -opensource -confirm-license + + # build shared libraries + -shared + + # skip recursive processing of .pro files at the end of configure + # (we run qmake by ourselves), thus saving quite a bit of time + -dont-process + + # always enable large file support + -largefile + + # exceptions USE flag + $(in_iuse exceptions && qt_use exceptions || echo -exceptions) + + # build STL support + -stl + + # architecture/platform (mkspec) + -arch ${arch} + -platform $(qt4_get_mkspec) + + # instruction set support + $(is-flagq -mno-mmx && echo -no-mmx) + $(is-flagq -mno-3dnow && echo -no-3dnow) + $(is-flagq -mno-sse && echo -no-sse) + $(is-flagq -mno-sse2 && echo -no-sse2) + $(is-flagq -mno-sse3 && echo -no-sse3) + $(is-flagq -mno-ssse3 && echo -no-ssse3) + $(is-flagq -mno-sse4.1 && echo -no-sse4.1) + $(is-flagq -mno-sse4.2 && echo -no-sse4.2) + $(is-flagq -mno-avx && echo -no-avx) + $(is-flagq -mfpu=* && ! is-flagq -mfpu=*neon* && echo -no-neon) + + # bug 367045 + $([[ ${CHOST} == *86*-apple-darwin* ]] && echo -no-ssse3) + + # prefer system libraries + -system-zlib + + # exclude examples and demos from default build + -nomake examples + -nomake demos + + # disable rpath on non-prefix (bugs 380415 and 417169) + $(usex prefix '' -no-rpath) + + # print verbose information about each configure test + -verbose + + # precompiled headers don't work on hardened, where the flag is masked + $(in_iuse pch && qt_use pch || echo -no-pch) + + # enable linker optimizations to reduce relocations, except on Solaris + # where this flag seems to introduce major breakage to applications, + # mostly to be seen as a core dump with the message: + # "QPixmap: Must construct a QApplication before a QPaintDevice" + $([[ ${CHOST} != *-solaris* ]] && echo -reduce-relocations) + ) + + if use_if_iuse aqua; then + if [[ ${CHOST##*-darwin} -ge 9 ]]; then + conf+=( + # on (snow) leopard use the new (frameworked) cocoa code + -cocoa -framework + # add hint for the framework location + -F"${QT4_LIBDIR}" + ) + else + conf+=(-no-framework) + fi + fi + + conf+=( + # module-specific options + "${myconf[@]}" + ) + + einfo "Configuring with: ${conf[@]}" + "${S}"/configure "${conf[@]}" || die "configure failed" + + # configure is stupid and assigns QMAKE_LFLAGS twice, + # thus the previous -rpath-link flag gets overwritten + # and some packages (e.g. qthelp) fail to link + sed -i -e '/^QMAKE_LFLAGS =/ s:$: $$QMAKE_LFLAGS:' \ + .qmake.cache || die "sed .qmake.cache failed" + + qt4_qmake + qt4_foreach_target_subdir qt4_qmake +} + +qt4_multilib_src_compile() { + qt4_prepare_env + + qt4_foreach_target_subdir emake +} + +qt4_multilib_src_test() { + qt4_prepare_env + + qt4_foreach_target_subdir emake -j1 check +} + +qt4_multilib_src_install() { + qt4_prepare_env + + qt4_foreach_target_subdir emake INSTALL_ROOT="${D}" install + + if [[ ${PN} == qtcore ]]; then + set -- emake INSTALL_ROOT="${D}" install_{mkspecs,qmake} + einfo "Running $*" + "$@" + + # install env.d file + cat > "${T}/44qt4-${CHOST}" <<-_EOF_ + LDPATH="${QT4_LIBDIR}" + _EOF_ + doenvd "${T}/44qt4-${CHOST}" + + # install qtchooser configuration file + cat > "${T}/qt4-${CHOST}.conf" <<-_EOF_ + ${QT4_BINDIR} + ${QT4_LIBDIR} + _EOF_ + + ( + insinto /etc/xdg/qtchooser + doins "${T}/qt4-${CHOST}.conf" + ) + + if multilib_is_native_abi; then + # convenience symlinks + dosym qt4-"${CHOST}".conf /etc/xdg/qtchooser/4.conf + dosym qt4-"${CHOST}".conf /etc/xdg/qtchooser/qt4.conf + fi + fi + + # move pkgconfig directory to the correct location + if [[ -d ${D}${QT4_LIBDIR}/pkgconfig ]]; then + mv "${D}${QT4_LIBDIR}"/pkgconfig "${ED}usr/$(get_libdir)" || die + fi + + qt4_install_module_qconfigs + qt4_symlink_framework_headers +} + +qt4_multilib_src_install_all() { + if [[ ${PN} == qtcore ]]; then + # include gentoo-qconfig.h at the beginning of Qt{,Core}/qconfig.h + if use aqua && [[ ${CHOST#*-darwin} -ge 9 ]]; then + sed -i -e '1i #include \n' \ + "${D}${QT4_LIBDIR}"/QtCore.framework/Headers/qconfig.h \ + || die "sed failed (qconfig.h)" + dosym "${QT4_HEADERDIR#${EPREFIX}}"/Gentoo \ + "${QT4_LIBDIR#${EPREFIX}}"/QtCore.framework/Headers/Gentoo + else + sed -i -e '1i #include \n' \ + "${D}${QT4_HEADERDIR}"/Qt{,Core}/qconfig.h \ + || die "sed failed (qconfig.h)" + fi + + dodir "${QT4_DATADIR#${EPREFIX}}"/mkspecs/gentoo + mv "${D}${QT4_DATADIR}"/mkspecs/{qconfig.pri,gentoo/} || die + fi + + # install private headers of a few modules + if has ${PN} qtcore qtdeclarative qtgui qtscript; then + local moduledir=${PN#qt} + local modulename=Qt$(tr 'a-z' 'A-Z' <<< ${moduledir:0:1})${moduledir:1} + [[ ${moduledir} == core ]] && moduledir=corelib + + einfo "Installing private headers into ${QT4_HEADERDIR}/${modulename}/private" + insinto "${QT4_HEADERDIR#${EPREFIX}}"/${modulename}/private + find "${S}"/src/${moduledir} -type f -name '*_p.h' -exec doins '{}' + || die + fi + + prune_libtool_files +} + +# @FUNCTION: qt4-build-multilib_pkg_postinst +# @DESCRIPTION: +# Regenerate configuration after installation or upgrade/downgrade. +qt4-build-multilib_pkg_postinst() { + qt4_regenerate_global_qconfigs +} + +# @FUNCTION: qt4-build-multilib_pkg_postrm +# @DESCRIPTION: +# Regenerate configuration when a module is completely removed. +qt4-build-multilib_pkg_postrm() { + qt4_regenerate_global_qconfigs +} + + +###### Public helpers ###### + +# @FUNCTION: qt_use +# @USAGE: [feature] [enableval] +# @DESCRIPTION: +# is the name of a flag in IUSE. +# +# Outputs "-${enableval}-${feature}" if is enabled, "-no-${feature}" +# otherwise. If [feature] is not specified, is used in its place. +# If [enableval] is not specified, the "-${enableval}" prefix is omitted. +qt_use() { + [[ $# -ge 1 ]] || die "${FUNCNAME}() requires at least one argument" + + usex "$1" "${3:+-$3}-${2:-$1}" "-no-${2:-$1}" +} + +# @FUNCTION: qt_native_use +# @USAGE: [feature] [enableval] +# @DESCRIPTION: +# is the name of a flag in IUSE. +# +# Outputs "-${enableval}-${feature}" if is enabled and we are currently +# building for the native ABI, "-no-${feature}" otherwise. If [feature] is not +# specified, is used in its place. If [enableval] is not specified, +# the "-${enableval}" prefix is omitted. +qt_native_use() { + [[ $# -ge 1 ]] || die "${FUNCNAME}() requires at least one argument" + + multilib_is_native_abi && qt_use "$@" || echo "-no-${2:-$1}" +} + + +###### Internal functions ###### + +# @FUNCTION: qt4_prepare_env +# @INTERNAL +# @DESCRIPTION: +# Prepares the environment for building Qt. +qt4_prepare_env() { + # setup installation directories + # note: keep paths in sync with qmake-utils.eclass + QT4_PREFIX=${EPREFIX}/usr + QT4_HEADERDIR=${QT4_PREFIX}/include/qt4 + QT4_LIBDIR=${QT4_PREFIX}/$(get_libdir)/qt4 + QT4_BINDIR=${QT4_LIBDIR}/bin + QT4_PLUGINDIR=${QT4_LIBDIR}/plugins + QT4_IMPORTDIR=${QT4_LIBDIR}/imports + QT4_DATADIR=${QT4_PREFIX}/share/qt4 + QT4_DOCDIR=${QT4_PREFIX}/share/doc/qt-${PV} + QT4_TRANSLATIONDIR=${QT4_DATADIR}/translations + QT4_EXAMPLESDIR=${QT4_DATADIR}/examples + QT4_DEMOSDIR=${QT4_DATADIR}/demos + QT4_SYSCONFDIR=${EPREFIX}/etc/qt4 + + # are these still needed? + QMAKE_LIBDIR_QT=${QT4_LIBDIR} + export XDG_CONFIG_HOME="${T}" + + # can confuse qmake if set (bug 583352) + unset QMAKESPEC +} + +# @FUNCTION: qt4_foreach_target_subdir +# @INTERNAL +# @DESCRIPTION: +# Executes the given command inside each directory listed in QT4_TARGET_DIRECTORIES. +qt4_foreach_target_subdir() { + local ret=0 subdir= + for subdir in ${QT4_TARGET_DIRECTORIES}; do + mkdir -p "${subdir}" || die + pushd "${subdir}" >/dev/null || die + + einfo "Running $* ${subdir:+in ${subdir}}" + "$@" + ((ret+=$?)) + + popd >/dev/null || die + done + + return ${ret} +} + +# @FUNCTION: qt4_symlink_tools_to_build_dir +# @INTERNAL +# @DESCRIPTION: +# Symlinks qtcore tools to BUILD_DIR, +# so that they can be used when building other modules. +qt4_symlink_tools_to_build_dir() { + local tool= tools=() + if [[ ${PN} != qtcore ]]; then + tools+=(qmake moc rcc uic) + fi + + mkdir -p "${BUILD_DIR}"/bin || die + pushd "${BUILD_DIR}"/bin >/dev/null || die + + for tool in "${tools[@]}"; do + [[ -e ${QT4_BINDIR}/${tool} ]] || continue + ln -s "${QT4_BINDIR}/${tool}" . || die "failed to symlink ${tool}" + done + + popd >/dev/null || die +} + +# @FUNCTION: qt4_qmake +# @INTERNAL +# @DESCRIPTION: +# Helper function that runs qmake in the current target subdir. +# Intended to be called by qt4_foreach_target_subdir(). +qt4_qmake() { + local projectdir=${PWD/#${BUILD_DIR}/${S}} + + "${BUILD_DIR}"/bin/qmake \ + "${projectdir}" \ + CONFIG+=nostrip \ + LIBS+=-L"${QT4_LIBDIR}" \ + "${myqmakeargs[@]}" \ + || die "qmake failed (${projectdir#${S}/})" +} + +# @FUNCTION: qt4_install_module_qconfigs +# @INTERNAL +# @DESCRIPTION: +# Creates and installs gentoo-specific ${PN}-qconfig.{h,pri} files. +qt4_install_module_qconfigs() { + local x + if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} ]]; then + for x in QCONFIG_ADD QCONFIG_REMOVE; do + [[ -n ${!x} ]] && echo ${x}=${!x} >> "${BUILD_DIR}"/${PN}-qconfig.pri + done + insinto ${QT4_DATADIR#${EPREFIX}}/mkspecs/gentoo + doins "${BUILD_DIR}"/${PN}-qconfig.pri + fi + + if [[ -n ${QCONFIG_DEFINE} ]]; then + for x in ${QCONFIG_DEFINE}; do + echo "#define ${x}" >> "${BUILD_DIR}"/gentoo-${PN}-qconfig.h + done + insinto ${QT4_HEADERDIR#${EPREFIX}}/Gentoo + doins "${BUILD_DIR}"/gentoo-${PN}-qconfig.h + fi +} + +# @FUNCTION: qt4_regenerate_global_qconfigs +# @INTERNAL +# @DESCRIPTION: +# Generates Gentoo-specific qconfig.{h,pri} according to the build configuration. +# Don't call die here because dying in pkg_post{inst,rm} only makes things worse. +qt4_regenerate_global_qconfigs() { + if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} || -n ${QCONFIG_DEFINE} || ${PN} == qtcore ]]; then + local x qconfig_add qconfig_remove qconfig_new + for x in "${ROOT}${QT4_DATADIR}"/mkspecs/gentoo/*-qconfig.pri; do + [[ -f ${x} ]] || continue + qconfig_add+=" $(sed -n 's/^QCONFIG_ADD=//p' "${x}")" + qconfig_remove+=" $(sed -n 's/^QCONFIG_REMOVE=//p' "${x}")" + done + + if [[ -e "${ROOT}${QT4_DATADIR}"/mkspecs/gentoo/qconfig.pri ]]; then + # start with the qconfig.pri that qtcore installed + if ! cp "${ROOT}${QT4_DATADIR}"/mkspecs/gentoo/qconfig.pri \ + "${ROOT}${QT4_DATADIR}"/mkspecs/qconfig.pri; then + eerror "cp qconfig failed." + return 1 + fi + + # generate list of QT_CONFIG entries from the existing list + # including qconfig_add and excluding qconfig_remove + for x in $(sed -n 's/^QT_CONFIG +=//p' \ + "${ROOT}${QT4_DATADIR}"/mkspecs/qconfig.pri) ${qconfig_add}; do + has ${x} ${qconfig_remove} || qconfig_new+=" ${x}" + done + + # replace the existing QT_CONFIG list with qconfig_new + if ! sed -i -e "s/QT_CONFIG +=.*/QT_CONFIG += ${qconfig_new}/" \ + "${ROOT}${QT4_DATADIR}"/mkspecs/qconfig.pri; then + eerror "Sed for QT_CONFIG failed" + return 1 + fi + + # create Gentoo/qconfig.h + if [[ ! -e ${ROOT}${QT4_HEADERDIR}/Gentoo ]]; then + if ! mkdir -p "${ROOT}${QT4_HEADERDIR}"/Gentoo; then + eerror "mkdir ${QT4_HEADERDIR}/Gentoo failed" + return 1 + fi + fi + : > "${ROOT}${QT4_HEADERDIR}"/Gentoo/gentoo-qconfig.h + for x in "${ROOT}${QT4_HEADERDIR}"/Gentoo/gentoo-*-qconfig.h; do + [[ -f ${x} ]] || continue + cat "${x}" >> "${ROOT}${QT4_HEADERDIR}"/Gentoo/gentoo-qconfig.h + done + else + rm -f "${ROOT}${QT4_DATADIR}"/mkspecs/qconfig.pri + rm -f "${ROOT}${QT4_HEADERDIR}"/Gentoo/gentoo-qconfig.h + rmdir "${ROOT}${QT4_DATADIR}"/mkspecs \ + "${ROOT}${QT4_DATADIR}" \ + "${ROOT}${QT4_HEADERDIR}"/Gentoo \ + "${ROOT}${QT4_HEADERDIR}" 2>/dev/null + fi + fi +} + +# @FUNCTION: qt4_symlink_framework_headers +# @DESCRIPTION: +# On OS X we need to add some symlinks when frameworks are being +# used, to avoid complications with some more or less stupid packages. +qt4_symlink_framework_headers() { + if use_if_iuse aqua && [[ ${CHOST##*-darwin} -ge 9 ]]; then + local frw dest f h rdir + # Some packages tend to include + dodir "${QT4_HEADERDIR#${EPREFIX}}"/Qt + + # Fake normal headers when frameworks are installed... eases life later + # on, make sure we use relative links though, as some ebuilds assume + # these dirs exist in src_install to add additional files + f=${QT4_HEADERDIR} + h=${QT4_LIBDIR} + while [[ -n ${f} && ${f%%/*} == ${h%%/*} ]] ; do + f=${f#*/} + h=${h#*/} + done + rdir=${h} + f="../" + while [[ ${h} == */* ]] ; do + f="${f}../" + h=${h#*/} + done + rdir="${f}${rdir}" + + for frw in "${D}${QT4_LIBDIR}"/*.framework; do + [[ -e "${frw}"/Headers ]] || continue + f=$(basename ${frw}) + dest="${QT4_HEADERDIR#${EPREFIX}}"/${f%.framework} + dosym "${rdir}"/${f}/Headers "${dest}" + + # Link normal headers as well. + for hdr in "${D}${QT4_LIBDIR}/${f}"/Headers/*; do + h=$(basename ${hdr}) + dosym "../${rdir}"/${f}/Headers/${h} \ + "${QT4_HEADERDIR#${EPREFIX}}"/Qt/${h} + done + done + fi +} + +# @FUNCTION: qt4_get_mkspec +# @INTERNAL +# @DESCRIPTION: +# Returns the right mkspec for the current CHOST/CXX combination. +qt4_get_mkspec() { + local spec= + + case ${CHOST} in + *-linux*) + spec=linux ;; + *-darwin*) + use_if_iuse aqua && + spec=macx || # mac with carbon/cocoa + spec=darwin ;; # darwin/mac with X11 + *-freebsd*|*-dragonfly*) + spec=freebsd ;; + *-netbsd*) + spec=netbsd ;; + *-openbsd*) + spec=openbsd ;; + *-aix*) + spec=aix ;; + hppa*-hpux*) + spec=hpux ;; + ia64*-hpux*) + spec=hpuxi ;; + *-solaris*) + spec=solaris ;; + *) + die "qt4-build-multilib.eclass: unsupported CHOST '${CHOST}'" ;; + esac + + case $(tc-getCXX) in + *g++*) + spec+=-g++ ;; + *clang*) + if [[ -d ${S}/mkspecs/unsupported/${spec}-clang ]]; then + spec=unsupported/${spec}-clang + else + ewarn "${spec}-clang mkspec does not exist, falling back to ${spec}-g++" + spec+=-g++ + fi ;; + *icpc*) + if [[ -d ${S}/mkspecs/${spec}-icc ]]; then + spec+=-icc + else + ewarn "${spec}-icc mkspec does not exist, falling back to ${spec}-g++" + spec+=-g++ + fi ;; + *) + die "qt4-build-multilib.eclass: unsupported compiler '$(tc-getCXX)'" ;; + esac + + # Add -64 for 64-bit prefix profiles + if use amd64-linux || use ppc64-linux || + use x64-macos || + use sparc64-solaris || use x64-solaris + then + [[ -d ${S}/mkspecs/${spec}-64 ]] && spec+=-64 + fi + + echo ${spec} +} diff --git a/eclass/qt4-r2.eclass b/eclass/qt4-r2.eclass new file mode 100644 index 0000000..d8a7252 --- /dev/null +++ b/eclass/qt4-r2.eclass @@ -0,0 +1,139 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: qt4-r2.eclass +# @MAINTAINER: +# qt@gentoo.org +# @BLURB: Eclass for Qt4-based packages, second edition. +# @DESCRIPTION: +# This eclass contains various functions that may be useful when +# dealing with packages using Qt4 libraries. Supports only EAPIs +# 2, 3, 4, and 5. Use qmake-utils.eclass in EAPI 6 and later. + +case ${EAPI} in + 2|3|4|5) : ;; + 6) die "qt4-r2.eclass is banned in EAPI 6 and later" ;; + *) die "qt4-r2.eclass: unsupported EAPI=${EAPI:-0}" ;; +esac + +inherit base eutils qmake-utils + +export XDG_CONFIG_HOME="${T}" + +# @ECLASS-VARIABLE: DOCS +# @DEFAULT_UNSET +# @DESCRIPTION: +# Array containing documents passed to dodoc command. +# Paths can be absolute or relative to ${S}. +# +# Example: DOCS=( ChangeLog README "${WORKDIR}/doc_folder/" ) + +# @ECLASS-VARIABLE: HTML_DOCS +# @DEFAULT_UNSET +# @DESCRIPTION: +# Array containing documents passed to dohtml command. +# Paths can be absolute or relative to ${S}. +# +# Example: HTML_DOCS=( "doc/document.html" "${WORKDIR}/html_folder/" ) + +# @ECLASS-VARIABLE: LANGS +# @DEFAULT_UNSET +# @DESCRIPTION: +# In case your Qt4 application provides various translations, use this variable +# to specify them in order to populate "linguas_*" IUSE automatically. Make sure +# that you set this variable before inheriting qt4-r2 eclass. +# +# Example: LANGS="de el it ja" +for x in ${LANGS}; do + IUSE+=" linguas_${x}" +done + +# @ECLASS-VARIABLE: LANGSLONG +# @DEFAULT_UNSET +# @DESCRIPTION: +# Same as LANGS, but this variable is for LINGUAS that must be in long format. +# Remember to set this variable before inheriting qt4-r2 eclass. +# Look at ${PORTDIR}/profiles/desc/linguas.desc for details. +# +# Example: LANGSLONG="en_GB ru_RU" +for x in ${LANGSLONG}; do + IUSE+=" linguas_${x%_*}" +done +unset x + +# @ECLASS-VARIABLE: PATCHES +# @DEFAULT_UNSET +# @DESCRIPTION: +# Array variable containing all the patches to be applied. This variable +# is expected to be defined in the global scope of ebuilds. Make sure to +# specify the full path. This variable is used in src_prepare phase. +# +# Example: +# @CODE +# PATCHES=( +# "${FILESDIR}/mypatch.patch" +# "${FILESDIR}/mypatch2.patch" +# ) +# @CODE + +# @FUNCTION: qt4-r2_src_unpack +# @DESCRIPTION: +# Default src_unpack function for packages that depend on qt4. If you have to +# override src_unpack in your ebuild (probably you don't need to), call +# qt4-r2_src_unpack in it. +qt4-r2_src_unpack() { + debug-print-function $FUNCNAME "$@" + + base_src_unpack "$@" +} + +# @FUNCTION: qt4-r2_src_prepare +# @DESCRIPTION: +# Default src_prepare function for packages that depend on qt4. If you have to +# override src_prepare in your ebuild, you should call qt4-r2_src_prepare in it, +# otherwise autopatcher will not work! +qt4-r2_src_prepare() { + debug-print-function $FUNCNAME "$@" + + base_src_prepare "$@" +} + +# @FUNCTION: qt4-r2_src_configure +# @DESCRIPTION: +# Default src_configure function for packages that depend on qt4. If you have to +# override src_configure in your ebuild, call qt4-r2_src_configure in it. +qt4-r2_src_configure() { + debug-print-function $FUNCNAME "$@" + + local project_file=$(qmake-utils_find_pro_file) + + if [[ -n ${project_file} ]]; then + eqmake4 "${project_file}" + else + base_src_configure "$@" + fi +} + +# @FUNCTION: qt4-r2_src_compile +# @DESCRIPTION: +# Default src_compile function for packages that depend on qt4. If you have to +# override src_compile in your ebuild (probably you don't need to), call +# qt4-r2_src_compile in it. +qt4-r2_src_compile() { + debug-print-function $FUNCNAME "$@" + + base_src_compile "$@" +} + +# @FUNCTION: qt4-r2_src_install +# @DESCRIPTION: +# Default src_install function for qt4-based packages. Installs compiled code, +# and documentation (via DOCS and HTML_DOCS variables). +qt4-r2_src_install() { + debug-print-function $FUNCNAME "$@" + + base_src_install INSTALL_ROOT="${D}" "$@" + einstalldocs +} + +EXPORT_FUNCTIONS src_unpack src_prepare src_configure src_compile src_install