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

Contents of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (download) (vendor branch)
Wed Nov 30 09:59:38 2005 UTC (9 years, 9 months ago) by chriswhite
Changes since 1.1: +468 -70 lines
*** empty log message ***

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

  ViewVC Help
Powered by ViewVC 1.1.20