| 1 | # Copyright 1999-2011 Gentoo Foundation |
1 | # Copyright 1999-2012 Gentoo Foundation |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/qt4-r2.eclass,v 1.12 2011/08/22 04:46:32 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/qt4-r2.eclass,v 1.19 2012/02/13 01:31:50 pesa Exp $ |
| 4 | |
4 | |
| 5 | # @ECLASS: qt4-r2.eclass |
5 | # @ECLASS: qt4-r2.eclass |
| 6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
| 7 | # Ben de Groot <yngwin@gentoo.org>, |
7 | # Qt herd <qt@gentoo.org> |
| 8 | # Markos Chandras <hwoarang@gentoo.org>, |
|
|
| 9 | # Davide Pesavento <davidepesa@gmail.com>, |
|
|
| 10 | # Dominik Kapusta <ayoy@gentoo.org> |
|
|
| 11 | # @BLURB: Eclass for Qt4 packages, second edition |
8 | # @BLURB: Eclass for Qt4-based packages, second edition. |
| 12 | # @DESCRIPTION: |
9 | # @DESCRIPTION: |
| 13 | # This eclass contains various functions that may be useful when |
10 | # This eclass contains various functions that may be useful when |
| 14 | # dealing with packages using Qt4 libraries. Requires EAPI=2. |
11 | # dealing with packages using Qt4 libraries. Requires EAPI=2 or later. |
| 15 | |
12 | |
| 16 | case ${EAPI} in |
13 | case ${EAPI} in |
| 17 | 2|3|4) : ;; |
14 | 2|3|4) : ;; |
| 18 | *) die "EAPI=${EAPI} is not supported" ;; |
15 | *) die "EAPI=${EAPI} is not supported by ${ECLASS} eclass." ;; |
| 19 | esac |
16 | esac |
| 20 | |
17 | |
| 21 | inherit base eutils multilib toolchain-funcs |
18 | inherit base eutils multilib toolchain-funcs |
| 22 | |
19 | |
| 23 | export XDG_CONFIG_HOME="${T}" |
20 | export XDG_CONFIG_HOME="${T}" |
| 24 | |
21 | |
| 25 | # @ECLASS-VARIABLE: LANGS |
22 | # @ECLASS-VARIABLE: LANGS |
|
|
23 | # @DEFAULT_UNSET |
| 26 | # @DESCRIPTION: |
24 | # @DESCRIPTION: |
| 27 | # In case your Qt4 application provides various translations, use this variable |
25 | # In case your Qt4 application provides various translations, use this variable |
| 28 | # to specify them in order to populate "linguas_*" IUSE automatically. Make sure |
26 | # to specify them in order to populate "linguas_*" IUSE automatically. Make sure |
| 29 | # that you set this variable BEFORE inheriting qt4-r2 eclass. |
27 | # that you set this variable before inheriting qt4-r2 eclass. |
|
|
28 | # Example: |
|
|
29 | # @CODE |
| 30 | # example: LANGS="en el de" |
30 | # LANGS="en el de" |
|
|
31 | # @CODE |
| 31 | for x in ${LANGS}; do |
32 | for x in ${LANGS}; do |
| 32 | IUSE="${IUSE} linguas_${x}" |
33 | IUSE+=" linguas_${x}" |
| 33 | done |
34 | done |
| 34 | |
35 | |
| 35 | # @ECLASS-VARIABLE: LANGSLONG |
36 | # @ECLASS-VARIABLE: LANGSLONG |
|
|
37 | # @DEFAULT_UNSET |
| 36 | # @DESCRIPTION: |
38 | # @DESCRIPTION: |
| 37 | # Same as above, but this variable is for LINGUAS that must be in long format. |
39 | # Same as above, but this variable is for LINGUAS that must be in long format. |
| 38 | # Remember to set this variable BEFORE inheriting qt4-r2 eclass. |
40 | # Remember to set this variable before inheriting qt4-r2 eclass. |
| 39 | # Look at ${PORTDIR}/profiles/desc/linguas.desc for details. |
41 | # Look at ${PORTDIR}/profiles/desc/linguas.desc for details. |
| 40 | for x in ${LANGSLONG}; do |
42 | for x in ${LANGSLONG}; do |
| 41 | IUSE="${IUSE} linguas_${x%_*}" |
43 | IUSE+=" linguas_${x%_*}" |
| 42 | done |
44 | done |
|
|
45 | unset x |
| 43 | |
46 | |
| 44 | # @FUNCTION: qt4-r2_src_unpack |
47 | # @FUNCTION: qt4-r2_src_unpack |
| 45 | # @DESCRIPTION: |
48 | # @DESCRIPTION: |
| 46 | # Default src_unpack function for packages that depend on qt4. If you have to |
49 | # Default src_unpack function for packages that depend on qt4. If you have to |
| 47 | # override src_unpack in your ebuild (probably you don't need to), call |
50 | # override src_unpack in your ebuild (probably you don't need to), call |
| 48 | # qt4-r2_src_unpack in it. |
51 | # qt4-r2_src_unpack in it. |
| 49 | qt4-r2_src_unpack() { |
52 | qt4-r2_src_unpack() { |
| 50 | debug-print-function $FUNCNAME "$@" |
53 | debug-print-function $FUNCNAME "$@" |
|
|
54 | |
| 51 | base_src_unpack "$@" |
55 | base_src_unpack "$@" |
| 52 | |
|
|
| 53 | # Fallback to ${WORKDIR}/${MY_P} when ${WORKDIR}/${P} doesn't exist. |
|
|
| 54 | # Feel free to re-implement this |
|
|
| 55 | if [[ "${S}" == "${WORKDIR}/${P}" && ! -d ${S} && -d ${WORKDIR}/${MY_P} ]]; then |
|
|
| 56 | ewarn "Falling back to '${WORKDIR}/${MY_P}'" |
|
|
| 57 | S="${WORKDIR}/${MY_P}" |
|
|
| 58 | fi |
|
|
| 59 | } |
56 | } |
| 60 | |
57 | |
| 61 | # @ECLASS-VARIABLE: PATCHES |
58 | # @ECLASS-VARIABLE: PATCHES |
|
|
59 | # @DEFAULT_UNSET |
| 62 | # @DESCRIPTION: |
60 | # @DESCRIPTION: |
| 63 | # In case you have patches to apply, specify them in PATCHES variable. Make sure |
61 | # In case you have patches to apply, specify them here. Make sure to |
| 64 | # to specify the full path. This variable is used in src_prepare phase. |
62 | # specify the full path. This variable is used in src_prepare phase. |
| 65 | # example: |
63 | # Example: |
|
|
64 | # @CODE |
| 66 | # PATCHES=( "${FILESDIR}"/mypatch.patch |
65 | # PATCHES=( "${FILESDIR}"/mypatch.patch |
| 67 | # "${FILESDIR}"/mypatch2.patch ) |
66 | # "${FILESDIR}"/mypatch2.patch ) |
|
|
67 | # @CODE |
| 68 | |
68 | |
| 69 | # @FUNCTION: qt4-r2_src_prepare |
69 | # @FUNCTION: qt4-r2_src_prepare |
| 70 | # @DESCRIPTION: |
70 | # @DESCRIPTION: |
| 71 | # Default src_prepare function for packages that depend on qt4. If you have to |
71 | # Default src_prepare function for packages that depend on qt4. If you have to |
| 72 | # override src_prepare in your ebuild, you should call qt4-r2_src_prepare in it, |
72 | # override src_prepare in your ebuild, you should call qt4-r2_src_prepare in it, |
| … | |
… | |
| 82 | # Default src_configure function for packages that depend on qt4. If you have to |
82 | # Default src_configure function for packages that depend on qt4. If you have to |
| 83 | # override src_configure in your ebuild, call qt4-r2_src_configure in it. |
83 | # override src_configure in your ebuild, call qt4-r2_src_configure in it. |
| 84 | qt4-r2_src_configure() { |
84 | qt4-r2_src_configure() { |
| 85 | debug-print-function $FUNCNAME "$@" |
85 | debug-print-function $FUNCNAME "$@" |
| 86 | |
86 | |
| 87 | local project_file="$(_find_project_file)" |
87 | local project_file=$(_find_project_file) |
| 88 | |
88 | |
| 89 | if [[ -n ${project_file} ]]; then |
89 | if [[ -n ${project_file} ]]; then |
| 90 | eqmake4 ${project_file} |
90 | eqmake4 "${project_file}" |
| 91 | else |
91 | else |
| 92 | base_src_configure "$@" |
92 | base_src_configure "$@" |
| 93 | fi |
93 | fi |
| 94 | } |
94 | } |
| 95 | |
95 | |
| … | |
… | |
| 103 | |
103 | |
| 104 | base_src_compile "$@" |
104 | base_src_compile "$@" |
| 105 | } |
105 | } |
| 106 | |
106 | |
| 107 | # @ECLASS-VARIABLE: DOCS |
107 | # @ECLASS-VARIABLE: DOCS |
|
|
108 | # @DEFAULT_UNSET |
| 108 | # @DESCRIPTION: |
109 | # @DESCRIPTION: |
| 109 | # Use this variable if you want to install any documentation. |
110 | # Use this variable if you want to install any documentation. |
|
|
111 | # Example: |
|
|
112 | # @CODE |
| 110 | # example: DOCS="README AUTHORS" |
113 | # DOCS="README AUTHORS" |
|
|
114 | # @CODE |
| 111 | |
115 | |
| 112 | # @ECLASS-VARIABLE: DOCSDIR |
116 | # @ECLASS-VARIABLE: DOCSDIR |
| 113 | # @DESCRIPTION: |
117 | # @DESCRIPTION: |
| 114 | # Directory containing documentation. If not specified, ${S} will be used |
118 | # Directory containing documentation, defaults to ${S}. |
| 115 | # instead. |
|
|
| 116 | |
119 | |
| 117 | # @FUNCTION: qt4-r2_src_install |
120 | # @FUNCTION: qt4-r2_src_install |
| 118 | # @DESCRIPTION: |
121 | # @DESCRIPTION: |
| 119 | # Default src_install function for qt4-based packages. Installs compiled code, |
122 | # Default src_install function for qt4-based packages. Installs compiled code |
| 120 | # documentation (via DOCS variable) and translations (via LANGS and |
123 | # and misc documentation (via DOCS variable). |
| 121 | # LANGSLONG variables). |
|
|
| 122 | qt4-r2_src_install() { |
124 | qt4-r2_src_install() { |
| 123 | debug-print-function $FUNCNAME "$@" |
125 | debug-print-function $FUNCNAME "$@" |
| 124 | |
126 | |
| 125 | emake INSTALL_ROOT="${D}" DESTDIR="${D}" install || die "emake install failed" |
127 | emake INSTALL_ROOT="${D}" DESTDIR="${D}" install || die "emake install failed" |
| 126 | |
128 | |
| 127 | # install documentation |
129 | # install documentation |
| 128 | if [[ -n "${DOCS}" ]]; then |
|
|
| 129 | local dir=${DOCSDIR:-${S}} |
130 | local doc= dir=${DOCSDIR:-${S}} |
| 130 | for doc in ${DOCS}; do |
131 | for doc in ${DOCS}; do |
| 131 | dodoc "${dir}/${doc}" || die "dodoc failed" |
132 | dodoc "${dir}/${doc}" || die "dodoc failed" |
| 132 | done |
133 | done |
| 133 | fi |
|
|
| 134 | } |
134 | } |
| 135 | |
135 | |
| 136 | # Internal function, used by eqmake4 and qt4-r2_src_configure |
136 | # Internal function, used by eqmake4 and qt4-r2_src_configure |
| 137 | # Look for project files: |
137 | # Look for project files: |
| 138 | # 0 *.pro files found - output null string |
138 | # 0 *.pro files found - output null string |
| … | |
… | |
| 140 | # 2 or more *.pro files found - if ${PN}.pro or $(basename ${S}).pro |
140 | # 2 or more *.pro files found - if ${PN}.pro or $(basename ${S}).pro |
| 141 | # are there, output any of them |
141 | # are there, output any of them |
| 142 | # Outputs a project file argument used by eqmake4. Sets nullglob locally |
142 | # Outputs a project file argument used by eqmake4. Sets nullglob locally |
| 143 | # to avoid expanding *.pro as "*.pro" when there are no matching files. |
143 | # to avoid expanding *.pro as "*.pro" when there are no matching files. |
| 144 | _find_project_file() { |
144 | _find_project_file() { |
|
|
145 | local dir_name=$(basename "${S}") |
|
|
146 | |
| 145 | shopt -s nullglob |
147 | eshopts_push -s nullglob |
| 146 | local pro_files=(*.pro) |
148 | local pro_files=(*.pro) |
| 147 | shopt -u nullglob |
149 | eshopts_pop |
| 148 | local dir_name="$(basename ${S})" |
|
|
| 149 | |
150 | |
| 150 | case ${#pro_files[@]} in |
151 | case ${#pro_files[@]} in |
| 151 | 1) |
152 | 1) |
| 152 | echo "${pro_files[0]}" |
153 | echo "${pro_files[0]}" |
| 153 | ;; |
154 | ;; |
| 154 | *) |
155 | *) |
| 155 | for pro_file in "${pro_files[@]}"; do |
156 | for pro_file in "${pro_files[@]}"; do |
| 156 | if [[ "${pro_file}" == "${dir_name}" || |
157 | if [[ ${pro_file} == "${dir_name}.pro" || ${pro_file} == "${PN}.pro" ]]; then |
| 157 | "${pro_file}" == "${PN}.pro" ]]; then |
|
|
| 158 | echo "${pro_file}" |
158 | echo "${pro_file}" |
| 159 | break |
159 | break |
| 160 | fi |
160 | fi |
| 161 | done |
161 | done |
| 162 | ;; |
162 | ;; |
| 163 | esac |
163 | esac |
| 164 | } |
164 | } |
| 165 | |
165 | |
| 166 | # @FUNCTION: eqmake4 |
166 | # @FUNCTION: eqmake4 |
| 167 | # @USAGE: [project file] [parameters to qmake] |
167 | # @USAGE: [project_file] [parameters to qmake] |
| 168 | # @DESCRIPTION: |
168 | # @DESCRIPTION: |
| 169 | # Wrapper for Qt4's qmake. If project file isn't specified eqmake4 will |
169 | # Wrapper for Qt4's qmake. If project_file isn't specified, eqmake4 will |
| 170 | # look for it in current directory (${S}, non-recursively). If more than |
170 | # look for it in the current directory (${S}, non-recursively). If more |
| 171 | # one project file is found, the ${PN}.pro is processed, provided that it |
171 | # than one project file are found, then ${PN}.pro is processed, provided |
| 172 | # exists. Otherwise eqmake4 fails. |
172 | # that it exists. Otherwise eqmake4 fails. |
|
|
173 | # |
| 173 | # All the arguments are appended unmodified to qmake command line. For |
174 | # All other arguments are appended unmodified to qmake command line. For |
| 174 | # recursive build systems, i.e. those based on the subdirs template, you |
175 | # recursive build systems, i.e. those based on the subdirs template, you |
| 175 | # should run eqmake4 on the top-level project file only, unless you have |
176 | # should run eqmake4 on the top-level project file only, unless you have |
| 176 | # strong reasons to do things differently. During the building, qmake |
177 | # strong reasons to do things differently. During the building, qmake |
| 177 | # will be automatically re-invoked with the right arguments on every |
178 | # will be automatically re-invoked with the right arguments on every |
| 178 | # directory specified inside the top-level project file by the SUBDIRS |
179 | # directory specified inside the top-level project file. |
| 179 | # variable. |
|
|
| 180 | eqmake4() { |
180 | eqmake4() { |
|
|
181 | [[ ${EAPI} == 2 ]] && use !prefix && EPREFIX= |
|
|
182 | |
| 181 | ebegin "Running qmake" |
183 | ebegin "Running qmake" |
| 182 | |
184 | |
| 183 | local qmake_args=("$@") |
185 | local qmake_args=("$@") |
| 184 | |
186 | |
| 185 | # check if project file was passed as a first argument |
187 | # check if project file was passed as a first argument |
| 186 | # if not, then search for it |
188 | # if not, then search for it |
| 187 | local regexp='.*\.pro' |
189 | local regexp='.*\.pro' |
| 188 | if ! [[ "${1}" =~ ${regexp} ]]; then |
190 | if ! [[ ${1} =~ ${regexp} ]]; then |
| 189 | local project_file="$(_find_project_file)" |
191 | local project_file=$(_find_project_file) |
| 190 | if [[ -z "${project_file}" ]]; then |
192 | if [[ -z ${project_file} ]]; then |
| 191 | echo |
193 | echo |
| 192 | eerror "No project file found in ${S}!" |
194 | eerror "No project files found in '${PWD}'!" |
| 193 | eerror "This shouldn't happen - please send a bug report to http://bugs.gentoo.org/" |
195 | eerror "This shouldn't happen - please send a bug report to http://bugs.gentoo.org/" |
| 194 | echo |
196 | echo |
| 195 | die "eqmake4 failed" |
197 | die "eqmake4 failed" |
| 196 | fi |
198 | fi |
| 197 | qmake_args+=("${project_file}") |
199 | qmake_args+=("${project_file}") |
| 198 | fi |
200 | fi |
| 199 | |
201 | |
| 200 | # make sure CONFIG variable is correctly set for both release and debug builds |
202 | # make sure CONFIG variable is correctly set |
| 201 | local CONFIG_ADD="release" |
203 | # for both release and debug builds |
| 202 | local CONFIG_REMOVE="debug" |
204 | local config_add="release" |
|
|
205 | local config_remove="debug" |
| 203 | if has debug ${IUSE} && use debug; then |
206 | if has debug ${IUSE} && use debug; then |
| 204 | CONFIG_ADD="debug" |
207 | config_add="debug" |
| 205 | CONFIG_REMOVE="release" |
208 | config_remove="release" |
| 206 | fi |
209 | fi |
| 207 | local awkscript='BEGIN { |
210 | local awkscript='BEGIN { |
| 208 | printf "### eqmake4 was here ###\n" > file; |
211 | printf "### eqmake4 was here ###\n" > file; |
|
|
212 | printf "CONFIG -= debug_and_release %s\n", remove >> file; |
|
|
213 | printf "CONFIG += %s\n\n", add >> file; |
| 209 | fixed=0; |
214 | fixed=0; |
| 210 | } |
215 | } |
| 211 | /^[[:blank:]]*CONFIG[[:blank:]]*[\+\*]?=/ { |
216 | /^[[:blank:]]*CONFIG[[:blank:]]*[\+\*]?=/ { |
| 212 | for (i=1; i <= NF; i++) { |
217 | if (gsub("\\<((" remove ")|(debug_and_release))\\>", "") > 0) { |
| 213 | if ($i ~ rem || $i ~ /debug_and_release/) |
218 | fixed=1; |
| 214 | { $i=add; fixed=1; } |
|
|
| 215 | } |
219 | } |
| 216 | } |
220 | } |
| 217 | /^[[:blank:]]*CONFIG[[:blank:]]*-=/ { |
221 | /^[[:blank:]]*CONFIG[[:blank:]]*-=/ { |
| 218 | for (i=1; i <= NF; i++) { |
222 | if (gsub("\\<" add "\\>", "") > 0) { |
| 219 | if ($i ~ add) { $i=rem; fixed=1; } |
223 | fixed=1; |
| 220 | } |
224 | } |
| 221 | } |
225 | } |
| 222 | { |
226 | { |
| 223 | print >> file; |
227 | print >> file; |
| 224 | } |
228 | } |
| 225 | END { |
229 | END { |
| 226 | printf "\nCONFIG -= debug_and_release %s\n", rem >> file; |
|
|
| 227 | printf "CONFIG += %s\n", add >> file; |
|
|
| 228 | print fixed; |
230 | print fixed; |
| 229 | }' |
231 | }' |
| 230 | local file= |
232 | local file= |
| 231 | while read file; do |
233 | while read file; do |
| 232 | grep -q '^### eqmake4 was here ###$' "${file}" && continue |
234 | grep -q '^### eqmake4 was here ###$' "${file}" && continue |
| 233 | local retval=$({ |
235 | local retval=$({ |
| 234 | rm -f "${file}" || echo "FAILED" |
236 | rm -f "${file}" || echo FAIL |
| 235 | awk -v file="${file}" -- "${awkscript}" add=${CONFIG_ADD} rem=${CONFIG_REMOVE} || echo "FAILED" |
237 | awk -v file="${file}" \ |
|
|
238 | -v add=${config_add} \ |
|
|
239 | -v remove=${config_remove} \ |
|
|
240 | -- "${awkscript}" || echo FAIL |
| 236 | } < "${file}") |
241 | } < "${file}") |
| 237 | if [[ ${retval} == 1 ]]; then |
242 | if [[ ${retval} == 1 ]]; then |
| 238 | einfo " - fixed CONFIG in ${file}" |
243 | einfo " - fixed CONFIG in ${file}" |
| 239 | elif [[ ${retval} != 0 ]]; then |
244 | elif [[ ${retval} != 0 ]]; then |
| 240 | eerror "An error occurred while processing ${file}" |
245 | eerror " - error while processing ${file}" |
| 241 | die "eqmake4 failed to process '${file}'" |
246 | die "eqmake4 failed to process ${file}" |
| 242 | fi |
247 | fi |
| 243 | done < <(find . -type f -name "*.pr[io]" -printf '%P\n' 2>/dev/null) |
248 | done < <(find . -type f -name '*.pr[io]' -printf '%P\n' 2>/dev/null) |
| 244 | |
|
|
| 245 | [[ ${EAPI} == 2 ]] && use !prefix && EPREFIX= |
|
|
| 246 | |
249 | |
| 247 | "${EPREFIX}"/usr/bin/qmake \ |
250 | "${EPREFIX}"/usr/bin/qmake \ |
| 248 | -makefile \ |
251 | -makefile \ |
| 249 | -config ${CONFIG_ADD} \ |
|
|
| 250 | QTDIR="${EPREFIX}"/usr/$(get_libdir) \ |
252 | QTDIR="${EPREFIX}"/usr/$(get_libdir) \ |
| 251 | QMAKE="${EPREFIX}"/usr/bin/qmake \ |
253 | QMAKE="${EPREFIX}"/usr/bin/qmake \ |
| 252 | QMAKE_CC="$(tc-getCC)" \ |
254 | QMAKE_CC="$(tc-getCC)" \ |
| 253 | QMAKE_CXX="$(tc-getCXX)" \ |
255 | QMAKE_CXX="$(tc-getCXX)" \ |
| 254 | QMAKE_LINK="$(tc-getCXX)" \ |
256 | QMAKE_LINK="$(tc-getCXX)" \ |