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.33 2007/12/12 21:58:57 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 | # |
… | |
… | |
130 | # @ECLASS-VARIABLE: SITELISP |
130 | # @ECLASS-VARIABLE: SITELISP |
131 | # @DESCRIPTION: |
131 | # @DESCRIPTION: |
132 | # Directory where packages install Emacs Lisp files. |
132 | # Directory where packages install Emacs Lisp files. |
133 | SITELISP=/usr/share/emacs/site-lisp |
133 | SITELISP=/usr/share/emacs/site-lisp |
134 | |
134 | |
|
|
135 | # @ECLASS-VARIABLE: SITEETC |
|
|
136 | # @DESCRIPTION: |
135 | # Directory where packages install miscellaneous (not Lisp) files. |
137 | # Directory where packages install miscellaneous (not Lisp) files. |
136 | SITEETC=/usr/share/emacs/etc |
138 | SITEETC=/usr/share/emacs/etc |
137 | |
139 | |
138 | # @ECLASS-VARIABLE: SITEFILE |
140 | # @ECLASS-VARIABLE: SITEFILE |
139 | # @DESCRIPTION: |
141 | # @DESCRIPTION: |
140 | # Name of package's site-init file. |
142 | # Name of package's site-init file. |
141 | SITEFILE=50${PN}-gentoo.el |
143 | SITEFILE=50${PN}-gentoo.el |
142 | |
144 | |
|
|
145 | # @ECLASS-VARIABLE: EMACS |
|
|
146 | # @DESCRIPTION: |
|
|
147 | # Path of Emacs executable. |
143 | EMACS=/usr/bin/emacs |
148 | EMACS=/usr/bin/emacs |
|
|
149 | |
|
|
150 | # @ECLASS-VARIABLE: EMACSFLAGS |
|
|
151 | # @DESCRIPTION: |
|
|
152 | # Flags for executing Emacs in batch mode. |
144 | # 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. |
145 | EMACSFLAGS="-batch -q --no-site-file" |
154 | EMACSFLAGS="-batch -q --no-site-file" |
|
|
155 | |
|
|
156 | # @ECLASS-VARIABLE: BYTECOMPFLAGS |
|
|
157 | # @DESCRIPTION: |
|
|
158 | # Emacs flags used for byte-compilation in elisp-compile(). |
|
|
159 | BYTECOMPFLAGS="-L ." |
146 | |
160 | |
147 | # @FUNCTION: elisp-compile |
161 | # @FUNCTION: elisp-compile |
148 | # @USAGE: <list of elisp files> |
162 | # @USAGE: <list of elisp files> |
149 | # @DESCRIPTION: |
163 | # @DESCRIPTION: |
150 | # 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. |
151 | |
173 | |
152 | elisp-compile() { |
174 | elisp-compile() { |
153 | ebegin "Compiling GNU Emacs Elisp files" |
175 | ebegin "Compiling GNU Emacs Elisp files" |
154 | ${EMACS} ${EMACSFLAGS} -f batch-byte-compile "$@" |
176 | ${EMACS} ${EMACSFLAGS} ${BYTECOMPFLAGS} -f batch-byte-compile "$@" |
155 | eend $? "batch-byte-compile failed" |
177 | eend $? "batch-byte-compile failed" |
156 | } |
178 | } |
157 | |
179 | |
158 | # @FUNCTION: elisp-comp |
180 | # #FUNCTION: elisp-comp |
159 | # @USAGE: <list of elisp files> |
181 | # #USAGE: <list of elisp files> |
160 | # @DESCRIPTION: |
182 | # #DESCRIPTION: |
161 | # Byte-compile interdependent Emacs Lisp files. |
183 | # Byte-compile interdependent Emacs Lisp files. |
|
|
184 | # THIS FUNCTION IS DEPRECATED. |
162 | # |
185 | # |
163 | # This function byte-compiles all ".el" files which are part of its |
186 | # This function byte-compiles all ".el" files which are part of its |
164 | # arguments, using GNU Emacs, and puts the resulting ".elc" files into the |
187 | # arguments, using GNU Emacs, and puts the resulting ".elc" files into the |
165 | # current directory, so disregarding the original directories used in ".el" |
188 | # current directory, so disregarding the original directories used in ".el" |
166 | # arguments. |
189 | # arguments. |
… | |
… | |
172 | elisp-comp() { |
195 | elisp-comp() { |
173 | # Copyright 1995 Free Software Foundation, Inc. |
196 | # Copyright 1995 Free Software Foundation, Inc. |
174 | # François Pinard <pinard@iro.umontreal.ca>, 1995. |
197 | # François Pinard <pinard@iro.umontreal.ca>, 1995. |
175 | # Originally taken from GNU autotools. |
198 | # Originally taken from GNU autotools. |
176 | |
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 | |
177 | [ $# -gt 0 ] || return 1 |
205 | [ $# -gt 0 ] || return 1 |
178 | |
206 | |
179 | ebegin "Compiling GNU Emacs Elisp files" |
207 | ebegin "Compiling GNU Emacs Elisp files" |
180 | |
208 | |
181 | tempdir=elc.$$ |
209 | local tempdir=elc.$$ |
182 | mkdir ${tempdir} |
210 | mkdir ${tempdir} |
183 | cp "$@" ${tempdir} |
211 | cp "$@" ${tempdir} |
184 | pushd ${tempdir} |
212 | pushd ${tempdir} |
185 | |
213 | |
186 | echo "(add-to-list 'load-path \"../\")" > script |
214 | echo "(add-to-list 'load-path \"../\")" > script |
… | |
… | |
201 | |
229 | |
202 | elisp-emacs-version() { |
230 | elisp-emacs-version() { |
203 | # The following will work for at least versions 18-23. |
231 | # The following will work for at least versions 18-23. |
204 | echo "(princ emacs-version)" >"${T}"/emacs-version.el |
232 | echo "(princ emacs-version)" >"${T}"/emacs-version.el |
205 | ${EMACS} ${EMACSFLAGS} -l "${T}"/emacs-version.el |
233 | ${EMACS} ${EMACSFLAGS} -l "${T}"/emacs-version.el |
|
|
234 | rm -f "${T}"/emacs-version.el |
206 | } |
235 | } |
207 | |
236 | |
208 | # @FUNCTION: elisp-make-autoload-file |
237 | # @FUNCTION: elisp-make-autoload-file |
209 | # @USAGE: [output file] [list of directories] |
238 | # @USAGE: [output file] [list of directories] |
210 | # @DESCRIPTION: |
239 | # @DESCRIPTION: |
… | |
… | |
260 | # @USAGE: <site-init file> [subdirectory] |
289 | # @USAGE: <site-init file> [subdirectory] |
261 | # @DESCRIPTION: |
290 | # @DESCRIPTION: |
262 | # Install Emacs site-init file in SITELISP directory. |
291 | # Install Emacs site-init file in SITELISP directory. |
263 | |
292 | |
264 | elisp-site-file-install() { |
293 | elisp-site-file-install() { |
265 | local sf="$1" my_pn="${2:-${PN}}" |
294 | local sf="${T}/${1##*/}" my_pn="${2:-${PN}}" ret |
266 | ebegin "Installing site initialisation file for GNU Emacs" |
295 | ebegin "Installing site initialisation file for GNU Emacs" |
267 | cp "${sf}" "${T}" |
296 | cp "$1" "${sf}" |
268 | sed -i -e "s:@SITELISP@:${SITELISP}/${my_pn}:g" \ |
297 | sed -i -e "s:@SITELISP@:${SITELISP}/${my_pn}:g" \ |
269 | -e "s:@SITEETC@:${SITEETC}/${my_pn}:g" "${T}/${sf##*/}" |
298 | -e "s:@SITEETC@:${SITEETC}/${my_pn}:g" "${sf}" |
270 | ( # subshell to avoid pollution of calling environment |
299 | ( # subshell to avoid pollution of calling environment |
271 | insinto "${SITELISP}" |
300 | insinto "${SITELISP}/site-gentoo.d" |
272 | doins "${T}/${sf##*/}" |
301 | doins "${sf}" |
273 | ) |
302 | ) |
|
|
303 | ret=$? |
|
|
304 | rm -f "${sf}" |
274 | eend $? "doins failed" |
305 | eend ${ret} "doins failed" |
275 | } |
306 | } |
276 | |
307 | |
277 | # @FUNCTION: elisp-site-regen |
308 | # @FUNCTION: elisp-site-regen |
278 | # @DESCRIPTION: |
309 | # @DESCRIPTION: |
279 | # Regenerate site-gentoo.el file. |
310 | # Regenerate the site-gentoo.el file, based on packages' site initialisation |
280 | |
|
|
281 | # Old location for site initialisation files of packages was |
|
|
282 | # /usr/share/emacs/site-lisp/. It is planned to change this to |
|
|
283 | # /usr/share/emacs/site-lisp/site-gentoo.d/. |
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. |
284 | |
316 | |
285 | elisp-site-regen() { |
317 | elisp-site-regen() { |
286 | local i sf line |
318 | local i sf line firstrun obsolete |
287 | local -a sflist |
319 | local -a sflist |
|
|
320 | # Work around Paludis borkage: variable T is empty in pkg_postrm |
|
|
321 | local tmpdir=${T:-$(mktemp -d)} |
288 | |
322 | |
|
|
323 | if [ ! -d "${ROOT}${SITELISP}" ]; then |
|
|
324 | eerror "Directory ${SITELISP} does not exist" |
|
|
325 | return 1 |
|
|
326 | fi |
|
|
327 | |
289 | if [ ! -e "${ROOT}${SITELISP}"/site-gentoo.el ] \ |
328 | [ -e "${ROOT}${SITELISP}"/site-gentoo.el ] || firstrun=t |
|
|
329 | |
290 | && [ ! -e "${ROOT}${SITELISP}"/site-start.el ]; then |
330 | if [ "${firstrun}" ] && [ ! -e "${ROOT}${SITELISP}"/site-start.el ]; then |
291 | einfo "Creating default ${SITELISP}/site-start.el ..." |
331 | einfo "Creating default ${SITELISP}/site-start.el ..." |
292 | cat <<-EOF >"${T}"/site-start.el |
332 | cat <<-EOF >"${tmpdir}"/site-start.el |
293 | ;;; site-start.el |
333 | ;;; site-start.el |
294 | |
334 | |
295 | ;;; Commentary: |
335 | ;;; Commentary: |
296 | ;; This default site startup file is installed by elisp-common.eclass. |
336 | ;; This default site startup file is installed by elisp-common.eclass. |
297 | ;; 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 |
… | |
… | |
305 | EOF |
345 | EOF |
306 | fi |
346 | fi |
307 | |
347 | |
308 | einfon "Regenerating ${SITELISP}/site-gentoo.el ..." |
348 | einfon "Regenerating ${SITELISP}/site-gentoo.el ..." |
309 | |
349 | |
310 | # remove auxiliary file |
350 | # remove any auxiliary file (from previous run) |
311 | rm -f "${ROOT}${SITELISP}"/00site-gentoo.el |
351 | rm -f "${ROOT}${SITELISP}"/00site-gentoo.el |
312 | |
352 | |
313 | # set nullglob option, there may be a directory without matching files |
353 | # set nullglob option, there may be a directory without matching files |
314 | local old_shopts=$(shopt -p nullglob) |
354 | local old_shopts=$(shopt -p nullglob) |
315 | shopt -s nullglob |
355 | shopt -s nullglob |
… | |
… | |
322 | for ((i=${#sflist[@]}; i>0; i--)); do |
362 | for ((i=${#sflist[@]}; i>0; i--)); do |
323 | [[ ${sf##*/} < ${sflist[i-1]##*/} ]] || break |
363 | [[ ${sf##*/} < ${sflist[i-1]##*/} ]] || break |
324 | sflist[i]=${sflist[i-1]} |
364 | sflist[i]=${sflist[i-1]} |
325 | done |
365 | done |
326 | sflist[i]=${sf} |
366 | sflist[i]=${sf} |
|
|
367 | # set a flag if there are obsolete files |
|
|
368 | [ "${sf%/*}" = "${ROOT}${SITELISP}" ] && obsolete=t |
327 | done |
369 | done |
328 | |
370 | |
329 | eval "${old_shopts}" |
371 | eval "${old_shopts}" |
330 | |
372 | |
331 | cat <<-EOF >"${T}"/site-gentoo.el |
373 | cat <<-EOF >"${tmpdir}"/site-gentoo.el |
332 | ;;; site-gentoo.el --- site initialisation for Gentoo-installed packages |
374 | ;;; site-gentoo.el --- site initialisation for Gentoo-installed packages |
333 | |
375 | |
334 | ;;; Commentary: |
376 | ;;; Commentary: |
335 | ;; Automatically generated by elisp-common.eclass |
377 | ;; Automatically generated by elisp-common.eclass |
336 | ;; DO NOT EDIT THIS FILE |
378 | ;; DO NOT EDIT THIS FILE |
337 | |
379 | |
338 | ;;; Code: |
380 | ;;; Code: |
339 | EOF |
381 | EOF |
340 | cat "${sflist[@]}" </dev/null >>"${T}"/site-gentoo.el |
382 | cat "${sflist[@]}" </dev/null >>"${tmpdir}"/site-gentoo.el |
341 | cat <<-EOF >>"${T}"/site-gentoo.el |
383 | cat <<-EOF >>"${tmpdir}"/site-gentoo.el |
342 | |
384 | |
343 | (provide 'site-gentoo) |
385 | (provide 'site-gentoo) |
344 | |
386 | |
345 | ;; Local Variables: |
387 | ;; Local Variables: |
346 | ;; no-byte-compile: t |
388 | ;; no-byte-compile: t |
347 | ;; End: |
389 | ;; End: |
348 | ;;; site-gentoo.el ends here |
390 | ;;; site-gentoo.el ends here |
349 | EOF |
391 | EOF |
350 | |
392 | |
351 | 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 |
352 | # This prevents outputting unnecessary text when there |
395 | # This prevents outputting unnecessary text when there |
353 | # was actually no change. |
396 | # was actually no change. |
354 | # A case is a remerge where we have doubled output. |
397 | # A case is a remerge where we have doubled output. |
355 | echo " no changes." |
398 | echo " no changes." |
356 | else |
399 | else |
357 | mv "${T}"/site-gentoo.el "${ROOT}${SITELISP}"/site-gentoo.el |
400 | mv "${tmpdir}"/site-gentoo.el "${ROOT}${SITELISP}"/site-gentoo.el |
358 | [ -f "${T}"/site-start.el ] \ |
401 | [ -f "${tmpdir}"/site-start.el ] \ |
359 | && [ ! -e "${ROOT}${SITELISP}"/site-start.el ] \ |
402 | && [ ! -e "${ROOT}${SITELISP}"/site-start.el ] \ |
360 | && mv "${T}"/site-start.el "${ROOT}${SITELISP}"/site-start.el |
403 | && mv "${tmpdir}"/site-start.el "${ROOT}${SITELISP}"/site-start.el |
361 | echo; einfo |
|
|
362 | for sf in "${sflist[@]##*/}"; do |
|
|
363 | einfo " Adding ${sf} ..." |
|
|
364 | done |
|
|
365 | einfo "Regenerated ${SITELISP}/site-gentoo.el." |
|
|
366 | |
|
|
367 | echo |
404 | echo |
|
|
405 | einfo "... ${#sflist[@]} site initialisation file(s) included." |
|
|
406 | fi |
|
|
407 | |
|
|
408 | if [ "${firstrun}" ]; then |
|
|
409 | echo |
368 | while read line; do einfo "${line}"; done <<EOF |
410 | while read line; do einfo "${line:- }"; done <<-EOF |
369 | All site initialisation for Gentoo-installed packages is added to |
411 | All site initialisation for Gentoo-installed packages is added to |
370 | /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 |
371 | managed by Gentoo. You are responsible for all maintenance of |
413 | managed by Gentoo. You are responsible for all maintenance of |
372 | site-start.el if there is such a file. |
414 | site-start.el if there is such a file. |
373 | |
415 | |
374 | In order for this site initialisation to be loaded for all users |
416 | In order for this site initialisation to be loaded for all users |
375 | automatically, you can add a line like this: |
417 | automatically, you can add a line like this: |
376 | |
418 | |
377 | (require 'site-gentoo) |
419 | (require 'site-gentoo) |
378 | |
420 | |
379 | to /usr/share/emacs/site-lisp/site-start.el. Alternatively, that line |
421 | to /usr/share/emacs/site-lisp/site-start.el. Alternatively, that line |
380 | can be added by individual users to their initialisation files, or, |
422 | can be added by individual users to their initialisation files, or, |
381 | for greater flexibility, users can load individual package-specific |
423 | for greater flexibility, users can load individual package-specific |
382 | initialisation files from /usr/share/emacs/site-lisp/. |
424 | initialisation files from /usr/share/emacs/site-lisp/site-gentoo.d/. |
383 | EOF |
425 | EOF |
384 | echo |
426 | echo |
385 | fi |
427 | fi |
386 | |
428 | |
|
|
429 | if [ "${obsolete}" ]; then |
|
|
430 | echo |
|
|
431 | while read line; do ewarn "${line}"; done <<-EOF |
|
|
432 | Site-initialisation files of Emacs packages are now installed in |
|
|
433 | /usr/share/emacs/site-lisp/site-gentoo.d/. We strongly recommend |
|
|
434 | that you use app-admin/emacs-updater to rebuild the installed |
|
|
435 | Emacs packages. |
|
|
436 | EOF |
|
|
437 | |
387 | # Kludge for backwards compatibility: During pkg_postrm, old versions |
438 | # Kludge for backwards compatibility: During pkg_postrm, old versions |
388 | # of this eclass (saved in the PDB) won't find packages' site-init files |
439 | # of this eclass (saved in the VDB) won't find packages' site-init |
389 | # in the new location. So we copy them to an auxiliary file that is |
440 | # files in the new location. So we copy them to an auxiliary file |
390 | # visible to old eclass versions. |
441 | # that is visible to old eclass versions. |
391 | for sf in "${sflist[@]}"; do |
442 | for sf in "${sflist[@]}"; do |
392 | [ "${sf%/*}" = "${ROOT}${SITELISP}/site-gentoo.d" ] \ |
443 | [ "${sf%/*}" = "${ROOT}${SITELISP}/site-gentoo.d" ] \ |
393 | && cat "${sf}" >>"${ROOT}${SITELISP}"/00site-gentoo.el |
444 | && cat "${sf}" >>"${ROOT}${SITELISP}"/00site-gentoo.el |
394 | done |
445 | done |
|
|
446 | fi |
|
|
447 | |
|
|
448 | # cleanup |
|
|
449 | rm -f "${tmpdir}"/site-{gentoo,start}.el |
|
|
450 | |
|
|
451 | return 0 |
395 | } |
452 | } |