/[gentoo-x86]/eclass/gdesklets.eclass
Gentoo

Diff of /eclass/gdesklets.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.11 Revision 1.21
1# Copyright 2004 Gentoo Foundation 1# Copyright 1999-2011 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License, v2 or later 2# Distributed under the terms of the GNU General Public License, v2 or later
3# $Header: /var/cvsroot/gentoo-x86/eclass/gdesklets.eclass,v 1.11 2006/01/16 18:14:47 nixphoeni Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/gdesklets.eclass,v 1.21 2011/08/22 04:46:31 vapier Exp $
4
5# @ECLASS: gdesklets.eclass
6# @MAINTAINER:
7# gdesklets@gentoo.org
8# @AUTHOR:
9# Original author: Joe Sapp <nixphoeni@gentoo.org>
10# Original author: Mike Gardiner <obz@gentoo.org>
11# @BLURB: Installation functions for Desklets and Controls supported by gDesklets
12# @DESCRIPTION:
13# The gdesklets eclass provides a simple way to create ebuilds for
14# globally installing desktop applets ("Desklets") and supporting code
15# ("Controls") used in the gDesklets framework (provided by
16# gnome-extra/gdesklets-core)
4# 17#
5# Authors: Joe Sapp <nixphoeni@gentoo.org> 18# This eclass assumes a package following the instructions at
6# Mike Gardiner <obz@gentoo.org> 19# http://gdesklets.de/index.php?q=node/2 . Specifically, the package
7# 20# should be a Desklet or Control ONLY (and *not* a Sensor). You
8# Usage: 21# technically could have an ebuild that works around this limitation,
9# As a writer for an ebuild for gDesklets, you should set a few things: 22# but no new packages should be added to the tree that do this (mainly
10# 23# for ease of maintenance).
11# DESKLET_NAME: The name of the desklet.
12# DOCS: Anything (like a README) that should be dodoc'd.
13# S: *Optional* The package's base directory.
14# Usually ${WORKDIR}/${DESKLET_NAME} if it was packaged
15# correctly (hence, this is the default).
16# RDEPEND: *Optional* Set if the desklet requires a minimum version
17# of gDesklets greater than 0.34 or other packages.
18 24
19inherit eutils multilib 25# @ECLASS-VARIABLE: DESKLET_NAME
26# @DESCRIPTION:
27# *Optional* The name of the Desklet, if the package is one. The
28# default is to assume a Desklet with the name being ${PN} without the
29# "desklet-" prefix.
20 30
31# @ECLASS-VARIABLE: CONTROL_NAME
32# @DESCRIPTION:
33# *Optional* The name of the Control, if the package is one.
21 34
22MY_P="${DESKLET_NAME}-${PV}" 35# @ECLASS-VARIABLE: DOCS
23S=${WORKDIR}/${DESKLET_NAME} 36# @DESCRIPTION:
37# Anything (like a README) that should be dodoc'd.
24 38
25SRC_URI="http://gdesklets.gnomedesktop.org/files/${MY_P}.tar.gz" 39# @ECLASS-VARIABLE: SLOT
40# @DESCRIPTION:
41# Set only if the package is a Control and it provides a different
42# interface (i.e. expands to a different install directory) than a
43# previous version.
26 44
27# Ebuild writer shouldn't need to touch these (except maybe $RDEPEND) 45inherit eutils multilib python
46
47if [[ -n "${CONTROL_NAME}" ]]; then
48 debug-print "Looking for a Control named \"${CONTROL_NAME}\""
49 MY_PN="${CONTROL_NAME}"
50 SRC_URI="http://gdesklets.de/files/controls/${MY_PN}/${MY_PN}-${PV}.tar.gz"
51 unset DESKLET_NAME
52else # [[ -n "${DESKLET_NAME}" ]]; then
53 # Assume an unset DESKLET_NAME means the name is ${PN} without
54 # the "desklet-" prefix
55 [[ -z "${DESKLET_NAME}" ]] && DESKLET_NAME="${PN#desklet-}"
56 debug-print "Looking for a Desklet named \"${DESKLET_NAME}\""
57 MY_PN="${DESKLET_NAME}"
58 SRC_URI="http://gdesklets.de/files/desklets/${MY_PN}/${MY_PN}-${PV}.tar.gz"
59fi
60
61MY_P="${MY_PN}-${PV}"
62S="${WORKDIR}/${MY_PN}"
63
28SLOT="0" 64SLOT="0"
65# Ebuild writer shouldn't need to touch these (except maybe RDEPEND)
29IUSE="" 66IUSE=""
30RDEPEND=">=gnome-extra/gdesklets-core-0.34.3-r1" 67RDEPEND=">=gnome-extra/gdesklets-core-0.36.1-r3"
31 68
32GDESKLETS_INST_DIR="/usr/$(get_libdir)/gdesklets" 69GDESKLETS_INST_DIR="${ROOT}usr/$(get_libdir)/gdesklets"
33 70
71# @FUNCTION: gdesklets_src_install
72# @DESCRIPTION:
73# Installs a Desklet or Control depending on which is set of
74# CONTROL_NAME or DESKLET_NAME
34gdesklets_src_install() { 75gdesklets_src_install() {
35 76
36 debug-print-function $FUNCNAME $* 77 debug-print-function $FUNCNAME $*
37 78
38 has_version ">=gnome-extra/gdesklets-core-0.33.1" || \ 79 # Disable compilation of included python modules (for Controls)
39 GDESKLETS_INST_DIR="/usr/share/gdesklets" 80 python_disable_pyc
40 81
41 # This should be done by the gdesklets-core ebuild 82 # Avoid sandbox violations caused by misbehaving packages (bug #128289)
42 # It makes the Displays or Controls directory in the 83 addwrite "${ROOT}/root/.gnome2"
43 # global installation directory if it doesn't exist
44 [[ -d ${GDESKLETS_INST_DIR}/Displays ]] || \
45 dodir ${GDESKLETS_INST_DIR}/Displays
46 84
47 # The displays only need to be readable 85 # Both Displays and Controls only need to be readable
48 insopts -m0744 86 insopts -m0744
49 87
50 # Check to see if DISPLAY is set for the 88 debug-print-section docs_install
51 # gdesklets-control-getid script to run without
52 # error
53 [ -z "${DISPLAY}" ] && DISPLAY=""
54 export DISPLAY
55 89
56 debug-print-section sensor_install 90 # Install some docs if so requested (and then delete them so they
57 # First, install the Sensor (if there is one) 91 # don't get copied into the installation directory)
58 if [[ -n "${SENSOR_NAME}" ]]; then 92 [[ -n "${DOCS}" ]] && dodoc ${DOCS} && \
59 for SENS in ${SENSOR_NAME[@]}; do 93 rm -f ${DOCS} \
60 einfo "Installing Sensor ${SENS}" 94 debug-print "Installed and deleted ${DOCS}"
61 /usr/bin/python "Install_${SENS}_Sensor.bin" \ 95 # LICENSE doesn't need to get installed if it exists
62 --nomsg ${D}${GDESKLETS_INST_DIR}/Sensors || \ 96 find . -name LICENSE -delete
63 die "Couldn't Install Sensor"
64 97
65 chown -R root:0 ${D}${GDESKLETS_INST_DIR}/Sensors/${SENSOR_NAME} 98 if [[ -n "${DESKLET_NAME}" ]]; then
66 done # for in ${SENSOR_NAME}
67 fi # if -n "${SENSOR_NAME}"
68 99
69 debug-print-section display_install 100 debug-print-section display_install
70 # This finds the Displays
71 DISPLAY_FILES=(`find . -iname "*.display"`)
72 101
73 DESKLET_INSDIR="" 102 # Base installation directory for displays from this desklet
103 INSDIR="${GDESKLETS_INST_DIR}/Displays/${DESKLET_NAME}"
74 104
75 # There is most likely only one display per package 105 debug-print "Installing into ${INSDIR}"
76 if [[ -n "${DISPLAY_FILES[@]}" ]]; then 106 debug-print "Exiting Display-specific installation code"
77 # Base installation directory for displays from this desklet
78 DESKLET_INSDIR="${GDESKLETS_INST_DIR}/Displays/${DESKLET_NAME}"
79 107
80 # This creates the subdirectory of ${DESKLET_NAME} 108 elif [[ -n "${CONTROL_NAME}" ]]; then
81 # in the global Displays directory
82 [[ -d ${DESKLET_INSDIR} ]] || \
83 dodir ${DESKLET_INSDIR}
84 109
85 # For each of the Display files, there may be 110 debug-print-section control_install
86 # scripts included inline which don't necessarily
87 # follow any naming scheme.
88 # So for each of them, determine what those scripts are
89 # and install them.
90 for DSP in ${DISPLAY_FILES[@]}; do
91 111
92 cd `dirname ${DSP}` 112 # Unique name for this Control and its interface
93 einfo "Installing Display `basename ${DSP} .display`" 113 CTRL_DIRNAME=$( "${GDESKLETS_INST_DIR}/gdesklets-control-getid" `pwd` 2> /dev/null )
94 debug-print "Installing ${DSP} into ${DESKLET_INSDIR}" 114 einfo "Installing Control ${CTRL_DIRNAME}"
95 DSP=`basename ${DSP}`
96 insinto ${DESKLET_INSDIR}
97 doins ${DSP}
98 115
99 SCRIPTS=$(grep "script .*uri" ${DSP} | \ 116 # Base installation directory for this Control
100 sed -e 's:.*<script .*uri=": :g' -e 's:"/>.*: :g') 117 INSDIR="${GDESKLETS_INST_DIR}/Controls/${CTRL_DIRNAME}"
118 debug-print "Installing into ${INSDIR}"
101 119
102 # For each one of the scripts, change to its 120 # Mercilessly delete all existing compiled code
103 # base directory and change the install location 121 find . -iname '*.py[co]' -delete
104 # so it gets installed at the proper place
105 # relative to the display.
106 for SCR in ${SCRIPTS[@]}; do
107 122
108 cd `dirname ${SCR}` 123 debug-print "Exiting Control-specific installation code"
109 124
110 insinto ${DESKLET_INSDIR}/`dirname ${SCR}` 125 else
111 doins `basename ${SCR}` 126 die "nothing to install, is the ebuild written correctly?"
112 debug-print "Installed `basename ${SCR}` into ${DESKLET_INSDIR}/`dirname ${SCR}`" 127 fi
113 128
114 cd ${S}/`dirname ${DSP}` 129 debug-print-section common_install
115 130
116 done # for in ${SCRIPTS} 131 # Create the proper subdirectory in the global Controls or
132 # Displays directory
133 dodir "${INSDIR}"
134 insinto "${INSDIR}"
135 doins -r *
117 136
118 # Install the graphics for this display. 137}
119 # If there are multiple displays in this
120 # directory, this will be done more than
121 # once. It's the only solution I can
122 # come up with for now...
123 GFX=(`find . \
124 -iname "*.png" -o -iname "*.svg" \
125 -o -iname "*.jpg" -o -iname "*.gif" \
126 -o -iname "*.xcf"`)
127 138
128 for G in ${GFX[@]}; do 139# @FUNCTION: gdesklets_pkg_postinst
140# @DESCRIPTION:
141# Marks the Control for rebuilding on Python version change and
142# compiles the Python code or display a useful message to the user,
143# depending on which of CONTROL_NAME or DESKLET_NAME is set.
144gdesklets_pkg_postinst() {
129 145
130 insinto ${DESKLET_INSDIR}/`dirname ${G}` 146 # The only time compilation of python modules should occur is
131 doins ${G} 147 # for Controls, since Displays are run from inside the sandbox
132 debug-print "Installed ${G} into ${DESKLET_INSDIR}/`dirname ${G}`" 148 # (and therefore can't be compiled).
149 if [[ -n "${CONTROL_NAME}" ]]; then
133 150
134 done # for in ${GFX} 151 CTRL_DIRNAME=$( "${GDESKLETS_INST_DIR}/gdesklets-control-getid" `pwd` 2> /dev/null )
152 python_need_rebuild
153 python_mod_optimize "${GDESKLETS_INST_DIR}/Controls/${CTRL_DIRNAME}"
135 154
136 cd ${S} 155 else
137 156
138 done # for in ${DISPLAY_FILES} 157 einfo "Each user can now add this desklet to their desktop through the"
158 einfo "gDesklets shell or the command line (.display files can be"
159 einfo "found in ${GDESKLETS_INST_DIR}/Displays/${DESKLET_NAME})."
139 160
140 fi 161 fi
141 162
142 debug-print-section control_install
143
144 CONTROL_INSDIR=""
145
146 # Make sure that it only finds Controls and not Sensors
147 # If it uses a Sensor, it shouldn't use a Control (since
148 # Sensors are deprecated).
149 if [[ -z "${SENSOR_NAME}" ]]; then
150
151 # Base installation directory for Controls
152 CONTROL_INSDIR="${GDESKLETS_INST_DIR}/Controls"
153
154 CONTROL_INITS=$(find . -iname "__init__.py" | grep [Cc]ontrols)
155
156 # There are possibly multiple Controls packaged with the display.
157 # For each __init__.py found, there must be a Control associated with it.
158 for CTRL in ${CONTROL_INITS[@]}; do
159
160 cd `dirname ${CTRL}`
161 CTRL_NAME=$( PYTHON_DONTCOMPILE=1 ${GDESKLETS_INST_DIR}/gdesklets-control-getid `pwd` )
162 einfo "Installing Control ${CTRL_NAME}"
163 # This creates the subdirectory of ${CTRL_NAME}
164 # in the global Controls directory
165 [[ -d ${CONTROL_INSDIR}/${CTRL_NAME} ]] || \
166 dodir ${CONTROL_INSDIR}/${CTRL_NAME}
167
168 insinto ${CONTROL_INSDIR}/${CTRL_NAME}
169
170 doins -r *
171
172 cd ${S}
173
174 done # for in ${CONTROL_INITS}
175
176 fi # if no Sensors
177
178 # Install any remaining graphics and other files
179 # that are sitting in ${S}.
180
181 GFX=$(find . -maxdepth 1 \
182 -iname "*.png" -o -iname "*.svg" \
183 -o -iname "*.jpg" -o -iname "*.gif" \
184 -o -iname "*.xcf")
185
186 if [[ -n "${GFX}" ]]; then
187
188 # Install to the Displays directory of the Desklet
189 insinto ${GDESKLETS_INST_DIR}/Displays/${DESKLET_NAME}
190 doins ${GFX}
191 debug-print "Installed ${GFX} into ${GDESKLETS_INST_DIR}/Displays/${DESKLET_NAME}"
192
193 fi # if -n "${GFX}"
194
195 # Install some docs if so requested
196 [[ -n "${DOCS}" ]] && dodoc ${DOCS}
197 debug-print "Installed ${DOCS}"
198
199} 163}
200 164
201
202EXPORT_FUNCTIONS src_install 165EXPORT_FUNCTIONS src_install pkg_postinst

Legend:
Removed from v.1.11  
changed lines
  Added in v.1.21

  ViewVC Help
Powered by ViewVC 1.1.20