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

Contents of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.99 - (hide annotations) (download)
Wed Mar 31 19:33:16 2010 UTC (4 years, 8 months ago) by robbat2
Branch: MAIN
Changes since 1.98: +4 -5 lines
Bug #312075: The ~ was getting expanded to the optional stuff got duplicated and that sucked, giving a bad warning sometimes.

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 robbat2 1.99 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-mod.eclass,v 1.98 2010/01/17 04:00:07 robbat2 Exp $
4 johnm 1.1
5 phreak 1.75 # Author(s): John Mylchreest <johnm@gentoo.org>,
6     # Stefan Schweizer <genstef@gentoo.org>
7     # Maintainer: kernel-misc@gentoo.org
8 johnm 1.10 #
9     # Please direct your bugs to the current eclass maintainer :)
10    
11 dsd 1.86 # @ECLASS: linux-mod.eclass
12     # @MAINTAINER:
13     # kernel-misc@gentoo.org
14     # @BLURB: It provides the functionality required to install external modules against a kernel source tree.
15     # @DESCRIPTION:
16     # This eclass is used to interface with linux-info.eclass in such a way
17     # to provide the functionality and initial functions
18     # required to install external modules against a kernel source
19     # tree.
20    
21 johnm 1.10 # A Couple of env vars are available to effect usage of this eclass
22     # These are as follows:
23    
24 dsd 1.86 # @ECLASS-VARIABLE: KERNEL_DIR
25     # @DESCRIPTION:
26     # A string containing the directory of the target kernel sources. The default value is
27     # "/usr/src/linux"
28    
29     # @ECLASS-VARIABLE: ECONF_PARAMS
30     # @DESCRIPTION:
31     # It's a string containing the parameters to pass to econf.
32     # If this is not set, then econf isn't run.
33    
34     # @ECLASS-VARIABLE: BUILD_PARAMS
35     # @DESCRIPTION:
36     # It's a string with the parameters to pass to emake.
37    
38     # @ECLASS-VARIABLE: BUILD_TARGETS
39     # @DESCRIPTION:
40     # It's a string with the build targets to pass to make. The default value is "clean modules"
41    
42     # @ECLASS-VARIABLE: MODULE_NAMES
43     # @DESCRIPTION:
44     # It's a string containing the modules to be built automatically using the default
45     # src_compile/src_install. It will only make ${BUILD_TARGETS} once in any directory.
46 swegener 1.49 #
47 johnm 1.10 # The structure of each MODULE_NAMES entry is as follows:
48 dsd 1.85 #
49 dsd 1.86 # modulename(libdir:srcdir:objdir)
50     #
51     # where:
52     #
53     # modulename = name of the module file excluding the .ko
54 dsd 1.91 # libdir = place in system modules directory where module is installed (by default it's misc)
55     # srcdir = place for ebuild to cd to before running make (by default it's ${S})
56     # objdir = place the .ko and objects are located after make runs (by default it's set to srcdir)
57 dsd 1.85 #
58     # To get an idea of how these variables are used, here's a few lines
59     # of code from around line 540 in this eclass:
60     #
61     # einfo "Installing ${modulename} module"
62     # cd ${objdir} || die "${objdir} does not exist"
63     # insinto /lib/modules/${KV_FULL}/${libdir}
64     # doins ${modulename}.${KV_OBJ} || die "doins ${modulename}.${KV_OBJ} failed"
65     #
66 dsd 1.86 # For example:
67     # MODULE_NAMES="module_pci(pci:${S}/pci:${S}) module_usb(usb:${S}/usb:${S})"
68 swegener 1.49 #
69 johnm 1.10 # what this would do is
70 dsd 1.86 #
71     # cd "${S}"/pci
72     # make ${BUILD_PARAMS} ${BUILD_TARGETS}
73     # cd "${S}"
74     # insinto /lib/modules/${KV_FULL}/pci
75     # doins module_pci.${KV_OBJ}
76     #
77     # cd "${S}"/usb
78     # make ${BUILD_PARAMS} ${BUILD_TARGETS}
79     # cd "${S}"
80     # insinto /lib/modules/${KV_FULL}/usb
81     # doins module_usb.${KV_OBJ}
82 johnm 1.26
83 genstef 1.80 # There is also support for automated modprobe.d/modules.d(2.4) file generation.
84 johnm 1.26 # This can be explicitly enabled by setting any of the following variables.
85 dsd 1.86
86     # @ECLASS-VARIABLE: MODULESD_<modulename>_ENABLED
87     # @DESCRIPTION:
88     # This is used to disable the modprobe.d/modules.d file generation otherwise the file will be
89     # always generated (unless no MODULESD_<modulename>_* variable is provided). Set to "no" to disable
90     # the generation of the file and the installation of the documentation.
91    
92     # @ECLASS-VARIABLE: MODULESD_<modulename>_EXAMPLES
93     # @DESCRIPTION:
94     # This is a bash array containing a list of examples which should
95     # be used. If you want us to try and take a guess set this to "guess".
96     #
97     # For each array_component it's added an options line in the modprobe.d/modules.d file
98     #
99     # options array_component
100     #
101     # where array_component is "<modulename> options" (see modprobe.conf(5))
102    
103     # @ECLASS-VARIABLE: MODULESD_<modulename>_ALIASES
104     # @DESCRIPTION:
105     # This is a bash array containing a list of associated aliases.
106     #
107     # For each array_component it's added an alias line in the modprobe.d/modules.d file
108 johnm 1.26 #
109 dsd 1.86 # alias array_component
110 johnm 1.26 #
111 dsd 1.86 # where array_component is "wildcard <modulename>" (see modprobe.conf(5))
112    
113     # @ECLASS-VARIABLE: MODULESD_<modulename>_ADDITIONS
114     # @DESCRIPTION:
115     # This is a bash array containing a list of additional things to
116     # add to the bottom of the file. This can be absolutely anything.
117     # Each entry is a new line.
118    
119     # @ECLASS-VARIABLE: MODULESD_<modulename>_DOCS
120     # @DESCRIPTION:
121     # This is a string list which contains the full path to any associated
122     # documents for <modulename>. These files are installed in the live tree.
123    
124     # @ECLASS-VARIABLE: KV_OBJ
125     # @DESCRIPTION:
126     # It's a read-only variable. It contains the extension of the kernel modules.
127 johnm 1.26
128 betelgeuse 1.61 # The order of these is important as both of linux-info and eutils contain
129     # set_arch_to_kernel and set_arch_to_portage functions and the ones in eutils
130     # are deprecated in favor of the ones in linux-info.
131     # See http://bugs.gentoo.org/show_bug.cgi?id=127506
132 johnm 1.1
133 blubb 1.62 inherit eutils linux-info multilib
134 genstef 1.65 EXPORT_FUNCTIONS pkg_setup pkg_preinst pkg_postinst src_install src_compile pkg_postrm
135 johnm 1.1
136 genstef 1.67 IUSE="kernel_linux"
137 johnm 1.26 SLOT="0"
138 johnm 1.1 DESCRIPTION="Based on the $ECLASS eclass"
139 genstef 1.67 RDEPEND="kernel_linux? ( virtual/modutils )"
140 genstef 1.65 DEPEND="${RDEPEND}
141 robbat2 1.95 sys-apps/sed
142     kernel_linux? ( virtual/linux-sources )"
143 johnm 1.26
144 johnm 1.1 # eclass utilities
145     # ----------------------------------
146    
147 johnm 1.53 check_vermagic() {
148 genstef 1.69 debug-print-function ${FUNCNAME} $*
149    
150 johnm 1.53 local curr_gcc_ver=$(gcc -dumpversion)
151     local tmpfile old_chost old_gcc_ver result=0
152    
153 robbat2 1.96 tmpfile=`find "${KV_DIR}/" -iname "*.o.cmd" -exec grep usr/lib/gcc {} \; -quit`
154 johnm 1.53 tmpfile=${tmpfile//*usr/lib}
155     tmpfile=${tmpfile//\/include*}
156     old_chost=${tmpfile//*gcc\/}
157     old_chost=${old_chost//\/*}
158     old_gcc_ver=${tmpfile//*\/}
159    
160 johnm 1.54 if [[ -z ${old_gcc_ver} || -z ${old_chost} ]]; then
161     ewarn ""
162     ewarn "Unable to detect what version of GCC was used to compile"
163     ewarn "the kernel. Build will continue, but you may experience problems."
164     elif [[ ${curr_gcc_ver} != ${old_gcc_ver} ]]; then
165 johnm 1.53 ewarn ""
166     ewarn "The version of GCC you are using (${curr_gcc_ver}) does"
167     ewarn "not match the version of GCC used to compile the"
168     ewarn "kernel (${old_gcc_ver})."
169     result=1
170     elif [[ ${CHOST} != ${old_chost} ]]; then
171     ewarn ""
172     ewarn "The current CHOST (${CHOST}) does not match the chost"
173     ewarn "used when compiling the kernel (${old_chost})."
174     result=1
175     fi
176    
177     if [[ ${result} -gt 0 ]]; then
178     ewarn ""
179     ewarn "Build will not continue, because you will experience problems."
180     ewarn "To fix this either change the version of GCC you wish to use"
181     ewarn "to match the kernel, or recompile the kernel first."
182     die "GCC Version Mismatch."
183     fi
184     }
185    
186 dsd 1.86 # @FUNCTION: use_m
187     # @RETURN: true or false
188     # @DESCRIPTION:
189     # It checks if the kernel version is greater than 2.6.5.
190 johnm 1.1 use_m() {
191 genstef 1.69 debug-print-function ${FUNCNAME} $*
192    
193 johnm 1.1 # if we haven't determined the version yet, we need too.
194     get_version;
195 swegener 1.49
196 johnm 1.1 # if the kernel version is greater than 2.6.6 then we should use
197 johnm 1.8 # M= instead of SUBDIRS=
198 johnm 1.1 [ ${KV_MAJOR} -eq 2 -a ${KV_MINOR} -gt 5 -a ${KV_PATCH} -gt 5 ] && \
199     return 0 || return 1
200     }
201    
202 dsd 1.86 # @FUNCTION: convert_to_m
203     # @USAGE: /path/to/the/file
204     # @DESCRIPTION:
205     # It converts a file (e.g. a makefile) to use M= instead of SUBDIRS=
206 johnm 1.1 convert_to_m() {
207 genstef 1.69 debug-print-function ${FUNCNAME} $*
208    
209 johnm 1.1 if use_m
210     then
211 johnm 1.32 [ ! -f "${1}" ] && \
212     die "convert_to_m() requires a filename as an argument"
213 johnm 1.8 ebegin "Converting ${1/${WORKDIR}\//} to use M= instead of SUBDIRS="
214 robbat2 1.96 sed -i 's:SUBDIRS=:M=:g' "${1}"
215 johnm 1.1 eend $?
216     fi
217     }
218    
219 dsd 1.86 # internal function
220     #
221     # FUNCTION: update_depmod
222     # DESCRIPTION:
223     # It updates the modules.dep file for the current kernel.
224 johnm 1.1 update_depmod() {
225 genstef 1.69 debug-print-function ${FUNCNAME} $*
226    
227 johnm 1.1 # if we haven't determined the version yet, we need too.
228     get_version;
229 swegener 1.49
230 johnm 1.1 ebegin "Updating module dependencies for ${KV_FULL}"
231 robbat2 1.96 if [ -r "${KV_OUT_DIR}"/System.map ]
232 johnm 1.1 then
233 robbat2 1.96 depmod -ae -F "${KV_OUT_DIR}"/System.map -b "${ROOT}" -r ${KV_FULL}
234 johnm 1.18 eend $?
235 johnm 1.1 else
236     ewarn
237 johnm 1.5 ewarn "${KV_OUT_DIR}/System.map not found."
238 johnm 1.1 ewarn "You must manually update the kernel module dependencies using depmod."
239 johnm 1.18 eend 1
240 johnm 1.1 ewarn
241     fi
242     }
243    
244 dsd 1.86 # internal function
245     #
246     # FUNCTION: update_modules
247     # DESCRIPTION:
248     # It calls the update-modules utility.
249 johnm 1.3 update_modules() {
250 genstef 1.69 debug-print-function ${FUNCNAME} $*
251    
252 genstef 1.73 if [ -x /sbin/update-modules ] && \
253 robbat2 1.96 grep -v -e "^#" -e "^$" "${D}"/etc/modules.d/* >/dev/null 2>&1; then
254 genstef 1.73 ebegin "Updating modules.conf"
255     /sbin/update-modules
256     eend $?
257 vapier 1.74 elif [ -x /sbin/update-modules ] && \
258 robbat2 1.96 grep -v -e "^#" -e "^$" "${D}"/etc/modules.d/* >/dev/null 2>&1; then
259 johnm 1.3 ebegin "Updating modules.conf"
260 vapier 1.74 /sbin/update-modules
261 johnm 1.3 eend $?
262     fi
263     }
264    
265 dsd 1.86 # internal function
266     #
267     # FUNCTION: move_old_moduledb
268     # DESCRIPTION:
269     # It updates the location of the database used by the module-rebuild utility.
270 johnm 1.41 move_old_moduledb() {
271 genstef 1.69 debug-print-function ${FUNCNAME} $*
272    
273 robbat2 1.96 local OLDDIR="${ROOT}"/usr/share/module-rebuild/
274     local NEWDIR="${ROOT}"/var/lib/module-rebuild/
275 swegener 1.49
276 robbat2 1.96 if [[ -f "${OLDDIR}"/moduledb ]]; then
277     [[ ! -d "${NEWDIR}" ]] && mkdir -p "${NEWDIR}"
278     [[ ! -f "${NEWDIR}"/moduledb ]] && \
279     mv "${OLDDIR}"/moduledb "${NEWDIR}"/moduledb
280     rm -f "${OLDDIR}"/*
281     rmdir "${OLDDIR}"
282 johnm 1.41 fi
283     }
284    
285 dsd 1.86 # internal function
286     #
287     # FUNCTION: update_moduledb
288     # DESCRIPTION:
289     # It adds the package to the /var/lib/module-rebuild/moduledb database used by the module-rebuild utility.
290 johnm 1.37 update_moduledb() {
291 genstef 1.69 debug-print-function ${FUNCNAME} $*
292    
293 robbat2 1.96 local MODULEDB_DIR="${ROOT}"/var/lib/module-rebuild/
294 johnm 1.41 move_old_moduledb
295 johnm 1.40
296 robbat2 1.96 if [[ ! -f "${MODULEDB_DIR}"/moduledb ]]; then
297     [[ ! -d "${MODULEDB_DIR}" ]] && mkdir -p "${MODULEDB_DIR}"
298     touch "${MODULEDB_DIR}"/moduledb
299 johnm 1.37 fi
300 vapier 1.72
301 robbat2 1.96 if ! grep -qs ${CATEGORY}/${PN}-${PVR} "${MODULEDB_DIR}"/moduledb ; then
302 johnm 1.37 einfo "Adding module to moduledb."
303 robbat2 1.96 echo "a:1:${CATEGORY}/${PN}-${PVR}" >> "${MODULEDB_DIR}"/moduledb
304 swegener 1.49 fi
305 johnm 1.37 }
306    
307 dsd 1.86 # internal function
308     #
309     # FUNCTION: remove_moduledb
310     # DESCRIPTION:
311     # It removes the package from the /var/lib/module-rebuild/moduledb database used by
312     # the module-rebuild utility.
313 johnm 1.37 remove_moduledb() {
314 genstef 1.69 debug-print-function ${FUNCNAME} $*
315    
316 robbat2 1.96 local MODULEDB_DIR="${ROOT}"/var/lib/module-rebuild/
317 johnm 1.41 move_old_moduledb
318 johnm 1.40
319 robbat2 1.96 if grep -qs ${CATEGORY}/${PN}-${PVR} "${MODULEDB_DIR}"/moduledb ; then
320 johnm 1.37 einfo "Removing ${CATEGORY}/${PN}-${PVR} from moduledb."
321 robbat2 1.96 sed -i -e "/.*${CATEGORY}\/${PN}-${PVR}.*/d" "${MODULEDB_DIR}"/moduledb
322 johnm 1.37 fi
323     }
324    
325 dsd 1.86 # @FUNCTION: set_kvobj
326     # @DESCRIPTION:
327     # It sets the KV_OBJ variable.
328 johnm 1.1 set_kvobj() {
329 genstef 1.69 debug-print-function ${FUNCNAME} $*
330    
331 johnm 1.1 if kernel_is 2 6
332     then
333     KV_OBJ="ko"
334     else
335     KV_OBJ="o"
336     fi
337 johnm 1.26 # Do we really need to know this?
338     # Lets silence it.
339     # einfo "Using KV_OBJ=${KV_OBJ}"
340 johnm 1.1 }
341    
342 genstef 1.68 get-KERNEL_CC() {
343 genstef 1.69 debug-print-function ${FUNCNAME} $*
344    
345 vapier 1.82 if [[ -n ${KERNEL_CC} ]] ; then
346     echo "${KERNEL_CC}"
347     return
348     fi
349    
350 genstef 1.68 local kernel_cc
351     if [ -n "${KERNEL_ABI}" ]; then
352     # In future, an arch might want to define CC_$ABI
353     #kernel_cc="$(get_abi_CC)"
354 swegener 1.70 #[ -z "${kernel_cc}" ] &&
355 genstef 1.68 kernel_cc="$(tc-getCC $(ABI=${KERNEL_ABI} get_abi_CHOST))"
356     else
357     kernel_cc=$(tc-getCC)
358     fi
359     echo "${kernel_cc}"
360     }
361    
362 dsd 1.86 # internal function
363     #
364     # FUNCTION:
365     # USAGE: /path/to/the/modulename_without_extension
366     # RETURN: A file in /etc/modules.d/ (kernel < 2.6) or /etc/modprobe.d/ (kernel >= 2.6)
367     # DESCRIPTION:
368     # This function will generate and install the neccessary modprobe.d/modules.d file from the
369     # information contained in the modules exported parms.
370     # (see the variables MODULESD_<modulename>_ENABLED, MODULESD_<modulename>_EXAMPLES,
371     # MODULESD_<modulename>_ALIASES, MODULESD_<modulename>_ADDITION and MODULESD_<modulename>_DOCS).
372     #
373     # At the end the documentation specified with MODULESD_<modulename>_DOCS is installed.
374 johnm 1.11 generate_modulesd() {
375 genstef 1.69 debug-print-function ${FUNCNAME} $*
376    
377 johnm 1.54 local currm_path currm currm_t t myIFS myVAR
378 johnm 1.26 local module_docs module_enabled module_aliases \
379     module_additions module_examples module_modinfo module_opts
380    
381     for currm_path in ${@}
382 johnm 1.11 do
383 johnm 1.26 currm=${currm_path//*\/}
384     currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]')
385 johnm 1.54 currm_t=${currm}
386     while [[ -z ${currm_t//*-*} ]]; do
387     currm_t=${currm_t/-/_}
388     done
389 johnm 1.26
390 johnm 1.54 module_docs="$(eval echo \${MODULESD_${currm_t}_DOCS})"
391     module_enabled="$(eval echo \${MODULESD_${currm_t}_ENABLED})"
392     module_aliases="$(eval echo \${#MODULESD_${currm_t}_ALIASES[*]})"
393     module_additions="$(eval echo \${#MODULESD_${currm_t}_ADDITIONS[*]})"
394     module_examples="$(eval echo \${#MODULESD_${currm_t}_EXAMPLES[*]})"
395 johnm 1.26
396 johnm 1.27 [[ ${module_aliases} -eq 0 ]] && unset module_aliases
397     [[ ${module_additions} -eq 0 ]] && unset module_additions
398     [[ ${module_examples} -eq 0 ]] && unset module_examples
399 johnm 1.26
400 swegener 1.49 # If we specify we dont want it, then lets exit, otherwise we assume
401 johnm 1.26 # that if its set, we do want it.
402     [[ ${module_enabled} == no ]] && return 0
403    
404     # unset any unwanted variables.
405     for t in ${!module_*}
406 johnm 1.11 do
407 johnm 1.26 [[ -z ${!t} ]] && unset ${t}
408 johnm 1.11 done
409    
410 johnm 1.26 [[ -z ${!module_*} ]] && return 0
411    
412     # OK so now if we have got this far, then we know we want to continue
413     # and generate the modules.d file.
414     module_modinfo="$(modinfo -p ${currm_path}.${KV_OBJ})"
415     module_config="${T}/modulesd-${currm}"
416    
417 johnm 1.11 ebegin "Preparing file for modules.d"
418 johnm 1.26 #-----------------------------------------------------------------------
419 robbat2 1.96 echo "# modules.d configuration file for ${currm}" >> "${module_config}"
420 johnm 1.26 #-----------------------------------------------------------------------
421     [[ -n ${module_docs} ]] && \
422 robbat2 1.96 echo "# For more information please read:" >> "${module_config}"
423 johnm 1.26 for t in ${module_docs}
424 johnm 1.11 do
425 robbat2 1.96 echo "# ${t//*\/}" >> "${module_config}"
426 johnm 1.11 done
427 robbat2 1.96 echo >> "${module_config}"
428 johnm 1.11
429 johnm 1.26 #-----------------------------------------------------------------------
430 johnm 1.27 if [[ ${module_aliases} -gt 0 ]]
431 johnm 1.11 then
432 robbat2 1.96 echo "# Internal Aliases - Do not edit" >> "${module_config}"
433     echo "# ------------------------------" >> "${module_config}"
434 johnm 1.12
435 johnm 1.26 for((t=0; t<${module_aliases}; t++))
436 johnm 1.11 do
437 johnm 1.26 echo "alias $(eval echo \${MODULESD_${currm}_ALIASES[$t]})" \
438 robbat2 1.96 >> "${module_config}"
439 johnm 1.12 done
440 robbat2 1.96 echo '' >> "${module_config}"
441 johnm 1.11 fi
442    
443 johnm 1.26 #-----------------------------------------------------------------------
444     if [[ -n ${module_modinfo} ]]
445 johnm 1.11 then
446 robbat2 1.96 echo >> "${module_config}"
447     echo "# Configurable module parameters" >> "${module_config}"
448     echo "# ------------------------------" >> "${module_config}"
449 johnm 1.26 myIFS="${IFS}"
450 johnm 1.11 IFS="$(echo -en "\n\b")"
451 swegener 1.49
452 johnm 1.26 for t in ${module_modinfo}
453 johnm 1.11 do
454 johnm 1.26 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")"
455     if [[ -n ${myVAR} ]]
456 johnm 1.11 then
457 johnm 1.26 module_opts="${module_opts} ${t%%:*}:${myVAR}"
458 johnm 1.11 fi
459 robbat2 1.96 echo -e "# ${t%%:*}:\t${t#*:}" >> "${module_config}"
460 swegener 1.49 done
461 johnm 1.26 IFS="${myIFS}"
462 robbat2 1.96 echo '' >> "${module_config}"
463 johnm 1.26 fi
464    
465     #-----------------------------------------------------------------------
466     if [[ $(eval echo \${MODULESD_${currm}_ALIASES[0]}) == guess ]]
467     then
468     # So lets do some guesswork eh?
469     if [[ -n ${module_opts} ]]
470     then
471 robbat2 1.96 echo "# For Example..." >> "${module_config}"
472     echo "# --------------" >> "${module_config}"
473 johnm 1.26 for t in ${module_opts}
474     do
475 robbat2 1.96 echo "# options ${currm} ${t//:*}=${t//*:}" >> "${module_config}"
476 johnm 1.26 done
477 robbat2 1.96 echo '' >> "${module_config}"
478 johnm 1.26 fi
479 johnm 1.27 elif [[ ${module_examples} -gt 0 ]]
480 johnm 1.26 then
481 robbat2 1.96 echo "# For Example..." >> "${module_config}"
482     echo "# --------------" >> "${module_config}"
483 johnm 1.26 for((t=0; t<${module_examples}; t++))
484     do
485     echo "options $(eval echo \${MODULESD_${currm}_EXAMPLES[$t]})" \
486 robbat2 1.96 >> "${module_config}"
487 johnm 1.11 done
488 robbat2 1.96 echo '' >> "${module_config}"
489 johnm 1.11 fi
490 johnm 1.26
491     #-----------------------------------------------------------------------
492 johnm 1.27 if [[ ${module_additions} -gt 0 ]]
493 johnm 1.11 then
494 johnm 1.26 for((t=0; t<${module_additions}; t++))
495 johnm 1.11 do
496 johnm 1.26 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \
497 robbat2 1.96 >> "${module_config}"
498 johnm 1.11 done
499 robbat2 1.96 echo '' >> "${module_config}"
500 johnm 1.11 fi
501 swegener 1.49
502 johnm 1.26 #-----------------------------------------------------------------------
503    
504 johnm 1.12 # then we install it
505 cardoe 1.81 if kernel_is ge 2 6; then
506 genstef 1.80 insinto /etc/modprobe.d
507     else
508     insinto /etc/modules.d
509     fi
510 robbat2 1.96 newins "${module_config}" "${currm_path//*\/}.conf"
511 johnm 1.27
512 johnm 1.12 # and install any documentation we might have.
513 johnm 1.26 [[ -n ${module_docs} ]] && dodoc ${module_docs}
514 johnm 1.11 done
515     eend 0
516 johnm 1.26 return 0
517 johnm 1.11 }
518    
519 dsd 1.86 # internal function
520     #
521     # FUNCTION: find_module_params
522     # USAGE: A string "NAME(LIBDIR:SRCDIR:OBJDIR)"
523     # RETURN: The string "modulename:NAME libdir:LIBDIR srcdir:SRCDIR objdir:OBJDIR"
524     # DESCRIPTION:
525     # Analyze the specification NAME(LIBDIR:SRCDIR:OBJDIR) of one module as described in MODULE_NAMES.
526 johnm 1.18 find_module_params() {
527 genstef 1.69 debug-print-function ${FUNCNAME} $*
528    
529 johnm 1.18 local matched_offset=0 matched_opts=0 test="${@}" temp_var result
530     local i=0 y=0 z=0
531 swegener 1.49
532 johnm 1.18 for((i=0; i<=${#test}; i++))
533     do
534     case ${test:${i}:1} in
535     \() matched_offset[0]=${i};;
536     \:) matched_opts=$((${matched_opts} + 1));
537     matched_offset[${matched_opts}]="${i}";;
538     \)) matched_opts=$((${matched_opts} + 1));
539     matched_offset[${matched_opts}]="${i}";;
540     esac
541     done
542 swegener 1.49
543 johnm 1.18 for((i=0; i<=${matched_opts}; i++))
544     do
545     # i = offset were working on
546     # y = last offset
547     # z = current offset - last offset
548     # temp_var = temporary name
549     case ${i} in
550     0) tempvar=${test:0:${matched_offset[0]}};;
551     *) y=$((${matched_offset[$((${i} - 1))]} + 1))
552     z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]}));
553     z=$((${z} - 1))
554     tempvar=${test:${y}:${z}};;
555     esac
556 swegener 1.49
557 johnm 1.18 case ${i} in
558     0) result="${result} modulename:${tempvar}";;
559     1) result="${result} libdir:${tempvar}";;
560     2) result="${result} srcdir:${tempvar}";;
561     3) result="${result} objdir:${tempvar}";;
562     esac
563     done
564 swegener 1.49
565 johnm 1.18 echo ${result}
566     }
567    
568 johnm 1.1 # default ebuild functions
569     # --------------------------------
570    
571 dsd 1.86 # @FUNCTION: linux-mod_pkg_setup
572     # @DESCRIPTION:
573     # It checks the CONFIG_CHECK options (see linux-info.eclass(5)), verifies that the kernel is
574     # configured, verifies that the sources are prepared, verifies that the modules support is builtin
575     # in the kernel and sets the object extension KV_OBJ.
576 johnm 1.1 linux-mod_pkg_setup() {
577 genstef 1.69 debug-print-function ${FUNCNAME} $*
578    
579 robbat2 1.97 # If we are installing a binpkg, take a different path.
580     if [[ $EMERGE_FROM == binary ]]; then
581     linux-mod_pkg_setup_binary
582     return
583     fi
584    
585 johnm 1.6 linux-info_pkg_setup;
586 dsd 1.78 require_configured_kernel
587 johnm 1.6 check_kernel_built;
588 johnm 1.63 strip_modulenames;
589     [[ -n ${MODULE_NAMES} ]] && check_modules_supported
590 johnm 1.1 set_kvobj;
591 weeve 1.55 # Commented out with permission from johnm until a fixed version for arches
592     # who intentionally use different kernel and userland compilers can be
593     # introduced - Jason Wever <weeve@gentoo.org>, 23 Oct 2005
594     #check_vermagic;
595 johnm 1.1 }
596    
597 robbat2 1.97 # @FUNCTION: linux-mod_pkg_setup_binary
598     # @DESCRIPTION:
599     # Perform all kernel option checks non-fatally, as the .config and
600     # /proc/config.gz might not be present. Do not do anything that requires kernel
601     # sources.
602     linux-mod_pkg_setup_binary() {
603     debug-print-function ${FUNCNAME} $*
604     local new_CONFIG_CHECK
605 robbat2 1.99 # ~ needs always to be quoted, else bash expands it.
606 robbat2 1.97 for config in $CONFIG_CHECK ; do
607 robbat2 1.99 optional='~'
608     [[ ${config:0:1} == "~" ]] && optional=''
609 robbat2 1.98 new_CONFIG_CHECK="${new_CONFIG_CHECK} ${optional}${config}"
610 robbat2 1.97 done
611     export CONFIG_CHECK="${new_CONFIG_CHECK}"
612     linux-info_pkg_setup;
613     }
614    
615 johnm 1.63 strip_modulenames() {
616 genstef 1.69 debug-print-function ${FUNCNAME} $*
617    
618 johnm 1.63 local i
619     for i in ${MODULE_IGNORE}; do
620     MODULE_NAMES=${MODULE_NAMES//${i}(*}
621     done
622     }
623    
624 dsd 1.86 # @FUNCTION: linux-mod_src_compile
625     # @DESCRIPTION:
626     # It compiles all the modules specified in MODULE_NAMES. For each module the econf command is
627     # executed only if ECONF_PARAMS is defined, the name of the target is specified by BUILD_TARGETS
628     # while the options are in BUILD_PARAMS (all the modules share these variables). The compilation
629     # happens inside ${srcdir}.
630     #
631     # Look at the description of these variables for more details.
632 johnm 1.1 linux-mod_src_compile() {
633 genstef 1.69 debug-print-function ${FUNCNAME} $*
634    
635 vapier 1.84 local modulename libdir srcdir objdir i n myABI="${ABI}"
636     set_arch_to_kernel
637 blubb 1.62 ABI="${KERNEL_ABI}"
638 johnm 1.26
639 johnm 1.16 BUILD_TARGETS=${BUILD_TARGETS:-clean module}
640 johnm 1.63 strip_modulenames;
641 phreak 1.76 cd "${S}"
642 dsd 1.93 touch Module.symvers
643 johnm 1.9 for i in ${MODULE_NAMES}
644 johnm 1.1 do
645 johnm 1.23 unset libdir srcdir objdir
646 johnm 1.18 for n in $(find_module_params ${i})
647     do
648     eval ${n/:*}=${n/*:/}
649     done
650     libdir=${libdir:-misc}
651     srcdir=${srcdir:-${S}}
652     objdir=${objdir:-${srcdir}}
653 swegener 1.49
654 johnm 1.18 if [ ! -f "${srcdir}/.built" ];
655 johnm 1.16 then
656 robbat2 1.96 cd "${srcdir}"
657 dsd 1.93 ln -s "${S}"/Module.symvers Module.symvers
658 johnm 1.16 einfo "Preparing ${modulename} module"
659 johnm 1.22 if [[ -n ${ECONF_PARAMS} ]]
660     then
661     econf ${ECONF_PARAMS} || \
662     die "Unable to run econf ${ECONF_PARAMS}"
663     fi
664 vapier 1.83
665 robbat2 1.79 # This looks messy, but it is needed to handle multiple variables
666     # being passed in the BUILD_* stuff where the variables also have
667     # spaces that must be preserved. If don't do this, then the stuff
668     # inside the variables gets used as targets for Make, which then
669     # fails.
670     eval "emake HOSTCC=\"$(tc-getBUILD_CC)\" \
671 vapier 1.83 CROSS_COMPILE=${CHOST}- \
672 robbat2 1.79 LDFLAGS=\"$(get_abi_LDFLAGS)\" \
673     ${BUILD_FIXES} \
674     ${BUILD_PARAMS} \
675     ${BUILD_TARGETS} " \
676 vapier 1.83 || die "Unable to emake HOSTCC="$(tc-getBUILD_CC)" CROSS_COMPILE=${CHOST}- LDFLAGS="$(get_abi_LDFLAGS)" ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS}"
677 robbat2 1.96 cd "${OLDPWD}"
678     touch "${srcdir}"/.built
679 johnm 1.16 fi
680 johnm 1.1 done
681 johnm 1.26
682 vapier 1.84 set_arch_to_portage
683 blubb 1.62 ABI="${myABI}"
684 johnm 1.1 }
685    
686 dsd 1.86 # @FUNCTION: linux-mod_src_install
687     # @DESCRIPTION:
688     # It install the modules specified in MODULES_NAME. The modules should be inside the ${objdir}
689     # directory and they are installed inside /lib/modules/${KV_FULL}/${libdir}.
690     #
691     # The modprobe.d/modules.d configuration file is automatically generated if the
692     # MODULESD_<modulename>_* variables are defined. The only way to stop this process is by
693     # setting MODULESD_<modulename>_ENABLED=no. At the end the documentation specified via
694     # MODULESD_<modulename>_DOCS is also installed.
695     #
696     # Look at the description of these variables for more details.
697 johnm 1.1 linux-mod_src_install() {
698 genstef 1.69 debug-print-function ${FUNCNAME} $*
699    
700 johnm 1.18 local modulename libdir srcdir objdir i n
701 swegener 1.49
702 johnm 1.63 strip_modulenames;
703 johnm 1.9 for i in ${MODULE_NAMES}
704 johnm 1.1 do
705 johnm 1.23 unset libdir srcdir objdir
706 johnm 1.18 for n in $(find_module_params ${i})
707     do
708     eval ${n/:*}=${n/*:/}
709     done
710     libdir=${libdir:-misc}
711     srcdir=${srcdir:-${S}}
712     objdir=${objdir:-${srcdir}}
713 johnm 1.1
714     einfo "Installing ${modulename} module"
715 robbat2 1.96 cd "${objdir}" || die "${objdir} does not exist"
716 brix 1.57 insinto /lib/modules/${KV_FULL}/${libdir}
717 vapier 1.56 doins ${modulename}.${KV_OBJ} || die "doins ${modulename}.${KV_OBJ} failed"
718 robbat2 1.96 cd "${OLDPWD}"
719 swegener 1.49
720 robbat2 1.96 generate_modulesd "${objdir}/${modulename}"
721 johnm 1.1 done
722     }
723    
724 dsd 1.86 # @FUNCTION: linux-mod_pkg_preinst
725     # @DESCRIPTION:
726     # It checks what to do after having merged the package.
727 genstef 1.65 linux-mod_pkg_preinst() {
728 genstef 1.69 debug-print-function ${FUNCNAME} $*
729    
730 zmedico 1.77 [ -d "${D}lib/modules" ] && UPDATE_DEPMOD=true || UPDATE_DEPMOD=false
731     [ -d "${D}etc/modules.d" ] && UPDATE_MODULES=true || UPDATE_MODULES=false
732     [ -d "${D}lib/modules" ] && UPDATE_MODULEDB=true || UPDATE_MODULEDB=false
733 genstef 1.65 }
734    
735 dsd 1.86 # @FUNCTION: linux-mod_pkg_postinst
736     # @DESCRIPTION:
737     # It executes /sbin/depmod and adds the package to the /var/lib/module-rebuild/moduledb
738     # database (if ${D}/lib/modules is created) and it runs /sbin/update-modules
739     # (if ${D}/etc/modules.d is created).
740 johnm 1.1 linux-mod_pkg_postinst() {
741 genstef 1.69 debug-print-function ${FUNCNAME} $*
742    
743 genstef 1.65 ${UPDATE_DEPMOD} && update_depmod;
744     ${UPDATE_MODULES} && update_modules;
745     ${UPDATE_MODULEDB} && update_moduledb;
746 johnm 1.1 }
747 johnm 1.37
748 dsd 1.86 # @FUNCTION: linux-mod_pkg_postrm
749     # @DESCRIPTION:
750     # It removes the package from the /var/lib/module-rebuild/moduledb database but it doens't
751     # call /sbin/depmod and /sbin/update-modules because the modules are still installed.
752 johnm 1.37 linux-mod_pkg_postrm() {
753 swegener 1.70 debug-print-function ${FUNCNAME} $*
754 johnm 1.37 remove_moduledb;
755     }

  ViewVC Help
Powered by ViewVC 1.1.20