VirtualBox

source: vbox/trunk/src/VBox/Installer/linux/check_module_dependencies.sh@ 67772

Last change on this file since 67772 was 64717, checked in by vboxsync, 8 years ago

bugref:#8530: Documentation: improve automated instructions for building kernel modules: slightly fixed the output of the check_module_dependencies script.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 7.7 KB
Line 
1#!/bin/sh
2#
3# Oracle VM VirtualBox
4# VirtualBox linux installation script
5
6#
7# Copyright (C) 2007-2016 Oracle Corporation
8#
9# This file is part of VirtualBox Open Source Edition (OSE), as
10# available from http://www.virtualbox.org. This file is free software;
11# you can redistribute it and/or modify it under the terms of the GNU
12# General Public License (GPL) as published by the Free Software
13# Foundation, in version 2 as it comes in the "COPYING" file of the
14# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16#
17
18set -e
19
20# Usage:
21USAGE_MESSAGE=\
22'Usage: `basename ${0}` [-h|--help|
23 --test [<uname -r output> rpm|dpkg [<base expected> <versioned expected>]]]
24This script tests whether a Linux system is set up to build kernel modules,
25and if not prints a guess as to which distribution packages need to be
26installed to do so, and what commands to use. It uses the output of the
27"uname -r" command to guess the packages and searches for packaging tools
28by checking for packaging databases.
29
30For testing you can specify the output of "uname -r" which will be used
31instead of the real one and the package type, and optionally the expected
32output. --test without parameters will test a number of known inputs.'
33
34# General theory of operation (valid Nov 19 2016): we check whether this is an
35# rpm or dpkg system by checking for the respective non-empty database directory
36# (we assert that only one is present), and based on that we map uname -r output
37# to a kernel package name. Here is a textual description of known mappings
38# (not all of these are currently implemented) for both the general package name
39# and the version-specific package name. Keeping this here as it took some time
40# and pain to research.
41#
42# Debian/Ubuntu (dpkg): <version>-<flavour> -> linux-headers-<flavour>,
43# linux-headers-<version>-<flavour>
44DEBIAN_FLAVOURS="generic lowlatency virtual 486 686-pae amd64 rt-686-pae \
45 rt-amd64 i386 586 grsec-686-pae grsec-amd64 686"
46# SUSE (rpm): <version>-<flavour> -> kernel-<flavour>-devel,
47# kernel-<flavour>-devel-<version>
48SUSE_FLAVOURS="debug default ec2 pae trace vanilla vmi xen"
49# OL/RHEL/CentOS (rpm): <version><flavour>[.i686|.x86_64] -> kernel-<flavour>-devel,
50# kernel-<flavour>-devel-<`uname -r`>, where <version> ends in el*.
51EL_FLAVOURS="uek xen"
52# Fedora (rpm): <version> -> kernel-devel, kernel-devel-<version>, where <version>
53# ends in fc*.
54#
55# OUTPUT NOT YET TESTED ON REAL SYSTEMS
56#
57# Mageia (rpm): <version>-*.mga* -> kernel-linus-latest,
58# kernel-linus-<`uname -r`>
59# <version>-<flavour>-*.mga* -> kernel-<flavour>-latest,
60# kernel-<flavour>-<`uname -r`>
61MAGEIA_FLAVOURS="desktop desktop586 server tmb-desktop"
62# PCLinuxOS (dpkg): <version>-pclos* -> kernel-devel, kernel-devel-<`uname -r`>
63
64PATH=$PATH:/bin:/sbin:/usr/sbin
65
66HAVE_TOOLS=
67HAVE_HEADERS=
68PACKAGE_TYPE=
69UNAME=
70BASE_PACKAGE=
71VERSIONED_PACKAGE=
72TOOLS="gcc make perl"
73TEST=
74UNIT_TEST=
75
76case "${1}" in
77"")
78 # Return immediately successfully if everything is installed
79 type ${TOOLS} >/dev/null 2>&1 && HAVE_TOOLS=yes
80 test -d "/lib/modules/`uname -r`/build/include" && HAVE_HEADERS=yes
81 test -n "${HAVE_TOOLS}" && test -n "${HAVE_HEADERS}" && exit 0
82 UNAME=`uname -r`
83 for i in rpm dpkg; do
84 for j in /var/lib/${i}/*; do
85 test -e "${j}" || break
86 if test -z "${PACKAGE_TYPE}"; then
87 PACKAGE_TYPE="${i}"
88 else
89 PACKAGE_TYPE=unknown
90 fi
91 break
92 done
93 done
94 ;;
95-h|--help)
96 echo "${USAGE_MESSAGE}"
97 exit 0 ;;
98*)
99 ERROR=""
100 UNAME="${2}"
101 PACKAGE_TYPE="${3}"
102 BASE_EXPECTED="${4}"
103 VERSIONED_EXPECTED="${5}"
104 test "${1}" = --test || ERROR=yes
105 test -n "${UNAME}" && test -n "${PACKAGE_TYPE}" || test -z "${UNAME}" ||
106 ERROR=yes
107 test -n "${BASE_EXPECTED}" && test -n "${VERSIONED_EXPECTED}" ||
108 test -z "${BASE_EXPECTED}" || ERROR=yes
109 case "${ERROR}" in ?*)
110 echo "${USAGE_MESSAGE}" >&2
111 exit 1
112 esac
113 TEST=yes
114 TEST_PARAMS="${2} ${3} ${4} ${5}"
115 test -z "${UNAME}" && UNIT_TEST=yes
116 ;;
117esac
118
119case "${PACKAGE_TYPE}" in
120rpm)
121 for i in ${SUSE_FLAVOURS}; do
122 case "${UNAME}" in *-"${i}")
123 BASE_PACKAGE="kernel-${i}-devel"
124 VERSIONED_PACKAGE="kernel-${i}-devel-${UNAME%-${i}}"
125 break
126 esac
127 done
128 for i in ${EL_FLAVOURS} ""; do
129 case "${UNAME}" in *.el5"${i}"|*.el*"${i}".i686|*.el*"${i}".x86_64)
130 test -n "${i}" && i="${i}-" # Hack to handle empty flavour.
131 BASE_PACKAGE="kernel-${i}devel"
132 VERSIONED_PACKAGE="kernel-${i}devel-${UNAME}"
133 break
134 esac
135 done
136 case "${UNAME}" in *.fc*.i686|*.fc*.x86_64) # Fedora
137 BASE_PACKAGE="kernel-devel"
138 VERSIONED_PACKAGE="kernel-devel-${UNAME}"
139 esac
140 for i in ${MAGEIA_FLAVOURS} ""; do # Mageia
141 case "${UNAME}" in *-"${i}"*.mga*)
142 if test -z "${i}"; then
143 BASE_PACKAGE="kernel-linus-devel"
144 VERSIONED_PACKAGE="kernel-linus-devel-${UNAME}"
145 else
146 BASE_PACKAGE="kernel-${i}-devel"
147 VERSIONED_PACKAGE="kernel-${i}-devel-${UNAME%-${i}*}${UNAME#*${i}}"
148 fi
149 break
150 esac
151 done
152 ;;
153dpkg)
154 for i in ${DEBIAN_FLAVOURS}; do # Debian/Ubuntu
155 case "${UNAME}" in *-${i})
156 BASE_PACKAGE="linux-headers-${i}"
157 VERSIONED_PACKAGE="linux-headers-${UNAME}"
158 break
159 esac
160 done
161 case "${UNAME}" in *-pclos*) # PCLinuxOS
162 BASE_PACKAGE="kernel-devel"
163 VERSIONED_PACKAGE="kernel-devel-${UNAME}"
164 esac
165esac
166
167case "${UNIT_TEST}${BASE_EXPECTED}" in "")
168 echo "This system is currently not set up to build kernel modules." >&2
169 test -n "${HAVE_TOOLS}" ||
170 echo "Please install the ${TOOLS} packages from your distribution." >&2
171 test -n "${HAVE_HEADERS}" && exit 1
172 echo "Please install the Linux kernel \"header\" files matching the current kernel" >&2
173 echo "for adding new hardware support to the system." >&2
174 if test -n "${BASE_PACKAGE}${VERSIONED_PACKAGE}"; then
175 echo "The distribution packages containing the headers are probably:" >&2
176 echo " ${BASE_PACKAGE} ${VERSIONED_PACKAGE}" >&2
177 fi
178 test -z "${TEST}" && exit 1
179 exit 0
180esac
181
182case "${BASE_EXPECTED}" in ?*)
183 case "${BASE_EXPECTED} ${VERSIONED_EXPECTED}" in
184 "${BASE_PACKAGE} ${VERSIONED_PACKAGE}")
185 exit 0
186 esac
187 echo "Test: ${TEST_PARAMS}" >&2
188 echo "Result: ${BASE_PACKAGE} ${VERSIONED_PACKAGE}"
189 exit 1
190esac
191
192# Unit test as of here.
193# Test expected correct results.
194for i in \
195 "4.1.12-37.5.1.el6uek.x86_64 rpm kernel-uek-devel kernel-uek-devel-4.1.12-37.5.1.el6uek.x86_64" \
196 "2.6.32-642.el6.x86_64 rpm kernel-devel kernel-devel-2.6.32-642.el6.x86_64" \
197 "4.1.12-vanilla rpm kernel-vanilla-devel kernel-vanilla-devel-4.1.12" \
198 "4.8.8-pclos1 dpkg kernel-devel kernel-devel-4.8.8-pclos1" \
199 "4.8.8-desktop-1.mga6 rpm kernel-desktop-devel kernel-desktop-devel-4.8.8-1.mga6" \
200 "3.19.8-2.mga5 rpm kernel-linus-devel kernel-linus-devel-3.19.8-2.mga5" \
201 "4.8.0-27-generic dpkg linux-headers-generic linux-headers-4.8.0-27-generic"
202do
203 "${0}" --test ${i} || exit 1
204done
205
206# Test argument combinations expected to fail.
207for i in \
208 "--test NOT_EMPTY" \
209 "--test NOT_EMPTY NOT_EMPTY NOT_EMPTY" \
210 "--wrong" \
211 "--test 4.8.8-pclos1 dpkg kernel-devel kernel-devel-WRONG" \
212 "--test 4.8.8-pclos1 dpkg kernel-WRONG kernel-devel-4.8.8-pclos1"
213do
214 "${0}" ${i} >/dev/null 2>&1 && echo "Bad argument test failed:" &&
215 echo " ${i}" && exit 1
216done
217exit 0
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette