| # Copyright 1999-2015 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| # $Id$ |
| |
| # @ECLASS: qt4-build-multilib.eclass |
| # @MAINTAINER: |
| # qt@gentoo.org |
| # @AUTHOR: |
| # Davide Pesavento <pesa@gentoo.org> |
| # @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 |
| abi_x86_32? ( !app-emulation/emul-linux-x86-qtlibs[-abi_x86_32(-)] ) |
| " |
| |
| |
| # 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 [[ $(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 |
| |
| 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 |
| |
| 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 && [[ $(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 |
| |
| # 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 |
| # TODO bug 522646: write an eselect module to manage default.conf |
| dosym qt4.conf /etc/xdg/qtchooser/default.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 <QtCore/Gentoo/gentoo-qconfig.h>\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 <Gentoo/gentoo-qconfig.h>\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: <flag> [feature] [enableval] |
| # @DESCRIPTION: |
| # <flag> is the name of a flag in IUSE. |
| # |
| # Outputs "-${enableval}-${feature}" if <flag> is enabled, "-no-${feature}" |
| # otherwise. If [feature] is not specified, <flag> 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: <flag> [feature] [enableval] |
| # @DESCRIPTION: |
| # <flag> is the name of a flag in IUSE. |
| # |
| # Outputs "-${enableval}-${feature}" if <flag> is enabled and we are currently |
| # building for the native ABI, "-no-${feature}" otherwise. If [feature] is not |
| # specified, <flag> 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 |
| QMAKE_LIBDIR_QT=${QT4_LIBDIR} |
| |
| export XDG_CONFIG_HOME="${T}" |
| } |
| |
| # @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 <Qt/...> |
| 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 ia64-linux || use ppc64-linux || |
| use x64-macos || |
| use sparc64-freebsd || use x64-freebsd || use x64-openbsd || |
| use ia64-hpux || |
| use sparc64-solaris || use x64-solaris |
| then |
| [[ -d ${S}/mkspecs/${spec}-64 ]] && spec+=-64 |
| fi |
| |
| echo ${spec} |
| } |