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

Contents of /eclass/qt4-build.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.129 - (hide annotations) (download)
Sun May 20 17:12:34 2012 UTC (2 years, 4 months ago) by pesa
Branch: MAIN
Changes since 1.128: +3 -2 lines
Try to avoid sandbox violation when running qhelpgenerator, bug 415517.

1 pesa 1.115 # Copyright 1999-2012 Gentoo Foundation
2 caleb 1.1 # Distributed under the terms of the GNU General Public License v2
3 pesa 1.129 # $Header: /var/cvsroot/gentoo-x86/eclass/qt4-build.eclass,v 1.128 2012/05/07 21:28:01 pesa Exp $
4 caleb 1.1
5     # @ECLASS: qt4-build.eclass
6     # @MAINTAINER:
7 pesa 1.98 # Qt herd <qt@gentoo.org>
8 ingmar 1.8 # @BLURB: Eclass for Qt4 split ebuilds.
9 caleb 1.1 # @DESCRIPTION:
10 pesa 1.98 # This eclass contains various functions that are used when building Qt4.
11 caleb 1.1
12 pesa 1.123 case ${EAPI} in
13     2|3|4) : ;;
14     *) die "qt4-build.eclass requires EAPI 2, 3 or 4." ;;
15     esac
16    
17 pesa 1.124 inherit base eutils flag-o-matic multilib toolchain-funcs versionator
18    
19     if [[ ${PV} == *9999* ]]; then
20     QT4_BUILD_TYPE="live"
21     inherit git-2
22     else
23     QT4_BUILD_TYPE="release"
24     fi
25    
26     HOMEPAGE="http://qt-project.org/ http://qt.nokia.com/"
27     LICENSE="|| ( LGPL-2.1 GPL-3 )"
28 caleb 1.1
29 abcd 1.59 MY_PV=${PV/_/-}
30 pesa 1.100 MY_P=qt-everywhere-opensource-src-${MY_PV}
31    
32 pesa 1.124 case ${QT4_BUILD_TYPE} in
33     live)
34     EGIT_REPO_URI="git://gitorious.org/qt/qt.git
35     https://git.gitorious.org/qt/qt.git"
36     EGIT_BRANCH="${PV%.9999}"
37     ;;
38     release)
39     SRC_URI="http://get.qt.nokia.com/qt/source/${MY_P}.tar.gz"
40     ;;
41     esac
42 pesa 1.100
43     IUSE="aqua debug pch"
44 pesa 1.124 if [[ ${CATEGORY}/${PN} != x11-libs/qt-xmlpatterns ]]; then
45 pesa 1.100 IUSE+=" +exceptions"
46 pesa 1.124 fi
47     if version_is_at_least 4.8; then
48 hwoarang 1.96 IUSE+=" c++0x qpa"
49     fi
50    
51 pesa 1.127 DEPEND="virtual/pkgconfig"
52 pesa 1.124 if [[ ${QT4_BUILD_TYPE} == live ]]; then
53     DEPEND+=" dev-lang/perl"
54     fi
55    
56 hwoarang 1.36 RDEPEND="
57     !<x11-libs/qt-assistant-${PV}
58     !>x11-libs/qt-assistant-${PV}-r9999
59 pesa 1.125 !<x11-libs/qt-bearer-${PV}
60     !>x11-libs/qt-bearer-${PV}-r9999
61 hwoarang 1.36 !<x11-libs/qt-core-${PV}
62     !>x11-libs/qt-core-${PV}-r9999
63     !<x11-libs/qt-dbus-${PV}
64     !>x11-libs/qt-dbus-${PV}-r9999
65 pesa 1.100 !<x11-libs/qt-declarative-${PV}
66     !>x11-libs/qt-declarative-${PV}-r9999
67 hwoarang 1.36 !<x11-libs/qt-demo-${PV}
68     !>x11-libs/qt-demo-${PV}-r9999
69     !<x11-libs/qt-gui-${PV}
70     !>x11-libs/qt-gui-${PV}-r9999
71 wired 1.65 !<x11-libs/qt-multimedia-${PV}
72     !>x11-libs/qt-multimedia-${PV}-r9999
73 hwoarang 1.36 !<x11-libs/qt-opengl-${PV}
74     !>x11-libs/qt-opengl-${PV}-r9999
75 pesa 1.119 !<x11-libs/qt-openvg-${PV}
76     !>x11-libs/qt-openvg-${PV}-r9999
77 hwoarang 1.36 !<x11-libs/qt-phonon-${PV}
78     !>x11-libs/qt-phonon-${PV}-r9999
79     !<x11-libs/qt-qt3support-${PV}
80     !>x11-libs/qt-qt3support-${PV}-r9999
81     !<x11-libs/qt-script-${PV}
82     !>x11-libs/qt-script-${PV}-r9999
83     !<x11-libs/qt-sql-${PV}
84     !>x11-libs/qt-sql-${PV}-r9999
85     !<x11-libs/qt-svg-${PV}
86     !>x11-libs/qt-svg-${PV}-r9999
87     !<x11-libs/qt-test-${PV}
88     !>x11-libs/qt-test-${PV}-r9999
89     !<x11-libs/qt-webkit-${PV}
90     !>x11-libs/qt-webkit-${PV}-r9999
91     !<x11-libs/qt-xmlpatterns-${PV}
92     !>x11-libs/qt-xmlpatterns-${PV}-r9999
93     "
94 abcd 1.55
95 abcd 1.59 S=${WORKDIR}/${MY_P}
96 yngwin 1.25
97 hwoarang 1.34 # @FUNCTION: qt4-build_pkg_setup
98     # @DESCRIPTION:
99 pesa 1.109 # Sets up PATH and LD_LIBRARY_PATH.
100 caleb 1.1 qt4-build_pkg_setup() {
101 abcd 1.57 [[ ${EAPI} == 2 ]] && use !prefix && EPREFIX=
102    
103 yngwin 1.66 # Protect users by not allowing downgrades between releases
104     # Downgrading revisions within the same release should be allowed
105 pesa 1.100 if has_version '>'${CATEGORY}/${P}-r9999; then
106     if [[ -z ${I_KNOW_WHAT_I_AM_DOING} ]]; then
107 pesa 1.124 eerror
108 yngwin 1.66 eerror "Sanity check to keep you from breaking your system:"
109     eerror " Downgrading Qt is completely unsupported and will break your system!"
110 pesa 1.124 eerror
111 yngwin 1.66 die "aborting to save your system"
112     else
113     ewarn "Downgrading Qt is completely unsupported and will break your system!"
114     fi
115     fi
116 abcd 1.57
117 pesa 1.123 if [[ ${PN} == qt-webkit ]]; then
118 spatz 1.71 eshopts_push -s extglob
119 hwoarang 1.80 if is-flagq '-g?(gdb)?([1-9])'; then
120 spatz 1.71 echo
121 pesa 1.123 ewarn "You have enabled debug info (probably have -g or -ggdb in your CFLAGS/CXXFLAGS)."
122 spatz 1.71 ewarn "You may experience really long compilation times and/or increased memory usage."
123 pesa 1.123 ewarn "If compilation fails, please try removing -g/-ggdb before reporting a bug."
124 spatz 1.71 ewarn "For more info check out bug #307861"
125     echo
126     fi
127     eshopts_pop
128     fi
129    
130 abcd 1.55 PATH="${S}/bin${PATH:+:}${PATH}"
131 abcd 1.57 if [[ ${CHOST} != *-darwin* ]]; then
132     LD_LIBRARY_PATH="${S}/lib${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"
133     else
134     DYLD_LIBRARY_PATH="${S}/lib${DYLD_LIBRARY_PATH:+:}${DYLD_LIBRARY_PATH}"
135 yngwin 1.63 # On MacOS we *need* at least src/gui/kernel/qapplication_mac.mm for
136     # platform detection. Note: needs to come before any directories to
137     # avoid extract failure.
138     [[ ${CHOST} == *-apple-darwin* ]] && \
139 yngwin 1.66 QT4_EXTRACT_DIRECTORIES="src/gui/kernel/qapplication_mac.mm
140     ${QT4_EXTRACT_DIRECTORIES}"
141 abcd 1.57 fi
142 yngwin 1.20
143 abcd 1.55 if ! version_is_at_least 4.1 $(gcc-version); then
144 pesa 1.123 ewarn "Using a GCC version lower than 4.1 is not supported."
145 yngwin 1.20 fi
146 caleb 1.1 }
147    
148 hwoarang 1.34 # @ECLASS-VARIABLE: QT4_TARGET_DIRECTORIES
149     # @DESCRIPTION:
150 pesa 1.109 # Arguments for build_target_directories. Takes the directories in which the
151     # code should be compiled. This is a space-separated list.
152 hwoarang 1.34
153     # @ECLASS-VARIABLE: QT4_EXTRACT_DIRECTORIES
154     # @DESCRIPTION:
155 pesa 1.109 # Space-separated list including the directories that will be extracted from
156     # Qt tarball.
157 hwoarang 1.34
158     # @FUNCTION: qt4-build_src_unpack
159     # @DESCRIPTION:
160 pesa 1.109 # Unpacks the sources.
161 yngwin 1.20 qt4-build_src_unpack() {
162 hwoarang 1.42 setqtenv
163 pesa 1.112
164 pesa 1.124 case ${QT4_BUILD_TYPE} in
165     live)
166     git-2_src_unpack
167     ;;
168     release)
169     local tarball="${MY_P}.tar.gz" target= targets=
170     for target in configure LICENSE.GPL3 LICENSE.LGPL projects.pro \
171     src/{qbase,qt_targets,qt_install}.pri bin config.tests \
172     mkspecs qmake ${QT4_EXTRACT_DIRECTORIES}
173     do
174     targets+="${MY_P}/${target} "
175     done
176 ingmar 1.11
177 pesa 1.124 ebegin "Unpacking parts of ${tarball}:" ${targets//${MY_P}\/}
178     tar -xzf "${DISTDIR}/${tarball}" ${targets}
179     eend $? || die "failed to unpack"
180     ;;
181     esac
182 ingmar 1.11 }
183    
184 hwoarang 1.37 # @ECLASS-VARIABLE: PATCHES
185 pesa 1.110 # @DEFAULT_UNSET
186 hwoarang 1.37 # @DESCRIPTION:
187 pesa 1.110 # PATCHES array variable containing all various patches to be applied.
188     # This variable is expected to be defined in global scope of ebuild.
189     # Make sure to specify the full path. This variable is utilised in
190     # src_unpack/src_prepare phase, based on EAPI.
191 hwoarang 1.37 #
192 pesa 1.110 # @CODE
193     # PATCHES=( "${FILESDIR}/mypatch.patch"
194     # "${FILESDIR}/patches_folder/" )
195     # @CODE
196 hwoarang 1.34
197     # @FUNCTION: qt4-build_src_prepare
198     # @DESCRIPTION:
199     # Prepare the sources before the configure phase. Strip CFLAGS if necessary, and fix
200 pesa 1.109 # the build system in order to respect CFLAGS/CXXFLAGS/LDFLAGS specified in /etc/make.conf.
201 yngwin 1.20 qt4-build_src_prepare() {
202 hwoarang 1.42 setqtenv
203 pesa 1.124
204     if [[ ${QT4_BUILD_TYPE} == live ]]; then
205     QTDIR="." ./bin/syncqt || die "syncqt failed"
206     fi
207 vapier 1.94
208 pesa 1.123 if version_is_at_least 4.7; then
209 pesa 1.99 # fix libX11 dependency on non X packages
210 pesa 1.98 local nolibx11_pkgs="qt-core qt-dbus qt-script qt-sql qt-test qt-xmlpatterns"
211     has ${PN} ${nolibx11_pkgs} && qt_nolibx11
212 pesa 1.99
213     qt_assistant_cleanup
214 hwoarang 1.77 fi
215 wired 1.69
216 abcd 1.57 if use aqua; then
217     # provide a proper macx-g++-64
218     use x64-macos && ln -s macx-g++ mkspecs/$(qt_mkspecs_dir)
219    
220     sed -e '/^CONFIG/s:app_bundle::' \
221     -e '/^CONFIG/s:plugin_no_soname:plugin_with_soname absolute_library_soname:' \
222 pesa 1.109 -i mkspecs/$(qt_mkspecs_dir)/qmake.conf || die
223 abcd 1.57 fi
224    
225 ingmar 1.7 if [[ ${PN} != qt-core ]]; then
226 pesa 1.100 skip_qmake_build
227     skip_project_generation
228 ingmar 1.7 symlink_binaries_to_buildtree
229     fi
230 hwoarang 1.24
231 pesa 1.120 if [[ ${CHOST} == *86*-apple-darwin* ]]; then
232 pesa 1.124 # qmake bus errors with -O2 or -O3 but -O1 works
233     # Bug 373061
234     replace-flags -O[23] -O1
235 abcd 1.57 fi
236 jer 1.97
237 hwoarang 1.21 # Bug 178652
238 abcd 1.55 if [[ $(gcc-major-version) == 3 ]] && use amd64; then
239 hwoarang 1.21 ewarn "Appending -fno-gcse to CFLAGS/CXXFLAGS"
240     append-flags -fno-gcse
241 gengor 1.18 fi
242    
243 pesa 1.100 if use_if_iuse c++0x; then
244 pesa 1.123 echo
245 hwoarang 1.96 ewarn "You are about to build Qt4 using the C++11 standard. Even though"
246     ewarn "this is an official standard, some of the reverse dependencies"
247     ewarn "may fail to compile or link againt the Qt4 libraries. Before"
248     ewarn "reporting a bug, make sure your bug is reproducible with c++0x"
249     ewarn "disabled."
250 pesa 1.123 echo
251 hwoarang 1.96 append-flags -std=c++0x
252     fi
253 pesa 1.98
254 gengor 1.30 # Unsupported old gcc versions - hardened needs this :(
255 pesa 1.120 if [[ $(gcc-major-version) -lt 4 ]]; then
256 gengor 1.30 ewarn "Appending -fno-stack-protector to CXXFLAGS"
257     append-cxxflags -fno-stack-protector
258     # Bug 253127
259 gengor 1.29 sed -e "/^QMAKE_CFLAGS\t/ s:$: -fno-stack-protector-all:" \
260 pesa 1.109 -i mkspecs/common/g++.conf || die
261 gengor 1.29 fi
262    
263 ayoy 1.49 # Bug 261632
264     if use ppc64; then
265     ewarn "Appending -mminimal-toc to CFLAGS/CXXFLAGS"
266     append-flags -mminimal-toc
267     fi
268    
269 pesa 1.109 # Respect CC, CXX, {C,CXX,LD}FLAGS in .qmake.cache
270     sed -e "/^SYSTEM_VARIABLES=/i \
271     CC='$(tc-getCC)'\n\
272     CXX='$(tc-getCXX)'\n\
273     CFLAGS='${CFLAGS}'\n\
274     CXXFLAGS='${CXXFLAGS}'\n\
275     LDFLAGS='${LDFLAGS}'\n" \
276 pesa 1.114 -i configure \
277     || die "sed SYSTEM_VARIABLES failed"
278 pesa 1.98
279 pesa 1.113 # Respect CC, CXX, LINK and *FLAGS in config.tests
280     find config.tests/unix -name '*.test' -type f -print0 | xargs -0 \
281     sed -i -e "/bin\/qmake/ s: \"QT_BUILD_TREE=: \
282     'QMAKE_CC=$(tc-getCC)' 'QMAKE_CXX=$(tc-getCXX)' 'QMAKE_LINK=$(tc-getCXX)' \
283     'QMAKE_CFLAGS+=${CFLAGS}' 'QMAKE_CXXFLAGS+=${CXXFLAGS}' 'QMAKE_LFLAGS+=${LDFLAGS}'&:" \
284     || die "sed config.tests failed"
285 wired 1.67
286 pesa 1.128 if ! version_is_at_least 4.8; then
287     # Strip predefined CFLAGS from mkspecs (bugs 312689 and 352778)
288     sed -i -e '/^QMAKE_CFLAGS_RELEASE/s:+=.*:+=:' mkspecs/common/g++.conf || die
289     fi
290 pesa 1.114
291 hwoarang 1.24 # Bug 172219
292 pesa 1.113 sed -e 's:/X11R6/:/:' -i mkspecs/$(qt_mkspecs_dir)/qmake.conf || die
293 ingmar 1.7
294 wired 1.67 if [[ ${CHOST} == *-darwin* ]]; then
295 abcd 1.57 # Set FLAGS *and* remove -arch, since our gcc-apple is multilib
296     # crippled (by design) :/
297 pesa 1.124 local mac_gpp_conf=
298     if [[ -f mkspecs/common/mac-g++.conf ]]; then
299     # qt < 4.8 has mac-g++.conf
300     mac_gpp_conf="mkspecs/common/mac-g++.conf"
301     elif [[ -f mkspecs/common/g++-macx.conf ]]; then
302     # qt >= 4.8 has g++-macx.conf
303     mac_gpp_conf="mkspecs/common/g++-macx.conf"
304     else
305     die "no known conf file for mac found"
306     fi
307 pesa 1.114 sed \
308     -e "s:QMAKE_CFLAGS_RELEASE.*=.*:QMAKE_CFLAGS_RELEASE=${CFLAGS}:" \
309 abcd 1.57 -e "s:QMAKE_CXXFLAGS_RELEASE.*=.*:QMAKE_CXXFLAGS_RELEASE=${CXXFLAGS}:" \
310     -e "s:QMAKE_LFLAGS_RELEASE.*=.*:QMAKE_LFLAGS_RELEASE=-headerpad_max_install_names ${LDFLAGS}:" \
311     -e "s:-arch\s\w*::g" \
312 pesa 1.124 -i ${mac_gpp_conf} \
313     || die "sed ${mac_gpp_conf} failed"
314 abcd 1.57
315     # Fix configure's -arch settings that appear in qmake/Makefile and also
316     # fix arch handling (automagically duplicates our -arch arg and breaks
317     # pch). Additionally disable Xarch support.
318 pesa 1.124 local mac_gcc_confs="${mac_gpp_conf}"
319     if [[ -f mkspecs/common/gcc-base-macx.conf ]]; then
320     mac_gcc_confs+=" mkspecs/common/gcc-base-macx.conf"
321     fi
322 abcd 1.57 sed \
323     -e "s:-arch i386::" \
324     -e "s:-arch ppc::" \
325     -e "s:-arch x86_64::" \
326     -e "s:-arch ppc64::" \
327     -e "s:-arch \$i::" \
328     -e "/if \[ ! -z \"\$NATIVE_64_ARCH\" \]; then/,/fi/ d" \
329     -e "s:CFG_MAC_XARCH=yes:CFG_MAC_XARCH=no:g" \
330     -e "s:-Xarch_x86_64::g" \
331     -e "s:-Xarch_ppc64::g" \
332 pesa 1.124 -i configure ${mac_gcc_confs} \
333 pesa 1.114 || die "sed -arch/-Xarch failed"
334 abcd 1.57
335     # On Snow Leopard don't fall back to 10.5 deployment target.
336 pesa 1.120 if [[ ${CHOST} == *-apple-darwin10 ]]; then
337 abcd 1.57 sed -e "s:QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET.*:QMakeVar set QMAKE_MACOSX_DEPLOYMENT_TARGET 10.6:g" \
338     -e "s:-mmacosx-version-min=10.[0-9]:-mmacosx-version-min=10.6:g" \
339 pesa 1.124 -i configure ${mac_gpp_conf} \
340 pesa 1.114 || die "sed deployment target failed"
341 abcd 1.57 fi
342     fi
343    
344     # this one is needed for all systems with a separate -liconv, apart from
345     # Darwin, for which the sources already cater for -liconv
346 pesa 1.120 if use !elibc_glibc && [[ ${CHOST} != *-darwin* ]]; then
347 pesa 1.114 sed -e 's|mac:\(LIBS += -liconv\)|\1|g' \
348 abcd 1.57 -i config.tests/unix/iconv/iconv.pro \
349 pesa 1.114 || die "sed iconv.pro failed"
350 abcd 1.57 fi
351    
352     # we need some patches for Solaris
353 pesa 1.114 sed -i -e '/^QMAKE_LFLAGS_THREAD/a\QMAKE_LFLAGS_DYNAMIC_LIST = -Wl,--dynamic-list,' \
354 abcd 1.57 mkspecs/$(qt_mkspecs_dir)/qmake.conf || die
355     # use GCC over SunStudio
356     sed -i -e '/PLATFORM=solaris-cc/s/cc/g++/' configure || die
357 pesa 1.114 # do not flirt with non-Prefix stuff, we're quite possessive
358 abcd 1.57 sed -i -e '/^QMAKE_\(LIB\|INC\)DIR\(_X11\|_OPENGL\|\)\t/s/=.*$/=/' \
359     mkspecs/$(qt_mkspecs_dir)/qmake.conf || die
360 pesa 1.113
361 hwoarang 1.37 base_src_prepare
362 ingmar 1.7 }
363    
364 hwoarang 1.34 # @FUNCTION: qt4-build_src_configure
365     # @DESCRIPTION:
366     # Default configure phase
367 yngwin 1.20 qt4-build_src_configure() {
368 hwoarang 1.42 setqtenv
369 pesa 1.121
370     local conf="
371     -prefix ${QTPREFIXDIR}
372     -bindir ${QTBINDIR}
373     -libdir ${QTLIBDIR}
374     -docdir ${QTDOCDIR}
375     -headerdir ${QTHEADERDIR}
376     -plugindir ${QTPLUGINDIR}
377     $(version_is_at_least 4.7 && echo -importdir ${QTIMPORTDIR})
378     -datadir ${QTDATADIR}
379     -translationdir ${QTTRANSDIR}
380     -sysconfdir ${QTSYSCONFDIR}
381     -examplesdir ${QTEXAMPLESDIR}
382     -demosdir ${QTDEMOSDIR}
383     -opensource -confirm-license
384     -shared -fast -largefile -stl -verbose
385     -nomake examples -nomake demos"
386    
387     # ARCH is set on Gentoo. Qt now falls back to generic on an unsupported
388     # $(tc-arch). Therefore we convert it to supported values.
389     case "$(tc-arch)" in
390     amd64|x64-*) conf+=" -arch x86_64" ;;
391     ppc-macos) conf+=" -arch ppc" ;;
392     ppc|ppc64|ppc-*) conf+=" -arch powerpc" ;;
393     sparc|sparc-*|sparc64-*) conf+=" -arch sparc" ;;
394     x86-macos) conf+=" -arch x86" ;;
395     x86|x86-*) conf+=" -arch i386" ;;
396     alpha|arm|ia64|mips|s390) conf+=" -arch $(tc-arch)" ;;
397     hppa|sh) conf+=" -arch generic" ;;
398     *) die "$(tc-arch) is unsupported by this eclass. Please file a bug." ;;
399     esac
400    
401     conf+=" -platform $(qt_mkspecs_dir)"
402    
403     [[ $(get_libdir) != lib ]] && conf+=" -L${EPREFIX}/usr/$(get_libdir)"
404    
405     # debug/release
406     if use debug; then
407     conf+=" -debug"
408     else
409     conf+=" -release"
410     fi
411     conf+=" -no-separate-debug-info"
412    
413     # exceptions USE flag
414     conf+=" $(in_iuse exceptions && qt_use exceptions || echo -exceptions)"
415    
416     # disable RPATH on Qt >= 4.8 (bug 380415)
417     version_is_at_least 4.8 && conf+=" -no-rpath"
418    
419     # precompiled headers don't work on hardened, where the flag is masked
420     conf+=" $(qt_use pch)"
421    
422     # -reduce-relocations
423     # This flag seems to introduce major breakage to applications,
424     # mostly to be seen as a core dump with the message "QPixmap: Must
425     # construct a QApplication before a QPaintDevice" on Solaris.
426     # -- Daniel Vergien
427     [[ ${CHOST} != *-solaris* ]] && conf+=" -reduce-relocations"
428 ingmar 1.7
429 abcd 1.57 # this one is needed for all systems with a separate -liconv, apart from
430     # Darwin, for which the sources already cater for -liconv
431 pesa 1.120 if use !elibc_glibc && [[ ${CHOST} != *-darwin* ]]; then
432 pesa 1.121 conf+=" -liconv"
433 pesa 1.120 fi
434 abcd 1.57
435 pesa 1.98 if use_if_iuse glib; then
436 abcd 1.57 local glibflags="$(pkg-config --cflags --libs glib-2.0 gthread-2.0)"
437     # avoid the -pthread argument
438 pesa 1.121 conf+=" ${glibflags//-pthread}"
439 abcd 1.57 unset glibflags
440     fi
441    
442 pesa 1.98 if use_if_iuse qpa; then
443 pesa 1.123 echo
444 hwoarang 1.96 ewarn "The qpa useflag enables the Qt Platform Abstraction, formely"
445     ewarn "known as Qt Lighthouse. If you are not sure what that is, then"
446     ewarn "disable it before reporting any bugs related to this useflag."
447 pesa 1.123 echo
448 pesa 1.121 conf+=" -qpa"
449 hwoarang 1.96 fi
450    
451 pesa 1.120 if use aqua; then
452 abcd 1.57 # On (snow) leopard use the new (frameworked) cocoa code.
453 pesa 1.120 if [[ ${CHOST##*-darwin} -ge 9 ]]; then
454 pesa 1.121 conf+=" -cocoa -framework"
455 pesa 1.120 # We need the source's headers, not the installed ones.
456 pesa 1.121 conf+=" -I${S}/include"
457 pesa 1.120 # Add hint for the framework location.
458 pesa 1.121 conf+=" -F${QTLIBDIR}"
459 abcd 1.57
460     # We are crazy and build cocoa + qt3support :-)
461     if use qt3support; then
462     sed -e "/case \"\$PLATFORM,\$CFG_MAC_COCOA\" in/,/;;/ s|CFG_QT3SUPPORT=\"no\"|CFG_QT3SUPPORT=\"yes\"|" \
463 pesa 1.114 -i configure || die
464 abcd 1.57 fi
465 pesa 1.120 else
466 pesa 1.121 conf+=" -no-framework"
467 abcd 1.57 fi
468     else
469 pesa 1.121 # freetype2 include dir is non-standard, thus pass it to configure
470     conf+=" $(pkg-config --cflags-only-I freetype2)"
471 abcd 1.57 fi
472    
473 pesa 1.121 conf+=" ${myconf}"
474     myconf=
475    
476     echo ./configure ${conf}
477     ./configure ${conf} || die "./configure failed"
478 wired 1.90
479     prepare_directories ${QT4_TARGET_DIRECTORIES}
480 yngwin 1.20 }
481 ingmar 1.7
482 hwoarang 1.34 # @FUNCTION: qt4-build_src_compile
483 vapier 1.93 # @DESCRIPTION:
484     # Actual compile phase
485 yngwin 1.20 qt4-build_src_compile() {
486 hwoarang 1.42 setqtenv
487 yngwin 1.20
488 abcd 1.55 build_directories ${QT4_TARGET_DIRECTORIES}
489 caleb 1.1 }
490    
491 ayoy 1.76 # @FUNCTION: qt4-build_src_test
492     # @DESCRIPTION:
493     # Runs tests only in target directories.
494     qt4-build_src_test() {
495 pesa 1.118 # QtMultimedia does not have any test suite (bug #332299)
496 pesa 1.123 [[ ${PN} == qt-multimedia ]] && return
497 pesa 1.118
498 ayoy 1.76 for dir in ${QT4_TARGET_DIRECTORIES}; do
499     emake -j1 check -C ${dir}
500     done
501     }
502    
503 abcd 1.57 # @FUNCTION: fix_includes
504     # @DESCRIPTION:
505 pesa 1.109 # For MacOS X we need to add some symlinks when frameworks are
506 abcd 1.57 # being used, to avoid complications with some more or less stupid packages.
507     fix_includes() {
508 pesa 1.120 if use aqua && [[ ${CHOST##*-darwin} -ge 9 ]]; then
509 grobian 1.126 local frw dest f h rdir
510 abcd 1.57 # Some packages tend to include <Qt/...>
511     dodir "${QTHEADERDIR#${EPREFIX}}"/Qt
512    
513 grobian 1.126 # Fake normal headers when frameworks are installed... eases life later
514     # on, make sure we use relative links though, as some ebuilds assume
515     # these dirs exist in src_install to add additional files
516     f=${QTHEADERDIR}
517     h=${QTLIBDIR}
518     while [[ -n ${f} && ${f%%/*} == ${h%%/*} ]] ; do
519     f=${f#*/}
520     h=${h#*/}
521     done
522     rdir=${h}
523     f="../"
524     while [[ ${h} == */* ]] ; do
525     f="${f}../"
526     h=${h#*/}
527     done
528     rdir="${f}${rdir}"
529    
530 abcd 1.57 for frw in "${D}${QTLIBDIR}"/*.framework; do
531     [[ -e "${frw}"/Headers ]] || continue
532     f=$(basename ${frw})
533     dest="${QTHEADERDIR#${EPREFIX}}"/${f%.framework}
534 grobian 1.126 dosym "${rdir}"/${f}/Headers "${dest}"
535 abcd 1.57
536     # Link normal headers as well.
537     for hdr in "${D}/${QTLIBDIR}/${f}"/Headers/*; do
538     h=$(basename ${hdr})
539 grobian 1.126 dosym "../${rdir}"/${f}/Headers/${h} \
540     "${QTHEADERDIR#${EPREFIX}}"/Qt/${h}
541 abcd 1.57 done
542     done
543     fi
544     }
545    
546 hwoarang 1.34 # @FUNCTION: qt4-build_src_install
547     # @DESCRIPTION:
548     # Perform the actual installation including some library fixes.
549 caleb 1.4 qt4-build_src_install() {
550 abcd 1.57 [[ ${EAPI} == 2 ]] && use !prefix && ED=${D}
551 hwoarang 1.42 setqtenv
552 pesa 1.98
553 abcd 1.55 install_directories ${QT4_TARGET_DIRECTORIES}
554 ingmar 1.7 install_qconfigs
555 caleb 1.4 fix_library_files
556 abcd 1.57 fix_includes
557 pesa 1.98
558 hwoarang 1.78 # remove .la files since we are building only shared Qt libraries
559 pesa 1.114 find "${D}"${QTLIBDIR} -type f -name '*.la' -print0 | xargs -0 rm -f
560 caleb 1.4 }
561    
562 hwoarang 1.42 # @FUNCTION: setqtenv
563 pesa 1.110 # @INTERNAL
564 hwoarang 1.42 setqtenv() {
565     # Set up installation directories
566 abcd 1.57 QTPREFIXDIR=${EPREFIX}/usr
567     QTBINDIR=${EPREFIX}/usr/bin
568     QTLIBDIR=${EPREFIX}/usr/$(get_libdir)/qt4
569     QTPCDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig
570     QTDOCDIR=${EPREFIX}/usr/share/doc/qt-${PV}
571     QTHEADERDIR=${EPREFIX}/usr/include/qt4
572 hwoarang 1.42 QTPLUGINDIR=${QTLIBDIR}/plugins
573 abcd 1.104 QTIMPORTDIR=${QTLIBDIR}/imports
574 pesa 1.109 QTDATADIR=${EPREFIX}/usr/share/qt4
575     QTTRANSDIR=${QTDATADIR}/translations
576 abcd 1.57 QTSYSCONFDIR=${EPREFIX}/etc/qt4
577 hwoarang 1.42 QTEXAMPLESDIR=${QTDATADIR}/examples
578     QTDEMOSDIR=${QTDATADIR}/demos
579 pesa 1.109 QMAKE_LIBDIR_QT=${QTLIBDIR}
580 abcd 1.57 QT_INSTALL_PREFIX=${EPREFIX}/usr/$(get_libdir)/qt4
581 pesa 1.109
582 hwoarang 1.42 PLATFORM=$(qt_mkspecs_dir)
583 pesa 1.129 unset QMAKESPEC
584 hwoarang 1.42
585 pesa 1.129 export XDG_CONFIG_HOME="${T}"
586 hwoarang 1.42 }
587    
588 wired 1.90 # @FUNCTION: prepare_directories
589 hwoarang 1.34 # @USAGE: < directories >
590 pesa 1.110 # @INTERNAL
591 hwoarang 1.34 # @DESCRIPTION:
592 pesa 1.109 # Generates Makefiles for the given list of directories.
593 wired 1.90 prepare_directories() {
594 abcd 1.55 for x in "$@"; do
595 pesa 1.109 pushd "${S}"/${x} >/dev/null || die
596 pesa 1.98 einfo "Running qmake in: ${x}"
597 abcd 1.60 # avoid running over the maximum argument number, bug #299810
598     {
599     echo "${S}"/mkspecs/common/*.conf
600     find "${S}" -name '*.pr[io]'
601 abcd 1.104 } | xargs sed -i \
602     -e "s:\$\$\[QT_INSTALL_LIBS\]:${QTLIBDIR}:g" \
603     -e "s:\$\$\[QT_INSTALL_PLUGINS\]:${QTPLUGINDIR}:g" \
604     || die
605 ingmar 1.7 "${S}"/bin/qmake "LIBS+=-L${QTLIBDIR}" "CONFIG+=nostrip" || die "qmake failed"
606 pesa 1.109 popd >/dev/null || die
607 wired 1.90 done
608     }
609    
610    
611     # @FUNCTION: build_directories
612     # @USAGE: < directories >
613 pesa 1.110 # @INTERNAL
614 wired 1.90 # @DESCRIPTION:
615 pesa 1.109 # Compiles the code in the given list of directories.
616 wired 1.90 build_directories() {
617     for x in "$@"; do
618 pesa 1.109 pushd "${S}"/${x} >/dev/null || die
619 wired 1.67 emake CC="$(tc-getCC)" \
620     CXX="$(tc-getCXX)" \
621     LINK="$(tc-getCXX)" || die "emake failed"
622 pesa 1.109 popd >/dev/null || die
623 caleb 1.1 done
624     }
625    
626 hwoarang 1.34 # @FUNCTION: install_directories
627     # @USAGE: < directories >
628 pesa 1.110 # @INTERNAL
629 hwoarang 1.34 # @DESCRIPTION:
630 pesa 1.109 # Runs emake install in the given directories, which are separated by spaces.
631 caleb 1.1 install_directories() {
632 abcd 1.55 for x in "$@"; do
633 pesa 1.109 pushd "${S}"/${x} >/dev/null || die
634 ingmar 1.7 emake INSTALL_ROOT="${D}" install || die "emake install failed"
635 pesa 1.109 popd >/dev/null || die
636 caleb 1.1 done
637     }
638    
639 ingmar 1.7 # @ECLASS-VARIABLE: QCONFIG_ADD
640     # @DESCRIPTION:
641     # List options that need to be added to QT_CONFIG in qconfig.pri
642 abcd 1.55 : ${QCONFIG_ADD:=}
643 ingmar 1.7
644     # @ECLASS-VARIABLE: QCONFIG_REMOVE
645     # @DESCRIPTION:
646     # List options that need to be removed from QT_CONFIG in qconfig.pri
647 abcd 1.55 : ${QCONFIG_REMOVE:=}
648 ingmar 1.7
649     # @ECLASS-VARIABLE: QCONFIG_DEFINE
650     # @DESCRIPTION:
651     # List variables that should be defined at the top of QtCore/qconfig.h
652 abcd 1.55 : ${QCONFIG_DEFINE:=}
653 ingmar 1.7
654 hwoarang 1.34 # @FUNCTION: install_qconfigs
655 pesa 1.110 # @INTERNAL
656 vapier 1.93 # @DESCRIPTION:
657 pesa 1.109 # Install gentoo-specific mkspecs configurations.
658 ingmar 1.7 install_qconfigs() {
659 zlin 1.9 local x
660     if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} ]]; then
661 ingmar 1.7 for x in QCONFIG_ADD QCONFIG_REMOVE; do
662     [[ -n ${!x} ]] && echo ${x}=${!x} >> "${T}"/${PN}-qconfig.pri
663     done
664 abcd 1.57 insinto ${QTDATADIR#${EPREFIX}}/mkspecs/gentoo
665 ingmar 1.7 doins "${T}"/${PN}-qconfig.pri || die "installing ${PN}-qconfig.pri failed"
666 zlin 1.9 fi
667 ingmar 1.7
668 zlin 1.9 if [[ -n ${QCONFIG_DEFINE} ]]; then
669 ingmar 1.7 for x in ${QCONFIG_DEFINE}; do
670     echo "#define ${x}" >> "${T}"/gentoo-${PN}-qconfig.h
671     done
672 abcd 1.57 insinto ${QTHEADERDIR#${EPREFIX}}/Gentoo
673 ingmar 1.7 doins "${T}"/gentoo-${PN}-qconfig.h || die "installing ${PN}-qconfig.h failed"
674     fi
675     }
676    
677 hwoarang 1.34 # @FUNCTION: generate_qconfigs
678 pesa 1.110 # @INTERNAL
679 vapier 1.93 # @DESCRIPTION:
680 pesa 1.109 # Generates gentoo-specific qconfig.{h,pri}.
681 ingmar 1.7 generate_qconfigs() {
682 pesa 1.123 if [[ -n ${QCONFIG_ADD} || -n ${QCONFIG_REMOVE} || -n ${QCONFIG_DEFINE} || ${PN} == qt-core ]]; then
683 ingmar 1.7 local x qconfig_add qconfig_remove qconfig_new
684     for x in "${ROOT}${QTDATADIR}"/mkspecs/gentoo/*-qconfig.pri; do
685     [[ -f ${x} ]] || continue
686 abcd 1.55 qconfig_add+=" $(sed -n 's/^QCONFIG_ADD=//p' "${x}")"
687     qconfig_remove+=" $(sed -n 's/^QCONFIG_REMOVE=//p' "${x}")"
688 ingmar 1.7 done
689    
690     # these error checks do not use die because dying in pkg_post{inst,rm}
691     # just makes things worse.
692     if [[ -e "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri ]]; then
693     # start with the qconfig.pri that qt-core installed
694     if ! cp "${ROOT}${QTDATADIR}"/mkspecs/gentoo/qconfig.pri \
695     "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri; then
696     eerror "cp qconfig failed."
697     return 1
698     fi
699    
700     # generate list of QT_CONFIG entries from the existing list
701     # including qconfig_add and excluding qconfig_remove
702     for x in $(sed -n 's/^QT_CONFIG +=//p' \
703     "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri) ${qconfig_add}; do
704 ssuominen 1.91 has ${x} ${qconfig_remove} || qconfig_new+=" ${x}"
705 ingmar 1.7 done
706    
707     # replace the existing QT_CONFIG list with qconfig_new
708     if ! sed -i -e "s/QT_CONFIG +=.*/QT_CONFIG += ${qconfig_new}/" \
709     "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri; then
710     eerror "Sed for QT_CONFIG failed"
711     return 1
712     fi
713    
714     # create Gentoo/qconfig.h
715     if [[ ! -e ${ROOT}${QTHEADERDIR}/Gentoo ]]; then
716     if ! mkdir -p "${ROOT}${QTHEADERDIR}"/Gentoo; then
717     eerror "mkdir ${QTHEADERDIR}/Gentoo failed"
718     return 1
719     fi
720     fi
721     : > "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h
722     for x in "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-*-qconfig.h; do
723     [[ -f ${x} ]] || continue
724     cat "${x}" >> "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h
725     done
726     else
727     rm -f "${ROOT}${QTDATADIR}"/mkspecs/qconfig.pri
728     rm -f "${ROOT}${QTHEADERDIR}"/Gentoo/gentoo-qconfig.h
729     rmdir "${ROOT}${QTDATADIR}"/mkspecs \
730     "${ROOT}${QTDATADIR}" \
731     "${ROOT}${QTHEADERDIR}"/Gentoo \
732     "${ROOT}${QTHEADERDIR}" 2>/dev/null
733     fi
734     fi
735     }
736    
737 hwoarang 1.34 # @FUNCTION: qt4-build_pkg_postrm
738 vapier 1.93 # @DESCRIPTION:
739 pesa 1.109 # Regenerate configuration when the package is completely removed.
740 ingmar 1.7 qt4-build_pkg_postrm() {
741     generate_qconfigs
742 caleb 1.1 }
743    
744 hwoarang 1.34 # @FUNCTION: qt4-build_pkg_postinst
745 vapier 1.93 # @DESCRIPTION:
746 pesa 1.109 # Regenerate configuration, plus throw a message about possible
747 hwoarang 1.34 # breakages and proposed solutions.
748 ingmar 1.7 qt4-build_pkg_postinst() {
749     generate_qconfigs
750 caleb 1.1 }
751    
752 pesa 1.100 # @FUNCTION: skip_qmake_build
753 pesa 1.110 # @INTERNAL
754 hwoarang 1.34 # @DESCRIPTION:
755 pesa 1.109 # Patches configure to skip qmake compilation, as it's already installed by qt-core.
756 pesa 1.100 skip_qmake_build() {
757 pesa 1.109 sed -i -e "s:if true:if false:g" "${S}"/configure || die
758 caleb 1.1 }
759    
760 pesa 1.100 # @FUNCTION: skip_project_generation
761 pesa 1.110 # @INTERNAL
762 hwoarang 1.34 # @DESCRIPTION:
763 pesa 1.109 # Exit the script early by throwing in an exit before all of the .pro files are scanned.
764 pesa 1.100 skip_project_generation() {
765 pesa 1.109 sed -i -e "s:echo \"Finding:exit 0\n\necho \"Finding:g" "${S}"/configure || die
766 caleb 1.1 }
767    
768 hwoarang 1.34 # @FUNCTION: symlink_binaries_to_buildtree
769 pesa 1.110 # @INTERNAL
770 hwoarang 1.34 # @DESCRIPTION:
771 pesa 1.109 # Symlinks generated binaries to buildtree, so they can be used during compilation time.
772 ingmar 1.7 symlink_binaries_to_buildtree() {
773     for bin in qmake moc uic rcc; do
774 pesa 1.100 ln -s "${QTBINDIR}"/${bin} "${S}"/bin/ || die "symlinking ${bin} to ${S}/bin failed"
775 ingmar 1.7 done
776 caleb 1.1 }
777    
778 hwoarang 1.34 # @FUNCTION: fix_library_files
779 pesa 1.110 # @INTERNAL
780 hwoarang 1.34 # @DESCRIPTION:
781 pesa 1.109 # Fixes the paths in *.la, *.prl, *.pc, as they are wrong due to sandbox and
782     # moves the *.pc files into the pkgconfig directory.
783 caleb 1.1 fix_library_files() {
784 pesa 1.109 local libfile
785 ingmar 1.7 for libfile in "${D}"/${QTLIBDIR}/{*.la,*.prl,pkgconfig/*.pc}; do
786     if [[ -e ${libfile} ]]; then
787 pesa 1.98 sed -i -e "s:${S}/lib:${QTLIBDIR}:g" ${libfile} || die "sed on ${libfile} failed"
788 ingmar 1.7 fi
789     done
790 caleb 1.1
791 pesa 1.109 # pkgconfig files refer to WORKDIR/bin as the moc and uic locations
792 ingmar 1.7 for libfile in "${D}"/${QTLIBDIR}/pkgconfig/*.pc; do
793     if [[ -e ${libfile} ]]; then
794 pesa 1.109 sed -i -e "s:${S}/bin:${QTBINDIR}:g" ${libfile} || die "sed on ${libfile} failed"
795 caleb 1.1
796 abcd 1.55 # Move .pc files into the pkgconfig directory
797 abcd 1.57 dodir ${QTPCDIR#${EPREFIX}}
798 pesa 1.109 mv ${libfile} "${D}"/${QTPCDIR}/ || die "moving ${libfile} to ${D}/${QTPCDIR}/ failed"
799 ingmar 1.7 fi
800     done
801    
802     # Don't install an empty directory
803     rmdir "${D}"/${QTLIBDIR}/pkgconfig
804 caleb 1.1 }
805    
806 hwoarang 1.34 # @FUNCTION: qt_use
807     # @USAGE: < flag > [ feature ] [ enableval ]
808 yngwin 1.39 # @DESCRIPTION:
809 pesa 1.111 # This will echo "-${enableval}-${feature}" if <flag> is enabled, or
810     # "-no-${feature}" if it's disabled. If [feature] is not specified, <flag>
811 hwoarang 1.34 # will be used for that. If [enableval] is not specified, it omits the
812 pesa 1.111 # "-${enableval}" part.
813 caleb 1.1 qt_use() {
814 pesa 1.111 use "$1" && echo "${3:+-$3}-${2:-$1}" || echo "-no-${2:-$1}"
815 ingmar 1.7 }
816    
817 hwoarang 1.34 # @FUNCTION: qt_mkspecs_dir
818     # @RETURN: the specs-directory w/o path
819 yngwin 1.39 # @DESCRIPTION:
820 hwoarang 1.34 # Allows us to define which mkspecs dir we want to use.
821 caleb 1.1 qt_mkspecs_dir() {
822 pesa 1.109 local spec=
823 pesa 1.122
824     case "${CHOST}" in
825 caleb 1.5 *-freebsd*|*-dragonfly*)
826 abcd 1.55 spec=freebsd ;;
827 caleb 1.5 *-openbsd*)
828 abcd 1.55 spec=openbsd ;;
829 caleb 1.5 *-netbsd*)
830 abcd 1.55 spec=netbsd ;;
831 ingmar 1.7 *-darwin*)
832 abcd 1.57 if use aqua; then
833     # mac with carbon/cocoa
834     spec=macx
835     else
836     # darwin/mac with x11
837     spec=darwin
838     fi
839     ;;
840     *-solaris*)
841     spec=solaris ;;
842 caleb 1.5 *-linux-*|*-linux)
843 abcd 1.55 spec=linux ;;
844 caleb 1.5 *)
845 pesa 1.122 die "${FUNCNAME}(): Unknown CHOST '${CHOST}'" ;;
846 caleb 1.5 esac
847    
848 pesa 1.122 case "$(tc-getCXX)" in
849     *g++*)
850     spec+=-g++ ;;
851     *icpc*)
852     spec+=-icc ;;
853     *)
854     die "${FUNCNAME}(): Unknown compiler '$(tc-getCXX)'" ;;
855     esac
856 caleb 1.1
857 abcd 1.57 # Add -64 for 64bit profiles
858     if use x64-freebsd ||
859     use amd64-linux ||
860     use x64-macos ||
861     use x64-solaris ||
862     use sparc64-solaris
863     then
864     spec+=-64
865     fi
866    
867 caleb 1.5 echo "${spec}"
868 caleb 1.1 }
869    
870 hwoarang 1.77 # @FUNCTION: qt_assistant_cleanup
871 pesa 1.110 # @INTERNAL
872 hwoarang 1.77 # @DESCRIPTION:
873 pesa 1.99 # Tries to clean up tools.pro for qt-assistant ebuilds.
874     # Meant to be called in src_prepare().
875     # Since Qt 4.7.4 this function is a no-op.
876 hwoarang 1.77 qt_assistant_cleanup() {
877 pesa 1.99 # apply patching to qt-assistant ebuilds only
878 pesa 1.123 [[ ${PN} != qt-assistant ]] && return
879 pesa 1.99
880     # no longer needed for 4.7.4 and later
881 pesa 1.123 version_is_at_least 4.7.4 && return
882 pesa 1.99
883 hwoarang 1.77 # different versions (and branches...) may need different handling,
884     # add a case if you need special handling
885     case "${MY_PV_EXTRA}" in
886     *kde-qt*)
887     sed -e "/^[ \t]*porting/,/^[ \t]*win32.*activeqt$/d" \
888     -e "/mac/,/^embedded.*makeqpf$/d" \
889     -i tools/tools.pro || die "patching tools.pro failed"
890     ;;
891     *)
892     sed -e "/^[ \t]*porting/,/^[ \t]*win32.*activeqt$/d" \
893     -e "/mac/,/^embedded.*makeqpf$/d" \
894     -e "s/^\([ \t]*pixeltool\) /\1 qdoc3 /" \
895     -i tools/tools.pro || die "patching tools.pro failed"
896     ;;
897     esac
898     }
899    
900     # @FUNCTION: qt_nolibx11
901 pesa 1.110 # @INTERNAL
902 hwoarang 1.77 # @DESCRIPTION:
903 pesa 1.109 # Ignore X11 tests for packages that don't need X libraries installed.
904 hwoarang 1.77 qt_nolibx11() {
905     sed -i "/unixtests\/compile.test.*config.tests\/x11\/xlib/,/fi$/d" "${S}"/configure ||
906     die "x11 check sed failed"
907     }
908    
909 ayoy 1.76 EXPORT_FUNCTIONS pkg_setup src_unpack src_prepare src_configure src_compile src_install src_test pkg_postrm pkg_postinst

  ViewVC Help
Powered by ViewVC 1.1.20