VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/linux/Makefile@ 13000

Last change on this file since 13000 was 13000, checked in by vboxsync, 16 years ago

Implemented kernel driver build flag to allow better debuggability of VBox
on Linux (VBOX_USE_INSERT_PAGE when compiling vboxdrv.ko
on kernels after 2.6.22)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.8 KB
Line 
1#
2# Makefile for the VirtualBox Linux Host Driver.
3# (For 2.6.x this file must be called 'Makefile'!)
4#
5
6#
7#
8# Copyright (C) 2006-2007 Sun Microsystems, Inc.
9#
10# This file is part of VirtualBox Open Source Edition (OSE), as
11# available from http://www.virtualbox.org. This file is free software;
12# you can redistribute it and/or modify it under the terms of the GNU
13# General Public License (GPL) as published by the Free Software
14# Foundation, in version 2 as it comes in the "COPYING" file of the
15# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17#
18# The contents of this file may alternatively be used under the terms
19# of the Common Development and Distribution License Version 1.0
20# (CDDL) only, as it comes in the "COPYING.CDDL" file of the
21# VirtualBox OSE distribution, in which case the provisions of the
22# CDDL are applicable instead of those of the GPL.
23#
24# You may elect to license modified versions of this file under the
25# terms and conditions of either the GPL or the CDDL or both.
26#
27# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
28# Clara, CA 95054 USA or visit http://www.sun.com if you need
29# additional information or have any questions.
30#
31
32#
33# First, figure out which architecture we're targeting and the build type.
34# (We have to support basic cross building (ARCH=i386|x86_64).)
35# While at it, warn about BUILD_* vars found to help with user problems.
36#
37ifneq ($(filter-out amd64 x86,$(BUILD_TARGET_ARCH)),)
38 $(warning Ignoring unknown BUILD_TARGET_ARCH value '$(BUILD_TARGET_ARCH)'.)
39 BUILD_TARGET_ARCH :=
40endif
41ifeq ($(BUILD_TARGET_ARCH),)
42 ifeq ($(ARCH),x86_64)
43 BUILD_TARGET_ARCH := amd64
44 else
45 ifeq ($(ARCH),i386)
46 BUILD_TARGET_ARCH := x86
47 else
48 ifeq ($(filter-out x86_64 amd64 AMD64,$(shell uname -m)),)
49 BUILD_TARGET_ARCH := amd64
50 else
51 BUILD_TARGET_ARCH := x86
52 endif
53 endif
54 endif
55else
56 $(warning Using BUILD_TARGET_ARCH='$(BUILD_TARGET_ARCH)' from the $(origin BUILD_TARGET_ARCH).)
57endif
58
59ifneq ($(filter-out release profile debug strict,$(BUILD_TYPE)),)
60 $(warning Ignoring unknown BUILD_TYPE value '$(BUILD_TYPE)'.)
61 BUILD_TYPE :=
62endif
63ifeq ($(BUILD_TYPE),)
64 BUILD_TYPE := release
65else
66 $(warning Using BUILD_TYPE='$(BUILD_TYPE)' from the $(origin BUILD_TYPE).)
67endif
68
69
70# override is required by the Debian guys
71override MODULE = vboxdrv
72OBJS = \
73 linux/SUPDrv-linux.o \
74 SUPDrv.o \
75 r0drv/alloc-r0drv.o \
76 r0drv/initterm-r0drv.o \
77 r0drv/memobj-r0drv.o \
78 r0drv/mpnotification-r0drv.o \
79 r0drv/linux/alloc-r0drv-linux.o \
80 r0drv/linux/initterm-r0drv-linux.o \
81 r0drv/linux/memobj-r0drv-linux.o \
82 r0drv/linux/mp-r0drv-linux.o \
83 r0drv/linux/mpnotification-r0drv-linux.o \
84 r0drv/linux/process-r0drv-linux.o \
85 r0drv/linux/semevent-r0drv-linux.o \
86 r0drv/linux/semeventmulti-r0drv-linux.o \
87 r0drv/linux/semfastmutex-r0drv-linux.o \
88 r0drv/linux/spinlock-r0drv-linux.o \
89 r0drv/linux/thread-r0drv-linux.o \
90 r0drv/linux/time-r0drv-linux.o \
91 r0drv/linux/timer-r0drv-linux.o \
92 common/err/RTErrConvertFromErrno.o
93ifeq ($(BUILD_TARGET_ARCH),x86)
94OBJS += math/gcc/divdi3.o \
95 math/gcc/moddi3.o \
96 math/gcc/qdivrem.o \
97 math/gcc/udivdi3.o
98endif
99ifeq ($(BUILD_TARGET_ARCH),amd64)
100OBJS += alloc/heapsimple.o
101endif
102
103ifeq ($(BUILD_TYPE),debug)
104OBJS += common/log/log.o \
105 common/log/logellipsis.o \
106 common/log/logrel.o \
107 common/log/logrelellipsis.o \
108 common/log/logcom.o \
109 common/log/logformat.o \
110 common/string/strformat.o \
111 common/string/strformatrt.o \
112 common/string/strformattype.o \
113 common/string/strprintf.o \
114 common/string/strtonum.o \
115 r0drv/linux/RTLogWriteDebugger-r0drv-linux.o \
116 generic/RTLogWriteStdErr-stub-generic.o \
117 generic/RTLogWriteStdOut-stub-generic.o \
118 generic/RTLogWriteUser-generic.o \
119 VBox/log-vbox.o \
120 VBox/strformat-vbox.o
121ifeq ($(BUILD_TARGET_ARCH),x86)
122OBJS += math/gcc/divdi3.o \
123 math/gcc/umoddi3.o
124endif
125endif # debug
126
127ifneq ($(MAKECMDGOALS),clean)
128
129ifeq ($(KERNELRELEASE),)
130
131 #
132 # building from this directory
133 #
134
135 # kernel base directory
136 ifndef KERN_DIR
137 # build for the current kernel, version check
138 KERN_DIR := /lib/modules/$(shell uname -r)/build
139 ifneq ($(shell if test -d $(KERN_DIR); then echo yes; fi),yes)
140 KERN_DIR := /usr/src/linux
141 ifneq ($(shell if test -d $(KERN_DIR); then echo yes; fi),yes)
142 $(error Error: unable to find the sources of your current Linux kernel. \
143 Specify KERN_DIR=<directory> and run Make again)
144 endif
145 $(warning Warning: using /usr/src/linux as the source directory of your \
146 Linux kernel. If this is not correct, specify \
147 KERN_DIR=<directory> and run Make again.)
148 endif
149 # check if versions match -- works only for later 2.6 kernels
150 VBOX_KERN_VER := $(shell $(MAKE) -sC $(KERN_DIR) kernelrelease 2> /dev/null || true)
151 ifneq ($(VBOX_KERN_VER),)
152 ifneq ($(VBOX_KERN_VER),$(shell uname -r))
153 $(error Error: /usr/src/linux (version $(VBOX_KERN_VER)) does not match \
154 the current kernel (version $(shell uname -r)))
155 endif
156 endif
157 else
158 # build for a dedicated kernel, no version check
159 ifneq ($(shell if test -d $(KERN_DIR); then echo yes; fi),yes)
160 $(error Error: KERN_DIR does not point to a directory)
161 endif
162 endif
163
164 # includes
165 ifndef KERN_INCL
166 KERN_INCL = $(KERN_DIR)/include
167 endif
168 ifneq ($(shell if test -d $(KERN_INCL); then echo yes; fi),yes)
169 $(error Error: unable to find the include directory for your current Linux \
170 kernel. Specify KERN_INCL=<directory> and run Make again)
171 endif
172
173 # module install dir, only for current kernel
174 ifneq ($(filter install install_rpm,$(MAKECMDGOALS)),)
175 ifndef MODULE_DIR
176 MODULE_DIR_TST := /lib/modules/$(shell uname -r)
177 ifeq ($(shell if test -d $(MODULE_DIR_TST); then echo yes; fi),yes)
178 MODULE_DIR := $(MODULE_DIR_TST)/misc
179 else
180 $(error Unable to find the folder to install the support driver to)
181 endif
182 endif # MODULE_DIR unspecified
183 endif
184
185 # guess kernel version (24 or 26)
186 KERN_VERSION := $(if $(wildcard $(KERN_DIR)/Rules.make),24,26)
187
188else # neq($(KERNELRELEASE),)
189
190 #
191 # building from kbuild (make -C <kernel_directory> M=`pwd`)
192 #
193
194 # guess kernel version (24 or 26)
195 KERN_VERSION := $(if $(wildcard $(PWD)/Rules.make),24,26)
196
197endif # neq($(KERNELRELEASE),)
198
199# debug - show guesses.
200ifdef DEBUG
201$(warning dbg: KERN_DIR = $(KERN_DIR))
202$(warning dbg: KERN_INCL = $(KERN_INCL))
203$(warning dbg: MODULE_DIR = $(MODULE_DIR))
204$(warning dbg: KERN_VERSION = $(KERN_VERSION))
205endif
206
207#
208# Compiler options
209#
210ifndef INCL
211 INCL := $(addprefix -I,$(KERN_INCL) $(EXTRA_INCL))
212 ifndef KBUILD_EXTMOD
213 KBUILD_EXTMOD := $(shell pwd)
214 endif
215 INCL += $(addprefix -I$(KBUILD_EXTMOD),/ /include /r0drv/linux)
216 export INCL
217endif
218KFLAGS := -D__KERNEL__ -DMODULE -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -DVBOX_WITH_HARDENING
219ifdef VBOX_REDHAT_KABI
220 KFLAGS += -DVBOX_REDHAT_KABI
221endif
222ifndef CONFIG_VBOXDRV_FIXEDMAJOR
223 KFLAGS += -DCONFIG_VBOXDRV_AS_MISC
224endif
225ifeq ($(BUILD_TARGET_ARCH),amd64)
226 KFLAGS += -DRT_ARCH_AMD64
227 # must be consistent with Config.kmk!
228 KFLAGS += -DVBOX_WITH_64_BITS_GUESTS
229else
230 KFLAGS += -DRT_ARCH_X86
231endif
232ifeq ($(BUILD_TYPE),debug)
233 KFLAGS += -DDEBUG -DDEBUG_$(USER) -g
234 # IPRT_DEBUG_SEMS indicates thread wrt sems state via the comm field.
235 KFLAGS += -DIPRT_DEBUG_SEMS
236endif
237
238# By default we use remap_pfn_range() kernel API to make kernel pages
239# visible for userland. Unfortuately, it leads to situation that
240# during debug session all structures on that page (such as PVM pointer)
241# are not accessible to the debugger (see #3214).
242# This code enables experimental support
243# for vm_insert_page() kernel API, allowing to export kernel pages
244# to the userland in more debugger-friendly way. Due to stability
245# concerns, not enabled by default yet.
246ifdef VBOX_USE_INSERT_PAGE
247 KFLAGS += -DVBOX_USE_INSERT_PAGE
248endif
249
250ifeq ($(KERN_VERSION),24)
251# 2.4
252TOPDIR = $(KERN_DIR)
253MODULE_EXT := o
254EXTRA_CFLAGS := -DVBOX_LINUX_2_4 -DEXPORT_SYMTAB
255$(MODULE)-objs = $(OBJS)
256else
257# 2.6 and later
258MODULE_EXT := ko
259$(MODULE)-y := $(OBJS)
260endif
261
262# build defs
263EXTRA_CFLAGS += $(INCL) $(KFLAGS) $(KDEBUG)
264
265all: $(MODULE)
266
267obj-m += $(MODULE).o
268
269$(MODULE):
270 $(MAKE) KBUILD_VERBOSE=1 -C $(KERN_DIR) SUBDIRS=$(CURDIR) SRCROOT=$(CURDIR) modules
271
272ifeq ($(KERN_VERSION),24)
273#
274# 2.4 Module linking
275#
276$(MODULE).o: $(OBJS)
277 $(LD) -o $@ -r $(OBJS)
278
279include $(KERN_DIR)/Rules.make
280
281endif
282
283install: $(MODULE)
284 @mkdir -p $(MODULE_DIR); \
285 install -m 0664 -o root -g root $(MODULE).$(MODULE_EXT) $(MODULE_DIR); \
286 PATH="$(PATH):/bin:/sbin" depmod -ae; \
287 rm -f /etc/vbox/module_not_compiled
288
289install_rpm: $(MODULE)
290 @mkdir -p $(MODULE_DIR); \
291 install -m 0664 $(MODULE).$(MODULE_EXT) $(MODULE_DIR)
292
293endif # eq($(MAKECMDGOALS),clean)
294
295clean:
296 for f in . linux r0drv r0drv/linux VBox common/string common/log generic math/gcc; \
297 do rm -f $$f/*.o $$f/.*.cmd $$f/.*.flags; done
298 rm -rf .vboxdrv* .tmp_ver* vboxdrv.* Module.symvers Modules.symvers
Note: See TracBrowser for help on using the repository browser.

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