/[gentoo-x86]/eclass/linux-mod.eclass
Gentoo

Contents of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.40 - (hide annotations) (download)
Tue Jul 5 11:37:03 2005 UTC (9 years ago) by johnm
Branch: MAIN
Changes since 1.39: +12 -8 lines
changing moduledb dir to correspond with FHS and closes bug #97796

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 johnm 1.40 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-mod.eclass,v 1.39 2005/06/30 08:58:55 brix Exp $
4 johnm 1.1
5 johnm 1.10 # Description: This eclass is used to interface with linux-info in such a way
6     # to provide the functionality required and initial functions
7     # required to install external modules against a kernel source
8     # tree.
9     #
10     # Maintainer: John Mylchreest <johnm@gentoo.org>
11     # Copyright 2004 Gentoo Linux
12     #
13     # Please direct your bugs to the current eclass maintainer :)
14    
15     # A Couple of env vars are available to effect usage of this eclass
16     # These are as follows:
17     #
18 johnm 1.26 # Env Var Option Default Description
19     # KERNEL_DIR <string> /usr/src/linux The directory containing kernel
20     # the target kernel sources.
21     # ECONF_PARAMS <string> The parameters to pass to econf.
22     # If this is not set, then econf
23     # isn't run.
24     # BUILD_PARAMS <string> The parameters to pass to emake.
25     # BUILD_TARGETS <string> clean modules The build targets to pass to
26     # make.
27     # MODULE_NAMES <string> This is the modules which are
28     # to be built automatically using
29     # the default pkg_compile/install.
30     # They are explained properly
31     # below. It will only make
32     # BUILD_TARGETS once in any
33     # directory.
34 johnm 1.10
35     # MODULE_NAMES - Detailed Overview
36     #
37     # The structure of each MODULE_NAMES entry is as follows:
38 johnm 1.26 # modulename(libdir:srcdir:objdir)
39 johnm 1.10 # for example:
40 johnm 1.26 # MODULE_NAMES="module_pci(pci:${S}/pci:${S}) module_usb(usb:${S}/usb:${S})"
41 johnm 1.10 #
42     # what this would do is
43     # cd ${S}/pci
44     # make ${BUILD_PARAMS} ${BUILD_TARGETS}
45 johnm 1.26 # cd ${S}
46 johnm 1.10 # insinto /lib/modules/${KV_FULL}/pci
47     # doins module_pci.${KV_OBJ}
48     #
49     # cd ${S}/usb
50     # make ${BUILD_PARAMS} ${BUILD_TARGETS}
51 johnm 1.26 # cd ${S}
52 johnm 1.10 # insinto /lib/modules/${KV_FULL}/usb
53     # doins module_usb.${KV_OBJ}
54     #
55 johnm 1.26 # if the srcdir isnt specified, it assumes ${S}
56     # if the libdir isnt specified, it assumes misc.
57     # if the objdir isnt specified, it assumes srcdir
58    
59     # There is also support for automatyed modules.d file generation.
60     # This can be explicitly enabled by setting any of the following variables.
61     #
62     #
63     # MODULESD_${modulename}_ENABLED This enables the modules.d file
64     # generation even if we dont
65     # specify any additional info.
66     # MODULESD_${modulename}_EXAMPLES This is a bash array containing
67     # a list of examples which should
68     # be used. If you want us to try and
69     # take a guess. Set this to "guess"
70     # MODULESD_${modulename}_ALIASES This is a bash array containing
71     # a list of associated aliases.
72     # MODULESD_${modulename}_ADDITIONS This is a bash array containing
73     # A list of additional things to
74     # add to the bottom of the file.
75     # This can be absolutely anything.
76     # Each entry is a new line.
77     # MODULES_${modulename}_DOCS This is a string list which contains
78     # the full path to any associated
79     # documents for $modulename
80    
81 johnm 1.1
82     inherit linux-info
83     ECLASS=linux-mod
84     INHERITED="$INHERITED $ECLASS"
85 johnm 1.37 EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile pkg_postrm
86 johnm 1.1
87 brix 1.38 IUSE="${IUSE}"
88 johnm 1.26 SLOT="0"
89 johnm 1.1 DESCRIPTION="Based on the $ECLASS eclass"
90     DEPEND="virtual/linux-sources
91 johnm 1.11 sys-apps/sed
92 johnm 1.33 virtual/modutils
93 brix 1.39 pcmcia? ( virtual/pcmcia )"
94 johnm 1.26
95 johnm 1.1 # eclass utilities
96     # ----------------------------------
97    
98 johnm 1.33 unpack_pcmcia_sources() {
99     # So while the two eclasses exist side-by-side and also the ebuilds inherit
100     # both we need to check for PCMCIA_SOURCE_DIR, and if we find it, then we
101     # bail out and assume pcmcia.eclass is working on it.
102     [[ -n ${PCMCIA_SOURCE_DIR} ]] && return 1
103    
104     if [[ -f "${1}" ]]; then
105     PCMCIA_SOURCE_DIR="${WORKDIR}/pcmcia-cs/"
106    
107     ebegin "Decompressing pcmcia-cs sources"
108     mkdir -p ${PCMCIA_SOURCE_DIR}
109     tar -xjf ${1} -C ${PCMCIA_SOURCE_DIR}
110     eend $?
111    
112     if [[ -f ${PCMCIA_SOURCE_DIR}/pcmcia-cs-version ]]; then
113     PCMCIA_VERSION=$(cat ${PCMCIA_SOURCE_DIR}/pcmcia-cs-version)
114     einfo "Found pcmcia-cs-${PCMCIA_VERSION}"
115     fi
116     fi
117     }
118    
119     # Dummy function for compatibility.
120     pcmcia_configure() { return 0; }
121    
122     pcmcia_src_unpack() {
123     local pcmcia_tbz="${ROOT}/usr/src/pcmcia-cs/pcmcia-cs-build-env.tbz2"
124    
125     # if the kernel has pcmcia support built in, then we just ignore all this.
126     if linux_chkconfig_present PCMCIA; then
127     einfo "Kernel based PCMCIA support has been detected."
128     else
129     if kernel_is 2 4; then
130     unpack_pcmcia_sources ${pcmcia_tbz};
131     else
132     einfo "We have detected that you are running a 2.6 kernel"
133     einfo "but you are not using the built-in PCMCIA support."
134     einfo "We will assume you know what you are doing, but please"
135     einfo "consider using the built in PCMCIA support instead."
136     sleep 10
137    
138     unpack_pcmcia_sources ${pcmcia_tbz};
139     fi
140     fi
141     }
142    
143 johnm 1.1 use_m() {
144     # if we haven't determined the version yet, we need too.
145     get_version;
146    
147     # if the kernel version is greater than 2.6.6 then we should use
148 johnm 1.8 # M= instead of SUBDIRS=
149 johnm 1.1 [ ${KV_MAJOR} -eq 2 -a ${KV_MINOR} -gt 5 -a ${KV_PATCH} -gt 5 ] && \
150     return 0 || return 1
151     }
152    
153     convert_to_m() {
154     if use_m
155     then
156 johnm 1.32 [ ! -f "${1}" ] && \
157     die "convert_to_m() requires a filename as an argument"
158 johnm 1.8 ebegin "Converting ${1/${WORKDIR}\//} to use M= instead of SUBDIRS="
159 johnm 1.1 sed -i 's:SUBDIRS=:M=:g' ${1}
160     eend $?
161     fi
162     }
163    
164     update_depmod() {
165     # if we haven't determined the version yet, we need too.
166     get_version;
167    
168     ebegin "Updating module dependencies for ${KV_FULL}"
169 johnm 1.5 if [ -r ${KV_OUT_DIR}/System.map ]
170 johnm 1.1 then
171 johnm 1.5 depmod -ae -F ${KV_OUT_DIR}/System.map -b ${ROOT} -r ${KV_FULL}
172 johnm 1.18 eend $?
173 johnm 1.1 else
174     ewarn
175 johnm 1.5 ewarn "${KV_OUT_DIR}/System.map not found."
176 johnm 1.1 ewarn "You must manually update the kernel module dependencies using depmod."
177 johnm 1.18 eend 1
178 johnm 1.1 ewarn
179     fi
180     }
181    
182 johnm 1.3 update_modules() {
183 kingtaco 1.31 if [ -x /sbin/modules-update ] && \
184     grep -v -e "^#" -e "^$" ${D}/etc/modules.d/* >/dev/null 2>&1; then
185 johnm 1.3 ebegin "Updating modules.conf"
186     /sbin/modules-update
187     eend $?
188     fi
189     }
190    
191 johnm 1.37 update_moduledb() {
192 johnm 1.40 local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/
193    
194     if [[ ! -f ${MODULEDB_DIR}/moduledb ]]; then
195     [[ ! -d ${MODULEDB_DIR} ]] && mkdir -p ${MODULEDB_DIR}
196     touch ${MODULEDB_DIR}/moduledb
197 johnm 1.37 fi
198 johnm 1.40 if [[ -z $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then
199 johnm 1.37 einfo "Adding module to moduledb."
200 johnm 1.40 echo "a:1:${CATEGORY}/${PN}-${PVR}" >> ${MODULEDB_DIR}/moduledb
201 johnm 1.37 fi
202     }
203    
204     remove_moduledb() {
205 johnm 1.40 local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/
206    
207     if [[ -n $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then
208 johnm 1.37 einfo "Removing ${CATEGORY}/${PN}-${PVR} from moduledb."
209 johnm 1.40 sed -ie "/.*${CATEGORY}\/${P}.*/d" ${MODULEDB_DIR}/moduledb
210 johnm 1.37 fi
211     }
212    
213 johnm 1.1 set_kvobj() {
214     if kernel_is 2 6
215     then
216     KV_OBJ="ko"
217     else
218     KV_OBJ="o"
219     fi
220 johnm 1.26 # Do we really need to know this?
221     # Lets silence it.
222     # einfo "Using KV_OBJ=${KV_OBJ}"
223 johnm 1.1 }
224    
225 johnm 1.11 generate_modulesd() {
226     # This function will generate the neccessary modules.d file from the
227     # information contained in the modules exported parms
228 johnm 1.26
229     local currm_path currm t myIFS myVAR
230     local module_docs module_enabled module_aliases \
231     module_additions module_examples module_modinfo module_opts
232    
233     for currm_path in ${@}
234 johnm 1.11 do
235 johnm 1.26 currm=${currm_path//*\/}
236     currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]')
237    
238     module_docs="$(eval echo \${MODULESD_${currm}_DOCS})"
239     module_enabled="$(eval echo \${MODULESD_${currm}_ENABLED})"
240 johnm 1.30 module_aliases="$(eval echo \${#MODULESD_${currm/-/_}_ALIASES[*]})"
241     module_additions="$(eval echo \${#MODULESD_${currm/-/_}_ADDITIONS[*]})"
242     module_examples="$(eval echo \${#MODULESD_${currm/-/_}_EXAMPLES[*]})"
243 johnm 1.26
244 johnm 1.27 [[ ${module_aliases} -eq 0 ]] && unset module_aliases
245     [[ ${module_additions} -eq 0 ]] && unset module_additions
246     [[ ${module_examples} -eq 0 ]] && unset module_examples
247 johnm 1.26
248     # If we specify we dont want it, then lets exit, otherwise we assume
249     # that if its set, we do want it.
250     [[ ${module_enabled} == no ]] && return 0
251    
252     # unset any unwanted variables.
253     for t in ${!module_*}
254 johnm 1.11 do
255 johnm 1.26 [[ -z ${!t} ]] && unset ${t}
256 johnm 1.11 done
257    
258 johnm 1.26 [[ -z ${!module_*} ]] && return 0
259    
260     # OK so now if we have got this far, then we know we want to continue
261     # and generate the modules.d file.
262     module_modinfo="$(modinfo -p ${currm_path}.${KV_OBJ})"
263     module_config="${T}/modulesd-${currm}"
264    
265 johnm 1.11 ebegin "Preparing file for modules.d"
266 johnm 1.26 #-----------------------------------------------------------------------
267     echo "# modules.d configuration file for ${currm}" >> ${module_config}
268     #-----------------------------------------------------------------------
269     [[ -n ${module_docs} ]] && \
270     echo "# For more information please read:" >> ${module_config}
271     for t in ${module_docs}
272 johnm 1.11 do
273 johnm 1.26 echo "# ${t//*\/}" >> ${module_config}
274 johnm 1.11 done
275 johnm 1.26 echo >> ${module_config}
276 johnm 1.11
277 johnm 1.26 #-----------------------------------------------------------------------
278 johnm 1.27 if [[ ${module_aliases} -gt 0 ]]
279 johnm 1.11 then
280     echo "# Internal Aliases - Do not edit" >> ${module_config}
281     echo "# ------------------------------" >> ${module_config}
282 johnm 1.12
283 johnm 1.26 for((t=0; t<${module_aliases}; t++))
284 johnm 1.11 do
285 johnm 1.26 echo "alias $(eval echo \${MODULESD_${currm}_ALIASES[$t]})" \
286     >> ${module_config}
287 johnm 1.12 done
288 johnm 1.26 echo '' >> ${module_config}
289 johnm 1.11 fi
290    
291 johnm 1.26 #-----------------------------------------------------------------------
292     if [[ -n ${module_modinfo} ]]
293 johnm 1.11 then
294     echo >> ${module_config}
295     echo "# Configurable module parameters" >> ${module_config}
296     echo "# ------------------------------" >> ${module_config}
297 johnm 1.26 myIFS="${IFS}"
298 johnm 1.11 IFS="$(echo -en "\n\b")"
299 johnm 1.26
300     for t in ${module_modinfo}
301 johnm 1.11 do
302 johnm 1.26 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")"
303     if [[ -n ${myVAR} ]]
304 johnm 1.11 then
305 johnm 1.26 module_opts="${module_opts} ${t%%:*}:${myVAR}"
306 johnm 1.11 fi
307 johnm 1.26 echo -e "# ${t%%:*}:\t${t#*:}" >> ${module_config}
308     done
309     IFS="${myIFS}"
310     echo '' >> ${module_config}
311     fi
312    
313     #-----------------------------------------------------------------------
314     if [[ $(eval echo \${MODULESD_${currm}_ALIASES[0]}) == guess ]]
315     then
316     # So lets do some guesswork eh?
317     if [[ -n ${module_opts} ]]
318     then
319     echo "# For Example..." >> ${module_config}
320     echo "# --------------" >> ${module_config}
321     for t in ${module_opts}
322     do
323     echo "# options ${currm} ${t//:*}=${t//*:}" >> ${module_config}
324     done
325     echo '' >> ${module_config}
326     fi
327 johnm 1.27 elif [[ ${module_examples} -gt 0 ]]
328 johnm 1.26 then
329     echo "# For Example..." >> ${module_config}
330     echo "# --------------" >> ${module_config}
331     for((t=0; t<${module_examples}; t++))
332     do
333     echo "options $(eval echo \${MODULESD_${currm}_EXAMPLES[$t]})" \
334     >> ${module_config}
335 johnm 1.11 done
336 johnm 1.26 echo '' >> ${module_config}
337 johnm 1.11 fi
338 johnm 1.26
339     #-----------------------------------------------------------------------
340 johnm 1.27 if [[ ${module_additions} -gt 0 ]]
341 johnm 1.11 then
342 johnm 1.26 for((t=0; t<${module_additions}; t++))
343 johnm 1.11 do
344 johnm 1.26 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \
345     >> ${module_config}
346 johnm 1.11 done
347 johnm 1.26 echo '' >> ${module_config}
348 johnm 1.11 fi
349    
350 johnm 1.26 #-----------------------------------------------------------------------
351    
352 johnm 1.12 # then we install it
353 johnm 1.11 insinto /etc/modules.d
354 johnm 1.27 newins ${module_config} ${currm_path//*\/}
355    
356 johnm 1.12 # and install any documentation we might have.
357 johnm 1.26 [[ -n ${module_docs} ]] && dodoc ${module_docs}
358 johnm 1.11 done
359     eend 0
360 johnm 1.26 return 0
361 johnm 1.11 }
362    
363 johnm 1.1 display_postinst() {
364     # if we haven't determined the version yet, we need too.
365     get_version;
366    
367 johnm 1.10 local modulename moduledir sourcedir moduletemp file i
368 johnm 1.1
369     file=${ROOT}/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}
370     file=${file/\/\///}
371    
372 johnm 1.20 for i in ${MODULE_IGNORE}
373     do
374     MODULE_NAMES=${MODULE_NAMES//${i}(*}
375     done
376    
377 johnm 1.22 if [[ -n ${MODULE_NAMES} ]]
378     then
379     einfo "If you would like to load this module automatically upon boot"
380     einfo "please type the following as root:"
381     for i in ${MODULE_NAMES}
382 johnm 1.20 do
383 johnm 1.23 unset libdir srcdir objdir
384 johnm 1.22 for n in $(find_module_params ${i})
385     do
386     eval ${n/:*}=${n/*:/}
387     done
388     einfo " # echo \"${modulename}\" >> ${file}"
389 johnm 1.20 done
390 johnm 1.22 einfo
391     fi
392 johnm 1.1 }
393    
394 johnm 1.18 find_module_params() {
395     local matched_offset=0 matched_opts=0 test="${@}" temp_var result
396     local i=0 y=0 z=0
397    
398     for((i=0; i<=${#test}; i++))
399     do
400     case ${test:${i}:1} in
401     \() matched_offset[0]=${i};;
402     \:) matched_opts=$((${matched_opts} + 1));
403     matched_offset[${matched_opts}]="${i}";;
404     \)) matched_opts=$((${matched_opts} + 1));
405     matched_offset[${matched_opts}]="${i}";;
406     esac
407     done
408    
409     for((i=0; i<=${matched_opts}; i++))
410     do
411     # i = offset were working on
412     # y = last offset
413     # z = current offset - last offset
414     # temp_var = temporary name
415     case ${i} in
416     0) tempvar=${test:0:${matched_offset[0]}};;
417     *) y=$((${matched_offset[$((${i} - 1))]} + 1))
418     z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]}));
419     z=$((${z} - 1))
420     tempvar=${test:${y}:${z}};;
421     esac
422    
423     case ${i} in
424     0) result="${result} modulename:${tempvar}";;
425     1) result="${result} libdir:${tempvar}";;
426     2) result="${result} srcdir:${tempvar}";;
427     3) result="${result} objdir:${tempvar}";;
428     esac
429     done
430    
431     echo ${result}
432     }
433    
434 johnm 1.1 # default ebuild functions
435     # --------------------------------
436    
437     linux-mod_pkg_setup() {
438 johnm 1.6 linux-info_pkg_setup;
439     check_kernel_built;
440 johnm 1.1 check_modules_supported;
441     set_kvobj;
442     }
443    
444     linux-mod_src_compile() {
445 johnm 1.26 local modulename libdir srcdir objdir i n myARCH="${ARCH}"
446 johnm 1.21 unset ARCH
447 johnm 1.26
448 johnm 1.16 BUILD_TARGETS=${BUILD_TARGETS:-clean module}
449 johnm 1.20
450     for i in ${MODULE_IGNORE}
451     do
452     MODULE_NAMES=${MODULE_NAMES//${i}(*}
453     done
454 johnm 1.1
455 johnm 1.9 for i in ${MODULE_NAMES}
456 johnm 1.1 do
457 johnm 1.23 unset libdir srcdir objdir
458 johnm 1.18 for n in $(find_module_params ${i})
459     do
460     eval ${n/:*}=${n/*:/}
461     done
462     libdir=${libdir:-misc}
463     srcdir=${srcdir:-${S}}
464     objdir=${objdir:-${srcdir}}
465 johnm 1.10
466 johnm 1.18 if [ ! -f "${srcdir}/.built" ];
467 johnm 1.16 then
468 johnm 1.18 cd ${srcdir}
469 johnm 1.16 einfo "Preparing ${modulename} module"
470 johnm 1.22 if [[ -n ${ECONF_PARAMS} ]]
471     then
472     econf ${ECONF_PARAMS} || \
473     die "Unable to run econf ${ECONF_PARAMS}"
474     fi
475    
476 johnm 1.21 emake ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS} \
477 johnm 1.18 || die "Unable to make \
478     ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS}."
479     touch ${srcdir}/.built
480 johnm 1.16 cd ${OLDPWD}
481     fi
482 johnm 1.1 done
483 johnm 1.26
484     ARCH="${myARCH}"
485 johnm 1.1 }
486    
487     linux-mod_src_install() {
488 johnm 1.18 local modulename libdir srcdir objdir i n
489 johnm 1.20
490     for i in ${MODULE_IGNORE}
491     do
492     MODULE_NAMES=${MODULE_NAMES//${i}(*}
493     done
494 johnm 1.1
495 johnm 1.9 for i in ${MODULE_NAMES}
496 johnm 1.1 do
497 johnm 1.23 unset libdir srcdir objdir
498 johnm 1.18 for n in $(find_module_params ${i})
499     do
500     eval ${n/:*}=${n/*:/}
501     done
502     libdir=${libdir:-misc}
503     srcdir=${srcdir:-${S}}
504     objdir=${objdir:-${srcdir}}
505 johnm 1.1
506     einfo "Installing ${modulename} module"
507 johnm 1.18 cd ${objdir}
508 johnm 1.26 insinto ${ROOT}lib/modules/${KV_FULL}/${libdir}
509 johnm 1.1 doins ${modulename}.${KV_OBJ}
510 johnm 1.16 cd ${OLDPWD}
511 johnm 1.11
512 johnm 1.26 generate_modulesd ${objdir}/${modulename}
513 johnm 1.1 done
514     }
515    
516     linux-mod_pkg_postinst() {
517     update_depmod;
518 johnm 1.3 update_modules;
519 johnm 1.37 update_moduledb;
520 johnm 1.1 display_postinst;
521     }
522 johnm 1.37
523     linux-mod_pkg_postrm() {
524     remove_moduledb;
525     }

  ViewVC Help
Powered by ViewVC 1.1.20