1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
|
# $Id: Makefile-header.gmk $
## @file
# VirtualBox Guest Additions kernel module Makefile, common parts.
#
# (For 2.6.x, the main file must be called 'Makefile'!)
#
#
# Copyright (C) 2006-2023 Oracle and/or its affiliates.
#
# This file is part of VirtualBox base platform packages, as
# available from https://www.virtualbox.org.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation, in version 3 of the
# License.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <https://www.gnu.org/licenses>.
#
# SPDX-License-Identifier: GPL-3.0-only
#
# Testing:
# * Building with KERN_DIR set uses the value specified and
# the default value for the unspecified one if any.
#
# These file should be included by the Makefiles for any kernel modules we
# build as part of the Guest Additions. The intended way of doing this is as
# follows:
#
# # Linux kbuild sets this to our source directory if we are called from there
# obj ?= $(CURDIR)
# include $(obj)/Makefile-header.gmk
# VBOXMOD_NAME = <name of the module to be built, without extension>
# VBOXMOD_OBJS = <list of object files which should be included>
# VBOXMOD_DEFS = <any additional defines which this module needs>
# VBOXMOD_INCL = <any additional include paths which this module needs>
# VBOXMOD_CFLAGS = <any additional CFLAGS which this module needs>
# include $(obj)/Makefile-footer.gmk
#
# To avoid potential confusion between kmk/kBuild and linux/kbuild,
# we use VBOX_KBUILD_TARGET_ARCH instead of KBUILD_TARGET_ARCH and
# VBOX_KBUILD_TYPE instead of KBUILD_TYPE. The VBOX_KBUILD_ variable
# variant takes percedence over the kmk/kBuild ones.
#
#
# First, figure out which architecture we're targeting and the build type.
# (We have to support basic cross building (ARCH=i386|x86_64).)
# While at it, warn about *BUILD_* vars found to help with user problems.
#
# VBOX_KBUILD_TARGET_ARCH = amd64|x86
ifeq ($(filter-out x86_64 amd64 AMD64,$(shell uname -m)),)
VBOX_KBUILD_TARGET_ARCH_DEFAULT := amd64
else
VBOX_KBUILD_TARGET_ARCH_DEFAULT := x86
endif
ifdef VBOX_KBUILD_TARGET_ARCH
ifneq ($(filter-out amd64 x86,$(VBOX_KBUILD_TARGET_ARCH)),)
$(warning Ignoring unknown VBOX_KBUILD_TARGET_ARCH value '$(VBOX_KBUILD_TARGET_ARCH)'.)
VBOX_KBUILD_TARGET_ARCH :=
endif
else
ifdef KBUILD_TARGET_ARCH
ifneq ($(filter-out amd64 x86,$(KBUILD_TARGET_ARCH)),)
$(warning Ignoring unknown KBUILD_TARGET_ARCH value '$(KBUILD_TARGET_ARCH)'.)
VBOX_KBUILD_TARGET_ARCH :=
endif
else
ifdef BUILD_TARGET_ARCH
$(warning BUILD_TARGET_ARCH is deprecated, use VBOX_KBUILD_TARGET_ARCH instead.)
ifneq ($(filter-out amd64 x86,$(BUILD_TARGET_ARCH)),)
$(warning Ignoring unknown BUILD_TARGET_ARCH value '$(BUILD_TARGET_ARCH)'.)
VBOX_KBUILD_TARGET_ARCH :=
endif
endif
endif
endif
ifeq ($(VBOX_KBUILD_TARGET_ARCH),)
ifeq ($(ARCH),x86_64)
VBOX_KBUILD_TARGET_ARCH := amd64
else
ifeq ($(ARCH),i386)
VBOX_KBUILD_TARGET_ARCH := x86
else
VBOX_KBUILD_TARGET_ARCH := $(VBOX_KBUILD_TARGET_ARCH_DEFAULT)
endif
endif
else
ifneq ($(VBOX_KBUILD_TARGET_ARCH),$(VBOX_KBUILD_TARGET_ARCH_DEFAULT))
$(warning Using VBOX_KBUILD_TARGET_ARCH='$(VBOX_KBUILD_TARGET_ARCH)' from the $(origin VBOX_KBUILD_TARGET_ARCH).)
endif
endif
# VBOX_KBUILD_TYPE = release|debug|profile|strict|asan
ifdef VBOX_KBUILD_TYPE
VBOX_KBUILD_TYPE_VAR := VBOX_KBUILD_TYPE
ifneq ($(filter-out release profile debug strict asan,$(VBOX_KBUILD_TYPE)),)
$(warning Ignoring unknown VBOX_KBUILD_TYPE value '$(VBOX_KBUILD_TYPE)'.)
VBOX_KBUILD_TYPE :=
endif
else
ifdef KBUILD_TYPE
VBOX_KBUILD_TYPE_VAR := KBUILD_TYPE
VBOX_KBUILD_TYPE := $(KBUILD_TYPE)
ifneq ($(filter-out release profile debug strict asan,$(KBUILD_TYPE)),)
$(warning Ignoring unknown KBUILD_TYPE value '$(KBUILD_TYPE)'.)
VBOX_KBUILD_TYPE :=
endif
else
ifdef BUILD_TYPE
$(warning BUILD_TYPE is deprecated, use VBOX_KBUILD_TYPE instead.)
VBOX_KBUILD_TYPE_VAR := BUILD_TYPE
VBOX_KBUILD_TYPE := $(BUILD_TYPE)
ifneq ($(filter-out release profile debug strict asan,$(BUILD_TYPE)),)
$(warning Ignoring unknown BUILD_TYPE value '$(BUILD_TYPE)'.)
VBOX_KBUILD_TYPE :=
endif
endif
endif
endif
ifeq ($(VBOX_KBUILD_TYPE),)
VBOX_KBUILD_TYPE_VAR = VBOX_KBUILD_TYPE
VBOX_KBUILD_TYPE := release
else
ifneq ($(VBOX_KBUILD_TYPE),release)
ifndef VBOX_KERN_QUIET
$(warning Using VBOX_KBUILD_TYPE='$(VBOX_KBUILD_TYPE)' from the $(origin $(VBOX_KBUILD_TYPE_VAR)) ($(VBOX_KBUILD_TYPE_VAR)).)
endif
endif
endif
ifeq ($(USERNAME),)
USERNAME := noname
endif
ifeq ($(KERNELRELEASE),)
#
# building from this directory
#
# kernel base directory
ifdef KERN_DIR
ifndef KERN_VER
ifeq ($(filter %/build,$(KERN_DIR)),)
$(error The variable KERN_DIR must be a kernel build folder and end with /build without a trailing slash, or KERN_VER must be set)
endif
endif
endif
ifndef KERN_VER
ifdef KERN_DIR
KERN_VER = $(notdir $(patsubst %/build,%,$(KERN_DIR)))
ifeq ($(shell expr $(KERN_VER) : '[0-9]*\.[0-9]*.[0-9]*'),0)
$(error The kernel build folder path must end in <version>/build, or the variable KERN_VER must be set)
endif
endif
KERN_VER ?= $(shell uname -r)
endif
ifeq ($(KERN_DIR),)
KERN_DIR := /lib/modules/$(KERN_VER)/build
endif
# Is this 2.4 or < 2.6.6? The UTS_RELEASE "2.x.y.z" define is present in the header until 2.6.1x something.
ifeq ($(shell if grep '"2\.4\.' $(KERN_DIR)/include/linux/version.h > /dev/null 2>&1; then echo yes; fi),yes)
KERN_VERSION := 24
VBOX_KERN_GROKS_EXTMOD :=
else
KERN_VERSION := 26
VBOX_KERN_GROKS_EXTMOD := yes
ifeq ($(shell if grep '"2\.6\.[012345][."]' $(KERN_DIR)/include/linux/version.h > /dev/null 2>&1; then echo yes; fi),yes)
VBOX_KERN_GROKS_EXTMOD :=
endif
VBOX_KERN_GROKS_SUBDIRS :=
ifeq ($(shell if grep '"[432]\.' $(KERN_DIR)/include/linux/version.h > /dev/null 2>&1; then echo yes; fi),yes)
VBOX_KERN_GROKS_SUBDIRS := yes
endif
endif
#
# Hack for Ubuntu 4.10 where we determine 2.6.8.1-3-generic-amd64 here, but the
# the next invocation (M/SUBDIR) ends up with KERNELRELEASE=2.6.8.1-3.
#
ifeq ($(shell if grep '"[2]\.' $(KERN_DIR)/include/linux/version.h > /dev/null 2>&1; then echo yes; fi),yes)
export KERN_VER KERN_DIR
else
# This makefile received some variables in the command line which should
# not be passed to the recursive make invocations (of the Linux makefile
# for building kernel modules), since they should derive KERN_DIR from the
# respective command line variables to come up with the value they expect.
unexport KERN_VER KERN_DIR
MAKEOVERRIDES := $(filter-out KERN_VER=% KERN_DIR=%,$(MAKEOVERRIDES))
endif
else # neq($(KERNELRELEASE),)
#
# building from kbuild (make -C <kernel_directory> M=`pwd`)
#
# guess kernel version (24 or 26)
ifeq ($(VERSION).$(PATCHLEVEL),2.4)
KERN_VERSION := 24
VBOX_KERN_GROKS_EXTMOD :=
else
KERN_VERSION := 26
VBOX_KERN_GROKS_EXTMOD := yes
ifeq ($(VERSION).$(PATCHLEVEL),2.6)
ifeq ($(findstring @$(SUBLEVEL)@,@0@1@2@3@4@5@),@$(SUBLEVEL)@)
VBOX_KERN_GROKS_EXTMOD :=
endif
endif
VBOX_KERN_GROKS_SUBDIRS :=
ifeq ($(VERSION),2)
VBOX_KERN_GROKS_SUBDIRS := yes
endif
ifeq ($(VERSION),3)
VBOX_KERN_GROKS_SUBDIRS := yes
endif
ifeq ($(VERSION),4)
VBOX_KERN_GROKS_SUBDIRS := yes
endif
endif
KERN_VER := $(KERNELRELEASE)
ifeq ($(KERN_DIR),)
ifneq ($(srctree),)
KERN_DIR := $(srctree)
else
KERN_DIR := /lib/modules/$(KERN_VER)/build
endif
endif
endif # neq($(KERNELRELEASE),)
# Kernel build folder
ifneq ($(shell if test -d $(KERN_DIR); then echo yes; fi),yes)
$(error Error: unable to find the headers of the Linux kernel to build against (KERN_DIR=$(KERN_DIR)). \
Specify KERN_VER=<version> (currently $(KERN_VER)) and run Make again)
endif
# Kernel include folder
KERN_INCL := $(KERN_DIR)/include
# module install folder
INSTALL_MOD_DIR ?= misc
MODULE_DIR := $(INSTALL_MOD_PATH)/lib/modules/$(KERN_VER)/$(INSTALL_MOD_DIR)
# For VBOX_GCC_CHECK_CC
VBOX_CLOSEPAR := )
VBOX_DOLLAR := $$
## Modified VBOX_GCC_CHECK_EX_CC_CXX macro from /Config.kmk.
# @param 1 The option to test for.
# @param 2 The return value when supported.
# @param 3 The return value when NOT supported.
VBOX_GCC_CHECK_CC = $(shell \
> /tmp/$(VBOX_DOLLAR)$(VBOX_DOLLAR).check.c; \
if $(CC) $(subst -Wno-,-W,$(1)) -Werror -c -o /dev/null /tmp/$(VBOX_DOLLAR)$(VBOX_DOLLAR).check.c > /dev/null 2>&1; then \
case "`LC_ALL=C $(CC) $(subst -Wno-,-W,$(1)) -Werror -c -o /dev/null /tmp/$(VBOX_DOLLAR)$(VBOX_DOLLAR).check.c 2>&1`" in \
"error: unknown warning option"*$(VBOX_CLOSEPAR) echo "$(3)";; \
*$(VBOX_CLOSEPAR) echo "$(2)";; \
esac; \
else echo "$(3)"; fi; \
rm -f /tmp/$(VBOX_DOLLAR)$(VBOX_DOLLAR).check.c; )
#
# Guess the module directory ASSUMING that this file is located in that directory.
# Note! The special MAKEFILE_LIST variable was introduced in GNU make 3.80.
#
ifndef VBOX_MODULE_SRC_DIR
ifdef MAKEFILE_LIST
VBOX_MODULE_SRC_DIR := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
else
VBOX_MODULE_SRC_DIR := $(CURDIR)/
endif
endif
# debug - show guesses.
ifdef DEBUG
ifndef VBOX_KERN_QUIET
$(warning dbg: INSTALL_MOD_PATH = $(INSTALL_MOD_PATH))
$(warning dbg: INSTALL_MOD_DIR = $(INSTALL_MOD_DIR))
$(warning dbg: KERN_DIR = $(KERN_DIR))
$(warning dbg: KERN_INCL = $(KERN_INCL))
$(warning dbg: KERN_VERSION = $(KERN_VERSION))
$(warning dbg: MODULE_DIR = $(MODULE_DIR))
$(warning dbg: VBOX_MODULE_SRC_DIR = $(VBOX_MODULE_SRC_DIR))
endif
endif
|