/[gentoo-x86]/eclass/qt4-build.eclass
Gentoo

Contents of /eclass/qt4-build.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.17 - (hide annotations) (download)
Mon Jan 12 23:47:16 2009 UTC (5 years, 6 months ago) by yngwin
Branch: MAIN
Changes since 1.16: +15 -1 lines
Adding post-install warning about Qt4 plugins needing rebuilding

1 ingmar 1.7 # Copyright 2007-2008 Gentoo Foundation
2 caleb 1.1 # Distributed under the terms of the GNU General Public License v2
3 yngwin 1.17 # $Header: /var/cvsroot/gentoo-x86/eclass/qt4-build.eclass,v 1.16 2008/09/18 22:07:50 yngwin Exp $
4 caleb 1.1
5     # @ECLASS: qt4-build.eclass
6     # @MAINTAINER:
7     # Caleb Tennis <caleb@gentoo.org>
8 ingmar 1.8 # @BLURB: Eclass for Qt4 split ebuilds.
9 caleb 1.1 # @DESCRIPTION:
10     # This eclass contains various functions that are used when building Qt4
11    
12     inherit eutils multilib toolchain-funcs flag-o-matic
13    
14 ingmar 1.12 IUSE="${IUSE} debug pch"
15 caleb 1.1
16 ingmar 1.7 case "${PV}" in
17     4.4.0_beta*)
18     SRCTYPE="${SRCTYPE:-opensource-src}"
19     MY_PV="${PV/_beta/-beta}"
20     ;;
21 ingmar 1.11 4.4.0_rc*)
22     SRCTYPE="${SRCTYPE:-opensource-src}"
23     MY_PV="${PV/_rc/-rc}"
24     ;;
25 ingmar 1.7 *)
26     SRCTYPE="${SRCTYPE:-opensource-src}"
27     MY_PV="${PV}"
28     ;;
29     esac
30 ingmar 1.11 MY_P=qt-x11-${SRCTYPE}-${MY_PV}
31     S=${WORKDIR}/${MY_P}
32 ingmar 1.7
33 ingmar 1.11 SRC_URI="ftp://ftp.trolltech.com/qt/source/${MY_P}.tar.bz2"
34    
35     case "${PV}" in
36 yngwin 1.16 4.4.2|4.4.1|4.4.0|4.4.0_rc*)
37 ingmar 1.11 SRC_URI="${SRC_URI} mirror://gentoo/${MY_P}-headers.tar.bz2"
38     ;;
39     *)
40     ;;
41     esac
42 ingmar 1.7
43 caleb 1.1 qt4-build_pkg_setup() {
44 ingmar 1.7 # Check USE requirements
45     qt4-build_check_use
46    
47 caleb 1.1 # Set up installation directories
48 caleb 1.5 QTBASEDIR=/usr/$(get_libdir)/qt4
49     QTPREFIXDIR=/usr
50     QTBINDIR=/usr/bin
51     QTLIBDIR=/usr/$(get_libdir)/qt4
52     QTPCDIR=/usr/$(get_libdir)/pkgconfig
53     QTDATADIR=/usr/share/qt4
54 caleb 1.6 QTDOCDIR=/usr/share/doc/qt-${PV}
55 caleb 1.5 QTHEADERDIR=/usr/include/qt4
56     QTPLUGINDIR=${QTLIBDIR}/plugins
57     QTSYSCONFDIR=/etc/qt4
58     QTTRANSDIR=${QTDATADIR}/translations
59     QTEXAMPLESDIR=${QTDATADIR}/examples
60     QTDEMOSDIR=${QTDATADIR}/demos
61 caleb 1.1
62 caleb 1.5 PLATFORM=$(qt_mkspecs_dir)
63 caleb 1.1
64     PATH="${S}/bin:${PATH}"
65     LD_LIBRARY_PATH="${S}/lib:${LD_LIBRARY_PATH}"
66     }
67    
68 ingmar 1.11 qt4_unpack() {
69     local target targets
70 yngwin 1.15 for target in configure LICENSE.{GPL2,GPL3} projects.pro \
71 ingmar 1.11 src/{qbase,qt_targets,qt_install}.pri bin config.tests mkspecs qmake \
72 ingmar 1.13 ${QT4_EXTRACT_DIRECTORIES}; do
73 ingmar 1.11 targets="${targets} ${MY_P}/${target}"
74     done
75    
76     echo tar xjpf "${DISTDIR}"/${MY_P}.tar.bz2 ${targets}
77     tar xjpf "${DISTDIR}"/${MY_P}.tar.bz2 ${targets}
78    
79     case "${PV}" in
80 yngwin 1.16 4.4.2|4.4.1|4.4.0|4.4.0_rc*)
81 ingmar 1.11 echo tar xjpf "${DISTDIR}"/${MY_P}-headers.tar.bz2
82     tar xjpf "${DISTDIR}"/${MY_P}-headers.tar.bz2
83     ;;
84     esac
85     }
86    
87 caleb 1.1 qt4-build_src_unpack() {
88 ingmar 1.11 qt4_unpack
89 ingmar 1.7 if [[ ${PN} != qt-core ]]; then
90 ingmar 1.11 cd "${S}"
91 ingmar 1.7 skip_qmake_build_patch
92     skip_project_generation_patch
93     symlink_binaries_to_buildtree
94     fi
95    
96     sed -e "s:QMAKE_CFLAGS_RELEASE.*=.*:QMAKE_CFLAGS_RELEASE=${CFLAGS}:" \
97     -e "s:QMAKE_CXXFLAGS_RELEASE.*=.*:QMAKE_CXXFLAGS_RELEASE=${CXXFLAGS}:" \
98     -e "s:QMAKE_LFLAGS_RELEASE.*=.*:QMAKE_LFLAGS_RELEASE=${LDFLAGS}:" \
99     -e "s:X11R6/::" \
100     -i "${S}"/mkspecs/$(qt_mkspecs_dir)/qmake.conf || die "sed ${S}/mkspecs/$(qt_mkspecs_dir)/qmake.conf failed"
101    
102     sed -e "s:QMAKE_CFLAGS_RELEASE.*=.*:QMAKE_CFLAGS_RELEASE=${CFLAGS}:" \
103     -e "s:QMAKE_CXXFLAGS_RELEASE.*=.*:QMAKE_CXXFLAGS_RELEASE=${CXXFLAGS}:" \
104     -e "s:QMAKE_LFLAGS_RELEASE.*=.*:QMAKE_LFLAGS_RELEASE=${LDFLAGS}:" \
105     -i "${S}"/mkspecs/common/g++.conf || die "sed ${S}/mkspecs/common/g++.conf failed"
106     }
107    
108     qt4-build_src_compile() {
109 caleb 1.1 # Don't let the user go too overboard with flags. If you really want to, uncomment
110     # out the line below and give 'er a whirl.
111     strip-flags
112     replace-flags -O3 -O2
113    
114 ingmar 1.7 if [[ $(gcc-fullversion) == "3.4.6" && gcc-specs-ssp ]] ; then
115 caleb 1.1 ewarn "Appending -fno-stack-protector to CFLAGS/CXXFLAGS"
116     append-flags -fno-stack-protector
117     fi
118 ingmar 1.7
119 ingmar 1.10 # Bug 178652
120     if [[ "$(gcc-major-version)" == "3" ]] && use amd64; then
121     ewarn "Appending -fno-gcse to CFLAGS/CXXFLAGS"
122     append-flags -fno-gcse
123     fi
124    
125 ingmar 1.7 myconf="$(standard_configure_options) ${myconf}"
126    
127     echo ./configure ${myconf}
128     ./configure ${myconf} || die "./configure failed"
129    
130     build_target_directories
131 caleb 1.1 }
132    
133 caleb 1.4 qt4-build_src_install() {
134     install_directories "${QT4_TARGET_DIRECTORIES}"
135 ingmar 1.7 install_qconfigs
136 caleb 1.4 fix_library_files
137     }
138    
139 caleb 1.1 standard_configure_options() {
140     local myconf=""
141    
142 ingmar 1.7 [[ $(get_libdir) != "lib" ]] && myconf="${myconf} -L/usr/$(get_libdir)"
143 caleb 1.1
144     # Disable visibility explicitly if gcc version isn't 4
145 ingmar 1.7 if [[ "$(gcc-major-version)" -lt "4" ]]; then
146 caleb 1.1 myconf="${myconf} -no-reduce-exports"
147     fi
148    
149 ingmar 1.12 # precompiled headers doesn't work on hardened, where the flag is masked.
150     if use pch; then
151     myconf="${myconf} -pch"
152     else
153     myconf="${myconf} -no-pch"
154     fi
155    
156 ingmar 1.7 if use debug; then
157     myconf="${myconf} -debug -no-separate-debug-info"
158     else
159     myconf="${myconf} -release -no-separate-debug-info"
160     fi
161 caleb 1.1
162 ingmar 1.11 # ARCH is set on Gentoo. QT now falls back to generic on an unsupported
163     # ${ARCH}. Therefore we convert it to supported values.
164     case "${ARCH}" in
165     amd64) myconf="${myconf} -arch x86_64" ;;
166     ppc|ppc64) myconf="${myconf} -arch powerpc" ;;
167 ingmar 1.14 x86|x86-*) myconf="${myconf} -arch i386" ;;
168 ingmar 1.11 alpha|arm|ia64|mips|s390|sparc) myconf="${myconf} -arch ${ARCH}" ;;
169     hppa|sh) myconf="${myconf} -arch generic" ;;
170     *) die "${ARCH} is unsupported by this eclass. Please file a bug." ;;
171     esac
172    
173 ingmar 1.7 myconf="${myconf} -stl -verbose -largefile -confirm-license -no-rpath
174     -prefix ${QTPREFIXDIR} -bindir ${QTBINDIR} -libdir ${QTLIBDIR}
175     -datadir ${QTDATADIR} -docdir ${QTDOCDIR} -headerdir ${QTHEADERDIR}
176     -plugindir ${QTPLUGINDIR} -sysconfdir ${QTSYSCONFDIR}
177     -translationdir ${QTTRANSDIR} -examplesdir ${QTEXAMPLESDIR}
178     -demosdir ${QTDEMOSDIR} -silent -fast -reduce-relocations
179     -nomake examples -nomake demos"
180 caleb 1.1
181     echo "${myconf}"
182     }
183    
184 caleb 1.4 build_target_directories() {
185     build_directories "${QT4_TARGET_DIRECTORIES}"
186     }
187    
188 caleb 1.1 build_directories() {
189     local dirs="$@"
190     for x in ${dirs}; do
191     cd "${S}"/${x}
192 ingmar 1.7 "${S}"/bin/qmake "LIBS+=-L${QTLIBDIR}" "CONFIG+=nostrip" || die "qmake failed"
193     emake || die "emake failed"
194 caleb 1.1 done
195     }
196    
197     install_directories() {
198     local dirs="$@"
199     for x in ${dirs}; do
200 ingmar 1.7 pushd "${S}"/${x} >/dev/null || die "Can't pushd ${S}/${x}"
201     emake INSTALL_ROOT="${D}" install || die "emake install failed"
202     popd >/dev/null || die "Can't popd from ${S}/${x}"
203 caleb 1.1 done
204     }
205    
206 ingmar 1.7 # @ECLASS-VARIABLE: QCONFIG_ADD
207     # @DESCRIPTION:
208     # List options that need to be added to QT_CONFIG in qconfig.pri
209     QCONFIG_ADD="${QCONFIG_ADD:-}"
210    
211     # @ECLASS-VARIABLE: QCONFIG_REMOVE
212     # @DESCRIPTION:
213     # List options that need to be removed from QT_CONFIG in qconfig.pri
214     QCONFIG_REMOVE="${QCONFIG_REMOVE:-}"
215    
216     # @ECLASS-VARIABLE: QCONFIG_DEFINE
217     # @DESCRIPTION:
218     # List variables that should be defined at the top of QtCore/qconfig.h
219     QCONFIG_DEFINE="${QCONFIG_DEFINE:-}"
220    
221     install_qconfigs() {
222 zlin 1.9 local x
223     if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} ]]; then
224 ingmar 1.7 for x in QCONFIG_ADD QCONFIG_REMOVE; do
225     [[ -n ${!x} ]] && echo ${x}=${!x} >> "${T}"/${PN}-qconfig.pri
226     done
227     insinto ${QTDATADIR}/mkspecs/gentoo
228     doins "${T}"/${PN}-qconfig.pri || die "installing ${PN}-qconfig.pri failed"
229 zlin 1.9 fi
230 ingmar 1.7
231 zlin 1.9 if [[ -n ${QCONFIG_DEFINE} ]]; then
232 ingmar 1.7 for x in ${QCONFIG_DEFINE}; do
233     echo "#define ${x}" >> "${T}"/gentoo-${PN}-qconfig.h
234     done
235     insinto ${QTHEADERDIR}/Gentoo
236     doins "${T}"/gentoo-${PN}-qconfig.h || die "installing ${PN}-qconfig.h failed"
237     fi
238     }
239    
240     # Stubs for functions used by the Qt 4.4.0_technical_preview_1.
241     qconfig_add_option() { : ; }
242     qconfig_remove_option() { : ; }
243    
244     generate_qconfigs() {
245     if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} || -n ${QCONFIG_DEFINE} || ${CATEGORY}/${PN} == x11-libs/qt-core ]]; then
246     local x qconfig_add qconfig_remove qconfig_new
247     for x in "${ROOT}${QTDATADIR}"/mkspecs/gentoo/*-qconfig.pri; do
248     [[ -f ${x} ]] || continue
249     qconfig_add="${qconfig_add} $(sed -n 's/^QCONFIG_ADD=//p' "${x}")"
250     qconfig_remove="${qconfig_remove} $(sed -n 's/^QCONFIG_REMOVE=//p' "${x}")"
251     done
252    
253     # these error checks do not use die because dying in pkg_post{inst,rm}
254     # just makes things worse.
255     if [[ -e "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri ]]; then
256     # start with the qconfig.pri that qt-core installed
257     if ! cp "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri \
258     "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri; then
259     eerror "cp qconfig failed."
260     return 1
261     fi
262    
263     # generate list of QT_CONFIG entries from the existing list
264     # including qconfig_add and excluding qconfig_remove
265     for x in $(sed -n 's/^QT_CONFIG +=//p' \
266     "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri) ${qconfig_add}; do
267     hasq ${x} ${qconfig_remove} || qconfig_new="${qconfig_new} ${x}"
268     done
269    
270     # replace the existing QT_CONFIG list with qconfig_new
271     if ! sed -i -e "s/QT_CONFIG +=.*/QT_CONFIG += ${qconfig_new}/" \
272     "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri; then
273     eerror "Sed for QT_CONFIG failed"
274     return 1
275     fi
276    
277     # create Gentoo/qconfig.h
278     if [[ ! -e ${ROOT}${QTHEADERDIR}/Gentoo ]]; then
279     if ! mkdir -p "${ROOT}${QTHEADERDIR}"/Gentoo; then
280     eerror "mkdir ${QTHEADERDIR}/Gentoo failed"
281     return 1
282     fi
283     fi
284     : > "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h
285     for x in "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-*-qconfig.h; do
286     [[ -f ${x} ]] || continue
287     cat "${x}" >> "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h
288     done
289     else
290     rm -f "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri
291     rm -f "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h
292     rmdir "${ROOT}${QTDATADIR}"/mkspecs \
293     "${ROOT}${QTDATADIR}" \
294     "${ROOT}${QTHEADERDIR}"/Gentoo \
295     "${ROOT}${QTHEADERDIR}" 2>/dev/null
296     fi
297     fi
298     }
299    
300     qt4-build_pkg_postrm() {
301     generate_qconfigs
302 caleb 1.1 }
303    
304 ingmar 1.7 qt4-build_pkg_postinst() {
305     generate_qconfigs
306 yngwin 1.17 echo
307     ewarn "After a rebuild or upgrade of Qt, it can happen that Qt plugins (such as Qt"
308     ewarn "and KDE styles and widgets) can no longer be loaded. In this situation you"
309     ewarn "should recompile the packages providing these plugins. Also, make sure you"
310     ewarn "compile the Qt packages, and the packages that depend on it, with the same"
311     ewarn "GCC version and the same USE flag settings (especially the debug flag)."
312     ewarn
313     ewarn "Packages that typically need to be recompiled are kdelibs from KDE4, any"
314     ewarn "additional KDE4/Qt4 styles, qscintilla and PyQt4. Before filing a bug report,"
315     ewarn "make sure all your Qt4 packages are up-to-date and built with the same"
316     ewarn "configuration."
317     ewarn
318     ewarn "For more information, see http://doc.trolltech.com/4.4/plugins-howto.html"
319     echo
320 caleb 1.1 }
321    
322     skip_qmake_build_patch() {
323 ingmar 1.7 # Don't need to build qmake, as it's already installed from qt-core
324     sed -i -e "s:if true:if false:g" "${S}"/configure || die "Sed failed"
325 caleb 1.1 }
326    
327     skip_project_generation_patch() {
328     # Exit the script early by throwing in an exit before all of the .pro files are scanned
329 ingmar 1.7 sed -e "s:echo \"Finding:exit 0\n\necho \"Finding:g" \
330     -i "${S}"/configure || die "Sed failed"
331 caleb 1.1 }
332    
333 ingmar 1.7 symlink_binaries_to_buildtree() {
334     for bin in qmake moc uic rcc; do
335     ln -s ${QTBINDIR}/${bin} "${S}"/bin/ || die "Symlinking ${bin} to ${S}/bin failed."
336     done
337 caleb 1.1 }
338    
339     fix_library_files() {
340 ingmar 1.7 for libfile in "${D}"/${QTLIBDIR}/{*.la,*.prl,pkgconfig/*.pc}; do
341     if [[ -e ${libfile} ]]; then
342     sed -i -e "s:${S}/lib:${QTLIBDIR}:g" ${libfile} || die "Sed on ${libfile} failed."
343     fi
344     done
345 caleb 1.1
346     # pkgconfig files refer to WORKDIR/bin as the moc and uic locations. Fix:
347 ingmar 1.7 for libfile in "${D}"/${QTLIBDIR}/pkgconfig/*.pc; do
348     if [[ -e ${libfile} ]]; then
349     sed -i -e "s:${S}/bin:${QTBINDIR}:g" ${libfile} || die "Sed failed"
350 caleb 1.1
351     # Move .pc files into the pkgconfig directory
352 ingmar 1.7
353     dodir ${QTPCDIR}
354     mv ${libfile} "${D}"/${QTPCDIR}/ \
355     || die "Moving ${libfile} to ${D}/${QTPCDIR}/ failed."
356     fi
357     done
358    
359     # Don't install an empty directory
360     rmdir "${D}"/${QTLIBDIR}/pkgconfig
361 caleb 1.1 }
362    
363     qt_use() {
364 ingmar 1.7 local flag="${1}"
365     local feature="${1}"
366 caleb 1.5 local enableval=
367 caleb 1.1
368 ingmar 1.7 [[ -n ${2} ]] && feature=${2}
369     [[ -n ${3} ]] && enableval="-${3}"
370    
371     if use ${flag}; then
372     echo "${enableval}-${feature}"
373     else
374     echo "-no-${feature}"
375     fi
376     }
377    
378     # @ECLASS-VARIABLE: QT4_BUILT_WITH_USE_CHECK
379     # @DESCRIPTION:
380     # The contents of $QT4_BUILT_WITH_USE_CHECK gets fed to built_with_use
381     # (eutils.eclass), line per line.
382     #
383     # Example:
384     # @CODE
385     # pkg_setup() {
386     # use qt3support && QT4_BUILT_WITH_USE_CHECK="${QT4_BUILT_WITH_USE_CHECK}
387     # ~x11-libs/qt-gui-${PV} qt3support"
388     # qt4-build_check_use
389     # }
390     # @CODE
391    
392     # Run built_with_use on each flag and print appropriate error messages if any
393     # flags are missing
394     _qt_built_with_use() {
395     local missing opt pkg flag flags
396 caleb 1.1
397 ingmar 1.7 if [[ ${1} = "--missing" ]]; then
398     missing="${1} ${2}" && shift 2
399     fi
400     if [[ ${1:0:1} = "-" ]]; then
401     opt=${1} && shift
402     fi
403    
404     pkg=${1} && shift
405    
406     for flag in "${@}"; do
407     flags="${flags} ${flag}"
408     if ! built_with_use ${missing} ${opt} ${pkg} ${flag}; then
409     flags="${flags}*"
410     else
411     [[ ${opt} = "-o" ]] && return 0
412     fi
413     done
414     if [[ "${flags# }" = "${@}" ]]; then
415     return 0
416     fi
417     if [[ ${opt} = "-o" ]]; then
418     eerror "This package requires '${pkg}' to be built with any of the following USE flags: '$*'."
419     else
420     eerror "This package requires '${pkg}' to be built with the following USE flags: '${flags# }'."
421     fi
422     return 1
423     }
424    
425     # @FUNCTION: qt4-build_check_use
426     # @DESCRIPTION:
427     # Check if the listed packages in $QT4_BUILT_WITH_USE_CHECK are built with the
428     # USE flags listed.
429     #
430     # If any of the required USE flags are missing, an eerror will be printed for
431     # each package with missing USE flags.
432     qt4-build_check_use() {
433     local line missing
434     while read line; do
435     [[ -z ${line} ]] && continue
436     if ! _qt_built_with_use ${line}; then
437     missing=true
438     fi
439     done <<< "${QT4_BUILT_WITH_USE_CHECK}"
440     if [[ -n ${missing} ]]; then
441     echo
442     eerror "Flags marked with an * are missing."
443     die "Missing USE flags found"
444     fi
445 caleb 1.1 }
446    
447     qt_mkspecs_dir() {
448 caleb 1.5 # Allows us to define which mkspecs dir we want to use.
449     local spec
450 caleb 1.1
451 caleb 1.5 case ${CHOST} in
452     *-freebsd*|*-dragonfly*)
453     spec="freebsd" ;;
454     *-openbsd*)
455     spec="openbsd" ;;
456     *-netbsd*)
457     spec="netbsd" ;;
458 ingmar 1.7 *-darwin*)
459 caleb 1.5 spec="darwin" ;;
460     *-linux-*|*-linux)
461     spec="linux" ;;
462     *)
463 ingmar 1.7 die "Unknown CHOST, no platform choosen."
464 caleb 1.5 esac
465    
466     CXX=$(tc-getCXX)
467     if [[ ${CXX/g++/} != ${CXX} ]]; then
468     spec="${spec}-g++"
469     elif [[ ${CXX/icpc/} != ${CXX} ]]; then
470     spec="${spec}-icc"
471     else
472     die "Unknown compiler ${CXX}."
473     fi
474 caleb 1.1
475 caleb 1.5 echo "${spec}"
476 caleb 1.1 }
477    
478 ingmar 1.7 EXPORT_FUNCTIONS pkg_setup src_unpack src_compile src_install pkg_postrm pkg_postinst

  ViewVC Help
Powered by ViewVC 1.1.20