1 |
# Copyright 1999-2007 Gentoo Foundation |
2 |
# Distributed under the terms of the GNU General Public License v2 |
3 |
# $Header: $ |
4 |
# |
5 |
# Copyright 2007 Christian Faulhammer <opfer@gentoo.org> |
6 |
# Copyright 2002-2007 Matthew Kennedy <mkennedy@gentoo.org> |
7 |
# Copyright 2003 Jeremy Maitin-Shepard <jbms@attbi.com> |
8 |
# Copyright 2007 Ulrich Mueller <ulm@gentoo.org> |
9 |
# |
10 |
# This is not a real eclass, but it does provide Emacs-related installation |
11 |
# utilities. |
12 |
# |
13 |
# USAGE: |
14 |
# |
15 |
# Usually you want to use this eclass for (optional) GNU Emacs support of |
16 |
# your package. This is NOT for XEmacs! |
17 |
# Many of the steps here are sometimes done by the build system of your |
18 |
# package (especially compilation), so this is mainly for standalone elisp |
19 |
# files you gathered from somewhere else. |
20 |
# When relying on the emacs USE flag, you need to add |
21 |
# |
22 |
# emacs? ( virtual/emacs ) |
23 |
# |
24 |
# to your DEPEND/RDEPEND line and use the functions provided here to bring |
25 |
# the files to the correct locations. |
26 |
# |
27 |
# src_compile() usage: |
28 |
# -------------------- |
29 |
# |
30 |
# An elisp file is compiled by the elisp-compile() function defined here and |
31 |
# simply takes the source files as arguments. In the case of interdependent |
32 |
# elisp files, you can use the elisp-comp() function which makes sure all |
33 |
# files are loadable. |
34 |
# |
35 |
# elisp-compile *.el || die "elisp-compile failed!" |
36 |
# or |
37 |
# elisp-comp *.el || die "elisp-comp failed!" |
38 |
# |
39 |
# Function elisp-make-autoload-file() can be used to generate a file with |
40 |
# autoload definitions for the lisp functions. It takes the output file name |
41 |
# (default: "${PN}-autoloads.el") and a list of directories (default: working |
42 |
# directory) as its arguments. Use of this function requires that the elisp |
43 |
# source files contain magic ";;;###autoload" comments. See the Emacs Lisp |
44 |
# Reference Manual (node "Autoload") for a detailed explanation. |
45 |
# |
46 |
# src_install() usage: |
47 |
# -------------------- |
48 |
# |
49 |
# The resulting compiled files (.elc) should be put in a subdirectory of |
50 |
# /usr/share/emacs/site-lisp/ which is named after the first argument |
51 |
# of elisp-install(). The following parameters are the files to be put in |
52 |
# that directory. Usually the subdirectory should be ${PN}, you can choose |
53 |
# something else, but remember to tell elisp-site-file-install() (see below) |
54 |
# the change, as it defaults to ${PN}. |
55 |
# |
56 |
# elisp-install ${PN} *.elc *.el || die "elisp-install failed!" |
57 |
# |
58 |
# To let the Emacs support be activated by Emacs on startup, you need |
59 |
# to provide a site file (shipped in ${FILESDIR}) which contains the startup |
60 |
# code (have a look in the documentation of your software). Normally this |
61 |
# would look like this: |
62 |
# |
63 |
# ;;; csv-mode site-lisp configuration |
64 |
# |
65 |
# (add-to-list 'load-path "@SITELISP@") |
66 |
# (add-to-list 'auto-mode-alist '("\\.csv\\'" . csv-mode)) |
67 |
# (autoload 'csv-mode "csv-mode" "Major mode for editing csv files." t) |
68 |
# |
69 |
# If your Emacs support files are installed in a subdirectory of |
70 |
# /usr/share/emacs/site-lisp/ (which is recommended if more than one file is |
71 |
# installed), you need to extend Emacs' load-path as shown in the first |
72 |
# non-comment. The elisp-site-file-install() function of this eclass will |
73 |
# replace "@SITELISP@" by the actual path. |
74 |
# The next line tells Emacs to load the mode opening a file ending with |
75 |
# ".csv" and load functions depending on the context and needed features. |
76 |
# Be careful though. Commands as "load-library" or "require" bloat the |
77 |
# editor as they are loaded on every startup. When having a lot of Emacs |
78 |
# support files, users may be annoyed by the start-up time. Also avoid |
79 |
# keybindings as they might interfere with the user's settings. Give a hint |
80 |
# in pkg_postinst(), which should be enough. |
81 |
# The naming scheme for this site file is "[0-9][0-9]*-gentoo.el", where the |
82 |
# two digits at the beginning define the loading order. So if you depend on |
83 |
# another Emacs package, your site file's number must be higher! |
84 |
# Best practice is to define a SITEFILE variable in the global scope of your |
85 |
# ebuild (right after DEPEND e.g.): |
86 |
# |
87 |
# SITEFILE=50${PN}-gentoo.el |
88 |
# |
89 |
# Which is then installed by |
90 |
# |
91 |
# elisp-site-file-install "${FILESDIR}/${SITEFILE}" |
92 |
# |
93 |
# in src_install(). If your subdirectory is not named ${PN}, give the |
94 |
# differing name as second argument. |
95 |
# |
96 |
# pkg_postinst() / pkg_postrm() usage: |
97 |
# ------------------------------------ |
98 |
# |
99 |
# After that you need to recreate the start-up file of Emacs after emerging |
100 |
# and unmerging by using |
101 |
# |
102 |
# pkg_postinst() { |
103 |
# elisp-site-regen |
104 |
# } |
105 |
# pkg_postrm() { |
106 |
# elisp-site-regen |
107 |
# } |
108 |
# |
109 |
# As always: Feel free to contact Emacs team through emacs@gentoo.org if you |
110 |
# have problems, suggestions or questions. |
111 |
|
112 |
SITELISP=/usr/share/emacs/site-lisp |
113 |
|
114 |
elisp-compile() { |
115 |
/usr/bin/emacs --batch -f batch-byte-compile --no-site-file --no-init-file $* |
116 |
} |
117 |
|
118 |
elisp-make-autoload-file () { |
119 |
local f="${1-${PN}-autoloads.el}" |
120 |
shift |
121 |
echo >"${f}" |
122 |
emacs --batch -q --no-site-file \ |
123 |
--eval "(setq make-backup-files nil)" \ |
124 |
--eval "(setq generated-autoload-file (expand-file-name \"${f}\"))" \ |
125 |
-f batch-update-autoloads "${@-.}" |
126 |
} |
127 |
|
128 |
elisp-install() { |
129 |
local subdir=$1 |
130 |
dodir "${SITELISP}/${subdir}" |
131 |
insinto "${SITELISP}/${subdir}" |
132 |
shift |
133 |
doins $@ |
134 |
} |
135 |
|
136 |
elisp-site-file-install() { |
137 |
local sitefile=$1 my_pn=${2:-${PN}} |
138 |
pushd "${S}" |
139 |
cp ${sitefile} "${T}" |
140 |
sed -i "s:@SITELISP@:${SITELISP}/${my_pn}:g" "${T}/$(basename ${sitefile})" |
141 |
insinto ${SITELISP} |
142 |
doins "${T}/$(basename ${sitefile})" || die "failed to install site file" |
143 |
popd |
144 |
} |
145 |
|
146 |
elisp-site-regen() { |
147 |
einfo "Regenerating ${SITELISP}/site-gentoo.el ..." |
148 |
einfo "" |
149 |
cat <<EOF >${ROOT}${SITELISP}/site-gentoo.el |
150 |
;;; DO NOT EDIT THIS FILE -- IT IS GENERATED AUTOMATICALLY BY PORTAGE |
151 |
;;; ----------------------------------------------------------------- |
152 |
|
153 |
EOF |
154 |
ls ${ROOT}${SITELISP}/[0-9][0-9]*-gentoo.el | sort -n | \ |
155 |
while read sf |
156 |
do |
157 |
einfo " Adding $(basename $sf) ..." |
158 |
# Great for debugging, too noisy and slow for users though |
159 |
# echo "(message \"Loading $sf ...\")" >>${ROOT}${SITELISP}/site-start.el |
160 |
cat $sf >>${ROOT}${SITELISP}/site-gentoo.el |
161 |
done |
162 |
while read line; do einfo "${line}"; done <<EOF |
163 |
|
164 |
All site initialization for Gentoo-installed packages is now added to |
165 |
/usr/share/emacs/site-lisp/site-gentoo.el; site-start.el is no longer |
166 |
managed by Gentoo. You are responsible for all maintenance of |
167 |
site-start.el if there is such a file. |
168 |
|
169 |
In order for this site initialization to be loaded for all users |
170 |
automatically, as was done previously, you can add a line like this: |
171 |
|
172 |
(load "/usr/share/emacs/site-lisp/site-gentoo") |
173 |
|
174 |
to /usr/share/emacs/site-lisp/site-start.el. Alternatively, that line |
175 |
can be added by individual users to their initialization files, or for |
176 |
greater flexibility, users can select which of the package-specific |
177 |
initialization files in /usr/share/emacs/site-lisp to load. |
178 |
EOF |
179 |
echo |
180 |
} |
181 |
|
182 |
# The following Emacs Lisp compilation routine is taken from GNU |
183 |
# autotools. |
184 |
|
185 |
elisp-comp() { |
186 |
# Copyright 1995 Free Software Foundation, Inc. |
187 |
# François Pinard <pinard@iro.umontreal.ca>, 1995. |
188 |
# This script byte-compiles all `.el' files which are part of its |
189 |
# arguments, using GNU Emacs, and put the resulting `.elc' files into |
190 |
# the current directory, so disregarding the original directories used |
191 |
# in `.el' arguments. |
192 |
# |
193 |
# This script manages in such a way that all Emacs LISP files to |
194 |
# be compiled are made visible between themselves, in the event |
195 |
# they require or load-library one another. |
196 |
|
197 |
if test $# = 0; then |
198 |
exit 1 |
199 |
else |
200 |
if test -z "${EMACS}" || test "${EMACS}" = "t"; then |
201 |
# Value of "t" means we are running in a shell under Emacs. |
202 |
# Just assume Emacs is called "emacs". |
203 |
EMACS=emacs |
204 |
fi |
205 |
|
206 |
tempdir=elc.$$ |
207 |
mkdir ${tempdir} |
208 |
cp $* ${tempdir} |
209 |
cd ${tempdir} |
210 |
|
211 |
echo "(add-to-list 'load-path \"../\")" > script |
212 |
${EMACS} -batch -q --no-site-file --no-init-file -l script -f batch-byte-compile *.el |
213 |
mv *.elc .. |
214 |
|
215 |
cd .. |
216 |
rm -fr ${tempdir} |
217 |
fi |
218 |
} |