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

Contents of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.33 - (hide annotations) (download)
Mon Apr 11 20:02:06 2005 UTC (9 years, 5 months ago) by johnm
Branch: MAIN
Changes since 1.32: +49 -13 lines
merging pcmcia support into linux-mod, now awaiting pcmcia-cs changes and were good to go

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 johnm 1.33 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-mod.eclass,v 1.32 2005/03/28 09:27:31 johnm 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.33 EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile
86 johnm 1.1
87 johnm 1.26 SLOT="0"
88 johnm 1.1 DESCRIPTION="Based on the $ECLASS eclass"
89     DEPEND="virtual/linux-sources
90 johnm 1.11 sys-apps/sed
91 johnm 1.33 virtual/modutils
92     pcmcia? ( virtual/pcmcia )"
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    
106     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    
146     # 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    
167     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.1 set_kvobj() {
191     if kernel_is 2 6
192     then
193     KV_OBJ="ko"
194     else
195     KV_OBJ="o"
196     fi
197 johnm 1.26 # Do we really need to know this?
198     # Lets silence it.
199     # einfo "Using KV_OBJ=${KV_OBJ}"
200 johnm 1.1 }
201    
202 johnm 1.11 generate_modulesd() {
203     # This function will generate the neccessary modules.d file from the
204     # information contained in the modules exported parms
205 johnm 1.26
206     local currm_path currm t myIFS myVAR
207     local module_docs module_enabled module_aliases \
208     module_additions module_examples module_modinfo module_opts
209    
210     for currm_path in ${@}
211 johnm 1.11 do
212 johnm 1.26 currm=${currm_path//*\/}
213     currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]')
214    
215     module_docs="$(eval echo \${MODULESD_${currm}_DOCS})"
216     module_enabled="$(eval echo \${MODULESD_${currm}_ENABLED})"
217 johnm 1.30 module_aliases="$(eval echo \${#MODULESD_${currm/-/_}_ALIASES[*]})"
218     module_additions="$(eval echo \${#MODULESD_${currm/-/_}_ADDITIONS[*]})"
219     module_examples="$(eval echo \${#MODULESD_${currm/-/_}_EXAMPLES[*]})"
220 johnm 1.26
221 johnm 1.27 [[ ${module_aliases} -eq 0 ]] && unset module_aliases
222     [[ ${module_additions} -eq 0 ]] && unset module_additions
223     [[ ${module_examples} -eq 0 ]] && unset module_examples
224 johnm 1.26
225     # If we specify we dont want it, then lets exit, otherwise we assume
226     # that if its set, we do want it.
227     [[ ${module_enabled} == no ]] && return 0
228    
229     # unset any unwanted variables.
230     for t in ${!module_*}
231 johnm 1.11 do
232 johnm 1.26 [[ -z ${!t} ]] && unset ${t}
233 johnm 1.11 done
234    
235 johnm 1.26 [[ -z ${!module_*} ]] && return 0
236    
237     # OK so now if we have got this far, then we know we want to continue
238     # and generate the modules.d file.
239     module_modinfo="$(modinfo -p ${currm_path}.${KV_OBJ})"
240     module_config="${T}/modulesd-${currm}"
241    
242 johnm 1.11 ebegin "Preparing file for modules.d"
243 johnm 1.26 #-----------------------------------------------------------------------
244     echo "# modules.d configuration file for ${currm}" >> ${module_config}
245     #-----------------------------------------------------------------------
246     [[ -n ${module_docs} ]] && \
247     echo "# For more information please read:" >> ${module_config}
248     for t in ${module_docs}
249 johnm 1.11 do
250 johnm 1.26 echo "# ${t//*\/}" >> ${module_config}
251 johnm 1.11 done
252 johnm 1.26 echo >> ${module_config}
253 johnm 1.11
254 johnm 1.26 #-----------------------------------------------------------------------
255 johnm 1.27 if [[ ${module_aliases} -gt 0 ]]
256 johnm 1.11 then
257     echo "# Internal Aliases - Do not edit" >> ${module_config}
258     echo "# ------------------------------" >> ${module_config}
259 johnm 1.12
260 johnm 1.26 for((t=0; t<${module_aliases}; t++))
261 johnm 1.11 do
262 johnm 1.26 echo "alias $(eval echo \${MODULESD_${currm}_ALIASES[$t]})" \
263     >> ${module_config}
264 johnm 1.12 done
265 johnm 1.26 echo '' >> ${module_config}
266 johnm 1.11 fi
267    
268 johnm 1.26 #-----------------------------------------------------------------------
269     if [[ -n ${module_modinfo} ]]
270 johnm 1.11 then
271     echo >> ${module_config}
272     echo "# Configurable module parameters" >> ${module_config}
273     echo "# ------------------------------" >> ${module_config}
274 johnm 1.26 myIFS="${IFS}"
275 johnm 1.11 IFS="$(echo -en "\n\b")"
276 johnm 1.26
277     for t in ${module_modinfo}
278 johnm 1.11 do
279 johnm 1.26 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")"
280     if [[ -n ${myVAR} ]]
281 johnm 1.11 then
282 johnm 1.26 module_opts="${module_opts} ${t%%:*}:${myVAR}"
283 johnm 1.11 fi
284 johnm 1.26 echo -e "# ${t%%:*}:\t${t#*:}" >> ${module_config}
285     done
286     IFS="${myIFS}"
287     echo '' >> ${module_config}
288     fi
289    
290     #-----------------------------------------------------------------------
291     if [[ $(eval echo \${MODULESD_${currm}_ALIASES[0]}) == guess ]]
292     then
293     # So lets do some guesswork eh?
294     if [[ -n ${module_opts} ]]
295     then
296     echo "# For Example..." >> ${module_config}
297     echo "# --------------" >> ${module_config}
298     for t in ${module_opts}
299     do
300     echo "# options ${currm} ${t//:*}=${t//*:}" >> ${module_config}
301     done
302     echo '' >> ${module_config}
303     fi
304 johnm 1.27 elif [[ ${module_examples} -gt 0 ]]
305 johnm 1.26 then
306     echo "# For Example..." >> ${module_config}
307     echo "# --------------" >> ${module_config}
308     for((t=0; t<${module_examples}; t++))
309     do
310     echo "options $(eval echo \${MODULESD_${currm}_EXAMPLES[$t]})" \
311     >> ${module_config}
312 johnm 1.11 done
313 johnm 1.26 echo '' >> ${module_config}
314 johnm 1.11 fi
315 johnm 1.26
316     #-----------------------------------------------------------------------
317 johnm 1.27 if [[ ${module_additions} -gt 0 ]]
318 johnm 1.11 then
319 johnm 1.26 for((t=0; t<${module_additions}; t++))
320 johnm 1.11 do
321 johnm 1.26 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \
322     >> ${module_config}
323 johnm 1.11 done
324 johnm 1.26 echo '' >> ${module_config}
325 johnm 1.11 fi
326    
327 johnm 1.26 #-----------------------------------------------------------------------
328    
329 johnm 1.12 # then we install it
330 johnm 1.11 insinto /etc/modules.d
331 johnm 1.27 newins ${module_config} ${currm_path//*\/}
332    
333 johnm 1.12 # and install any documentation we might have.
334 johnm 1.26 [[ -n ${module_docs} ]] && dodoc ${module_docs}
335 johnm 1.11 done
336     eend 0
337 johnm 1.26 return 0
338 johnm 1.11 }
339    
340 johnm 1.1 display_postinst() {
341     # if we haven't determined the version yet, we need too.
342     get_version;
343    
344 johnm 1.10 local modulename moduledir sourcedir moduletemp file i
345 johnm 1.1
346     file=${ROOT}/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}
347     file=${file/\/\///}
348    
349 johnm 1.20 for i in ${MODULE_IGNORE}
350     do
351     MODULE_NAMES=${MODULE_NAMES//${i}(*}
352     done
353    
354 johnm 1.22 if [[ -n ${MODULE_NAMES} ]]
355     then
356     einfo "If you would like to load this module automatically upon boot"
357     einfo "please type the following as root:"
358     for i in ${MODULE_NAMES}
359 johnm 1.20 do
360 johnm 1.23 unset libdir srcdir objdir
361 johnm 1.22 for n in $(find_module_params ${i})
362     do
363     eval ${n/:*}=${n/*:/}
364     done
365     einfo " # echo \"${modulename}\" >> ${file}"
366 johnm 1.20 done
367 johnm 1.22 einfo
368     fi
369 johnm 1.1 }
370    
371 johnm 1.18 find_module_params() {
372     local matched_offset=0 matched_opts=0 test="${@}" temp_var result
373     local i=0 y=0 z=0
374    
375     for((i=0; i<=${#test}; i++))
376     do
377     case ${test:${i}:1} in
378     \() matched_offset[0]=${i};;
379     \:) matched_opts=$((${matched_opts} + 1));
380     matched_offset[${matched_opts}]="${i}";;
381     \)) matched_opts=$((${matched_opts} + 1));
382     matched_offset[${matched_opts}]="${i}";;
383     esac
384     done
385    
386     for((i=0; i<=${matched_opts}; i++))
387     do
388     # i = offset were working on
389     # y = last offset
390     # z = current offset - last offset
391     # temp_var = temporary name
392     case ${i} in
393     0) tempvar=${test:0:${matched_offset[0]}};;
394     *) y=$((${matched_offset[$((${i} - 1))]} + 1))
395     z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]}));
396     z=$((${z} - 1))
397     tempvar=${test:${y}:${z}};;
398     esac
399    
400     case ${i} in
401     0) result="${result} modulename:${tempvar}";;
402     1) result="${result} libdir:${tempvar}";;
403     2) result="${result} srcdir:${tempvar}";;
404     3) result="${result} objdir:${tempvar}";;
405     esac
406     done
407    
408     echo ${result}
409     }
410    
411 johnm 1.1 # default ebuild functions
412     # --------------------------------
413    
414     linux-mod_pkg_setup() {
415 johnm 1.6 linux-info_pkg_setup;
416     check_kernel_built;
417 johnm 1.1 check_modules_supported;
418     set_kvobj;
419     }
420    
421     linux-mod_src_compile() {
422 johnm 1.26 local modulename libdir srcdir objdir i n myARCH="${ARCH}"
423 johnm 1.21 unset ARCH
424 johnm 1.26
425 johnm 1.16 BUILD_TARGETS=${BUILD_TARGETS:-clean module}
426 johnm 1.20
427     for i in ${MODULE_IGNORE}
428     do
429     MODULE_NAMES=${MODULE_NAMES//${i}(*}
430     done
431 johnm 1.1
432 johnm 1.9 for i in ${MODULE_NAMES}
433 johnm 1.1 do
434 johnm 1.23 unset libdir srcdir objdir
435 johnm 1.18 for n in $(find_module_params ${i})
436     do
437     eval ${n/:*}=${n/*:/}
438     done
439     libdir=${libdir:-misc}
440     srcdir=${srcdir:-${S}}
441     objdir=${objdir:-${srcdir}}
442 johnm 1.10
443 johnm 1.18 if [ ! -f "${srcdir}/.built" ];
444 johnm 1.16 then
445 johnm 1.18 cd ${srcdir}
446 johnm 1.16 einfo "Preparing ${modulename} module"
447 johnm 1.22 if [[ -n ${ECONF_PARAMS} ]]
448     then
449     econf ${ECONF_PARAMS} || \
450     die "Unable to run econf ${ECONF_PARAMS}"
451     fi
452    
453 johnm 1.21 emake ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS} \
454 johnm 1.18 || die "Unable to make \
455     ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS}."
456     touch ${srcdir}/.built
457 johnm 1.16 cd ${OLDPWD}
458     fi
459 johnm 1.1 done
460 johnm 1.26
461     ARCH="${myARCH}"
462 johnm 1.1 }
463    
464     linux-mod_src_install() {
465 johnm 1.18 local modulename libdir srcdir objdir i n
466 johnm 1.20
467     for i in ${MODULE_IGNORE}
468     do
469     MODULE_NAMES=${MODULE_NAMES//${i}(*}
470     done
471 johnm 1.1
472 johnm 1.9 for i in ${MODULE_NAMES}
473 johnm 1.1 do
474 johnm 1.23 unset libdir srcdir objdir
475 johnm 1.18 for n in $(find_module_params ${i})
476     do
477     eval ${n/:*}=${n/*:/}
478     done
479     libdir=${libdir:-misc}
480     srcdir=${srcdir:-${S}}
481     objdir=${objdir:-${srcdir}}
482 johnm 1.1
483     einfo "Installing ${modulename} module"
484 johnm 1.18 cd ${objdir}
485 johnm 1.26 insinto ${ROOT}lib/modules/${KV_FULL}/${libdir}
486 johnm 1.1 doins ${modulename}.${KV_OBJ}
487 johnm 1.16 cd ${OLDPWD}
488 johnm 1.11
489 johnm 1.26 generate_modulesd ${objdir}/${modulename}
490 johnm 1.1 done
491     }
492    
493     linux-mod_pkg_postinst() {
494     update_depmod;
495 johnm 1.3 update_modules;
496 johnm 1.1 display_postinst;
497     }

  ViewVC Help
Powered by ViewVC 1.1.20