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

Contents of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.49 - (hide annotations) (download)
Mon Jul 11 15:08:06 2005 UTC (9 years, 5 months ago) by swegener
Branch: MAIN
Changes since 1.48: +27 -27 lines
QA: Apply whitespace checks from repoman to eclasses.

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

  ViewVC Help
Powered by ViewVC 1.1.20