/[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.34 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.34 2005/04/11 22:26:28 brix 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
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 81
82inherit linux-info 82inherit linux-info
83ECLASS=linux-mod
84INHERITED="$INHERITED $ECLASS"
85EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile 83EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile pkg_postrm
86 84
85IUSE="" # don't put pcmcia here, rather in the ebuilds that actually support pcmcia
87SLOT="0" 86SLOT="0"
88DESCRIPTION="Based on the $ECLASS eclass" 87DESCRIPTION="Based on the $ECLASS eclass"
88RDEPEND="virtual/modutils
89 pcmcia? ( virtual/pcmcia )"
89DEPEND="virtual/linux-sources 90DEPEND="virtual/linux-sources
90 sys-apps/sed 91 sys-apps/sed
91 virtual/modutils 92 pcmcia? ( virtual/pcmcia )"
92 pcmcia? ( sys-apps/pcmcia-cs )"
93 93
94# eclass utilities 94# eclass utilities
95# ---------------------------------- 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}
96 133
97unpack_pcmcia_sources() { 134unpack_pcmcia_sources() {
98 # 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
99 # 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
100 # bail out and assume pcmcia.eclass is working on it. 137 # bail out and assume pcmcia.eclass is working on it.
101 [[ -n ${PCMCIA_SOURCE_DIR} ]] && return 1 138 [[ -n ${PCMCIA_SOURCE_DIR} ]] && return 1
102 139
103 if [[ -f "${1}" ]]; then 140 if [[ -f "${1}" ]]; then
104 PCMCIA_SOURCE_DIR="${WORKDIR}/pcmcia-cs/" 141 PCMCIA_SOURCE_DIR="${WORKDIR}/pcmcia-cs/"
105 142
106 ebegin "Decompressing pcmcia-cs sources" 143 ebegin "Decompressing pcmcia-cs sources"
107 mkdir -p ${PCMCIA_SOURCE_DIR} 144 mkdir -p ${PCMCIA_SOURCE_DIR}
108 tar -xjf ${1} -C ${PCMCIA_SOURCE_DIR} 145 tar -xjf ${1} -C ${PCMCIA_SOURCE_DIR}
109 eend $? 146 eend $?
110 147
140} 177}
141 178
142use_m() { 179use_m() {
143 # if we haven't determined the version yet, we need too. 180 # if we haven't determined the version yet, we need too.
144 get_version; 181 get_version;
145 182
146 # 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
147 # M= instead of SUBDIRS= 184 # M= instead of SUBDIRS=
148 [ ${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 ] && \
149 return 0 || return 1 186 return 0 || return 1
150} 187}
161} 198}
162 199
163update_depmod() { 200update_depmod() {
164 # if we haven't determined the version yet, we need too. 201 # if we haven't determined the version yet, we need too.
165 get_version; 202 get_version;
166 203
167 ebegin "Updating module dependencies for ${KV_FULL}" 204 ebegin "Updating module dependencies for ${KV_FULL}"
168 if [ -r ${KV_OUT_DIR}/System.map ] 205 if [ -r ${KV_OUT_DIR}/System.map ]
169 then 206 then
170 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}
171 eend $? 208 eend $?
185 /sbin/modules-update 222 /sbin/modules-update
186 eend $? 223 eend $?
187 fi 224 fi
188} 225}
189 226
227move_old_moduledb() {
228 local OLDDIR=${ROOT}/usr/share/module-rebuild/
229 local NEWDIR=${ROOT}/var/lib/module-rebuild/
230
231 if [[ -f ${OLDDIR}/moduledb ]]; then
232 [[ ! -d ${NEWDIR} ]] && mkdir -p ${NEWDIR}
233 [[ ! -f ${NEWDIR}/moduledb ]] && \
234 mv ${OLDDIR}/moduledb ${NEWDIR}/moduledb
235 rm -f ${OLDDIR}/*
236 rmdir ${OLDDIR}
237 fi
238}
239
240update_moduledb() {
241 local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/
242 move_old_moduledb
243
244 if [[ ! -f ${MODULEDB_DIR}/moduledb ]]; then
245 [[ ! -d ${MODULEDB_DIR} ]] && mkdir -p ${MODULEDB_DIR}
246 touch ${MODULEDB_DIR}/moduledb
247 fi
248 if [[ -z $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then
249 einfo "Adding module to moduledb."
250 echo "a:1:${CATEGORY}/${PN}-${PVR}" >> ${MODULEDB_DIR}/moduledb
251 fi
252}
253
254remove_moduledb() {
255 local MODULEDB_DIR=${ROOT}/var/lib/module-rebuild/
256 move_old_moduledb
257
258 if [[ -n $(grep ${CATEGORY}/${PN}-${PVR} ${MODULEDB_DIR}/moduledb) ]]; then
259 einfo "Removing ${CATEGORY}/${PN}-${PVR} from moduledb."
260 sed -ie "/.*${CATEGORY}\/${P}.*/d" ${MODULEDB_DIR}/moduledb
261 fi
262}
263
190set_kvobj() { 264set_kvobj() {
191 if kernel_is 2 6 265 if kernel_is 2 6
192 then 266 then
193 KV_OBJ="ko" 267 KV_OBJ="ko"
194 else 268 else
201 275
202generate_modulesd() { 276generate_modulesd() {
203 # This function will generate the neccessary modules.d file from the 277 # This function will generate the neccessary modules.d file from the
204 # information contained in the modules exported parms 278 # information contained in the modules exported parms
205 279
206 local currm_path currm t myIFS myVAR 280 local currm_path currm currm_t t myIFS myVAR
207 local module_docs module_enabled module_aliases \ 281 local module_docs module_enabled module_aliases \
208 module_additions module_examples module_modinfo module_opts 282 module_additions module_examples module_modinfo module_opts
209 283
210 for currm_path in ${@} 284 for currm_path in ${@}
211 do 285 do
212 currm=${currm_path//*\/} 286 currm=${currm_path//*\/}
213 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
214 292
215 module_docs="$(eval echo \${MODULESD_${currm}_DOCS})" 293 module_docs="$(eval echo \${MODULESD_${currm_t}_DOCS})"
216 module_enabled="$(eval echo \${MODULESD_${currm}_ENABLED})" 294 module_enabled="$(eval echo \${MODULESD_${currm_t}_ENABLED})"
217 module_aliases="$(eval echo \${#MODULESD_${currm/-/_}_ALIASES[*]})" 295 module_aliases="$(eval echo \${#MODULESD_${currm_t}_ALIASES[*]})"
218 module_additions="$(eval echo \${#MODULESD_${currm/-/_}_ADDITIONS[*]})" 296 module_additions="$(eval echo \${#MODULESD_${currm_t}_ADDITIONS[*]})"
219 module_examples="$(eval echo \${#MODULESD_${currm/-/_}_EXAMPLES[*]})" 297 module_examples="$(eval echo \${#MODULESD_${currm_t}_EXAMPLES[*]})"
220 298
221 [[ ${module_aliases} -eq 0 ]] && unset module_aliases 299 [[ ${module_aliases} -eq 0 ]] && unset module_aliases
222 [[ ${module_additions} -eq 0 ]] && unset module_additions 300 [[ ${module_additions} -eq 0 ]] && unset module_additions
223 [[ ${module_examples} -eq 0 ]] && unset module_examples 301 [[ ${module_examples} -eq 0 ]] && unset module_examples
224 302
225 # 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
226 # that if its set, we do want it. 304 # that if its set, we do want it.
227 [[ ${module_enabled} == no ]] && return 0 305 [[ ${module_enabled} == no ]] && return 0
228 306
229 # unset any unwanted variables. 307 # unset any unwanted variables.
230 for t in ${!module_*} 308 for t in ${!module_*}
271 echo >> ${module_config} 349 echo >> ${module_config}
272 echo "# Configurable module parameters" >> ${module_config} 350 echo "# Configurable module parameters" >> ${module_config}
273 echo "# ------------------------------" >> ${module_config} 351 echo "# ------------------------------" >> ${module_config}
274 myIFS="${IFS}" 352 myIFS="${IFS}"
275 IFS="$(echo -en "\n\b")" 353 IFS="$(echo -en "\n\b")"
276 354
277 for t in ${module_modinfo} 355 for t in ${module_modinfo}
278 do 356 do
279 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")" 357 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")"
280 if [[ -n ${myVAR} ]] 358 if [[ -n ${myVAR} ]]
281 then 359 then
282 module_opts="${module_opts} ${t%%:*}:${myVAR}" 360 module_opts="${module_opts} ${t%%:*}:${myVAR}"
283 fi 361 fi
284 echo -e "# ${t%%:*}:\t${t#*:}" >> ${module_config} 362 echo -e "# ${t%%:*}:\t${t#*:}" >> ${module_config}
285 done 363 done
286 IFS="${myIFS}" 364 IFS="${myIFS}"
287 echo '' >> ${module_config} 365 echo '' >> ${module_config}
288 fi 366 fi
289 367
290 #----------------------------------------------------------------------- 368 #-----------------------------------------------------------------------
321 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \ 399 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \
322 >> ${module_config} 400 >> ${module_config}
323 done 401 done
324 echo '' >> ${module_config} 402 echo '' >> ${module_config}
325 fi 403 fi
326 404
327 #----------------------------------------------------------------------- 405 #-----------------------------------------------------------------------
328 406
329 # then we install it 407 # then we install it
330 insinto /etc/modules.d 408 insinto /etc/modules.d
331 newins ${module_config} ${currm_path//*\/} 409 newins ${module_config} ${currm_path//*\/}
335 done 413 done
336 eend 0 414 eend 0
337 return 0 415 return 0
338} 416}
339 417
340display_postinst() {
341 # if we haven't determined the version yet, we need too.
342 get_version;
343
344 local modulename moduledir sourcedir moduletemp file i
345
346 file=${ROOT}/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}
347 file=${file/\/\///}
348
349 for i in ${MODULE_IGNORE}
350 do
351 MODULE_NAMES=${MODULE_NAMES//${i}(*}
352 done
353
354 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 do
360 unset libdir srcdir objdir
361 for n in $(find_module_params ${i})
362 do
363 eval ${n/:*}=${n/*:/}
364 done
365 einfo " # echo \"${modulename}\" >> ${file}"
366 done
367 einfo
368 fi
369}
370
371find_module_params() { 418find_module_params() {
372 local matched_offset=0 matched_opts=0 test="${@}" temp_var result 419 local matched_offset=0 matched_opts=0 test="${@}" temp_var result
373 local i=0 y=0 z=0 420 local i=0 y=0 z=0
374 421
375 for((i=0; i<=${#test}; i++)) 422 for((i=0; i<=${#test}; i++))
376 do 423 do
377 case ${test:${i}:1} in 424 case ${test:${i}:1} in
378 \() matched_offset[0]=${i};; 425 \() matched_offset[0]=${i};;
379 \:) matched_opts=$((${matched_opts} + 1)); 426 \:) matched_opts=$((${matched_opts} + 1));
380 matched_offset[${matched_opts}]="${i}";; 427 matched_offset[${matched_opts}]="${i}";;
381 \)) matched_opts=$((${matched_opts} + 1)); 428 \)) matched_opts=$((${matched_opts} + 1));
382 matched_offset[${matched_opts}]="${i}";; 429 matched_offset[${matched_opts}]="${i}";;
383 esac 430 esac
384 done 431 done
385 432
386 for((i=0; i<=${matched_opts}; i++)) 433 for((i=0; i<=${matched_opts}; i++))
387 do 434 do
388 # i = offset were working on 435 # i = offset were working on
389 # y = last offset 436 # y = last offset
390 # z = current offset - last offset 437 # z = current offset - last offset
394 *) y=$((${matched_offset[$((${i} - 1))]} + 1)) 441 *) y=$((${matched_offset[$((${i} - 1))]} + 1))
395 z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]})); 442 z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]}));
396 z=$((${z} - 1)) 443 z=$((${z} - 1))
397 tempvar=${test:${y}:${z}};; 444 tempvar=${test:${y}:${z}};;
398 esac 445 esac
399 446
400 case ${i} in 447 case ${i} in
401 0) result="${result} modulename:${tempvar}";; 448 0) result="${result} modulename:${tempvar}";;
402 1) result="${result} libdir:${tempvar}";; 449 1) result="${result} libdir:${tempvar}";;
403 2) result="${result} srcdir:${tempvar}";; 450 2) result="${result} srcdir:${tempvar}";;
404 3) result="${result} objdir:${tempvar}";; 451 3) result="${result} objdir:${tempvar}";;
405 esac 452 esac
406 done 453 done
407 454
408 echo ${result} 455 echo ${result}
409} 456}
410 457
411# default ebuild functions 458# default ebuild functions
412# -------------------------------- 459# --------------------------------
414linux-mod_pkg_setup() { 461linux-mod_pkg_setup() {
415 linux-info_pkg_setup; 462 linux-info_pkg_setup;
416 check_kernel_built; 463 check_kernel_built;
417 check_modules_supported; 464 check_modules_supported;
418 set_kvobj; 465 set_kvobj;
466 check_vermagic;
419} 467}
420 468
421linux-mod_src_compile() { 469linux-mod_src_compile() {
422 local modulename libdir srcdir objdir i n myARCH="${ARCH}" 470 local modulename libdir srcdir objdir i n myARCH="${ARCH}"
423 unset ARCH 471 ARCH="$(tc-arch-kernel)"
424 472
425 BUILD_TARGETS=${BUILD_TARGETS:-clean module} 473 BUILD_TARGETS=${BUILD_TARGETS:-clean module}
426 474
427 for i in ${MODULE_IGNORE} 475 for i in ${MODULE_IGNORE}
428 do 476 do
429 MODULE_NAMES=${MODULE_NAMES//${i}(*} 477 MODULE_NAMES=${MODULE_NAMES//${i}(*}
430 done 478 done
431 479
437 eval ${n/:*}=${n/*:/} 485 eval ${n/:*}=${n/*:/}
438 done 486 done
439 libdir=${libdir:-misc} 487 libdir=${libdir:-misc}
440 srcdir=${srcdir:-${S}} 488 srcdir=${srcdir:-${S}}
441 objdir=${objdir:-${srcdir}} 489 objdir=${objdir:-${srcdir}}
442 490
443 if [ ! -f "${srcdir}/.built" ]; 491 if [ ! -f "${srcdir}/.built" ];
444 then 492 then
445 cd ${srcdir} 493 cd ${srcdir}
446 einfo "Preparing ${modulename} module" 494 einfo "Preparing ${modulename} module"
447 if [[ -n ${ECONF_PARAMS} ]] 495 if [[ -n ${ECONF_PARAMS} ]]
461 ARCH="${myARCH}" 509 ARCH="${myARCH}"
462} 510}
463 511
464linux-mod_src_install() { 512linux-mod_src_install() {
465 local modulename libdir srcdir objdir i n 513 local modulename libdir srcdir objdir i n
466 514
467 for i in ${MODULE_IGNORE} 515 for i in ${MODULE_IGNORE}
468 do 516 do
469 MODULE_NAMES=${MODULE_NAMES//${i}(*} 517 MODULE_NAMES=${MODULE_NAMES//${i}(*}
470 done 518 done
471 519
483 einfo "Installing ${modulename} module" 531 einfo "Installing ${modulename} module"
484 cd ${objdir} 532 cd ${objdir}
485 insinto ${ROOT}lib/modules/${KV_FULL}/${libdir} 533 insinto ${ROOT}lib/modules/${KV_FULL}/${libdir}
486 doins ${modulename}.${KV_OBJ} 534 doins ${modulename}.${KV_OBJ}
487 cd ${OLDPWD} 535 cd ${OLDPWD}
488 536
489 generate_modulesd ${objdir}/${modulename} 537 generate_modulesd ${objdir}/${modulename}
490 done 538 done
491} 539}
492 540
493linux-mod_pkg_postinst() { 541linux-mod_pkg_postinst() {
494 update_depmod; 542 update_depmod;
495 update_modules; 543 update_modules;
496 display_postinst; 544 update_moduledb;
497} 545}
546
547linux-mod_pkg_postrm() {
548 remove_moduledb;
549}

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

  ViewVC Help
Powered by ViewVC 1.1.20