diff options
author | Steven J Newbury <steve@snewbury.org.uk> | 2009-04-06 10:14:18 +0100 |
---|---|---|
committer | Steven J Newbury <steve@snewbury.org.uk> | 2009-04-06 10:14:18 +0100 |
commit | 06385a2fd270b6bde22f5910abd8c62dd47ba25d (patch) | |
tree | 8c8f9f0a49f8652d004557603dbae42154a0f41c /eclass/qt4-build.eclass | |
parent | The cmake-utils.eclass creates a cmake config file which sets the (diff) | |
download | multilib-portage-06385a2fd270b6bde22f5910abd8c62dd47ba25d.tar.gz multilib-portage-06385a2fd270b6bde22f5910abd8c62dd47ba25d.tar.bz2 multilib-portage-06385a2fd270b6bde22f5910abd8c62dd47ba25d.zip |
Don't symlink mkspecs for final_abi since it's done already with qt-core
and causes conflicts while merging qt modules.
Diffstat (limited to 'eclass/qt4-build.eclass')
-rw-r--r-- | eclass/qt4-build.eclass | 532 |
1 files changed, 532 insertions, 0 deletions
diff --git a/eclass/qt4-build.eclass b/eclass/qt4-build.eclass new file mode 100644 index 000000000..20dee5edb --- /dev/null +++ b/eclass/qt4-build.eclass @@ -0,0 +1,532 @@ +# Copyright 2007-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/qt4-build.eclass,v 1.27 2009/03/11 23:58:31 flameeyes Exp $ + +# @ECLASS: qt4-build.eclass +# @MAINTAINER: +# Ben de Groot <yngwin@gentoo.org>, +# Markos Chandras <hwoarang@gentoo.org>, +# Caleb Tennis <caleb@gentoo.org> +# @BLURB: Eclass for Qt4 split ebuilds. +# @DESCRIPTION: +# This eclass contains various functions that are used when building Qt4 + +MULTILIB_IN_SOURCE_BUILD="yes" + +inherit eutils multilib toolchain-funcs flag-o-matic versionator + +IUSE="${IUSE} custom-cxxflags debug pch" + +case "${PV}" in + 4.?.?_rc*) + SRCTYPE="${SRCTYPE:-opensource-src}" + MY_PV="${PV/_rc/-rc}" + ;; + *) + SRCTYPE="${SRCTYPE:-opensource-src}" + MY_PV="${PV}" + ;; +esac +MY_P=qt-x11-${SRCTYPE}-${MY_PV} +S=${WORKDIR}/${MY_P} + +HOMEPAGE="http://www.qtsoftware.com/" +SRC_URI="http://download.qtsoftware.com/qt/source/${MY_P}.tar.bz2" + +case "${PV}" in + 4.4.?) SRC_URI="${SRC_URI} mirror://gentoo/${MY_P}-headers.tar.bz2" ;; + *) ;; +esac + +if version_is_at_least 4.5 ${PV} ; then + LICENSE="|| ( LGPL-2.1 GPL-3 )" +fi + +qt4-build_pkg_setup() { + # EAPI=2 ebuilds set use-deps, others need this: + if [[ $EAPI != 2 ]]; then + # Make sure debug setting corresponds with qt-core (bug 258512) + if [[ $PN != "qt-core" ]]; then + use debug && QT4_BUILT_WITH_USE_CHECK="${QT4_BUILT_WITH_USE_CHECK} + ~x11-libs/qt-core-${PV} debug" + fi + + # Check USE requirements + qt4-build_check_use + fi + + # Set up installation directories + QTBASEDIR=/usr/$(get_libdir)/qt4 + QTPREFIXDIR=/usr + QTBINDIR=/usr/bin + QTLIBDIR=/usr/$(get_libdir)/qt4 + QTPCDIR=/usr/$(get_libdir)/pkgconfig + QTDATADIR=/usr/share/qt4 + QTDOCDIR=/usr/share/doc/qt-${PV} + QTHEADERDIR=/usr/include/qt4 + QTPLUGINDIR=${QTLIBDIR}/plugins + QTSYSCONFDIR=/etc/qt4 + QTTRANSDIR=${QTDATADIR}/translations + QTEXAMPLESDIR=${QTDATADIR}/examples + QTDEMOSDIR=${QTDATADIR}/demos + + PLATFORM=$(qt_mkspecs_dir) + + PATH="${S}/bin:${PATH}" + LD_LIBRARY_PATH="${S}/lib:${LD_LIBRARY_PATH}" + + if ! version_is_at_least 4.1 $(gcc-version) ; then + ewarn "Using a GCC version lower than 4.1 is not supported!" + echo + ebeep 5 + fi + + if use custom-cxxflags; then + echo + ewarn "You have set USE=custom-cxxflags, which means Qt will be built with the" + ewarn "CXXFLAGS you have set in /etc/make.conf. This is not supported, and we" + ewarn "recommend to unset this useflag. But you are free to experiment with it." + ewarn "Just do not start crying if it breaks your system, or eats your kitten" + ewarn "for breakfast. ;-) " + echo + fi + +} + +qt4-build_src_unpack() { + local target targets licenses + if version_is_at_least 4.5 ${PV} ; then + licenses="LICENSE.GPL3 LICENSE.LGPL" + else + licenses="LICENSE.GPL2 LICENSE.GPL3" + fi + for target in configure ${licenses} projects.pro \ + src/{qbase,qt_targets,qt_install}.pri bin config.tests mkspecs qmake \ + ${QT4_EXTRACT_DIRECTORIES}; do + targets="${targets} ${MY_P}/${target}" + done + + echo tar xjpf "${DISTDIR}"/${MY_P}.tar.bz2 ${targets} + tar xjpf "${DISTDIR}"/${MY_P}.tar.bz2 ${targets} + + case "${PV}" in + 4.4.?) + echo tar xjpf "${DISTDIR}"/${MY_P}-headers.tar.bz2 + tar xjpf "${DISTDIR}"/${MY_P}-headers.tar.bz2 + ;; + esac + + # Be backwards compatible for now + if [[ $EAPI != 2 ]]; then + qt4-build_src_prepare + fi +} + +qt4-build_src_prepare() { + cd "${S}" + + if [[ ${PN} != qt-core ]]; then + skip_qmake_build_patch + skip_project_generation_patch + symlink_binaries_to_buildtree + fi + + if ! use custom-cxxflags;then + # Don't let the user go too overboard with flags. + strip-flags + replace-flags -O3 -O2 + fi + + # Bug 253127 + # Unsupported old gcc versions - hardened needs this :( + if [[ $(gcc-major-version) -lt "4" ]] ; then + ewarn "Appending -fno-stack-protector to CXXFLAGS" + append-cxxflags -fno-stack-protector + fi + + # Bug 178652 + if [[ "$(gcc-major-version)" == "3" ]] && use amd64; then + ewarn "Appending -fno-gcse to CFLAGS/CXXFLAGS" + append-flags -fno-gcse + fi + + # Bug 172219 + sed -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=${LDFLAGS}:" \ + -e "s:X11R6/::" \ + -i "${S}"/mkspecs/$(qt_mkspecs_dir)/qmake.conf || die "sed ${S}/mkspecs/$(qt_mkspecs_dir)/qmake.conf failed" + + sed -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=${LDFLAGS}:" \ + -i "${S}"/mkspecs/common/g++.conf || die "sed ${S}/mkspecs/common/g++.conf failed" + +} + +qt4-build_src_configure() { + + myconf="$(standard_configure_options) ${myconf}" + + echo ./configure ${myconf} + ./configure ${myconf} || die "./configure failed" +} + +qt4-build_src_compile() { + # Be backwards compatible for now + if [[ $EAPI != 2 ]]; then + qt4-build_src_configure + fi + + build_directories "${QT4_TARGET_DIRECTORIES}" +} + +qt4-build_src_install() { + install_directories "${QT4_TARGET_DIRECTORIES}" + install_qconfigs + fix_library_files + if [[ $(number_abis) -gt 1 ]] ; then + if ! is_final_abi; then + mv "${D}"/${QTDATADIR}/mkspecs "${D}"/${QTDATADIR}/mkspecs-${ABI} + fi + fi + prep_ml_includes +} + +standard_configure_options() { + local myconf="" + + [[ $(get_libdir) != "lib" ]] && myconf="${myconf} -L/usr/$(get_libdir)" + + # Disable visibility explicitly if gcc version isn't 4 + if [[ "$(gcc-major-version)" -lt "4" ]]; then + myconf="${myconf} -no-reduce-exports" + fi + + # precompiled headers doesn't work on hardened, where the flag is masked. + if use pch; then + myconf="${myconf} -pch" + else + myconf="${myconf} -no-pch" + fi + + if use debug; then + myconf="${myconf} -debug -no-separate-debug-info" + else + myconf="${myconf} -release -no-separate-debug-info" + fi + + # ARCH is set on Gentoo. Qt now falls back to generic on an unsupported + # $(tc-arch). Therefore we convert it to supported values. + case "$(tc-arch)" in + amd64) myconf="${myconf} -arch x86_64" ;; + ppc|ppc64) myconf="${myconf} -arch powerpc" ;; + x86|x86-*) myconf="${myconf} -arch i386" ;; + alpha|arm|ia64|mips|s390|sparc) myconf="${myconf} -arch $(tc-arch)" ;; + hppa|sh) myconf="${myconf} -arch generic" ;; + *) die "$(tc-arch) is unsupported by this eclass. Please file a bug." ;; + esac + + myconf="${myconf} -stl -verbose -largefile -confirm-license -no-rpath + -prefix ${QTPREFIXDIR} -bindir ${QTBINDIR} -libdir ${QTLIBDIR} + -datadir ${QTDATADIR} -docdir ${QTDOCDIR} -headerdir ${QTHEADERDIR} + -plugindir ${QTPLUGINDIR} -sysconfdir ${QTSYSCONFDIR} + -translationdir ${QTTRANSDIR} -examplesdir ${QTEXAMPLESDIR} + -demosdir ${QTDEMOSDIR} -silent -fast + $([[ ${PN} == qt-xmlpatterns ]] || echo -no-exceptions) + $(use x86-fbsd || echo -reduce-relocations) + -nomake examples -nomake demos" + + echo "${myconf}" +} + +build_directories() { + local dirs="$@" + for x in ${dirs}; do + cd "${S}"/${x} + "${S}"/bin/qmake "LIBS+=-L${QTLIBDIR}" "CONFIG+=nostrip" || die "qmake failed" + emake || die "emake failed" + done +} + +install_directories() { + local dirs="$@" + for x in ${dirs}; do + pushd "${S}"/${x} >/dev/null || die "Can't pushd ${S}/${x}" + emake INSTALL_ROOT="${D}" install || die "emake install failed" + popd >/dev/null || die "Can't popd from ${S}/${x}" + done +} + +# @ECLASS-VARIABLE: QCONFIG_ADD +# @DESCRIPTION: +# List options that need to be added to QT_CONFIG in qconfig.pri +QCONFIG_ADD="${QCONFIG_ADD:-}" + +# @ECLASS-VARIABLE: QCONFIG_REMOVE +# @DESCRIPTION: +# List options that need to be removed from QT_CONFIG in qconfig.pri +QCONFIG_REMOVE="${QCONFIG_REMOVE:-}" + +# @ECLASS-VARIABLE: QCONFIG_DEFINE +# @DESCRIPTION: +# List variables that should be defined at the top of QtCore/qconfig.h +QCONFIG_DEFINE="${QCONFIG_DEFINE:-}" + +install_qconfigs() { + local x + if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} ]]; then + for x in QCONFIG_ADD QCONFIG_REMOVE; do + [[ -n ${!x} ]] && echo ${x}=${!x} >> "${T}"/${PN}-qconfig.pri + done + insinto ${QTDATADIR}/mkspecs/gentoo + doins "${T}"/${PN}-qconfig.pri || die "installing ${PN}-qconfig.pri failed" + fi + + if [[ -n ${QCONFIG_DEFINE} ]]; then + for x in ${QCONFIG_DEFINE}; do + echo "#define ${x}" >> "${T}"/gentoo-${PN}-qconfig.h + done + insinto ${QTHEADERDIR}/Gentoo + doins "${T}"/gentoo-${PN}-qconfig.h || die "installing ${PN}-qconfig.h failed" + fi +} + +generate_qconfigs() { + if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} || -n ${QCONFIG_DEFINE} || ${CATEGORY}/${PN} == x11-libs/qt-core ]]; then + local x qconfig_add qconfig_remove qconfig_new + for x in "${ROOT}${QTDATADIR}"/mkspecs/gentoo/*-qconfig.pri; do + [[ -f ${x} ]] || continue + qconfig_add="${qconfig_add} $(sed -n 's/^QCONFIG_ADD=//p' "${x}")" + qconfig_remove="${qconfig_remove} $(sed -n 's/^QCONFIG_REMOVE=//p' "${x}")" + done + + # these error checks do not use die because dying in pkg_post{inst,rm} + # just makes things worse. + if [[ -e "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri ]]; then + # start with the qconfig.pri that qt-core installed + if ! cp "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri \ + "${ROOT}${QTDATADIR}"/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}${QTDATADIR}"/mkspecs/qconfig.pri) ${qconfig_add}; do + hasq ${x} ${qconfig_remove} || qconfig_new="${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}${QTDATADIR}"/mkspecs/qconfig.pri; then + eerror "Sed for QT_CONFIG failed" + return 1 + fi + + # create Gentoo/qconfig.h + if [[ ! -e ${ROOT}${QTHEADERDIR}/Gentoo ]]; then + if ! mkdir -p "${ROOT}${QTHEADERDIR}"/Gentoo; then + eerror "mkdir ${QTHEADERDIR}/Gentoo failed" + return 1 + fi + fi + : > "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h + for x in "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-*-qconfig.h; do + [[ -f ${x} ]] || continue + cat "${x}" >> "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h + done + else + rm -f "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri + rm -f "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h + rmdir "${ROOT}${QTDATADIR}"/mkspecs \ + "${ROOT}${QTDATADIR}" \ + "${ROOT}${QTHEADERDIR}"/Gentoo \ + "${ROOT}${QTHEADERDIR}" 2>/dev/null + fi + fi +} + +qt4-build_pkg_postrm() { + generate_qconfigs +} + +qt4-build_pkg_postinst() { + generate_qconfigs + echo + ewarn "After a rebuild or upgrade of Qt, it can happen that Qt plugins (such as Qt" + ewarn "and KDE styles and widgets) can no longer be loaded. In this situation you" + ewarn "should recompile the packages providing these plugins. Also, make sure you" + ewarn "compile the Qt packages, and the packages that depend on it, with the same" + ewarn "GCC version and the same USE flag settings (especially the debug flag)." + ewarn + ewarn "Packages that typically need to be recompiled are kdelibs from KDE4, any" + ewarn "additional KDE4/Qt4 styles, qscintilla and PyQt4. Before filing a bug report," + ewarn "make sure all your Qt4 packages are up-to-date and built with the same" + ewarn "configuration." + ewarn + ewarn "For more information, see http://doc.trolltech.com/4.4/plugins-howto.html" + echo +} + +skip_qmake_build_patch() { + # Don't need to build qmake, as it's already installed from qt-core + sed -i -e "s:if true:if false:g" "${S}"/configure || die "Sed failed" +} + +skip_project_generation_patch() { + # Exit the script early by throwing in an exit before all of the .pro files are scanned + sed -e "s:echo \"Finding:exit 0\n\necho \"Finding:g" \ + -i "${S}"/configure || die "Sed failed" +} + +symlink_binaries_to_buildtree() { + for bin in qmake moc uic rcc; do + ln -s ${QTBINDIR}/${bin} "${S}"/bin/ || die "Symlinking ${bin} to ${S}/bin failed." + done +} + +fix_library_files() { + for libfile in "${D}"/${QTLIBDIR}/{*.la,*.prl,pkgconfig/*.pc}; do + if [[ -e ${libfile} ]]; then + sed -i -e "s:${S}/lib:${QTLIBDIR}:g" ${libfile} || die "Sed on ${libfile} failed." + fi + done + + # pkgconfig files refer to WORKDIR/bin as the moc and uic locations. Fix: + for libfile in "${D}"/${QTLIBDIR}/pkgconfig/*.pc; do + if [[ -e ${libfile} ]]; then + sed -i -e "s:${S}/bin:${QTBINDIR}:g" ${libfile} || die "Sed failed" + + # Move .pc files into the pkgconfig directory + + dodir ${QTPCDIR} + mv ${libfile} "${D}"/${QTPCDIR}/ \ + || die "Moving ${libfile} to ${D}/${QTPCDIR}/ failed." + fi + done + + # Don't install an empty directory + rmdir "${D}"/${QTLIBDIR}/pkgconfig +} + +qt_use() { + local flag="${1}" + local feature="${1}" + local enableval= + + [[ -n ${2} ]] && feature=${2} + [[ -n ${3} ]] && enableval="-${3}" + + if use ${flag}; then + echo "${enableval}-${feature}" + else + echo "-no-${feature}" + fi +} + +# @ECLASS-VARIABLE: QT4_BUILT_WITH_USE_CHECK +# @DESCRIPTION: +# The contents of $QT4_BUILT_WITH_USE_CHECK gets fed to built_with_use +# (eutils.eclass), line per line. +# +# Example: +# @CODE +# pkg_setup() { +# use qt3support && QT4_BUILT_WITH_USE_CHECK="${QT4_BUILT_WITH_USE_CHECK} +# ~x11-libs/qt-gui-${PV} qt3support" +# qt4-build_check_use +# } +# @CODE + +# Run built_with_use on each flag and print appropriate error messages if any +# flags are missing +_qt_built_with_use() { + local missing opt pkg flag flags + + if [[ ${1} = "--missing" ]]; then + missing="${1} ${2}" && shift 2 + fi + if [[ ${1:0:1} = "-" ]]; then + opt=${1} && shift + fi + + pkg=${1} && shift + + for flag in "${@}"; do + flags="${flags} ${flag}" + if ! built_with_use ${missing} ${opt} ${pkg} ${flag}; then + flags="${flags}*" + else + [[ ${opt} = "-o" ]] && return 0 + fi + done + if [[ "${flags# }" = "${@}" ]]; then + return 0 + fi + if [[ ${opt} = "-o" ]]; then + eerror "This package requires '${pkg}' to be built with any of the following USE flags: '$*'." + else + eerror "This package requires '${pkg}' to be built with the following USE flags: '${flags# }'." + fi + return 1 +} + +# @FUNCTION: qt4-build_check_use +# @DESCRIPTION: +# Check if the listed packages in $QT4_BUILT_WITH_USE_CHECK are built with the +# USE flags listed. +# +# If any of the required USE flags are missing, an eerror will be printed for +# each package with missing USE flags. +qt4-build_check_use() { + local line missing + while read line; do + [[ -z ${line} ]] && continue + if ! _qt_built_with_use ${line}; then + missing=true + fi + done <<< "${QT4_BUILT_WITH_USE_CHECK}" + if [[ -n ${missing} ]]; then + echo + eerror "Flags marked with an * are missing." + die "Missing USE flags found" + fi +} + +qt_mkspecs_dir() { + # Allows us to define which mkspecs dir we want to use. + local spec + + case ${CHOST} in + *-freebsd*|*-dragonfly*) + spec="freebsd" ;; + *-openbsd*) + spec="openbsd" ;; + *-netbsd*) + spec="netbsd" ;; + *-darwin*) + spec="darwin" ;; + *-linux-*|*-linux) + spec="linux" ;; + *) + die "Unknown CHOST, no platform choosen." + esac + + CXX=$(tc-getCXX) + if [[ ${CXX/g++/} != ${CXX} ]]; then + spec="${spec}-g++" + elif [[ ${CXX/icpc/} != ${CXX} ]]; then + spec="${spec}-icc" + else + die "Unknown compiler ${CXX}." + fi + + echo "${spec}" +} + +case ${EAPI:-0} in + 0|1) EXPORT_FUNCTIONS pkg_setup src_unpack src_compile src_install pkg_postrm pkg_postinst ;; + 2) EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure src_compile src_install pkg_postrm pkg_postinst ;; +esac |