/[gentoo-x86]/eclass/elisp-common.eclass
Gentoo

Diff of /eclass/elisp-common.eclass

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

Revision 1.29 Revision 1.48
1# Copyright 1999-2007 Gentoo Foundation 1# Copyright 1999-2008 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/elisp-common.eclass,v 1.29 2007/10/14 22:12:30 ulm Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/elisp-common.eclass,v 1.48 2008/10/05 13:56:08 ulm Exp $
4# 4#
5# Copyright 2007 Christian Faulhammer <opfer@gentoo.org>
6# Copyright 2002-2004 Matthew Kennedy <mkennedy@gentoo.org> 5# Copyright 2002-2004 Matthew Kennedy <mkennedy@gentoo.org>
6# Copyright 2003 Jeremy Maitin-Shepard <jbms@attbi.com>
7# Copyright 2004-2005 Mamoru Komachi <usata@gentoo.org> 7# Copyright 2004-2005 Mamoru Komachi <usata@gentoo.org>
8# Copyright 2003 Jeremy Maitin-Shepard <jbms@attbi.com> 8# Copyright 2007-2008 Christian Faulhammer <opfer@gentoo.org>
9# Copyright 2007 Ulrich Mueller <ulm@gentoo.org> 9# Copyright 2007-2008 Ulrich Müller <ulm@gentoo.org>
10# 10#
11# @ECLASS: elisp-common.eclass 11# @ECLASS: elisp-common.eclass
12# @MAINTAINER: 12# @MAINTAINER:
13# Feel free to contact the Emacs team through <emacs@gentoo.org> if you have 13# Feel free to contact the Emacs team through <emacs@gentoo.org> if you have
14# problems, suggestions or questions. 14# problems, suggestions or questions.
31# 31#
32# .SS 32# .SS
33# src_compile() usage: 33# src_compile() usage:
34# 34#
35# An elisp file is compiled by the elisp-compile() function defined here and 35# An elisp file is compiled by the elisp-compile() function defined here and
36# simply takes the source files as arguments. 36# simply takes the source files as arguments. The case of interdependent
37# elisp files is also supported, since the current directory is added to the
38# load-path which makes sure that all files are loadable.
37# 39#
38# elisp-compile *.el || die "elisp-compile failed" 40# elisp-compile *.el || die "elisp-compile failed"
39# 41#
40# In the case of interdependent elisp files, you can use the elisp-comp() 42# Formerly, function elisp-comp() was used for compilation of interdependent
41# function which makes sure all files are loadable. 43# elisp files. This usage is considered as obsolete.
42#
43# elisp-comp *.el || die "elisp-comp failed"
44# 44#
45# Function elisp-make-autoload-file() can be used to generate a file with 45# Function elisp-make-autoload-file() can be used to generate a file with
46# autoload definitions for the lisp functions. It takes the output file name 46# autoload definitions for the lisp functions. It takes the output file name
47# (default: "${PN}-autoloads.el") and a list of directories (default: working 47# (default: "${PN}-autoloads.el") and a list of directories (default: working
48# directory) as its arguments. Use of this function requires that the elisp 48# directory) as its arguments. Use of this function requires that the elisp
49# source files contain magic ";;;###autoload" comments. See the Emacs Lisp 49# source files contain magic ";;;###autoload" comments. See the Emacs Lisp
50# Reference Manual (node "Autoload") for a detailed explanation. 50# Reference Manual (node "Autoload") for a detailed explanation.
51# 51#
52# .SS 52# .SS
53# src_install() usage: 53# src_install() usage:
54# 54#
127# 127#
128# elisp-emacs-version() outputs the version of the currently active Emacs. 128# elisp-emacs-version() outputs the version of the currently active Emacs.
129 129
130# @ECLASS-VARIABLE: SITELISP 130# @ECLASS-VARIABLE: SITELISP
131# @DESCRIPTION: 131# @DESCRIPTION:
132# Directory where Emacs Lisp files are installed. 132# Directory where packages install Emacs Lisp files.
133SITELISP=/usr/share/emacs/site-lisp 133SITELISP=/usr/share/emacs/site-lisp
134
135# @ECLASS-VARIABLE: SITEETC
136# @DESCRIPTION:
137# Directory where packages install miscellaneous (not Lisp) files.
138SITEETC=/usr/share/emacs/etc
134 139
135# @ECLASS-VARIABLE: SITEFILE 140# @ECLASS-VARIABLE: SITEFILE
136# @DESCRIPTION: 141# @DESCRIPTION:
137# Name of package's site-init file. 142# Name of package's site-init file.
138SITEFILE=50${PN}-gentoo.el 143SITEFILE=50${PN}-gentoo.el
139 144
145# @ECLASS-VARIABLE: EMACS
146# @DESCRIPTION:
147# Path of Emacs executable.
140EMACS=/usr/bin/emacs 148EMACS=/usr/bin/emacs
149
150# @ECLASS-VARIABLE: EMACSFLAGS
151# @DESCRIPTION:
152# Flags for executing Emacs in batch mode.
141# The following works for Emacs versions 18--23, don't change it. 153# These work for Emacs versions 18-23, so don't change them.
142EMACS_BATCH_CLEAN="${EMACS} -batch -q --no-site-file" 154EMACSFLAGS="-batch -q --no-site-file"
155
156# @ECLASS-VARIABLE: BYTECOMPFLAGS
157# @DESCRIPTION:
158# Emacs flags used for byte-compilation in elisp-compile().
159BYTECOMPFLAGS="-L ."
143 160
144# @FUNCTION: elisp-compile 161# @FUNCTION: elisp-compile
145# @USAGE: <list of elisp files> 162# @USAGE: <list of elisp files>
146# @DESCRIPTION: 163# @DESCRIPTION:
147# Byte-compile Emacs Lisp files. 164# Byte-compile Emacs Lisp files.
165#
166# This function uses GNU Emacs to byte-compile all ".el" specified by its
167# arguments. The resulting byte-code (".elc") files are placed in the same
168# directory as their corresponding source file.
169#
170# The current directory is added to the load-path. This will ensure that
171# interdependent Emacs Lisp files are visible between themselves, in case
172# they require or load one another.
148 173
149elisp-compile() { 174elisp-compile() {
150 einfo "Compiling GNU Emacs Elisp files ..." 175 ebegin "Compiling GNU Emacs Elisp files"
151 ${EMACS_BATCH_CLEAN} -f batch-byte-compile "$@" 176 ${EMACS} ${EMACSFLAGS} ${BYTECOMPFLAGS} -f batch-byte-compile "$@"
177 eend $? "batch-byte-compile failed"
178}
179
180# #FUNCTION: elisp-comp
181# #USAGE: <list of elisp files>
182# #DESCRIPTION:
183# Byte-compile interdependent Emacs Lisp files.
184# THIS FUNCTION IS DEPRECATED.
185#
186# This function byte-compiles all ".el" files which are part of its
187# arguments, using GNU Emacs, and puts the resulting ".elc" files into the
188# current directory, so disregarding the original directories used in ".el"
189# arguments.
190#
191# This function manages in such a way that all Emacs Lisp files to be
192# compiled are made visible between themselves, in the event they require or
193# load one another.
194
195elisp-comp() {
196 # Copyright 1995 Free Software Foundation, Inc.
197 # François Pinard <pinard@iro.umontreal.ca>, 1995.
198 # Originally taken from GNU autotools.
199
200 ewarn "Function elisp-comp is deprecated and may be removed in future."
201 ewarn "Please use function elisp-compile instead, or report a bug about"
202 ewarn "${CATEGORY}/${PF} at <http://bugs.gentoo.org/>."
203 echo
204
205 [ $# -gt 0 ] || return 1
206
207 ebegin "Compiling GNU Emacs Elisp files"
208
209 local tempdir=elc.$$
210 mkdir ${tempdir}
211 cp "$@" ${tempdir}
212 pushd ${tempdir}
213
214 echo "(add-to-list 'load-path \"../\")" > script
215 ${EMACS} ${EMACSFLAGS} -l script -f batch-byte-compile *.el
216 local ret=$?
217 mv *.elc ..
218
219 popd
220 rm -fr ${tempdir}
221
222 eend ${ret} "batch-byte-compile failed"
223 return ${ret}
152} 224}
153 225
154# @FUNCTION: elisp-emacs-version 226# @FUNCTION: elisp-emacs-version
155# @DESCRIPTION: 227# @DESCRIPTION:
156# Output version of currently active Emacs. 228# Output version of currently active Emacs.
157 229
158elisp-emacs-version() { 230elisp-emacs-version() {
159 # The following will work for at least versions 18-23. 231 # The following will work for at least versions 18-23.
160 echo "(princ emacs-version)" >"${T}"/emacs-version.el 232 echo "(princ emacs-version)" >"${T}"/emacs-version.el
161 ${EMACS_BATCH_CLEAN} -l "${T}"/emacs-version.el 233 ${EMACS} ${EMACSFLAGS} -l "${T}"/emacs-version.el
234 rm -f "${T}"/emacs-version.el
162} 235}
163 236
164# @FUNCTION: elisp-make-autoload-file 237# @FUNCTION: elisp-make-autoload-file
165# @USAGE: [output file] [list of directories] 238# @USAGE: [output file] [list of directories]
166# @DESCRIPTION: 239# @DESCRIPTION:
167# Generate a file with autoload definitions for the lisp functions. 240# Generate a file with autoload definitions for the lisp functions.
168 241
169elisp-make-autoload-file() { 242elisp-make-autoload-file() {
170 local f="${1:-${PN}-autoloads.el}" 243 local f="${1:-${PN}-autoloads.el}"
171 shift 244 shift
172 einfo "Generating autoload file for GNU Emacs ..." 245 ebegin "Generating autoload file for GNU Emacs"
173 246
174 sed 's/^FF/\f/' >"${f}" <<-EOF 247 sed 's/^FF/\f/' >"${f}" <<-EOF
175 ;;; ${f##*/} --- autoloads for ${P} 248 ;;; ${f##*/} --- autoloads for ${P}
176 249
177 ;;; Commentary: 250 ;;; Commentary:
186 ;; no-update-autoloads: t 259 ;; no-update-autoloads: t
187 ;; End: 260 ;; End:
188 ;;; ${f##*/} ends here 261 ;;; ${f##*/} ends here
189 EOF 262 EOF
190 263
191 ${EMACS_BATCH_CLEAN} \ 264 ${EMACS} ${EMACSFLAGS} \
192 --eval "(setq make-backup-files nil)" \ 265 --eval "(setq make-backup-files nil)" \
193 --eval "(setq generated-autoload-file (expand-file-name \"${f}\"))" \ 266 --eval "(setq generated-autoload-file (expand-file-name \"${f}\"))" \
194 -f batch-update-autoloads "${@-.}" 267 -f batch-update-autoloads "${@-.}"
268
269 eend $? "batch-update-autoloads failed"
195} 270}
196 271
197# @FUNCTION: elisp-install 272# @FUNCTION: elisp-install
198# @USAGE: <subdirectory> <list of files> 273# @USAGE: <subdirectory> <list of files>
199# @DESCRIPTION: 274# @DESCRIPTION:
200# Install files in SITELISP directory. 275# Install files in SITELISP directory.
201 276
202elisp-install() { 277elisp-install() {
203 local subdir="$1" 278 local subdir="$1"
204 shift 279 shift
205 einfo "Installing Elisp files for GNU Emacs support ..." 280 ebegin "Installing Elisp files for GNU Emacs support"
206 ( # subshell to avoid pollution of calling environment 281 ( # subshell to avoid pollution of calling environment
207 insinto "${SITELISP}/${subdir}" 282 insinto "${SITELISP}/${subdir}"
208 doins "$@" 283 doins "$@"
209 ) 284 )
285 eend $? "doins failed"
210} 286}
211 287
212# @FUNCTION: elisp-site-file-install 288# @FUNCTION: elisp-site-file-install
213# @USAGE: <site-init file> [subdirectory] 289# @USAGE: <site-init file> [subdirectory]
214# @DESCRIPTION: 290# @DESCRIPTION:
215# Install Emacs site-init file in SITELISP directory. 291# Install Emacs site-init file in SITELISP directory.
216 292
217elisp-site-file-install() { 293elisp-site-file-install() {
218 local sf="$1" my_pn="${2:-${PN}}" 294 local sf="${T}/${1##*/}" my_pn="${2:-${PN}}" ret
219 einfo "Installing site initialisation file for GNU Emacs ..." 295 ebegin "Installing site initialisation file for GNU Emacs"
220 cp "${sf}" "${T}" 296 cp "$1" "${sf}"
221 sed -i "s:@SITELISP@:${SITELISP}/${my_pn}:g" "${T}/$(basename "${sf}")" 297 sed -i -e "s:@SITELISP@:${SITELISP}/${my_pn}:g" \
298 -e "s:@SITEETC@:${SITEETC}/${my_pn}:g" "${sf}"
222 ( # subshell to avoid pollution of calling environment 299 ( # subshell to avoid pollution of calling environment
223 insinto "${SITELISP}" 300 insinto "${SITELISP}/site-gentoo.d"
224 doins "${T}/$(basename "${sf}")" 301 doins "${sf}"
225 ) 302 )
303 ret=$?
304 rm -f "${sf}"
305 eend ${ret} "doins failed"
226} 306}
227 307
228# @FUNCTION: elisp-site-regen 308# @FUNCTION: elisp-site-regen
229# @DESCRIPTION: 309# @DESCRIPTION:
230# Regenerate site-gentoo.el file. 310# Regenerate the site-gentoo.el file, based on packages' site initialisation
311# files in the /usr/share/emacs/site-lisp/site-gentoo.d/ directory.
312#
313# Note: Before December 2007, site initialisation files were installed in
314# /usr/share/emacs/site-lisp/. For backwards compatibility, this location is
315# still supported when generating site-gentoo.el.
231 316
232elisp-site-regen() { 317elisp-site-regen() {
233 local sflist sf line 318 local i sf line firstrun obsolete
319 local -a sflist
320 # Work around Paludis borkage: variable T is empty in pkg_postrm
321 local tmpdir=${T:-$(mktemp -d)}
234 322
323 if [ ! -d "${ROOT}${SITELISP}" ]; then
324 eerror "Directory ${SITELISP} does not exist"
325 return 1
326 fi
327
235 if [ ! -e "${ROOT}${SITELISP}"/site-gentoo.el ] \ 328 [ -e "${ROOT}${SITELISP}"/site-gentoo.el ] || firstrun=t
329
236 && [ ! -e "${ROOT}${SITELISP}"/site-start.el ]; then 330 if [ "${firstrun}" ] && [ ! -e "${ROOT}${SITELISP}"/site-start.el ]; then
237 einfo "Creating default ${SITELISP}/site-start.el ..." 331 einfo "Creating default ${SITELISP}/site-start.el ..."
238 cat <<-EOF >"${T}"/site-start.el 332 cat <<-EOF >"${tmpdir}"/site-start.el
239 ;;; site-start.el 333 ;;; site-start.el
240 334
241 ;;; Commentary: 335 ;;; Commentary:
242 ;; This default site startup file is installed by elisp-common.eclass. 336 ;; This default site startup file is installed by elisp-common.eclass.
243 ;; You may replace this file by your own site initialisation, or even 337 ;; You may replace this file by your own site initialisation, or even
250 ;;; site-start.el ends here 344 ;;; site-start.el ends here
251 EOF 345 EOF
252 fi 346 fi
253 347
254 einfon "Regenerating ${SITELISP}/site-gentoo.el ..." 348 einfon "Regenerating ${SITELISP}/site-gentoo.el ..."
349
350 # remove any auxiliary file (from previous run)
351 rm -f "${ROOT}${SITELISP}"/00site-gentoo.el
352
353 # set nullglob option, there may be a directory without matching files
354 local old_shopts=$(shopt -p nullglob)
355 shopt -s nullglob
356
357 for sf in "${ROOT}${SITELISP}"/[0-9][0-9]*-gentoo.el \
358 "${ROOT}${SITELISP}"/site-gentoo.d/[0-9][0-9]*.el
359 do
360 [ -r "${sf}" ] || continue
361 # sort files by their basename. straight insertion sort.
362 for ((i=${#sflist[@]}; i>0; i--)); do
363 [[ ${sf##*/} < ${sflist[i-1]##*/} ]] || break
364 sflist[i]=${sflist[i-1]}
365 done
366 sflist[i]=${sf}
367 # set a flag if there are obsolete files
368 [ "${sf%/*}" = "${ROOT}${SITELISP}" ] && obsolete=t
369 done
370
371 eval "${old_shopts}"
372
255 cat <<-EOF >"${T}"/site-gentoo.el 373 cat <<-EOF >"${tmpdir}"/site-gentoo.el
256 ;;; site-gentoo.el --- site initialisation for Gentoo-installed packages 374 ;;; site-gentoo.el --- site initialisation for Gentoo-installed packages
257 375
258 ;;; Commentary: 376 ;;; Commentary:
259 ;; Automatically generated by elisp-common.eclass 377 ;; Automatically generated by elisp-common.eclass
260 ;; DO NOT EDIT THIS FILE 378 ;; DO NOT EDIT THIS FILE
261 379
262 ;;; Code: 380 ;;; Code:
263 EOF 381 EOF
264 382 cat "${sflist[@]}" </dev/null >>"${tmpdir}"/site-gentoo.el
265 for sf in "${ROOT}${SITELISP}"/[0-9][0-9]*-gentoo.el
266 do
267 [ -r "${sf}" ] || continue
268 sflist="${sflist} $(basename "${sf}")"
269 cat "${sf}" >>"${T}"/site-gentoo.el
270 done
271
272 cat <<-EOF >>"${T}"/site-gentoo.el 383 cat <<-EOF >>"${tmpdir}"/site-gentoo.el
273 384
274 (provide 'site-gentoo) 385 (provide 'site-gentoo)
275 386
276 ;; Local Variables: 387 ;; Local Variables:
277 ;; no-byte-compile: t 388 ;; no-byte-compile: t
278 ;; End: 389 ;; End:
279 ;;; site-gentoo.el ends here 390 ;;; site-gentoo.el ends here
280 EOF 391 EOF
281 392
282 if cmp -s "${ROOT}${SITELISP}"/site-gentoo.el "${T}"/site-gentoo.el; then 393 if cmp -s "${ROOT}${SITELISP}"/site-gentoo.el "${tmpdir}"/site-gentoo.el
394 then
283 # This prevents outputting unnecessary text when there 395 # This prevents outputting unnecessary text when there
284 # was actually no change. 396 # was actually no change.
285 # A case is a remerge where we have doubled output. 397 # A case is a remerge where we have doubled output.
286 echo " no changes." 398 echo " no changes."
287 else 399 else
288 mv "${T}"/site-gentoo.el "${ROOT}${SITELISP}"/site-gentoo.el 400 mv "${tmpdir}"/site-gentoo.el "${ROOT}${SITELISP}"/site-gentoo.el
289 [ -f "${T}"/site-start.el ] \ 401 [ -f "${tmpdir}"/site-start.el ] \
290 && [ ! -e "${ROOT}${SITELISP}"/site-start.el ] \ 402 && [ ! -e "${ROOT}${SITELISP}"/site-start.el ] \
291 && mv "${T}"/site-start.el "${ROOT}${SITELISP}"/site-start.el 403 && mv "${tmpdir}"/site-start.el "${ROOT}${SITELISP}"/site-start.el
292 echo; einfo 404 echo
293 for sf in ${sflist}; do 405 einfo "... ${#sflist[@]} site initialisation file(s) included."
294 einfo " Adding ${sf} ..." 406 fi
295 done 407
408 if [ "${firstrun}" ]; then
409 echo
296 while read line; do einfo "${line}"; done <<EOF 410 while read line; do einfo "${line:- }"; done <<-EOF
297
298All site initialisation for Gentoo-installed packages is added to 411 All site initialisation for Gentoo-installed packages is added to
299/usr/share/emacs/site-lisp/site-gentoo.el; site-start.el is no longer 412 /usr/share/emacs/site-lisp/site-gentoo.el; site-start.el is not
300managed by Gentoo. You are responsible for all maintenance of 413 managed by Gentoo. You are responsible for all maintenance of
301site-start.el if there is such a file. 414 site-start.el if there is such a file.
302 415
303In order for this site initialisation to be loaded for all users 416 In order for this site initialisation to be loaded for all users
304automatically, you can add a line like this: 417 automatically, you can add a line like this:
305 418
306 (require 'site-gentoo) 419 (require 'site-gentoo)
307 420
308to /usr/share/emacs/site-lisp/site-start.el. Alternatively, that line 421 to /usr/share/emacs/site-lisp/site-start.el. Alternatively, that line
309can be added by individual users to their initialisation files, or for 422 can be added by individual users to their initialisation files, or,
310greater flexibility, users can select which of the package-specific 423 for greater flexibility, users can load individual package-specific
311initialisation files in /usr/share/emacs/site-lisp/ to load. 424 initialisation files from /usr/share/emacs/site-lisp/site-gentoo.d/.
312EOF 425 EOF
313 echo 426 echo
314 fi 427 fi
315}
316 428
317# @FUNCTION: elisp-comp 429 if [ "${obsolete}" ]; then
318# @USAGE: <list of elisp files> 430 echo
319# @DESCRIPTION: 431 while read line; do ewarn "${line}"; done <<-EOF
320# Byte-compile interdependent Emacs Lisp files. 432 Site-initialisation files of Emacs packages are now installed in
321# 433 /usr/share/emacs/site-lisp/site-gentoo.d/. We strongly recommend
322# This function byte-compiles all ".el" files which are part of its 434 that you use app-admin/emacs-updater to rebuild the installed
323# arguments, using GNU Emacs, and puts the resulting ".elc" files into the 435 Emacs packages.
324# current directory, so disregarding the original directories used in ".el" 436 EOF
325# arguments.
326#
327# This function manages in such a way that all Emacs Lisp files to be
328# compiled are made visible between themselves, in the event they require or
329# load one another.
330 437
331elisp-comp() { 438 # Kludge for backwards compatibility: During pkg_postrm, old versions
332 # Copyright 1995 Free Software Foundation, Inc. 439 # of this eclass (saved in the VDB) won't find packages' site-init
333 # François Pinard <pinard@iro.umontreal.ca>, 1995. 440 # files in the new location. So we copy them to an auxiliary file
334 # Originally taken from GNU autotools. 441 # that is visible to old eclass versions.
335 442 for sf in "${sflist[@]}"; do
336 test $# -gt 0 || return 1 443 [ "${sf%/*}" = "${ROOT}${SITELISP}/site-gentoo.d" ] \
337 444 && cat "${sf}" >>"${ROOT}${SITELISP}"/00site-gentoo.el
338 if test -z "${EMACS}" || test "${EMACS}" = "t"; then 445 done
339 # Value of "t" means we are running in a shell under Emacs.
340 # Just assume Emacs is called "emacs".
341 EMACS=/usr/bin/emacs
342 fi 446 fi
343 einfo "Compiling GNU Emacs Elisp files ..."
344 447
345 tempdir=elc.$$ 448 # cleanup
346 mkdir ${tempdir} 449 rm -f "${tmpdir}"/site-{gentoo,start}.el
347 cp "$@" ${tempdir}
348 pushd ${tempdir}
349 450
350 echo "(add-to-list 'load-path \"../\")" > script 451 return 0
351 ${EMACS_BATCH_CLEAN} -l script -f batch-byte-compile *.el
352 local ret=$?
353 mv *.elc ..
354
355 popd
356 rm -fr ${tempdir}
357 return ${ret}
358} 452}

Legend:
Removed from v.1.29  
changed lines
  Added in v.1.48

  ViewVC Help
Powered by ViewVC 1.1.20