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

Contents of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.67 - (show annotations) (download)
Mon Jul 24 20:18:09 2006 UTC (8 years, 1 month ago) by genstef
Branch: MAIN
Changes since 1.66: +3 -49 lines
remove pcmcia specific functons, bug 140116, also solves bug 122868

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

  ViewVC Help
Powered by ViewVC 1.1.20