| 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.49 2005/07/11 15:08:06 swegener Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/linux-mod.eclass,v 1.64 2006/05/11 08:23:43 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. |
| … | |
… | |
| 76 | # Each entry is a new line. |
76 | # Each entry is a new line. |
| 77 | # MODULES_${modulename}_DOCS This is a string list which contains |
77 | # MODULES_${modulename}_DOCS This is a string list which contains |
| 78 | # the full path to any associated |
78 | # the full path to any associated |
| 79 | # documents for $modulename |
79 | # documents for $modulename |
| 80 | |
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 |
| 81 | |
85 | |
| 82 | inherit linux-info |
86 | inherit eutils linux-info multilib |
| 83 | EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile pkg_postrm |
87 | EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile pkg_postrm |
| 84 | |
88 | |
| 85 | IUSE="" # don't put pcmcia here, rather in the ebuilds that actually support pcmcia |
89 | IUSE="" # don't put pcmcia here, rather in the ebuilds that actually support pcmcia |
| 86 | SLOT="0" |
90 | SLOT="0" |
| 87 | DESCRIPTION="Based on the $ECLASS eclass" |
91 | DESCRIPTION="Based on the $ECLASS eclass" |
| 88 | RDEPEND="virtual/modutils |
92 | RDEPEND="virtual/modutils |
| 89 | pcmcia? ( virtual/pcmcia )" |
93 | pcmcia? ( virtual/pcmcia )" |
| 90 | DEPEND="${RDEPEND} |
94 | DEPEND="sys-apps/sed |
| 91 | virtual/linux-sources |
95 | pcmcia? ( virtual/pcmcia )" |
| 92 | sys-apps/sed" |
|
|
| 93 | |
96 | |
| 94 | # eclass utilities |
97 | # eclass utilities |
| 95 | # ---------------------------------- |
98 | # ---------------------------------- |
|
|
99 | |
|
|
100 | check_vermagic() { |
|
|
101 | local curr_gcc_ver=$(gcc -dumpversion) |
|
|
102 | local tmpfile old_chost old_gcc_ver result=0 |
|
|
103 | |
|
|
104 | tmpfile=`find ${KV_DIR}/ -iname "*.o.cmd" -exec grep usr/lib/gcc {} \; -quit` |
|
|
105 | tmpfile=${tmpfile//*usr/lib} |
|
|
106 | tmpfile=${tmpfile//\/include*} |
|
|
107 | old_chost=${tmpfile//*gcc\/} |
|
|
108 | old_chost=${old_chost//\/*} |
|
|
109 | old_gcc_ver=${tmpfile//*\/} |
|
|
110 | |
|
|
111 | if [[ -z ${old_gcc_ver} || -z ${old_chost} ]]; then |
|
|
112 | ewarn "" |
|
|
113 | ewarn "Unable to detect what version of GCC was used to compile" |
|
|
114 | ewarn "the kernel. Build will continue, but you may experience problems." |
|
|
115 | elif [[ ${curr_gcc_ver} != ${old_gcc_ver} ]]; then |
|
|
116 | ewarn "" |
|
|
117 | ewarn "The version of GCC you are using (${curr_gcc_ver}) does" |
|
|
118 | ewarn "not match the version of GCC used to compile the" |
|
|
119 | ewarn "kernel (${old_gcc_ver})." |
|
|
120 | result=1 |
|
|
121 | elif [[ ${CHOST} != ${old_chost} ]]; then |
|
|
122 | ewarn "" |
|
|
123 | ewarn "The current CHOST (${CHOST}) does not match the chost" |
|
|
124 | ewarn "used when compiling the kernel (${old_chost})." |
|
|
125 | result=1 |
|
|
126 | fi |
|
|
127 | |
|
|
128 | if [[ ${result} -gt 0 ]]; then |
|
|
129 | ewarn "" |
|
|
130 | ewarn "Build will not continue, because you will experience problems." |
|
|
131 | ewarn "To fix this either change the version of GCC you wish to use" |
|
|
132 | ewarn "to match the kernel, or recompile the kernel first." |
|
|
133 | die "GCC Version Mismatch." |
|
|
134 | fi |
|
|
135 | } |
| 96 | |
136 | |
| 97 | unpack_pcmcia_sources() { |
137 | unpack_pcmcia_sources() { |
| 98 | # So while the two eclasses exist side-by-side and also the ebuilds inherit |
138 | # 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 |
139 | # 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. |
140 | # bail out and assume pcmcia.eclass is working on it. |
| … | |
… | |
| 130 | else |
170 | else |
| 131 | einfo "We have detected that you are running a 2.6 kernel" |
171 | einfo "We have detected that you are running a 2.6 kernel" |
| 132 | einfo "but you are not using the built-in PCMCIA support." |
172 | einfo "but you are not using the built-in PCMCIA support." |
| 133 | einfo "We will assume you know what you are doing, but please" |
173 | einfo "We will assume you know what you are doing, but please" |
| 134 | einfo "consider using the built in PCMCIA support instead." |
174 | einfo "consider using the built in PCMCIA support instead." |
| 135 | sleep 10 |
175 | epause 10 |
| 136 | |
176 | |
| 137 | unpack_pcmcia_sources ${pcmcia_tbz}; |
177 | unpack_pcmcia_sources ${pcmcia_tbz}; |
| 138 | fi |
178 | fi |
| 139 | fi |
179 | fi |
| 140 | } |
180 | } |
| … | |
… | |
| 218 | local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/ |
258 | local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/ |
| 219 | move_old_moduledb |
259 | move_old_moduledb |
| 220 | |
260 | |
| 221 | if [[ -n $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then |
261 | if [[ -n $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then |
| 222 | einfo "Removing ${CATEGORY}/${PN}-${PVR} from moduledb." |
262 | einfo "Removing ${CATEGORY}/${PN}-${PVR} from moduledb." |
| 223 | sed -ie "/.*${CATEGORY}\/${P}.*/d" ${MODULEDB_DIR}/moduledb |
263 | sed -ie "/.*${CATEGORY}\/${PN}-${PVR}.*/d" ${MODULEDB_DIR}/moduledb |
| 224 | fi |
264 | fi |
| 225 | } |
265 | } |
| 226 | |
266 | |
| 227 | set_kvobj() { |
267 | set_kvobj() { |
| 228 | if kernel_is 2 6 |
268 | if kernel_is 2 6 |
| … | |
… | |
| 238 | |
278 | |
| 239 | generate_modulesd() { |
279 | generate_modulesd() { |
| 240 | # This function will generate the neccessary modules.d file from the |
280 | # This function will generate the neccessary modules.d file from the |
| 241 | # information contained in the modules exported parms |
281 | # information contained in the modules exported parms |
| 242 | |
282 | |
| 243 | local currm_path currm t myIFS myVAR |
283 | local currm_path currm currm_t t myIFS myVAR |
| 244 | local module_docs module_enabled module_aliases \ |
284 | local module_docs module_enabled module_aliases \ |
| 245 | module_additions module_examples module_modinfo module_opts |
285 | module_additions module_examples module_modinfo module_opts |
| 246 | |
286 | |
| 247 | for currm_path in ${@} |
287 | for currm_path in ${@} |
| 248 | do |
288 | do |
| 249 | currm=${currm_path//*\/} |
289 | currm=${currm_path//*\/} |
| 250 | currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]') |
290 | currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]') |
|
|
291 | currm_t=${currm} |
|
|
292 | while [[ -z ${currm_t//*-*} ]]; do |
|
|
293 | currm_t=${currm_t/-/_} |
|
|
294 | done |
| 251 | |
295 | |
| 252 | module_docs="$(eval echo \${MODULESD_${currm}_DOCS})" |
296 | module_docs="$(eval echo \${MODULESD_${currm_t}_DOCS})" |
| 253 | module_enabled="$(eval echo \${MODULESD_${currm}_ENABLED})" |
297 | module_enabled="$(eval echo \${MODULESD_${currm_t}_ENABLED})" |
| 254 | module_aliases="$(eval echo \${#MODULESD_${currm/-/_}_ALIASES[*]})" |
298 | module_aliases="$(eval echo \${#MODULESD_${currm_t}_ALIASES[*]})" |
| 255 | module_additions="$(eval echo \${#MODULESD_${currm/-/_}_ADDITIONS[*]})" |
299 | module_additions="$(eval echo \${#MODULESD_${currm_t}_ADDITIONS[*]})" |
| 256 | module_examples="$(eval echo \${#MODULESD_${currm/-/_}_EXAMPLES[*]})" |
300 | module_examples="$(eval echo \${#MODULESD_${currm_t}_EXAMPLES[*]})" |
| 257 | |
301 | |
| 258 | [[ ${module_aliases} -eq 0 ]] && unset module_aliases |
302 | [[ ${module_aliases} -eq 0 ]] && unset module_aliases |
| 259 | [[ ${module_additions} -eq 0 ]] && unset module_additions |
303 | [[ ${module_additions} -eq 0 ]] && unset module_additions |
| 260 | [[ ${module_examples} -eq 0 ]] && unset module_examples |
304 | [[ ${module_examples} -eq 0 ]] && unset module_examples |
| 261 | |
305 | |
| … | |
… | |
| 372 | done |
416 | done |
| 373 | eend 0 |
417 | eend 0 |
| 374 | return 0 |
418 | return 0 |
| 375 | } |
419 | } |
| 376 | |
420 | |
| 377 | display_postinst() { |
|
|
| 378 | # if we haven't determined the version yet, we need too. |
|
|
| 379 | get_version; |
|
|
| 380 | |
|
|
| 381 | local modulename moduledir sourcedir moduletemp file i |
|
|
| 382 | |
|
|
| 383 | file=${ROOT}/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR} |
|
|
| 384 | file=${file/\/\///} |
|
|
| 385 | |
|
|
| 386 | for i in ${MODULE_IGNORE} |
|
|
| 387 | do |
|
|
| 388 | MODULE_NAMES=${MODULE_NAMES//${i}(*} |
|
|
| 389 | done |
|
|
| 390 | |
|
|
| 391 | if [[ -n ${MODULE_NAMES} ]] |
|
|
| 392 | then |
|
|
| 393 | einfo "If you would like to load this module automatically upon boot" |
|
|
| 394 | einfo "please type the following as root:" |
|
|
| 395 | for i in ${MODULE_NAMES} |
|
|
| 396 | do |
|
|
| 397 | unset libdir srcdir objdir |
|
|
| 398 | for n in $(find_module_params ${i}) |
|
|
| 399 | do |
|
|
| 400 | eval ${n/:*}=${n/*:/} |
|
|
| 401 | done |
|
|
| 402 | einfo " # echo \"${modulename}\" >> ${file}" |
|
|
| 403 | done |
|
|
| 404 | einfo |
|
|
| 405 | fi |
|
|
| 406 | } |
|
|
| 407 | |
|
|
| 408 | find_module_params() { |
421 | find_module_params() { |
| 409 | local matched_offset=0 matched_opts=0 test="${@}" temp_var result |
422 | local matched_offset=0 matched_opts=0 test="${@}" temp_var result |
| 410 | local i=0 y=0 z=0 |
423 | local i=0 y=0 z=0 |
| 411 | |
424 | |
| 412 | for((i=0; i<=${#test}; i++)) |
425 | for((i=0; i<=${#test}; i++)) |
| … | |
… | |
| 449 | # -------------------------------- |
462 | # -------------------------------- |
| 450 | |
463 | |
| 451 | linux-mod_pkg_setup() { |
464 | linux-mod_pkg_setup() { |
| 452 | linux-info_pkg_setup; |
465 | linux-info_pkg_setup; |
| 453 | check_kernel_built; |
466 | check_kernel_built; |
| 454 | check_modules_supported; |
467 | strip_modulenames; |
|
|
468 | [[ -n ${MODULE_NAMES} ]] && check_modules_supported |
| 455 | set_kvobj; |
469 | set_kvobj; |
|
|
470 | # Commented out with permission from johnm until a fixed version for arches |
|
|
471 | # who intentionally use different kernel and userland compilers can be |
|
|
472 | # introduced - Jason Wever <weeve@gentoo.org>, 23 Oct 2005 |
|
|
473 | #check_vermagic; |
| 456 | } |
474 | } |
| 457 | |
475 | |
| 458 | linux-mod_src_compile() { |
476 | strip_modulenames() { |
| 459 | local modulename libdir srcdir objdir i n myARCH="${ARCH}" |
477 | local i |
| 460 | unset ARCH |
|
|
| 461 | |
|
|
| 462 | BUILD_TARGETS=${BUILD_TARGETS:-clean module} |
|
|
| 463 | |
|
|
| 464 | for i in ${MODULE_IGNORE} |
478 | for i in ${MODULE_IGNORE}; do |
| 465 | do |
|
|
| 466 | MODULE_NAMES=${MODULE_NAMES//${i}(*} |
479 | MODULE_NAMES=${MODULE_NAMES//${i}(*} |
| 467 | done |
480 | done |
|
|
481 | } |
| 468 | |
482 | |
|
|
483 | linux-mod_src_compile() { |
|
|
484 | local modulename libdir srcdir objdir i n myARCH="${ARCH}" myABI="${ABI}" |
|
|
485 | ARCH="$(tc-arch-kernel)" |
|
|
486 | ABI="${KERNEL_ABI}" |
|
|
487 | CC_HOSTCC=$(tc-getBUILD_CC) |
|
|
488 | CC_CC=$(tc-getCC) |
|
|
489 | |
|
|
490 | BUILD_TARGETS=${BUILD_TARGETS:-clean module} |
|
|
491 | strip_modulenames; |
| 469 | for i in ${MODULE_NAMES} |
492 | for i in ${MODULE_NAMES} |
| 470 | do |
493 | do |
| 471 | unset libdir srcdir objdir |
494 | unset libdir srcdir objdir |
| 472 | for n in $(find_module_params ${i}) |
495 | for n in $(find_module_params ${i}) |
| 473 | do |
496 | do |
| … | |
… | |
| 485 | then |
508 | then |
| 486 | econf ${ECONF_PARAMS} || \ |
509 | econf ${ECONF_PARAMS} || \ |
| 487 | die "Unable to run econf ${ECONF_PARAMS}" |
510 | die "Unable to run econf ${ECONF_PARAMS}" |
| 488 | fi |
511 | fi |
| 489 | |
512 | |
|
|
513 | emake HOSTCC=${CC_HOSTCC} CC=${CC_CC}\ |
| 490 | emake ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS} \ |
514 | ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS} \ |
| 491 | || die "Unable to make \ |
515 | || die "Unable to make \ |
| 492 | ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS}." |
516 | ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS}." |
| 493 | touch ${srcdir}/.built |
517 | touch ${srcdir}/.built |
| 494 | cd ${OLDPWD} |
518 | cd ${OLDPWD} |
| 495 | fi |
519 | fi |
| 496 | done |
520 | done |
| 497 | |
521 | |
| 498 | ARCH="${myARCH}" |
522 | ARCH="${myARCH}" |
|
|
523 | ABI="${myABI}" |
| 499 | } |
524 | } |
| 500 | |
525 | |
| 501 | linux-mod_src_install() { |
526 | linux-mod_src_install() { |
| 502 | local modulename libdir srcdir objdir i n |
527 | local modulename libdir srcdir objdir i n |
| 503 | |
528 | |
| 504 | for i in ${MODULE_IGNORE} |
529 | strip_modulenames; |
| 505 | do |
|
|
| 506 | MODULE_NAMES=${MODULE_NAMES//${i}(*} |
|
|
| 507 | done |
|
|
| 508 | |
|
|
| 509 | for i in ${MODULE_NAMES} |
530 | for i in ${MODULE_NAMES} |
| 510 | do |
531 | do |
| 511 | unset libdir srcdir objdir |
532 | unset libdir srcdir objdir |
| 512 | for n in $(find_module_params ${i}) |
533 | for n in $(find_module_params ${i}) |
| 513 | do |
534 | do |
| … | |
… | |
| 516 | libdir=${libdir:-misc} |
537 | libdir=${libdir:-misc} |
| 517 | srcdir=${srcdir:-${S}} |
538 | srcdir=${srcdir:-${S}} |
| 518 | objdir=${objdir:-${srcdir}} |
539 | objdir=${objdir:-${srcdir}} |
| 519 | |
540 | |
| 520 | einfo "Installing ${modulename} module" |
541 | einfo "Installing ${modulename} module" |
| 521 | cd ${objdir} |
542 | cd ${objdir} || die "${objdir} does not exist" |
| 522 | insinto ${ROOT}lib/modules/${KV_FULL}/${libdir} |
543 | insinto /lib/modules/${KV_FULL}/${libdir} |
| 523 | doins ${modulename}.${KV_OBJ} |
544 | doins ${modulename}.${KV_OBJ} || die "doins ${modulename}.${KV_OBJ} failed" |
| 524 | cd ${OLDPWD} |
545 | cd ${OLDPWD} |
| 525 | |
546 | |
| 526 | generate_modulesd ${objdir}/${modulename} |
547 | generate_modulesd ${objdir}/${modulename} |
| 527 | done |
548 | done |
| 528 | } |
549 | } |
| 529 | |
550 | |
| 530 | linux-mod_pkg_postinst() { |
551 | linux-mod_pkg_postinst() { |
| 531 | update_depmod; |
552 | update_depmod; |
| 532 | update_modules; |
553 | update_modules; |
| 533 | update_moduledb; |
554 | update_moduledb; |
| 534 | display_postinst; |
|
|
| 535 | } |
555 | } |
| 536 | |
556 | |
| 537 | linux-mod_pkg_postrm() { |
557 | linux-mod_pkg_postrm() { |
| 538 | remove_moduledb; |
558 | remove_moduledb; |
| 539 | } |
559 | } |