1 |
# Copyright 1999-2011 Gentoo Foundation |
2 |
# Distributed under the terms of the GNU General Public License v2 |
3 |
# $Header: /var/cvsroot/gentoo-x86/eclass/gnome2-utils.eclass,v 1.24 2011/11/14 06:10:32 tetromino Exp $ |
4 |
|
5 |
# @ECLASS: gnome2-utils.eclass |
6 |
# @MAINTAINER: |
7 |
# gnome@gentoo.org |
8 |
# @BLURB: Auxiliary functions commonly used by Gnome packages. |
9 |
# @DESCRIPTION: |
10 |
# This eclass provides a set of auxiliary functions needed by most Gnome |
11 |
# packages. It may be used by non-Gnome packages as needed for handling various |
12 |
# Gnome stack related functions such as: |
13 |
# * Gtk+ icon cache management |
14 |
# * GSettings schemas management |
15 |
# * GConf schemas management |
16 |
# * scrollkeeper (old Gnome help system) management |
17 |
|
18 |
case "${EAPI:-0}" in |
19 |
0|1|2|3|4) ;; |
20 |
*) die "EAPI=${EAPI} is not supported" ;; |
21 |
esac |
22 |
|
23 |
# @ECLASS-VARIABLE: GCONFTOOL_BIN |
24 |
# @INTERNAL |
25 |
# @DESCRIPTION: |
26 |
# Path to gconftool-2 |
27 |
: ${GCONFTOOL_BIN:="/usr/bin/gconftool-2"} |
28 |
|
29 |
# @ECLASS-VARIABLE: SCROLLKEEPER_DIR |
30 |
# @INTERNAL |
31 |
# @DESCRIPTION: |
32 |
# Directory where scrollkeeper-update should do its work |
33 |
: ${SCROLLKEEPER_DIR:="/var/lib/scrollkeeper"} |
34 |
|
35 |
# @ECLASS-VARIABLE: SCROLLKEEPER_UPDATE_BIN |
36 |
# @INTERNAL |
37 |
# @DESCRIPTION: |
38 |
# Path to scrollkeeper-update |
39 |
: ${SCROLLKEEPER_UPDATE_BIN:="/usr/bin/scrollkeeper-update"} |
40 |
|
41 |
# @ECLASS-VARIABLE: GTK_UPDATE_ICON_CACHE |
42 |
# @INTERNAL |
43 |
# @DESCRIPTION: |
44 |
# Path to gtk-update-icon-cache |
45 |
: ${GTK_UPDATE_ICON_CACHE:="/usr/bin/gtk-update-icon-cache"} |
46 |
|
47 |
# @ECLASS-VARIABLE: GLIB_COMPILE_SCHEMAS |
48 |
# @INTERNAL |
49 |
# @DESCRIPTION: |
50 |
# Path to glib-compile-schemas |
51 |
: ${GLIB_COMPILE_SCHEMAS:="/usr/bin/glib-compile-schemas"} |
52 |
|
53 |
# @ECLASS-VARIABLE: GNOME2_ECLASS_SCHEMAS |
54 |
# @INTERNAL |
55 |
# @DEFAULT_UNSET |
56 |
# @DESCRIPTION: |
57 |
# List of GConf schemas provided by the package |
58 |
|
59 |
# @ECLASS-VARIABLE: GNOME2_ECLASS_ICONS |
60 |
# @INTERNAL |
61 |
# @DEFAULT_UNSET |
62 |
# @DESCRIPTION: |
63 |
# List of icons provided by the package |
64 |
|
65 |
# @ECLASS-VARIABLE: GNOME2_ECLASS_GLIB_SCHEMAS |
66 |
# @INTERNAL |
67 |
# @DEFAULT_UNSET |
68 |
# @DESCRIPTION: |
69 |
# List of GSettings schemas provided by the package |
70 |
|
71 |
|
72 |
DEPEND=">=sys-apps/sed-4" |
73 |
|
74 |
|
75 |
# @FUNCTION: gnome2_environment_reset |
76 |
# @DESCRIPTION: |
77 |
# Reset various variables inherited from root's evironment to a reasonable |
78 |
# default for ebuilds to help avoid access violations and test failures. |
79 |
gnome2_environment_reset() { |
80 |
# Respected by >=glib-2.30.1-r1 |
81 |
export G_HOME="${T}" |
82 |
|
83 |
# GST_REGISTRY is to work around gst utilities trying to read/write /root |
84 |
export GST_REGISTRY="${T}/registry.xml" |
85 |
|
86 |
# XXX: code for resetting XDG_* directories should probably be moved into |
87 |
# a separate function in a non-gnome eclass |
88 |
export XDG_DATA_HOME="${T}/.local/share" |
89 |
export XDG_CONFIG_HOME="${T}/.config" |
90 |
export XDG_CACHE_HOME="${T}/.cache" |
91 |
export XDG_RUNTIME_DIR="${T}/run" |
92 |
mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" \ |
93 |
"${XDG_RUNTIME_DIR}" |
94 |
# This directory needs to be owned by the user, and chmod 0700 |
95 |
# http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html |
96 |
chmod 0700 "${XDG_RUNTIME_DIR}" |
97 |
} |
98 |
|
99 |
# @FUNCTION: gnome2_gconf_savelist |
100 |
# @DESCRIPTION: |
101 |
# Find the GConf schemas that are about to be installed and save their location |
102 |
# in the GNOME2_ECLASS_SCHEMAS environment variable. |
103 |
# This function should be called from pkg_preinst. |
104 |
gnome2_gconf_savelist() { |
105 |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}" |
106 |
pushd "${ED}" &> /dev/null |
107 |
export GNOME2_ECLASS_SCHEMAS=$(find 'etc/gconf/schemas/' -name '*.schemas' 2> /dev/null) |
108 |
popd &> /dev/null |
109 |
} |
110 |
|
111 |
# @FUNCTION: gnome2_gconf_install |
112 |
# @DESCRIPTION: |
113 |
# Applies any schema files installed by the current ebuild to Gconf's database |
114 |
# using gconftool-2. |
115 |
# This function should be called from pkg_postinst. |
116 |
gnome2_gconf_install() { |
117 |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}" |
118 |
local updater="${EROOT}${GCONFTOOL_BIN}" |
119 |
|
120 |
if [[ ! -x "${updater}" ]]; then |
121 |
debug-print "${updater} is not executable" |
122 |
return |
123 |
fi |
124 |
|
125 |
if [[ -z "${GNOME2_ECLASS_SCHEMAS}" ]]; then |
126 |
debug-print "No GNOME 2 GConf schemas found" |
127 |
return |
128 |
fi |
129 |
|
130 |
# We are ready to install the GCONF Scheme now |
131 |
unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL |
132 |
export GCONF_CONFIG_SOURCE="$("${updater}" --get-default-source | sed "s;:/;:${ROOT};")" |
133 |
|
134 |
einfo "Installing GNOME 2 GConf schemas" |
135 |
|
136 |
local F |
137 |
for F in ${GNOME2_ECLASS_SCHEMAS}; do |
138 |
if [[ -e "${EROOT}${F}" ]]; then |
139 |
debug-print "Installing schema: ${F}" |
140 |
"${updater}" --makefile-install-rule "${EROOT}${F}" 1>/dev/null |
141 |
fi |
142 |
done |
143 |
|
144 |
# have gconf reload the new schemas |
145 |
pids=$(pgrep -x gconfd-2) |
146 |
if [[ $? == 0 ]] ; then |
147 |
ebegin "Reloading GConf schemas" |
148 |
kill -HUP ${pids} |
149 |
eend $? |
150 |
fi |
151 |
} |
152 |
|
153 |
# @FUNCTION: gnome2_gconf_uninstall |
154 |
# @DESCRIPTION: |
155 |
# Removes schema files previously installed by the current ebuild from Gconf's |
156 |
# database. |
157 |
gnome2_gconf_uninstall() { |
158 |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}" |
159 |
local updater="${EROOT}${GCONFTOOL_BIN}" |
160 |
|
161 |
if [[ ! -x "${updater}" ]]; then |
162 |
debug-print "${updater} is not executable" |
163 |
return |
164 |
fi |
165 |
|
166 |
if [[ -z "${GNOME2_ECLASS_SCHEMAS}" ]]; then |
167 |
debug-print "No GNOME 2 GConf schemas found" |
168 |
return |
169 |
fi |
170 |
|
171 |
unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL |
172 |
export GCONF_CONFIG_SOURCE="$("${updater}" --get-default-source | sed "s;:/;:${ROOT};")" |
173 |
|
174 |
einfo "Uninstalling GNOME 2 GConf schemas" |
175 |
|
176 |
local F |
177 |
for F in ${GNOME2_ECLASS_SCHEMAS}; do |
178 |
if [[ -e "${EROOT}${F}" ]]; then |
179 |
debug-print "Uninstalling gconf schema: ${F}" |
180 |
"${updater}" --makefile-uninstall-rule "${EROOT}${F}" 1>/dev/null |
181 |
fi |
182 |
done |
183 |
|
184 |
# have gconf reload the new schemas |
185 |
pids=$(pgrep -x gconfd-2) |
186 |
if [[ $? == 0 ]] ; then |
187 |
ebegin "Reloading GConf schemas" |
188 |
kill -HUP ${pids} |
189 |
eend $? |
190 |
fi |
191 |
} |
192 |
|
193 |
# @FUNCTION: gnome2_icon_savelist |
194 |
# @DESCRIPTION: |
195 |
# Find the icons that are about to be installed and save their location |
196 |
# in the GNOME2_ECLASS_ICONS environment variable. |
197 |
# This function should be called from pkg_preinst. |
198 |
gnome2_icon_savelist() { |
199 |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}" |
200 |
pushd "${ED}" &> /dev/null |
201 |
export GNOME2_ECLASS_ICONS=$(find 'usr/share/icons' -maxdepth 1 -mindepth 1 -type d 2> /dev/null) |
202 |
popd &> /dev/null |
203 |
} |
204 |
|
205 |
# @FUNCTION: gnome2_icon_cache_update |
206 |
# @DESCRIPTION: |
207 |
# Updates Gtk+ icon cache files under /usr/share/icons if the current ebuild |
208 |
# have installed anything under that location. |
209 |
# This function should be called from pkg_postinst and pkg_postrm. |
210 |
gnome2_icon_cache_update() { |
211 |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}" |
212 |
local updater="${EROOT}${GTK_UPDATE_ICON_CACHE}" |
213 |
|
214 |
if [[ ! -x "${updater}" ]] ; then |
215 |
debug-print "${updater} is not executable" |
216 |
return |
217 |
fi |
218 |
|
219 |
if [[ -z "${GNOME2_ECLASS_ICONS}" ]]; then |
220 |
debug-print "No icon cache to update" |
221 |
return |
222 |
fi |
223 |
|
224 |
ebegin "Updating icons cache" |
225 |
|
226 |
local retval=0 |
227 |
local fails=( ) |
228 |
|
229 |
for dir in ${GNOME2_ECLASS_ICONS} |
230 |
do |
231 |
if [[ -f "${EROOT}${dir}/index.theme" ]] ; then |
232 |
local rv=0 |
233 |
|
234 |
"${updater}" -qf "${EROOT}${dir}" |
235 |
rv=$? |
236 |
|
237 |
if [[ ! $rv -eq 0 ]] ; then |
238 |
debug-print "Updating cache failed on ${EROOT}${dir}" |
239 |
|
240 |
# Add to the list of failures |
241 |
fails[$(( ${#fails[@]} + 1 ))]="${EROOT}${dir}" |
242 |
|
243 |
retval=2 |
244 |
fi |
245 |
fi |
246 |
done |
247 |
|
248 |
eend ${retval} |
249 |
|
250 |
for f in "${fails[@]}" ; do |
251 |
eerror "Failed to update cache with icon $f" |
252 |
done |
253 |
} |
254 |
|
255 |
# @FUNCTION: gnome2_omf_fix |
256 |
# @DESCRIPTION: |
257 |
# Workaround applied to Makefile rules in order to remove redundant |
258 |
# calls to scrollkeeper-update and sandbox violations. |
259 |
# This function should be called from src_prepare. |
260 |
gnome2_omf_fix() { |
261 |
local omf_makefiles filename |
262 |
|
263 |
omf_makefiles="$@" |
264 |
|
265 |
if [[ -f ${S}/omf.make ]] ; then |
266 |
omf_makefiles="${omf_makefiles} ${S}/omf.make" |
267 |
fi |
268 |
|
269 |
# testing fixing of all makefiles found |
270 |
# The sort is important to ensure .am is listed before the respective .in for |
271 |
# maintainer mode regeneration not kicking in due to .am being newer than .in |
272 |
for filename in $(find ./ -name "Makefile.in" -o -name "Makefile.am" |sort) ; do |
273 |
omf_makefiles="${omf_makefiles} ${filename}" |
274 |
done |
275 |
|
276 |
ebegin "Fixing OMF Makefiles" |
277 |
|
278 |
local retval=0 |
279 |
local fails=( ) |
280 |
|
281 |
for omf in ${omf_makefiles} ; do |
282 |
local rv=0 |
283 |
|
284 |
sed -i -e 's:scrollkeeper-update:true:' "${omf}" |
285 |
retval=$? |
286 |
|
287 |
if [[ ! $rv -eq 0 ]] ; then |
288 |
debug-print "updating of ${omf} failed" |
289 |
|
290 |
# Add to the list of failures |
291 |
fails[$(( ${#fails[@]} + 1 ))]=$omf |
292 |
|
293 |
retval=2 |
294 |
fi |
295 |
done |
296 |
|
297 |
eend $retval |
298 |
|
299 |
for f in "${fails[@]}" ; do |
300 |
eerror "Failed to update OMF Makefile $f" |
301 |
done |
302 |
} |
303 |
|
304 |
# @FUNCTION: gnome2_scrollkeeper_update |
305 |
# @DESCRIPTION: |
306 |
# Updates the global scrollkeeper database. |
307 |
# This function should be called from pkg_postinst and pkg_postrm. |
308 |
gnome2_scrollkeeper_update() { |
309 |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}" |
310 |
if [[ -x "${EROOT}${SCROLLKEEPER_UPDATE_BIN}" ]]; then |
311 |
einfo "Updating scrollkeeper database ..." |
312 |
"${EROOT}${SCROLLKEEPER_UPDATE_BIN}" -q -p "${EROOT}${SCROLLKEEPER_DIR}" |
313 |
fi |
314 |
} |
315 |
|
316 |
# @FUNCTION: gnome2_schemas_savelist |
317 |
# @DESCRIPTION: |
318 |
# Find if there is any GSettings schema to install and save the list in |
319 |
# GNOME2_ECLASS_GLIB_SCHEMAS variable. |
320 |
# This function should be called from pkg_preinst. |
321 |
gnome2_schemas_savelist() { |
322 |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}" |
323 |
pushd "${ED}" &>/dev/null |
324 |
export GNOME2_ECLASS_GLIB_SCHEMAS=$(find 'usr/share/glib-2.0/schemas' -name '*.gschema.xml' 2>/dev/null) |
325 |
popd &>/dev/null |
326 |
} |
327 |
|
328 |
# @FUNCTION: gnome2_schemas_update |
329 |
# @USAGE: gnome2_schemas_update |
330 |
# @DESCRIPTION: |
331 |
# Updates GSettings schemas if GNOME2_ECLASS_GLIB_SCHEMAS has some. |
332 |
# This function should be called from pkg_postinst and pkg_postrm. |
333 |
gnome2_schemas_update() { |
334 |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}" |
335 |
local updater="${EROOT}${GLIB_COMPILE_SCHEMAS}" |
336 |
|
337 |
if [[ ! -x ${updater} ]]; then |
338 |
debug-print "${updater} is not executable" |
339 |
return |
340 |
fi |
341 |
|
342 |
if [[ -z ${GNOME2_ECLASS_GLIB_SCHEMAS} ]]; then |
343 |
debug-print "No GSettings schemas to update" |
344 |
return |
345 |
fi |
346 |
|
347 |
ebegin "Updating GSettings schemas" |
348 |
${updater} --allow-any-name "$@" "${EROOT%/}/usr/share/glib-2.0/schemas" &>/dev/null |
349 |
eend $? |
350 |
} |