1 |
# Copyright 1999-2004 Gentoo Foundation |
2 |
# Distributed under the terms of the GNU General Public License v2 |
3 |
# $Header: $ |
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 |
# BUILD_PARAMS <string> The parameters to pass to make. |
22 |
# BUILD_TARGETS <string> clean modules The build targets to pass to make. |
23 |
# MODULE_NAMES <string> This is the modules which are |
24 |
# to be built automatically using the |
25 |
# default pkg_compile/install. They |
26 |
# are explained properly below. |
27 |
# NO_MODULESD <string> Set this to something to prevent |
28 |
# modulesd file generation |
29 |
|
30 |
|
31 |
# MODULE_NAMES - Detailed Overview |
32 |
# |
33 |
# The structure of each MODULE_NAMES entry is as follows: |
34 |
# modulename(libmodulesdir:modulesourcedir) |
35 |
# for example: |
36 |
# MODULE_NAMES="module_pci(pci:${S}/pci) module_usb(usb:${S}/usb)" |
37 |
# |
38 |
# what this would do is |
39 |
# cd ${S}/pci |
40 |
# make ${BUILD_PARAMS} ${BUILD_TARGETS} |
41 |
# insinto /lib/modules/${KV_FULL}/pci |
42 |
# doins module_pci.${KV_OBJ} |
43 |
# |
44 |
# cd ${S}/usb |
45 |
# make ${BUILD_PARAMS} ${BUILD_TARGETS} |
46 |
# insinto /lib/modules/${KV_FULL}/usb |
47 |
# doins module_usb.${KV_OBJ} |
48 |
# |
49 |
# if the modulessourcedir isnt specified, it assumes ${S} |
50 |
# if the libmodulesdir isnt specified, it assumes misc. |
51 |
# if no seperator is defined ":" then it assumes the argument is modulesourcedir |
52 |
|
53 |
inherit linux-info |
54 |
ECLASS=linux-mod |
55 |
INHERITED="$INHERITED $ECLASS" |
56 |
EXPORT_FUNCTIONS pkg_setup pkg_postinst src_compile |
57 |
|
58 |
DESCRIPTION="Based on the $ECLASS eclass" |
59 |
SLOT=0 |
60 |
DEPEND="virtual/linux-sources |
61 |
sys-apps/sed |
62 |
sys-apps/module-init-tools" |
63 |
|
64 |
# eclass utilities |
65 |
# ---------------------------------- |
66 |
|
67 |
use_m() { |
68 |
# if we haven't determined the version yet, we need too. |
69 |
get_version; |
70 |
|
71 |
# if the kernel version is greater than 2.6.6 then we should use |
72 |
# M= instead of SUBDIRS= |
73 |
[ ${KV_MAJOR} -eq 2 -a ${KV_MINOR} -gt 5 -a ${KV_PATCH} -gt 5 ] && \ |
74 |
return 0 || return 1 |
75 |
} |
76 |
|
77 |
convert_to_m() { |
78 |
[ ! -f "${1}" ] && die "convert_to_m() requires a filename as an argument" |
79 |
if use_m |
80 |
then |
81 |
ebegin "Converting ${1/${WORKDIR}\//} to use M= instead of SUBDIRS=" |
82 |
sed -i 's:SUBDIRS=:M=:g' ${1} |
83 |
eend $? |
84 |
fi |
85 |
} |
86 |
|
87 |
update_depmod() { |
88 |
# if we haven't determined the version yet, we need too. |
89 |
get_version; |
90 |
|
91 |
ebegin "Updating module dependencies for ${KV_FULL}" |
92 |
if [ -r ${KV_OUT_DIR}/System.map ] |
93 |
then |
94 |
depmod -ae -F ${KV_OUT_DIR}/System.map -b ${ROOT} -r ${KV_FULL} |
95 |
else |
96 |
ewarn |
97 |
ewarn "${KV_OUT_DIR}/System.map not found." |
98 |
ewarn "You must manually update the kernel module dependencies using depmod." |
99 |
ewarn |
100 |
fi |
101 |
eend $? |
102 |
} |
103 |
|
104 |
update_modules() { |
105 |
if [ -x /sbin/modules-update ] ; |
106 |
then |
107 |
ebegin "Updating modules.conf" |
108 |
/sbin/modules-update |
109 |
eend $? |
110 |
fi |
111 |
} |
112 |
|
113 |
set_kvobj() { |
114 |
if kernel_is 2 6 |
115 |
then |
116 |
KV_OBJ="ko" |
117 |
else |
118 |
KV_OBJ="o" |
119 |
fi |
120 |
einfo "Using KV_OBJ=${KV_OBJ}" |
121 |
} |
122 |
|
123 |
generate_modulesd() { |
124 |
# This function will generate the neccessary modules.d file from the |
125 |
# information contained in the modules exported parms |
126 |
|
127 |
local selectedmodule selectedmodule_full selectedmodulevars parameter modinfop arg xifs temp |
128 |
local module_docs module_opts module_aliases module_config |
129 |
|
130 |
for arg in ${@} |
131 |
do |
132 |
selectedmodule_full="${arg}" |
133 |
# strip the directory |
134 |
selectedmodule="${selectedmodule_full/*\//}" |
135 |
# convert the modulename to uppercase |
136 |
selectedmodule="$(echo ${selectedmodule} | tr '[:lower:]' '[:upper:]')" |
137 |
|
138 |
module_docs="MODULESD_${selectedmodule}_DOCS" |
139 |
module_aliases="$(eval echo \$\{#MODULESD_${selectedmodule}_ALIASES[*]\})" |
140 |
[ ${module_aliases} == 0 ] && unset module_aliases |
141 |
module_docs="${!module_docs}" |
142 |
modinfop="$(modinfo -p ${selectedmodule_full}.${KV_OBJ})" |
143 |
|
144 |
# By now we know if there is anything we can use to generate a file with |
145 |
# so unset empty vars and bail out if we find nothing. |
146 |
for parameter in ${!module_*} |
147 |
do |
148 |
[ -z "${!parameter}" ] && unset ${parameter} |
149 |
done |
150 |
[ -z "${!module_*}" -a -z "${modinfop}" ] && return |
151 |
|
152 |
#so now we can set the configfilevar |
153 |
module_config="${T}/modulesd-${selectedmodule}" |
154 |
|
155 |
# and being working on things. |
156 |
ebegin "Preparing file for modules.d" |
157 |
echo "# modules.d config file for ${selectedmodule}" >> ${module_config} |
158 |
echo "# this file was automatically generated from linux-mod.eclass" >> ${module_config} |
159 |
for temp in ${module_docs} |
160 |
do |
161 |
echo "# Please read ${temp/*\//} for more info" >> ${module_config} |
162 |
done |
163 |
|
164 |
if [ ${module_aliases} > 0 ]; |
165 |
then |
166 |
echo >> ${module_config} |
167 |
echo "# Internal Aliases - Do not edit" >> ${module_config} |
168 |
echo "# ------------------------------" >> ${module_config} |
169 |
|
170 |
(( module_aliases-- )) |
171 |
for temp in $(seq 0 ${module_aliases}) |
172 |
do |
173 |
echo "alias $(eval echo \$\{MODULESD_${selectedmodule}_ALIASES[$temp]\})" >> ${module_config} |
174 |
done |
175 |
fi |
176 |
|
177 |
# and then stating any module parameters defined from the module |
178 |
if [ -n "${modinfop}" ]; |
179 |
then |
180 |
echo >> ${module_config} |
181 |
echo "# Configurable module parameters" >> ${module_config} |
182 |
echo "# ------------------------------" >> ${module_config} |
183 |
|
184 |
xifs="${IFS}" |
185 |
IFS="$(echo -en "\n\b")" |
186 |
for parameter in ${modinfop} |
187 |
do |
188 |
temp="$(echo ${parameter#*:} | grep -e " [0-9][ =]" | sed "s:.*\([01][= ]\).*:\1:")" |
189 |
if [ -n "${temp}" ]; |
190 |
then |
191 |
module_opts="${module_opts} ${parameter%%:*}:${temp}" |
192 |
fi |
193 |
echo -e "# ${parameter%%:*}:\t${parameter#*:}" >> ${module_config} |
194 |
done |
195 |
IFS="${xifs}" |
196 |
fi |
197 |
|
198 |
# and any examples we can gather from them |
199 |
if [ -n "${module_opts}" ]; |
200 |
then |
201 |
echo >> ${module_config} |
202 |
echo "# For Example..." >> ${module_config} |
203 |
echo "# ------------------------------" >> ${module_config} |
204 |
for parameter in ${module_opts} |
205 |
do |
206 |
echo "# options ${selectedmodule_full/*\//} ${parameter//:*}=${parameter//*:}" >> ${module_config} |
207 |
done |
208 |
fi |
209 |
|
210 |
# then we install it |
211 |
insinto /etc/modules.d |
212 |
newins ${module_config} ${selectedmodule_full/*\//} |
213 |
|
214 |
# and install any documentation we might have. |
215 |
[ -n "${module_docs}" ] && dodoc ${module_docs} |
216 |
done |
217 |
eend 0 |
218 |
} |
219 |
|
220 |
display_postinst() { |
221 |
# if we haven't determined the version yet, we need too. |
222 |
get_version; |
223 |
|
224 |
local modulename moduledir sourcedir moduletemp file i |
225 |
|
226 |
file=${ROOT}/etc/modules.autoload.d/kernel-${KV_MAJOR}.${KV_MINOR} |
227 |
file=${file/\/\///} |
228 |
|
229 |
einfo "If you would like to load this module automatically upon boot" |
230 |
einfo "please type the following as root:" |
231 |
for i in ${MODULE_NAMES} |
232 |
do |
233 |
moduletemp="$(echo ${i} | sed -e "s:\(.*\)(\(.*\)):\1 \2:")" |
234 |
modulename="${moduletemp/ */}" |
235 |
moduletemp="${moduletemp/* /}" |
236 |
# if we specify two args, then we can set moduledir |
237 |
[ -z "${moduletemp/*:*/}" ] && moduledir="${moduletemp/:*/}" |
238 |
# if we didnt pass the brackets, then we shouldnt accept anything |
239 |
[ -n "${moduletemp/${modulename}/}" ] && sourcedir="${moduletemp/*:/}" |
240 |
moduledir="${moduledir:-misc}" |
241 |
sourcedir="${sourcedir:-${S}}" |
242 |
|
243 |
einfo " # echo \"${modulename}\" >> ${file}" |
244 |
done |
245 |
echo |
246 |
} |
247 |
|
248 |
# default ebuild functions |
249 |
# -------------------------------- |
250 |
|
251 |
linux-mod_pkg_setup() { |
252 |
linux-info_pkg_setup; |
253 |
check_kernel_built; |
254 |
check_modules_supported; |
255 |
check_extra_config; |
256 |
set_kvobj; |
257 |
} |
258 |
|
259 |
linux-mod_src_compile() { |
260 |
local modulename moduledir sourcedir moduletemp xarch i |
261 |
xarch="${ARCH}" |
262 |
unset ARCH |
263 |
|
264 |
for i in ${MODULE_NAMES} |
265 |
do |
266 |
moduletemp="$(echo ${i} | sed -e "s:\(.*\)(\(.*\)):\1 \2:")" |
267 |
modulename="${moduletemp/ */}" |
268 |
moduletemp="${moduletemp/* /}" |
269 |
# if we specify two args, then we can set moduledir |
270 |
[ -z "${moduletemp/*:*/}" ] && moduledir="${moduletemp/:*/}" |
271 |
# if we didnt pass the brackets, then we shouldnt accept anything |
272 |
[ -n "${moduletemp/${modulename}/}" ] && sourcedir="${moduletemp/*:/}" |
273 |
moduledir="${moduledir:-misc}" |
274 |
sourcedir="${sourcedir:-${S}}" |
275 |
|
276 |
einfo "Preparing ${modulename} module" |
277 |
cd ${sourcedir} |
278 |
emake ${BUILD_PARAMS} ${BUILD_TARGETS:-clean module} || die Unable to make ${BUILD_PARAMS} ${BUILD_TARGETS:-clean module}. |
279 |
done |
280 |
ARCH="${xarch}" |
281 |
} |
282 |
|
283 |
linux-mod_src_install() { |
284 |
local modulename moduledir sourcedir moduletemp i |
285 |
|
286 |
for i in ${MODULE_NAMES} |
287 |
do |
288 |
moduletemp="$(echo ${i} | sed -e "s:\(.*\)(\(.*\)):\1 \2:")" |
289 |
modulename="${moduletemp/ */}" |
290 |
moduletemp="${moduletemp/* /}" |
291 |
# if we specify two args, then we can set moduledir |
292 |
[ -z "${moduletemp/*:*/}" ] && moduledir="${moduletemp/:*/}" |
293 |
# if we didnt pass the brackets, then we shouldnt accept anything |
294 |
[ -n "${moduletemp/${modulename}/}" ] && sourcedir="${moduletemp/*:/}" |
295 |
moduledir="${moduledir:-misc}" |
296 |
sourcedir="${sourcedir:-${S}}" |
297 |
|
298 |
einfo "Installing ${modulename} module" |
299 |
cd ${sourcedir} |
300 |
insinto /lib/modules/${KV_FULL}/${moduledir} |
301 |
doins ${modulename}.${KV_OBJ} |
302 |
|
303 |
[ -z "${NO_MODULESD}" ] && generate_modulesd ${sourcedir}/${modulename} |
304 |
done |
305 |
} |
306 |
|
307 |
linux-mod_pkg_postinst() { |
308 |
update_depmod; |
309 |
update_modules; |
310 |
display_postinst; |
311 |
} |