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

Contents of /eclass/linux-info.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide annotations) (download)
Sun Dec 5 12:46:58 2004 UTC (9 years, 9 months ago) by johnm
Branch: MAIN
Changes since 1.6: +86 -33 lines
hopefully fixing bug 73088, changing function names as per dsds request. adding custom error messages for CONFIG_CHECK

1 johnm 1.1 # Copyright 1999-2004 Gentoo Foundation
2     # Distributed under the terms of the GNU General Public License v2
3 johnm 1.3 # $Header: $
4 johnm 1.1 #
5     # This eclass provides functions for querying the installed kernel
6     # source version, selected kernel options etc.
7     #
8    
9     ECLASS=linux-info
10     INHERITED="$INHERITED $ECLASS"
11    
12     # Overwritable environment Var's
13     # ---------------------------------------
14     KERNEL_DIR="${KERNEL_DIR:-/usr/src/linux}"
15    
16 johnm 1.7
17     # Pulled from eutils as it might be more useful only being here since
18     # very few ebuilds which dont use this eclass will ever ever use these functions
19     set_arch_to_kernel() {
20     export PORTAGE_ARCH="${ARCH}"
21     case ${ARCH} in
22     x86) export ARCH="i386";;
23     amd64) export ARCH="x86_64";;
24     hppa) export ARCH="parisc";;
25     mips) export ARCH="mips";;
26     *) export ARCH="${ARCH}";;
27     esac
28     }
29    
30     # set's ARCH back to what portage expects
31     set_arch_to_portage() {
32     export ARCH="${PORTAGE_ARCH}"
33     }
34    
35 johnm 1.1 # File Functions
36     # ---------------------------------------
37    
38     # getfilevar accepts 2 vars as follows:
39     # getfilevar <VARIABLE> <CONFIGFILE>
40    
41     getfilevar() {
42 johnm 1.7 local ERROR workingdir basefname basedname xarch
43 johnm 1.1 ERROR=0
44    
45     [ -z "${1}" ] && ERROR=1
46     [ ! -f "${2}" ] && ERROR=1
47    
48     if [ "${ERROR}" = 1 ]
49     then
50 johnm 1.6 ebeep
51     echo -e "\n"
52 johnm 1.1 eerror "getfilevar requires 2 variables, with the second a valid file."
53     eerror " getfilevar <VARIABLE> <CONFIGFILE>"
54     else
55 johnm 1.6 workingdir=${PWD}
56     basefname=$(basename ${2})
57     basedname=$(dirname ${2})
58 johnm 1.7 xarch=${ARCH}
59 johnm 1.6 unset ARCH
60    
61     cd ${basedname}
62 johnm 1.7 echo -e "include ${basefname}\ne:\n\t@echo \$(${1})" | \
63     make -f - e 2>/dev/null
64 johnm 1.6 cd ${workingdir}
65    
66 johnm 1.7 ARCH=${xarch}
67 johnm 1.1 fi
68     }
69    
70 johnm 1.7 linux_chkconfig_present() {
71 johnm 1.1 local RESULT
72 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
73 johnm 1.1 [ "${RESULT}" = "m" -o "${RESULT}" = "y" ] && return 0 || return 1
74     }
75    
76 johnm 1.7 linux_chkconfig_module() {
77 johnm 1.1 local RESULT
78 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
79 johnm 1.1 [ "${RESULT}" = "m" ] && return 0 || return 1
80     }
81    
82 johnm 1.7 linux_chkconfig_builtin() {
83 johnm 1.1 local RESULT
84 johnm 1.7 RESULT="$(getfilevar CONFIG_${1} ${KV_OUT_DIR}/.config)"
85 johnm 1.1 [ "${RESULT}" = "y" ] && return 0 || return 1
86     }
87    
88 johnm 1.7 linux_chkconfig_string() {
89     getfilevar "CONFIG_${1}" "${KV_OUT_DIR}/.config"
90     }
91    
92 johnm 1.1 # Versioning Functions
93     # ---------------------------------------
94    
95     # kernel_is returns true when the version is the same as the passed version
96     #
97     # For Example where KV = 2.6.9
98     # kernel_is 2 4 returns false
99     # kernel_is 2 returns true
100     # kernel_is 2 6 returns true
101     # kernel_is 2 6 8 returns false
102     # kernel_is 2 6 9 returns true
103 johnm 1.3 #
104 johnm 1.1 # got the jist yet?
105    
106     kernel_is() {
107     # if we haven't determined the version yet, we need too.
108     get_version;
109    
110     local RESULT
111     RESULT=1
112    
113     if [ -n "${1}" ]
114     then
115     [ "${1}" = "${KV_MAJOR}" ] && RESULT=0
116     fi
117    
118     if [ -n "${2}" ]
119     then
120     RESULT=1
121     [ "${2}" = "${KV_MINOR}" ] && RESULT=0
122     fi
123    
124     if [ -n "${3}" ]
125     then
126     RESULT=1
127     [ "${3}" = "${KV_PATCH}" ] && RESULT=0
128     fi
129     return ${RESULT}
130     }
131    
132     get_version() {
133 johnm 1.4 local kbuild_output
134    
135 johnm 1.1 # no need to execute this twice assuming KV_FULL is populated.
136     # we can force by unsetting KV_FULL
137 johnm 1.4 [ -n "${KV_FULL}" ] && return
138 johnm 1.1
139     # if we dont know KV_FULL, then we need too.
140     # make sure KV_DIR isnt set since we need to work it out via KERNEL_DIR
141     unset KV_DIR
142    
143     # KV_DIR will contain the full path to the sources directory we should use
144     einfo "Determining the location of the kernel source code"
145     [ -h "${KERNEL_DIR}" ] && KV_DIR="$(readlink -f ${KERNEL_DIR})"
146     [ -d "${KERNEL_DIR}" ] && KV_DIR="${KERNEL_DIR}"
147    
148     if [ -z "${KV_DIR}" ]
149     then
150     eerror "Unable to find kernel sources at ${KERNEL_DIR}"
151 johnm 1.7 einfo "This package requires Linux sources."
152     if [ "${KERNEL_DIR}" == "/usr/src/linux" ] ; then
153     einfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "
154     einfo "(or the kernel you wish to build against)."
155     einfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"
156     else
157     einfo "Please ensure that the KERNEL_DIR environment variable points at full Linux sources of the kernel you wish to compile against."
158     fi
159     die "Cannot locate Linux sources at ${KERNEL_DIR}"
160     fi
161    
162     einfo "Found kernel source directory:"
163     einfo " ${KV_DIR}"
164    
165     if [ ! -s "${KV_DIR}/Makefile" ]
166     then
167     eerror "Could not find a Makefile in the kernel source directory."
168     eerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
169     die "Makefile not found in ${KV_DIR}"
170     fi
171    
172     if [ ! -s "${KV_DIR}/.config" ]
173     then
174     eerror "Could not find a usable .config in the kernel source directory."
175     eerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources"
176     die ".config not found in ${KV_DIR}"
177 johnm 1.1 fi
178    
179 johnm 1.4 # OK so now we know our sources directory, but they might be using
180     # KBUILD_OUTPUT, and we need this for .config and localversions-*
181     # so we better find it eh?
182     # do we pass KBUILD_OUTPUT on the CLI?
183     OUTPUT_DIR="${OUTPUT_DIR:-${KBUILD_OUTPUT}}"
184    
185 johnm 1.6 # And if we didn't pass it, we can take a nosey in the Makefile
186 johnm 1.4 kbuild_output="$(getfilevar KBUILD_OUTPUT ${KV_DIR}/Makefile)"
187     OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
188    
189 johnm 1.1 # And contrary to existing functions I feel we shouldn't trust the
190     # directory name to find version information as this seems insane.
191     # so we parse ${KV_DIR}/Makefile
192     KV_MAJOR="$(getfilevar VERSION ${KV_DIR}/Makefile)"
193     KV_MINOR="$(getfilevar PATCHLEVEL ${KV_DIR}/Makefile)"
194     KV_PATCH="$(getfilevar SUBLEVEL ${KV_DIR}/Makefile)"
195     KV_EXTRA="$(getfilevar EXTRAVERSION ${KV_DIR}/Makefile)"
196 johnm 1.4
197 johnm 1.7 if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -z "${KV_PATCH}" ]
198     then
199     eerror "Could not detect kernel version."
200     eerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"
201     die "Could not parse version info from ${KV_DIR}/Makefile"
202     fi
203    
204 johnm 1.1 # and in newer versions we can also pull LOCALVERSION if it is set.
205 johnm 1.4 # but before we do this, we need to find if we use a different object directory.
206     # This *WILL* break if the user is using localversions, but we assume it was
207     # caught before this if they are.
208     [ "${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}" == "$(uname -r)" ] && \
209 johnm 1.7 OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}.${KV_EXTRA}/build}"
210 johnm 1.4
211     [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
212     [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
213     if [ -n "${KV_OUT_DIR}" ];
214     then
215     einfo "Found kernel object directory:"
216     einfo " ${KV_OUT_DIR}"
217    
218     KV_LOCAL="$(cat ${KV_OUT_DIR}/localversion* 2>/dev/null)"
219     fi
220     # and if we STILL haven't got it, then we better just set it to KV_DIR
221     KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"
222    
223     KV_LOCAL="${KV_LOCAL}$(cat ${KV_DIR}/localversion* 2>/dev/null)"
224 johnm 1.7 KV_LOCAL="${KV_LOCAL}$(linux_chkconfig_string LOCALVERSION)"
225     KV_LOCAL="${KV_LOCAL//\"/}"
226 johnm 1.1
227     # And we should set KV_FULL to the full expanded version
228     KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"
229    
230 johnm 1.7 einfo "Found sources for kernel version:"
231     einfo " ${KV_FULL}"
232 johnm 1.1 }
233    
234    
235    
236    
237     # ebuild check functions
238     # ---------------------------------------
239    
240     check_kernel_built() {
241     # if we haven't determined the version yet, we need too.
242     get_version;
243    
244 johnm 1.4 if [ ! -f "${KV_OUT_DIR}/System.map" ]
245 johnm 1.1 then
246     eerror "These sources have not yet been compiled."
247     eerror "We cannot build against an uncompiled tree."
248     eerror "To resolve this, please type the following:"
249     eerror
250     eerror "# cd ${KV_DIR}"
251     eerror "# make oldconfig"
252     eerror "# make bzImage modules modules_install"
253     eerror
254     eerror "Then please try merging this module again."
255     die "Kernel sources need compiling first"
256     fi
257     }
258    
259     check_modules_supported() {
260     # if we haven't determined the version yet, we need too.
261     get_version;
262    
263 johnm 1.7 if ! linux_chkconfig_builtin "MODULES"
264 johnm 1.1 then
265     eerror "These sources do not support loading external modules."
266     eerror "to be able to use this module please enable \"Loadable modules support\""
267     eerror "in your kernel, recompile and then try merging this module again."
268 johnm 1.7 die "No support for external modules in ${KV_FULL} config"
269 johnm 1.3 fi
270     }
271    
272     check_extra_config() {
273 johnm 1.7 local config negate error local_error
274 johnm 1.3
275     # if we haven't determined the version yet, we need too.
276     get_version;
277    
278     einfo "Checking for suitable kernel configuration options"
279     for config in ${CONFIG_CHECK}
280     do
281     negate="${config:0:1}"
282     if [ "${negate}" == "!" ];
283     then
284     config="${config:1}"
285 johnm 1.7 if linux_chkconfig_present ${config}
286 johnm 1.3 then
287 johnm 1.7 local_error="${config}_ERROR"
288     local_error="${!local_error}"
289     [ -n "${local_error}" ] && eerror " ${local_error}" || \
290     eerror " CONFIG_${config}:\tshould not be set in the kernel configuration, but it is."
291 johnm 1.3 error=1
292     fi
293     else
294 johnm 1.7 if ! linux_chkconfig_present ${config}
295 johnm 1.3 then
296 johnm 1.7 local_error="${config}_ERROR"
297     local_error="${!local_error}"
298     [ -n "${local_error}" ] && eerror " ${local_error}" || \
299     eerror " CONFIG_${config}:\tshould be set in the kernel configuration, but isn't"
300 johnm 1.3 error=1
301     fi
302     fi
303     done
304    
305     if [ -n "${error}" ] ;
306     then
307     eerror "Please check to make sure these options are set correctly."
308     eerror "Once you have satisfied these options, please try merging"
309     eerror "this package again."
310 johnm 1.7 die "Incorrect kernel configuration options"
311 johnm 1.1 fi
312     }
313    
314     check_zlibinflate() {
315     # if we haven't determined the version yet, we need too.
316     get_version;
317    
318     # although I restructured this code - I really really really dont support it!
319    
320     # bug #27882 - zlib routines are only linked into the kernel
321     # if something compiled into the kernel calls them
322     #
323     # plus, for the cloop module, it appears that there's no way
324     # to get cloop.o to include a static zlib if CONFIG_MODVERSIONS
325     # is on
326    
327     local INFLATE
328     local DEFLATE
329    
330     einfo "Determining the usability of ZLIB_INFLATE support in your kernel"
331    
332     ebegin "checking ZLIB_INFLATE"
333     getfilevar_isbuiltin CONFIG_ZLIB_INFLATE ${KV_DIR}/.config
334     eend $?
335     [ "$?" != 0 ] && die
336    
337     ebegin "checking ZLIB_DEFLATE"
338     getfilevar_isbuiltin CONFIG_ZLIB_DEFLATE ${KV_DIR}/.config
339     eend $?
340     [ "$?" != 0 ] && die
341    
342    
343     local LINENO_START
344     local LINENO_END
345     local SYMBOLS
346     local x
347    
348     LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"
349     LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"
350     (( LINENO_AMOUNT = $LINENO_END - $LINENO_START ))
351     (( LINENO_END = $LINENO_END - 1 ))
352 johnm 1.4 SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"
353 johnm 1.1
354     # okay, now we have a list of symbols
355     # we need to check each one in turn, to see whether it is set or not
356     for x in $SYMBOLS ; do
357     if [ "${!x}" = "y" ]; then
358     # we have a winner!
359     einfo "${x} ensures zlib is linked into your kernel - excellent"
360     return 0
361     fi
362     done
363    
364     eerror
365     eerror "This kernel module requires ZLIB library support."
366     eerror "You have enabled zlib support in your kernel, but haven't enabled"
367     eerror "enabled any option that will ensure that zlib is linked into your"
368     eerror "kernel."
369     eerror
370     eerror "Please ensure that you enable at least one of these options:"
371     eerror
372    
373     for x in $SYMBOLS ; do
374     eerror " * $x"
375     done
376    
377     eerror
378     eerror "Please remember to recompile and install your kernel, and reboot"
379     eerror "into your new kernel before attempting to load this kernel module."
380    
381     die "Kernel doesn't include zlib support"
382     }

  ViewVC Help
Powered by ViewVC 1.1.20