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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.21 - (hide annotations) (download)
Mon Jan 31 20:03:47 2005 UTC (9 years, 8 months ago) by johnm
Branch: MAIN
Changes since 1.20: +52 -63 lines
Multiple fixes.

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 johnm 1.21 # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.16 2005/01/06 13:58:15 johnm Exp $
4 johnm 1.1 #
5 johnm 1.10 # Description: This eclass is used as a central eclass for accessing kernel
6     # related information for sources already installed.
7     # It is vital for linux-mod to function correctly, and is split
8     # out so that any ebuild behaviour "templates" are abstracted out
9     # using additional eclasses.
10 johnm 1.1 #
11 johnm 1.10 # Maintainer: John Mylchreest <johnm@gentoo.org>
12     # Copyright 2004 Gentoo Linux
13     #
14     # Please direct your bugs to the current eclass maintainer :)
15    
16     # A Couple of env vars are available to effect usage of this eclass
17     # These are as follows:
18     #
19 johnm 1.21 # Env Var Option Description
20 johnm 1.10 # KERNEL_DIR <string> The directory containing kernel the target kernel
21 johnm 1.21 # sources.
22 johnm 1.10 # CONFIG_CHECK <string> a list of .config options to check for before
23 johnm 1.21 # proceeding with the install. ie: CONFIG_CHECK="MTRR"
24     # You can also check that an option doesn't exist by
25     # prepending it with an exclamation mark (!).
26     # ie: CONFIG_CHECK="!MTRR"
27     # ERROR_CFG <string> The error message to display when the above check
28     # fails. <CFG> should reference the appropriate option
29     # as above. ie: MTRR_ERROR="MTRR exists in the .config
30     # but shouldn't!!"
31 johnm 1.10 # KBUILD_OUTPUT <string> This is passed on commandline, or can be set from
32 johnm 1.21 # the kernel makefile. This contains the directory
33     # which is to be used as the kernel object directory.
34 johnm 1.10
35     # There are also a couple of variables which are set by this, and shouldn't be
36     # set by hand. These are as follows:
37     #
38     # Env Var Option Description
39     # KV_FULL <string> The full kernel version. ie: 2.6.9-gentoo-johnm-r1
40     # KV_MAJOR <integer> The kernel major version. ie: 2
41     # KV_MINOR <integer> The kernel minor version. ie: 6
42     # KV_PATCH <integer> The kernel patch version. ie: 9
43     # KV_EXTRA <string> The kernel EXTRAVERSION. ie: -gentoo
44     # KV_LOCAL <string> The kernel LOCALVERSION concatenation. ie: -johnm
45     # KV_DIR <string> The kernel source directory, will be null if
46 johnm 1.21 # KERNEL_DIR is invalid.
47     # KV_OUT_DIR <string> The kernel object directory. will be KV_DIR unless
48     # koutput is used. This should be used for referencing
49     # .config.
50 johnm 1.10
51 johnm 1.21 # And to ensure all the weirdness with crosscompile
52     inherit toolchain-funcs
53 johnm 1.1
54     ECLASS=linux-info
55     INHERITED="$INHERITED $ECLASS"
56 johnm 1.8 EXPORT_FUNCTIONS pkg_setup
57 johnm 1.1
58     # Overwritable environment Var's
59     # ---------------------------------------
60 johnm 1.21 KERNEL_DIR="${KERNEL_DIR:-${ROOT}usr/src/linux}"
61 johnm 1.1
62 johnm 1.7
63 johnm 1.16 # Bug fixes
64     # fix to bug #75034
65     case ${ARCH} in
66     ppc) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
67     ppc64) BUILD_FIXES="${BUILD_FIXES} TOUT=${T}/.tmp_gas_check";;
68     esac
69    
70 johnm 1.21 # These are legacy wrappers for toolchain-funcs.
71     # I dont like them here, but oh well.
72     set_arch_to_kernel() { $(tc-arch-kernel); }
73     set_arch_to_portage() { $(tc-arch); }
74 johnm 1.11
75     # qeinfo "Message"
76     # -------------------
77 johnm 1.21 # qeinfo is a quiet einfo call when EBUILD_PHASE
78 johnm 1.11 # should not have visible output.
79 johnm 1.21 qout() {
80     local outputmsg type
81     type=${1}
82     shift
83     outputmsg="${@}"
84 johnm 1.11 case "${EBUILD_PHASE}" in
85     depend) unset outputmsg;;
86     clean) unset outputmsg;;
87     preinst) unset outputmsg;;
88     esac
89 johnm 1.21 [ -n "${outputmsg}" ] && ${type} "${outputmsg}"
90 johnm 1.11 }
91    
92 johnm 1.21 qeinfo() { qout einfo "${@}" ; }
93     qeerror() { qout eerror "${@}" ; }
94 johnm 1.11
95 johnm 1.1 # File Functions
96     # ---------------------------------------
97    
98     # getfilevar accepts 2 vars as follows:
99     # getfilevar <VARIABLE> <CONFIGFILE>
100    
101     getfilevar() {
102 johnm 1.21 local ERROR workingdir basefname basedname myARCH="${ARCH}"
103 johnm 1.1 ERROR=0
104 johnm 1.16
105 johnm 1.1 [ -z "${1}" ] && ERROR=1
106     [ ! -f "${2}" ] && ERROR=1
107    
108     if [ "${ERROR}" = 1 ]
109     then
110 johnm 1.6 ebeep
111     echo -e "\n"
112 johnm 1.1 eerror "getfilevar requires 2 variables, with the second a valid file."
113     eerror " getfilevar <VARIABLE> <CONFIGFILE>"
114     else
115 johnm 1.6 workingdir=${PWD}
116     basefname=$(basename ${2})
117     basedname=$(dirname ${2})
118     unset ARCH
119 johnm 1.21
120 johnm 1.6 cd ${basedname}
121 johnm 1.7 echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
122 johnm 1.16 make ${BUILD_FIXES} -f - e 2>/dev/null
123 johnm 1.6 cd ${workingdir}
124 johnm 1.21
125     ARCH=${myARCH}
126 johnm 1.1 fi
127     }
128    
129 johnm 1.7 linux_chkconfig_present() {
130 johnm 1.1 local RESULT
131 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
132 johnm 1.1 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
133     }
134    
135 johnm 1.7 linux_chkconfig_module() {
136 johnm 1.1 local RESULT
137 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
138 johnm 1.1 [ "${RESULT}" = "m" ] && return 0 || return 1
139     }
140    
141 johnm 1.7 linux_chkconfig_builtin() {
142 johnm 1.1 local RESULT
143 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
144 johnm 1.1 [ "${RESULT}" = "y" ] && return 0 || return 1
145     }
146    
147 johnm 1.7 linux_chkconfig_string() {
148     getfilevar "CONFIG_${1}" "${KV_OUT_DIR}/.config"
149     }
150    
151 johnm 1.1 # Versioning Functions
152     # ---------------------------------------
153    
154     # kernel_is returns true when the version is the same as the passed version
155     #
156     # For Example where KV = 2.6.9
157     # kernel_is 2 4 returns false
158     # kernel_is 2 returns true
159     # kernel_is 2 6 returns true
160     # kernel_is 2 6 8 returns false
161     # kernel_is 2 6 9 returns true
162 johnm 1.3 #
163 johnm 1.1 # got the jist yet?
164    
165     kernel_is() {
166     # if we haven't determined the version yet, we need too.
167     get_version;
168    
169 mrness 1.15 local RESULT operator test value i len
170 johnm 1.12 RESULT=0
171 johnm 1.1
172 johnm 1.13 operator="="
173 johnm 1.12 if [ "${1}" == "lt" ]
174     then
175     operator="-lt"
176     shift
177     elif [ "${1}" == "gt" ]
178     then
179     operator="-gt"
180     shift
181     elif [ "${1}" == "le" ]
182     then
183     operator="-le"
184     shift
185     elif [ "${1}" == "ge" ]
186     then
187     operator="-ge"
188     shift
189     fi
190    
191 johnm 1.1 if [ -n "${1}" ]
192     then
193 johnm 1.14 value="${value}${1}"
194     test="${test}${KV_MAJOR}"
195 johnm 1.1 fi
196     if [ -n "${2}" ]
197     then
198 mrness 1.15 len=$[ 3 - ${#2} ]
199     for((i=0; i<$len; i++)); do
200     value="${value}0"
201     done
202 johnm 1.14 value="${value}${2}"
203 mrness 1.15
204     len=$[ 3 - ${#KV_MINOR} ]
205     for((i=0; i<$len; i++)); do
206     test="${test}0"
207     done
208 johnm 1.14 test="${test}${KV_MINOR}"
209 johnm 1.1 fi
210     if [ -n "${3}" ]
211     then
212 mrness 1.15 len=$[ 3 - ${#3} ]
213     for((i=0; i<$len; i++)); do
214     value="${value}0"
215     done
216 johnm 1.14 value="${value}${3}"
217 mrness 1.15
218     len=$[ 3 - ${#KV_PATCH} ]
219     for((i=0; i<$len; i++)); do
220     test="${test}0"
221     done
222 johnm 1.14 test="${test}${KV_PATCH}"
223 johnm 1.1 fi
224 johnm 1.14
225     [ ${test} ${operator} ${value} ] && return 0 || return 1
226 johnm 1.1 }
227    
228     get_version() {
229 johnm 1.4 local kbuild_output
230    
231 johnm 1.1 # no need to execute this twice assuming KV_FULL is populated.
232     # we can force by unsetting KV_FULL
233 johnm 1.19 [ -n "${KV_FULL}" ] && return 0
234 johnm 1.1
235     # if we dont know KV_FULL, then we need too.
236     # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
237     unset KV_DIR
238    
239     # KV_DIR will contain the full path to the sources directory we should use
240 johnm 1.11 qeinfo "Determining the location of the kernel source code"
241 johnm 1.1 [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
242     [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
243    
244     if [ -z "${KV_DIR}" ]
245     then
246 johnm 1.11 qeerror "Unable to find kernel sources at ${KERNEL_DIR}"
247     qeinfo "This package requires Linux sources."
248 johnm 1.7 if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
249 johnm 1.11 qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
250     qeinfo "(or the kernel you wish to build against)."
251     qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
252 johnm 1.7 else
253 johnm 1.11 qeinfo "Please ensure that the KERNEL_DIR environment variable points at full Linux sources of the kernel you wish to compile against."
254 johnm 1.7 fi
255 johnm 1.19 return 1
256 johnm 1.7 fi
257    
258 johnm 1.11 qeinfo "Found kernel source directory:"
259     qeinfo " ${KV_DIR}"
260 johnm 1.7
261     if [ ! -s "${KV_DIR}/Makefile" ]
262     then
263 johnm 1.11 qeerror "Could not find a Makefile in the kernel source directory."
264     qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
265 johnm 1.19 return 1
266 johnm 1.7 fi
267 johnm 1.1
268 johnm 1.4 # OK so now we know our sources directory, but they might be using
269     # KBUILD_OUTPUT, and we need this for .config and localversions-*
270     # so we better find it eh?
271     # do we pass KBUILD_OUTPUT on the CLI?
272     OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
273    
274 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
275 johnm 1.4 kbuild_output="$(getfilevar KBUILD_OUTPUT ${KV_DIR}/Makefile)"
276     OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
277    
278 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
279     # directory name to find version information as this seems insane.
280     # so we parse ${KV_DIR}/Makefile
281     KV_MAJOR="$(getfilevar VERSION ${KV_DIR}/Makefile)"
282     KV_MINOR="$(getfilevar PATCHLEVEL ${KV_DIR}/Makefile)"
283     KV_PATCH="$(getfilevar SUBLEVEL ${KV_DIR}/Makefile)"
284     KV_EXTRA="$(getfilevar EXTRAVERSION ${KV_DIR}/Makefile)"
285 johnm 1.4
286 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
287     then
288 johnm 1.11 qeerror "Could not detect kernel version."
289 johnm 1.19 qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."
290     return 1
291 johnm 1.7 fi
292    
293 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
294 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
295     # This *WILL* break if the user is using localversions, but we assume it was
296     # caught before this if they are.
297     [ "${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}" == "$(uname -r)" ] && \
298 johnm 1.7 OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}/build}"
299 johnm 1.4
300     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
301     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
302     if [ -n "${KV_OUT_DIR}" ];
303     then
304 johnm 1.11 qeinfo "Found kernel object directory:"
305     qeinfo " ${KV_OUT_DIR}"
306 johnm 1.4
307     KV_LOCAL="$(cat ${KV_OUT_DIR}/localversion* 2>/dev/null)"
308     fi
309     # and if we STILL haven't got it, then we better just set it to KV_DIR
310     KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
311 johnm 1.21
312 johnm 1.4 KV_LOCAL="${KV_LOCAL}$(cat ${KV_DIR}/localversion* 2>/dev/null)"
313 johnm 1.7 KV_LOCAL="${KV_LOCAL}$(linux_chkconfig_string LOCALVERSION)"
314     KV_LOCAL="${KV_LOCAL//\"/}"
315 johnm 1.21
316 johnm 1.1 # And we should set KV_FULL to the full expanded version
317     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
318 johnm 1.21
319 johnm 1.11 qeinfo "Found sources for kernel version:"
320     qeinfo " ${KV_FULL}"
321 johnm 1.21
322 johnm 1.9 if [ ! -s "${KV_OUT_DIR}/.config" ]
323     then
324 johnm 1.11 qeerror "Could not find a usable .config in the kernel source directory."
325 johnm 1.12 qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."
326     qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"
327     qeerror "it points to the necessary object directory so that it might find .config."
328 johnm 1.19 return 1
329 johnm 1.9 fi
330 johnm 1.21
331 johnm 1.19 return 0
332 johnm 1.1 }
333    
334    
335    
336    
337     # ebuild check functions
338     # ---------------------------------------
339    
340     check_kernel_built() {
341     # if we haven't determined the version yet, we need too.
342     get_version;
343    
344 johnm 1.16 if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
345 johnm 1.1 then
346 johnm 1.16 eerror "These sources have not yet been prepared."
347     eerror "We cannot build against an unprepared tree."
348 johnm 1.1 eerror "To resolve this, please type the following:"
349     eerror
350     eerror "# cd ${KV_DIR}"
351     eerror "# make oldconfig"
352 johnm 1.16 eerror "# make modules_prepare"
353 johnm 1.1 eerror
354     eerror "Then please try merging this module again."
355     die "Kernel sources need compiling first"
356     fi
357     }
358    
359     check_modules_supported() {
360     # if we haven't determined the version yet, we need too.
361     get_version;
362    
363 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
364 johnm 1.1 then
365     eerror "These sources do not support loading external modules."
366     eerror "to be able to use this module please enable \"Loadable modules support\""
367     eerror "in your kernel, recompile and then try merging this module again."
368 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
369 johnm 1.3 fi
370     }
371    
372     check_extra_config() {
373 johnm 1.17 local config negate error local_error i n temp_config
374 johnm 1.3
375     # if we haven't determined the version yet, we need too.
376     get_version;
377    
378     einfo "Checking for suitable kernel configuration options"
379     for config in ${CONFIG_CHECK}
380     do
381     negate="${config:0:1}"
382     if [ "${negate}" == "!" ];
383     then
384     config="${config:1}"
385 johnm 1.7 if linux_chkconfig_present ${config}
386 johnm 1.3 then
387 johnm 1.7 local_error="${config}_ERROR"
388     local_error="${!local_error}"
389     [ -n "${local_error}" ] && eerror " ${local_error}" || \
390     eerror " CONFIG_${config}:\tshould not be set in the kernel configuration, but it is."
391 johnm 1.3 error=1
392     fi
393 johnm 1.17 elif [ "${negate}" == "@" ];
394     then
395     # we never call this unless we are using MODULE_NAMES
396    
397     config="${config:1}"
398     temp_config="${config//*:}"
399     config="${config//:*}"
400     if linux_chkconfig_present ${config}
401     then
402     local_error="${config}_ERROR"
403     local_error="${!local_error}"
404     [ -n "${local_error}" ] && eerror " ${local_error}" || \
405     eerror " CONFIG_${config}:\tshould not be set in the kernel configuration, but it is."
406    
407     for i in ${MODULE_NAMES}
408     do
409     n="${i//${temp_config}}"
410 johnm 1.18 [ -z "${n//(*}" ] && MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"
411 johnm 1.17 done
412     error=0
413     fi
414 johnm 1.3 else
415 johnm 1.7 if ! linux_chkconfig_present ${config}
416 johnm 1.3 then
417 johnm 1.21 # Support the new syntax first.
418     local_error="ERROR_${config}"
419 johnm 1.7 local_error="${!local_error}"
420 johnm 1.21
421     # then fall back on the older syntax.
422     if [[ -z ${local_error} ]] ; then
423     local_error="${config}_ERROR"
424     local_error="${!local_error}"
425     fi
426    
427     [[ -n ${local_error} ]] && eerror " ${local_error}" || \
428 johnm 1.7 eerror " CONFIG_${config}:\tshould be set in the kernel configuration, but isn't"
429 johnm 1.3 error=1
430     fi
431     fi
432     done
433    
434 johnm 1.17 if [ "${error}" == 1 ] ;
435 johnm 1.3 then
436     eerror "Please check to make sure these options are set correctly."
437     eerror "Once you have satisfied these options, please try merging"
438     eerror "this package again."
439 johnm 1.7 die "Incorrect kernel configuration options"
440 johnm 1.1 fi
441     }
442    
443     check_zlibinflate() {
444     # if we haven't determined the version yet, we need too.
445     get_version;
446    
447     # although I restructured this code - I really really really dont support it!
448    
449     # bug #27882 - zlib routines are only linked into the kernel
450     # if something compiled into the kernel calls them
451     #
452     # plus, for the cloop module, it appears that there's no way
453     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
454     # is on
455    
456     local INFLATE
457     local DEFLATE
458    
459     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
460    
461     ebegin "checking ZLIB_INFLATE"
462     getfilevar_isbuiltin CONFIG_ZLIB_INFLATE ${KV_DIR}/.config
463     eend $?
464     [ "$?" != 0 ] && die
465    
466     ebegin "checking ZLIB_DEFLATE"
467     getfilevar_isbuiltin CONFIG_ZLIB_DEFLATE ${KV_DIR}/.config
468     eend $?
469     [ "$?" != 0 ] && die
470    
471    
472     local LINENO_START
473     local LINENO_END
474     local SYMBOLS
475     local x
476    
477     LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
478     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
479     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
480     (( LINENO_END = $LINENO_END - 1 ))
481 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
482 johnm 1.1
483     # okay, now we have a list of symbols
484     # we need to check each one in turn, to see whether it is set or not
485     for x in $SYMBOLS ; do
486     if [ "${!x}" = "y" ]; then
487     # we have a winner!
488     einfo "${x} ensures zlib is linked into your kernel - excellent"
489     return 0
490     fi
491     done
492    
493     eerror
494     eerror "This kernel module requires ZLIB library support."
495     eerror "You have enabled zlib support in your kernel, but haven't enabled"
496     eerror "enabled any option that will ensure that zlib is linked into your"
497     eerror "kernel."
498     eerror
499     eerror "Please ensure that you enable at least one of these options:"
500     eerror
501    
502     for x in $SYMBOLS ; do
503     eerror " * $x"
504     done
505    
506     eerror
507     eerror "Please remember to recompile and install your kernel, and reboot"
508     eerror "into your new kernel before attempting to load this kernel module."
509    
510     die "Kernel doesn't include zlib support"
511     }
512 johnm 1.8
513     ################################
514     # Default pkg_setup
515     # Also used when inheriting linux-mod to force a get_version call
516    
517     linux-info_pkg_setup() {
518 johnm 1.19 get_version || die "Unable to calculate Linux Kernel version"
519 johnm 1.10 [ -n "${CONFIG_CHECK}" ] && check_extra_config;
520 johnm 1.8 }

  ViewVC Help
Powered by ViewVC 1.1.20