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

Contents of /eclass/linux-mod.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.32 - (hide annotations) (download)
Mon Mar 28 09:27:31 2005 UTC (9 years, 5 months ago) by johnm
Branch: MAIN
Changes since 1.31: +3 -2 lines
Fixing small bug (#86650) with linux-mod/convert_to_m, thanks to Stefan Schweizer

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 johnm 1.32 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-mod.eclass,v 1.31 2005/03/11 23:11:05 kingtaco Exp $
4 johnm 1.1
5 johnm 1.10 # 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 johnm 1.26 # 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 johnm 1.10
35     # MODULE_NAMES - Detailed Overview
36     #
37     # The structure of each MODULE_NAMES entry is as follows:
38 johnm 1.26 # modulename(libdir:srcdir:objdir)
39 johnm 1.10 # for example:
40 johnm 1.26 # MODULE_NAMES="module_pci(pci:${S}/pci:${S}) module_usb(usb:${S}/usb:${S})"
41 johnm 1.10 #
42     # what this would do is
43     # cd ${S}/pci
44     # make ${BUILD_PARAMS} ${BUILD_TARGETS}
45 johnm 1.26 # cd ${S}
46 johnm 1.10 # insinto /lib/modules/${KV_FULL}/pci
47     # doins module_pci.${KV_OBJ}
48     #
49     # cd ${S}/usb
50     # make ${BUILD_PARAMS} ${BUILD_TARGETS}
51 johnm 1.26 # cd ${S}
52 johnm 1.10 # insinto /lib/modules/${KV_FULL}/usb
53     # doins module_usb.${KV_OBJ}
54     #
55 johnm 1.26 # 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 johnm 1.1
82     inherit linux-info
83     ECLASS=linux-mod
84     INHERITED="$INHERITED $ECLASS"
85 johnm 1.26 EXPORT_FUNCTIONS pkg_setup pkg_postinst src_install src_compile \
86     src_compile_userland src_install_userland
87 johnm 1.1
88 johnm 1.26 SLOT="0"
89 johnm 1.1 DESCRIPTION="Based on the $ECLASS eclass"
90     DEPEND="virtual/linux-sources
91 johnm 1.11 sys-apps/sed
92 johnm 1.17 virtual/modutils"
93 johnm 1.1
94 johnm 1.26
95 johnm 1.1 # eclass utilities
96     # ----------------------------------
97    
98     use_m() {
99     # if we haven't determined the version yet, we need too.
100     get_version;
101    
102     # if the kernel version is greater than 2.6.6 then we should use
103 johnm 1.8 # M= instead of SUBDIRS=
104 johnm 1.1 [ ${KV_MAJOR} -eq 2 -a ${KV_MINOR} -gt 5 -a ${KV_PATCH} -gt 5 ] && \
105     return 0 || return 1
106     }
107    
108     convert_to_m() {
109     if use_m
110     then
111 johnm 1.32 [ ! -f "${1}" ] && \
112     die "convert_to_m() requires a filename as an argument"
113 johnm 1.8 ebegin "Converting ${1/${WORKDIR}\//} to use M= instead of SUBDIRS="
114 johnm 1.1 sed -i 's:SUBDIRS=:M=:g' ${1}
115     eend $?
116     fi
117     }
118    
119     update_depmod() {
120     # if we haven't determined the version yet, we need too.
121     get_version;
122    
123     ebegin "Updating module dependencies for ${KV_FULL}"
124 johnm 1.5 if [ -r ${KV_OUT_DIR}/System.map ]
125 johnm 1.1 then
126 johnm 1.5 depmod -ae -F ${KV_OUT_DIR}/System.map -b ${ROOT} -r ${KV_FULL}
127 johnm 1.18 eend $?
128 johnm 1.1 else
129     ewarn
130 johnm 1.5 ewarn "${KV_OUT_DIR}/System.map not found."
131 johnm 1.1 ewarn "You must manually update the kernel module dependencies using depmod."
132 johnm 1.18 eend 1
133 johnm 1.1 ewarn
134     fi
135     }
136    
137 johnm 1.3 update_modules() {
138 kingtaco 1.31 if [ -x /sbin/modules-update ] && \
139     grep -v -e "^#" -e "^$" ${D}/etc/modules.d/* >/dev/null 2>&1; then
140 johnm 1.3 ebegin "Updating modules.conf"
141     /sbin/modules-update
142     eend $?
143     fi
144     }
145    
146 johnm 1.1 set_kvobj() {
147     if kernel_is 2 6
148     then
149     KV_OBJ="ko"
150     else
151     KV_OBJ="o"
152     fi
153 johnm 1.26 # Do we really need to know this?
154     # Lets silence it.
155     # einfo "Using KV_OBJ=${KV_OBJ}"
156 johnm 1.1 }
157    
158 johnm 1.11 generate_modulesd() {
159     # This function will generate the neccessary modules.d file from the
160     # information contained in the modules exported parms
161 johnm 1.26
162     local currm_path currm t myIFS myVAR
163     local module_docs module_enabled module_aliases \
164     module_additions module_examples module_modinfo module_opts
165    
166     for currm_path in ${@}
167 johnm 1.11 do
168 johnm 1.26 currm=${currm_path//*\/}
169     currm=$(echo ${currm} | tr '[:lower:]' '[:upper:]')
170    
171     module_docs="$(eval echo \${MODULESD_${currm}_DOCS})"
172     module_enabled="$(eval echo \${MODULESD_${currm}_ENABLED})"
173 johnm 1.30 module_aliases="$(eval echo \${#MODULESD_${currm/-/_}_ALIASES[*]})"
174     module_additions="$(eval echo \${#MODULESD_${currm/-/_}_ADDITIONS[*]})"
175     module_examples="$(eval echo \${#MODULESD_${currm/-/_}_EXAMPLES[*]})"
176 johnm 1.26
177 johnm 1.27 [[ ${module_aliases} -eq 0 ]] && unset module_aliases
178     [[ ${module_additions} -eq 0 ]] && unset module_additions
179     [[ ${module_examples} -eq 0 ]] && unset module_examples
180 johnm 1.26
181     # If we specify we dont want it, then lets exit, otherwise we assume
182     # that if its set, we do want it.
183     [[ ${module_enabled} == no ]] && return 0
184    
185     # unset any unwanted variables.
186     for t in ${!module_*}
187 johnm 1.11 do
188 johnm 1.26 [[ -z ${!t} ]] && unset ${t}
189 johnm 1.11 done
190    
191 johnm 1.26 [[ -z ${!module_*} ]] && return 0
192    
193     # OK so now if we have got this far, then we know we want to continue
194     # and generate the modules.d file.
195     module_modinfo="$(modinfo -p ${currm_path}.${KV_OBJ})"
196     module_config="${T}/modulesd-${currm}"
197    
198 johnm 1.11 ebegin "Preparing file for modules.d"
199 johnm 1.26 #-----------------------------------------------------------------------
200     echo "# modules.d configuration file for ${currm}" >> ${module_config}
201     #-----------------------------------------------------------------------
202     [[ -n ${module_docs} ]] && \
203     echo "# For more information please read:" >> ${module_config}
204     for t in ${module_docs}
205 johnm 1.11 do
206 johnm 1.26 echo "# ${t//*\/}" >> ${module_config}
207 johnm 1.11 done
208 johnm 1.26 echo >> ${module_config}
209 johnm 1.11
210 johnm 1.26 #-----------------------------------------------------------------------
211 johnm 1.27 if [[ ${module_aliases} -gt 0 ]]
212 johnm 1.11 then
213     echo "# Internal Aliases - Do not edit" >> ${module_config}
214     echo "# ------------------------------" >> ${module_config}
215 johnm 1.12
216 johnm 1.26 for((t=0; t<${module_aliases}; t++))
217 johnm 1.11 do
218 johnm 1.26 echo "alias $(eval echo \${MODULESD_${currm}_ALIASES[$t]})" \
219     >> ${module_config}
220 johnm 1.12 done
221 johnm 1.26 echo '' >> ${module_config}
222 johnm 1.11 fi
223    
224 johnm 1.26 #-----------------------------------------------------------------------
225     if [[ -n ${module_modinfo} ]]
226 johnm 1.11 then
227     echo >> ${module_config}
228     echo "# Configurable module parameters" >> ${module_config}
229     echo "# ------------------------------" >> ${module_config}
230 johnm 1.26 myIFS="${IFS}"
231 johnm 1.11 IFS="$(echo -en "\n\b")"
232 johnm 1.26
233     for t in ${module_modinfo}
234 johnm 1.11 do
235 johnm 1.26 myVAR="$(echo ${t#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")"
236     if [[ -n ${myVAR} ]]
237 johnm 1.11 then
238 johnm 1.26 module_opts="${module_opts} ${t%%:*}:${myVAR}"
239 johnm 1.11 fi
240 johnm 1.26 echo -e "# ${t%%:*}:\t${t#*:}" >> ${module_config}
241     done
242     IFS="${myIFS}"
243     echo '' >> ${module_config}
244     fi
245    
246     #-----------------------------------------------------------------------
247     if [[ $(eval echo \${MODULESD_${currm}_ALIASES[0]}) == guess ]]
248     then
249     # So lets do some guesswork eh?
250     if [[ -n ${module_opts} ]]
251     then
252     echo "# For Example..." >> ${module_config}
253     echo "# --------------" >> ${module_config}
254     for t in ${module_opts}
255     do
256     echo "# options ${currm} ${t//:*}=${t//*:}" >> ${module_config}
257     done
258     echo '' >> ${module_config}
259     fi
260 johnm 1.27 elif [[ ${module_examples} -gt 0 ]]
261 johnm 1.26 then
262     echo "# For Example..." >> ${module_config}
263     echo "# --------------" >> ${module_config}
264     for((t=0; t<${module_examples}; t++))
265     do
266     echo "options $(eval echo \${MODULESD_${currm}_EXAMPLES[$t]})" \
267     >> ${module_config}
268 johnm 1.11 done
269 johnm 1.26 echo '' >> ${module_config}
270 johnm 1.11 fi
271 johnm 1.26
272     #-----------------------------------------------------------------------
273 johnm 1.27 if [[ ${module_additions} -gt 0 ]]
274 johnm 1.11 then
275 johnm 1.26 for((t=0; t<${module_additions}; t++))
276 johnm 1.11 do
277 johnm 1.26 echo "$(eval echo \${MODULESD_${currm}_ADDITIONS[$t]})" \
278     >> ${module_config}
279 johnm 1.11 done
280 johnm 1.26 echo '' >> ${module_config}
281 johnm 1.11 fi
282    
283 johnm 1.26 #-----------------------------------------------------------------------
284    
285 johnm 1.12 # then we install it
286 johnm 1.11 insinto /etc/modules.d
287 johnm 1.27 newins ${module_config} ${currm_path//*\/}
288    
289 johnm 1.12 # and install any documentation we might have.
290 johnm 1.26 [[ -n ${module_docs} ]] && dodoc ${module_docs}
291 johnm 1.11 done
292     eend 0
293 johnm 1.26 return 0
294 johnm 1.11 }
295    
296 johnm 1.1 display_postinst() {
297     # if we haven't determined the version yet, we need too.
298     get_version;
299    
300 johnm 1.10 local modulename moduledir sourcedir moduletemp file i
301 johnm 1.1
302     file=${ROOT}/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR}
303     file=${file/\/\///}
304    
305 johnm 1.20 for i in ${MODULE_IGNORE}
306     do
307     MODULE_NAMES=${MODULE_NAMES//${i}(*}
308     done
309    
310 johnm 1.22 if [[ -n ${MODULE_NAMES} ]]
311     then
312     einfo "If you would like to load this module automatically upon boot"
313     einfo "please type the following as root:"
314     for i in ${MODULE_NAMES}
315 johnm 1.20 do
316 johnm 1.23 unset libdir srcdir objdir
317 johnm 1.22 for n in $(find_module_params ${i})
318     do
319     eval ${n/:*}=${n/*:/}
320     done
321     einfo " # echo \"${modulename}\" >> ${file}"
322 johnm 1.20 done
323 johnm 1.22 einfo
324     fi
325 johnm 1.1 }
326    
327 johnm 1.18 find_module_params() {
328     local matched_offset=0 matched_opts=0 test="${@}" temp_var result
329     local i=0 y=0 z=0
330    
331     for((i=0; i<=${#test}; i++))
332     do
333     case ${test:${i}:1} in
334     \() matched_offset[0]=${i};;
335     \:) matched_opts=$((${matched_opts} + 1));
336     matched_offset[${matched_opts}]="${i}";;
337     \)) matched_opts=$((${matched_opts} + 1));
338     matched_offset[${matched_opts}]="${i}";;
339     esac
340     done
341    
342     for((i=0; i<=${matched_opts}; i++))
343     do
344     # i = offset were working on
345     # y = last offset
346     # z = current offset - last offset
347     # temp_var = temporary name
348     case ${i} in
349     0) tempvar=${test:0:${matched_offset[0]}};;
350     *) y=$((${matched_offset[$((${i} - 1))]} + 1))
351     z=$((${matched_offset[${i}]} - ${matched_offset[$((${i} - 1))]}));
352     z=$((${z} - 1))
353     tempvar=${test:${y}:${z}};;
354     esac
355    
356     case ${i} in
357     0) result="${result} modulename:${tempvar}";;
358     1) result="${result} libdir:${tempvar}";;
359     2) result="${result} srcdir:${tempvar}";;
360     3) result="${result} objdir:${tempvar}";;
361     esac
362     done
363    
364     echo ${result}
365     }
366    
367 johnm 1.1 # default ebuild functions
368     # --------------------------------
369    
370     linux-mod_pkg_setup() {
371 johnm 1.6 linux-info_pkg_setup;
372     check_kernel_built;
373 johnm 1.1 check_modules_supported;
374     set_kvobj;
375     }
376    
377 johnm 1.26 linux-mod_src_compile_userland() {
378     return 0
379     }
380    
381     linux-mod_src_install_userland() {
382     return 0
383     }
384    
385 johnm 1.1 linux-mod_src_compile() {
386 johnm 1.26 local modulename libdir srcdir objdir i n myARCH="${ARCH}"
387 johnm 1.21 unset ARCH
388 johnm 1.26
389 johnm 1.16 BUILD_TARGETS=${BUILD_TARGETS:-clean module}
390 johnm 1.20
391     for i in ${MODULE_IGNORE}
392     do
393     MODULE_NAMES=${MODULE_NAMES//${i}(*}
394     done
395 johnm 1.1
396 johnm 1.9 for i in ${MODULE_NAMES}
397 johnm 1.1 do
398 johnm 1.23 unset libdir srcdir objdir
399 johnm 1.18 for n in $(find_module_params ${i})
400     do
401     eval ${n/:*}=${n/*:/}
402     done
403     libdir=${libdir:-misc}
404     srcdir=${srcdir:-${S}}
405     objdir=${objdir:-${srcdir}}
406 johnm 1.10
407 johnm 1.18 if [ ! -f "${srcdir}/.built" ];
408 johnm 1.16 then
409 johnm 1.18 cd ${srcdir}
410 johnm 1.16 einfo "Preparing ${modulename} module"
411 johnm 1.22 if [[ -n ${ECONF_PARAMS} ]]
412     then
413     econf ${ECONF_PARAMS} || \
414     die "Unable to run econf ${ECONF_PARAMS}"
415     fi
416    
417 johnm 1.21 emake ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS} \
418 johnm 1.18 || die "Unable to make \
419     ${BUILD_FIXES} ${BUILD_PARAMS} ${BUILD_TARGETS}."
420     touch ${srcdir}/.built
421 johnm 1.16 cd ${OLDPWD}
422     fi
423 johnm 1.1 done
424 johnm 1.26
425     ARCH="${myARCH}"
426 johnm 1.1 }
427    
428     linux-mod_src_install() {
429 johnm 1.18 local modulename libdir srcdir objdir i n
430 johnm 1.20
431     for i in ${MODULE_IGNORE}
432     do
433     MODULE_NAMES=${MODULE_NAMES//${i}(*}
434     done
435 johnm 1.1
436 johnm 1.9 for i in ${MODULE_NAMES}
437 johnm 1.1 do
438 johnm 1.23 unset libdir srcdir objdir
439 johnm 1.18 for n in $(find_module_params ${i})
440     do
441     eval ${n/:*}=${n/*:/}
442     done
443     libdir=${libdir:-misc}
444     srcdir=${srcdir:-${S}}
445     objdir=${objdir:-${srcdir}}
446 johnm 1.1
447     einfo "Installing ${modulename} module"
448 johnm 1.18 cd ${objdir}
449 johnm 1.26 insinto ${ROOT}lib/modules/${KV_FULL}/${libdir}
450 johnm 1.1 doins ${modulename}.${KV_OBJ}
451 johnm 1.16 cd ${OLDPWD}
452 johnm 1.11
453 johnm 1.26 generate_modulesd ${objdir}/${modulename}
454 johnm 1.1 done
455     }
456    
457     linux-mod_pkg_postinst() {
458     update_depmod;
459 johnm 1.3 update_modules;
460 johnm 1.1 display_postinst;
461     }

  ViewVC Help
Powered by ViewVC 1.1.20