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

Diff of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.45 Revision 1.54
1# Copyright 1999-2004 Gentoo Foundation 1# Copyright 1999-2004 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/linux-mod.eclass,v 1.45 2005/07/06 20:53:20 agriffis Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/linux-mod.eclass,v 1.54 2005/10/22 17:35:39 johnm Exp $
4 4
5# Description: This eclass is used to interface with linux-info in such a way 5# Description: This eclass is used to interface with linux-info in such a way
6# to provide the functionality required and initial functions 6# to provide the functionality required and initial functions
7# required to install external modules against a kernel source 7# required to install external modules against a kernel source
8# tree. 8# tree.
12# 12#
13# Please direct your bugs to the current eclass maintainer :) 13# Please direct your bugs to the current eclass maintainer :)
14 14
15# A Couple of env vars are available to effect usage of this eclass 15# A Couple of env vars are available to effect usage of this eclass
16# These are as follows: 16# These are as follows:
17# 17#
18# Env Var Option Default Description 18# Env Var Option Default Description
19# KERNEL_DIR <string> /usr/src/linux The directory containing kernel 19# KERNEL_DIR <string> /usr/src/linux The directory containing kernel
20# the target kernel sources. 20# the target kernel sources.
21# ECONF_PARAMS <string> The parameters to pass to econf. 21# ECONF_PARAMS <string> The parameters to pass to econf.
22# If this is not set, then econf 22# If this is not set, then econf
23# isn't run. 23# isn't run.
24# BUILD_PARAMS <string> The parameters to pass to emake. 24# BUILD_PARAMS <string> The parameters to pass to emake.
25# BUILD_TARGETS <string> clean modules The build targets to pass to 25# BUILD_TARGETS <string> clean modules The build targets to pass to
26# make. 26# make.
27# MODULE_NAMES <string> This is the modules which are 27# MODULE_NAMES <string> This is the modules which are
28# to be built automatically using 28# to be built automatically using
29# the default pkg_compile/install. 29# the default pkg_compile/install.
30# They are explained properly 30# They are explained properly
31# below. It will only make 31# below. It will only make
32# BUILD_TARGETS once in any 32# BUILD_TARGETS once in any
33# directory. 33# directory.
34 34
35# MODULE_NAMES - Detailed Overview 35# MODULE_NAMES - Detailed Overview
36# 36#
37# The structure of each MODULE_NAMES entry is as follows: 37# The structure of each MODULE_NAMES entry is as follows:
38# modulename(libdir:srcdir:objdir) 38# modulename(libdir:srcdir:objdir)
39# for example: 39# for example:
40# MODULE_NAMES="module_pci(pci:${S}/pci:${S}) module_usb(usb:${S}/usb:${S})" 40# MODULE_NAMES="module_pci(pci:${S}/pci:${S}) module_usb(usb:${S}/usb:${S})"
41# 41#
42# what this would do is 42# what this would do is
43# cd ${S}/pci 43# cd ${S}/pci
44# make ${BUILD_PARAMS} ${BUILD_TARGETS} 44# make ${BUILD_PARAMS} ${BUILD_TARGETS}
45# cd ${S} 45# cd ${S}
46# insinto /lib/modules/${KV_FULL}/pci 46# insinto /lib/modules/${KV_FULL}/pci
80 80
81 81
82inherit linux-info 82inherit linux-info
83EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile pkg_postrm 83EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile pkg_postrm
84 84
85IUSE="${IUSE} pcmcia" 85IUSE="" # don't put pcmcia here, rather in the ebuilds that actually support pcmcia
86SLOT="0" 86SLOT="0"
87DESCRIPTION="Based on the $ECLASS eclass" 87DESCRIPTION="Based on the $ECLASS eclass"
88RDEPEND="virtual/modutils
89 pcmcia? ( virtual/pcmcia )"
88DEPEND="virtual/linux-sources 90DEPEND="virtual/linux-sources
89 sys-apps/sed 91 sys-apps/sed
90 virtual/modutils
91 pcmcia? ( virtual/pcmcia )" 92 pcmcia? ( virtual/pcmcia )"
92 93
93# eclass utilities 94# eclass utilities
94# ---------------------------------- 95# ----------------------------------
96
97check_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
125 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}
95 133
96unpack_pcmcia_sources() { 134unpack_pcmcia_sources() {
97 # So while the two eclasses exist side-by-side and also the ebuilds inherit 135 # So while the two eclasses exist side-by-side and also the ebuilds inherit
98 # both we need to check for PCMCIA_SOURCE_DIR, and if we find it, then we 136 # both we need to check for PCMCIA_SOURCE_DIR, and if we find it, then we
99 # bail out and assume pcmcia.eclass is working on it. 137 # bail out and assume pcmcia.eclass is working on it.
100 [[ -n ${PCMCIA_SOURCE_DIR} ]] && return 1 138 [[ -n ${PCMCIA_SOURCE_DIR} ]] && return 1
101 139
102 if [[ -f "${1}" ]]; then 140 if [[ -f "${1}" ]]; then
103 PCMCIA_SOURCE_DIR="${WORKDIR}/pcmcia-cs/" 141 PCMCIA_SOURCE_DIR="${WORKDIR}/pcmcia-cs/"
104 142
105 ebegin "Decompressing pcmcia-cs sources" 143 ebegin "Decompressing pcmcia-cs sources"
106 mkdir -p ${PCMCIA_SOURCE_DIR} 144 mkdir -p ${PCMCIA_SOURCE_DIR}
107 tar -xjf ${1} -C ${PCMCIA_SOURCE_DIR} 145 tar -xjf ${1} -C ${PCMCIA_SOURCE_DIR}
108 eend $? 146 eend $?
109 147
139} 177}
140 178
141use_m() { 179use_m() {
142 # if we haven't determined the version yet, we need too. 180 # if we haven't determined the version yet, we need too.
143 get_version; 181 get_version;
144 182
145 # if the kernel version is greater than 2.6.6 then we should use 183 # if the kernel version is greater than 2.6.6 then we should use
146 # M= instead of SUBDIRS= 184 # M= instead of SUBDIRS=
147 [ ${KV_MAJOR} -eq 2 -a ${KV_MINOR} -gt 5 -a ${KV_PATCH} -gt 5 ] && \ 185 [ ${KV_MAJOR} -eq 2 -a ${KV_MINOR} -gt 5 -a ${KV_PATCH} -gt 5 ] && \
148 return 0 || return 1 186 return 0 || return 1
149} 187}
160} 198}
161 199
162update_depmod() { 200update_depmod() {
163 # if we haven't determined the version yet, we need too. 201 # if we haven't determined the version yet, we need too.
164 get_version; 202 get_version;
165 203
166 ebegin "Updating module dependencies for ${KV_FULL}" 204 ebegin "Updating module dependencies for ${KV_FULL}"
167 if [ -r ${KV_OUT_DIR}/System.map ] 205 if [ -r ${KV_OUT_DIR}/System.map ]
168 then 206 then
169 depmod -ae -F ${KV_OUT_DIR}/System.map -b ${ROOT} -r ${KV_FULL} 207 depmod -ae -F ${KV_OUT_DIR}/System.map -b ${ROOT} -r ${KV_FULL}
170 eend $? 208 eend $?
187} 225}
188 226
189move_old_moduledb() { 227move_old_moduledb() {
190 local OLDDIR=${ROOT}/usr/share/module-rebuild/ 228 local OLDDIR=${ROOT}/usr/share/module-rebuild/
191 local NEWDIR=${ROOT}/var/lib/module-rebuild/ 229 local NEWDIR=${ROOT}/var/lib/module-rebuild/
192 230
193 if [[ -f ${OLDDIR}/moduledb ]]; then 231 if [[ -f ${OLDDIR}/moduledb ]]; then
194 [[ ! -d ${NEWDIR} ]] && mkdir -p ${NEWDIR} 232 [[ ! -d ${NEWDIR} ]] && mkdir -p ${NEWDIR}
195 [[ ! -f ${NEWDIR}/moduledb ]] && \ 233 [[ ! -f ${NEWDIR}/moduledb ]] && \
196 mv ${OLDDIR}/moduledb ${NEWDIR}/moduledb 234 mv ${OLDDIR}/moduledb ${NEWDIR}/moduledb
197 rm -f ${OLDDIR}/* 235 rm -f ${OLDDIR}/*
208 touch ${MODULEDB_DIR}/moduledb 246 touch ${MODULEDB_DIR}/moduledb
209 fi 247 fi
210 if [[ -z $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then 248 if [[ -z $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then
211 einfo "Adding module to moduledb." 249 einfo "Adding module to moduledb."
212 echo "a:1:${CATEGORY}/${PN}-${PVR}" >> ${MODULEDB_DIR}/moduledb 250 echo "a:1:${CATEGORY}/${PN}-${PVR}" >> ${MODULEDB_DIR}/moduledb
213 fi 251 fi
214} 252}
215 253
216remove_moduledb() { 254remove_moduledb() {
217 local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/ 255 local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/
218 move_old_moduledb 256 move_old_moduledb
237 275
238generate_modulesd() { 276generate_modulesd() {
239 # This function will generate the neccessary modules.d file from the 277 # This function will generate the neccessary modules.d file from the
240 # information contained in the modules exported parms 278 # information contained in the modules exported parms
241 279
242 local currm_path currm t myIFS myVAR 280 local currm_path currm currm_t t myIFS myVAR
243 local module_docs module_enabled module_aliases \ 281 local module_docs module_enabled module_aliases \
244 module_additions module_examples module_modinfo module_opts 282 module_additions module_examples module_modinfo module_opts
245 283
246 for currm_path in ${@} 284 for currm_path in ${@}
247 do 285 do
248 currm=${currm_path//*\/} 286 currm=${currm_path//*\/}
249 currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]') 287 currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]')
288 currm_t=${currm}
289 while [[ -z ${currm_t//*-*} ]]; do
290 currm_t=${currm_t/-/_}
291 done
250 292
251 module_docs="$(eval echo \${MODULESD_${currm}_DOCS})" 293 module_docs="$(eval echo \${MODULESD_${currm_t}_DOCS})"
252 module_enabled="$(eval echo \${MODULESD_${currm}_ENABLED})" 294 module_enabled="$(eval echo \${MODULESD_${currm_t}_ENABLED})"
253 module_aliases="$(eval echo \${#MODULESD_${currm/-/_}_ALIASES[*]})" 295 module_aliases="$(eval echo \${#MODULESD_${currm_t}_ALIASES[*]})"
254 module_additions="$(eval echo \${#MODULESD_${currm/-/_}_ADDITIONS[*]})" 296 module_additions="$(eval echo \${#MODULESD_${currm_t}_ADDITIONS[*]})"
255 module_examples="$(eval echo \${#MODULESD_${currm/-/_}_EXAMPLES[*]})" 297 module_examples="$(eval echo \${#MODULESD_${currm_t}_EXAMPLES[*]})"
256 298
257 [[ ${module_aliases} -eq 0 ]] && unset module_aliases 299 [[ ${module_aliases} -eq 0 ]] && unset module_aliases
258 [[ ${module_additions} -eq 0 ]] && unset module_additions 300 [[ ${module_additions} -eq 0 ]] && unset module_additions
259 [[ ${module_examples} -eq 0 ]] && unset module_examples 301 [[ ${module_examples} -eq 0 ]] && unset module_examples
260 302
261 # If we specify we dont want it, then lets exit, otherwise we assume 303 # If we specify we dont want it, then lets exit, otherwise we assume
262 # that if its set, we do want it. 304 # that if its set, we do want it.
263 [[ ${module_enabled} == no ]] && return 0 305 [[ ${module_enabled} == no ]] && return 0
264 306
265 # unset any unwanted variables. 307 # unset any unwanted variables.
266 for t in ${!module_*} 308 for t in ${!module_*}
307 echo >> ${module_config} 349 echo >> ${module_config}
308 echo "# Configurable module parameters" >> ${module_config} 350 echo "# Configurable module parameters" >> ${module_config}
309 echo "# ------------------------------" >> ${module_config} 351 echo "# ------------------------------" >> ${module_config}
310 myIFS="${IFS}" 352 myIFS="${IFS}"
311 IFS="$(echo -en "\n\b")" 353 IFS="$(echo -en "\n\b")"
312 354
313 for t in ${module_modinfo} 355 for t in ${module_modinfo}
314 do 356 do
315 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")" 357 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")"
316 if [[ -n ${myVAR} ]] 358 if [[ -n ${myVAR} ]]
317 then 359 then
318 module_opts="${module_opts} ${t%%:*}:${myVAR}" 360 module_opts="${module_opts} ${t%%:*}:${myVAR}"
319 fi 361 fi
320 echo -e "# ${t%%:*}:\t${t#*:}" >> ${module_config} 362 echo -e "# ${t%%:*}:\t${t#*:}" >> ${module_config}
321 done 363 done
322 IFS="${myIFS}" 364 IFS="${myIFS}"
323 echo '' >> ${module_config} 365 echo '' >> ${module_config}
324 fi 366 fi
325 367
326 #----------------------------------------------------------------------- 368 #-----------------------------------------------------------------------
357 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \ 399 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \
358 >> ${module_config} 400 >> ${module_config}
359 done 401 done
360 echo '' >> ${module_config} 402 echo '' >> ${module_config}
361 fi 403 fi
362 404
363 #----------------------------------------------------------------------- 405 #-----------------------------------------------------------------------
364 406
365 # then we install it 407 # then we install it
366 insinto /etc/modules.d 408 insinto /etc/modules.d
367 newins ${module_config} ${currm_path//*\/} 409 newins ${module_config} ${currm_path//*\/}
371 done 413 done
372 eend 0 414 eend 0
373 return 0 415 return 0
374} 416}
375 417
376display_postinst() {
377 # if we haven't determined the version yet, we need too.
378 get_version;
379
380 local modulename moduledir sourcedir moduletemp file i
381
382 file=${ROOT}/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}
383 file=${file/\/\///}
384
385 for i in ${MODULE_IGNORE}
386 do
387 MODULE_NAMES=${MODULE_NAMES//${i}(*}
388 done
389
390 if [[ -n ${MODULE_NAMES} ]]
391 then
392 einfo "If you would like to load this module automatically upon boot"
393 einfo "please type the following as root:"
394 for i in ${MODULE_NAMES}
395 do
396 unset libdir srcdir objdir
397 for n in $(find_module_params ${i})
398 do
399 eval ${n/:*}=${n/*:/}
400 done
401 einfo " # echo \"${modulename}\" >> ${file}"
402 done
403 einfo
404 fi
405}
406
407find_module_params() { 418find_module_params() {
408 local matched_offset=0 matched_opts=0 test="${@}" temp_var result 419 local matched_offset=0 matched_opts=0 test="${@}" temp_var result
409 local i=0 y=0 z=0 420 local i=0 y=0 z=0
410 421
411 for((i=0; i<=${#test}; i++)) 422 for((i=0; i<=${#test}; i++))
412 do 423 do
413 case ${test:${i}:1} in 424 case ${test:${i}:1} in
414 \() matched_offset[0]=${i};; 425 \() matched_offset[0]=${i};;
415 \:) matched_opts=$((${matched_opts} + 1)); 426 \:) matched_opts=$((${matched_opts} + 1));
416 matched_offset[${matched_opts}]="${i}";; 427 matched_offset[${matched_opts}]="${i}";;
417 \)) matched_opts=$((${matched_opts} + 1)); 428 \)) matched_opts=$((${matched_opts} + 1));
418 matched_offset[${matched_opts}]="${i}";; 429 matched_offset[${matched_opts}]="${i}";;
419 esac 430 esac
420 done 431 done
421 432
422 for((i=0; i<=${matched_opts}; i++)) 433 for((i=0; i<=${matched_opts}; i++))
423 do 434 do
424 # i = offset were working on 435 # i = offset were working on
425 # y = last offset 436 # y = last offset
426 # z = current offset - last offset 437 # z = current offset - last offset
430 *) y=$((${matched_offset[$((${i} - 1))]} + 1)) 441 *) y=$((${matched_offset[$((${i} - 1))]} + 1))
431 z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]})); 442 z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]}));
432 z=$((${z} - 1)) 443 z=$((${z} - 1))
433 tempvar=${test:${y}:${z}};; 444 tempvar=${test:${y}:${z}};;
434 esac 445 esac
435 446
436 case ${i} in 447 case ${i} in
437 0) result="${result} modulename:${tempvar}";; 448 0) result="${result} modulename:${tempvar}";;
438 1) result="${result} libdir:${tempvar}";; 449 1) result="${result} libdir:${tempvar}";;
439 2) result="${result} srcdir:${tempvar}";; 450 2) result="${result} srcdir:${tempvar}";;
440 3) result="${result} objdir:${tempvar}";; 451 3) result="${result} objdir:${tempvar}";;
441 esac 452 esac
442 done 453 done
443 454
444 echo ${result} 455 echo ${result}
445} 456}
446 457
447# default ebuild functions 458# default ebuild functions
448# -------------------------------- 459# --------------------------------
450linux-mod_pkg_setup() { 461linux-mod_pkg_setup() {
451 linux-info_pkg_setup; 462 linux-info_pkg_setup;
452 check_kernel_built; 463 check_kernel_built;
453 check_modules_supported; 464 check_modules_supported;
454 set_kvobj; 465 set_kvobj;
466 check_vermagic;
455} 467}
456 468
457linux-mod_src_compile() { 469linux-mod_src_compile() {
458 local modulename libdir srcdir objdir i n myARCH="${ARCH}" 470 local modulename libdir srcdir objdir i n myARCH="${ARCH}"
459 unset ARCH 471 ARCH="$(tc-arch-kernel)"
460 472
461 BUILD_TARGETS=${BUILD_TARGETS:-clean module} 473 BUILD_TARGETS=${BUILD_TARGETS:-clean module}
462 474
463 for i in ${MODULE_IGNORE} 475 for i in ${MODULE_IGNORE}
464 do 476 do
465 MODULE_NAMES=${MODULE_NAMES//${i}(*} 477 MODULE_NAMES=${MODULE_NAMES//${i}(*}
466 done 478 done
467 479
473 eval ${n/:*}=${n/*:/} 485 eval ${n/:*}=${n/*:/}
474 done 486 done
475 libdir=${libdir:-misc} 487 libdir=${libdir:-misc}
476 srcdir=${srcdir:-${S}} 488 srcdir=${srcdir:-${S}}
477 objdir=${objdir:-${srcdir}} 489 objdir=${objdir:-${srcdir}}
478 490
479 if [ ! -f "${srcdir}/.built" ]; 491 if [ ! -f "${srcdir}/.built" ];
480 then 492 then
481 cd ${srcdir} 493 cd ${srcdir}
482 einfo "Preparing ${modulename} module" 494 einfo "Preparing ${modulename} module"
483 if [[ -n ${ECONF_PARAMS} ]] 495 if [[ -n ${ECONF_PARAMS} ]]
497 ARCH="${myARCH}" 509 ARCH="${myARCH}"
498} 510}
499 511
500linux-mod_src_install() { 512linux-mod_src_install() {
501 local modulename libdir srcdir objdir i n 513 local modulename libdir srcdir objdir i n
502 514
503 for i in ${MODULE_IGNORE} 515 for i in ${MODULE_IGNORE}
504 do 516 do
505 MODULE_NAMES=${MODULE_NAMES//${i}(*} 517 MODULE_NAMES=${MODULE_NAMES//${i}(*}
506 done 518 done
507 519
519 einfo "Installing ${modulename} module" 531 einfo "Installing ${modulename} module"
520 cd ${objdir} 532 cd ${objdir}
521 insinto ${ROOT}lib/modules/${KV_FULL}/${libdir} 533 insinto ${ROOT}lib/modules/${KV_FULL}/${libdir}
522 doins ${modulename}.${KV_OBJ} 534 doins ${modulename}.${KV_OBJ}
523 cd ${OLDPWD} 535 cd ${OLDPWD}
524 536
525 generate_modulesd ${objdir}/${modulename} 537 generate_modulesd ${objdir}/${modulename}
526 done 538 done
527} 539}
528 540
529linux-mod_pkg_postinst() { 541linux-mod_pkg_postinst() {
530 update_depmod; 542 update_depmod;
531 update_modules; 543 update_modules;
532 update_moduledb; 544 update_moduledb;
533 display_postinst;
534} 545}
535 546
536linux-mod_pkg_postrm() { 547linux-mod_pkg_postrm() {
537 remove_moduledb; 548 remove_moduledb;
538} 549}

Legend:
Removed from v.1.45  
changed lines
  Added in v.1.54

  ViewVC Help
Powered by ViewVC 1.1.20