VirtualBox

source: vbox/trunk/Config.kmk@ 106942

Last change on this file since 106942 was 106925, checked in by vboxsync, 3 months ago

/Config.kmk,SUPDrv: Introduced a VBOX_WITH_MINIMAL_HARDENING build config for windows hosts where we only require the process image and any r0 modules to be signed with the same certificate as the driver. This changeset implements the latter part. jiraref:VBP-1449

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 440.4 KB
Line 
1# $Id: Config.kmk 106925 2024-11-11 11:59:38Z vboxsync $
2## @file
3# The global build configuration file for VBox.
4#
5# This file gets included by all makefiles through the
6# include $(KBUILD_PATH)/header.kmk statement.
7#
8
9#
10# Copyright (C) 2006-2024 Oracle and/or its affiliates.
11#
12# This file is part of VirtualBox base platform packages, as
13# available from https://www.virtualbox.org.
14#
15# This program is free software; you can redistribute it and/or
16# modify it under the terms of the GNU General Public License
17# as published by the Free Software Foundation, in version 3 of the
18# License.
19#
20# This program is distributed in the hope that it will be useful, but
21# WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23# General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program; if not, see <https://www.gnu.org/licenses>.
27#
28# SPDX-License-Identifier: GPL-3.0-only
29#
30
31# Marker.
32VBOX_ROOT_CONFIG_KMK_INCLUDED = 1
33
34#
35# kBuild stuff
36#
37
38# Build with umask 022 (requires kBuild r2556 to work, harmless on earlier).
39$(set-umask 022)
40
41# Add our own directories to the search paths.
42KBUILD_TOOL_PATHS = $(KBUILD_DEVTOOLS)/kBuildTools/
43KBUILD_UNIT_PATHS = $(KBUILD_DEVTOOLS)/kBuildUnits/
44
45# Modify the build types.
46KBUILD_BLD_TYPES = release profile debug kprofile
47
48## 'strict' builds
49# Same as release builds, except that RT_STRICT and VBOX_STRICT are defined,
50# meaning all assertions are in action. (Appending means '.strict' props take
51# precedence in argument lists.)
52KBUILD_BLD_TYPES += strict
53BLD_TYPE_strict_EXTENDS = release
54BLD_TYPE_strict_EXTENDS_BY = appending
55
56## 'asan' builds
57# Same as release builds, except that some form of address sanitizer (e.g.
58# VBOX_WITH_GCC_SANITIZER=1 or VBOX_WITH_EF_WRAPS) is enabled. In addition
59# RT_STRICT and VBOX_STRICT are defined so assertions and sanity checks will
60# also be enabled (mainly for not needing to build+test strict builds separately).
61KBUILD_BLD_TYPES += asan
62BLD_TYPE_asan_EXTENDS = release
63BLD_TYPE_asan_EXTENDS_BY = appending
64
65## 'dbgopt' builds
66# Same as debug builds, except that compiler optimizations are enabled. This
67# intended for cases where all the debug facitities (logging, assertions, ++)
68# is wanted but actual source level debugging as important as execution speed.
69KBUILD_BLD_TYPES += dbgopt
70BLD_TYPE_dbgopt_EXTENDS = debug
71BLD_TYPE_dbgopt_EXTENDS_BY = overriding
72
73## 'parfait' builds
74# Same as release builds, except that the result is prepared for static code
75# analysis by parfait.
76KBUILD_BLD_TYPES += parfait
77BLD_TYPE_parfait_EXTENDS = release
78BLD_TYPE_parfait_EXTENDS_BY = appending
79
80## 'parfait-dbg' builds
81# Same as debug builds, except that the result is prepared for static code
82# analysis by parfait.
83KBUILD_BLD_TYPES += parfait-dbg
84BLD_TYPE_parfait-dbg_EXTENDS = debug
85BLD_TYPE_parfait-dbg_EXTENDS_BY = appending
86
87# Temporary hack for kBuild ticket #83.
88## @todo kBuild: remove after closing ticket #83.
89PROPS_ACCUMULATE_L_LNK += INTERMEDIATES
90PROPS_PROGRAMS_ACCUMULATE_L += INTERMEDIATES
91PROPS_LIBRARIES_ACCUMULATE_L += INTERMEDIATES
92PROPS_DLLS_ACCUMULATE_L += INTERMEDIATES
93PROPS_SYSMODS_ACCUMULATE_L += INTERMEDIATES
94PROPS_MISCBINS_ACCUMULATE_L += INTERMEDIATES
95
96# Some info on the vendor
97VBOX_VENDOR = Oracle and/or its affiliates
98VBOX_VENDOR_SHORT = Oracle
99VBOX_PRODUCT = $(VBOX_VENDOR_SHORT) VirtualBox
100VBOX_PUEL_PRODUCT = $(VBOX_PRODUCT) Extension Pack
101# Not all could be done automatically. Here is a list of known places which
102# have to be updated manually, please keep this up to date:
103# src/VBox/Devices/PC/PXE/client/uinit.asm
104# src/VBox/RDP/webclient/flash/com/sun/network/rdp/Version.as
105# src/VBox/Frontends/VirtualBox/src/globals/UICommon.cpp
106# src/VBox/Frontends/VirtualBox/src/settings/global/VBoxGLSettingsLanguage.cpp
107# src/VBox/Frontends/VirtualBox/nls/*.ts
108# debian/control
109# src/VBox/Installer/linux/{debian,rpm}
110# src/VBox/Installer/linux/virtualbox.desktop
111# src/VBox/Additions/WINNT/Installer/ISO/ReadmeDrivers.txt
112# src/VBox/Main/nls/*.ts
113# src/VBox/ExtPacks/Puel/nls/*.ts
114# src/VBox/Frontends/VBoxManage/nls/*.ts
115# */*.inf, */*.rc
116
117# Misc names used by the install paths below.
118VBOX_PUEL_MANGLED_NAME = $(subst $(SP),_,$(VBOX_PUEL_PRODUCT))
119
120# Install paths
121## @todo This will change after 4.1 is branched off!
122# What is now 'bin' and 'lib' will be moved down under 'staged/', except on
123# darwin where it's currently called 'dist' which will be renamed to 'staged'.
124# When running 'kmk install' files will be copied to 'dist/', on unix systems
125# this will be done in FHS fashion assuming /usr/local or /usr as 'prefix'.
126#
127# Changes related to this are marked VBOX_WITH_NEW_LAYOUT.
128ifndef VBOX_WITH_NEW_LAYOUT
129 PATH_INS = $(PATH_OUT)/dist
130 PATH_STAGE = $(PATH_OUT)
131 INST_DEBUG := stage/debug/
132endif
133
134ifeq ($(KBUILD_TARGET),darwin)
135 ifndef VBOX_WITH_NEW_LAYOUT
136 INST_DIST = dist/
137 else
138 INST_DIST :=
139 endif
140 INST_SDK = $(INST_DIST)sdk/
141
142 # the bundles
143 INST_VIRTUALBOX = $(INST_DIST)VirtualBox.app/
144 INST_VBOXDRV = $(INST_DIST)VBoxDrv.kext/
145 INST_VBOXNETFLT = $(INST_DIST)VBoxNetFlt.kext/
146 INST_VBOXNETADP = $(INST_DIST)VBoxNetAdp.kext/
147 INST_VBOXUSB = $(INST_DIST)VBoxUSB.kext/
148
149 # put everything in the VirtualBox app bundle.
150 INST_BIN = $(INST_VIRTUALBOX)Contents/MacOS/
151 INST_DLL = $(INST_BIN)
152 INST_SYS = $(INST_BIN)
153 INST_TESTCASE = $(INST_BIN)testcase/
154 INST_ADDITIONS = $(INST_DIST)additions/
155 INST_ADDITIONS_ISO = $(INST_BIN)
156 INST_UNATTENDED_TEMPLATES = $(INST_BIN)UnattendedTemplates/
157
158 INST_VBOXDBG_SYMS = $(INST_VIRTUALBOX)Contents/Resources/VBoxDbgSyms/
159
160 # other paths
161 INST_LIB = lib/
162 INST_ADDITIONS_LIB = $(INST_LIB)additions/
163 VBOX_INST_DTRACE_LIB = $(INST_BIN)dtrace/lib/
164 VBOX_INST_DTRACE_TST = $(INST_BIN)dtrace/testcase/
165 VBOX_INST_TOOLS = $(INST_BIN)tools/
166
167else
168
169 INST_BIN = bin/
170 INST_DIST = $(INST_BIN)
171 INST_SDK = $(INST_BIN)sdk/
172
173 INST_VIRTUALBOX = $(INST_BIN)
174 INST_VBOXDRV = $(INST_BIN)
175 INST_VBOXNETFLT = $(INST_BIN)
176 INST_VBOXNETADP = $(INST_BIN)
177 INST_VBOXUSB = $(INST_BIN)
178
179 INST_DLL = $(INST_BIN)
180 INST_SYS = $(INST_BIN)
181 INST_TESTCASE = $(INST_BIN)testcase/
182 INST_ADDITIONS = $(INST_BIN)additions/
183 INST_ADDITIONS_ISO = $(INST_ADDITIONS)
184 INST_UNATTENDED_TEMPLATES = $(INST_BIN)UnattendedTemplates/
185
186 INST_LIB = lib/
187 INST_ADDITIONS_LIB = $(INST_LIB)additions/
188 VBOX_INST_DTRACE_LIB = $(INST_BIN)dtrace/lib/
189 VBOX_INST_DTRACE_TST = $(INST_BIN)dtrace/testcase/
190
191 INST_VBOXDBG_SYMS = $(INST_BIN)VBoxDbgSyms/
192 VBOX_INST_TOOLS = $(INST_BIN)tools/
193endif
194
195
196INST_VALIDATIONKIT = validationkit/
197INST_TESTBOXSCRIPT = testboxscript/
198
199INST_DOC = doc/
200INST_EXTPACK = $(INST_BIN)ExtensionPacks/
201INST_EXTPACK_CERTS = $(INST_BIN)ExtPackCertificates/
202INST_EXTPACK_PUEL = $(INST_EXTPACK)$(VBOX_PUEL_MANGLED_NAME)/
203INST_PACKAGES = packages/
204
205VBOX_PATH_SDK = $(patsubst %/,%,$(PATH_STAGE)/$(INST_SDK))
206VBOX_PATH_DIST = $(patsubst %/,%,$(PATH_STAGE)/$(INST_DIST))
207VBOX_PATH_VALIDATIONKIT = $(patsubst %/,%,$(PATH_STAGE)/$(INST_VALIDATIONKIT))
208VBOX_PATH_ADDITIONS = $(patsubst %/,%,$(PATH_STAGE)/$(INST_ADDITIONS))
209VBOX_PATH_ADDITIONS_ISO = $(patsubst %/,%,$(PATH_STAGE)/$(INST_ADDITIONS_ISO))
210VBOX_PATH_ADDITIONS_LIB = $(patsubst %/,%,$(PATH_STAGE)/$(INST_ADDITIONS_LIB))
211VBOX_PATH_EXTPACK_PUEL = $(patsubst %/,%,$(PATH_STAGE)/$(INST_EXTPACK_PUEL))
212VBOX_PATH_PACKAGES = $(patsubst %/,%,$(PATH_STAGE)/$(INST_PACKAGES))
213VBOX_PATH_TOOLS = $(patsubst %/,%,$(PATH_STAGE)/$(VBOX_INST_TOOLS))
214
215
216#
217# Some source paths of global interest.
218#
219VBOX_PATH_SRC_CERTIFICATES = $(PATH_ROOT)/src/VBox/HostDrivers/Support/Certificates
220
221
222#
223# Delete targets on failure.
224#
225.DELETE_ON_ERROR:
226
227#
228# Notify about important kBuild updates.
229#
230if $(KBUILD_VERSION_MAJOR) == 0 \
231 && ( $(KBUILD_VERSION_MINOR) >= 2 \
232 || ( $(KBUILD_VERSION_MINOR) == 1 \
233 && $(KBUILD_VERSION_PATCH) >= 999))
234 VBOX_MIN_KMK_REVISION := 3093
235 VBOX_MIN_KBUILD_KMK_REVISION := $(if-expr "$(KBUILD_HOST)" == "win",3097,$(if-expr "$(KBUILD_HOST).$(KBUILD_HOST_ARCH)" == "solaris.sparc64",2511,3074))
236 if $(KMK_REVISION) >= $(VBOX_MIN_KMK_REVISION)
237 if $(KBUILD_KMK_REVISION) >= $(VBOX_MIN_KBUILD_KMK_REVISION)
238 # OK.
239 else
240 $(error You must update kBuild! Requires kBuild binaries $(VBOX_MIN_KBUILD_KMK_REVISION) or later, kmk says $(KBUILD_KMK_REVISION) ($(KBUILD_VERSION)))
241 endif
242 else
243 $(error You must update kBuild! Requires kBuild revision $(VBOX_MIN_KMK_REVISION) or later, found $(KMK_REVISION) ($(KBUILD_VERSION)))
244 endif
245else
246 $(error You must update kBuild! Requires 0.1.999 or later, found $(KBUILD_VERSION))
247endif
248
249#
250# Define USERNAME early on.
251#
252ifndef USERNAME
253 ifdef USER
254 USERNAME = $(USER)
255 else
256 $(warning Warning: You must have USERNAME or USER in your environment.)
257 endif
258endif
259
260#
261# Detect the darwin host version number so we can disable stuff that doesn't
262# currently build on Lion.
263#
264ifeq ($(KBUILD_HOST),darwin)
265 VBOX_DARWIN_HOST_VERSION := $(subst ., ,$(shell uname -r))
266 # Keep counting _MAJOR past 19.x (macOS 10.15.x) to simplify dealing with macOS 11.x.
267 VBOX_DARWIN_HOST_VERSION_MAJOR := $(expr $(word 1, $(VBOX_DARWIN_HOST_VERSION)) - 4)
268 VBOX_DARWIN_HOST_VERSION_MINOR := $(word 2, $(VBOX_DARWIN_HOST_VERSION))
269 VBOX_DARWIN_HOST_VERSION_PATCH := $(word 3, $(VBOX_DARWIN_HOST_VERSION))
270 if $(VBOX_DARWIN_HOST_VERSION_MAJOR) <= 15
271 VBOX_DARWIN_HOST_VERSION := 10.$(VBOX_DARWIN_HOST_VERSION_MAJOR).$(VBOX_DARWIN_HOST_VERSION_MINOR)
272 else
273 VBOX_DARWIN_HOST_VERSION := 11.$(expr $(VBOX_DARWIN_HOST_VERSION_MAJOR) - 16).$(VBOX_DARWIN_HOST_VERSION_MINOR)
274 endif
275endif
276
277include $(PATH_ROOT)/Version.kmk
278
279# The raw version string. This *must not* contain any other information/fields than
280# major, minor and build revision (as it is now) -- also will be used for host/guest version
281# comparison.
282VBOX_VERSION_STRING_RAW = $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
283
284# VBOX_VERSION_STRING without the publisher.
285VBOX_VERSION_STRING_NO_PUB = $(VBOX_VERSION_STRING_RAW)$(addprefix _,$(VBOX_VERSION_PRERELEASE))
286
287# Full version string (may include more than just x.y.z, but no spaces or other problematic chars).
288# Note! The BETA[n],ALPHA[n],RC[n] indicators should be inserted before the
289# publisher so that RTStrVersionCompare have a chance of comparing
290# prerelease from different publishers correctly.
291VBOX_VERSION_STRING = $(VBOX_VERSION_STRING_NO_PUB)$(VBOX_BUILD_PUBLISHER)
292
293
294## Make a numeric value from the major, minor and build numbers (params)
295VBOX_FULL_VERSION_MAKE = $(expr ($1 << 24) | ($2 << 16) | $3)
296
297## Checks if the current VBox version is higher or equal to the major, minor and
298# build numbers given as parameters.
299# @returns 1 if true, 0 if false. For use with 'if'.
300VBOX_VERSION_PREREQ = $(expr $(call VBOX_FULL_VERSION_MAKE,$(VBOX_VERSION_MAJOR),$(VBOX_VERSION_MINOR),$(VBOX_VERSION_BUILD)) \
301 >= $(call VBOX_FULL_VERSION_MAKE,$1,$2,$3))
302
303# Enable host screen saver toggle by default
304VBOX_WITH_SCREENSAVER_CONTROL = 1
305
306# Force the additions.sh script to get an exact additions build when we're doing the release.
307if $(VBOX_VERSION_BUILD) % 2 == 0
308 ifeq ($(VBOX_VERSION_PRERELEASE),)
309 VBOX_RELEASE_EXACT_MATCH = 1
310 endif
311endif
312ifneq ($(VBOX_RELEASE_EXACT_MATCH),)
313 export VBOX_ADDITIONS_SH_MODE = release
314 export VBOX_DOCUMENTATION_SH_MODE = release
315 export VBOX_EFI_SH_MODE = release
316 export VBOX_EXTPACKS_SH_MODE = release
317endif
318
319# Maybe we want set this manually.
320VBOX_C_YEAR = $(date-utc %Y)
321
322#
323# The VirtualBox package type.
324#
325ifeq ($(KBUILD_TARGET),win)
326 VBOX_PACKAGE_OS = WINDOWS
327else ifeq ($(KBUILD_TARGET),linux)
328 VBOX_PACKAGE_OS = LINUX
329else ifeq ($(KBUILD_TARGET),darwin)
330 VBOX_PACKAGE_OS = DARWIN
331else ifeq ($(KBUILD_TARGET),solaris)
332 VBOX_PACKAGE_OS = SOLARIS
333else ifeq ($(KBUILD_TARGET),os2)
334 VBOX_PACKAGE_OS = OS2
335else ifeq ($(KBUILD_TARGET),haiku)
336 VBOX_PACKAGE_OS = HAIKU
337else if1of ($(KBUILD_TARGET), dragonfly freebsd netbsd openbsd)
338 VBOX_PACKAGE_OS = BSD
339else
340 $(error Cannot determine VBOX_PACKAGE_OS)
341endif
342ifeq ($(KBUILD_TARGET_ARCH),x86)
343 VBOX_PACKAGE_ARCH = 32BITS
344else
345 VBOX_PACKAGE_ARCH = 64BITS
346endif
347# distribution, mostly for Linux/Solaris where we support different distributions
348# this strip will be overridden by the Linux packaging scripts
349VBOX_PACKAGE_DIST ?= GENERIC
350# Full string
351VBOX_PACKAGE_STRING = $(VBOX_PACKAGE_OS)_$(VBOX_PACKAGE_ARCH)_$(VBOX_PACKAGE_DIST)
352
353# Supported VirtualBox host architectures.
354VBOX_SUPPORTED_HOST_ARCHS := amd64
355if1of ($(KBUILD_TARGET), darwin win linux) # Work in progress.
356 VBOX_SUPPORTED_HOST_ARCHS += arm64
357endif
358
359
360#
361# The VirtualBox Configuration Defaults.
362#
363# We try to document all the build configuration options here, things which
364# aren't enabled by default are left commented out just to show that they
365# exist and which value they should have (usually 1, but anyway).
366#
367
368# Indicate VBOX_ONLY build if any of the VBOX_ONLY_* variables are set.
369VBOX_ONLY_BUILD := $(strip $(foreach x, ADDITIONS DOCS EXTPACKS SDK VALIDATIONKIT \
370 , $(if-expr defined(VBOX_ONLY_$(x)),VBOX_ONLY_$(x))))
371if $(words $(VBOX_ONLY_BUILD)) > 1
372 $(error VBox: More than one VBOX_ONLY build enabled! $(VBOX_ONLY_BUILD))
373endif
374
375# Select new Xcode based on host OS X version.
376ifeq ($(KBUILD_HOST),darwin)
377 if "$(KBUILD_TARGET_ARCH)" == "arm64"
378 VBOX_WITH_EVEN_NEWER_XCODE := 1
379 else if !defined(VBOX_WITH_EVEN_NEWER_XCODE) && !defined(VBOX_WITHOUT_EVEN_NEWER_XCODE) && !defined(VBOX_WITH_NEW_XCODE) && $(KBUILD_HOST_VERSION_MAJOR) >= 16 # (OS X 10.12 Sierra)
380 VBOX_WITH_EVEN_NEWER_XCODE := 1
381 else if !defined(VBOX_WITH_NEW_XCODE) && !defined(VBOX_WITHOUT_NEW_XCODE) && $(KBUILD_HOST_VERSION_MAJOR) >= 13 # (OS X 10.9 Mavericks)
382 VBOX_WITH_NEW_XCODE := 1
383 endif
384endif
385# Select new VC++ on Windows.
386if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH) $(KBUILD_HOST).$(KBUILD_HOST_ARCH), win.arm64)
387 VBOX_WITH_NEW_VCC = 1
388endif
389# Use this to disable control flow.
390#VBOX_WITHOUT_CONTROL_FLOW_GUARD = 1
391# Don't use the compiler CRT for statically linked modules, use IPRT with some
392# additional CRT functionality.
393# Note! This has only been tested with Visual C++ 2019.
394## @todo the arm64 exclusion is temporary.
395if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" != "asan" && "$(KBUILD_TARGET_ARCH)" != "arm64"
396 VBOX_WITH_NOCRT_STATIC := 1
397endif
398
399## @name Additions
400## @{
401# This indicates that additions (of some kind or another) is being _built_.
402# VBOX_WITHOUT_ADDITIONS overrides it.
403VBOX_WITH_ADDITIONS = 1
404# Build the optional ring-0 part of the additions for syntax checking.
405# On linux we build this as a test case instead.
406# Skip for darwin.arm64 for now.
407if "$(KBUILD_TARGET)" != "linux" && "$(intersects $(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.arm64)" == ""
408 VBOX_WITH_ADDITION_DRIVERS = 1
409endif
410# Build X11 additions. Can be disabled separately.
411if1of ($(KBUILD_TARGET), dragonfly freebsd linux netbsd openbsd solaris)
412 VBOX_WITH_X11_ADDITIONS = 1
413 # On ARM we don't support the old VBoxVideo graphics emulation and rely fully on VMSVGA
414 # (partly due to the fact that it relies on port I/O which is not available there).
415 if1of ($(KBUILD_TARGET_ARCH), arm32 arm64)
416 VBOX_NO_LEGACY_XORG_X11 = 1
417 endif
418endif
419# Enable the building of shared folders in the windows additions.
420VBOX_WITH_WIN32_ADDITIONS_SHAREDFOLDERS = 1
421# Take the binaries of the OS/2 Additions.
422VBOX_WITH_OS2_ADDITIONS_BIN = 1
423# Use additions from the build server.
424#VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER = 1
425# Include additions in the package
426VBOX_WITH_ADDITIONS_PACKING = 1
427# Don't include any CRTs.
428# For Windows hosts this would be the MS Visual Studio Redistributable (2019).
429VBOX_WITH_CRT_PACKING =
430# Only build the additions (for the additions build server).
431#VBOX_ONLY_ADDITIONS = 1
432ifdef VBOX_ADDITIONS_ONLY # typical mistake.
433 $(error It is VBOX_ONLY_ADDITIONS=1 not VBOX_ADDITIONS_ONLY!)
434endif
435# Don't bother with additions, overrides VBOX_WITH_ADDITIONS.
436# This is not used by makefiles, only Config.kmk, see below.
437ifdef VBOX_ONLY_SDK
438 VBOX_WITHOUT_ADDITIONS = 1
439endif
440# Don't create the additions ISO.
441# (Used by the additions build server, don't invert it.)
442#VBOX_WITHOUT_ADDITIONS_ISO = 1
443# Include and build the Linux arm64 guest additions.
444VBOX_WITH_LNX_ARM64_ADDITIONS = 1
445## @}
446
447# Set build options right for building the Additions as an RPM package.
448# VBOX_ONLY_RPM_ADDITIONS = 1
449ifdef VBOX_ONLY_RPM_ADDITIONS
450 VBOX_ONLY_ADDITIONS = 1
451 VBOX_ONLY_ADDITIONS_WITHOUT_RTISOMAKER = 1
452 # We build the RPMs using public sources.
453 VBOX_OSE = 1
454 # We want to re-use parts of the packing pass, but not all.
455 VBOX_WITHOUT_LINUX_GUEST_PACKAGE = 1
456 VBOX_WITHOUT_ADDITIONS_ISO = 1
457endif
458
459## @name Documentation
460## @{
461# The documentation
462VBOX_WITH_DOCS = 1
463# Use documentation from the build server.
464#VBOX_WITH_DOCS_FROM_BUILD_SERVER = 1
465# Include documentation in the package
466VBOX_WITH_DOCS_PACKING = 1
467# Build QHelp documentation, needs qhelpgenerator
468VBOX_WITH_DOCS_QHELP = 1
469# Include QHelp documentation in the package
470VBOX_WITH_DOCS_QHELP_PACKING = 1
471# By default only include translations in documentation-only builds
472ifdef VBOX_ONLY_DOCS
473 ifndef VBOX_NO_DOCS_TRANSLATIONS
474 VBOX_WITH_DOCS_TRANSLATIONS = 1
475 endif
476endif
477# Default languages
478VBOX_MANUAL_LANGUAGES = en_US
479ifdef VBOX_WITH_DOCS_TRANSLATIONS
480 # The French translation is too outdated to be useful, needs a fresh start.
481 #VBOX_MANUAL_ADD_LANGUAGES = fr_FR
482endif
483# Don't bother with documentation, overrides VBOX_WITH_DOCS.
484# This is not used by makefiles, only Config.kmk, see below.
485#VBOX_WITHOUT_DOCS = 1
486# Only build the documentation (for the documentation build server).
487#VBOX_ONLY_DOCS = 1
488ifdef VBOX_DOCS_ONLY # typical mistake.
489 $(error It is VBOX_ONLY_DOCS=1 not VBOX_DOCS_ONLY!)
490endif
491## @}
492
493## @name VMM related settings.
494## @{
495# Enables the VT-x & AMD-V execution manager (HM).
496if "$(KBUILD_TARGET)" == "amd64" && !defined(VBOX_WITHOUT_HWVIRT)
497 VBOX_WITH_HWVIRT := 1
498endif
499# Enables .r0 modules.
500if "$(KBUILD_TARGET_ARCH)" == "amd64" || "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.arm64"
501 VBOX_WITH_R0_MODULES := 1
502endif
503# Configures VBox with minimal ring-0 footprint - default on non-amd64 hosts.
504ifdef VBOX_WITH_R0_MODULES
505 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.arm64)
506 VBOX_WITH_MINIMAL_R0 := 1
507 endif
508else
509 undefine VBOX_WITH_MINIMAL_R0
510endif
511# Enable safe STR (store task register) emulation for raw-mode.
512VBOX_WITH_SAFE_STR = 1
513# Enable support for 64-bit guests.
514VBOX_WITH_64_BITS_GUESTS = 1
515# Enable multi-core VCPUs.
516VBOX_WITH_MULTI_CORE = 1
517# Activate this to force the VM to pre-allocate the guest RAM before startup
518VBOX_WITH_PREALLOC_RAM_BY_DEFAULT =
519# Enable the debugger.
520VBOX_WITH_DEBUGGER = 1
521# Enable the debugger GUI.
522VBOX_WITH_DEBUGGER_GUI = 1
523# Nested hardware virtualization (64-bit hosts only).
524ifeq ($(KBUILD_TARGET_ARCH),amd64)
525 # Enables SVM nested hardware virtualization support.
526 VBOX_WITH_NESTED_HWVIRT_SVM = 1
527 # Enables VMX nested hardware virtualization support.
528 VBOX_WITH_NESTED_HWVIRT_VMX = 1
529 # Enables nested hardware virtualization support but only in IEM.
530 #VBOX_WITH_NESTED_HWVIRT_ONLY_IN_IEM = 1
531 ifdef VBOX_WITH_NESTED_HWVIRT_ONLY_IN_IEM
532 if !defined(VBOX_WITH_NESTED_HWVIRT_SVM) && !defined(VBOX_WITH_NESTED_HWVIRT_VMX)
533 $(error VBOX_WITH_NESTED_HWVIRT_ONLY_IN_IEM defined without enabling nested VMX or nested SVM support)
534 endif
535 endif
536 # Enables guest EPT support for VMX nested hardware virtualization.
537 ifn1of ($(KBUILD_TARGET), darwin)
538 VBOX_WITH_NESTED_HWVIRT_VMX_EPT = 1
539 endif
540 if defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT) && !defined(VBOX_WITH_NESTED_HWVIRT_VMX)
541 $(error VBOX_WITH_NESTED_HWVIRT_VMX_EPT requires VBOX_WITH_NESTED_HWVIRT_VMX)
542 endif
543endif
544# Enable the TLBs in IEM (experimental).
545if1of ($(KBUILD_TARGET_ARCH), arm64)
546 VBOX_WITH_IEM_TLB := 1
547endif
548# Enable the IEM recompiler of x86 code.
549if1of ($(KBUILD_TARGET_ARCH), arm64)
550 VBOX_WITH_IEM_RECOMPILER := 1
551 VBOX_WITH_IEM_NATIVE_RECOMPILER := 1
552endif
553# Enable native NEM on windows and macOS.
554if1of ($(KBUILD_TARGET), win darwin)
555 VBOX_WITH_NATIVE_NEM = 1
556endif
557# Enable NEM fallback if the driver is not available.
558if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.amd64 darwin.arm64 linux.arm64 win.arm64)
559 VBOX_WITH_DRIVERLESS_NEM_FALLBACK = 1
560endif
561# Enable forced driverless mode by default.
562if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.amd64 darwin.arm64 linux.arm64)
563 VBOX_WITH_DRIVERLESS_FORCED = 1
564 ifn1of ($(KBUILD_TARGET), linux win)
565 VBOX_WITH_INTNET_SERVICE_IN_R3 = 1
566 endif
567endif
568# Enables the new breakpoint handling code, see @bugref{8650}
569VBOX_WITH_DBGF_FLOW_TRACING = 1
570# Enables ARMv8 virtualization, see @bugref{10383}
571if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.arm64 linux.arm64 win.arm64)
572 VBOX_WITH_VIRT_ARMV8 = 1
573endif
574if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), linux.amd64)
575 ifdef VBOX_WITH_R0_MODULES
576 # Enable IBT branch protection for the R0 modules.
577 # (A make warning will be shown if gcc is too old.)
578 VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION = 1
579 endif
580endif
581## @}
582
583
584## @name Devices, Drivers, ...
585## @{
586# Build the Host Guest Communication Manager component.
587VBOX_WITH_HGCM = 1
588## Build the bugcheck detection code.
589#VBOX_WITH_GUEST_BUGCHECK_DETECTION =
590# Enable the USB feature. This includes VBOX_WITH_VUSB!
591VBOX_WITH_USB = 1
592# Enable the USB 1.1 controller plus virtual USB HID devices.
593VBOX_WITH_VUSB = 1
594# Enable the USB 2.0 controller.
595VBOX_WITH_EHCI = 1
596# Enable the ISCSI feature.
597VBOX_WITH_ISCSI = 1
598# Enable INIP support in the ISCSI feature.
599VBOX_WITH_INIP = 1
600# Enables lwip as a core of NAT service
601VBOX_WITH_LWIP_NAT = 1
602# Enables compilation of NAT service
603VBOX_WITH_NAT_SERVICE = 1
604# Enable NAT with Libslirp
605VBOX_WITH_LIBSLIRP = 1
606# Enable the E1000 feature.
607VBOX_WITH_E1000 = 1
608# Enable the Virtio feature.
609VBOX_WITH_VIRTIO = 1
610# Enable the Virtio SCSI device.
611VBOX_WITH_VIRTIO_SCSI = 1
612# HDA emulation is Intel HDA by default.
613VBOX_WITH_INTEL_HDA = 1
614ifn1of ($(KBUILD_TARGET), win darwin)
615 # Enable OSS audio support.
616 VBOX_WITH_AUDIO_OSS = 1
617endif
618if1of ($(KBUILD_TARGET), linux)
619 # Enable ALSA audio support.
620 VBOX_WITH_AUDIO_ALSA = 1
621endif
622if1of ($(KBUILD_TARGET), linux)
623 # Enable PulseAudio audio support.
624 VBOX_WITH_AUDIO_PULSE = 1
625endif
626# Enable building debugging backend.
627# Only will be used at runtime when "VBoxInternal2/Audio/Debug/Enabled" (VM / global) is set.
628VBOX_WITH_AUDIO_DEBUG = 1
629# Enables the audio endpoint detection on Windows hosts.
630VBOX_WITH_AUDIO_MMNOTIFICATION_CLIENT = 1
631# Enable PCI passthrough support.
632# (disabled with 6.1, since it's not complete/useful enough)
633VBOX_WITH_PCI_PASSTHROUGH =
634# Enable statically linked dbus support.
635if1of ($(KBUILD_TARGET), linux solaris)
636 VBOX_WITH_DBUS = 1
637endif
638# Enable building PAM modules.
639if1of ($(KBUILD_TARGET), linux solaris)
640 VBOX_WITH_PAM = 1
641endif
642# Enable internal networking.
643VBOX_WITH_INTERNAL_NETWORKING = 1
644# Enable vmsvga (svga2) graphics device variant, 2D part
645VBOX_WITH_VMSVGA = 1
646# Enable vmsvga (svga2) graphics device variant, 3D part
647if1of ($(KBUILD_TARGET), darwin linux win)
648 VBOX_WITH_VMSVGA3D = 1
649endif
650# Enable vmsvga (svga2) graphics device variant, 3D part, VGPU10 DX commands
651ifdef VBOX_WITH_VMSVGA3D
652 VBOX_WITH_VMSVGA3D_DX = 1
653 # Enable DXVK library for supporting VGPU10 DX on non Windows hosts
654 if1of ($(KBUILD_TARGET), linux darwin)
655 VBOX_WITH_DXVK = 1
656 endif
657endif
658# Enable the generic 3D settings support if at least one 3D capable solution is enabled
659ifdef VBOX_WITH_VMSVGA3D
660 VBOX_WITH_3D_ACCELERATION = 1
661endif
662# Enable Host Guest Shared Memory Interface.
663VBOX_WITH_HGSMI = 1
664# Enable Video 2D Acceleration.
665if1of ($(KBUILD_TARGET), darwin linux win freebsd)
666 VBOX_WITH_VIDEOHWACCEL = 1
667endif
668if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.x86 win.amd64)
669 # Enable XPDM Video driver for XP and older guests.
670 VBOX_WITH_XPDM = 1
671endif
672# Enable Wddm Video driver for Vista+ guests.
673ifn1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.arm64) ## @todo win.arm64: port the WDDM + VGA device to arm64.
674 VBOX_WITH_WDDM = 1
675endif
676# Lazy developer!!
677VBOXWDDM_WITH_VBVA = 1
678# Lazy developer!!
679ifdef VBOX_WITH_WDDM
680 VBOX_WITH_VDMA = 1
681else ifdef VBOX_WITH_VDMA
682 undefine VBOX_WITH_VDMA
683endif
684# Gallium based WDDM driver
685if1of ($(KBUILD_TARGET), win)
686 VBOX_WITH_MESA3D = 1
687endif
688# VGPU10 UMD driver for Vista+ guests in the guest additions installer
689ifdef VBOX_WITH_VMSVGA3D_DX
690 if1of ($(KBUILD_TARGET), win)
691 VBOX_WITH_WDDM_DX = 1
692 endif
693endif
694# Disable the Intel PXE ROM (uses Etherboot).
695VBOX_WITH_INTEL_PXE =
696# Enable EFI support
697VBOX_WITH_EFI = 1
698# Enable Secure Boot in the EFI firmware.
699VBOX_WITH_EFI_SECURE_BOOT = 1
700# Enable TPM support in the EFI firmware.
701VBOX_WITH_EFI_TPM = 1
702# Embed the EFI firmwares in VBoxDD2.dll/dylib/so.
703VBOX_WITH_EFI_IN_DD2 = 1
704# Fetch EFI firmware image from the build server
705#VBOX_WITH_EFIFW_FROM_BUILD_SERVER = 1
706# Include the EFI firmware into the package
707ifndef VBOX_WITH_EFI_IN_DD2
708 VBOX_WITH_EFIFW_PACKING = 1
709endif
710# Enable setuid wrapper for Solaris host DVD.
711#VBOX_WITH_SUID_WRAPPER = 1
712# Enable the virtual SATA/AHCI controller
713VBOX_WITH_AHCI = 1
714# Enable the new async completion manager
715VBOX_WITH_PDM_ASYNC_COMPLETION = 1
716ifdef VBOX_WITH_USB
717 VBOX_WITH_VUSB = 1
718 VBOX_WITH_XHCI_IMPL = 1
719endif
720ifdef VBOX_WITH_EHCI
721 VBOX_WITH_EHCI_IMPL = 1
722endif
723ifdef VBOX_WITH_PCI_PASSTHROUGH
724 ## @bugref{9218}: Disabled awaiting conversion of the device to new PDM device style.
725 #VBOX_WITH_PCI_PASSTHROUGH_IMPL = 1
726endif
727ifndef VBOX_WITHOUT_HOSTWEBCAM
728 VBOX_WITH_USB_VIDEO_IMPL = 1
729endif
730# Enable the hal/sysfs USB code on Linux.
731ifeq ($(KBUILD_TARGET),linux)
732 VBOX_USB_WITH_SYSFS = 1
733 # Disabled for now
734 # VBOX_USB_WITH_DBUS = 1
735 VBOX_USB_WITH_INOTIFY = 1
736endif
737# Enable performance API.
738VBOX_WITH_RESOURCE_USAGE_API = 1
739# Use VBoxVolInfo for getting FS dependecies.
740if1of ($(KBUILD_TARGET), linux)
741 VBOX_WITH_DEVMAPPER = 1
742endif
743# Enable unattended installation API
744VBOX_WITH_UNATTENDED = 1
745# Enable BusLogic SCSI host adapter
746VBOX_WITH_BUSLOGIC = 1
747# Enable LsiLogic SCSI host adapter
748VBOX_WITH_LSILOGIC = 1
749# Enable SCSI drivers
750VBOX_WITH_SCSI = 1
751# Enable this setting to force a fallback to default DMI data on configuration errors
752VBOX_BIOS_DMI_FALLBACK =
753# Enable the builtin PXE ROM
754VBOX_WITH_PXE_ROM = 1
755# Enable MSI support in devices
756VBOX_WITH_MSI_DEVICES = 1
757# Enable host network interface API.
758if1of ($(KBUILD_TARGET), darwin freebsd linux solaris win)
759 VBOX_WITH_HOSTNETIF_API = 1
760endif
761# Emulated USB smart card reader
762VBOX_WITH_USB_CARDREADER = 1
763# Disk crypt plugin
764VBOX_WITH_PLUGIN_CRYPT = 1
765# VirtualKD stub/loader device, only relevant on Windows host
766VBOX_WITH_VIRTUALKD = 1
767# NVMe device emulation
768VBOX_WITH_NVME_IMPL = 1
769# Storage related debug drivers
770VBOX_WITH_DRV_DISK_INTEGRITY = 1
771# Enables the AMD IOMMU
772VBOX_WITH_IOMMU_AMD = 1
773# Enables the Intel IOMMU
774VBOX_WITH_IOMMU_INTEL = 1
775# Enables the new DBGF tracing framework
776VBOX_WITH_DBGF_TRACING = 1
777# Enable TPM device emulation support.
778VBOX_WITH_TPM = 1
779# Enable libtpms, required for the in process TPM emulation.
780if1of ($(KBUILD_TARGET), linux darwin win solaris)
781 VBOX_WITH_LIBTPMS = 1
782endif
783# Disable keyboard HID Consumer/Desktop control keys passthrough
784# VBOX_WITHOUT_KEYBOARD_HID_CC_DC_PASSTHROUGH = 1
785## @}
786
787# legacy
788ifdef VBOX_ONLY_TESTSUITE
789 $(warning VBOX_ONLY_TESTSUITE was renamed to VBOX_ONLY_VALIDATIONKIT)
790 VBOX_ONLY_VALIDATIONKIT = $(VBOX_ONLY_TESTSUITE)
791endif
792
793## @name Other Component
794## @{
795# Build the installer.
796VBOX_WITH_INSTALLER = 1
797# Show license pages for non-OSE versions by default.
798# This is required for e.g. the Windows host installer.
799ifndef VBOX_OSE
800 VBOX_WITH_LICENSE_DISPLAY = 1
801endif
802VBOX_WITH_GUEST_INSTALLER_UNICODE = 1
803# The kernel driver/module and related runtime libraries.
804# On Linux we build this as a test case instead.
805# On darwin we don't use a support driver.
806if "$(KBUILD_TARGET)" != "linux" && "$(KBUILD_TARGET)" != "darwin"
807 VBOX_WITH_VBOXDRV = 1
808endif
809# The main api.
810VBOX_WITH_MAIN = 1
811# Enables proxy stub for MS COM (speeds up setting IPC for objects).
812# (The VBOX_MIDL_PROXY_CLSID and VBOX_MIDL_PROXY_CLSID_IS are just two
813# representations of the class ID for the proxy stub.)
814VBOX_WITH_MIDL_PROXY_STUB = 1
815VBOX_MIDL_PROXY_CLSID := {0bb3b78c-1807-4249-5ba5-ea42d66af0bf}
816VBOX_MIDL_PROXY_CLSID_IS := {0x0bb3b78c,0x1807,0x4249,{0x5b,0xa5,0xea,0x42,0xd6,0x6a,0xf0,0xbf}}
817# Whether to also ship 32-bit main API on 64-bit systems.
818if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), solaris.amd64 win.amd64)
819 if !defined(VBOX_ONLY_VALIDATIONKIT) && !defined(VBOX_ONLY_ADDITIONS) && !defined(VBOX_ONLY_DOCS) && !defined(VBOX_ONLY_EXTPACKS)
820 VBOX_WITH_32_ON_64_MAIN_API = 1
821 endif
822endif
823# Whether to generate a database of USB vendor IDs and device IDs into VBoxSVC.
824VBOX_WITH_MAIN_USB_ID_DATABASE = 1
825# Whether to enable error message translation in Main.
826ifndef VBOX_ONLY_BUILD
827 VBOX_WITH_MAIN_NLS = 1
828endif
829# Whether to enable error message translation in Extension VM Pack.
830if !defined(VBOX_ONLY_BUILD) || defined(VBOX_ONLY_EXTPACKS)
831 VBOX_WITH_PUEL_NLS = 1
832endif
833# Whether to enable message translation in VBoxManage.
834#ifndef VBOX_ONLY_BUILD
835VBOX_WITH_VBOXMANAGE_NLS = 1
836#endif
837# Set this to prefix all C symbols in XPCOM, to avoid dynamic linking problems
838# caused by our XPCOM library polluting the symbol namespace for system libs.
839if1of ($(KBUILD_TARGET), linux solaris)
840 VBOX_WITH_XPCOM_NAMESPACE_CLEANUP = 1
841endif
842# The webservices api.
843VBOX_WITH_WEBSERVICES = 1
844VBOX_WITH_WEBSERVICES_SSL = 1
845# The Qt GUI.
846VBOX_WITH_QTGUI = 1
847# Indicates the Qt is Cocoa based on the Mac.
848ifeq ($(KBUILD_TARGET),darwin)
849 VBOX_WITH_COCOA_QT = 1
850endif
851
852# VBox Ballooning Control frontend.
853VBOX_WITH_FE_BALLOONCTRL = 1
854# VBox Autostart Service.
855VBOX_WITH_FE_AUTOSTART = 1
856# VBox Bug Report tool.
857VBOX_WITH_FE_BUGREPORT = 1
858# Enable this to get the SDL based GUI built. Mostly useful for development
859# purposes. For production use it's recommended to use the Qt GUI which can
860# be also stripped down. See VBOX_WITH_QTGUI.
861VBOX_WITH_VBOXSDL =
862# Start VBoxSVC in windows session 0 (services session).
863VBOX_WITH_VBOXSVC_SESSION_0 = 1
864# The headless frontend.
865VBOX_WITH_HEADLESS = 1
866# Enable the build of VRDP server.
867VBOX_WITH_VRDP = 1
868# Build the VRDP authentication modules.
869VBOX_WITH_VRDP_AUTHMOD = 1
870# Build enhanced version of rdesktop.
871VBOX_WITH_VRDP_RDESKTOP = 1
872## The Direct Framebuffer GUI.
873#VBOX_WITH_VBOXFB = 1
874# The basic frontend not using Main/COM/XPCOM.
875#VBOX_WITH_VBOXBFE = 1
876# Enables the Python<->XPCOM, Python<->COM and (WS enabled) Python<->WS bindings.
877VBOX_WITH_PYTHON ?= 1
878# Enables the PERL<->WS binding (if WS enabled).
879#VBOX_WITH_PERL ?= 1
880# Enables the PHP<->WS binding (if WS enabled).
881VBOX_WITH_PHP ?= 1
882if1of ($(KBUILD_TARGET), darwin linux solaris)
883 # Enable Java<->XPCOM bridge + glue code
884 VBOX_WITH_JXPCOM ?= 1
885endif
886if1of ($(KBUILD_TARGET), ) # scm:ignore-empty-if1of-set
887 # Enable Java<->MSCOM glue, bridge is provided by an external lib (Jacob)
888 VBOX_WITH_JMSCOM ?= 1
889endif
890if1of ($(KBUILD_TARGET), darwin linux solaris)
891 # Enable Java<->JAX-WS bridge
892 VBOX_WITH_JWS ?= 1
893endif
894# Use XPIDL instead of XSLT stylesheet
895VBOX_WITH_JAVA_SUPPORT_IN_XPIDL ?=
896# Build against multiple Python versions present in the system (only up to 3.2,
897# unless VBOX_WITH_ONLY_PYTHON_LIMITED_API is overridden).
898VBOX_WITH_MULTIVERSION_PYTHON ?= 1
899# Only build the limited Python extension API version for 3.3 and later.
900VBOX_WITH_ONLY_PYTHON_LIMITED_API = 1
901# Build the Validation Kit.
902VBOX_WITH_VALIDATIONKIT = 1
903# Include unit tests (testcases) on the Validation Kit .ISO
904# so that we can perform testing on older platforms which we don't support
905# on the host anymore.
906if1of ($(KBUILD_TARGET), darwin.amd64 linux win)
907 VBOX_WITH_VALIDATIONKIT_UNITTESTS_PACKING = 1
908endif
909# Set if we should ship the audio test from the Validation Kit with the host installer.
910VBOX_WITH_HOST_SHIPPING_AUDIO_TEST = 1
911# Set if we should ship the audio test from the Validation Kit with the guest additions.
912VBOX_WITH_ADDITIONS_SHIPPING_AUDIO_TEST = 1
913# Build the testcases.
914VBOX_WITH_TESTCASES = 1
915# Enable this to build vbox-img even if VBOX_WITH_TESTCASES is disabled
916VBOX_WITH_VBOX_IMG =
917# Enables recording support.
918VBOX_WITH_RECORDING = 1
919# Enable VPX (VP8 / VP9 codec), required for video capturing.
920VBOX_WITH_LIBVPX = 1
921# Enables audio support for recording (depends on VBOX_WITH_RECORDING).
922VBOX_WITH_AUDIO_RECORDING = 1
923if defined(VBOX_WITH_AUDIO_RECORDING) && !defined(VBOX_WITH_RECORDING)
924 $(error Audio recording (VBOX_WITH_AUDIO_RECORDING) needs the general recording feature (VBOX_WITH_RECORDING) enabled)
925endif
926# Enables libvorbis (Ogg Vorbis), required for encoding audio into the recorded data.
927VBOX_WITH_LIBVORBIS = 1
928# Enables libogg (Ogg file format). Required for building libvorbis above.
929VBOX_WITH_LIBOGG = 1
930# Currently OggVorbis is our only choice for audio recording support, so check for that.
931if defined(VBOX_WITH_AUDIO_RECORDING) && !defined(VBOX_WITH_LIBVORBIS)
932 $(error Need libvorbis (VBOX_WITH_LIBVORBIS) in order to enable audio recoding support)
933endif
934if defined(VBOX_WITH_LIBVORBIS) && !defined(VBOX_WITH_LIBOGG)
935 $(error Need libogg (VBOX_WITH_LIBOGG) in order to build libvorbis (VBOX_WITH_LIBVORBIS))
936endif
937# Enable Wayland support for Guest Additions
938VBOX_WITH_WAYLAND_ADDITIONS = 1
939# Enable shared folders
940VBOX_WITH_SHARED_FOLDERS = 1
941# Enable shared clipboard
942VBOX_WITH_SHARED_CLIPBOARD = 1
943# Enable shared clipboard (file) transfers
944if1of ($(KBUILD_TARGET), win linux)
945 VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS = 1
946 if1of ($(KBUILD_TARGET), linux)
947 VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP = 1
948 endif
949endif
950# Enable the host/guest information service (aka guest properties).
951VBOX_WITH_GUEST_PROPS = 1
952# Enable this to prevent the guest from writing guest properties.
953VBOX_WITH_GUEST_PROPS_RDONLY_GUEST =
954# Compile the host channel
955VBOX_WITH_HOST_CHANNEL = 1
956# Enable the guest control service.
957if1of ($(KBUILD_TARGET), darwin freebsd linux solaris win)
958 VBOX_WITH_GUEST_CONTROL = 1
959 # Enables support for handling certain commands via the built-in (busybox-like) toolbox in VBoxService. See @bugref{9783}
960 # This is for supporting Guest Additions < 7.1.
961 VBOX_WITH_GSTCTL_TOOLBOX_SUPPORT = 1
962 # Enables treating the toolbox as built-in commands. Requires 7.1 Guest Additions. See @bugref{9783}
963 VBOX_WITH_GSTCTL_TOOLBOX_AS_CMDS = 1
964 if !defined(VBOX_WITH_GSTCTL_TOOLBOX_SUPPORT) && !defined(VBOX_WITH_GSTCTL_TOOLBOX_AS_CMDS)
965 $(error Neither VBOX_WITH_GSTCTL_TOOLBOX_SUPPORT nor VBOX_WITH_GSTCTL_TOOLBOX_AS_CMDS specified, which will lead to broken Guest Control functionality!)
966 endif
967endif
968# Enable ballooning
969VBOX_WITH_MEMBALLOON = 1
970# Enable cURL (required for the network part of the GUI)
971VBOX_WITH_LIBCURL = 1
972# Enable libssh (required for cloud network attachment)
973if1of ($(KBUILD_TARGET), darwin linux win)
974 VBOX_WITH_LIBSSH = 1
975endif
976# Enable Host=>Guest Drag'n'Drop
977if1of ($(KBUILD_TARGET), darwin linux solaris win)
978 VBOX_WITH_DRAG_AND_DROP = 1
979 if1of ($(KBUILD_TARGET), darwin linux solaris win)
980 VBOX_WITH_DRAG_AND_DROP_GH = $(VBOX_WITH_DRAG_AND_DROP)
981 endif
982 ifdef VBOX_WITH_DRAG_AND_DROP_GH
983 ifeq ($(KBUILD_TARGET),darwin)
984 # On OS X (Darwin) this needs to be set in order to get proper
985 # guest->host support.
986 # Note: Setting this requires Qt also having this feature enabled!
987 VBOX_WITH_DRAG_AND_DROP_PROMISES = $(VBOX_WITH_DRAG_AND_DROP)
988 endif
989 endif
990endif
991# Enable audio support for VRDE.
992VBOX_WITH_AUDIO_VRDE = 1
993ifdef VBOX_WITH_VALIDATIONKIT
994 # Ship the Validation Kit audio driver for running tests (driver disabled by default).
995 VBOX_WITH_AUDIO_VALIDATIONKIT = 1
996endif
997# Use the VRDE external authentication library from VBoxSVC.
998if1of ($(KBUILD_TARGET), win)
999 VBOX_WITH_VRDEAUTH_IN_VBOXSVC = 1
1000endif
1001# Enables use of merge modules in the windows installer. This will increase
1002# the overall installer size significantly because merge modules are not able
1003# to use a common .cab file to reduce their size.
1004#VBOX_WITH_MSM_INSTALL = 1
1005# Enables full VM encryption support @bugref{9955}.
1006VBOX_WITH_FULL_VM_ENCRYPTION = 1
1007# Enables the 'sign' command in bldRTSignTool. We may need this on windows.
1008if1of ($(KBUILD_TARGET), win)
1009 VBOX_WITH_BLD_RTSIGNTOOL_SIGNING = 1
1010endif
1011# Enables support for liblzma inside of IPRT.
1012ifndef VBOX_ONLY_SDK
1013 VBOX_WITH_LIBLZMA = 1
1014endif
1015## @}
1016
1017
1018## @name Networking
1019## @{
1020# Use VBoxNetFlt for host interface networking.
1021if1of ($(KBUILD_TARGET), darwin freebsd linux solaris win)
1022 VBOX_WITH_NETFLT = 1
1023 ifeq ($(KBUILD_TARGET),solaris)
1024 # requires snv_159+.
1025 VBOX_WITH_NETFLT_CROSSBOW = 1
1026 endif
1027 # Use VBoxNetAdp for host only networking.
1028 if1of ($(KBUILD_TARGET), darwin freebsd linux solaris win)
1029 VBOX_WITH_NETADP = 1
1030 endif
1031endif
1032# Enables the UDP tunnel transport.
1033VBOX_WITH_UDPTUNNEL = 1
1034# Enable the netshaper support
1035VBOX_WITH_NETSHAPER = 1
1036# Enable Virtual Distributed Ethernet or not.
1037if1of ($(KBUILD_TARGET), freebsd linux)
1038 VBOX_WITH_VDE = 1
1039endif
1040# Use new VBoxNetDhcpd instead of old VBoxNetDHCP
1041VBOX_WITH_DHCPD = 1
1042# Experimental suport for cloud network integration (depends on libssh)
1043ifdef VBOX_WITH_LIBSSH
1044 VBOX_WITH_CLOUD_NET = 1
1045endif
1046# Use Mac OS X VMNET API instead of network kernel extensions
1047VBOX_WITH_VMNET = 1
1048## @}
1049
1050
1051## @name Extension pack
1052## @{
1053# Enables the extension pack feature.
1054VBOX_WITH_EXTPACK = 1
1055# Enables separating code into the Extension Pack, dubbed PUEL.
1056VBOX_WITH_EXTPACK_PUEL = 1
1057# Enables building+packing the Extension Pack, includes VBOX_WITH_EXTPACK_PUEL
1058VBOX_WITH_EXTPACK_PUEL_BUILD = 1
1059# Enable the BusMouse sample extension pack.
1060#VBOX_WITH_EXTPACK_BUSMOUSESAMPLE = 1
1061# Enable the VNC server extension pack (GPL only).
1062#VBOX_WITH_EXTPACK_VNC = 1
1063# Enables the VBoxDTrace extension pack.
1064VBOX_WITH_EXTPACK_VBOXDTRACE = 1
1065## @}
1066
1067## @name Misc
1068## @{
1069# Enables all the doxgen bits.
1070VBOX_WITH_ALL_DOXYGEN_TARGETS = 1
1071# Set this to skip installing the redistributable compiler runtime.
1072#VBOX_WITHOUT_COMPILER_REDIST = 1
1073# Enables VMMR0.r0 (++) loading using the native loader on solaris.
1074# Good for debugging and analysis. Experimental.
1075#VBOX_WITH_NATIVE_SOLARIS_LOADING = 1
1076# Set this to enable user mode dtrace probes.
1077if1of ($(KBUILD_TARGET), darwin linux solaris)
1078 if1of ($(KBUILD_TARGET_ARCH), x86 amd64) ## @todo bugref:9898
1079 VBOX_WITH_DTRACE_R3 := 1
1080 VBOX_WITH_DTRACE_R3_MAIN := 1
1081 endif
1082endif
1083# Set this to enable kernel driver dtrace probes.
1084if1of ($(KBUILD_TARGET), darwin solaris)
1085 if1of ($(KBUILD_TARGET_ARCH), x86 amd64) ## @todo bugref:9898
1086 VBOX_WITH_DTRACE_R0DRV := 1
1087 endif
1088endif
1089# Set this to enable dtrace probes in platform agnostic kernel code.
1090ifn1of ($(KBUILD_TARGET), os2)
1091 if1of ($(KBUILD_TARGET_ARCH), x86 amd64) ## @todo bugref:9898
1092 VBOX_WITH_DTRACE_R0 := 1
1093 endif
1094endif
1095# Set this to enable dtrace probes raw-mode context code.
1096if1of ($(KBUILD_TARGET), linux solaris)
1097 if1of ($(KBUILD_TARGET_ARCH), x86 amd64) ## @todo bugref:9898
1098 VBOX_WITH_DTRACE_RC := 1
1099 endif
1100endif
1101# Set this to enable support for dtrace probes in guest code.
1102#VBOX_WITH_DTRACE_GST = 1
1103# Set this to indicate that the host ships with DTrace.
1104if1of ($(KBUILD_TARGET), darwin solaris)
1105 if1of ($(KBUILD_TARGET_ARCH), x86 amd64) ## @todo bugref:9898
1106 VBOX_WITH_NATIVE_DTRACE := 1
1107 endif
1108endif
1109# Makes it possible to run some of the testcases and tools on older
1110# windows versions (only define when buildling win.x86).
1111#VBOX_WITH_MORE_NT4_COMPAT_BINARIES = 1
1112# Set this to enable building of the vboximg-mount FUSE mounting utility.
1113if1of ($(KBUILD_TARGET), darwin linux)
1114 VBOX_WITH_VBOXIMGMOUNT = 1
1115endif
1116# Set this to enable packaging the fuse related bits into our installer.
1117# Newer versions prohibit from distributing with commercial software @bugref{8515}
1118#if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.amd64)
1119# VBOX_WITH_FUSE_PACKING = 1
1120#endif
1121# Enables updating checking through Main.
1122# Only available if cURL is being used.
1123ifdef VBOX_WITH_LIBCURL
1124 VBOX_WITH_UPDATE_AGENT = 1
1125endif
1126## @}
1127
1128
1129## @name Compiler and linker config
1130## @{
1131# For treating compiler and linker warnings as errors where possible.
1132if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), \
1133 darwin.x86 darwin.amd64 darwin.arm64 linux.x86 linux.amd64 linux.arm64 win.x86 win.amd64 win.arm64)
1134 VBOX_WITH_WARNINGS_AS_ERRORS = 1
1135endif
1136# Whether we can use Open Watcom to build stuff.
1137if1of ($(KBUILD_TARGET), darwin linux os2 win)
1138 if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
1139 VBOX_WITH_OPEN_WATCOM := 1
1140 else if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.arm64)
1141 VBOX_WITH_OPEN_WATCOM := 1
1142 endif
1143endif
1144## @}
1145
1146
1147## @name Hardening
1148## @{
1149
1150# Enables hardening.
1151# Most developers will want to disable this in their LocalConfig.kmk (VBOX_WITHOUT_HARDENING := 1).
1152ifndef VBOX_WITH_DRIVERLESS_FORCED # No need for hardening when not using the driver.
1153 VBOX_WITH_HARDENING := 1
1154endif
1155# Enables minimal driver hardening (windows only).
1156if !defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITH_DRIVERLESS_FORCED)
1157 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.arm64)
1158 VBOX_WITH_MINIMAL_HARDENING := 1
1159 endif
1160endif
1161# Where the application files are (going to be) installed.
1162#VBOX_PATH_APP_PRIVATE = /usr/lib/virtualbox
1163ifdef VBOX_WITH_HARDENING
1164 if1of ($(KBUILD_TARGET), linux solaris)
1165 VBOX_PATH_APP_PRIVATE = /opt/VirtualBox
1166 else ifeq ($(KBUILD_TARGET),darwin)
1167 VBOX_PATH_APP_PRIVATE = /Applications/VirtualBox.app/Contents/MacOS
1168 else ifeq ($(KBUILD_TARGET),freebsd)
1169 VBOX_PATH_APP_PRIVATE = /usr/local/lib/virtualbox
1170 else ifeq ($(KBUILD_TARGET),haiku)
1171 VBOX_PATH_APP_PRIVATE = /boot/system/apps/VirtualBox
1172 endif
1173endif
1174# Where the architecture specific application files are (going to be) installed.
1175#VBOX_PATH_APP_PRIVATE_ARCH = /usr/lib/virtualbox
1176ifdef VBOX_WITH_HARDENING
1177 if1of ($(KBUILD_TARGET), solaris)
1178 VBOX_PATH_APP_PRIVATE_ARCH_TOP = $(VBOX_PATH_APP_PRIVATE)
1179 VBOX_PATH_APP_PRIVATE_ARCH = $(VBOX_PATH_APP_PRIVATE_ARCH_TOP)/$(if-expr $(KBUILD_TARGET_ARCH) == "amd64",amd64,i386)
1180 else ifdef VBOX_PATH_APP_PRIVATE
1181 VBOX_PATH_APP_PRIVATE_ARCH = $(VBOX_PATH_APP_PRIVATE)
1182 endif
1183endif
1184# Where the shared libraries are (going to be) installed.
1185#VBOX_PATH_SHARED_LIBS = /usr/lib
1186ifdef VBOX_WITH_HARDENING
1187 if1of ($(KBUILD_TARGET), solaris)
1188 VBOX_PATH_SHARED_LIBS = $(VBOX_PATH_APP_PRIVATE)/$(if-expr $(KBUILD_TARGET_ARCH) == "amd64",amd64,i386)
1189 else ifdef VBOX_PATH_APP_PRIVATE
1190 VBOX_PATH_SHARED_LIBS = $(VBOX_PATH_APP_PRIVATE)
1191 endif
1192endif
1193# Where the documentation is (going to be) installed.
1194#VBOX_PATH_APP_DOCS = /usr/share/doc/virtualbox
1195ifdef VBOX_WITH_HARDENING
1196 ifdef VBOX_PATH_APP_PRIVATE
1197 VBOX_PATH_APP_DOCS = $(VBOX_PATH_APP_PRIVATE)
1198 endif
1199endif
1200# The DT_RPATH/DT_RUNPATH to embed into the binaries (ELF).
1201# (This one is used for all binaries, there is no need to adjust this
1202# depending on the location of the object.)
1203#VBOX_WITH_RUNPATH = /usr/lib/virtualbox
1204ifdef VBOX_WITH_HARDENING
1205 if1of ($(KBUILD_TARGET), solaris)
1206 VBOX_WITH_RUNPATH = $(VBOX_PATH_APP_PRIVATE)/$(if-expr $(KBUILD_TARGET_ARCH) == "amd64",amd64,i386)
1207 else if1of ($(KBUILD_TARGET), freebsd linux)
1208 VBOX_WITH_RUNPATH = $(VBOX_PATH_APP_PRIVATE)
1209 endif
1210endif
1211# Enable use of the $ORIGIN DT_RPATH/DT_RUNPATH feature (ELF).
1212# Because of the setuid usage on all ELF platforms when hardening the build
1213# things gets a bit complicated since the $ORIGIN+setuid policy differs.
1214#VBOX_WITH_ORIGIN = 1
1215ifndef VBOX_WITH_HARDENING
1216 if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd solaris) # duplicated further down
1217 VBOX_WITH_ORIGIN = 1
1218 endif
1219endif
1220# Building windows without a kernel code signing certificate (as good as
1221# impossible to get these days, so enabled by default).
1222VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT = 1
1223# Enable the system wide support service/daemon.
1224# Very sketchy work in progress.
1225#VBOX_WITH_SUPSVC = 1
1226
1227# Continue to support Vista w/o any service pack, at least for now.
1228VBOX_WITH_VISTA_NO_SP = 1
1229ifdef VBOX_WITH_VBOXDRV
1230 # Enable image verification on darwin @bugref{9232}.
1231 VBOX_WITH_DARWIN_R0_DARWIN_IMAGE_VERIFICATION = 1
1232endif
1233## @}
1234
1235
1236# Strip binaries of release and profile builds before packing them into the installer
1237# archive. When building .deb/.rpms, don't strip the symbols as they are required for
1238# the debug packages containing symbols for gdb located in /usr/lib/debug.
1239# In rpm Additions we also need to do part of packing without strip.
1240ifndef VBOX_ONLY_RPM_ADDITIONS
1241 VBOX_DO_STRIP := $(if $(filter release profile,$(KBUILD_TYPE)),1,)
1242endif
1243
1244
1245#
1246# Config items for enabling work in progress.
1247#
1248# It's good pratice to add stuff here even if it is currently disabled by
1249# default.
1250#
1251# Note! Please, do *not* add stuff to the global DEFS unless it is *really*
1252# necessary! The other guys will hate for it you when they have to
1253# recompile everything when the feature is enabled or disabled. Put
1254# the ifdefs in target or template definitions.
1255#
1256
1257# Mask all Local APIC interrupt vectors which are set up to NMI mode when switching
1258# to/from the guest in raw mode. Modern Linux kernels use the performance counter
1259# to raise an NMI from time to time.
1260if1of ($(KBUILD_TARGET), linux)
1261 VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI = 1
1262endif
1263## For testing deadlock detection and lock order validation.
1264# If issues are found, create high priority defects and temporarily comment
1265# the next line.
1266VBOX_WITH_STRICT_LOCKS = 1
1267## VBoxSDS is the bridge windows service that sits between
1268# VirtualBox object client and VBoxSVC that fixes problem
1269# when multiple VBoxSVC starts for the same user
1270# it is enabled for windows build only
1271ifeq ($(KBUILD_TARGET),win)
1272 VBOX_WITH_SDS = 1
1273endif
1274
1275#
1276# To make it easier to build the host side VBox bits and not have to
1277# care about multiple page sizes right now.
1278#
1279ifdef VBOX_WITH_16K_PAGE_SIZE_ON_LINUX_ARM64
1280 VBOX_WITH_STATIC_ARM64_PAGE_SHIFT = 14
1281else
1282 ifdef VBOX_WITH_4K_PAGE_SIZE_ON_LINUX_ARM64
1283 VBOX_WITH_STATIC_ARM64_PAGE_SHIFT = 10
1284 else
1285 ifdef VBOX_WITH_64K_PAGE_SIZE_ON_LINUX_ARM64
1286 VBOX_WITH_STATIC_ARM64_PAGE_SHIFT = 16
1287 endif
1288 endif
1289endif
1290
1291#
1292# Branding
1293#
1294VBOX_BRAND_BIOS_LOGO := $(PATH_ROOT)/src/VBox/Devices/Graphics/BIOS/vbox_bios_splash_oracle.bmp
1295VBOX_BRAND_LICENSE_HTML := $(PATH_ROOT)/doc/License-gpl-3.0.html
1296VBOX_BRAND_LICENSE_RTF := $(PATH_ROOT)/doc/License-gpl-3.0.rtf
1297VBOX_BRAND_LICENSE_TXT := $(PATH_ROOT)/doc/License-gpl-3.0.txt
1298VBOX_BRAND_LICENSE_VER :=
1299VBOX_BRAND_GUI_ABOUT_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about.png
1300VBOX_BRAND_GUI_ABOUT_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_x2.png
1301VBOX_BRAND_GUI_ABOUT_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_x3.png
1302VBOX_BRAND_GUI_ABOUT_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_x4.png
1303VBOX_BRAND_GUI_ABOUT_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px.png
1304VBOX_BRAND_GUI_ABOUT_16PX_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px_x2.png
1305VBOX_BRAND_GUI_ABOUT_16PX_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px_x3.png
1306VBOX_BRAND_GUI_ABOUT_16PX_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px_x4.png
1307VBOX_BRAND_GUI_VBOX_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_16px.png
1308VBOX_BRAND_GUI_VBOX_20PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_20px.png
1309VBOX_BRAND_GUI_VBOX_32PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_32px.png
1310VBOX_BRAND_GUI_VBOX_40PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_40px.png
1311VBOX_BRAND_GUI_VBOX_48PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_48px.png
1312VBOX_BRAND_GUI_VBOX_64PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_64px.png
1313VBOX_BRAND_GUI_VBOX_SVG := $(PATH_ROOT)/src/VBox/Artwork/NonOSE/virtualbox.svg
1314VBOX_BRAND_WIN_INST_DLGJPG := $(PATH_ROOT)/src/VBox/Installer/win/Binary/Dialog.jpg
1315VBOX_BRAND_WIN_INST_EXT :=
1316VBOX_BRAND_WIN_ADD_INST_DLGBMP := $(PATH_ROOT)/src/VBox/Additions/WINNT/Installer/welcome.bmp
1317VBOX_BRAND_DARWIN_DISKIMAGE_DS_STORE := $(PATH_ROOT)/src/VBox/Installer/darwin/DiskImage/DS_Store
1318VBOX_BRAND_DARWIN_DISKIMAGE_BG := $(PATH_ROOT)/src/VBox/Installer/darwin/DiskImage/vbox_folder.tiff
1319VBOX_BRAND_DARWIN_INSTALLER_BG := $(PATH_ROOT)/src/VBox/Installer/darwin/VirtualBox_mpkg/background.tif
1320
1321#
1322# Skip stuff.
1323#
1324
1325ifdef VBOX_ONLY_EXTPACKS
1326 # Clear some VBOX_WITH_XXX variables instead of adding ifdefs all over the place.
1327 VBOX_WITH_DEBUGGER =
1328 VBOX_WITH_ADDITIONS =
1329 VBOX_WITH_VBOXDRV =
1330 VBOX_WITH_TESTCASES =
1331endif
1332
1333# VBOX_QUICK can be used by core developers to speed to the build
1334ifdef VBOX_QUICK
1335 # undefine variables by assigning blank.
1336 VBOX_WITH_ADDITIONS =
1337 VBOX_WITH_VALIDATIONKIT =
1338 VBOX_WITH_TESTCASES =
1339 VBOX_WITH_VBOXSDL =
1340 VBOX_WITH_HEADLESS =
1341 VBOX_WITH_VRDP =
1342 VBOX_WITH_VRDP_RDESKTOP =
1343 VBOX_WITH_DOCS =
1344 VBOX_WITH_WEBSERVICES =
1345 VBOX_WITH_32_ON_64_MAIN_API =
1346endif # VBOX_QUICK
1347
1348# Only AMD64 is supported for the main product, so disable most of the other bits.
1349ifn1of ($(KBUILD_TARGET_ARCH), $(VBOX_SUPPORTED_HOST_ARCHS))
1350 VBOX_WITH_MAIN =
1351 VBOX_WITH_QTGUI =
1352 VBOX_WITH_VBOXSDL =
1353 VBOX_WITH_VBOXHEADLESS =
1354 VBOX_WITH_WEBSERVICES =
1355 VBOX_WITH_DEBUGGER_GUI =
1356endif
1357
1358ifeq ($(KBUILD_TARGET),darwin)
1359 VBOX_WITH_VRDP_RDESKTOP =
1360 # Permanent (no working SDL).
1361 VBOX_WITH_VBOXSDL =
1362
1363 ifeq ($(KBUILD_TARGET_ARCH),arm64)
1364 # No Qt yet, so no GUI, NLS or qhelp.
1365 VBOX_WITH_NLS :=
1366 VBOX_WITH_MAIN_NLS :=
1367 VBOX_WITH_PUEL_NLS :=
1368 VBOX_WITH_VBOXMANAGE_NLS :=
1369 VBOX_WITH_DOCS_QHELP :=
1370 VBOX_WITH_DOCS_QHELP_PACKING :=
1371 # Skip webservices as those are tedious to build.
1372 VBOX_WITH_WEBSERVICES :=
1373 # Ditto for the java<->XPCOM bridge.
1374 VBOX_WITH_JXPCOM :=
1375 endif
1376endif
1377
1378ifeq ($(KBUILD_TARGET),freebsd)
1379 VBOX_WITH_DOCS =
1380endif
1381
1382ifeq ($(KBUILD_TARGET),haiku)
1383 VBOX_WITH_VRDP_RDESKTOP =
1384 # Permanent (no working SDL).
1385 VBOX_WITH_VBOXSDL =
1386 VBOX_WITH_DOCS =
1387 VBOX_WITH_VBOXDRV =
1388 VBOX_WITH_VRDP =
1389 VBOX_WITH_HEADLESS =
1390 VBOX_WITH_VBOXSDL =
1391 VBOX_WITH_QTGUI =
1392 # VBOX_WITH_MAIN=
1393 VBOX_WITH_DOCS =
1394 VBOX_WITH_ISCSI =
1395 VBOX_WITH_INIP =
1396 VBOX_WITH_INTERNAL_NETWORKING =
1397 VBOX_WITH_PDM_ASYNC_COMPLETION =
1398 VBOX_WITHOUT_HARDENING = 1
1399endif
1400
1401
1402ifeq ($(KBUILD_TARGET),os2)
1403 VBOX_WITH_WEBSERVICES =
1404 VBOX_WITH_INSTALLER =
1405 VBOX_WITH_VRDP_AUTHMOD =
1406 VBOX_WITH_VRDP_RDESKTOP =
1407 VBOX_WITH_VALIDATIONKIT =
1408 VBOX_WITH_QTGUI =
1409 VBOX_WITH_USB =
1410 VBOX_WITH_EHCI =
1411 VBOX_WITH_DOCS =
1412 VBOX_WITH_PDM_ASYNC_COMPLETION =
1413 VBOX_WITHOUT_HARDENING = 1
1414endif
1415
1416ifeq ($(KBUILD_TARGET),win)
1417 VBOX_WITH_VRDP_RDESKTOP =
1418endif
1419
1420ifn1of ($(KBUILD_TARGET_ARCH), x86 amd64 arm64)
1421 VBOX_WITH_ADDITION_DRIVERS =
1422 VBOX_WITH_DEBUGGER =
1423 VBOX_WITH_DOCS =
1424 VBOX_WITH_EHCI =
1425 VBOX_WITHOUT_HARDENING = 1
1426 VBOX_WITH_HEADLESS =
1427 VBOX_WITH_HGCM =
1428 VBOX_WITH_HGSMI =
1429 VBOX_WITH_INIP =
1430 VBOX_WITH_INSTALLER =
1431 VBOX_WITH_INTERNAL_NETWORKING =
1432 VBOX_WITH_ISCSI =
1433 VBOX_WITH_MAIN =
1434 VBOX_WITH_PDM_ASYNC_COMPLETION =
1435 VBOX_WITH_QTGUI =
1436 VBOX_WITH_RAW_MODE =
1437 VBOX_WITH_VALIDATIONKIT =
1438 VBOX_WITH_USB =
1439 VBOX_WITH_VBOXDRV =
1440 VBOX_WITH_VBOXSDL =
1441 VBOX_WITH_WEBSERVICES =
1442 VBOX_WITH_XPCOM =
1443 VBOX_WITHOUT_HARDENING = 1
1444 # remove later:
1445 VBOX_WITH_VRDP =
1446 VBOX_WITH_VRDP_AUTHMOD =
1447 VBOX_WITH_VRDP_RDESKTOP =
1448endif
1449
1450
1451#
1452# Include automatic and local config file to override the above settings
1453# and to provide defaults for the settings below this point.
1454#
1455ifndef AUTOCFG
1456 AUTOCFG := $(wildcard $(PATH_ROOT)/AutoConfig.kmk)
1457endif
1458ifneq ($(AUTOCFG),)
1459 include $(AUTOCFG)
1460endif
1461
1462ifndef LOCALCFG
1463 LOCALCFG := $(wildcard $(PATH_ROOT)/LocalConfig.kmk)
1464 ifneq ($(LOCALCFG),)
1465 include $(LOCALCFG)
1466 endif
1467else
1468 # Ignore it if it doesn't exist.
1469 if exists "$(LOCALCFG)"
1470 include $(LOCALCFG)
1471 else
1472 $(warning LOCALCFG='$(LOCALCFG)' does not exist)
1473 override LOCALCFG :=
1474 endif
1475endif
1476
1477
1478#
1479# Configure 'parfait' and 'parfait-dbg' builds.
1480#
1481# We ASSUME that anyone doing this kind of build has the parfait tools
1482# package already fetched using:
1483# kmk VBOX_WITH_PARFAIT=1 -C tools fetch
1484#
1485if1of ($(KBUILD_TYPE), parfait parfait-dbg)
1486 VBOX_WITH_PARFAIT := 1
1487 VBOX_WITHOUT_PRECOMPILED_HEADERS := 1 # @todo Remove when working everywhere
1488endif
1489
1490
1491if defined(VBOX_WITH_PARFAIT)
1492 #
1493 # This includes the tool overrides for running with parfait.
1494 # Ideally there would be a dedicated parfait tool but when targetting
1495 # different hosts with different compiler toolchains and compiler flags
1496 # we would have to duplicate a lot of the already existing tools for each
1497 # supported toolchain. Instead we just override the paths to the compilers
1498 # for the currently used tools (as this is kind of static and doesn't change that often).
1499 # To not clutter this file too much this lives in a separate file.
1500 #
1501 include $(PATH_ROOT)/tools/ParfaitConfig.kmk
1502endif
1503
1504
1505#
1506# Allow to overwrite the branding information from an external file
1507#
1508ifdef VBOX_BRANDING_CFG
1509 include $(VBOX_BRANDING_CFG)
1510endif
1511
1512#
1513# Bitch about old settings.
1514#
1515ifdef VBOX_WITHOUT_LINUX_COMPILER_H
1516 $(warning VBOX_WITHOUT_LINUX_COMPILER_H was renamed to VBOX_WITH_LINUX_COMPILER_H, the meaning is inverted.)
1517endif
1518
1519#
1520# Indicate VBOX_ONLY build if any of the VBOX_ONLY_* variables are set.
1521#
1522VBOX_ONLY_BUILD_NEW := $(strip $(foreach x, ADDITIONS DOCS EXTPACKS SDK VALIDATIONKIT \
1523 , $(if-expr defined(VBOX_ONLY_$(x)),VBOX_ONLY_$(x))))
1524ifneq ($(VBOX_ONLY_BUILD),$(VBOX_ONLY_BUILD_NEW))
1525 $(error VBox: LocalConfig.kmk changed the VBOX_ONLY_ build status, VBOX_ONLY_* must be on the kmk command line or in the environment: $(VBOX_ONLY_BUILD) -> $(VBOX_ONLY_BUILD_NEW))
1526endif
1527
1528#
1529# Enforce VBOX_WITH_NLS. It controls all NLS (except the GUI at the moment).
1530#
1531if defined(VBOX_WITH_MAIN_NLS) || defined(VBOX_WITH_PUEL_NLS) || defined(VBOX_WITH_VBOXMANAGE_NLS)
1532 VBOX_WITH_NLS := 1
1533 ifndef VBOX_WITH_NLS # (We test again to account for 'override VBOX_WITH_NLS :=')
1534 VBOX_WITH_MAIN_NLS :=
1535 VBOX_WITH_PUEL_NLS :=
1536 VBOX_WITH_VBOXMANAGE_NLS :=
1537 endif
1538endif
1539
1540#
1541# For the docs build box.
1542#
1543ifdef VBOX_ONLY_DOCS
1544 # Always produce HTML docs (for publishing on website as part of release)
1545 VBOX_WITH_DOCS_HTML = 1
1546 # Always produce QHelp docs (for help in the UI, replacing CHM)
1547 VBOX_WITH_DOCS_QHELP = 1
1548 VBOX_WITH_TOOLS_QT_LINUX = 1
1549endif
1550
1551#
1552# Disable components that are not open sourced.
1553#
1554ifdef VBOX_OSE
1555 VBOX_WITH_VRDP =
1556 VBOX_WITH_USB_VIDEO_IMPL =
1557 VBOX_WITH_NVME_IMPL =
1558 VBOX_WITH_EXTPACK_PUEL =
1559 VBOX_WITH_EXTPACK_PUEL_BUILD =
1560 VBOX_WITH_PCI_PASSTHROUGH_IMPL =
1561 VBOX_WITH_OS2_ADDITIONS_BIN =
1562 VBOX_WITH_LIBSSH =
1563 # not yet
1564 VBOX_WITH_PLUGIN_CRYPT =
1565 VBOX_WITH_DRAG_AND_DROP_PROMISES =
1566 ifn1of ($(KBUILD_TARGET), linux)
1567 VBOX_WITH_DOCS =
1568 VBOX_WITH_DOCS_PACKING =
1569 endif
1570 if1of ($(KBUILD_TARGET), solaris)
1571 VBOX_WITH_32_ON_64_MAIN_API =
1572 endif
1573 if1of ($(KBUILD_TARGET), win)
1574 # tar/gzip uncommon on Windows
1575 VBOX_WITH_EXTPACK_VBOXDTRACE =
1576 endif
1577 # Enable any translations in OSE, even partial ones.
1578 ifndef ($(VBOX_NO_DOCS_TRANSLATIONS))
1579 VBOX_WITH_DOCS_TRANSLATIONS = 1
1580 endif
1581 VBOX_WITH_INTEL_PXE =
1582 # Disable for OSE, requires snv_159+.
1583 VBOX_WITH_NETFLT_CROSSBOW =
1584 ifn1of ($(KBUILD_TARGET), darwin linux solaris win)
1585 VBOX_WITH_INSTALLER =
1586 endif
1587 if1of ($(KBUILD_TARGET), win)
1588 # Undefine codec libraries which are not needed.
1589 VBOX_WITH_LIBVPX =
1590 VBOX_WITH_LIBVORBIS =
1591 VBOX_WITH_LIBOGG =
1592 # Disable recording (with audio support).
1593 VBOX_WITH_RECORDING =
1594 VBOX_WITH_AUDIO_RECORDING =
1595 endif
1596 # branding
1597 VBOX_BRAND_LICENSE_HTML := $(PATH_ROOT)/doc/License-gpl-3.0.html
1598 VBOX_BRAND_LICENSE_RTF := $(PATH_ROOT)/doc/License-gpl-3.0.rtf
1599 VBOX_BRAND_LICENSE_TXT := $(PATH_ROOT)/doc/License-gpl-3.0.txt
1600 VBOX_BRAND_LICENSE_VER :=
1601 VBOX_BRAND_BIOS_LOGO := $(PATH_ROOT)/src/VBox/Devices/Graphics/BIOS/vbox_bios_splash.bmp
1602 VBOX_BRAND_GUI_ABOUT_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about.png
1603 VBOX_BRAND_GUI_ABOUT_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_x2.png
1604 VBOX_BRAND_GUI_ABOUT_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_x3.png
1605 VBOX_BRAND_GUI_ABOUT_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_x4.png
1606 VBOX_BRAND_GUI_ABOUT_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px.png
1607 VBOX_BRAND_GUI_ABOUT_16PX_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px_x2.png
1608 VBOX_BRAND_GUI_ABOUT_16PX_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px_x3.png
1609 VBOX_BRAND_GUI_ABOUT_16PX_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px_x4.png
1610 VBOX_BRAND_GUI_VBOX_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_16px.png
1611 VBOX_BRAND_GUI_VBOX_20PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_20px.png
1612 VBOX_BRAND_GUI_VBOX_32PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_32px.png
1613 VBOX_BRAND_GUI_VBOX_40PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_40px.png
1614 VBOX_BRAND_GUI_VBOX_48PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_48px.png
1615 VBOX_BRAND_GUI_VBOX_64PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_64px.png
1616 VBOX_BRAND_GUI_VBOX_SVG := $(PATH_ROOT)/src/VBox/Artwork/OSE/virtualbox.svg
1617endif
1618
1619#
1620# VBOX_WITHOUT_HARDENING is for developers (put in LocalConfig.kmk).
1621# Note that this is a bit rough since hardening governs more than one
1622# variable... Also note that we allow VBOX_WITH_HARDENING=1 on the
1623# command line to overrule VBOX_WITHOUT_HARDENING (the check below).
1624#
1625ifdef VBOX_WITHOUT_HARDENING
1626 VBOX_WITH_HARDENING =
1627 ifeq ($(VBOX_WITH_HARDENING),)
1628 VBOX_PATH_APP_PRIVATE =
1629 VBOX_PATH_APP_PRIVATE_ARCH =
1630 VBOX_PATH_APP_PRIVATE_ARCH_TOP =
1631 VBOX_PATH_SHARED_LIBS =
1632 VBOX_PATH_APP_DOCS =
1633 VBOX_WITH_RUNPATH =
1634 if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd solaris) # duplicated up above
1635 VBOX_WITH_ORIGIN = 1
1636 endif
1637 endif
1638endif
1639
1640#
1641# Sanitize the additions build config variables.
1642#
1643ifdef VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER
1644 VBOX_WITHOUT_ADDITIONS := 1
1645 ifdef VBOX_ONLY_ADDITIONS
1646 $(error VBOX_ONLY_ADDITIONS + VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER does not add up!)
1647 endif
1648endif
1649
1650ifdef VBOX_ONLY_ADDITIONS
1651 ifdef VBOX_WITHOUT_ADDITIONS
1652 $(error VBOX_ONLY_ADDITIONS + VBOX_WITHOUT_ADDITIONS does not add up!)
1653 endif
1654 ifndef VBOX_WITH_ADDITIONS
1655 $(error VBOX_ONLY_ADDITIONS + unset VBOX_WITH_ADDITIONS does not add up!)
1656 endif
1657endif
1658
1659ifdef VBOX_WITHOUT_ADDITIONS
1660 # Zap anything that could be contradicting this.
1661 VBOX_WITH_ADDITIONS :=
1662endif
1663
1664#
1665# Sanitize the documentation build config variables.
1666#
1667ifdef VBOX_WITH_DOCS_FROM_BUILD_SERVER
1668 VBOX_WITHOUT_DOCS := 1
1669 ifdef VBOX_ONLY_DOCS
1670 $(error VBOX_ONLY_DOCS + VBOX_WITH_DOCS_FROM_BUILD_SERVER does not add up!)
1671 endif
1672else ifeq ($(KBUILD_HOST),solaris)
1673 # We require JDK 17 for the user manual now, and since that isn't available for solaris
1674 # (see JEP-381) we're forced to get the docs from the doc build server or disable them.
1675 VBOX_WITHOUT_DOCS := 1
1676endif
1677
1678ifdef VBOX_ONLY_DOCS
1679 ifdef VBOX_WITHOUT_DOCS
1680 $(error VBOX_ONLY_DOCS + VBOX_WITHOUT_DOCS does not add up!)
1681 endif
1682endif
1683
1684ifdef VBOX_WITHOUT_DOCS
1685 # Zap anything that could be contradicting this.
1686 VBOX_WITH_DOCS :=
1687 VBOX_WITH_DOCS_QHELP :=
1688 VBOX_WITH_DOCS_HTML :=
1689endif
1690
1691#
1692# Disable components for headless
1693#
1694ifdef VBOX_HEADLESS
1695 VBOX_WITH_QTGUI =
1696 VBOX_WITH_VBOXSDL =
1697 VBOX_WITH_VRDP_RDESKTOP =
1698endif
1699
1700#
1701# Undefined VBOX_WITH_MAIN implies exclusion of a few more items.
1702#
1703ifndef VBOX_WITH_MAIN
1704 VBOX_WITH_VBOXSDL =
1705 VBOX_WITH_QTGUI =
1706 VBOX_WITH_DEBUGGER_GUI =
1707 VBOX_WITH_HEADLESS =
1708 ifdef VBOX_ONLY_DOCS
1709 $(error Oh, does VBOX_ONLY_DOCS actually end up here. sweet.)
1710 endif
1711 VBOX_WITH_DOCS =
1712endif
1713
1714ifdef VBOX_WITH_EXTPACK_PUEL_BUILD
1715 VBOX_WITH_EXTPACK_PUEL = 1
1716endif
1717
1718ifdef VBOX_WITH_TESTSUITE
1719 $(warning VBOX_WITH_TESTSUITE was renamed to VBOX_WITH_VALIDATIONKIT)
1720 VBOX_WITH_VALIDATIONKIT = $(VBOX_WITH_TESTSUITE)
1721endif
1722
1723
1724#
1725# Derived indicators.
1726#
1727
1728#
1729# Mark OSE builds clearly, helps figuring out limitations more easily.
1730#
1731ifdef VBOX_OSE
1732 # This can be overridden (e.g. in LocalConfig.kmk) by whoever publishes a set
1733 # of VirtualBox binaries. We request though that you always use something that
1734 # clearly identifies your build and makes it clear that it is not one done by
1735 # the VirtualBox team.
1736 VBOX_BUILD_PUBLISHER ?= _OSE
1737endif
1738
1739# Keep in sync with G_virtualBoxPackage in glue-jaxws.xsl and glue-java.xsl
1740# Changed with every new version, so beware!
1741if $(VBOX_VERSION_BUILD) < 51
1742 VBOX_API_VERSION = $(VBOX_VERSION_MAJOR)_$(VBOX_VERSION_MINOR)
1743else
1744 VBOX_API_VERSION = $(VBOX_VERSION_MAJOR)_$(expr $(VBOX_VERSION_MINOR) + 1)
1745endif
1746VBOX_API_SUFFIX = _$(VBOX_API_VERSION)
1747VBOX_JAVA_PACKAGE = org.virtualbox$(VBOX_API_SUFFIX)
1748
1749#
1750# Derived / helper config indicators. Not configurable.
1751#
1752
1753# Use the OpenGL module in qt when the video hardware acceleration feature
1754# is enabled.
1755if defined(VBOX_WITH_VIDEOHWACCEL) && defined(VBOX_WITH_QTGUI)
1756 VBOX_GUI_USE_QGL = 1
1757else
1758 VBOX_GUI_USE_QGL =
1759endif
1760
1761# Collection macro mainly for deciding whether VBoxDTrace needs shipping.
1762VBOX_WITH_DTRACE := $(if-expr defined(VBOX_WITH_DTRACE_R0) || defined(VBOX_WITH_DTRACE_R0DRV) \
1763 || defined(VBOX_WITH_DTRACE_R3) || defined(VBOX_WITH_DTRACE_RC),1,)
1764
1765# kSubmit / kWorker is only available on windows.
1766ifdef VBOX_USE_KSUBMIT
1767 ifeq ($(KBUILD_HOST),win)
1768 TOOL_VCC142AMD64_USE_KSUBMIT := 1
1769 TOOL_VCC142X86_USE_KSUBMIT := 1
1770 # TOOL_VCC120AMD64_USE_KSUBMIT := 1
1771 # TOOL_VCC120X86_USE_KSUBMIT := 1
1772 TOOL_VCC100AMD64_USE_KSUBMIT := 1
1773 TOOL_VCC100X86_USE_KSUBMIT := 1
1774 TOOL_QT5_USE_KSUBMIT := 1
1775 TOOL_OPENWATCOM_USE_KSUBMIT := 1
1776 TOOL_YASM_USE_KSUBMIT := 1
1777 TOOL_NASM_USE_KSUBMIT := 1
1778 TOOL_VBoxNasm_USE_KSUBMIT := 1
1779 else
1780 VBOX_USE_KSUBMIT :=
1781 endif
1782endif
1783
1784#
1785# Requested permissions to the host OS (only the entitlements
1786# crap on darwin for now).
1787#
1788ifeq ($(KBUILD_TARGET),darwin)
1789 #
1790 # Common entitlements for the main and VM process bundle.
1791 #
1792 # The following two are required in the main bundle even though they apply only to the VM
1793 # process. The issue is that TCC is looking up the primary bundle for these entitlements
1794 # and crashes the VM process if the entitlements are not here even though they are used
1795 # in the VM process only. This is not documented anywhere by Apple.
1796 # From Console.app when these are missing:
1797 # tccd: [com.apple.TCC:access] Prompting policy for hardened runtime; service:
1798 # kTCCServiceMicrophone requires entitlement com.apple.security.device.audio-input but it is missing for
1799 # RESP:{
1800 # ID: org.virtualbox.app.VirtualBox,
1801 # PID[17253],
1802 # auid: 501,
1803 # euid: 501,
1804 # responsible path: '/Applications/VirtualBox.app/Contents/MacOS/VirtualBox',
1805 # binary path: '/Applications/VirtualBox.app/Contents/MacOS/VirtualBox'
1806 # },
1807 # REQ:{
1808 # ID: org.virtualbox.app.VirtualBoxVM,
1809 # PID[17331],
1810 # auid: 501,
1811 # euid: 501,
1812 # binary path: '/Applications/VirtualBox.app/Contents/Resources/VirtualBoxVM.app/Contents/MacOS/VirtualBoxVM'
1813 # }
1814 VBOX_DARWIN_ENTITLEMENTS_LIST_COMMON := \
1815 com.apple.security.device.audio-input \
1816 com.apple.security.device.camera
1817
1818 #
1819 # The first two entitlements are required to get everything working
1820 # on Catalina which we want to keep supported for now:
1821 #
1822 # The first entitlement allows us to have unsigned executable memory in the guests
1823 # address space like the BIOS code (and essentially all the guests address space which
1824 # is mapped as RWX).
1825 # The second entitlement is required in order to map guest memory as RWX into the
1826 # guests address space.
1827 # These entitlements are not required starting with BigSur+ where Apple has clearly
1828 # changed something in their entitlement scheme without properly documenting it.
1829 #
1830 # allow-jit - for the recompiler in order to be able to generate and execute native code.
1831 # audio-input - recording audio from a guest.
1832 # camera - accessing the webcam from a guest.
1833 # usb - USB passthrough.
1834 # hypervisor - Hypervisor entitlement in order to be able to use Hypervisor.framework
1835 #
1836 VBOX_DARWIN_ENTITLEMENTS_LIST_VM := \
1837 $(VBOX_DARWIN_ENTITLEMENTS_LIST_COMMON) \
1838 com.apple.security.cs.allow-unsigned-executable-memory \
1839 com.apple.security.cs.disable-executable-page-protection \
1840 com.apple.security.cs.allow-jit \
1841 com.apple.security.device.usb \
1842 com.apple.security.hypervisor
1843
1844 #
1845 # The device-access and networking entitlements are reserved for
1846 # only specific vendors and are only available in release mode signing
1847 # (binaries signed with these entitlements in adhoc mode will just crash
1848 # with a code signing error).
1849 #
1850 ifeq ($(VBOX_SIGNING_MODE),release)
1851 VBOX_DARWIN_ENTITLEMENTS_LIST_VM += \
1852 com.apple.vm.device-access \
1853 com.apple.vm.networking
1854 endif
1855
1856 # Where the dynamic generated entitlements can be found.
1857 VBOX_DARWIN_ENTITLEMENTS_FILE := $(PATH_OUT)/Entitlements.plist
1858 VBOX_DARWIN_ENTITLEMENTS_FILE_VM := $(PATH_OUT)/EntitlementsVM.plist
1859endif
1860
1861
1862#
1863# List of OSes and architectures we may possibly try build on/for.
1864# This is used for the complicated assembler setup among other things.
1865#
1866VBOX_TARGET_OSES := freebsd darwin haiku linux netbsd openbsd solaris darwin os2 win
1867VBOX_TARGET_ARCHES := amd64 x86 arm64 sparc32 sparc64
1868
1869#
1870# VBOX_GCC_TOOL is the kBuild tool name for gcc or clang.
1871# VBOX_GCC32_TOOL is the same for 32-bit x86 code.
1872#
1873# Note! On Windows only the arm64 variant makes use of it.
1874#
1875ifndef VBOX_GCC_TOOL
1876 ifeq ($(KBUILD_TARGET),win)
1877 ifeq ($(KBUILD_TARGET_ARCH),arm64)
1878 VBOX_GCC_TOOL := VCC143-CLANGXX
1879 endif
1880 else ifeq ($(KBUILD_TARGET),os2)
1881 VBOX_GCC_TOOL := GXX3OMF
1882 else ifeq ($(KBUILD_TARGET),darwin)
1883 ifdef VBOX_WITH_EVEN_NEWER_XCODE
1884 VBOX_GCC_TOOL := CLANGXXMACHO
1885 DARWINCMN_TOOLCHAIN_DIRS_IGNORE_DEVTOOLS = 1# Use the system toolchains, not anything from tools/darwin.*.
1886 else ifdef VBOX_WITH_NEW_XCODE
1887 VBOX_GCC_TOOL := VBoxXcode62
1888 else
1889 VBOX_GCC_TOOL := GXX4MACHO
1890 endif
1891 else ifeq ($(KBUILD_TARGET),haiku)
1892 # Haiku shouldn't pass '-r' to the linker by default
1893 VBOX_GCC_TOOL := GXX3PLAIN
1894 else ifeq ($(KBUILD_TARGET),solaris)
1895 VBOX_GCC_TOOL := GXX3PLAIN
1896 VBOX_GCC32_TOOL := GCC3PLAIN
1897 ifeq ($(KBUILD_HOST),solaris)
1898 TOOL_GXX3PLAIN_LD_SYSMOD ?= /usr/ccs/bin/ld
1899 endif
1900 else
1901 VBOX_GCC_TOOL := GXX3
1902 ifeq ($(KBUILD_TARGET_ARCH).$(KBUILD_HOST_ARCH),x86.amd64) ## @todo mixing target/host here!
1903 VBOX_GCC_TOOL := GXX32
1904 VBOX_WITH_VBOXDRV =
1905 else ifeq ($(KBUILD_TARGET_ARCH).$(KBUILD_HOST_ARCH),amd64.x86)
1906 VBOX_GCC_TOOL := GXX64
1907 VBOX_WITH_VBOXDRV =
1908 endif
1909 endif
1910endif
1911
1912if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
1913 ifn1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.x86 win.amd64)
1914 ifndef VBOX_GCC32_TOOL
1915 ifeq ($(KBUILD_TARGET_ARCH),x86)
1916 VBOX_GCC32_TOOL := $(VBOX_GCC_TOOL)
1917 else
1918 VBOX_GCC32_TOOL := GCC32
1919 endif
1920 endif
1921 endif
1922endif
1923
1924#
1925# Decide which Visual C++ compiler version we're using by default.
1926#
1927ifndef VBOX_VCC_TOOL_STEM
1928 ifdef VBOX_WITH_NEW_VCC
1929 VBOX_VCC_TOOL_STEM := VCC143
1930 else
1931 VBOX_VCC_TOOL_STEM := VCC142
1932 endif
1933else ifn1of ($(VBOX_VCC_TOOL_STEM), VCC100 VCC110 VCC120 VCC140 VCC141 VCC142 VCC143)
1934 $(error VBox: VBOX_VCC_TOOL_STEM='$(VBOX_VCC_TOOL_STEM)' is not supported, only VCC100, VCC110, VCC120, VCC140, VCC141, VCC142, VCC143 are)
1935endif
1936ifndef VBOX_VCC_TOOL
1937 VBOX_VCC_TOOL := $(VBOX_VCC_TOOL_STEM)$(toupper $(KBUILD_TARGET_ARCH))
1938endif
1939
1940#
1941# Decide which Visual C++ compiler version we're using for newer stuff.
1942#
1943ifndef VBOX_NEWER_VCC_TOOL_STEM
1944 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
1945 VBOX_NEWER_VCC_TOOL_STEM := $(VBOX_VCC_TOOL_STEM)
1946 else
1947 VBOX_NEWER_VCC_TOOL_STEM := VCC120
1948 endif
1949else ifn1of ($(VBOX_NEWER_VCC_TOOL_STEM), VCC120 VCC140 VCC141 VCC142 VCC143)
1950 $(error VBox: VBOX_NEWER_VCC_TOOL_STEM='$(VBOX_NEWER_VCC_TOOL_STEM)' is not supported)
1951endif
1952ifndef VBOX_NEWER_VCC_TOOL
1953 VBOX_NEWER_VCC_TOOL := $(VBOX_NEWER_VCC_TOOL_STEM)$(toupper $(KBUILD_TARGET_ARCH))
1954endif
1955
1956# Temporary measure while kBuild / tools updates their define quoting.
1957ifdef KMK_WITH_QUOTING
1958 if ("$(VBOX_VCC_TOOL_STEM)" >= "VCC140" && "$(KBUILD_TARGET)" == "win") \
1959 || ("$(KBUILD_TARGET)" != "darwin" && "$(KBUILD_TARGET)" != "win" && "$(KMK_REVISION)" >= 3566) \
1960 || ("$(KBUILD_TARGET)" == "darwin" && "$(KMK_REVISION)" >= 3579)
1961 VBOX_WITH_AUTOMATIC_DEFS_QUOTING := 1
1962 endif
1963endif
1964
1965
1966#
1967# Image and object format config.
1968#
1969VBOX_LDR_FMT.freebsd := elf
1970VBOX_LDR_FMT.haiku := elf
1971VBOX_LDR_FMT.linux := elf
1972VBOX_LDR_FMT.netbsd := elf
1973VBOX_LDR_FMT.openbsd := elf
1974VBOX_LDR_FMT.solaris := elf
1975VBOX_LDR_FMT.darwin := macho
1976VBOX_LDR_FMT.os2 := lx
1977VBOX_LDR_FMT.win := pe
1978# Spread the above OS-level defaults to os+architecture specifics:
1979$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES)\
1980,$(eval VBOX_LDR_FMT.$(os).$(arch) := $(VBOX_LDR_FMT.$(os)))))
1981# os.arch overrides:
1982VBOX_LDR_FMT.os2.amd64 := elf
1983# The build target format.
1984VBOX_LDR_FMT := $(firstword $(VBOX_LDR_FMT.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(VBOX_LDR_FMT.$(KBUILD_TARGET)))
1985# Legacy:
1986VBOX_LDR_FMT32 := $(firstword $(VBOX_LDR_FMT.$(KBUILD_TARGET).x86) $(VBOX_LDR_FMT))
1987VBOX_LDR_FMT64 := $(firstword $(VBOX_LDR_FMT.$(KBUILD_TARGET).amd64) $(VBOX_LDR_FMT))
1988if1of (os2, $(KBUILD_TARGET) $(KBUILD_HOST)) # This isn't too helpful
1989 DONT_USE_YASM = 1 # yasm doesn't implement omf yet.
1990endif
1991
1992#
1993# Assembler setup.
1994#
1995# This is a bit complicated since we have to support two different assmblers
1996# (yasm/nasm) and possibly two different formats (32-bit/64-bit).
1997#
1998
1999# First the assembler tool.
2000VBOX_ASTOOL.x86 := $(if-expr defined(DONT_USE_YASM),NASM,YASM)
2001VBOX_ASTOOL.amd64 := $(if-expr defined(DONT_USE_YASM),NASM,YASM)
2002VBOX_ASTOOL.arm64 := $(VBOX_GCC_TOOL)
2003VBOX_ASTOOL.sparc32 := $(VBOX_GCC_TOOL)
2004VBOX_ASTOOL.sparc64 := $(VBOX_GCC_TOOL)
2005# Spread the above OS-level defaults to os+architecture specifics:
2006$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES)\
2007,$(eval VBOX_ASTOOL.$(os).$(arch) := $(VBOX_ASTOOL.$(arch)))))
2008# os.arch overrides:
2009VBOX_ASTOOL.os2.x86 := NASM
2010
2011# Assembler tool flag config.
2012VBOX_YASM_ASFLAGS.elf.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f elf32 -DASM_FORMAT_ELF -g dwarf2
2013VBOX_YASM_ASFLAGS.elf.amd64 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f elf64 -DASM_FORMAT_ELF -g dwarf2
2014VBOX_YASM_ASFLAGS.macho.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f macho32 -DASM_FORMAT_MACHO #-g dwarf2
2015VBOX_YASM_ASFLAGS.macho.amd64 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f macho64 -DASM_FORMAT_MACHO #-g dwarf2
2016VBOX_YASM_ASFLAGS.pe.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f win32 -DASM_FORMAT_PE -g cv8
2017VBOX_YASM_ASFLAGS.pe.amd64 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f win64 -DASM_FORMAT_PE -g cv8
2018VBOX_YASM_ASFLAGS.lx.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f obj -DASM_FORMAT_OMF -g stabs
2019$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2020,$(eval VBOX_YASM_ASFLAGS.$(os).$(arch) = $$(VBOX_YASM_ASFLAGS.$(VBOX_LDR_FMT.$(os).$(arch)).$(arch)))))
2021
2022VBOX_NASM_ASFLAGS.elf.x86 := -D__NASM__ -w+orphan-labels -f elf32 -DASM_FORMAT_ELF -F dwarf
2023VBOX_NASM_ASFLAGS.elf.amd64 := -D__NASM__ -w+orphan-labels -f elf64 -DASM_FORMAT_ELF -F dwarf
2024VBOX_NASM_ASFLAGS.macho.x86 := -D__NASM__ -w+orphan-labels -f macho32 -DASM_FORMAT_MACHO -F dwarf
2025VBOX_NASM_ASFLAGS.macho.amd64 := -D__NASM__ -w+orphan-labels -f macho64 -DASM_FORMAT_MACHO -F dwarf
2026VBOX_NASM_ASFLAGS.pe.x86 := -D__NASM__ -w+orphan-labels -f win32 -DASM_FORMAT_PE -F cv8
2027VBOX_NASM_ASFLAGS.pe.amd64 := -D__NASM__ -w+orphan-labels -f win64 -DASM_FORMAT_PE -F cv8
2028VBOX_NASM_ASFLAGS.lx.x86 := -D__NASM__ -w+orphan-labels -f obj -DASM_FORMAT_OMF -F borland
2029$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2030,$(eval VBOX_NASM_ASFLAGS.$(os).$(arch) = $$(VBOX_NASM_ASFLAGS.$(VBOX_LDR_FMT.$(os).$(arch)).$(arch)))))
2031
2032ifdef VBOX_GCC_TOOL
2033 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.x86 := -DASM_FORMAT_ELF -m32
2034 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.amd64 := -DASM_FORMAT_ELF -m64
2035 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.arm64 := -DASM_FORMAT_ELF
2036 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.sparc32 := -DASM_FORMAT_ELF -m32
2037 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.sparc64 := -DASM_FORMAT_ELF -m64
2038 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.macho.x86 := -DASM_FORMAT_MACHO -m32
2039 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.macho.amd64 := -DASM_FORMAT_MACHO -m64
2040 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.macho.arm64 := -DASM_FORMAT_MACHO
2041 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.pe.x86 := -DASM_FORMAT_PE
2042 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.pe.amd64 := -DASM_FORMAT_PE
2043 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.pe.arm64 := -DASM_FORMAT_PE
2044 $(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2045 ,$(eval VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.$(os).$(arch) = $$(VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.$(VBOX_LDR_FMT.$(os).$(arch)).$(arch)))))
2046endif
2047
2048# Combine the above ASFLAGS with the ASTOOL for each os+arch variation.
2049$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2050,$(eval VBOX_ASFLAGS.$(os).$(arch) = $$(VBOX_$(VBOX_ASTOOL.$(os).$(arch))_ASFLAGS.$(os).$(arch)))))
2051
2052# Default target:
2053VBOX_ASTOOL = $(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
2054VBOX_ASFLAGS = $(VBOX_$(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))_ASFLAGS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
2055
2056# Legacy targets:
2057VBOX_ASTOOL32 = $(VBOX_ASTOOL.$(KBUILD_TARGET).x86)
2058VBOX_ASFLAGS32 = $(VBOX_$(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))_ASFLAGS.$(KBUILD_TARGET).x86)
2059VBOX_ASFLAGS64 = $(VBOX_$(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))_ASFLAGS.$(KBUILD_TARGET).amd64)
2060
2061
2062#
2063# Default tool nonsense.
2064#
2065## @todo Remove the default tool crap here!
2066TOOL = $(VBOX_GCC_TOOL)
2067TOOL.win.x86 = $(VBOX_VCC_TOOL_STEM)X86
2068TOOL.win.amd64 = $(VBOX_VCC_TOOL_STEM)AMD64
2069ASTOOL := $(VBOX_ASTOOL)
2070
2071
2072#
2073# Setup the global defines and includes.
2074#
2075# Note! The __SOMETHING__ #defines are deprecated as they violate the C/C++ specs.
2076#
2077INCS += $(PATH_ROOT)/include $(PATH_OUT)
2078DEFS += VBOX
2079DEFS.debug := DEBUG DEBUG_$(subst $(subst _, ,_),_,$(USERNAME)) DEBUG_USERNAME=$(subst $(subst _, ,_),_,$(USERNAME))
2080DEFS.dbgopt = $(DEFS.debug)
2081DEFS.profile = VBOX_WITH_STATISTICS
2082DEFS.strict = RT_STRICT VBOX_STRICT
2083DEFS.asan = RT_STRICT VBOX_STRICT
2084DEFS.parfait = VBOX_WITH_PARFAIT
2085DEFS.parfait-dbg = VBOX_WITH_PARFAIT
2086DEFS.x86 = RT_ARCH_X86 __X86__
2087DEFS.amd64 = RT_ARCH_AMD64 __AMD64__
2088DEFS.arm64 = RT_ARCH_ARM64
2089DEFS.sparc32 = RT_ARCH_SPARC
2090DEFS.sparc64 = RT_ARCH_SPARC64
2091DEFS.darwin = RT_OS_DARWIN __DARWIN__
2092DEFS.freebsd = RT_OS_FREEBSD __FREEBSD__
2093DEFS.haiku = RT_OS_HAIKU
2094DEFS.linux = RT_OS_LINUX _FILE_OFFSET_BITS=64
2095DEFS.netbsd = RT_OS_NETBSD
2096DEFS.openbsd = RT_OS_OPENBSD
2097DEFS.os2 = RT_OS_OS2
2098DEFS.os-agnostic = RT_OS_AGNOSTIC
2099DEFS.solaris = RT_OS_SOLARIS _FILE_OFFSET_BITS=64
2100DEFS.win = RT_OS_WINDOWS __WIN__
2101DEFS.win.x86 = __WIN32__
2102DEFS.win.amd64 = __WIN64__
2103DEFS.win.arm64 = __WIN64__
2104# optional defines (use environment or make commandline)
2105ifdef VBOX_WITH_STATISTICS
2106 DEFS += VBOX_WITH_STATISTICS
2107endif
2108ifdef VBOX_STRICT
2109 DEFS += VBOX_STRICT
2110endif
2111ifdef LOG_ENABLED
2112 DEFS += LOG_ENABLED
2113endif
2114ifdef VBOX_OSE
2115 DEFS += VBOX_OSE
2116endif
2117ifdef VBOX_WITH_64_BITS_GUESTS
2118 DEFS += VBOX_WITH_64_BITS_GUESTS
2119endif
2120ifdef VBOX_WITH_REM
2121 DEFS += VBOX_WITH_REM
2122endif
2123ifdef VBOX_WITH_RAW_MODE
2124 DEFS += VBOX_WITH_RAW_MODE
2125endif
2126ifdef VBOX_WITH_DRIVERLESS_FORCED
2127 DEFS += VBOX_WITH_DRIVERLESS_FORCED
2128endif
2129ifdef VBOX_WITH_PARFAIT
2130 ifn1of ($(KBUILD_TYPE), parfait parfait-dbg)
2131 DEFS += VBOX_WITH_PARFAIT
2132 endif
2133 ifeq ($(KBUILD_TARGET),win)
2134 DEFS += RT_RELAXED_CALLBACKS_TYPES
2135 endif
2136endif
2137ifdef VBOX_WITH_STATIC_ARM64_PAGE_SHIFT
2138 DEFS.linux.arm64 += IPRT_STATIC_ARM64_PAGE_SHIFT=$(VBOX_WITH_STATIC_ARM64_PAGE_SHIFT)
2139endif
2140
2141# Don't flood CDEFS, old MASMs doesn't like too many defines.
2142ifdef VBOX_WITH_DEBUGGER
2143 CDEFS += VBOX_WITH_DEBUGGER
2144endif
2145ifdef VBOX_WITH_HARDENING
2146 CDEFS += VBOX_WITH_HARDENING
2147endif
2148if defined(VBOX_WITH_STRICT_LOCKS) && ($(KBUILD_TYPE) == "debug" || $(KBUILD_TYPE) == "strict" || $(KBUILD_TYPE) == "asan")
2149 CDEFS += RT_LOCK_STRICT RT_LOCK_STRICT_ORDER
2150endif
2151ifdef VBOX_WITH_EF_WRAPS
2152 CDEFS += RTMEM_WRAP_TO_EF_APIS RTMEM_WRAP_SOME_NEW_AND_DELETE_TO_EF
2153endif
2154
2155# Quoted strings should not be passed to the assemblers since they might not
2156# subscribe to C preprocessing semantics.
2157ifdef VBOX_PATH_APP_PRIVATE
2158 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2159 CDEFS += RTPATH_APP_PRIVATE="$(VBOX_PATH_APP_PRIVATE)"
2160 else
2161 CDEFS += RTPATH_APP_PRIVATE=\"$(VBOX_PATH_APP_PRIVATE)\"
2162 endif
2163endif
2164ifdef VBOX_PATH_APP_PRIVATE_ARCH
2165 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2166 CDEFS += RTPATH_APP_PRIVATE_ARCH="$(VBOX_PATH_APP_PRIVATE_ARCH)"
2167 else
2168 CDEFS += RTPATH_APP_PRIVATE_ARCH=\"$(VBOX_PATH_APP_PRIVATE_ARCH)\"
2169 endif
2170endif
2171ifdef VBOX_PATH_APP_PRIVATE_ARCH_TOP
2172 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2173 CDEFS += RTPATH_APP_PRIVATE_ARCH_TOP="$(VBOX_PATH_APP_PRIVATE_ARCH_TOP)"
2174 else
2175 CDEFS += RTPATH_APP_PRIVATE_ARCH_TOP=\"$(VBOX_PATH_APP_PRIVATE_ARCH_TOP)\"
2176 endif
2177endif
2178ifdef VBOX_PATH_SHARED_LIBS
2179 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2180 CDEFS += RTPATH_SHARED_LIBS="$(VBOX_PATH_SHARED_LIBS)"
2181 else
2182 CDEFS += RTPATH_SHARED_LIBS=\"$(VBOX_PATH_SHARED_LIBS)\"
2183 endif
2184endif
2185ifdef VBOX_PATH_APP_DOCS
2186 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2187 CDEFS += RTPATH_APP_DOCS="$(VBOX_PATH_APP_DOCS)"
2188 else
2189 CDEFS += RTPATH_APP_DOCS=\"$(VBOX_PATH_APP_DOCS)\"
2190 endif
2191endif
2192if1of ($(KBUILD_TARGET), os2) # The gcc here is too old to grok #pragma once, instead it complains.
2193 CDEFS += RT_WITHOUT_PRAGMA_ONCE
2194endif
2195CXXDEFS += $(CDEFS)
2196PCHDEFS += $(CDEFS)
2197OBJCDEFS += $(CDEFS)
2198
2199USES += dtrace
2200USES.win += vboximportchecker vboxsetpeversion
2201
2202
2203#
2204# Decide which Windows DDK to use by default.
2205#
2206# Note! For the VBoxSF.sys to build correctly, VBOX_WINDDK_GST_WLH must be
2207# set up to the Windows 7 WDK as it ships Vista libraries with some
2208# compatibility helpers and stuff (copysup.lib).
2209# (WLH = windows longhorn, the codenamefor Vista).
2210#
2211# Note! WDK 10.0.26100.0 (Windows 11 24h2) no longer ships x86 kernel mode
2212# libraries. Nor does it ship any win7, win8 or win6.3 (8.1) kernel
2213# mode libraries for amd64. So, for building x86 and amd64 drivers, we
2214# must use an older WDK version (like 10.0.22621.0, or 10.0.22000.0).
2215# (It is possible we could use the w10/11 km libs for the x64 GA, but
2216# that needs somewhat careful checking.)
2217#
2218if1of ($(KBUILD_TARGET_ARCH), x86 amd64)
2219 SDK_WINSDK10_MAX_VERSION = 10.0.22621.0
2220endif
2221VBOX_WINDDK ?= WINSDK10-KM
2222VBOX_WINDDK_WLH ?= $(VBOX_WINDDK)
2223
2224VBOX_WINDDK_GST ?= $(VBOX_WINDDK)
2225if1of ($(KBUILD_TARGET_ARCH), x86 amd64)
2226 VBOX_WINDDK_GST_W8 ?= WINSDK10-KM-W8
2227 VBOX_WINDDK_GST_W7 ?= WINSDK10-KM-W7
2228 VBOX_WINDDK_GST_WLH ?= WINDDK71WLH
2229 VBOX_WINDDK_GST_W2K3 ?= WINDDK71WNET
2230 ifeq ($(KBUILD_TARGET_ARCH),x86)
2231 VBOX_WINDDK_GST_WXP ?= WINDDK71WXP
2232 else
2233 VBOX_WINDDK_GST_WXP ?= $(VBOX_WINDDK_GST_W2K3)
2234 endif
2235 VBOX_WINDDK_GST_W2K ?= $(VBOX_WINDDK_GST_WXP)
2236 VBOX_WINDDK_GST_NT4 ?= $(VBOX_WINDDK_GST_WXP)
2237else
2238 VBOX_WINDDK_GST_W8 ?= $(VBOX_WINDDK_GST)
2239 VBOX_WINDDK_GST_W7 ?= $(VBOX_WINDDK_GST)
2240 VBOX_WINDDK_GST_WLH ?= $(VBOX_WINDDK_GST)
2241 VBOX_WINDDK_GST_W2K3 ?= $(VBOX_WINDDK_GST)
2242 VBOX_WINDDK_GST_WXP ?= $(VBOX_WINDDK_GST)
2243 VBOX_WINDDK_GST_W2K ?= $(VBOX_WINDDK_GST)
2244 VBOX_WINDDK_GST_NT4 ?= $(VBOX_WINDDK_GST)
2245endif
2246
2247#
2248# Decide which Windows SDK to use by default.
2249#
2250VBOX_WINPSDK ?= WINSDK10-UM
2251VBOX_WINPSDK_INCS ?= $(VBOX_WINPSDK)-INCS
2252VBOX_WINPSDK_GST ?= $(VBOX_WINPSDK)
2253VBOX_WINPSDK_GST_INCS ?= $(VBOX_WINPSDK_INCS)
2254VBOX_WINPSDK_GST_W8 ?= $(VBOX_WINPSDK_GST)
2255VBOX_WINPSDK_GST_W7 ?= $(VBOX_WINPSDK_GST)
2256VBOX_WINPSDK_GST_WLH ?= $(VBOX_WINPSDK_GST)
2257VBOX_WINPSDK_GST_WXP ?= $(VBOX_WINPSDK_GST)
2258VBOX_WINPSDK_GST_W2K ?= $(VBOX_WINPSDK_GST)
2259VBOX_WINPSDK_GST_NT4 ?= $(VBOX_WINPSDK_GST)
2260
2261#
2262# ARCH_BITS_DEFS.
2263#
2264if1of ($(KBUILD_TARGET_ARCH), amd64 sparc64 arm64)
2265 VBOX_HC_ARCH_BITS := 64
2266 ARCH_BITS_DEFS := HC_ARCH_BITS=64
2267else if1of ($(KBUILD_TARGET_ARCH), x86 sparc32)
2268 VBOX_HC_ARCH_BITS := 32
2269 ARCH_BITS_DEFS := HC_ARCH_BITS=32
2270else
2271 $(error VBox: KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH))
2272endif
2273
2274ifdef VBOX_WITH_64_BITS_GUESTS
2275 VBOX_GC_ARCH_BITS_DEFS := GC_ARCH_BITS=64
2276else
2277 VBOX_GC_ARCH_BITS_DEFS := GC_ARCH_BITS=32
2278endif
2279ARCH_BITS_DEFS += $(VBOX_GC_ARCH_BITS_DEFS)
2280
2281#
2282# Add the output dir(s) to the dynamic loader search path.
2283#
2284if1of ($(KBUILD_HOST), freebsd linux netbsd openbsd solaris)
2285 export LD_LIBRARY_PATH:=$(PATH_STAGE_BIN):$(PATH_STAGE_LIB):$(LD_LIBRARY_PATH)
2286endif
2287ifeq ($(KBUILD_HOST),haiku)
2288 export LIBRARY_PATH:=$(PATH_STAGE_BIN):$(PATH_STAGE_LIB):$(LIBRARY_PATH)
2289endif
2290ifeq ($(KBUILD_HOST),os2)
2291 #fixme! export BEGINLIBPATH:=$(PATH_STAGE_BIN);$(PATH_STAGE_LIB);$(BEGINLIBPATH)
2292endif
2293ifeq ($(KBUILD_HOST),win)
2294 # This check is a bit hacky, but avoids problems with PATH being changed
2295 # again when the makefiles are reread because some automatically generated
2296 # makefile has been modified.
2297 ifeq ($(findstring $(PATH_STAGE_BIN);$(PATH_STAGE_LIB);,$(PATH)),)
2298 export PATH:=$(PATH_STAGE_BIN);$(PATH_STAGE_LIB);$(PATH)
2299 endif
2300endif
2301
2302#
2303# Common libraries and tools.
2304#
2305ifeq ($(KBUILD_TARGET),darwin)
2306 LIB_RUNTIME = $(PATH_STAGE_BIN)/VBoxRT.dylib
2307 LIB_RUNTIME_EF = #$(PATH_STAGE_LIB)/RuntimeEFCPP.a
2308 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_BIN)/VBoxRT-x86.dylib
2309 LIB_KPROFILE = $(PATH_STAGE_BIN)/kPrf2.dylib
2310 LIB_VMM = $(PATH_STAGE_BIN)/VBoxVMM.dylib
2311 LIB_VMMRC = $(PATH_STAGE_BIN)/VMMRC.rc
2312 LIB_REM = $(PATH_STAGE_LIB)/VBoxREM.dylib
2313 LIB_XPCOM = $(PATH_STAGE_BIN)/VBoxXPCOM.dylib
2314 LIB_XPCOM_IMP = $(PATH_STAGE_LIB)/VBoxXPCOMImp.dylib
2315 VBOX_LIB_XPCOM_X86 = $(PATH_STAGE_BIN)/VBoxXPCOM-x86.dylib
2316 LIB_DDU = $(PATH_STAGE_BIN)/VBoxDDU.dylib
2317 VBOX_LIB_SUPR0 :=
2318 LIB_VBOXXPCOMIPCD = $(PATH_STAGE_BIN)/VBoxXPCOMIPCD.dylib
2319endif
2320if1of ($(KBUILD_TARGET), freebsd haiku linux netbsd openbsd solaris)
2321 LIB_RUNTIME = $(PATH_STAGE_BIN)/VBoxRT.so
2322 LIB_RUNTIME_EF = $(PATH_STAGE_LIB)/RuntimeEFCPP.a
2323 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_BIN)/VBoxRT-x86.so
2324 LIB_KPROFILE = $(PATH_STAGE_BIN)/kPrf2.so
2325 LIB_VMM = $(PATH_STAGE_BIN)/VBoxVMM.so
2326 LIB_VMMRC = $(PATH_STAGE_BIN)/VMMRC.rc
2327 LIB_REM = $(PATH_STAGE_LIB)/VBoxREM.so
2328 LIB_XPCOM = $(PATH_STAGE_BIN)/VBoxXPCOM.so
2329 LIB_XPCOM_IMP = $(PATH_STAGE_LIB)/VBoxXPCOMImp.so
2330 VBOX_LIB_XPCOM_X86 = $(PATH_STAGE_BIN)/VBoxXPCOM-x86.so
2331 LIB_DDU = $(PATH_STAGE_BIN)/VBoxDDU.so
2332 VBOX_LIB_SUPR0 :=
2333 LIB_VBOXXPCOMIPCD = $(PATH_STAGE_BIN)/VBoxXPCOMIPCD.so
2334endif
2335ifeq ($(KBUILD_TARGET),os2)
2336 LIB_RUNTIME = $(PATH_STAGE_BIN)/VBoxRT.dll
2337 LIB_RUNTIME_EF = #$(PATH_STAGE_LIB)/RuntimeEFCPP.a
2338 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_BIN)/VBoxRT-x86.dll
2339 LIB_KPROFILE = $(PATH_STAGE_BIN)/kPrf2.dll
2340 LIB_VMM = $(PATH_STAGE_BIN)/VBoxVMM.dll
2341 LIB_VMMRC = $(PATH_STAGE_LIB)/VMMRCImp.lib
2342 LIB_REM = $(PATH_STAGE_LIB)/VBoxREMImp.lib
2343 LIB_XPCOM = $(PATH_STAGE_BIN)/VBoxXCOM.dll
2344 LIB_XPCOM_IMP = $(PATH_STAGE_LIB)/VBoxXPCOMImp.lib
2345 VBOX_LIB_XPCOM_X86 = $(PATH_STAGE_BIN)/VBoxXPCOM-x86.dll
2346 LIB_DDU = $(PATH_STAGE_BIN)/VBoxDDU.dll
2347 VBOX_OBJ_SYS0 = $(PATH_OBJ)/RuntimeR0/os2/sys0.obj
2348 VBOX_LIB_SUPR0 = $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
2349endif
2350ifeq ($(KBUILD_TARGET),win)
2351 LIB_RUNTIME = $(PATH_STAGE_LIB)/VBoxRT.lib
2352 LIB_RUNTIME_EF = #$(PATH_STAGE_LIB)/RuntimeEFCPP.lib
2353 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_LIB)/VBoxRT-x86.lib
2354 LIB_KPROFILE = $(PATH_STAGE_LIB)/kPrf2.lib
2355 LIB_VMM = $(PATH_STAGE_LIB)/VBoxVMM.lib
2356 LIB_VMMRC = $(PATH_OBJ)/VMMRC/VMMRC.lib
2357 LIB_REM = $(PATH_STAGE_LIB)/VBoxREMImp.lib
2358 LIB_XPCOM =
2359 LIB_XPCOM_IMP =
2360 VBOX_LIB_XPCOM_X86 =
2361 LIB_DDU = $(PATH_STAGE_LIB)/VBoxDDU.lib
2362 VBOX_LIB_SUPR0 = $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
2363endif
2364ifn1of ($(KBUILD_TARGET_ARCH), $(VBOX_SUPPORTED_HOST_ARCHS)) # Hack to build a couple of extpack things that thing they need the VMM lib.
2365 LIB_VMM :=
2366 LIB_VMMRC :=
2367endif
2368VBOX_LIB_SUPHARDENED = $(PATH_STAGE_LIB)/SUPR3HardenedStatic$(VBOX_SUFF_LIB)
2369VBOX_LIB_RUNTIME_STATIC = $(PATH_STAGE_LIB)/RuntimeR3$(VBOX_SUFF_LIB)
2370VBOX_LIB_RUNTIME_STATIC_X86 = $(PATH_STAGE_LIB)/RuntimeR3-x86$(VBOX_SUFF_LIB)
2371if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
2372 VBOX_LIB_RUNTIME_STATIC_NO_ASAN = $(PATH_STAGE_LIB)/RuntimeR3NoAsan$(VBOX_SUFF_LIB)
2373else
2374 VBOX_LIB_RUNTIME_STATIC_NO_ASAN = $(VBOX_LIB_RUNTIME_STATIC)
2375endif
2376
2377ifndef VBOX_WITH_REM
2378 LIB_REM :=
2379endif
2380
2381# Python
2382ifndef VBOX_BLD_PYTHON
2383 if1of ($(KBUILD_HOST), win)
2384 VBOX_BLD_PYTHON := $(firstword $(rsort $(wildcard $(KBUILD_DEVTOOLS)/win.x86/python/v*/python$(HOSTSUFF_EXE))) \
2385 python-not-found.exe)
2386 else ifndef VBOX_WITH_PYTHON2_PREFERENCE
2387 VBOX_BLD_PYTHON := $(firstword \
2388 $(which python3$(HOSTSUFF_EXE)) \
2389 $(which python3.11$(HOSTSUFF_EXE)) \
2390 $(which python3.10$(HOSTSUFF_EXE)) \
2391 $(which python3.9$(HOSTSUFF_EXE)) \
2392 $(which python3.8$(HOSTSUFF_EXE)) \
2393 $(which python3.7$(HOSTSUFF_EXE)) \
2394 $(which python3.6$(HOSTSUFF_EXE)) \
2395 $(which python3.5$(HOSTSUFF_EXE)) \
2396 $(which python3.4$(HOSTSUFF_EXE)) \
2397 $(which python2.7$(HOSTSUFF_EXE)) \
2398 $(which python$(HOSTSUFF_EXE)) \
2399 $(which python2.6$(HOSTSUFF_EXE)) \
2400 python-not-found$(HOSTSUFF_EXE) )
2401 else
2402 VBOX_BLD_PYTHON := $(firstword \
2403 $(which python2.7$(HOSTSUFF_EXE)) \
2404 $(which python2.6$(HOSTSUFF_EXE)) \
2405 $(which python$(HOSTSUFF_EXE)) \
2406 $(which python3$(HOSTSUFF_EXE)) \
2407 python-not-found$(HOSTSUFF_EXE) )
2408 endif
2409endif
2410## For running python unittests in the validation kit.
2411VBOX_UNITTEST_PYTHON ?= $(VBOX_BLD_PYTHON)
2412
2413#
2414# pylint setup, see https://www.pylint.org/.
2415#
2416# Disabled:
2417# W0301 - Unnecessary semicolon.
2418# W0511 - TODO/XXX/FIXME/+++.
2419# W0603 - Using the global statement.
2420# W0702 - No exception type(s) specified.
2421# W0703 - Catch "Exception".
2422# I0011 - Locally disabling XXXXX.
2423# C0321 - More than one statement on a single line.
2424# R0201 - Method could be a function.
2425# C0326 - ????
2426# W0123 - ????
2427# C0330:bad-continuation - Wrong continued indentation (add X spaces).
2428# * Triggering on perfectly legal comments in array initializers and stuff.
2429# C0413:wrong-import-position - Import "YYYYY XXXXX" should be placed at the top of the module.
2430# * False positives due to __copyright__, __version__, probably.
2431# E0012:bad-option-value - Bad option value XXXXX.
2432# * Newer pylint doesn't grok older warning disables in sources (e.g. W0142 in db.py). Wonderful!
2433# I0012:locally-enabled - Locally enabling XXXXX.
2434# * We temporarily disable stuff and then renabled it. Very tedious.
2435# :nested-min-max - Buggy in 2.16.2 when mixing iterable and regular form, thus disabled.
2436#
2437# Note! Yes, --max-branchs is a typo, but not by me.
2438#
2439# Note! Users of older pylint release (< 1.0) needs to define
2440# VBOX_WITH_PYLINT_PRE_V1_0 in LocalConfig because they changed the
2441# output arguments in an backwards incompatible way and added more
2442# attribute regex options.
2443#
2444ifndef VBOX_PYLINT
2445 VBOX_PYLINT := $(firstword $(which pylint-2.7) $(which pylint-2.6) $(which pylint2) $(which pylint))
2446 #ifdef VBOX_PYLINT # -- why was this needed. It messes up when using pylint w/ 3.x and building with 2.7.
2447 # VBOX_PYLINT := $(VBOX_BLD_PYTHON) $(VBOX_PYLINT)
2448 #endif
2449endif
2450if !defined(VBOX_WITH_PYLINT) && defined(VBOX_PYLINT)
2451 VBOX_WITH_PYLINT := 1
2452 ifndef VBOX_PYLINT_VERSION
2453 ifdef VBOX_WITH_PYLINT_PRE_V1_0
2454 VBOX_PYLINT_VERSION = 9999
2455 else ifdef VBOX_WITH_PYLINT_V1_2_1_PLUS
2456 VBOX_PYLINT_VERSION = 10201
2457 else ifdef VBOX_WITH_PYLINT_V1_1_PLUS
2458 VBOX_PYLINT_VERSION = 10100
2459 else
2460 VBOX_PYLINT_VERSION = 10000
2461 endif
2462 endif
2463endif
2464VBOX_PYLINT_FLAGS = $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--reports=n,--report=n) \
2465 $(if-expr $(VBOX_PYLINT_VERSION) >= 10000 \
2466 ,--msg-template='{path}:{line}: <{msg_id}>({obj}:{symbol}): {msg}' \
2467 ,--output-format=msvs --include-ids=y) \
2468 --persistent=n \
2469 --rcfile=$(PATH_ROOT)/tools/pylintrc \
2470 --max-line-length=130 \
2471 --max-attributes=32 \
2472 --max-branch$(if-expr $(VBOX_PYLINT_VERSION) >= 10000,e,)s=50 \
2473 --max-statements=100 \
2474 --max-returns=100 \
2475 --max-public-methods=139 \
2476 --max-args=9 \
2477 --max-module-lines=4096 \
2478 --max-locals=32 \
2479 $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--max-bool-expr=99,) \
2480 --min-public-methods=0 \
2481 --function-rgx='[a-z_][a-zA-Z0-9_]{2,40}$(DOLLAR)' \
2482 --method-rgx='[a-z_][a-zA-Z0-9_]{2,40}$(DOLLAR)' \
2483 --argument-rgx='([a-z_][a-zA-Z0-9_]{2,30}|rc|hr|s|c|ch|cx|cy|cb|fn)$(DOLLAR)' \
2484 --variable-rgx='([a-z_][a-zA-Z0-9_]{2,30}|rc|hr|s|c|ch|cx|cy|cb|fn)$(DOLLAR)' \
2485 --attr-rgx='([a-z_][a-zA-Z0-9_]{2,30}|rc|hr|o)$(DOLLAR)' \
2486 --module-rgx='(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+)|(td[A-Z][a-zA-Z0-9]+)|(t(e|)st(-|)[a-zA-Z0-9]+))$(DOLLAR)' \
2487 --class-rgx='(td|)[A-Z_][a-zA-Z0-9_]+$(DOLLAR)' \
2488 --const-rgx='(g_(k|)[abcdefhmnpilorstu]+[A-Z][a-zA-Z0-9]+|[A-Z_][A-Z0-9_]+|__copyright__|__version__|__file__|__all__)$(DOLLAR)' \
2489 --good-names='i,j,k,t,o,c,e,ch,s,_' \
2490 $(if-expr $(VBOX_PYLINT_VERSION) >= 10000,--class-attribute-rgx='(k[abcdefhmnpilorstu]+[A-Z0-9][a-zA-Z0-9_]{0,32}|[A-Z_][A-Z0-9_]{2,32})',) \
2491 $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--max-nested-blocks=9,) \
2492 $(if-expr $(VBOX_PYLINT_VERSION) >= 10100,--disable=bad-whitespace,) \
2493 $(if-expr $(VBOX_PYLINT_VERSION) >= 10201,--disable=bad-continuation --disable=eval-used,) \
2494 $(if-expr $(VBOX_PYLINT_VERSION) >= 10201 && $(VBOX_PYLIN_VERSION) < 10500,--disable=bad-option-value,) \
2495 $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--disable=wrong-import-position --disable=E0012 --disable=locally-enabled,) \
2496 $(if-expr $(VBOX_PYLINT_VERSION) >= 10600,--disable=missing-docstring --disable=trailing-newlines --disable=ungrouped-imports,) \
2497 $(if-expr $(VBOX_PYLINT_VERSION) >= 10800,--disable=redundant-keyword-arg,) \
2498 $(if-expr $(VBOX_PYLINT_VERSION) >= 20000,--disable=useless-object-inheritance --disable=useless-return,) \
2499 $(if-expr $(VBOX_PYLINT_VERSION) >= 20400,--disable=import-outside-toplevel,) \
2500 $(if-expr $(VBOX_PYLINT_VERSION) >= 20900,--disable=super-with-arguments --disable=raise-missing-from,) \
2501 $(if-expr $(VBOX_PYLINT_VERSION) >= 21200,--disable=consider-using-f-string --disable=unnecessary-semicolon --disable=redundant-u-string-prefix) \
2502 $(if-expr $(VBOX_PYLINT_VERSION) >= 21602,--disable=broad-exception-raised) \
2503 $(if-expr $(VBOX_PYLINT_VERSION) >= 21602,--disable=nested-min-max) \
2504 --disable=unnecessary-semicolon,invalid-encoded-data,global-statement,bare-except,broad-except,multiple-statements,no-self-use,fixme \
2505 --disable=I0011 \
2506 --ignored-classes=testdriver.vboxcon
2507
2508
2509# Define the macro for win path conversion.
2510if !defined(VBOX_ONLY_SDK) || defined(VBOX_ONLY_SDK_ON_HOST) || defined(VBOX_ONLY_SDK_IN_VM)
2511 VBOX_FN_MAKE_WIN_PATH = "$(quote-sh-dq $(subst /,\,$(requote unq, $(1))))"
2512else
2513 # Z: is always FS root for Wine.
2514 VBOX_FN_MAKE_WIN_PATH = $(subst /,\\,$(patsubst /%,Z:/%,$(1)))
2515endif
2516
2517# The kprofile build automagically links with kProfile.
2518ifeq ($(KBUILD_TYPE),kprofile)
2519 LIB_RUNTIME += $(LIB_KPROFILE)
2520endif
2521
2522# Enable C++ electric fence heap. (Warning: will easily run out of virtual memory / kernel stuff on Linux/Windows.)
2523ifdef VBOX_WITH_CPP_EF
2524 LIB_RUNTIME <= $(LIB_RUNTIME_EF)
2525endif
2526
2527# Overridable libraries (unix).
2528LIB_PTHREAD ?= pthread
2529
2530# Xcursor (consider an SDK for this).
2531ifeq ($(VBOX_XCURSOR_LIBS),)
2532 ifeq ($(KBUILD_TARGET),solaris)
2533 VBOX_XCURSOR_LIBS := $(lastword $(wildcard $(KBUILD_DEVTOOLS_TRG)/libXcursor/*/lib/libXcursor.a))
2534 ifneq ($(VBOX_XCURSOR_LIBS),)
2535 VBOX_XCURSOR_INCS := $(patsubst %/lib/libXcursor.a,%/include, $(VBOX_XCURSOR_LIBS))
2536 VBOX_XCURSOR_LIBS += X11 Xrender Xfixes
2537 endif
2538 endif
2539 ifeq ($(VBOX_XCURSOR_LIBS),)
2540 VBOX_XCURSOR_LIBS := Xcursor
2541 endif
2542endif
2543
2544
2545# Intel ASL compiler for ACPI
2546VBOX_IASLCMD ?= $(firstword $(wildcard $(KBUILD_DEVTOOLS_HST)/bin/iasl$(HOSTSUFF_EXE)) iasl$(HOSTSUFF_EXE))
2547
2548# libxslt XSLT processor. (see PATH_TOOL_YASM for explanation why it's temporarily located in bin.)
2549ifeq ($(VBOX_XSLTPROC),)
2550 ifeq ($(KBUILD_HOST),win)
2551 VBOX_XSLTPROC := $(firstfile \
2552 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST)/libxslt/*/bin/xsltproc.exe)) \
2553 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST_ALT)/libxslt/*/bin/xsltproc.exe)) )
2554 ifeq ($(VBOX_XSLTPROC),)
2555 VBOX_XSLTPROC := $(firstfile $(which xsltproc$(HOSTSUFF_EXE)) xsltproc$(HOSTSUFF_EXE))
2556 endif
2557 else ifeq ($(KBUILD_HOST),os2)
2558 VBOX_XSLTPROC := BEGINLIBPATH="$(KBUILD_DEVTOOLS_HST)/bin;$$BEGINLIBPATH" $(KBUILD_DEVTOOLS_HST)/bin/xsltproc.exe
2559 else ifeq ($(KBUILD_HOST),haiku)
2560 VBOX_XSLTPROC := $(KBUILD_DEVTOOLS)/haiku.x86/bin/xsltproc
2561 else
2562 VBOX_XSLTPROC := xsltproc$(HOSTSUFF_EXE)
2563 endif
2564endif
2565
2566# Doxygen
2567ifeq ($(VBOX_DOXYGEN),)
2568 VBOX_DOXYGEN := $(firstfile $(rversortfiles $(qwildcard , $(KBUILD_DEVTOOLS_HST)/doxygen/v*/doxygen$(HOSTSUFF_EXE))) doxygen$(HOSTSUFF_EXE))
2569endif
2570
2571# bin2c (convert binary files into C arrays)
2572VBOX_BIN2C ?= $(PATH_OBJ)/bin2c/bin2c$(HOSTSUFF_EXE)
2573
2574# genalias (generate aliases for nocrt_ functions)
2575VBOX_GENALIAS ?= $(PATH_OBJ)/genalias/genalias$(HOSTSUFF_EXE)
2576
2577# RTManifest (extension pack manifest utility)
2578VBOX_RTMANIFEST ?= $(PATH_OBJ)/bldRTManifest/bldRTManifest$(HOSTSUFF_EXE)
2579
2580# RTSignTool (certificate extraction tool)
2581VBOX_RTSIGNTOOL ?= $(PATH_OBJ)/bldRTSignTool/bldRTSignTool$(HOSTSUFF_EXE)
2582
2583# RTIsoMaker (our own ISO maker).
2584VBOX_RTISOMAKER ?= $(PATH_OBJ)/bldRTIsoMaker/bldRTIsoMaker$(HOSTSUFF_EXE)
2585
2586# RTLdrCheckImports (checks imports against oldest supported OS version (GAs typically))
2587VBOX_RTLDRCHECKIMPORTS ?= $(PATH_OBJ)/bldRTLdrCheckImports/bldRTLdrCheckImports$(HOSTSUFF_EXE)
2588
2589# VBoxCmp (simple /bin/cmp with more sensible output)
2590VBOX_VBOXCMP ?= $(PATH_OBJ)/VBoxCmp/VBoxCmp$(HOSTSUFF_EXE)
2591
2592# VBoxCPP (special purpose C preprocessor)
2593VBOX_VBOXCPP ?= $(PATH_OBJ)/VBoxCPP/VBoxCPP$(HOSTSUFF_EXE)
2594
2595# VBoxTpG (tracepoint generator)
2596VBOX_VBOXTPG ?= $(PATH_OBJ)/VBoxTpG/VBoxTpG$(HOSTSUFF_EXE)
2597
2598# VBoxPeSetVersion (changes the minimum OS version of an image)
2599VBOX_PE_SET_VERSION ?= $(PATH_OBJ)/VBoxPeSetVersion/VBoxPeSetVersion$(HOSTSUFF_EXE)
2600
2601# Visual C++ EditBin.exe.
2602VBOX_VCC_EDITBIN = $(if $(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN_QSH),$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN_QSH)/,$(if $(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN),$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN)/,))editbin.exe /NoLogo
2603
2604# filesplitter (splits java files)
2605VBOX_FILESPLIT ?= $(PATH_OBJ)/filesplitter/filesplitter$(HOSTSUFF_EXE)
2606
2607# biossums (set BIOS checksums)
2608VBOX_BIOSSUMS ?= $(PATH_OBJ)/biossums/biossums$(HOSTSUFF_EXE)
2609
2610# MakeAlternativeSource (for BIOSes)
2611VBOX_MAKE_ALTERNATIVE_SOURCE ?= $(PATH_OBJ)/MakeAlternativeSource/MakeAlternativeSource$(HOSTSUFF_EXE)
2612
2613# VBoxDef2LazyLoad (lazy dynamic library loader assembly generator)
2614VBOX_DEF_2_LAZY_LOAD ?= $(PATH_OBJ)/VBoxDef2LazyLoad/VBoxDef2LazyLoad$(HOSTSUFF_EXE)
2615
2616# VBoxCheckImports (checks what we imports from on windows)
2617VBOX_CHECK_IMPORTS ?= $(PATH_OBJ)/VBoxCheckImports/VBoxCheckImports$(HOSTSUFF_EXE)
2618
2619# VBoxEditCoffLib (symbol name tweaking for VBoxSF on windows)
2620VBOX_EDIT_COFF_LIB ?= $(PATH_OBJ)/VBoxEditCoffLib/VBoxEditCoffLib$(HOSTSUFF_EXE)
2621
2622# GNU tar if present.
2623if1of ($(KBUILD_TARGET), linux os2 win)
2624 VBOX_GTAR ?= tar
2625else if1of ($(KBUILD_TARGET), freebsd netbsd solaris)
2626 VBOX_GTAR ?= gtar
2627endif
2628
2629# zip
2630VBOX_ZIP ?= zip$(HOSTSUFF_EXE)
2631
2632ifeq ($(KBUILD_HOST),darwin) # Xcode 7.3.1 nm doesn't like -t, and -x behaves very differently. Throwing in -B (bsd) to make sure.
2633 VBOX_NM ?= $(subst $(REDIRECT_INT),$(REDIRECT_EXT),$(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN_BIN_SLASH)nm) -p \
2634 $(if-expr $(VBOX_XCODE_VERSION_MAJOR) > 7 || ($(VBOX_XCODE_VERSION_MAJOR) == 7 && $(VBOX_XCODE_VERSION_MINOR) >= 3),-B,)
2635else
2636 VBOX_NM ?= nm -p -t x
2637endif
2638
2639# Makeself for the linux installers.
2640VBOX_MAKESELF ?= $(KBUILD_DEVTOOLS)/common/makeself/v2.4.5-r2/makeself.sh
2641
2642# Microsoft HTML Help Workshop.
2643VBOX_PATH_HTML_HELP_WORKSHOP ?= $(KBUILD_DEVTOOLS)/win.x86/HTML_Help_Workshop/v1.3/
2644
2645# Path to the null soft installer.
2646VBOX_PATH_NSIS ?= $(KBUILD_DEVTOOLS)/win.x86/nsis/v3.09-log
2647
2648# Windows Installer XML (WIX) toolset.
2649VBOX_PATH_WIX ?= $(KBUILD_DEVTOOLS)/win.x86/wix/v4.0.5
2650VBOX_PATH_MSITRAN ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/../x86/MsiTran.Exe
2651VBOX_PATH_MSIDB ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/../x86/MsiDb.Exe
2652# Note! The scripts has been moved to Bin in v8.0.
2653VBOX_PATH_WISUBSTG ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/WiSubStg.vbs
2654VBOX_PATH_WISUMINFO ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/WiSumInf.vbs
2655VBOX_PATH_DIFX ?= $(KBUILD_DEVTOOLS)/win.$(KBUILD_TARGET_ARCH)/DIFx/v2.1-r3
2656
2657ifdef VBOX_OSE ## @todo try get rid of this crap! People can use the latest and greatest Yasm release, no need to check in the binary for OSE.
2658 # We need to export YASM for OSE, but since it was converted to .zip we need to
2659 # allow for the location used by the zip to be properly cleaned up first.
2660 if1of ($(KBUILD_HOST).$(KBUILD_HOST_ARCH), linux.x86 solaris.x86 win.x86)
2661 PATH_TOOL_YASM ?= $(KBUILD_DEVTOOLS_HST)/bin
2662 endif
2663endif
2664
2665# bison and flex for windows. Needed by mesa and also used by VBoxDTrace.
2666ifeq ($(KBUILD_HOST),win)
2667 ifndef TOOL_BISON_YACC
2668 TOOL_BISON_YACC := $(firstfile $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS)/win.x86/win_flex_bison/v*/*bison*$(HOSTSUFF_EXE))) bison.exe)
2669 endif
2670 ifndef TOOL_FLEX_LEX
2671 TOOL_FLEX_LEX := $(firstfile $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS)/win.x86/win_flex_bison/v*/*flex*$(HOSTSUFF_EXE))) flex.exe)
2672 endif
2673endif
2674
2675
2676# The Microsoft IDL compiler (the SDK build needs this on non-Windows).
2677VBOX_WIN_MIDL ?= $(EXEC_X86_WIN32) $(call VBOX_FN_MAKE_WIN_PATH,$(qfirstfile ,$(qwildcard ,$(qaddsuffix ,/[Mm][Ii][Dd][Ll].[Ee][Xx][Ee], \
2678 $(PATH_SDK_$(VBOX_WINPSDK)_BIN) \
2679 $(KBUILD_DEVTOOLS)/win.x86/sdk/v7.1/Bin$(if-expr "$(KBUILD_HOST).$(KBUILD_HOST_ARCH)" == "win.amd64",/x64,) \
2680 $(KBUILD_DEVTOOLS)/win.x86/ddk/7600.16385.1/bin/x86 \
2681 $(KBUILD_DEVTOOLS)/win.x86/bin \
2682 $(PATH_SDK_$(VBOX_WINPSDK)_BIN) \
2683 $(PATH_SDK_$(VBOX_WINPSDK)) \
2684 $(PATH_SDK_WINPSDK_BIN) \
2685 $(PATH_SDK_WINPSDK) \
2686 )) Sorry_Cannot_Find_The_Midl_Compiler_In_The_PSDK))
2687
2688# Tricks to work around midl.exe problems with spaces in the /cpp_cmd value, it
2689# forgets to quote it when creating the commandline and cl.exe gets very confused.
2690ifndef VBOX_WITH_PARFAIT
2691 if1of (quote, $(KMK_FEATURES))
2692 VBOX_MIDL_REDIRECT = $(REDIRECT) --prepend "$(quote-sh-dq PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(qaddsuffix ,;,$(PATH_TOOL_$(VBOX_VCC_TOOL)_DLL_BIN)))" --
2693 VBOX_MIDL_REDIRECT_X86 = $(REDIRECT) --prepend "$(quote-sh-dq PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_BIN);$(qaddsuffix ,;,$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_DLL_BIN)))" --
2694 else
2695 VBOX_MIDL_REDIRECT = $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(PATH)' --
2696 VBOX_MIDL_REDIRECT_X86 = $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_BIN);$(PATH)' --
2697 endif
2698else
2699 if1of (quote, $(KMK_FEATURES))
2700 VBOX_MIDL_REDIRECT = \
2701 $(REDIRECT) --prepend "$(quote-sh-dq PATH=$(VBOX_PARFAIT_PATH_BIN);$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(qaddsuffix ,;,$(PATH_TOOL_$(VBOX_VCC_TOOL)_DLL_BIN)))" --
2702 VBOX_MIDL_REDIRECT_X86 = \
2703 $(REDIRECT) --prepend "$(quote-sh-dq PATH=$(VBOX_PARFAIT_PATH_BIN);$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_BIN);$(qaddsuffix ,;,$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_DLL_BIN)))" --
2704 else
2705 VBOX_MIDL_REDIRECT = \
2706 $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(VBOX_PARFAIT_PATH_BIN);$(PATH)' --
2707 VBOX_MIDL_REDIRECT_X86 = \
2708 $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(VBOX_PARFAIT_PATH_BIN);$(PATH)' --
2709 endif
2710endif
2711VBOX_MIDL_CPP_CMD = $(lastword $(notdir ,$(subst $(EXEC_X86_WIN32),,$(TOOL_$(VBOX_VCC_TOOL)_CC))))
2712VBOX_MIDL_CPP_CMD_X86 = $(lastword $(notdir ,$(subst $(EXEC_X86_WIN32),,$(TOOL_$(VBOX_VCC_TOOL_STEM)X86_CC))))
2713
2714##
2715# Edits $1 and adding #pragma directives for disabling warnings windows.h causes.
2716# @param 1 The name of the file to edit.
2717define def_VBoxMidlOutputDisableMscWarnings
2718 $(QUIET)$(MV) -f "$1" "$1.tmp"
2719 $(QUIET)$(APPEND) -nt "$1" \
2720 '#if _MSC_VER >= 1920 /* RT_MSC_VER_VS2019 */' \
2721 '# pragma warning(disable:5031 5032) /* buggy winioctl.h in some w10 sdks */ ' \
2722 '#endif' \
2723 '#pragma warning(push) /* -Wall and windows.h */' \
2724 '#pragma warning(disable:4668 4255)' \
2725 '#if _MSC_VER >= 1800 /* RT_MSC_VER_VC120 */' \
2726 '# pragma warning(disable:4005)' \
2727 '#endif' \
2728 '#if _MSC_VER >= 1900 /* RT_MSC_VER_VC140 */' \
2729 '# pragma warning(disable:5039)' \
2730 '#endif' \
2731 ''
2732 $(QUIET)$(CAT_EXT) "$1.tmp" >> "$1"
2733 $(QUIET)$(APPEND) -n "$1" \
2734 '' \
2735 '#pragma warning(pop)' \
2736 ''
2737 $(QUIET)$(RM) -f "$1.tmp"
2738
2739endef
2740
2741# XPCOM setup for all but win32.
2742ifneq ($(KBUILD_TARGET),win)
2743 VBOX_WITH_XPCOM = 1
2744 # if updating, also update xpidl_INST var in src/libs/xpcom18a4/Makefile.kmk
2745 VBOX_XPIDL ?= $(PATH_STAGE_BIN)/xpidl$(HOSTSUFF_EXE)
2746 ifeq ($(KBUILD_TARGET),os2)
2747 VBOX_XPIDL_ENV = BEGINLIBPATH="$(dir $(VBOX_XPIDL));$$BEGINLIBPATH"$(SP)
2748 endif
2749 VBOX_PATH_XPCOM_IDL ?= $(VBOX_PATH_SDK)/bindings/xpcom/idl
2750 VBOX_XPCOM_INCS ?= \
2751 $(VBOX_PATH_SDK)/bindings/xpcom/include \
2752 $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \
2753 $(VBOX_PATH_SDK)/bindings/xpcom/include/string \
2754 $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \
2755 $(VBOX_PATH_SDK)/bindings/xpcom/include/nsprpub \
2756 $(VBOX_PATH_SDK)/bindings/xpcom/include/ipcd
2757 ifneq ($(KBUILD_TARGET),os2)
2758 # libIDL-config (for xpcom18a4)
2759 ifeq ($(origin VBOX_LIBIDL_CONFIG),undefined)
2760 ifeq ($(KBUILD_HOST),solaris)
2761 VBOX_LIBIDL_CONFIG_FALLBACK = $(lastword $(wildcard $(KBUILD_DEVTOOLS)/solaris.amd64/libIDL/*/bin/libIDL-config-2))
2762 endif
2763 export VBOX_LIBIDL_CONFIG := $(firstword $(which libIDL-config-2 libIDL-config) $(VBOX_LIBIDL_CONFIG_FALLBACK) libIDL-config-2-not-found)
2764 endif
2765 endif
2766endif
2767
2768# The X11 LIBPATH. (The amd64 hack is for RHEL4.)
2769ifeq ($(KBUILD_TARGET_ARCH),amd64)
2770 VBOX_LIBPATH_X11 ?= /usr/X11R6/lib64 /usr/X11R6/lib
2771else
2772 VBOX_LIBPATH_X11 ?= /usr/X11R6/lib
2773endif
2774
2775# 32bit X11 LIBPATH for building 32bit guest additions
2776VBOX_LIBPATH32_X11 ?= /usr/X11R6/lib32 /usr/X11R6/lib
2777
2778# Good windows shell.
2779VBOX_GOOD_COMSPEC = $(subst \,/,$(SystemRoot))/System32/cmd.exe
2780VBOX_GOOD_COMSPEC_BS ?= $(subst /,\,$(VBOX_GOOD_COMSPEC))
2781
2782#
2783# Macros dealing with the darwin version we're targeting.
2784# The DEF in VBOX_DEF_MACOSX_VERSION_MIN mean default. The default min
2785# version is assumed to be the
2786#
2787ifeq ($(KBUILD_TARGET),darwin)
2788 # The minimum macOS version we're targetting.
2789 ifndef VBOX_DEF_MACOSX_VERSION_MIN
2790 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO) # For GAs.
2791 VBOX_DEF_MACOSX_VERSION_MIN := 10.6# Snow Leopard
2792 else if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2793 VBOX_DEF_MACOSX_VERSION_MIN := 10.9# Mavericks
2794 else
2795 VBOX_DEF_MACOSX_VERSION_MIN := 11.0# Big Sur
2796 endif
2797 endif
2798 VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT := $(subst .,,$(VBOX_DEF_MACOSX_VERSION_MIN))
2799
2800 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO) # For GAs.
2801 # Check for the Xcode 4.1 bits in tools/darwin.x86.
2802 if !defined(VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL) \
2803 && !defined(VBOX_XCODE_VERSION) \
2804 && exists "$(KBUILD_DEVTOOLS)/darwin.x86/xcode/v4.1"
2805 VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL := 1
2806 VBOX_PATH_MACOSX_DEVEL_ROOT := $(KBUILD_DEVTOOLS)/darwin.x86/xcode/v4.1
2807 VBOX_XCODE_VERSION := 4.1
2808 else
2809 # Fallback - system / LocalConfig.kmk.
2810 VBOX_PATH_MACOSX_DEVEL_ROOT ?= /Developer
2811 VBOX_PATH_MACOSX_SDK_ROOT ?= $(VBOX_PATH_MACOSX_DEVEL_ROOT)/SDKs
2812 VBOX_PATH_MACOSX_TOOLCHAIN_ROOT ?= $(VBOX_PATH_MACOSX_DEVEL_ROOT)
2813 endif
2814 else ifeq ($(VBOX_GCC_TOOL),VBoxXcode62)
2815 # Use the tool path of the compiler (it's clang, not gcc in this instance).
2816 include $(KBUILD_TOOL_PATHS)/$(VBOX_GCC_TOOL).kmk
2817 VBOX_PATH_MACOSX_DEVEL_ROOT := $(PATH_TOOL_$(VBOX_GCC_TOOL))
2818 # Fallback - system / LocalConfig.kmk.
2819 ifndef VBOX_PATH_MACOSX_DEVEL_ROOT
2820 VBOX_PATH_MACOSX_DEVEL_ROOT := $(firstword $(wildcard /Applications/Xcode.app/Contents/Developer /Developer /Library/Developer))
2821 endif
2822 ifndef VBOX_PATH_MACOSX_SDK_ROOT
2823 VBOX_PATH_MACOSX_SDK_ROOT := $(firstword $(wildcard \
2824 $(PATH_TOOL_$(VBOX_GCC_TOOL)_SDKS) \
2825 $(VBOX_PATH_MACOSX_DEVEL_ROOT)/SDKs/. \
2826 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/. \
2827 /Developer/SDKs/. \
2828 /Library/Developer/CommandLineTools/SDKs/. ))
2829 endif
2830 ifndef VBOX_PATH_MACOSX_TOOLCHAIN_ROOT
2831 VBOX_PATH_MACOSX_TOOLCHAIN_ROOT := $(firstword $(wildcard \
2832 $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN) \
2833 $(VBOX_PATH_MACOSX_DEVEL_ROOT)/Library/Developer/CommandLineTools/. \
2834 $(VBOX_PATH_MACOSX_DEVEL_ROOT)/Toolchains/XcodeDefault.xctoolchain/. \
2835 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/. \
2836 /Library/Developer/CommandLineTools/. \
2837 ) /. )
2838 endif
2839 else
2840 # VBOX_WITH_EVEN_NEWER_XCODE ends up here.
2841 include $(KBUILD_PATH)/tools/$(VBOX_GCC_TOOL).kmk
2842 include $(KBUILD_PATH)/sdks/MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT).kmk
2843 ifndef VBOX_PATH_MACOSX_SDK
2844 VBOX_PATH_MACOSX_SDK := $(PATH_SDK_MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT))
2845 endif
2846 VBOX_PATH_MACOSX_SDK_ROOT = $(dir $(VBOX_PATH_MACOSX_SDK))
2847 endif
2848
2849 # Figure the default SDK location and obsolete linker tricks.
2850 ifeq ($(VBOX_DEF_MACOSX_VERSION_MIN),10.4)
2851 ifeq ($(origin VBOX_DARWIN_CLASSIC_LINKER),undefined)
2852 VBOX_DARWIN_CLASSIC_LINKER := $(shell ld -v 2>&1 )
2853 ifneq ($(filter ld64%, $(subst :, , $(VBOX_DARWIN_CLASSIC_LINKER))),)
2854 export VBOX_DARWIN_CLASSIC_LINKER := -Wl,-classic_linker
2855 else
2856 export VBOX_DARWIN_CLASSIC_LINKER :=
2857 endif
2858 endif
2859 endif
2860 if !defined(VBOX_PATH_MACOSX_SDK) && !defined(VBOX_WITH_EVEN_NEWER_XCODE) # newer xcode handles this above
2861 VBOX_PATH_MACOSX_SDK_ROOT_DIRS ?= \
2862 $(VBOX_PATH_MACOSX_SDK_ROOT) \
2863 $(KBUILD_DEVTOOLS)/darwin.x86/SDKs/ \
2864 $(KBUILD_DEVTOOLS)/darwin.amd64/SDKs/ \
2865 $(KBUILD_DEVTOOLS)/darwin.x86/xcode/v4.1/SDKs \
2866 $(KBUILD_DEVTOOLS)/darwin.x86/xcode/v3.2.6/SDKs
2867 ifeq ($(VBOX_DEF_MACOSX_VERSION_MIN),10.4)
2868 VBOX_PATH_MACOSX_SDK := $(firstword $(wildcard $(addsuffix /MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN)u.sdk, $(VBOX_PATH_MACOSX_SDK_ROOT_DIRS))) \
2869 $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN)u.sdk )
2870 else
2871 VBOX_PATH_MACOSX_SDK := $(firstword $(wildcard $(addsuffix /MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN).sdk, $(VBOX_PATH_MACOSX_SDK_ROOT_DIRS))) \
2872 $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN).sdk )
2873 endif
2874 endif
2875
2876 ## The Xcode version (not relevant for command line tools, so we skip this in VBOX_WITH_EVEN_NEWER_XCODE mode).
2877 ifdef VBOX_WITH_EVEN_NEWER_XCODE
2878 VBOX_XCODE_VERSION ?= 10.98## Just a high non-existing version number.
2879 else ifeq ($(KBUILD_HOST),darwin)
2880 ifndef VBOX_XCODE_VERSION
2881 if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2882 VBOX_XCODE_VERSION := $(shell exec $(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/xcodebuild -version 2>&1)
2883 ifneq ($(pos Symbol not found,$(VBOX_XCODE_VERSION)),0) # Try detect unresolved symbol running Xcode 6.2 on Catalina.
2884 VBOX_XCODE_VERSION = 6.2
2885 else
2886 VBOX_XCODE_VERSION := $(word 2, $(VBOX_XCODE_VERSION))
2887 endif
2888 else if defined(VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL) || exists "$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/xcodebuild"
2889 VBOX_XCODE_VERSION := $(word 2, $(shell $(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/xcodebuild -version))
2890 else
2891 VBOX_XCODE_VERSION := $(word 2, $(shell xcodebuild -version))
2892 endif
2893 ifeq ($(strip $(VBOX_XCODE_VERSION)),)
2894 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
2895 VBOX_XCODE_VERSION := 4.1
2896 else if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2897 VBOX_XCODE_VERSION := 6.2
2898 else
2899 VBOX_XCODE_VERSION := 9.4# whatever
2900 endif
2901 endif
2902 endif
2903 if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2904 ifdef KBUILD_USE_KOBJCACHE
2905 $(warning KBUILD_USE_KOBJCACHE does _not_ currently work with this version of Xcode)
2906 endif
2907 endif
2908 else
2909 VBOX_XCODE_VERSION ?= 4.1## @todo Anything special for GA, extpack and valkit tools fetching?
2910 endif
2911 VBOX_XCODE_VERSION_MAJOR := $(word 1, $(subst ., ,$(VBOX_XCODE_VERSION)))
2912 VBOX_XCODE_VERSION_MINOR := $(word 2, $(subst ., ,$(VBOX_XCODE_VERSION)))
2913 VBOX_XCODE_VERSION := $(VBOX_XCODE_VERSION_MAJOR).$(VBOX_XCODE_VERSION_MINOR)
2914
2915 ifeq ($(KBUILD_TARGET_ARCH),x86)
2916 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5)
2917 VBOX_DARWIN_NO_COMPACT_LINKEDIT ?= $(VBOX_LD_no_compact_linkedit)
2918 TOOL_GXX4MACHO_SUFFIX ?= -4.0
2919 endif
2920 else if $(VBOX_XCODE_VERSION_MAJOR) < 4 && "$(VBOX_XCODE_VERSION)" != "3.2"
2921 ifeq ($(PATH_CURRENT),$(PATH_ROOT)/tools)
2922 $(warning VBox: 64-bit darwin builds require Xcode 3.2 or later, you have $(VBOX_XCODE_VERSION))
2923 else
2924 $(error VBox: 64-bit darwin builds require Xcode 3.2 or later, you have $(VBOX_XCODE_VERSION))
2925 endif
2926 endif
2927 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
2928 if $(VBOX_XCODE_VERSION_MAJOR) > 4 || ($(VBOX_XCODE_VERSION_MAJOR) == 4 && $(VBOX_XCODE_VERSION_MINOR) >= 2)
2929 TOOL_GXX4MACHO_PREFIX ?= llvm-
2930 endif
2931 if $(VBOX_XCODE_VERSION_MAJOR) < 5
2932 TOOL_GXX4MACHO_SUFFIX ?= -4.2
2933 endif
2934 VBOX_DARWIN_NO_COMPACT_LINKEDIT ?=
2935
2936 TOOL_GCC4MACHO_SUFFIX ?= $(TOOL_GXX4MACHO_SUFFIX)$(HOSTSUFF_EXE)
2937 TOOL_GCC4MACHO_PREFIX ?= $(TOOL_GXX4MACHO_PREFIX)
2938 if defined(VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL)
2939 TOOL_GCC4MACHO_PREFIX := $(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)/usr/bin/$(TOOL_GCC4MACHO_PREFIX)
2940 TOOL_GXX4MACHO_PREFIX := $(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)/usr/bin/$(TOOL_GXX4MACHO_PREFIX)
2941 TOOL_GCC4MACHO_SUFFIX := $(TOOL_GCC4MACHO_SUFFIX) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2942 TOOL_GXX4MACHO_SUFFIX := $(TOOL_GXX4MACHO_SUFFIX) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2943 ifndef SVN # must expand first so we won't be using old svn.
2944 SVN := $(firstword $(which svn) svn)
2945 endif
2946 if $(VBOX_XCODE_VERSION_MAJOR) > 4 || ($(VBOX_XCODE_VERSION_MAJOR) == 4 && $(VBOX_XCODE_VERSION_MINOR) >= 2)
2947 export PATH:=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/:$(VBOX_PATH_MACOSX_SDK)/usr/bin:$(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)/usr/bin:$(PATH)
2948 export DEVELOPER_DIR:=$(VBOX_PATH_MACOSX_DEVEL_ROOT)
2949 else
2950 export PATH:=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/:$(PATH)
2951 endif
2952 TOOL_GXX32_CC = $(TOOL_GCC4MACHO_PREFIX)gcc$(TOOL_GCC4MACHO_SUFFIX) -m32
2953 TOOL_GXX32_CXX = $(TOOL_GCC4MACHO_PREFIX)g++$(TOOL_GCC4MACHO_SUFFIX) -m32
2954 TOOL_GXX32_LD = $(TOOL_GXX32_CXX)
2955 override TOOL_StandardDTrace_DTRACE := dtrace "-xcpppath=$(TOOL_GCC4MACHO_PREFIX)cpp-4.2"
2956 endif
2957 if $(VBOX_XCODE_VERSION_MAJOR) < 5
2958 ## @todo WTF do we do the -m32/64 stuff here for these compilers? Also the visibility should be elsewhere...
2959 TOOL_GXX4MACHO_OBJC = $(TOOL_GCC4MACHO_PREFIX)gcc$(TOOL_GCC4MACHO_SUFFIX) $(if-expr $(KBUILD_TARGET_ARCH) == "x86",-m32,-m64) -fvisibility=hidden
2960 TOOL_GXX4MACHO_OBJCXX = $(TOOL_GCC4MACHO_PREFIX)gcc$(TOOL_GCC4MACHO_SUFFIX) $(if-expr $(KBUILD_TARGET_ARCH) == "x86",-m32,-m64) -fvisibility=hidden -fvisibility-inlines-hidden
2961 endif
2962 else if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2963 if $(KBUILD_HOST_VERSION_MAJOR) >= 18 # HACK ALERT! dtrace doesn't work on Mojave if we specify our Xcode 6.2 environment.
2964 override TOOL_StandardDTrace_DTRACE := dtrace "-xcpppath=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/gcc"
2965 else
2966 override TOOL_StandardDTrace_DTRACE := $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) dtrace "-xcpppath=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/gcc"
2967 endif
2968 export PATH:=$(VBOX_PATH_MACOSX_SDK)/usr/bin:$(PATH)
2969 else # effectively VBOX_WITH_EVEN_NEWER_XCODE
2970 override TOOL_StandardDTrace_DTRACE := $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) dtrace "-xcpppath=$(filter-out -f%,$(TOOL_$(VBOX_GCC_TOOL)_CC))"
2971 endif
2972
2973 ifdef VBOX_WITH_EVEN_NEWER_XCODE
2974 VBOX_DARWIN_DEF_SDK_SDKS := MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)
2975 VBOX_DARWIN_DEF_SDK_DEFS := MAC_OS_X_VERSION_MAX_ALLOWED=$(SDK_MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)_VERSION_VALUE)
2976 VBOX_DARWIN_DEF_SDK_LDFLAGS = $(VBOX_DARWIN_CLASSIC_LINKER) $(VBOX_DARWIN_NO_COMPACT_LINKEDIT)
2977 else
2978 VBOX_DARWIN_DEF_SDK_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)0 \
2979 MAC_OS_X_VERSION_MAX_ALLOWED=$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)0
2980 VBOX_DARWIN_DEF_SDK_CFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2981 VBOX_DARWIN_DEF_SDK_CXXFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2982 VBOX_DARWIN_DEF_SDK_OBJCFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2983 VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2984 VBOX_DARWIN_DEF_SDK_LDFLAGS = -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK)" \
2985 $(VBOX_DARWIN_CLASSIC_LINKER) $(VBOX_DARWIN_NO_COMPACT_LINKEDIT)
2986 endif
2987
2988 # specific versions - only used by xpcom18a4 (python) and 10.7 by UsbWebcam.
2989 ## @todo s/VBOX_DARWIN_DEF_SDK_10/VBOX_DARWIN_SDK_10/g
2990
2991 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4) # classic linker detection is bust otherwise
2992 VBOX_PATH_MACOSX_SDK_10_4 ?= $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.4u.sdk
2993 VBOX_DARWIN_DEF_SDK_10_4_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1040 MAC_OS_X_VERSION_MAX_ALLOWED=1040
2994 VBOX_DARWIN_DEF_SDK_10_4_CFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2995 VBOX_DARWIN_DEF_SDK_10_4_CXXFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2996 VBOX_DARWIN_DEF_SDK_10_4_OBJCFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2997 VBOX_DARWIN_DEF_SDK_10_4_OBJCXXFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2998 VBOX_DARWIN_DEF_SDK_10_4_LDFLAGS := -mmacosx-version-min=10.4 -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK_10_4)" $(VBOX_DARWIN_CLASSIC_LINKER)
2999 else
3000 VBOX_PATH_MACOSX_SDK_10_4 = $(error VBox: $(if $(target),$(target): ,)Using 10.4 SDK)
3001 VBOX_DARWIN_DEF_SDK_10_4_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.4 SDK)
3002 VBOX_DARWIN_DEF_SDK_10_4_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.4 SDK)
3003 endif
3004
3005 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5)
3006 VBOX_PATH_MACOSX_SDK_10_5 ?= $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.5.sdk
3007 VBOX_DARWIN_DEF_SDK_10_5_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1050 MAC_OS_X_VERSION_MAX_ALLOWED=1050
3008 VBOX_DARWIN_DEF_SDK_10_5_CFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
3009 VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
3010 VBOX_DARWIN_DEF_SDK_10_5_OBJCFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
3011 VBOX_DARWIN_DEF_SDK_10_5_OBJCXXFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
3012 VBOX_DARWIN_DEF_SDK_10_5_LDFLAGS := -mmacosx-version-min=10.5 -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK_10_5)" $(VBOX_DARWIN_NO_COMPACT_LINKEDIT)
3013 else
3014 VBOX_PATH_MACOSX_SDK_10_5 = $(error VBox: $(if $(target),$(target): ,)Using 10.5 SDK)
3015 VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.5 SDK)
3016 VBOX_DARWIN_DEF_SDK_10_5_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.5 SDK)
3017 endif
3018
3019 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5 10.6)
3020 VBOX_PATH_MACOSX_SDK_10_6 ?= $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.6.sdk
3021 VBOX_DARWIN_DEF_SDK_10_6_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1060 MAC_OS_X_VERSION_MAX_ALLOWED=1060
3022 VBOX_DARWIN_DEF_SDK_10_6_CFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3023 VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3024 VBOX_DARWIN_DEF_SDK_10_6_OBJCFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3025 VBOX_DARWIN_DEF_SDK_10_6_OBJCXXFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3026 VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS := -mmacosx-version-min=10.6 -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK_10_6)"
3027 else
3028 VBOX_PATH_MACOSX_SDK_10_6 = $(error VBox: $(if $(target),$(target): ,)Using 10.6 SDK)
3029 VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.6 SDK)
3030 VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.6 SDK)
3031 endif
3032
3033 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5 10.6 10.7)
3034 ifndef VBOX_PATH_MACOSX_SDK_10_7
3035 ifneq ($(wildcard $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.7.sdk),)
3036 VBOX_PATH_MACOSX_SDK_10_7 = $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.7.sdk
3037 else
3038 VBOX_PATH_MACOSX_SDK_10_7 = $(KBUILD_DEVTOOLS)/darwin.x86/SDKs/MacOSX10.7.sdk
3039 endif
3040 endif
3041 VBOX_DARWIN_DEF_SDK_10_7_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1070 MAC_OS_X_VERSION_MAX_ALLOWED=1070
3042 VBOX_DARWIN_DEF_SDK_10_7_CFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3043 VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3044 VBOX_DARWIN_DEF_SDK_10_7_OBJCFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3045 VBOX_DARWIN_DEF_SDK_10_7_OBJCXXFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3046 VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS := -mmacosx-version-min=10.7 -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK_10_7)"
3047 else
3048 VBOX_PATH_MACOSX_SDK_10_7 = $(error VBox: $(if $(target),$(target): ,)Using 10.7 SDK)
3049 VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.7 SDK)
3050 VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.7 SDK)
3051 endif
3052
3053 #
3054 # Use bison and flex from Xcode to avoid linking issues (bison).
3055 #
3056 TOOL_BISON_YACC ?= $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN_BIN_SLASH)bison
3057 TOOL_FLEX_LEX ?= $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN_BIN_SLASH)flex
3058
3059 #
3060 # Disable VMNet if the SDK is too old.
3061 #
3062 if defined(VBOX_WITH_VMNET) && "$(VBOX_DEF_MACOSX_VERSION_MIN)" vlt "10.15"
3063 VBOX_WITH_VMNET :=
3064 endif
3065
3066endif # target=darwin
3067
3068#
3069# Macro switching between @executable_path, @rpath and /Applications/VirtualBox.app
3070# depending on whether the build is hardened or not (dylib install_name).
3071#
3072ifeq ($(KBUILD_TARGET),darwin)
3073 ifndef VBOX_DYLD_EXECUTABLE_PATH
3074 ifdef VBOX_WITH_HARDENING
3075 VBOX_DYLD_EXECUTABLE_PATH = $(VBOX_PATH_APP_PRIVATE_ARCH)
3076 else if 0
3077 VBOX_DYLD_EXECUTABLE_PATH = @executable_path
3078 else
3079 VBOX_DYLD_EXECUTABLE_PATH = @rpath
3080 VBOX_WITH_RELATIVE_RUNPATH = @loader_path/
3081 endif
3082 endif
3083endif
3084
3085#
3086# Check for incompatible rpath combinations.
3087#
3088if defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_ORIGIN)
3089 $(error VBox: VBOX_WITH_RUNPATH and VBOX_WITH_ORIGIN are mutually exclusive)
3090endif
3091if defined(VBOX_WITH_RELATIVE_RUNPATH) && defined(VBOX_WITH_ORIGIN)
3092 $(error VBox: VBOX_WITH_RELATIVE_RUNPATH and VBOX_WITH_ORIGIN are mutually exclusive)
3093endif
3094if defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_RELATIVE_RUNPATH)
3095 $(error VBox: VBOX_WITH_RUNPATH and VBOX_WITH_RELATIVE_RUNPATH are mutually exclusive)
3096endif
3097if defined(VBOX_WITH_RELATIVE_RUNPATH) && defined(VBOX_WITH_HARDENING)
3098 $(error VBox: VBOX_WITH_RELATIVE_RUNPATH and VBOX_WITH_HARDENING are mutually exclusive)
3099endif
3100
3101#
3102# VBOX_WITH_ORIGIN translates into VBOX_WITH_RELATIVE_RUNPATH.
3103#
3104# We use two helper variables for the VBOX_WITH_ORIGIN stuff:
3105# VBOX_ORIGIN - Indirect expansion trick.
3106# VBOX_GCC_RPATH_OPT - Different GCC/LD combinations needs different options.
3107#
3108VBOX_ORIGIN = $$ORIGIN
3109ifeq ($(KBUILD_TARGET),solaris)
3110 VBOX_GCC_RPATH_OPT = -R
3111else
3112 VBOX_GCC_RPATH_OPT = -Wl,-rpath,
3113 VBOX_GCC_ORIGIN_OPT = -Wl,-z,origin
3114endif
3115ifdef VBOX_WITH_ORIGIN
3116 VBOX_WITH_RELATIVE_RUNPATH = $$(VBOX_ORIGIN)
3117endif
3118
3119
3120#
3121# Configure 'asan' type builds.
3122#
3123# We ASSUME that anyone doing this kind of build on linux has a compiler
3124# with sanitizer support (otherwise we'd end up with a circular dependency
3125# with DynamicConfig.kmk here to check the compiler version).
3126#
3127ifeq ($(KBUILD_TYPE),asan)
3128 if "$(KBUILD_TARGET)" == "linux"
3129 VBOX_WITH_GCC_SANITIZER := 1
3130 else if "$(KBUILD_TARGET)" == "darwin"
3131 VBOX_WITH_GCC_SANITIZER := 1
3132 else if "$(KBUILD_TARGET)" == "win"
3133 VBOX_WITH_VCC_SANITIZER := 1
3134 else
3135 VBOX_WITH_EF_WRAPS := 1
3136 endif
3137endif
3138
3139#
3140# The address sanitiser library intercepts dlopen() and breaks RPATH $ORIGIN,
3141# so we need to link it statically or set LD_LIBRARY_PATH. To link statically,
3142# set VBOX_WITH_GCC_SANITIZER_STATIC in addition.
3143#
3144ifdef VBOX_WITH_GCC_SANITIZER
3145 VBOX_GCC_SANITIZER_FLAGS := \
3146 -fsanitize=undefined \
3147 -fsanitize=address \
3148 -fsanitize=return \
3149 -fsanitize=bounds \
3150 -fsanitize=object-size \
3151 -fno-sanitize=alignment \
3152 -fno-sanitize=vptr \
3153 -fno-common \
3154 -DIPRT_WITH_GCC_SANITIZER \
3155 -DVBOX_WITH_GCC_SANITIZER
3156else ifdef VBOX_WITH_CLANG_SANITIZER ## @todo make work...
3157 VBOX_GCC_SANITIZER_FLAGS := \
3158 -DIPRT_WITH_GCC_SANITIZER \
3159 -DVBOX_WITH_GCC_SANITIZER \
3160 -fsanitize=object-size \
3161 -fsanitize-undefined-trap-on-error
3162else
3163 VBOX_GCC_SANITIZER_FLAGS =
3164endif
3165
3166# -libasan-static is currently not supported in combination with -no-undefined.
3167VBOX_GCC_NO_UNDEFINED :=
3168VBOX_GCC_NO_UNDEFINED_R0 :=
3169ifdef VBOX_WITH_GCC_SANITIZER
3170 ifdef VBOX_WITH_GCC_SANITIZER_STATIC
3171 VBOX_GCC_NO_UNDEFINED := -Wl,--no-undefined
3172 VBOX_GCC_NO_UNDEFINED_R0 := -no-undefined
3173 VBOX_GCC_SANITIZER_LDFLAGS += -static-libasan
3174 else
3175 if "$(KBUILD_TARGET)" == "darwin"
3176 VBOX_GCC_SANITIZER_LDFLAGS += -fsanitize=address
3177 else
3178 VBOX_GCC_SANITIZER_LDFLAGS += -lasan
3179 endif
3180 endif
3181endif
3182
3183# The config for Visual C++ 2019 update 9 and later.
3184ifdef VBOX_WITH_VCC_SANITIZER
3185 VBOX_VCC_SANITIZER_FLAGS := -fsanitize=address -fno-sanitize-address-vcasan-lib
3186 # experimental: VBOX_VCC_SANITIZER_FLAGS += /fsanitize-address-use-after-return
3187 VBOX_VCC_SANITIZER_LDFLAGS :=
3188else
3189 VBOX_VCC_SANITIZER_FLAGS :=
3190 VBOX_VCC_SANITIZER_LDFLAGS :=
3191endif
3192
3193
3194#
3195# The X11 headers.
3196#
3197VBOX_PATH_X11_ROOT = $(PATH_ROOT)/src/VBox/Additions/x11/x11include
3198
3199
3200#
3201# Miscellaneous includes
3202#
3203VBOX_GRAPHICS_INCS = $(PATH_ROOT)/include/VBox/Graphics
3204VBOX_JPEG_INCS = $(PATH_ROOT)/src/libs/libjpeg-turbo-2.1.3
3205
3206
3207# The icons to use.
3208ifdef VBOX_OSE
3209 VBOX_WINDOWS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/OSE/VirtualBox_win.ico
3210 VBOX_WINDOWS_ADDITIONS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/OSE/VirtualBox_win.ico
3211 VBOX_NSIS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/OSE/VirtualBox_win.ico
3212 VBOX_MACOSX_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/darwin/OSE/VirtualBox.icns
3213else
3214 VBOX_WINDOWS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/NonOSE/VirtualBox-vista.ico
3215 VBOX_WINDOWS_ADDITIONS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/NonOSE/VirtualBoxGA-vista.ico
3216 VBOX_NSIS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/NonOSE/VirtualBoxGA-nsis.ico
3217 VBOX_MACOSX_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/darwin/NonOSE/VirtualBox.icns
3218 ifeq ($(KBUILD_HOST),win)
3219 TOOL_VCC80X86_RC := $(KBUILD_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
3220 TOOL_VCC80AMD64_RC := $(KBUILD_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
3221 TOOL_VCC70_RC := $(KBUILD_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
3222 endif
3223endif
3224
3225
3226ifndef VBOX_NOINC_DYNAMIC_CONFIG_KMK
3227 #
3228 # GCC, YASM, PyLint, ++ dynamic properties.
3229 #
3230 # Most of this is resolved on first kmk invocation and cached in PATH_OUT.
3231 #
3232 # Note! That a harmless warning is printed if the file doesn't exist.
3233 # Note! Changes in GCC are not detected automatically (yet).
3234 #
3235 ifndef CLOSEPAR
3236 CLOSEPAR := )
3237 endif
3238 if1of ($(KBUILD_HOST), os2 win)
3239 VBOX_DEV_NULL := nul
3240 VBOX_DEV_NULL_ALT := NUL
3241 else
3242 VBOX_DEV_NULL := /dev/null
3243 VBOX_DEV_NULL_ALT := /dev/./null
3244 endif
3245
3246 # GCC macros.
3247 ifdef VBOX_GCC_TOOL
3248 # Load the tools files first.
3249 if $(pos VBox,$(VBOX_GCC_TOOL)) > 0
3250 include $(KBUILD_TOOL_PATHS)/$(VBOX_GCC_TOOL).kmk
3251 else
3252 include $(KBUILD_PATH)/tools/$(VBOX_GCC_TOOL).kmk
3253 endif
3254 ifdef VBOX_GCC32_TOOL
3255 ifneq ($(VBOX_GCC_TOOL),$(VBOX_GCC32_TOOL))
3256 if $(pos VBox,$(VBOX_GCC32_TOOL)) > 0
3257 include $(KBUILD_TOOL_PATHS)/$(VBOX_GCC32_TOOL).kmk
3258 else
3259 include $(KBUILD_PATH)/tools/$(VBOX_GCC32_TOOL).kmk
3260 endif
3261 endif
3262 endif
3263
3264 # Note! The chcking for 'error: unknown warning option' is for clang on darwin not giving us a
3265 # non-zero exit code when using an invalid option here, but it does later on.
3266 VBOX_GCC_CHECK_EX_CC_CXX = $(shell \
3267 if $(1) $(subst -Wno-,-W,$(2)) -Werror -c -o $(VBOX_DEV_NULL) $(4) > $(VBOX_DEV_NULL) 2>&1; then \
3268 case "`LC_ALL=C $(1) $(subst -Wno-,-W,$(2)) -Werror -c -o $(VBOX_DEV_NULL) $(4) 2>&1`" in \
3269 "error: unknown warning option"*$(CLOSEPAR) echo "$(3)";; \
3270 *$(CLOSEPAR) echo "$(2)";; \
3271 esac; \
3272 else echo "$(3)"; fi; )
3273 VBOX_GCC_CHECK_EX_CC = $(call VBOX_GCC_CHECK_EX_CC_CXX,$(1),$(2),$(3),-xc $(PATH_OUT)/DynamicConfig.c)
3274 VBOX_GCC_CHECK_EX_CXX = $(call VBOX_GCC_CHECK_EX_CC_CXX,$(1),$(2),$(3),-xc++ $(PATH_OUT)/DynamicConfig.cpp)
3275 VBOX_GCC_CHECK_EX_LD = $(shell \
3276 if $(1) -Wl,$(2) $(if $(eq $(KBUILD_HOST),darwin),-Wl$(COMMA)-u$(COMMA)start -Wl$(COMMA)-undefined$(COMMA)dynamic_lookup,) \
3277 -nostdlib -o $(VBOX_DEV_NULL) -xc $(VBOX_DEV_NULL) > /dev/null 2>&1; \
3278 then echo "-Wl,$(2)"; else echo "$(3)"; fi; )
3279
3280 VBOX_GCC_CHECK_CC = $(call VBOX_GCC_CHECK_EX_CC, $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_CC),$1,$2)
3281 VBOX_GCC_CHECK_CXX = $(call VBOX_GCC_CHECK_EX_CXX, $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_CXX),$1,$2)
3282 VBOX_GCC_CHECK_LD = $(call VBOX_GCC_CHECK_EX_LD, $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_LD),$1,$2)
3283 ifdef VBOX_GCC32_TOOL
3284 VBOX_GCC32_CHECK_CXX = $(call VBOX_GCC_CHECK_EX_CXX, $(TOOL_$(VBOX_GCC32_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC32_TOOL)_CXX),$1,$2)
3285 endif
3286
3287 # This is kind of bad, the returned string needs to be re-evaluated before use.
3288 # The reason for this hack is that the windows kmk_ash cannot deal with $((1+1)). <-- no longer true.
3289 # Some versions of gcc (e.g. openSUSE11) return only major.minor on `gcc -dumpversion`.
3290 # gcc-5 of openSUSE42.1 only returns the major version on `gcc -dumpversion`!
3291 VBOX_GCC_VERSION = $(shell ($(1) -dumpfullversion 2>/dev/null || $(1) -dumpversion) | \
3292 $(SED_EXT) 's|\([0-9][0-9]*\)\.\{0,1\}\([0-9]\{0,\}\)\.\{0,1\}\([0-9]\{0,\}\).*|$$(expr 10000 * \1 + 100 * $$(firstword \2 0) + $$(firstword \3 0))|' )
3293 VBOX_CLANG_VERSION = $(shell $(1) --version | \
3294 $(SED_EXT) -n 's|.*version \([0-9][0-9]*\)\.\{0,1\}\([0-9]\{0,\}\)\.\{0,1\}\([0-9]\{0,\}\).*|$$(expr 10000 * \1 + 100 * $$(firstword \2 0) + $$(firstword \3 0))|p' )
3295 endif # VBOX_GCC_TOOL
3296
3297 # YASM macros
3298 if !defined(DONT_USE_YASM) && "$(intersects $(KBUILD_HOST_ARCH) $(KBUILD_TARGET_ARCH), x86 amd64 arm64)" != ""
3299 include $(KBUILD_PATH)/tools/YASM.kmk
3300 VBOX_YASM_CHECK = $(if-expr "$(shell $(TOOL_YASM_AS) -e -o $(VBOX_DEV_NULL) $1 - < /dev/null 2>&1)" == "",$(1),)
3301 endif
3302
3303 # NASM macros (input and output must differ with recent versions (strcmp)).
3304 if !defined(DONT_USE_NASM) && "$(intersects $(KBUILD_HOST_ARCH) $(KBUILD_TARGET_ARCH), x86 amd64 arm64)" != ""
3305 include $(KBUILD_PATH)/tools/NASM.kmk
3306 VBOX_NASM_CHECK = $(if-expr "$(shell $(TOOL_NASM_AS) -e -o $(VBOX_DEV_NULL) $1 $(VBOX_DEV_NULL_ALT) 2>&1)" == "",$(1),$(2))
3307 endif
3308
3309 # Figures the pylint version.
3310 VBOX_PYLINT_FIGURE_VERSION = $(shell $(1) --version 2> /dev/null \
3311 | $(SED_EXT) -n -e 's/pylint-[^[:blank:]]*/pylint/' \
3312 -e 's|^ *pylint *\([0-9][0-9]*\).\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$(DOLLAR)|$$(expr \1 * 10000 + \2 * 100 + \3)|p' )
3313
3314 # Java stuff.
3315 ifeq ($(KBUILD_TARGET),darwin)
3316 VBOX_JAVA_BIN_PATH = $(firstword $(wildcard \
3317 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands \
3318 /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands \
3319 $(if-expr $(VBOX_XCODE_VERSION_MAJOR) >= 4,/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands,) \
3320 $(if-expr $(VBOX_XCODE_VERSION_MAJOR) >= 10,/Library/Java/JavaVirtualMachines/jdk1.8.*.jdk/Contents/Home/bin,) \
3321 ) /usr/bin)
3322 VBOX_JAVA = $(VBOX_JAVA_BIN_PATH)/java
3323 VBOX_JAVAC = $(VBOX_JAVA_BIN_PATH)/javac
3324 VBOX_JAVAH = $(VBOX_JAVA_BIN_PATH)/javah
3325 VBOX_JAR = $(VBOX_JAVA_BIN_PATH)/jar
3326 VBOX_JAVADOC = $(VBOX_JAVA_BIN_PATH)/javadoc
3327 VBOX_WSIMPORT = $(VBOX_JAVA_BIN_PATH)/wsimport
3328 if $(VBOX_XCODE_VERSION_MAJOR) >= 4 # Lion (4.1-preview 5) has a broken CurrentJDK link. Blindly applying it to 4.0.
3329 VBOX_JAVA_INC = $(firstword $(wildcard \
3330 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers \
3331 /Library/Java/JavaVirtualMachines/jdk*1.8*.jdk/Contents/Home/include \
3332 ) )
3333 else
3334 VBOX_JAVA_INC = $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Headers
3335 endif
3336
3337 else # !darwin
3338
3339 ifeq ($(KBUILD_TARGET),linux)
3340 ifeq ($(origin VBOX_JAVA_HOME),undefined)
3341 # Add correct detection for you distro after the /usr/../java-6-sun line.
3342 VBOX_JAVA_HOME := $(firstword $(wildcard \
3343 $(KBUILD_DEVTOOLS)/linux.x86/jdk1.6.0_27 \
3344 /usr/lib/jvm/java-6-sun \
3345 /usr/lib/jvm/java-6-openjdk \
3346 /usr/lib/jvm/java-6-openjdk-i386 \
3347 /usr/lib/jvm/java-6-openjdk-amd64 \
3348 /usr/lib/jvm/java-7-openjdk-i386 \
3349 /usr/lib/jvm/java-7-openjdk-amd64 \
3350 /usr/lib/jvm/default-java \
3351 /usr/lib/jvm/java \
3352 /usr/lib/jvm/jre \
3353 \
3354 /usr/lib/jvm/sun-jdk-1.6 \
3355 ) /usr/lib/jvm/java-6-sun)
3356 endif
3357 endif
3358
3359 ifeq ($(KBUILD_TARGET),solaris)
3360 # VBOX_JAVA_HOME ?= /usr/jdk/jdk1.6.0
3361 VBOX_JAVA_HOME ?= $(firstword $(abspath $(wildcard \
3362 /usr/jdk/latest/include/.. \
3363 /usr/jdk/instances/jdk1.8*/include/.. \
3364 /usr/jdk/instances/jdk1.7*/include/.. \
3365 /usr/jdk/instances/jdk1.6*/include/.. \
3366 )) /usr/java)
3367 endif
3368
3369 ifeq ($(KBUILD_TARGET),win)
3370 VBOX_JAVA_HOME ?= c:/jdk
3371 endif
3372
3373 VBOX_JAVA_BIN_PATH ?= $(VBOX_JAVA_HOME)/bin
3374 VBOX_JAVA ?= "$(VBOX_JAVA_BIN_PATH)/java$(HOSTSUFF_EXE)"
3375 VBOX_JAVAC = "$(VBOX_JAVA_BIN_PATH)/javac$(HOSTSUFF_EXE)"
3376 VBOX_JAVAH = "$(VBOX_JAVA_BIN_PATH)/javah$(HOSTSUFF_EXE)"
3377 VBOX_JAR = "$(VBOX_JAVA_BIN_PATH)/jar$(HOSTSUFF_EXE)"
3378 VBOX_JAVADOC = "$(VBOX_JAVA_BIN_PATH)/javadoc$(HOSTSUFF_EXE)"
3379 # With Java 11 wsimport was removed, usually part of a separate install now.
3380 VBOX_WSIMPORT = $(firstword $(wildcard $(VBOX_JAVA_BIN_PATH)/wsimport$(HOSTSUFF_EXE)) wsimport$(HOSTSUFF_EXE))
3381 # correct for targets we care about
3382 VBOX_MD_OS = $(KBUILD_TARGET)
3383 VBOX_JAVA_INC = \
3384 $(VBOX_JAVA_HOME)/include \
3385 $(VBOX_JAVA_HOME)/include/$(VBOX_MD_OS)
3386 endif # !darwin
3387
3388 # The first transform the almost usless openjdk versions like "javac 9-Ubuntu" into something the 2nd expression groks.
3389 VBOX_JAVA_FIGURE_VERSION = $(shell $(1) -version 2>&1 \
3390 | $(SED_EXT) -n \
3391 -e 's/ \([0-9][0-9]*\)\(-[[:alpha:]][[:alpha:]]\)/ \1.0.0\2/' \
3392 -e 's|^[^ ]* *\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$(DOLLAR)|$$(expr \1 * 10000 + \2 * 100 + \3)|p' )
3393
3394
3395 # Test C and C++ files.
3396 $(PATH_OUT)/DynamicConfig.c $(PATH_OUT)/DynamicConfig.cpp:
3397 $(QUIET)$(MKDIR) -p $(@D)
3398 $(QUIET)$(APPEND) -tn "$@" "int foobar(void)" "{" " return 42;" "}" ""
3399
3400 # No $(QUIET) here as it's interesting to see what goes into the file.
3401 $(PATH_OUT)/DynamicConfig.kmk: \
3402 $(PATH_ROOT)/Config.kmk \
3403 $(LOCALCFG) \
3404 $(AUTOCFG) \
3405 $(VBOX_GCC_PATH_CC) \
3406 $(VBOX_GCC_PATH_CXX) \
3407 $(VBOX_GCC_LIBGCC) \
3408 $(VBOX_GCC32_PATH_CC) \
3409 $(VBOX_GCC32_PATH_CXX) \
3410 $(VBOX_GCC32_LIBGCC) \
3411 $(if-expr "$(KBUILD_HOST).$(KBUILD_HOST_ARCH)" == "solaris.amd64" && $(KBUILD_HOST_VERSION_MINOR) >= 11 \
3412 , /platform/i86pc/kernel/$(KBUILD_HOST_ARCH)/unix,) \
3413 | $(PATH_OUT)/DynamicConfig.c $(PATH_OUT)/DynamicConfig.cpp
3414 $(call MSG_GENERATE,,$@,)
3415 $(QUIET)$(RM) -f '$@'
3416 $(QUIET)$(MKDIR) -p $(@D)
3417 $(QUIET)$(APPEND) '$@' '# Host version: $(KBUILD_HOST_VERSION_MAJOR).$(KBUILD_HOST_VERSION_MINOR).$(KBUILD_HOST_VERSION_PATCH); full: $(KBUILD_HOST_VERSION)'
3418 ifneq ($(KBUILD_TARGET),win)
3419 $(QUIET)$(APPEND) '$@' '# $(KBUILD_HOST_UNAME_SYSNAME) - $(KBUILD_HOST_UNAME_RELEASE) - $(KBUILD_HOST_UNAME_VERSION)'
3420 endif
3421 ifeq ($(KBUILD_TARGET),darwin)
3422 $(QUIET)$(APPEND) '$@' '# VBOX_XCODE_VERSION: $(VBOX_XCODE_VERSION)'
3423 $(QUIET)$(APPEND) '$@' '# VBOX_PATH_MACOSX_TOOLCHAIN_ROOT: $(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)'
3424 $(QUIET)$(APPEND) '$@' '# VBOX_PATH_MACOSX_SDK_ROOT: $(VBOX_PATH_MACOSX_SDK_ROOT)'
3425 $(QUIET)$(APPEND) '$@' '# VBOX_PATH_MACOSX_DEVEL_ROOT: $(VBOX_PATH_MACOSX_DEVEL_ROOT)'
3426 endif
3427 ifdef VBOX_GCC_TOOL
3428 # HC compiler switch detection.
3429 $(QUIET)$(APPEND) '$@' '# VBOX_GCC_TOOL=$(VBOX_GCC_TOOL)'
3430 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CC))'
3431 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CXX))'
3432 if "$(KBUILD_TARGET)" == "darwin" || $(pos CLANG,$(VBOX_GCC_TOOL)) > 0
3433 $(QUIET)$(APPEND) '$@' 'VBOX_CLANG_VERSION_CC ?= $(call VBOX_CLANG_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CC))'
3434 $(QUIET)$(APPEND) '$@' 'VBOX_CLANG_VERSION_CXX ?= $(call VBOX_CLANG_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CXX))'
3435 endif
3436 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_PATH_CC ?= $(which $(TOOL_$(VBOX_GCC_TOOL)_CC))'
3437 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_PATH_CXX ?= $(which $(TOOL_$(VBOX_GCC_TOOL)_CXX))'
3438 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_LIBGCC ?= $(shell $(TOOL_$(VBOX_GCC_TOOL)_CC) -print-libgcc-file-name)'
3439 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-pointer-sign ?= $(call VBOX_GCC_CHECK_CC,-Wno-pointer-sign,)'
3440 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-array_bounds ?= $(call VBOX_GCC_CHECK_CC,-Wno-array-bounds,)'
3441 # -Wextra produces additional useful warnings but includes -Wno-missing-field-initializers (too noisy)
3442 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wextra ?= $(call VBOX_GCC_CHECK_CC,-Wextra,)'
3443 $(QUIET)$(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CC),)'
3444 $(QUIET)$(APPEND) '$@' ' if $$(VBOX_GCC_VERSION_CC) >= 40500'
3445 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_Wlogical-op ?= $(call VBOX_GCC_CHECK_CC,-Wlogical-op,)'
3446 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_Wno-logical-op ?= $$(subst -Wlogical-op,-Wno-logical-op,$$(VBOX_GCC_Wlogical-op))
3447 $(QUIET)$(APPEND) '$@' ' endif'
3448 $(QUIET)$(APPEND) '$@' 'endif'
3449 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-address ?= $(call VBOX_GCC_CHECK_CXX,-Wno-address,)'
3450 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-delete-non-virtual-dtor ?= $(call VBOX_GCC_CHECK_CXX,-Wno-delete-non-virtual-dtor,)'
3451 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-non-virtual-dtor ?= $(call VBOX_GCC_CHECK_CXX,-Wno-non-virtual-dtor,)'
3452 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-int-in-bool-context ?= $(call VBOX_GCC_CHECK_CC,-Wno-int-in-bool-context,)'
3453 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-int-to-pointer-cast ?= $(call VBOX_GCC_CHECK_CC,-Wno-int-to-pointer-cast,)'
3454 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-invalid-offsetof ?= $(call VBOX_GCC_CHECK_CXX,-Wno-invalid-offsetof,)'
3455 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-literal-suffix ?= $(call VBOX_GCC_CHECK_CXX,-Wno-literal-suffix,)'
3456 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-misleading-indentation ?= $(call VBOX_GCC_CHECK_CC,-Wno-misleading-indentation,)'
3457 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-missing-field-initializers ?= $(call VBOX_GCC_CHECK_CC,-Wno-missing-field-initializers,)'
3458 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-pointer-to-int-cast ?= $(call VBOX_GCC_CHECK_CC,-Wno-pointer-to-int-cast,)'
3459 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-variadic-macros ?= $(call VBOX_GCC_CHECK_CXX,-Wno-variadic-macros,)'
3460 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-vla ?= $(call VBOX_GCC_CHECK_CXX,-Wno-vla,)'
3461 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-overlength-strings ?= $(call VBOX_GCC_CHECK_CC,-Wno-overlength-strings,)'
3462 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-overloaded-virtual ?= $(call VBOX_GCC_CHECK_CXX,-Wno-overloaded-virtual,)'
3463 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-ignored-qualifiers ?= $(call VBOX_GCC_CHECK_CXX,-Wno-ignored-qualifiers,)'
3464 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-multistatement-macros ?= $(call VBOX_GCC_CHECK_CXX,-Wno-multistatement-macros,)'
3465 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-class-memaccess ?= $(call VBOX_GCC_CHECK_CXX,-Wno-class-memaccess,)'
3466 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-stringop-overflow ?= $(call VBOX_GCC_CHECK_CXX,-Wno-stringop-overflow,)'
3467 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-stringop-truncation ?= $(call VBOX_GCC_CHECK_CXX,-Wno-stringop-truncation,)'
3468 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-cast-function-type ?= $(call VBOX_GCC_CHECK_CC,-Wno-cast-function-type,)'
3469 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-deprecated-declarations ?= $(call VBOX_GCC_CHECK_CC,-Wno-deprecated-declarations,)'
3470 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-implicit-fallthrough ?= $(call VBOX_GCC_CHECK_CC,-Wno-implicit-fallthrough,)'
3471 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-inline ?= $(call VBOX_GCC_CHECK_CXX,-Wno-inline,)'
3472 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-unknown-pragmas ?= $(call VBOX_GCC_CHECK_CXX,-Wno-unknown-pragmas,)'
3473 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-deprecated-copy ?= $(call VBOX_GCC_CHECK_CXX,-Wno-deprecated-copy,)'
3474 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fno-stack-protector ?= $(call VBOX_GCC_CHECK_CC,-fno-stack-protector,)'
3475 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fno-dwarf2-cfi-asm ?= $(call VBOX_GCC_CHECK_CC,-fno-dwarf2-cfi-asm,)'
3476 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_m64 ?= $(call VBOX_GCC_CHECK_CC,-m64,)'
3477 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_msse4.1 ?= $(call VBOX_GCC_CHECK_CC,-msse4.1,)'
3478 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mavx ?= $(call VBOX_GCC_CHECK_CC,-mavx,)'
3479 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mavx2 ?= $(call VBOX_GCC_CHECK_CC,-mavx2,)'
3480 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_no-pie ?= $(call VBOX_GCC_CHECK_CC,-no-pie,)'
3481 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fdiagnostics-show-option ?= $(call VBOX_GCC_CHECK_CC,-fdiagnostics-show-option,)'
3482 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fno-printf-return-value ?= $(call VBOX_GCC_CHECK_CC,-fno-printf-return-value,)'
3483 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wa_cma_nocompress_debug_sections ?= $(call VBOX_GCC_CHECK_CC,-Wa$(COMMA)--nocompress-debug-sections,)'
3484 # Produce code optimized for the most common IA32/AMD64/EM64T processors. Introduced with gcc version 4.2.
3485 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mtune-generic ?= $(call VBOX_GCC_CHECK_CC,-mtune=generic,)'
3486 $(QUIET)$(APPEND) '$@' 'VBOX_LD_as_needed ?= $(call VBOX_GCC_CHECK_LD,--as-needed,)'
3487 $(QUIET)$(APPEND) '$@' 'VBOX_LD_hash_style_sysv ?= $(call VBOX_GCC_CHECK_LD,--hash-style=sysv,)'
3488 $(QUIET)$(APPEND) '$@' 'VBOX_LD_gc_sections ?= $(call VBOX_GCC_CHECK_LD,--gc-sections,)'
3489 # Set default attribute for ELF and MACH-O symbols to ``hidden'' to reduce the number
3490 # of relocation entries and PLT indirections in shared libraries. Don't allow for gcc version < 4.
3491 $(QUIET)$(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CC),)'
3492 $(QUIET)$(APPEND) '$@' ' if $$(VBOX_GCC_VERSION_CC) >= 40000'
3493 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_fvisibility-hidden ?= $(call VBOX_GCC_CHECK_CC,-fvisibility=hidden -DVBOX_HAVE_VISIBILITY_HIDDEN -DRT_USE_VISIBILITY_DEFAULT,)'
3494 $(QUIET)$(APPEND) '$@' ' endif'
3495 $(QUIET)$(APPEND) '$@' 'endif'
3496 ifn1of ($(KBUILD_TARGET), haiku)
3497 # Set default attribute for inline functions to ``hidden'' to reduce the number
3498 # of relocation entries and PLT indirections in shared libraries. Don't allow for gcc version < 4.
3499 $(QUIET)$(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CXX),)'
3500 $(QUIET)$(APPEND) '$@' ' if $$(VBOX_GCC_VERSION_CXX) >= 40000'
3501 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_fvisibility-inlines-hidden ?= $(call VBOX_GCC_CHECK_CXX,-fvisibility-inlines-hidden,)'
3502 $(QUIET)$(APPEND) '$@' ' endif'
3503 $(QUIET)$(APPEND) '$@' 'endif'
3504 endif
3505 # Prevent warnings about unused parameters as of gcc-4.8 / clang 6 as this warning is now very verbose
3506 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-unused-parameter ?= $(call VBOX_GCC_CHECK_CC,-Wno-unused-parameter,)'
3507 # Clang 6.
3508 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-language-extension-token ?= $(call VBOX_GCC_CHECK_CC,-Wno-language-extension-token,)'
3509 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-extended-offsetof ?= $(call VBOX_GCC_CHECK_CC,-Wno-extended-offsetof,)'
3510 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-gnu-folding-constant ?= $(call VBOX_GCC_CHECK_CC,-Wno-gnu-folding-constant,)'
3511 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-return-type-c-linkage ?= $(call VBOX_GCC_CHECK_CXX,-Wno-return-type-c-linkage,)'
3512 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-string-plus-int ?= $(call VBOX_GCC_CHECK_CC,-Wno-string-plus-int,)'
3513 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-nested-anon-types ?= $(call VBOX_GCC_CHECK_CC,-Wno-nested-anon-types,)'
3514 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-gnu-anonymous-struct ?= $(call VBOX_GCC_CHECK_CXX,-Wno-gnu-anonymous-struct,)'
3515 # Clang 11.
3516 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-c++17-compat-mangling ?= $(call VBOX_GCC_CHECK_CXX,-Wno-c++17-compat-mangling,)'
3517 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-nullability-extension ?= $(call VBOX_GCC_CHECK_CXX,-Wno-nullability-extension,)'
3518 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-gnu-statement-expression ?= $(call VBOX_GCC_CHECK_CXX,-Wno-gnu-statement-expression,)'
3519 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-import-preprocessor-directive-pedantic ?= $(call VBOX_GCC_CHECK_CXX,-Wno-import-preprocessor-directive-pedantic,)'
3520 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-undefined-var-template ?= $(call VBOX_GCC_CHECK_CXX,-Wno-undefined-var-template,)'
3521 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-c11-extensions ?= $(call VBOX_GCC_CHECK_CXX,-Wno-c11-extensions,)'
3522 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-tautological-pointer-compare ?= $(call VBOX_GCC_CHECK_CC,-Wno-tautological-pointer-compare,)'
3523 # Clang 13.
3524 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-deprecated-copy ?= $(call VBOX_GCC_CHECK_CC,-Wno-deprecated-copy,)'
3525 ifdef VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION
3526 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fcf-protection_branch ?= $(call VBOX_GCC_CHECK_CXX,-fcf-protection=branch,)'
3527 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fcf-protection_check ?= $(call VBOX_GCC_CHECK_CXX,-fcf-protection=check)'
3528 endif
3529 ifeq ($(KBUILD_TARGET),solaris)
3530 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_msave-args ?= $(call VBOX_GCC_CHECK_CXX,-msave-args,)'
3531 # Detect the solaris assembler. It is used by the the 4.x gcc compilers,
3532 # apparently. It will not be able to handle IEMAll via a -pipe, only when
3533 # passed a file. The solaris assmbler rulez ... not!
3534 $(QUIET)$(APPEND) '$@' 'VBOX_AS_VERSION ?= $(shell `gcc -print-prog-name=as` -V -o $(VBOX_DEV_NULL) < /dev/null 2>&1 | kmk_sed -e '1!d' -e 's/^as: *//' )'
3535 $(QUIET)$(APPEND) '$@' 'if $$(pos Sun Compiler Common,$$(VBOX_AS_VERSION)) > 0'
3536 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_USING_SOLARIS_AS = 1'
3537 $(QUIET)$(APPEND) '$@' 'endif'
3538 $(QUIET)$(APPEND) '$@' 'ifndef VBOX_GCC_USING_SOLARIS_AS'
3539 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_pipe ?= -pipe'
3540 $(QUIET)$(APPEND) '$@' 'endif'
3541 else
3542 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_pipe ?= -pipe'
3543 endif
3544 # Find the compiler includes for IPRT no-crt.
3545 # Note that `$(dir $(gcc -print-libgcc-file-name))/include does not work for a 64-bit cross build on a 32-bit build host.
3546 $(QUIET)$(APPEND) '$@' 'VBOX_PATH_GCC_INCS ?= $(shell LC_ALL=C $(TOOL_$(VBOX_GCC_TOOL)_CC) -print-search-dirs|$(SED_EXT) -ne 's+^install: \(.*[^/][^/]*\)/+\1+p')/include'
3547 ifdef VBOX_GCC32_TOOL
3548 # 32-bit (GC) compiler switch detection.
3549 $(QUIET)$(APPEND) '$@' '# VBOX_GCC32_TOOL=$(VBOX_GCC32_TOOL)'
3550 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_PATH_CC ?= $(which $(TOOL_$(VBOX_GCC32_TOOL)_CC))'
3551 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_PATH_CXX ?= $(which $(TOOL_$(VBOX_GCC32_TOOL)_CXX))'
3552 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC32_TOOL)_CC))'
3553 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC32_TOOL)_CXX))'
3554 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_LIBGCC ?= $(shell $(TOOL_$(VBOX_GCC32_TOOL)_CC) -print-libgcc-file-name)'
3555 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_Wno-variadic-macros ?= $(call VBOX_GCC32_CHECK_CXX,-Wno-variadic-macros,)'
3556 endif
3557 # darwin no_compact_linkedit starting at Xcode 3.2
3558 ifeq ($(KBUILD_HOST),darwin)
3559 $(QUIET)$(APPEND) '$@' 'VBOX_LD_no_compact_linkedit ?= $(call VBOX_GCC_CHECK_LD,-no_compact_linkedit,)'
3560 endif
3561 endif # ifdef VBOX_GCC_TOOL
3562
3563 ifdef VBOX_YASM_CHECK
3564 # YASM
3565 $(QUIET)$(APPEND) '$@' '# debug: TOOL_YASM_AS="$(TOOL_YASM_AS)"'
3566 $(QUIET)$(APPEND) '$@' 'VBOX_YASM_Wno-segreg-in-64bit ?= $(call VBOX_YASM_CHECK,-Wno-segreg-in-64bit,)'
3567 endif
3568 ifdef VBOX_NASM_CHECK
3569 # NASM (--allow-64-bit: 2.12rc2)
3570 $(QUIET)$(APPEND) '$@' 'VBOX_NASM_allow_64_bit ?= $(call VBOX_NASM_CHECK,--allow-64-bit,)'
3571 endif
3572
3573 if1of ($(KBUILD_TARGET), linux)
3574 ifeq ($(KBUILD_TARGET),$(KBUILD_HOST))
3575 $(QUIET)$(RM) -f -- "$@.sanitizer.so" "$@.sanitizer32.so" '$@.sanitizer.c'
3576 $(APPEND) -t '$@.sanitizer.c' 'int foo() { return 42; }'
3577 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_SANITIZER_SO_FILES := \'
3578 $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_CC) -fPIC -shared \
3579 $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS) -o "$@.sanitizer.so" "$@.sanitizer.c"
3580 ldd "$@.sanitizer.so" | $(SED_EXT) --append '$@' -re '/lib(a|ub)san\.so/!d' -e 's/.* => //' -e 's/ \(0x[0-9a-fA-F]*\) *$(DOLLAR)/ \\/'
3581 $(QUIET)$(APPEND) '$@' ''
3582 # $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_SANITIZER_SO_FILES := \'
3583 # $(TOOL_$(VBOX_GCC32_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC32_TOOL)_CC) -fPIC -shared \
3584 # $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS) -o "$@.sanitizer32.so" "$@.sanitizer.c"
3585 # ldd "$@.sanitizer32.so" | $(SED_EXT) --append '$@' -re '/lib(a|ub)san\.so/!d' -e 's/.* => //' -e 's/ \(0x[0-9a-fA-F]*\) *$(DOLLAR)/ \\/'
3586 # $(QUIET)$(APPEND) '$@' ''
3587 $(QUIET)$(RM) -f -- "$@.sanitizer.so" "$@.sanitizer32.so" '$@.sanitizer.c'
3588 endif
3589 endif
3590 ifdef VBOX_PATH_PREFIX_MINGW32
3591 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW32)gcc -m32)'
3592 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW32)g++ -m32)'
3593 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_Wno-array-bounds ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW32)g++ -m32,-Wno-array-bounds,)'
3594 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_Wno-unused-but-set-variable ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW32)g++ -m32,-Wno-unused-but-set-variable,)'
3595 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_Wno-maybe-uninitialized ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW32)g++ -m32,-Wno-maybe-uninitialized,)'
3596 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_USER_LABEL_PREFIX ?= $(shell echo "__USER_LABEL_PREFIX__" | $(VBOX_PATH_PREFIX_MINGW32)g++ -m32 -E -xc++ - | $(SED) -e "/^$(HASH)/d")'
3597 endif
3598 ifdef VBOX_PATH_PREFIX_MINGW64
3599 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW64)gcc -m64)'
3600 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW64)g++ -m64)'
3601 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_Wno-array-bounds ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW64)g++ -m64,-Wno-array-bounds,)'
3602 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_Wno-unused-but-set-variable ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW64)g++ -m64,-Wno-unused-but-set-variable,)'
3603 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_Wno-maybe-uninitialized ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW64)g++ -m64,-Wno-maybe-uninitialized,)'
3604 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_USER_LABEL_PREFIX ?= $(shell echo "__USER_LABEL_PREFIX__" | $(VBOX_PATH_PREFIX_MINGW64)g++ -m64 -E -xc++ - | $(SED) -e "/^$(HASH)/d")'
3605 endif
3606 if defined(TOOL_FLEX) || defined(TOOL_BISON)
3607 echo "Do NOT include the flex or bison tools before Config.kmk gets loaded"
3608 exit 1 #
3609 endif
3610 $(QUIET)$(APPEND) '$@' 'VBOX_HAVE_FLEX ?= $(firstfile $(TOOL_FLEX_LEX) $(which flex))'
3611 $(QUIET)$(APPEND) '$@' 'VBOX_HAVE_BISON ?= $(firstfile $(TOOL_BISON_YACC) $(which bison))'
3612 if "$(KBUILD_HOST)" == "solaris" && $(KBUILD_HOST_VERSION_MAJOR) == 5 && $(KBUILD_HOST_VERSION_MINOR) == 11
3613 # BRANCH_VERSION format on S11 - S11.3:
3614 # <trunk_id>.<update>.<sru>.<reserved>.<buildid>.<nightly_id>
3615 # e.g.: 0.175.3.32.0.4.0:20180427T232405Z - N.B. trunk_id = 0.175
3616 # BRANCH_VERSION format on S11.4:
3617 # <minor>.<update>.<sru>.<reserved>.<reserved>.<buildid>.<nightly_id>
3618 # e.g.: 11.4.0.0.1.10.0:20180702T173343Z
3619 # We're interested in <update> and <buildid>.
3620 $(QUIET)$(APPEND) '$@' "VBOX_SOLARIS_11_BRANCH_VERSION := $(shell pkg contents -H -t set -o pkg.fmri system/kernel | $(SED_EXT) -e '1!d' -e 's/^.*\-//;s/\:.*//;s/.*,//')"
3621 $(QUIET)$(APPEND) '$@' 'ifeq ($$(word 2, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION))),175)'
3622 $(QUIET)$(APPEND) '$@' ' VBOX_SOLARIS_11_UPDATE_VERSION := $$(word 3, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION)))'
3623 $(QUIET)$(APPEND) '$@' 'else'
3624 $(QUIET)$(APPEND) '$@' ' VBOX_SOLARIS_11_UPDATE_VERSION := $$(word 2, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION)))'
3625 $(QUIET)$(APPEND) '$@' 'endif'
3626 $(QUIET)$(APPEND) '$@' 'VBOX_SOLARIS_11_BUILD_VERSION := $$(word 6, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION)))'
3627 endif
3628 if1of ($(KBUILD_HOST), darwin freebsd solaris)
3629 $(QUIET)$(APPEND) '$@' 'VBOX_HOST_DTRACE_VERSION := $(shell dtrace -V)'
3630 endif
3631 if defined(VBOX_PYLINT) && !defined(VBOX_WITH_PYLINT_PRE_V1_0) && !defined(VBOX_WITH_PYLINT_V1_1_PLUS) && !defined(VBOX_WITH_PYLINT_V1_2_1_PLUS)
3632 $(QUIET)$(APPEND) '$@' "VBOX_PYLINT_VERSION := $(call VBOX_PYLINT_FIGURE_VERSION, $(VBOX_PYLINT))"
3633 endif
3634 if defined(VBOX_JAVAC)
3635 $(QUIET)$(APPEND) '$@' 'VBOX_JAVA_VERSION := $(call VBOX_JAVA_FIGURE_VERSION, $(VBOX_JAVAC))'
3636 endif
3637 $(QUIET)$(APPEND) '$@' '#$(which $(VBOX_XSLTPROC))'
3638 $(QUIET)$(APPEND) '$@' 'VBOX_XSLTPROC_VERSION := $(firstword $(shell $(VBOX_XSLTPROC) --version | $(SED) -e /libxslt/q | $(SED) -e 's/^.*libxslt \([0-9][0-9]*\)[^0-9]*.*/\1/' ) 0)'
3639 $(QUIET)$(APPEND) '$@' 'VBOX_XSLTPROC_LIBXML_VERSION := $(firstword $(shell $(VBOX_XSLTPROC) --version | $(SED) -e /libxml/q | $(SED) -e 's/^.*libxml \([0-9][0-9]*\)[^0-9]*.*/\1/' ) 0)'
3640
3641 $(QUIET)$(ECHO) '========= START OF $@ ========='
3642 $(QUIET)$(CAT) $@
3643 $(QUIET)$(ECHO) '=========== END OF $@ ========='
3644
3645 include $(PATH_OUT)/DynamicConfig.kmk
3646endif # !VBOX_NOINC_DYNAMIC_CONFIG_KMK
3647
3648
3649#
3650# C++ language level
3651# See https://en.cppreference.com/w/cpp/compiler_support and compiler docs.
3652#
3653## @todo consider maxing this out.
3654ifndef VBOX_GCC_std
3655 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.arm64) # Go straight for c++17 here.
3656 VBOX_GCC_std := -std=c++17
3657 # else if "$(VBOX_CLANG_VERSION_CXX)" vge 60000 # Most language features complete by v6. Lib stuff was less complete in v6, but hopefully acceptable for out purposes.
3658 #VBOX_GCC_std := -std=c++17
3659 else if "$(VBOX_CLANG_VERSION_CXX)" vge 50000 # darwin Xcode 5 allegedly knows what C++11 is
3660 VBOX_GCC_std := -std=c++11
3661 # else if "$(VBOX_GCC_VERSION_CXX)" vge 70000 # Language feature P0512R0 was v8, rest v7 or earlier. Most lib stuff present in 7, complete in v12.
3662 #VBOX_GCC_std := -std=gnu++17
3663 else if "$(VBOX_GCC_VERSION_CXX)" vge 40800
3664 VBOX_GCC_std := -std=c++11
3665 else if "$(VBOX_GCC_VERSION_CXX)" vge 40600
3666 VBOX_GCC_std := -std=c++0x
3667 endif
3668endif
3669ifndef VBOX_VCC_std
3670 if $(VBOX_VCC_TOOL_STEM) >= VCC141 # since 2017 15.3
3671 VBOX_VCC_std := -Zc:__cplusplus -std:c++17
3672 endif
3673endif
3674
3675
3676#
3677# Compiler warning control.
3678#
3679VBOX_GCC_WARN ?= -Wall $(VBOX_GCC_Wextra) $(VBOX_GCC_Wno-missing-field-initializers) -Wno-unused -Wno-trigraphs \
3680 $(VBOX_GCC_fdiagnostics-show-option) $(VBOX_GCC_Wno-unused-parameter) $(VBOX_GCC_Wno-language-extension-token) \
3681 $(VBOX_GCC_Wno-extended-offsetof) $(VBOX_GCC_Wno-gnu-folding-constant) $(VBOX_GCC_Wno-gnu-anonymous-struct) \
3682 $(VBOX_GCC_Wlogical-op) $(VBOX_GCC_Wno-string-plus-int) $(VBOX_GCC_Wno-nested-anon-types) $(VBOX_GCC_Wno-variadic-macros) \
3683 $(VBOX_GCC_Wno-c++17-compat-mangling)
3684VBOX_GCC_WARN_PEDANTIC = -Wshadow $(VBOX_GCC_WARN) -Wno-long-long
3685if $(VBOX_GCC_VERSION_CXX) >= 40200 || defined(VBOX_WITH_MASOCHISTIC_WARNINGS) # gcc 4.2.x+ (4.1.2 is causing trouble with the extpack & add builds)
3686 VBOX_GCC_WARN_MASOCHISTIC ?= -Wunused-variable -Wunused-function -Wunused-label -Wunused-parameter
3687endif
3688if $(KBUILD_TARGET) == "linux" \
3689 || ($(KBUILD_TARGET) == "darwin" && "$(VBOX_GCC_TOOL)" != "GXX4MACHO" && "$(VBOX_GCC_TOOL)" != "GXX42MACHO") \
3690 || defined(VBOX_WITH_MASOCHISTIC_WARNINGS)
3691 VBOX_GCC_WARN_PEDANTIC += $(VBOX_GCC_WARN_MASOCHISTIC)
3692endif
3693
3694ifdef VBOX_GCC_Wno-variadic-macros # Don't use -pedantic unless -Wno-variadic-macros also works. Too noisy.
3695 VBOX_GCC_PEDANTIC_OPTION ?= -pedantic
3696else
3697 VBOX_GCC_PEDANTIC_OPTION ?=
3698endif
3699VBOX_GCC_PEDANTIC_CXX ?= $(VBOX_GCC_PEDANTIC_OPTION) $(VBOX_GCC_WARN_PEDANTIC) \
3700 $(VBOX_GCC_Wno-return-type-c-linkage) $(VBOX_GCC_Wno-overloaded-virtual) $(VBOX_GCC_Wno-undefined-var-template) $(VBOX_GCC_Wno-deprecated-copy)
3701VBOX_GCC_PEDANTIC_C ?= $(VBOX_GCC_PEDANTIC_OPTION) $(VBOX_GCC_WARN_PEDANTIC) -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Werror-implicit-function-declaration
3702
3703# Avoid freaking out when using flexible arrays in C++ code (ldrPE.cpp, ++).
3704if ($(VBOX_GCC_VERSION_CXX) < 60100 || $(VBOX_GCC_VERSION_CXX) >= 70000) && "$(VBOX_GCC_Wno-array_bounds)" != ""
3705 VBOX_GCC_PEDANTIC_CXX += $(VBOX_GCC_Wno-array_bounds)
3706endif
3707# Stupid problem with (__typeof__((*ppv)) casts in asm.h where volatile is involved and ignored.
3708if $(VBOX_GCC_VERSION_CXX) >= 80000 && "$(VBOX_GCC_Wno-ignored-qualifiers)"
3709 VBOX_GCC_PEDANTIC_CXX += $(VBOX_GCC_Wno-ignored-qualifiers)
3710endif
3711
3712
3713VBOX_GCC_NON_PEDANTIC_CXX ?= -Wno-sign-compare
3714VBOX_GCC_NON_PEDANTIC_C ?= -Wno-sign-compare -Werror-implicit-function-declaration
3715
3716if "$(KBUILD_TARGET)" == "darwin" && "$(VBOX_GCC_TOOL)" != "GXX4MACHO" && "$(VBOX_GCC_TOOL)" != "GXX42MACHO"
3717 VBOX_GCC_PEDANTIC_CXX += -Wno-c99-extensions
3718 VBOX_GCC_NON_PEDANTIC_CXX += -Wno-c99-extensions
3719endif
3720
3721
3722# Disabled Visual C++ warnings, W4:
3723# -wd4065: switch statement contains 'default' but no 'case' labels
3724# -wd4996: deprecated / insecure.
3725# -wd4127: conditional expression is constant [level 4]
3726# -wd4706: assignment within conditional expression [level 4]
3727# -wd4201: nonstandard extension used : nameless struct/union [level 4]
3728# -wd4214: nonstandard extension used : bit field types other than int [level 4]
3729# -wd4510: 'VM::<unnamed-tag>' : default constructor could not be generated
3730# -wd4512: 'VM' : assignment operator could not be generated
3731# -wd4610: union 'VM::<unnamed-tag>' can never be instantiated - user defined constructor required
3732# Disabled Visual C++ warnings, Wall:
3733# -wd4514: unreferenced inline function has been removed
3734# -wd4820: 'RTSTRSPACECORE' : '7' bytes padding added after data member 'RTSTRSPACECORE::uchHeight'
3735# -wd4365: '=' : conversion from 'unsigned char' to 'char', signed/unsigned mismatch
3736# -wd4987: nonstandard extension used: 'throw (...)' (setjmp.h + our stuff)
3737# -wd4710: 'std::string std::_Narrow_str(std::wstring)' : function not inlined
3738# -wd4061: enumerator 'RTASN1TYPE_END' in switch of enum 'RTASN1TYPE' is not explicitly handled by a case label
3739# Note! C4062 checks for the same but includes the 'default' case, just like gcc. So, no trouble disabling this.
3740# -wd4986: 'operator new[]': exception specification does not match previous declaration (crtdbg.h vs new, exception specification only)
3741# -wd4191: 'type cast' : unsafe conversion from 'int (__cdecl *)(gzFile)' to 'PFNRT'
3742# -wd4574: 'INCL_WINSOCK_API_TYPEDEFS' is defined to be '0': did you mean to use '#if INCL_WINSOCK_API_TYPEDEFS'?
3743# -wd4917: 'OLE_XPOS_HIMETRIC' : a GUID can only be associated with a class, interface or namespace
3744# -wd4711: function 'void __cdecl rtMemCacheFreeOne(struct RTMEMCACHEINT * __ptr64,void * __ptr64)' selected for automatic inline expansion
3745# -wd4571: Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
3746# -wd4611: interaction between '_setjmp' and C++ object destruction is non-portable
3747# -wd4324: '_TDI_PNP_CONTEXT_XP' : structure was padded due to __declspec(align())
3748# -wd4505: VBoxNetFltNobj.h(45) : warning C4505: 'VBoxNetFltNobj::Release' : unreferenced local function has been removed
3749# Probably related to http://stackoverflow.com/questions/3051992/compiler-warning-at-c-template-base-class
3750# -wd4263: 'int VRDPChannelClipboard::SendPacket(const void *,uint32_t)' : member function does not override any base class virtual member function
3751# Probably useful, but impractical, just like the next one.
3752# -wd4264: 'int VRDPOutputCtx::SendPacket(void)' : no override available for virtual member function from base 'VRDPOutputCtx'; function is hidden
3753# -wd4738: storing 32-bit float result in memory, possible loss of performance
3754# -wd4371: UIActionPool.h(393) : warning C4371: 'UIActionPool::PointerToFunction' : layout of class may have changed from a previous version of the compiler due to better packing of member 'UIActionPool::PointerToFunction::ptfr'
3755# -wd4748: uiactionpoolmanager.cpp(2723) : warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
3756# Want to enable these:
3757# -wd4242: '=' : conversion from 'uint32_t' to 'uint8_t', possible loss of data
3758# -wd4244: 'conversion' conversion from 'type1' to 'type2', possible loss of data
3759# -wd4200: nonstandard extension used : zero-sized array in struct/union
3760# Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
3761VBOX_VCC_WARN_ALL := -W4 -Wall -wd4065 -wd4996 -wd4127 -wd4706 -wd4201 -wd4214 -wd4510 -wd4512 -wd4610 \
3762 -wd4514 -wd4820 -wd4365 -wd4987 -wd4710 -wd4061 -wd4986 -wd4191 -wd4574 -wd4917 -wd4711 -wd4611 -wd4571 -wd4324 -wd4505 \
3763 -wd4263 -wd4264 -wd4738 -wd4200 -wd4371 -wd4748
3764if1of ($(VBOX_VCC_TOOL_STEM), VCC120)
3765 # -wd4350: behavior change: 'std::_Wrap_alloc<std::allocator<char>>::_Wrap_alloc(const std::_Wrap_alloc<std::allocator<char>> &) throw()' called instead of 'std::_Wrap_alloc<std::allocator<char>>::_Wrap_alloc<std::_Wrap_alloc<std::allocator<char>>>(_Other &) throw()'
3766 # -wd4435: iprt/cpp/xml.h(185) : warning C4435: 'xml::Input' : Object layout under /vd2 will change due to virtual base 'xml::Stream'
3767 VBOX_VCC_WARN_ALL += -wd4350 -wd4435
3768endif
3769if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
3770 # -wd5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
3771 # -wd4464: relative include path contains '..' (iprt/nocrt/compiler.msc.h)
3772 # -wd4623: 'VM': default constructor was implicitly defined as deleted
3773 # -wd4625: 'SUPDRVTRACERDATA': copy constructor was implicitly defined as deleted
3774 # -wd4626: 'SUPDRVTRACERDATA': assignment operator was implicitly defined as deleted
3775 # -wd5026: 'SUPDRVTRACERDATA': move constructor was implicitly defined as deleted
3776 # -wd5027: 'SUPDRVTRACERDATA': move assignment operator was implicitly defined as deleted
3777 # -wd4435: 'xml::Input': Object layout under /vd2 will change due to virtual base 'xml::Stream'
3778 # -wd4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
3779 VBOX_VCC_WARN_ALL += -wd5045 -wd4464 -wd4623 -wd4625 -wd4626 -wd5026 -wd5027 -wd4435 -wd4577
3780endif
3781if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # With v16.11.9, not with v16.6.0 4242
3782 # -wd5220: 'RTDBGMODINT::cRefs': a non-static data member with a volatile qualified type no longer implies that compiler generated copy/move constructors and copy/move assignment operators are not trivial
3783 VBOX_VCC_WARN_ALL += -wd5220
3784 # Temporarily:
3785 # -wd4242: asn1-ut-string.cpp(729): warning C4242: 'argument': conversion from 'uint32_t' to 'uint16_t', possibl loss of data
3786 # -wd4244: asn1-ut-objid.cpp(124): warning C4244: '=': conversion from 'uint32_t' to 'uint8_t', possible loss of data
3787 VBOX_VCC_WARN_ALL += -wd4242 -wd4244
3788 if1of (RT_RELAXED_CALLBACKS_TYPES, $(DEFS))
3789 # -wd5039: asn1-ut-core.cpp(212): warning C5039: 'RTAsn1EncodeWriteHeader': pointer or reference to potentially throwing function passed to 'extern "C"' function under -EHc. Undefined behavior may occur if this function throws an exception.
3790 VBOX_VCC_WARN_ALL += -wd5039
3791 endif
3792endif
3793# -wd4548: socket.cpp(1931): warning C4548: expression before comma has no effect; expected expression with side-effect
3794VBOX_VCC_WARN_ALL += -wd4548
3795if "$(VBOX_VCC_TOOL_STEM)" >= "VCC143" && "$(KBUILD_TARGET_ARCH)" == "arm64"
3796 VBOX_VCC_WARN_ALL += -wd4746
3797endif
3798ifndef VBOX_NEWER_VCC_WARN_ALL
3799 if "$(VBOX_VCC_TOOL_STEM)" < "VCC120"
3800 VBOX_NEWER_VCC_WARN_ALL := $(VBOX_VCC_WARN_ALL) -wd4350 -wd4435
3801 else
3802 VBOX_NEWER_VCC_WARN_ALL := $(VBOX_VCC_WARN_ALL)
3803 endif
3804endif
3805
3806
3807# Disable pedantic warnings for NP/NonPedantic templates.
3808# -wd4131: 'bi_flush' : uses old-style declarator
3809# -wd4255: 'tr_static_init' : no function prototype given: converting '()' to '(void)'
3810# -wd4668: '_WIN32_WCE' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'/
3811# -wd4100: 'cinfo' : unreferenced formal parameter
3812# -wd4189: 'sz' : local variable is initialized but not referenced
3813# -wd4132: 'xmlStringComment' : const object should be initialized
3814# -wd4152: nonstandard extension, function/data pointer conversion in expression
3815# -wd4702: unreachable code
3816# -wd4057: '=' : 'xmlChar *' differs in indirection to slightly different base types from 'char *'
3817# -wd4296: '>=' : expression is always true
3818# -wd4389: '==' : signed/unsigned mismatch
3819# -wd4018: '<=' : signed/unsigned mismatch
3820# -wd4245: '=' : conversion from 'int' to 'unsigned int', signed/unsigned mismatch
3821# -wd4267: '+=' : conversion from 'size_t' to 'long', possible loss of data
3822# -wd4295: 'vendor_string' : array is too small to include a terminating null character
3823VBOX_VCC_NON_PEDANTIC = -wd4131 -wd4255 -wd4668 -wd4100 -wd4189 -wd4132 -wd4152 -wd4702 -wd4057 -wd4296 -wd4389 -wd4018 -wd4245 \
3824 -wd4267 -wd4295
3825VBOX_NEWER_VCC_NON_PEDANTIC = $(VBOX_VCC_NON_PEDANTIC)
3826
3827ifeq ($(KBUILD_TARGET),win)
3828 VBOX_C_CXX_FLAGS_NO_UNUSED_PARAMETERS = -wd4100
3829else
3830 VBOX_C_CXX_FLAGS_NO_UNUSED_PARAMETERS = -Wno-unused-parameter
3831endif
3832
3833#
3834# Version dependent Visual C++ stuff.
3835#
3836if1of (win, $(KBUILD_TARGET) $(KBUILD_HOST))
3837 ifn1of ($(VBOX_VCC_TOOL_STEM), VCC100 VCC110 VCC120)
3838 ifndef VBOX_WITHOUT_CONTROL_FLOW_GUARD
3839 VBOX_VCC_CC_GUARD_CF = -guard:cf
3840 VBOX_VCC_LD_GUARD_CF = -Guard:CF
3841 else
3842 VBOX_VCC_CC_GUARD_CF =
3843 VBOX_VCC_LD_GUARD_CF =
3844 endif
3845 VBOX_VCC_LD_HIGH_ENTRYOPY_VA = /HighEntropyVA
3846 else
3847 VBOX_VCC_CC_GUARD_CF =
3848 VBOX_VCC_LD_GUARD_CF =
3849 VBOX_VCC_LD_HIGH_ENTRYOPY_VA =
3850 endif
3851 ifn1of ((VBOX_VCC_TOOL_STEM), VCC100 VCC110 VCC120 VCC140 VCC141)
3852 # 16.7 and later, so not in our linker yet.
3853 ## @todo BUGBUG! Update VCC before 7.0 is released.
3854 #VBOX_VCC_LD_CET_COMPAT = /CetCompat
3855 VBOX_VCC_LD_CET_COMPAT =
3856 else
3857 VBOX_VCC_LD_CET_COMPAT =
3858 endif
3859endif
3860
3861#
3862# Compiler optimization flags.
3863#
3864ifeq ($(KBUILD_TYPE),debug)
3865 VBOX_GCC_FP ?= -fno-omit-frame-pointer
3866 VBOX_GCC_OPT ?= -O0
3867 VBOX_VCC_FP ?= -Oy-
3868 VBOX_VCC_OPT ?=
3869 VBOX_GCC_R0_FP ?= -fno-omit-frame-pointer -fno-optimize-sibling-calls
3870 VBOX_GCC_R0_OPT ?= -O2
3871 VBOX_VCC_R0_FP ?= -Oy-
3872 VBOX_VCC_R0_OPT ?=
3873 VBOX_GCC_GC_FP ?= -fno-omit-frame-pointer -fno-optimize-sibling-calls
3874 VBOX_GCC_GC_OPT ?= -O2
3875 VBOX_VCC_GC_FP ?= -Oy-
3876 VBOX_VCC_GC_OPT ?=
3877else
3878 # We should use -fomit-frame-pointer for GCC / -Oy for VCC.
3879 # -funwind-tables provides support for backtraces in gdb then.
3880 VBOX_GCC_FP ?= -fno-omit-frame-pointer
3881 VBOX_GCC_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
3882 VBOX_VCC_FP ?= -Oy-
3883 VBOX_VCC_OPT ?= -O2
3884 VBOX_GCC_R0_FP ?= -fno-omit-frame-pointer
3885 VBOX_GCC_R0_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
3886 VBOX_VCC_R0_FP ?= -Oy-
3887 VBOX_VCC_R0_OPT ?= -O2
3888 VBOX_GCC_GC_FP ?= -fno-omit-frame-pointer
3889 VBOX_GCC_GC_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
3890 VBOX_VCC_GC_FP ?= -Oy-
3891 VBOX_VCC_GC_OPT ?= -O2
3892endif
3893ifeq ($(KBUILD_TARGET_ARCH),x86)
3894 ifneq ($(KBUILD_TARGET),darwin)
3895 # (The '<=' operator is for prepending (kmk specific).)
3896 VBOX_GCC_OPT <= -march=i586
3897 endif
3898endif
3899
3900
3901#
3902# Select the CRT type we're using with Microsoft Visual C++.
3903#
3904if1of ($(KBUILD_TYPE), debug dbgopt strict)
3905 #not yet# VBOX_WITH_DEBUG_VCC_CRT = 1
3906endif
3907ifdef VBOX_WITH_DEBUG_VCC_CRT
3908 VBOX_VCC_CRT_TYPE := d
3909 VBOX_VCC_CRT_TYPE_UPPER := D
3910 VBOX_VCC_CRT_TYPE_N :=
3911else
3912 VBOX_VCC_CRT_TYPE :=
3913 VBOX_VCC_CRT_TYPE_UPPER :=
3914 VBOX_VCC_CRT_TYPE_N := d
3915endif
3916
3917#
3918# Select whether wchar_t is a native compiler defined type or not with
3919# Microsoft Visual C++. We've been avoiding the native type for ever,
3920# but now that is causing issues with Qt 6.x.
3921#
3922VBOX_VCC_WCHAR_T_VARIANT = -Zc:wchar_t
3923
3924
3925#
3926# Warnings as errors.
3927#
3928# GCC: We disable warnings on non-X86 systems because of the variadic
3929# macro usage in the logger.
3930#
3931ifdef VBOX_WITH_WARNINGS_AS_ERRORS
3932 if $(VBOX_GCC_VERSION_CXX) >= 40000
3933 VBOX_GCC_WERR ?= -Werror
3934 endif
3935 VBOX_VCC_WERR ?= -WX
3936 VBOX_VCC_LD_WERR ?= ## @todo later also: -WX
3937endif
3938
3939#
3940# The general GCC/Clang no warning policy.
3941#
3942# Note! This doesn't control everything. Instead set VBOX_GCC_WERR=$(NO_SUCH_VARIABLE) to
3943# completely disable -Werror.
3944#
3945if !defined(VBOX_WITHOUT_NO_GCC_WARNING_POLICY) && !defined(VBOX_WITH_NO_GCC_WARNING_POLICY)
3946 if defined(VBOX_WITH_MASOCHISTIC_WARNINGS) # gcc 4.6.x+
3947 VBOX_WITH_NO_GCC_WARNING_POLICY = 1
3948 else if "$(KBUILD_TARGET)" == "darwin"
3949 ifn1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
3950 VBOX_WITH_NO_GCC_WARNING_POLICY = 1
3951 endif
3952 else if1of ($(KBUILD_TARGET), linux)
3953 if $(VBOX_GCC_VERSION_CXX) >= 40600 # gcc 4.6.x+
3954 VBOX_WITH_NO_GCC_WARNING_POLICY = 1
3955 endif
3956 endif
3957endif
3958ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
3959 $(info build debug: VBOX_WITH_NO_GCC_WARNING_POLICY is enabled)
3960endif
3961
3962#
3963# Misc stuff that should be after including DynamicConfig.kmk.
3964#
3965
3966# libxml XML linter.
3967ifeq ($(VBOX_XMLLINT),)
3968 ifeq ($(KBUILD_HOST),win)
3969 VBOX_XMLLINT := $(firstfile \
3970 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST)/libxslt/*/bin/xmllint.exe)) \
3971 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST_ALT)/libxslt/*/bin/xmllint.exe)) )
3972 endif
3973 ifeq ($(VBOX_XMLLINT),)
3974 VBOX_XMLLINT := $(firstfile $(which xmllint) xmllint$(HOSTSUFF_EXE))
3975 endif
3976 ifneq ($(VBOX_XMLLINT),)
3977 VBOX_HAVE_XMLLINT := 1
3978 else
3979 VBOX_XMLLINT := xmllint
3980 VBOX_HAVE_XMLLINT :=
3981 endif
3982else
3983 VBOX_HAVE_XMLLINT := 1
3984endif
3985
3986# Older versions of GCC cannot compile libssh, so disable it and the feature if that's the case.
3987ifn1of ($(KBUILD_TARGET), darwin win)
3988 if $(VBOX_GCC_VERSION_CC) < 50000
3989 VBOX_WITH_LIBSSH :=
3990 VBOX_WITH_CLOUD_NET :=
3991 endif
3992endif
3993
3994
3995#
3996# Misc macros.
3997#
3998
3999##
4000# Edits VirtualBox version, vendor and package strings in a text file.
4001#
4002# The rule using this must list $(VBOX_SVN_REV_KMK) as a prerequisite.
4003#
4004# @param 1 The input filename.
4005# @param 2 The output filename.
4006#
4007VBOX_EDIT_VERSION_CMD_FN = $(SED) \
4008 -e 's+@VBOX_VERSION_MAJOR@+$(VBOX_VERSION_MAJOR)+g' \
4009 -e 's+@VBOX_VERSION_MINOR@+$(VBOX_VERSION_MINOR)+g' \
4010 -e 's+@VBOX_VERSION_BUILD@+$(VBOX_VERSION_BUILD)+g' \
4011 -e 's+@VBOX_VERSION_STRING@+$(VBOX_VERSION_STRING)+g' \
4012 -e 's+@VBOX_SVN_REV@+$(VBOX_SVN_REV)+g' \
4013 -e 's+@VBOX_VENDOR@+$(VBOX_VENDOR)+g' \
4014 -e 's+@VBOX_VENDOR_SHORT@+$(VBOX_VENDOR_SHORT)+g' \
4015 -e 's+@VBOX_PRODUCT@+$(VBOX_PRODUCT)+g' \
4016 -e 's+@VBOX_C_YEAR@+$(VBOX_C_YEAR)+g' \
4017 -e 's+@VBOX_PACKAGE_STRING@+$(VBOX_PACKAGE_STRING)+g' \
4018 --output $(2) $(1)
4019
4020##
4021# Generates a rule for editing a file using VBOX_EDIT_VERSION_CMD_FN.
4022#
4023# @param 1 The target name.
4024# @param 2 The input filename relative to the current sub-makefile.
4025# @param 3 The output filename relative to the target output dir.
4026# Optional, defaults to 2.
4027#
4028VBOX_EDIT_VERSION_RULE_FN = $(eval $(value VBOX_EDIT_VERSION_RULE_DEF))
4029define VBOX_EDIT_VERSION_RULE_DEF
4030 $$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2)): $(PATH_SUB_CURRENT)/$(2) $(VBOX_SVN_REV_KMK) | $$(dir $$@)
4031 $(call MSG_GENERATE,$(1),$@,$<)
4032 $(QUIET)$(call VBOX_EDIT_VERSION_CMD_FN,$<,$@)
4033 $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2)))
4034endef
4035
4036
4037##
4038# Edits VirtualBox version, vendor, package, build target, build arch, and build type strings in a text file.
4039#
4040# Please use VBOX_EDIT_VERSION_AND_BUILD_RULE_FN to generate edit rule.
4041#
4042# @param 1 The input filename.
4043# @param 2 The output filename.
4044#
4045VBOX_EDIT_VERSION_AND_BUILD_CMD_FN = $(SED) \
4046 -e 's+@VBOX_VERSION_MAJOR@+$(VBOX_VERSION_MAJOR)+g' \
4047 -e 's+@VBOX_VERSION_MINOR@+$(VBOX_VERSION_MINOR)+g' \
4048 -e 's+@VBOX_VERSION_BUILD@+$(VBOX_VERSION_BUILD)+g' \
4049 -e 's+@VBOX_VERSION_STRING@+$(VBOX_VERSION_STRING)+g' \
4050 -e 's+@VBOX_SVN_REV@+$(VBOX_SVN_REV)+g' \
4051 -e 's+@VBOX_VENDOR@+$(VBOX_VENDOR)+g' \
4052 -e 's+@VBOX_VENDOR_SHORT@+$(VBOX_VENDOR_SHORT)+g' \
4053 -e 's+@VBOX_PRODUCT@+$(VBOX_PRODUCT)+g' \
4054 -e 's+@VBOX_C_YEAR@+$(VBOX_C_YEAR)+g' \
4055 -e 's+@VBOX_PACKAGE_STRING@+$(VBOX_PACKAGE_STRING)+g' \
4056 -e 's+@KBUILD_TYPE@+$(KBUILD_TYPE)+g' \
4057 -e 's+@KBUILD_TARGET@+$(KBUILD_TARGET)+g' \
4058 -e 's+@KBUILD_TARGET_ARCH@+$(KBUILD_TARGET_ARCH)+g' \
4059 --output $(2) $(1)
4060
4061##
4062# Generates a rule for editing a file using VBOX_EDIT_VERSION_CMD_FN.
4063#
4064# @param 1 The target name.
4065# @param 2 The input filename relative to the current sub-makefile.
4066# @param 3 The output filename relative to the target output dir.
4067# Optional, defaults to 2.
4068#
4069VBOX_EDIT_VERSION_AND_BUILD_RULE_FN = $(eval $(VBOX_EDIT_VERSION_AND_BUILD_RULE_DEF))
4070define VBOX_EDIT_VERSION_AND_BUILD_RULE_DEF
4071 $$$$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2)): $$(PATH_SUB_CURRENT)/$(2) $$(VBOX_SVN_REV_KMK) | $$$$(dir $$$$@)
4072 $$(call MSG_GENERATE,$(1),$$@,$$<)
4073 $$(QUIET)$$(call VBOX_EDIT_VERSION_AND_BUILD_CMD_FN,$$<,$$@)
4074 $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2))
4075endef
4076
4077
4078##
4079# Fill in am import library target based on a somewhat special windows .def file.
4080#
4081# @param 1 The target name of the import library.
4082# @param 2 The name of the real library.
4083# @param 3 The .def-file paths relative to the current makefile.
4084#
4085VBOX_GENERATE_IMPORT_TARGET_FN = $(eval $(VBOX_GENERATE_IMPORT_TARGET_DEF))
4086define VBOX_GENERATE_IMPORT_TARGET_DEF
4087 $(1)_TEMPLATE = VBoxR3Dll
4088 $(1)_INST = $(INST_LIB)
4089 if $(KBUILD_TARGET) == "darwin"
4090 $(1)_LDFLAGS = -install_name $(VBOX_DYLD_EXECUTABLE_PATH)/$(2)$(SUFF_DLL)
4091 else ifn1of ($(KBUILD_TARGET), os2 win)
4092 $(1)_SONAME = $(2)$(SUFF_DLL)
4093 endif
4094 if1of ($(KBUILD_TARGET), os2 win)
4095 $(1)_SOURCES = $$($(1)_0_OUTDIR)/$(1)Imp.def
4096 $(1)_CLEAN = $$($(1)_0_OUTDIR)/$(1)Imp.def
4097 else
4098 $(1)_SOURCES = $$($(1)_0_OUTDIR)/$(1)Imp.c
4099 $(1)_CLEAN = $$($(1)_0_OUTDIR)/$(1)Imp.c
4100 endif
4101
4102 $$$$($(1)_SOURCES): $(addprefix $(PATH_SUB_CURRENT)/,$(3)) $(PATH_ROOT)/src/bldprogs/deftoimp.sed | $$$$(dir $$$$@)
4103 $$(call MSG_GENERATE,,$$@)
4104 ifeq ($(KBUILD_TARGET),os2)
4105 $$(SED) \
4106 -e '/not-$(KBUILD_TARGET)/d' \
4107 -e '/not-$(KBUILD_TARGET_ARCH)/d' \
4108 -e 's/^LIBRARY[[:space:]][[:space:]]*\(.*\)\.dll/LIBRARY \1 INITINSTANCE TERMINSTANCE\nDATA MULTIPLE\n/' \
4109 -e 's/^[ \t][ \t]*\([_a-zA-Z]\)/ _\1/' \
4110 -e 's/[ \t]DATA[ \t]*/ /' \
4111 --output $$@ $(addprefix $(PATH_SUB_CURRENT)/,$(3))
4112 else ifeq ($(KBUILD_TARGET),win)
4113 $$(SED) \
4114 -e '/not-$(KBUILD_TARGET)/d' \
4115 -e '/not-$(KBUILD_TARGET_ARCH)/d' \
4116 --output $$@ $(addprefix $(PATH_SUB_CURRENT)/,$(3))
4117 else
4118 $$(QUIET)$$(APPEND) -tn $$@ \
4119 '#ifdef VBOX_HAVE_VISIBILITY_HIDDEN' \
4120 '# define EXPORT __attribute__((visibility("default")))' \
4121 '# define EXPORT_DATA __attribute__((visibility("default")))' \
4122 '#else' \
4123 '# define EXPORT' \
4124 '# define EXPORT_DATA' \
4125 '#endif' \
4126 ''
4127 $$(SED) \
4128 -e '/not-$(KBUILD_TARGET)/d' \
4129 -e '/not-$(KBUILD_TARGET_ARCH)/d' \
4130 -f $(PATH_ROOT)/src/bldprogs/deftoimp.sed \
4131 --append $$@ $(addprefix $(PATH_SUB_CURRENT)/,$(3))
4132 endif
4133endef # VBOX_GENERATE_IMPORT_TARGET_DEF
4134
4135
4136## VBOX_UTF8_MANIFEST_CMDS
4137# Wrapper around VBOX_UTF8_MANIFEST_FN that makes sure it's an EXE link target,
4138# as this UTF-8 manifest doesn't make sense for non-executables.
4139ifn1of ($(VBOX_VCC_TOOL_STEM), VCC100 VCC110 VCC120)
4140 ## VBOX_UTF8_MANIFEST_FN
4141 # Adds a manifest resource with ID 1 that tells windows 10 1903 and later to
4142 # use UTF-8 for the ANSI and OEM code pages. We only do this when using UCRT
4143 # as the VCC100 CRT typically ends up with its internal code page not being
4144 # CP_UTF8 but the default codepage for the locale.
4145 #
4146 # This has also been hijacked for opting in on the new segmented heap in
4147 # Windows 10.
4148 #
4149 # @param 1 the output filename.
4150 # @param 2 the architecture (required for xp rtm)
4151 #
4152 VBOX_UTF8_MANIFEST_FN = \
4153 $(QUIET)$(APPEND) -tn "$(1).manifest" \
4154 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' \
4155 '<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">' \
4156 ' <assemblyIdentity type="win32" name="$(notdir $(1))" processorArchitecture="$(2)" version="$(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD).$(expr $(VBOX_SVN_REV) % 50000)" />' \
4157 ' <asmv3:application>' \
4158 ' <asmv3:windowsSettings>' \
4159 ' <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>' \
4160 ' <heapType xmlns="http://schemas.microsoft.com/SMI/2020/WindowsSettings">SegmentHeap</heapType>' \
4161 ' </asmv3:windowsSettings>' \
4162 ' </asmv3:application>' \
4163 '</assembly>' \
4164 $(NLTAB)$(QUIET)$(REDIRECT) -- $(WINCMN_MT_RETRY) $(requote sh,$(PATH_SDK_$(VBOX_WINPSDK)_BIN)/mt.exe) \
4165 -nologo -manifest '$(subst /,\,$(1).manifest)' '-outputresource:$(subst /,\,$(1));$(HASH)1' \
4166 $(NLTAB)$(QUIET)$(RM) -f -- "$(1).manifest"
4167 VBOX_UTF8_MANIFEST_CMDS ?= $(if-expr "$(tool_do)" == "LINK_PROGRAM",$(call VBOX_UTF8_MANIFEST_FN,$(out),$(bld_trg_arch)),)
4168else
4169 VBOX_UTF8_MANIFEST_CMDS =
4170endif
4171
4172
4173#
4174# Code Signing.
4175#
4176# There are two signing modes; 'test' and 'release'.
4177# - The 'test' mode is tailored local development, where typically test
4178# certificates are involved. Only the bar minimum of files are signed and
4179# nothing is timestamped (if we can control timestamping) in order to reduce
4180# build time and to allow working offline.
4181# - The 'release' mode is tailored for creating builds that are give to other
4182# people, like the ones the build servers create. As much as possible is
4183# signed and timestamped.
4184# - The 'adhoc' mode is specific to building on macOS and is similar to 'test'
4185# mode but doesn't require any certificates but a host set up for development work.
4186# Binaries are signed in adhoc mode and include required entitlements as appropriate
4187# (something we would only do in the 'packing' target). This seem to be the only working
4188# way with newer versions of macOS (tested with Ventura) with 'test' not working anymore.
4189#
4190ifdef VBOX_SIGNING_MODE
4191 VBOX_SIGNING_MODE := $(strip $(VBOX_SIGNING_MODE))
4192 ifn1of ($(VBOX_SIGNING_MODE), test release adhoc)
4193 $(error VBOX_SIGNING_MODE must be either 'test', 'release' or 'adhoc'. The value '$(VBOX_SIGNING_MODE)' is not recognized.)
4194 endif
4195 if "$(VBOX_SIGNING_MODE)" == "adhoc" && "$(KBUILD_TARGET)" != "darwin"
4196 $(error 'adhoc' signing mode is only available on macOS)
4197 endif
4198 VBOX_RETRY ?= $(ASH) $(KBUILD_DEVTOOLS)/bin/retry.sh
4199 # temporary solution for a $(dir ...) equivalent which assumes that it gets a single path, possibly with spaces.
4200 VBOX_DIRX = $(subst ?,$(SP),$(dir $(subst $(SP),?,$1)))
4201 VBOX_NOTDIRX = $(subst ?,$(SP),$(notdir $(subst $(SP),?,$1)))
4202 # Corp code signing client.
4203 VBOX_CCS_CLIENT_JAR := $(firstword $(rsort \
4204 $(wildcard $(KBUILD_DEVTOOLS)/common/ccs/v*/Client.jar)) \
4205 $(KBUILD_DEVTOOLS)/common/ccs/notfound/Client.jar )
4206 VBOX_CCS_USER ?= virtualbox_grp
4207 VBOX_CCS_GLOBAL_UID ?= non-of-your-business
4208 VBOX_CCS_SERVER ?= UK
4209 ##
4210 # Corp Code Signing command line.
4211 # @param $1 Signing method: solaris_elf, solaris_pkg, driver (microsoft), ...
4212 # @param $2 The file to be submitted for signing.
4213 # @param $3 The directory to put the signed file in. Defaults to $(dir $2).
4214 # @param $4 Additional options.
4215 VBOX_CCS_SIGN_CMD = $(VBOX_RETRY) $(VBOX_JAVA) -Xmx256m -jar "$(VBOX_CCS_CLIENT_JAR)" \
4216 sign -user "$(VBOX_CCS_USER)" -global_uid "$(VBOX_CCS_GLOBAL_UID)" \
4217 -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER)" \
4218 -sign_method "$1" -file_to_sign "$2" -signed_location "$(if $3,$3,$(call VBOX_DIRX,$2))" $4
4219
4220 ifeq ($(KBUILD_HOST),win)
4221 #
4222 # Windows
4223 #
4224
4225 # VBOX_PATH_SELFSIGN points to the Vista WDK bin/SelfSign directory.
4226 ifndef VBOX_PATH_SELFSIGN
4227 VBOX_PATH_SELFSIGN := $(firstword $(rsort $(wildcard $(KBUILD_DEVTOOLS)/win.x86/selfsign/*)))
4228 ifeq ($(VBOX_PATH_SELFSIGN),)
4229 VBOX_PATH_SELFSIGN := $(KBUILD_DEVTOOLS)/win.x86/selfsign/r1
4230 endif
4231 endif
4232 ifndef VBOX_PATH_SIGN_TOOLS
4233 $(evalcall KB_FN_LOAD_SDK,$(VBOX_WINPSDK))
4234 VBOX_PATH_SIGN_TOOLS = $(PATH_SDK_$(VBOX_WINPSDK)_BIN)
4235 endif
4236
4237 VBOX_SIGNTOOL ?= $(VBOX_RETRY) $(requote sh,$(VBOX_PATH_SIGN_TOOLS)/signtool.exe)
4238 VBOX_SIGNTOOL_SHA1 ?= $(VBOX_SIGNTOOL)
4239 VBOX_SIGNTOOL_SHA1_ORDERDEPS ?=
4240 VBOX_SIGNTOOL_SHA2 ?= $(VBOX_SIGNTOOL)
4241 VBOX_SIGNTOOL_SHA2_ORDERDEPS ?=
4242 VBOX_SIGNTOOL_ORDERDEPS ?= $(VBOX_SIGNTOOL_SHA1_ORDERDEPS) $(VBOX_SIGNTOOL_SHA2_ORDERDEPS)
4243 ifndef VBOX_INF2CAT # Inf2Cat.exe is only found in the bin/*/x86 directory in WINSDK10. Arm64 requires a W10+ one.
4244 VBOX_INF2CAT = $(requote sh,$(firstfile $(qwildcard , $(qaddsuffix ,/[Ii][Nn][Ff]2[Cc][Aa][Tt].[Ee][Xx][Ee], \
4245 $(PATH_SDK_WINSDK10_BIN.x86) \
4246 $(PATH_SDK_WINSDK10_BIN) \
4247 $(if-expr defined(PATH_SDK_WINSDK10_BASE_BIN) && defined(SDK_WINSDK10_VERSION),$(PATH_SDK_WINSDK10_BASE_BIN)/$(SDK_WINSDK10_VERSION)/x86) \
4248 )) $(VBOX_PATH_SELFSIGN)/Inf2Cat.exe ))
4249 endif
4250
4251 ifeq ($(VBOX_SIGNING_MODE),test)
4252 VBOX_CERTIFICATE_SUBJECT_NAME ?= MyTestCertificate
4253 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4254 else # release
4255 VBOX_CERTIFICATE_SUBJECT_NAME ?= VirtualBox 2022
4256 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)" /a
4257 #VBOX_CERTIFICATE_FINGERPRINT ?= 7e 92 b6 6b e5 1b 79 d8 ce 3f f2 5c 15 c2 df 6a b8 c7 f2 f2
4258 #VBOX_CERTIFICATE_FINGERPRINT ?= 5b de fe 58 0a 81 66 61 cd b5 7a 57 10 7b f4 18 74 86 ef cc
4259 #VBOX_CERTIFICATE_FINGERPRINT ?= 6f 47 42 06 bc bb 39 1b b8 2b a9 e5 dc 03 02 de f3 7a eb be
4260 VBOX_CERTIFICATE_FINGERPRINT ?= 5f 0b fe c5 53 17 c1 25 5a a4 7f cd bc 49 a2 fb 61 09 03 cc
4261 #VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/VeriSign Class 3 Public Primary Certification Authority - G5.cer
4262 #VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/DigiCert Assured ID Root CA.crt
4263 #VBOX_TSA_URL ?= http://timestamp.verisign.com/scripts/timstamp.dll - Appears to be broken between 2020-12-25 and 2020-12-30 (bugref:9849).
4264 VBOX_TSA_URL ?= http://timestamp.digicert.com
4265 endif
4266 if !defined(VBOX_CROSS_CERTIFICATE_FILE_ARGS) && defined(VBOX_CROSS_CERTIFICATE_FILE)
4267 VBOX_CROSS_CERTIFICATE_FILE_ARGS = /ac "$(VBOX_CROSS_CERTIFICATE_FILE)"
4268 endif
4269 if !defined(VBOX_TSA_URL_ARGS) && defined(VBOX_TSA_URL)
4270 VBOX_TSA_URL_ARGS = /t "$(VBOX_TSA_URL)"
4271 endif
4272 VBOX_CERTIFICATE_STORE ?= my
4273 VBOX_CERTIFICATE_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_STORE)"
4274 VBOX_CERTIFICATE_FINGERPRINT_ARGS := $(if-expr "$(VBOX_CERTIFICATE_FINGERPRINT)" != "" \
4275 ,/sha1 "$(subst $(SP),,$(VBOX_CERTIFICATE_FINGERPRINT))",)
4276
4277 ifeq ($(VBOX_SIGNING_MODE),test)
4278 #VBOX_CERTIFICATE_SHA2_SUBJECT_NAME ?= MyTestCertificateSha2
4279 VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME)"
4280 else # release
4281 VBOX_CERTIFICATE_SHA2_SUBJECT_NAME ?= Oracle Corporation
4282 VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME)" /a
4283 #VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 31 31 bb 58 8b 19 9e 6e 85 0f d3 35 82 b0 c5 82 55 e1 6c 49
4284 #VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 22 05 6a 4d 46 2e 3d 2b b2 c3 2f bf b0 5b 84 c4 65 9c f7 fe
4285 #VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 17 3a 19 bf 8e 62 72 be 25 04 d3 08 aa 68 b1 b0 0e 03 33 2c
4286 VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 30 65 6f ca 8c 48 b1 d9 86 23 a9 4b 40 a6 bc 98 bd 87 bf ad
4287 VBOX_CROSS_CERTIFICATE_SHA2_FILE ?= $(VBOX_PATH_SELFSIGN)/DigiCert Assured ID Root CA.crt
4288 #VBOX_TSA_SHA2_URL ?= http://sha256timestamp.ws.symantec.com/sha256/timestamp - phase out for consistency reasons
4289 VBOX_TSA_SHA2_URL ?= http://timestamp.digicert.com
4290 endif
4291 if !defined(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) && defined(VBOX_CROSS_CERTIFICATE_SHA2_FILE)
4292 VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS = /ac "$(VBOX_CROSS_CERTIFICATE_SHA2_FILE)"
4293 endif
4294 if !defined(VBOX_TSA_SHA2_URL_ARGS) && defined(VBOX_TSA_SHA2_URL)
4295 VBOX_TSA_SHA2_URL_ARGS = /tr "$(VBOX_TSA_SHA2_URL)" /td SHA256
4296 endif
4297 VBOX_CERTIFICATE_SHA2_STORE ?= my
4298 VBOX_CERTIFICATE_SHA2_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_SHA2_STORE)"
4299 VBOX_CERTIFICATE_SHA2_FINGERPRINT_ARGS := $(if-expr "$(VBOX_CERTIFICATE_SHA2_FINGERPRINT)" != "" \
4300 ,/sha1 "$(subst $(SP),,$(VBOX_CERTIFICATE_SHA2_FINGERPRINT))",) # Still using SHA-1 for fingerprinting, it's good enough for that!
4301 #VBOX_CERTIFICATE_EV_SUBJECT_NAME ?= MyEvCertificate
4302 VBOX_CERTIFICATE_EV_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_EV_SUBJECT_NAME)"
4303 VBOX_CERTIFICATE_EV_STORE ?= my
4304 VBOX_CERTIFICATE_EV_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_EV_STORE)"
4305 #VBOX_CERTIFICATE_EV_FINGERPRINT ?= my ev cert fingerprint
4306 VBOX_CERTIFICATE_EV_FINGERPRINT_ARGS := $(if-expr "$(VBOX_CERTIFICATE_EV_FINGERPRINT)" != "" \
4307 ,/sha1 "$(subst $(SP),,$(VBOX_CERTIFICATE_EV_FINGERPRINT))",) # Still using SHA-1 for fingerprinting, it's good enough for that!
4308
4309 ## Sign a file (generic).
4310 # @param 1 The file to sign.
4311 # @param 2 File description. Optional.
4312 # @param 3 Additional parameters. Optional.
4313 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4314 # @param 5 Disables dual signing if non-empty, picking the SHA2 signature (since 2022-07-18).
4315 # @param 6 non-zero for alternative command separator. This is used for generating repacking scripts.
4316 # @param 7 non-zero for timed execution if possible
4317 ifndef VBOX_SIGN_FILE_FN
4318 if $(intersects win all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4319 # CCS has lost the ability to do dual signing a while ago, can do SHA256 only
4320 VBOX_SIGN_FILE_FN = $(if $(strip $7),$(TIME) ,)$(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo SHA2)
4321 else ifdef VBOX_CERTIFICATE_SHA2_SUBJECT_NAME
4322 ifdef VBOX_CERTIFICATE_SUBJECT_NAME
4323 VBOX_SIGN_FILE_FN = $(if-expr "$5" == "",$(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL_SHA1) \
4324 sign /fd sha1 \
4325 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4326 $(VBOX_CERTIFICATE_STORE_ARGS) \
4327 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4328 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4329 $(VBOX_TSA_URL_ARGS) \
4330 $(if $(strip $(2)),/d "$(strip $(2))",) \
4331 $(3) \
4332 "$(1)" \
4333 $(if-expr "$6" == "",$(if-expr "$4" == "2",$$(NLTAB),$(NLTAB)),$6))$(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL_SHA2) \
4334 sign $(if-expr "$5" == "",/as,) /fd sha256 \
4335 $(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) \
4336 $(VBOX_CERTIFICATE_SHA2_STORE_ARGS) \
4337 $(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS) \
4338 $(VBOX_CERTIFICATE_SHA2_FINGERPRINT_ARGS) \
4339 $(VBOX_TSA_SHA2_URL_ARGS) \
4340 $(if $(strip $(2)),/d "$(strip $(2))",) \
4341 $(3) \
4342 "$(1)"
4343 else
4344 VBOX_SIGN_FILE_FN = $(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL_SHA2) \
4345 sign /fd sha256 \
4346 $(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) \
4347 $(VBOX_CERTIFICATE_SHA2_STORE_ARGS) \
4348 $(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS) \
4349 $(VBOX_CERTIFICATE_SHA2_FINGERPRINT_ARGS) \
4350 $(VBOX_TSA_SHA2_URL_ARGS) \
4351 $(if $(strip $(2)),/d "$(strip $(2))",) \
4352 $(3) \
4353 "$(1)"
4354 endif
4355 else
4356 VBOX_SIGN_FILE_FN = $(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL) \
4357 sign /fd $(firstword $(VBOX_TEST_SIGN_ALGORITHM) sha256) \
4358 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4359 $(VBOX_CERTIFICATE_STORE_ARGS) \
4360 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4361 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4362 $(VBOX_TSA_URL_ARGS) \
4363 $(if $(strip $(2)),/d "$(strip $(2))",) \
4364 $(3) \
4365 "$(1)"
4366 endif
4367 endif
4368
4369 ## EV sign a file (generic).
4370 # @param 1 The file to sign.
4371 # @param 2 The directory to put the signed file in. Defaults to $(dir $1).
4372 ifndef VBOX_SIGN_EV_FILE_FN
4373 if $(intersects win_ev all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4374 VBOX_SIGN_EV_FILE_FN = $(call VBOX_CCS_SIGN_CMD,microsoftev,$1,$(if $2,$2,))
4375 else ifdef VBOX_CERTIFICATE_EV_SUBJECT_NAME
4376 VBOX_SIGN_EV_FILE_FN = $(VBOX_SIGNTOOL_SHA2) \
4377 sign /fd sha256 \
4378 $(VBOX_CERTIFICATE_EV_STORE_ARGS) \
4379 $(VBOX_CERTIFICATE_EV_SUBJECT_NAME_ARGS) \
4380 $(VBOX_CERTIFICATE_EV_FINGERPRINT_ARGS) \
4381 $(VBOX_TSA_SHA2_URL_ARGS) \
4382 "$(1)"
4383 endif
4384 endif
4385
4386 ## Local SHA-1 and SHA-256 signatures with EV SHA-256 signature from corp code signing.
4387 #
4388 # This builds on Plan B, since the corp code signing always replaces existing
4389 # signatures. Since we're signing more, though, we do things slightly differently
4390 # so we can apply this to VBOX_RTSIGNTOOL as well - only that didn't work because
4391 # kmk tries to help windows caching images it executes. So HACK ALERT on that.
4392 #
4393 # So, here is what we do.
4394 # 1. Sign $1 using the regular signing, probably dual signing it using local certs.
4395 # 2. Make temporary copy of $1 as $1.dual
4396 # 3. Do SHA-256 corp code signing of $1
4397 # 4. Add the SHA-256 signature from $1 to $1.dual using bldRTSignTool.
4398 # 5. Replace $1 with $1.dual.
4399 #
4400 # @param 1 The file to sign.
4401 # @param 2 File description. Optional.
4402 # @param 3 Additional parameters. Optional.
4403 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4404 # @param 5 Disables dual & tripple signing if non-empty.
4405 # @param 6 Disables triple signing if non-empty.
4406 #
4407 # @remarks The parameters are the same as VBOX_SIGN_FILE_FN.
4408 VBOX_SIGN_IMAGE_WITH_EV_FN = $(call VBOX_SIGN_FILE_FN,$1,$2,$3,$4,$5)$(if-expr "$5" == "" && "$(target)" != "bldRTSignTool", \
4409 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(RM) -f -- "$1.dual" \
4410 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(CP) -- "$1" "$1.dual" \
4411 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(call VBOX_CCS_SIGN_CMD,microsoftev,$1,,-digest_algo SHA2) \
4412 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(VBOX_RTSIGNTOOL) add-nested-$(if-expr "$(suffix $1)" == ".cat",cat,exe)-signature -v "$1.dual" "$1" \
4413 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(MV) -f -- "$1.dual" "$1" \
4414 ,)
4415
4416
4417 ## Corp code signing for drivers and catalogs, plan B.
4418 #
4419 # Since the corp code signing cannot dual signing and doesn't even have a
4420 # SHA-1 cert, we have to get creative:
4421 # 1. Sign $1 using local SHA-1 certificate.
4422 # 2. Make temporary copy of $1 as $1.dual
4423 # 3. Do SHA-256 corp code signing of $1
4424 # 4. Add the SHA-256 signature from $1 to $1.dual using bldRTSignTool.
4425 # 5. Move $1.dual to $1.
4426 #
4427 # @param 1 The file to sign.
4428 # @param 2 File description. Optional.
4429 # @param 3 Additional parameters. Optional.
4430 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4431 # @param 5 Disables dual signing if non-empty.
4432 #
4433 # @remarks The parameters are the same as VBOX_SIGN_FILE_FN.
4434 VBOX_SIGN_IMAGE_PLAN_B_FN = $(VBOX_SIGNTOOL_SHA1) \
4435 sign /fd sha1 \
4436 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4437 $(VBOX_CERTIFICATE_STORE_ARGS) \
4438 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4439 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4440 $(VBOX_TSA_URL_ARGS) \
4441 $(if $(strip $(2)),/d "$(strip $(2))",) \
4442 $(3) \
4443 "$(1)" \
4444 $(if-expr "$5" == "", \
4445 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(RM) -f -- "$1.dual" \
4446 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(CP) -- "$1" "$1.dual" \
4447 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo SHA2) \
4448 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(VBOX_RTSIGNTOOL) add-nested-$(if-expr "$(suffix $1)" == ".cat",cat,exe)-signature -v "$1.dual" "$1" \
4449 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(MV) -f -- "$1.dual" "$1" \
4450 ,)
4451
4452 ## Corp code signing for drivers and catalogs, plan C.
4453 #
4454 # This does a local SHA-1 signature before submitting to corp code signing. The end
4455 # result will have just a SHA-256 signature:
4456 # 1. Sign $1 using local SHA-1 certificate.
4457 # 2. Do SHA-256 corp code signing of $1
4458 #
4459 # @param 1 The file to sign.
4460 # @param 2 File description. Optional.
4461 # @param 3 Additional parameters. Optional.
4462 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4463 # @param 5 Disables dual signing if non-empty. Ignored because this can't do dual signing.
4464 # @remarks The parameters are the same as VBOX_SIGN_FILE_FN.
4465 VBOX_SIGN_IMAGE_PLAN_C_FN = $(VBOX_SIGNTOOL_SHA1) \
4466 sign /fd sha1 \
4467 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4468 $(VBOX_CERTIFICATE_STORE_ARGS) \
4469 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4470 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4471 $(VBOX_TSA_URL_ARGS) \
4472 $(if $(strip $(2)),/d "$(strip $(2))",) \
4473 $(3) \
4474 "$(1)" \
4475 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo SHA2)
4476
4477 ## Sign an executable image, normal method.
4478 # @param 1 The file to sign.
4479 # @param 2 File description. Optional.
4480 # @param 3 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4481 if1of (win_with_ev, $(VBOX_WITH_CORP_CODE_SIGNING))
4482 VBOX_SIGN_IMAGE_NORMAL_FN ?= $(call VBOX_SIGN_IMAGE_WITH_EV_FN,$(1),$(2),/ph,$(3))
4483 VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS)
4484 else
4485 VBOX_SIGN_IMAGE_NORMAL_FN ?= $(call VBOX_SIGN_FILE_FN,$(1),$(2),/ph,$(3))
4486 VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS ?= $(VBOX_SIGNTOOL_ORDERDEPS)
4487 endif
4488
4489 ## Commands for signing a driver image after link.
4490 if $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4491 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(out),,/ph,2))
4492 VBOX_SIGN_DRIVER_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS))
4493 else if $(intersects win_planc,$(VBOX_WITH_CORP_CODE_SIGNING))
4494 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_NORMAL_FN,$(out),,2,nodual))
4495 VBOX_SIGN_DRIVER_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS))
4496 else
4497 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_NORMAL_FN,$(out),,2))
4498 VBOX_SIGN_DRIVER_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS))
4499 endif
4500
4501 ## Create a security catalog file.
4502 # @param 1 The directory containing the stuff to sign.
4503 # @param 2 The expected .cat name. (Inf2Cat lowercases it)
4504 # @param 3 The list of OSes, separated by ';'.
4505 ifndef VBOX_MAKE_CAT_HLP_FN
4506 VBOX_MAKE_CAT_HLP_FN = \
4507 $(RM) -f -- "$(2)" \
4508 $(NL)$(TAB)$(VBOX_INF2CAT) "/driver:$(strip $(1))" "/os:$(strip $(subst ;,$(COMMA),$(3)))" /verbose \
4509 $(NL)$(TAB)$(MV) -- "$(2)" "$(2)"
4510 if $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4511 VBOX_MAKE_CAT_HLP_FN += $(NL)$(TAB)$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(2),,,$(NL)$(TAB))
4512 else
4513 VBOX_MAKE_CAT_HLP_FN += $(NL)$(TAB)$(call VBOX_SIGN_FILE_FN,$(2),,,$(NL)$(TAB))
4514 endif
4515 endif
4516 VBOX_MAKE_CAT_FN.amd64 ?= $(call VBOX_MAKE_CAT_HLP_FN,$(1),$(2),XP_X64;Server2003_X64;Vista_X64)
4517 VBOX_MAKE_CAT_FN.x86 ?= $(call VBOX_MAKE_CAT_HLP_FN,$(1),$(2),2000;XP_X86;Server2003_X86;Vista_X86)
4518 VBOX_MAKE_CAT_FN.arm64 ?= $(call VBOX_MAKE_CAT_HLP_FN,$(1),$(2),10_19H1_ARM64;ServerRS5_ARM64;10_CO_ARM64;Server10_ARM64;10_RS3_ARM64)
4519 VBOX_MAKE_CAT_FN = $(VBOX_MAKE_CAT_FN.$(KBUILD_TARGET_ARCH))
4520
4521 ## Functions + deps for signing an executable or a dll image. See VBOX_SIGN_IMAGE_NORMAL_FN for parameters.
4522 if defined(VBOX_CERTIFICATE_SUBJECT_NAME) && $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4523 VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(1),$(2),/ph,$(3))
4524 VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS)
4525 else if defined(VBOX_CERTIFICATE_SUBJECT_NAME) && $(intersects win_planc,$(VBOX_WITH_CORP_CODE_SIGNING))
4526 VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_IMAGE_PLAN_C_FN,$(1),$(2),/ph,$(3))
4527 VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS)
4528 else
4529 VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_IMAGE_NORMAL_FN,$(1),$(2),$(3))
4530 VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS)
4531 endif
4532
4533 # Go nuts, sign everything.
4534 if "$(VBOX_SIGNING_MODE)" == "release" || defined(VBOX_WITH_HARDENING)
4535 ## Commands for signing an executable or a dll image after link.
4536 if defined(VBOX_CERTIFICATE_SUBJECT_NAME) && $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4537 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(out),,/ph,2))
4538 VBOX_SIGN_IMAGE_CMDS_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS))
4539 else if defined(VBOX_CERTIFICATE_SUBJECT_NAME) && $(intersects win_planc,$(VBOX_WITH_CORP_CODE_SIGNING))
4540 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_C_FN,$(out),,/ph,2))
4541 VBOX_SIGN_IMAGE_CMDS_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS))
4542 else
4543 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_NORMAL_FN,$(out),,2))
4544 VBOX_SIGN_IMAGE_CMDS_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS))
4545 endif
4546 endif
4547 ## Enable signing of the additions drivers, i.e. create CAT files.
4548 ## @todo r=bird: This bugger is entirely misplaced, as it belongs in the additions config section so it can be properly overriden.
4549 VBOX_SIGN_ADDITIONS ?= 1
4550 ## Set if we should include the legacy timestamp CA.
4551 ifndef VBOX_WITH_VBOX_LEGACY_TS_CA
4552 if "$(findstring 805af82410a4827b71f59479a222670391bec2d5,$(VBOX_TSA_URL_ARGS))" != ""
4553 VBOX_WITH_VBOX_LEGACY_TS_CA = 1
4554 endif
4555 endif
4556
4557 else ifeq ($(KBUILD_HOST),darwin)
4558
4559 ## Sign a VM process binary with the given entitlements
4560 # @param 1 The file to sign.
4561 # @param 2 Identifier, optional.
4562 ifeq ($(VBOX_SIGNING_MODE),adhoc)
4563 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4564 ## @todo cannot handle $(2), the identifier.
4565 VBOX_SIGN_IMAGE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4566 $(call VBOX_CCS_SIGN_CMD,binary,$(1),,$(subst --entitlements=,-entitlement_file_path ,$(3)) \
4567 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime))
4568 else
4569 VBOX_SIGN_IMAGE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4570 --verbose=9 \
4571 --force \
4572 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4573 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4574 --file-list - \
4575 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4576 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4577 --entitlements="$(VBOX_DARWIN_ENTITLEMENTS_FILE_VM)" \
4578 "$(1)" \
4579 $(if $(2),--identifier "$(2)",)
4580 endif
4581 else
4582 VBOX_SIGN_IMAGE_FN =
4583 endif
4584
4585 #
4586 # Darwin code signing.
4587 #
4588 # Currently release signing is done when packing. This may change later.
4589 # (Installer package signing is done elsewhere (VBOX_MACOSX_INSTALLER_SIGN).)
4590 #
4591 if defined(VBOX_CERTIFICATE_FINGERPRINT) && !defined(VBOX_CERTIFICATE_SUBJECT_NAME)
4592 VBOX_CERTIFICATE_SUBJECT_NAME = $(subst $(SP),,$(VBOX_CERTIFICATE_FINGERPRINT))
4593 endif
4594 ifeq ($(VBOX_SIGNING_MODE),test)
4595 VBOX_CERTIFICATE_SUBJECT_NAME ?= $(error You need to set VBOX_CERTIFICATE_SUBJECT_NAME in LocalConfig.kmk.)
4596 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= --sign "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4597 VBOX_TSA_URL ?= none
4598 else ifeq ($(VBOX_SIGNING_MODE),adhoc)
4599 ifdef VBOX_CERTIFICATE_SUBJECT_NAME
4600 $(error VBOX_CERTIFICATE_SUBJECT_NAME must not be set in 'adhoc' signing mode)
4601 endif
4602 VBOX_CERTIFICATE_SUBJECT_NAME = -
4603 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= --sign "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4604 VBOX_TSA_URL ?= none
4605 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out),,2))
4606 else
4607 VBOX_CERTIFICATE_SUBJECT_NAME ?= Developer ID Application: Oracle America, Inc.
4608 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= --sign "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4609 endif
4610
4611 VBOX_CODESIGN ?= codesign
4612 if 0
4613 VBOX_DARWIN_KEXT_SIGN_FILES = CodeDirectory CodeRequirement CodeResources CodeSignature
4614 else
4615 VBOX_DARWIN_KEXT_SIGN_FILES = CodeResources
4616 endif
4617
4618 # Always enable the hardened runtime when signing. Can be disabled if
4619 # trying to build on quite old macOS, which will likely need some effort.
4620 VBOX_WITH_MACOS_HARDENED_RUNTIME ?= 1
4621
4622 ##
4623 # Corp Code Notarization command line. Modifies the file because the tickets are stapled.
4624 # @param 1 The file to be submitted for signing.
4625 # @param 2 Identifier, mandatory.
4626 # @param 3 The directory to put the notarized file in. Defaults to $(dir $1).
4627 VBOX_CCS_NOTARIZE_CMD = $(VBOX_RETRY) $(VBOX_JAVA) -jar "$(VBOX_CCS_CLIENT_JAR)" \
4628 mac_notarize -user "$(VBOX_CCS_USER)" -global_uid "$(VBOX_CCS_GLOBAL_UID)" \
4629 -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER)" \
4630 -file_to_notarize "$1" -bundle_id "$2" -download_location "$(if $3,$3,$(call VBOX_DIRX,$1))"
4631
4632 ## Sign an application bundle, framework or kernel extension.
4633 # @param 1 The bundle to sign.
4634 # @param 2 Identifier, optional.
4635 # @param 3 Additional codesign command line parameters, optional.
4636 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4637 ## @todo cannot handle $(2), the identifier.
4638 ## @todo $(3) is hopefully either empty, --deep or --entitlements=...
4639 VBOX_SIGN_BUNDLE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4640 ditto -c -k --keepParent "$(1)" "$(1).zip"$(NLTAB) \
4641 $(call VBOX_CCS_SIGN_CMD,apple,$(1).zip,,$(subst --entitlements=,-entitlement_file_path ,$(subst --deep,-deep,$(3))) \
4642 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime))$(NLTAB) \
4643 ditto -x -k "$(1).zip" "$(1)/../"$(NLTAB) \
4644 $(RM) -f -- "$(1).zip"
4645 else
4646 VBOX_SIGN_BUNDLE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4647 --verbose=9 \
4648 --force \
4649 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4650 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4651 --file-list - \
4652 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4653 $(3) \
4654 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4655 "$(1)" $(if $(2),--identifier "$(2)",)
4656 endif
4657
4658 ## Sign a Mach-O image.
4659 # @param 1 The file to sign.
4660 # @param 2 Identifier, optional.
4661 # @param 3 Additional codesign command line parameters, optional.
4662 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4663 ## @todo cannot handle $(2), the identifier.
4664 ## @todo $(3) is hopefully either empty or --entitlements=...
4665 VBOX_SIGN_MACHO_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4666 $(call VBOX_CCS_SIGN_CMD,binary,$(1),,$(subst --entitlements=,-entitlement_file_path ,$(3)) \
4667 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime))
4668 else
4669 VBOX_SIGN_MACHO_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4670 --verbose=9 \
4671 --force \
4672 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4673 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4674 --file-list - \
4675 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4676 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4677 $(3) \
4678 "$(1)" \
4679 $(if $(2),--identifier "$(2)",)
4680 endif
4681
4682 ## Commands for signing an extpack dylib file after link.
4683 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4684 VBOX_SIGN_EXTPACK_DYLIB_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),, \
4685 $(call VBOX_CCS_SIGN_CMD,binary,$(out),, \
4686 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime)) )
4687 else
4688 VBOX_SIGN_EXTPACK_DYLIB_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),, \
4689 $(VBOX_CODESIGN) \
4690 --verbose=9 \
4691 --force \
4692 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4693 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4694 --file-list - \
4695 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4696 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4697 $(out) )
4698 endif
4699
4700 ## Sign a VMM Mach-O image.
4701 # @param 1 The file to sign.
4702 # @param 2 Identifier, optional.
4703 VBOX_SIGN_VMM_MOD_FN = $(VBOX_SIGN_MACHO_FN)
4704
4705 ## Sign a non-executable file.
4706 # @param 1 The file to sign.
4707 # @param 2 Identifier, optional.
4708 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4709 ## @todo cannot handle $(2), the identifier.
4710 VBOX_SIGN_FILE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4711 $(call VBOX_CCS_SIGN_CMD,mac_dmg,$(1))$(NLTAB) \
4712 $(REDIRECT) -E 'LC_ALL=C' -we "$(1).tmp" -- ditto -x -k -V "$(1).zip" "$(call VBOX_DIRX,$(1))"$(NLTAB) \
4713 dirname="$(call VBOX_DIRX,$(1))$(DOLLAR)($(SED) -n -e 's+^copying file \([0-9]\{1,\}\)/.\{1,\}$(DOLLAR)+\1+p' "$(1).tmp")" ; \
4714 $(MV) -f -- "$(DOLLAR)dirname/$(DOLLAR)(basename "$(1)")" "$(call VBOX_DIRX,$(1))" ; \
4715 $(RM) -Rf -- "$(DOLLAR)dirname/"$(NLTAB) \
4716 $(RM) -f -- "$(1).zip" "$(1).tmp"
4717 else
4718 VBOX_SIGN_FILE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4719 --verbose=9 \
4720 --force \
4721 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4722 --file-list=- \
4723 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4724 $(if $(2),--identifier "$(2)",) \
4725 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4726 "$(1)"
4727 endif
4728
4729 ## Sign a DMG image.
4730 # @param 1 The file to sign.
4731 # @param 2 Identifier, optional.
4732 # @note Will segfault if --file-list is used on 10.15.2 (kSecCodeInfoChangedFiles -> NULL, outputter doesn't check for NULL).
4733 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4734 VBOX_SIGN_DMG_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(call VBOX_CCS_SIGN_CMD,binary,$(1))
4735 else
4736 VBOX_SIGN_DMG_FN = $(filter-out --file-list=-,$(VBOX_SIGN_FILE_FN))
4737 endif
4738
4739 ## Sign a PKG file. Used with corp code signing only.
4740 # @param 1 The file to sign.
4741 # @param 2 Identifier, optional.
4742 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4743 ## @todo cannot handle $(2), the identifier.
4744 VBOX_SIGN_PKG_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(call VBOX_CCS_SIGN_CMD,mac_pkg,$(1))
4745 endif
4746
4747 ## Notarize a file (usually DMG, can also be PKG). Used with corp code signing only.
4748 # @param 1 The file to notarize.
4749 # @param 2 Identifier, mandatory.
4750 # @param 3 The directory to put the notarized file in. Defaults to $(dir $1).
4751 if $(intersects darwin darwin_notarize all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4752 VBOX_NOTARIZE_FILE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(call VBOX_CCS_NOTARIZE_CMD,$(1),$(2),$(3))
4753 endif
4754
4755 ## @def VBOX_TEST_SIGN_KEXT
4756 # Adds test signing to a $1.kext target (the plist installer target).
4757 #
4758 # After both targets has been defined:
4759 # $(evalcall2 VBOX_TEST_SIGN_KEXT,VBoxDrv)
4760 #
4761 # @param 1 The kext name. Assumes there is a SYSMODS target of name $1
4762 # as well as an .plist installer by the name of '$1.kext'.
4763 # @remarks Currently assumes only binary + Info.plist in the bundle, no
4764 # other files. Should there be more, add them as a list in
4765 # a 2nd parameter.
4766 # @note This is only for the 'test' signing mode, we skip this in
4767 # 'release' signing mode as to not waste time on the build boxes.
4768 ifeq ($(VBOX_SIGNING_MODE),test) ## @todo when kBuild is updated to r2742+, this should be enabled for both modes.
4769 define VBOX_TEST_SIGN_KEXT
4770 $1_INSTTYPE.darwin = none
4771
4772 $1.kext_SOURCES += $$($1.kext_0_OUTDIR)/Contents/MacOS/$1=>MacOS/$1 \
4773 $(foreach extfile, $(VBOX_DARWIN_KEXT_SIGN_FILES) \
4774 , $$($1.kext_0_OUTDIR)/Contents/_CodeSignature/$(extfile)=>_CodeSignature/$(extfile))
4775 $1.kext_SYMLINKS += $(foreach symfile, $(VBOX_DARWIN_KEXT_SIGN_SYMLINKS), $(symfile)=>_CodeSignature/$(symfile))
4776 $1.kext_CLEAN += \
4777 $(foreach extfile, $(VBOX_DARWIN_KEXT_SIGN_FILES) , $$($1.kext_0_OUTDIR)/Contents/_CodeSignature/$(extfile)) \
4778 $(foreach symfile, $(VBOX_DARWIN_KEXT_SIGN_SYMLINKS), $$($1.kext_0_OUTDIR)/Contents/$(symfile)) \
4779 $$($1.kext_0_OUTDIR)/Contents/MacOS/$1 \
4780 $$($1.kext_0_OUTDIR)/$1.kext/Contents/_CodeSignature/
4781 $1.kext_BLDDIRS += $$($1.kext_0_OUTDIR)/Contents/MacOS/
4782
4783 $$$$($1.kext_0_OUTDIR)/Contents/MacOS/$1 \
4784 + $(foreach file,$(VBOX_DARWIN_KEXT_SIGN_FILES), $$$$($1.kext_0_OUTDIR)/Contents/_CodeSignature/$(file)): \
4785 $$$$($1.kext_0_OUTDIR)/Contents/Info.plist $$$$($1_1_TARGET) | $$$$($1.kext_0_OUTDIR)/
4786 $(RM) -Rf -- "$$($1.kext_0_OUTDIR)/Contents/_CodeSignature/" "$$($1.kext_0_OUTDIR)/Contents/MacOS/"
4787 $(MKDIR) -p -- "$$($1.kext_0_OUTDIR)/Contents/MacOS/"
4788 $(INSTALL) -m 644 $$($1_1_TARGET) $$($1.kext_0_OUTDIR)/Contents/MacOS/$1
4789 $(call VBOX_SIGN_BUNDLE_FN,$$($1.kext_0_OUTDIR),org.virtualbox.app.kext.$1,)
4790 endef
4791 else
4792 VBOX_TEST_SIGN_KEXT =
4793 endif
4794
4795
4796 else ifeq ($(KBUILD_HOST),solaris)
4797 #
4798 # Solaris code signing.
4799 #
4800 ifeq ($(VBOX_SIGNING_MODE),test)
4801 VBOX_CERTIFICATE_FILE ?= $(error You need to set VBOX_CERTIFICATE_FILE in LocalConfig.kmk.)
4802 VBOX_TOKEN_NAME ?= $(error You need to set VBOX_TOKEN_NAME in LocalConfig.kmk.)
4803 VBOX_PIN_FILE ?= $(error You need to set VBOX_PIN_FILE in LocalConfig.kmk.)
4804 else
4805 VBOX_CERTIFICATE_FILE ?= $(PATH_ROOT)/oracle.pem
4806 VBOX_TOKEN_NAME ?= "Sun Software PKCS\#11 softtoken"
4807 VBOX_PIN_FILE ?= $(PATH_ROOT)/oracle.pin
4808 endif
4809 VBOX_CERTIFICATE_FILE_ARGS ?= -c $(VBOX_CERTIFICATE_FILE)
4810 VBOX_TOKEN_NAME_ARGS ?= -T $(VBOX_TOKEN_NAME)
4811 VBOX_PIN_ARGS ?= -P $(VBOX_PIN_FILE)
4812
4813 VBOX_ELFSIGN ?= elfsign
4814
4815 # Sign an ELF image.
4816 # @param 1 The elf object file to sign.
4817 VBOX_SIGN_ELF_FN ?= $(VBOX_ELFSIGN) \
4818 sign \
4819 $(VBOX_CERTIFICATE_FILE_ARGS) \
4820 $(VBOX_TOKEN_NAME_ARGS) \
4821 $(VBOX_PIN_ARGS) \
4822 -e "$(1)"
4823
4824 ## Commands for signing a driver image after link.
4825 if $(intersects solaris all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4826 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_CCS_SIGN_CMD,solaris_elf,$(out)))
4827 else
4828 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_ELF_FN,$(out)))
4829 endif
4830
4831 else
4832 # Not Windows, Mac OS X or Solaris build host, ignore.
4833 VBOX_SIGNING_MODE :=
4834 endif
4835
4836 #
4837 # Complain if windows hardening is enabled but not code signing.
4838 #
4839else if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING) && !defined(VBOX_ONLY_BUILD)
4840 $(error You need to enable code signing for a hardened windows build to work.)
4841endif
4842
4843#
4844# Windows .inf editing.
4845#
4846VBOX_EDIT_INF_FN = $(VBOX_EDIT_INF_FN.$(KBUILD_TARGET_ARCH))
4847## Edit an inf file a x86 target.
4848# @param 1 The inf file to edit.
4849# @param 2 The output file.
4850VBOX_EDIT_INF_FN.x86 = $(SED) $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d') \
4851 -e 's/^;x86 *//' \
4852 -e '/^;amd64 /d' \
4853 -e '/^;arm64 /d' \
4854 -e 's/@DOT-NT-ARCH@/.NTx86/g' \
4855 -e 's/@COMMA-NT-ARCH@/,NTx86/g' \
4856 -e 's/^;edit-DriverVer.*/DriverVer = $(date-utc %m\/%d\/%Y),$(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD).$(expr $(VBOX_SVN_REV) % 50000) ; r$(VBOX_SVN_REV)/' \
4857 --output $(2) \
4858 $(1)
4859## Edit an inf file an amd64 target.
4860# @param 1 The inf file to edit.
4861# @param 2 The output file.
4862VBOX_EDIT_INF_FN.amd64 = $(SED) \
4863 $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d') \
4864 -e 's/^;amd64 *//' \
4865 -e '/^;x86 /d' \
4866 -e '/^;arm64 /d' \
4867 -e 's/@DOT-NT-ARCH@/.NTAMD64/g' \
4868 -e 's/@COMMA-NT-ARCH@/,NTAMD64/g' \
4869 -e 's/^;edit-DriverVer.*/DriverVer = $(date-utc %m\/%d\/%Y),$(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD).$(expr $(VBOX_SVN_REV) % 50000) ; r$(VBOX_SVN_REV)/' \
4870 --output $(2) \
4871 $(1)
4872## Edit an inf file for an arm64 target.
4873# @param 1 The inf file to edit.
4874# @param 2 The output file.
4875VBOX_EDIT_INF_FN.arm64 = $(SED) \
4876 $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d') \
4877 -e 's/^;arm64 *//' \
4878 -e '/^;x86 /d' \
4879 -e '/^;amd64 /d' \
4880 -e 's/@DOT-NT-ARCH@/.NTARM64/g' \
4881 -e 's/@COMMA-NT-ARCH@/,NTARM64/g' \
4882 -e 's/^;edit-DriverVer.*/DriverVer = $(date-utc %m\/%d\/%Y),$(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD).$(expr $(VBOX_SVN_REV) % 50000) ; r$(VBOX_SVN_REV)/' \
4883 --output $(2) \
4884 $(1)
4885
4886## @def VBOX_RE_SIGN_DLL_FN
4887# Helper macro for re-signing DLL images from tools that we ship so they won't
4888# cause trouble for the hardened build requirements.
4889#
4890# Invoke via $(call VBOX_RE_SIGN_DLL_FN) inside the SOURCES list. Necessary
4891# _CLEAN entry will be added to the target. If hardening is not enabled or
4892# we're not on windows, the source will be returned.
4893#
4894# @returns Name of the output file name. May have leading space, but no trailing.
4895# @param 1 Target name.
4896# @param 2 The source name.
4897# @param 3 Optional prefix to avoid name collisions.
4898#
4899if defined(VBOX_SIGNING_MODE) && "$(KBUILD_TARGET)" == "win"
4900 if1of (quote, $(KMK_FEATURES))
4901 VBOX_RE_SIGN_DLL_FN = $(if-expr !defined($(1)_VBOX_RE_SIGNED_$(3)$(qnotdir ,$(2))), \
4902 $(evalcall VBOX_RE_SIGN_DLL_INTERNAL_FN,$1,$2,$3) \
4903 ,)$($(1)_0_OUTDIR)/$(3)$(qnotdir ,$2)
4904
4905 define VBOX_RE_SIGN_DLL_INTERNAL_FN
4906 local n = $(3)$(qnotdir ,$2)
4907 ifndef $(1)_VBOX_RE_SIGNED_$(n)
4908 $(1)_VBOX_RE_SIGNED_$(n) := 1
4909 $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(n))
4910
4911 $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@) $(VBOX_SIGN_IMAGE_ORDERDEPS)
4912 $(call MSG_TOOL,SIGNTOOL,,$<,$@)
4913 $(RM) -f -- "$@"
4914 $(CP) -- "$(quote-sh-dq $<)" "$@"
4915 $(CHMOD) a+rw -- "$@"
4916 $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release \
4917 $(if-expr !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT),/IntegrityCheck,) \
4918 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
4919 "$@"
4920 $(call VBOX_SIGN_IMAGE_FN,$@)
4921 endif
4922 endef # VBOX_RE_SIGN_DLL_INTERNAL_FN
4923
4924 else # old kmk: no quote feature
4925 VBOX_RE_SIGN_DLL_FN = $(if-expr !defined($(1)_VBOX_RE_SIGNED_$(3)$(notdir $(2))), \
4926 $(evalcall VBOX_RE_SIGN_DLL_INTERNAL_FN,$1,$2,$3) \
4927 ,)$($(1)_0_OUTDIR)/$(3)$(notdir $2)
4928 define VBOX_RE_SIGN_DLL_INTERNAL_FN
4929 local n = $(3)$(notdir $2)
4930 ifndef $(1)_VBOX_RE_SIGNED_$(n)
4931 $(1)_VBOX_RE_SIGNED_$(n) := 1
4932 $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(n))
4933
4934 $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@) $(VBOX_SIGN_IMAGE_ORDERDEPS)
4935 $(call MSG_TOOL,SIGNTOOL,,$<,$@)
4936 $(RM) -f -- "$@"
4937 $(CP) -- "$<" "$@"
4938 $(CHMOD) a+rw -- "$@"
4939 $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release \
4940 $(if-expr !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT),/IntegrityCheck,) \
4941 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
4942 "$@"
4943 $(call VBOX_SIGN_IMAGE_FN,$@)
4944 endif
4945 endef # VBOX_RE_SIGN_DLL_INTERNAL_FN
4946 endif # old kmk: no quote feature
4947else
4948 VBOX_RE_SIGN_DLL_FN = $(2)
4949endif
4950
4951
4952#
4953# File version info and description macros (ignored on most OSes).
4954#
4955
4956##
4957# Internal macro.
4958#
4959# @param 1 The target name.
4960# @param 2 The description
4961# @param 3 Optional icon file.
4962# @param 4 The template base name.
4963# @param 5 Additional RC options.
4964# @param 6 Original filename to use.
4965#
4966# @remarks ASSUMES RCFLAGS isn't a simple variable (var := value).
4967define VBOX_SET_VER_INFO_INTERNAL
4968 ifeq ($(KBUILD_TARGET),win)
4969 $(1)_SOURCES.win += $(PATH_ROOT)/src/VBox/Artwork/win/$(4)
4970 $(1)_RCFLAGS += /nologo /dIN_INTERNAL_NAME="\"$(1)\"" /dIN_FILE_DESCRIPTION="\"$(2)\"" \
4971 /dIN_ORIGINAL_NAME="\"$(if $(6),$6,$$(notdir $$($(1)_1_INST_TARGET)))\"" \
4972 $(if $(3), /dIN_ICON_FILE="\"$(subst \\,/,$(strip $(3)))\"") $(5)
4973 $$$$($(1)_0_OUTDIR)/src/VBox/Artwork/win/$(basename $(4)).res: \
4974 $(PATH_ROOT)/include/VBox/version.h $$$$(VBOX_VERSION_HEADER)
4975 endif
4976endef
4977
4978##
4979# Macro for setting DLL/SO/DYLIB version information and description.
4980#
4981# The macro must be invoked using evalcall2 after the whole target has
4982# been declared.
4983#
4984# @param 1 The target name.
4985# @param 2 The description
4986# @param 3 Optional icon file.
4987VBOX_SET_VER_INFO_DLL = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateDll.rc,)
4988
4989##
4990# Macro for setting EXE version information and description.
4991#
4992# The macro must be invoked using call after the whole target has been declared.
4993#
4994# @param 1 The target name.
4995# @param 2 The description
4996# @param 3 Optional icon file.
4997# @param 4 Optional OriginalFilename value to use. Defaults to target name w/o dir.
4998VBOX_SET_VER_INFO_EXE = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateExe.rc,,$4)
4999
5000##
5001# Macro for setting driver version information and description.
5002#
5003# The macro must be invoked using call after the whole target has been declared.
5004#
5005# @param 1 The target name.
5006# @param 2 The description
5007# @param 3 Optional icon file.
5008# @param 4 Optional VFT2_DRV_xxx define for windows. Uses VFT2_UNKNOWN by default.
5009VBOX_SET_VER_INFO_DRV = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateDrv.rc,$(if $(4), /dIN_FILE_SUBTYPE=$(4)))
5010
5011##
5012# Macro for setting the version information and description for a ring-0 module.
5013#
5014# The macro must be invoked using call after the whole target has been declared.
5015#
5016# @param 1 The target name.
5017# @param 2 The description
5018# @param 3 Optional icon file.
5019VBOX_SET_VER_INFO_R0 = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateR0.rc,)
5020
5021##
5022# Macro for setting the version information and description for a raw-mode context module.
5023#
5024# The macro must be invoked using call after the whole target has been declared.
5025#
5026# @param 1 The target name.
5027# @param 2 The description
5028# @param 3 Optional icon file.
5029VBOX_SET_VER_INFO_RC = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateRc.rc,)
5030
5031
5032
5033#
5034# Adjust kBuild defaults.
5035#
5036kBuildGlobalDefaults_DEBUG_NOSTAGE.win = true
5037kBuildGlobalDefaults_DEBUG_NOSTAGE.os2 = true
5038if1of ($(KBUILD_TARGET), darwin win)
5039 kBuildGlobalDefaults_LD_DEBUG = split
5040endif
5041
5042
5043#
5044# Haiku resource and version generation.
5045#
5046ifeq ($(KBUILD_HOST),haiku)
5047 VBOX_HAIKU_RCTOOL := rc
5048 VBOX_HAIKU_XRESTOOL := xres
5049 VBOX_HAIKU_SETVERSIONTOOL := setversion
5050 # XXX: install won't preserve attributes...
5051 VBOX_HAIKU_MIMESETTOOL := mimeset
5052
5053 ## Add optional resources to the program, set its version info, and sniff its mime properties.
5054 # @param 1 The file to add resources to.
5055 # @param 2 The resource files.
5056 # @param 3 The target name.
5057 define VBOX_HAIKU_XRES_SETVER_FN
5058 $(if $(2),$(call MSG_TOOL,HaikuAddResources,$(3),$(2))
5059 $(QUIET)$(VBOX_HAIKU_XRESTOOL) -o $(1) $(2),)
5060 $(call MSG_TOOL,HaikuSetVersion,$(3))
5061 $(QUIET)$(VBOX_HAIKU_SETVERSIONTOOL) $(1) \
5062 -app $(VBOX_VERSION_MAJOR) $(VBOX_VERSION_MINOR) $(VBOX_VERSION_BUILD) d $(VBOX_SVN_REV) \
5063 -short "$(VBOX_PRODUCT)" \
5064 -long "$(VBOX_PRODUCT) $(VBOX_VERSION_STRING) $(shell /bin/echo -e '\xC2\xA9')2009-$(VBOX_C_YEAR) $(VBOX_VENDOR)"
5065 $(call MSG_TOOL,HaikuMimeSet,$(3))
5066 $(QUIET)$(VBOX_HAIKU_MIMESETTOOL) -f $(1)
5067 endef
5068
5069 VBOX_HAIKU_XRES_SETVER_CMDS ?= $(if $(eq $(tool_do),LINK_PROGRAM),$(call VBOX_HAIKU_XRES_SETVER_FN,$(out),$($(target)_RSRCS),$(target)),)
5070endif
5071
5072#
5073# Default prefixes and suffixes.
5074#
5075VBOX_PREF_LIB =
5076if1of ($(KBUILD_TARGET), os2 win)
5077 VBOX_SUFF_LIB = .lib
5078else
5079 VBOX_SUFF_LIB = .a
5080endif
5081if1of ($(KBUILD_HOST), os2 win)
5082 VBOX_HOSTSUFF_LIB = .lib
5083else
5084 VBOX_HOSTSUFF_LIB = .a
5085endif
5086VBOX_SUFF_DLL = $(SUFF_DLL)
5087ifeq ($(KBUILD_TARGET),os2) # GXX3OMF produces out .o at the moment.
5088 VBOX_SUFF_OBJ = .o
5089else
5090 VBOX_SUFF_OBJ = $(SUFF_OBJ)
5091endif
5092VBOXW32GUEST_SUFF_LIB = .lib
5093VBOXLNX32GUEST_SUFF_LIB = .a
5094
5095#
5096# SDKs for external libraries.
5097#
5098ifdef VBOX_WITH_DXVK
5099 SDK_VBoxDxVk := Direct3D 9/10/11 to Vulkan - for dll linking.
5100 SDK_VBoxDxVk_DEFAULT_INCS := \
5101 $(PATH_ROOT)/src/libs/dxvk-2.3.1/include/native/directx \
5102 $(PATH_ROOT)/src/libs/dxvk-2.3.1/include/native/windows
5103 SDK_VBoxDxVk_INCS ?= $(SDK_VBoxDxVk_DEFAULT_INCS)
5104 # Loaded dynamically
5105 SDK_VBoxDxVk_LIBS ?=
5106endif
5107
5108ifdef VBOX_WITH_LIBCURL
5109 SDK_VBoxLibCurl := libcurl for dll linking.
5110 SDK_VBoxLibCurl_INCS ?= $(PATH_ROOT)/src/libs/curl-8.7.1/include
5111 SDK_VBoxLibCurl_LIBS ?= $(PATH_STAGE_LIB)/VBox-libcurl$(VBOX_SUFF_LIB)
5112 SDK_VBoxLibCurl_DEFS ?= BUILDING_LIBCURL
5113
5114 SDK_VBoxLibCurl-x86 = libcurl/x86 for dll linking.
5115 SDK_VBoxLibCurl-x86_INCS ?= $(PATH_ROOT)/src/libs/curl-8.7.1/include
5116 SDK_VBoxLibCurl-x86_LIBS.x86 ?= $(PATH_STAGE_LIB)/VBox-libcurl-x86$(VBOX_SUFF_LIB)
5117 SDK_VBoxLibCurl-x86_DEFS ?= BUILDING_LIBCURL
5118endif
5119
5120SDK_VBoxLibPng := protable network graphics (png) library for dll linking.
5121SDK_VBoxLibPng_INCS ?= $(PATH_ROOT)/src/libs/libpng-1.6.43
5122SDK_VBoxLibPng_LIBS ?= $(PATH_STAGE_LIB)/VBox-libpng$(VBOX_SUFF_LIB)
5123
5124# lzf
5125SDK_VBoxLzf := lzf compressor/decompressor for dll linking.
5126SDK_VBoxLzf_INCS ?= $(PATH_ROOT)/src/libs/liblzf-3.6
5127SDK_VBoxLzf_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzf$(VBOX_SUFF_LIB)
5128
5129SDK_VBoxLzf-x86 := lzf/x86 compressor/decompressor for dll linking.
5130SDK_VBoxLzf-x86_EXTENDS := VBoxLzf
5131SDK_VBoxLzf-x86_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzf-x86$(VBOX_SUFF_LIB)
5132
5133SDK_VBoxLzfStatic := lzf compressor/decompressor for static linking.
5134SDK_VBoxLzfStatic_EXTENDS := VBoxLzf
5135if1of ($(KBUILD_TARGET), os2 win)
5136 SDK_VBoxLzfStatic_LIBS := $(PATH_STAGE_LIB)/VBox-liblzf-static$(VBOX_SUFF_LIB)
5137endif
5138
5139# openssl
5140SDK_VBoxOpenSslStatic := OpenSSL - Only for VBoxRT and/or statically linked programs.
5141SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.1.7-headers/include
5142SDK_VBoxOpenSslStatic_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)
5143SDK_VBoxOpenSslStatic_ORDERDEPS ?= $(crypto-headers_1_TARGET)
5144if !defined(VBOX_ONLY_SDK) \
5145 && (!defined(VBOX_ONLY_ADDITIONS) || !defined(VBOX_ONLY_ADDITIONS_WITHOUT_RTISOMAKER)) \
5146 && (!defined(VBOX_ONLY_EXTPACKS) || !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS)) \
5147 && ("$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)")
5148 SDK_VBoxOpenSslStatic_DEPS ?= $(SDK_VBoxOpenSslStatic_INCS)/openssl/openssl-mangling.h
5149endif
5150SDK_VBoxOpenSslStatic_LIBS ?= \
5151 $(PATH_STAGE_LIB)/VBox-libssl$(VBOX_SUFF_LIB) \
5152 $(PATH_STAGE_LIB)/VBox-libcrypto$(VBOX_SUFF_LIB)
5153
5154SDK_VBoxOpenSslStatic-x86 := OpenSSL/x86 - Only for VBoxRT and/or statically linked programs.
5155SDK_VBoxOpenSslStatic-x86_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.1.7-headers/include
5156SDK_VBoxOpenSslStatic-x86_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)
5157SDK_VBoxOpenSslStatic-x86_ORDERDEPS ?= $(crypto-headers_1_TARGET)
5158if ("$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)")
5159 SDK_VBoxOpenSslStatic-x86_DEPS ?= $(SDK_VBoxOpenSslStatic_INCS)/openssl/openssl-mangling.h
5160endif
5161SDK_VBoxOpenSslStatic-x86_LIBS ?= \
5162 $(PATH_STAGE_LIB)/VBox-libssl-x86$(VBOX_SUFF_LIB) \
5163 $(PATH_STAGE_LIB)/VBox-libcrypto-x86$(VBOX_SUFF_LIB)
5164
5165ifdef VBOX_WITH_BLD_RTSIGNTOOL_SIGNING
5166 SDK_VBoxOpenSslBldProg := OpenSSL - Build tools verison (i.e. bldRTSignTool)
5167 SDK_VBoxOpenSslBldProg_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)
5168 SDK_VBoxOpenSslBldProg_ORDERDEPS ?= $(crypto-headers_1_TARGET)
5169 if !defined(VBOX_ONLY_SDK) \
5170 && ("$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)")
5171 SDK_VBoxOpenSslBldProg_DEPS ?= $(SDK_VBoxOpenSslStatic_INCS)/openssl/openssl-mangling.h
5172 endif
5173 SDK_VBoxOpenSslBldProg_LIBS ?= \
5174 $(PATH_STAGE_LIB)/VBoxBldProg-libssl$(VBOX_SUFF_LIB) \
5175 $(PATH_STAGE_LIB)/VBoxBldProg-libcrypto$(VBOX_SUFF_LIB)
5176endif
5177
5178SDK_VBoxOpenSsl := This is what you should be using! It links against VBoxRT.
5179SDK_VBoxOpenSsl_EXTENDS := VBoxOpenSslStatic
5180if "$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)"
5181 SDK_VBoxOpenSsl_LIBS = $(NO_SUCH_VARIABLE)
5182endif
5183
5184ifdef VBOX_WITH_LIBOGG
5185 SDK_VBoxLibOgg := libogg for dll linking.
5186 SDK_VBoxLibOgg_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libogg-1.3.5/include
5187 SDK_VBoxLibOgg_INCS ?= $(SDK_VBoxLibOgg_DEFAULT_INCS)
5188 SDK_VBoxLibOgg_LIBS ?= $(PATH_STAGE_LIB)/VBox-libogg$(VBOX_SUFF_LIB)
5189endif
5190
5191ifdef VBOX_WITH_LIBVORBIS
5192 SDK_VBoxLibVorbis := libvorbis for dll linking.
5193 SDK_VBoxLibVorbis_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libvorbis-1.3.7/include
5194 SDK_VBoxLibVorbis_INCS ?= $(SDK_VBoxLibVorbis_DEFAULT_INCS)
5195 SDK_VBoxLibVorbis_LIBS ?= $(PATH_STAGE_LIB)/VBox-libvorbis$(VBOX_SUFF_LIB)
5196endif
5197
5198# Our SoftFloat 3e variant.
5199SDK_VBoxSoftFloatR3Shared := SoftFloat 3 for dll linking.
5200SDK_VBoxSoftFloatR3Shared_DEFS := SOFTFLOAT_FAST_INT64
5201SDK_VBoxSoftFloatR3Shared_DEFS.amd64 := LITTLEENDIAN
5202SDK_VBoxSoftFloatR3Shared_DEFS.arm64 := LITTLEENDIAN
5203SDK_VBoxSoftFloatR3Shared_DEFS.x86 := LITTLEENDIAN
5204if1of ($(KBUILD_TARGET), win)
5205 SDK_VBoxSoftFloatR3Shared_DEFS += THREAD_LOCAL=__declspec(thread)
5206else
5207 SDK_VBoxSoftFloatR3Shared_DEFS += THREAD_LOCAL=__thread
5208endif
5209SDK_VBoxSoftFloatR3Shared_INCS = \
5210 $(PATH_ROOT)/src/libs/softfloat-3e/source/include
5211SDK_VBoxSoftFloatR3Shared_LIBS = \
5212 $(PATH_STAGE_LIB)/VBox-SoftFloat$(VBOX_SUFF_LIB)
5213
5214SDK_VBoxSoftFloatR0 := SoftFloat 3 for ring-0 linking.
5215SDK_VBoxSoftFloatR0_DEFS := SOFTFLOAT_FAST_INT64
5216SDK_VBoxSoftFloatR0_DEFS.amd64 := LITTLEENDIAN
5217SDK_VBoxSoftFloatR0_DEFS.arm64 := LITTLEENDIAN
5218SDK_VBoxSoftFloatR0_DEFS.x86 := LITTLEENDIAN
5219SDK_VBoxSoftFloatR0_INCS = \
5220 $(PATH_ROOT)/src/libs/softfloat-3e/source/include
5221SDK_VBoxSoftFloatR0_LIBS = \
5222 $(PATH_STAGE_LIB)/VBox-SoftFloatR0$(VBOX_SUFF_LIB)
5223
5224SDK_VBoxSoftFloatGuestR3Shared := SoftFloat 3 for ring-0 linking.
5225SDK_VBoxSoftFloatGuestR3Shared_DEFS := SOFTFLOAT_FAST_INT64
5226SDK_VBoxSoftFloatGuestR3Shared_DEFS.amd64 := LITTLEENDIAN
5227SDK_VBoxSoftFloatGuestR3Shared_DEFS.arm64 := LITTLEENDIAN
5228SDK_VBoxSoftFloatGuestR3Shared_DEFS.x86 := LITTLEENDIAN
5229SDK_VBoxSoftFloatGuestR3Shared_INCS = \
5230 $(PATH_ROOT)/src/libs/softfloat-3e/source/include
5231SDK_VBoxSoftFloatGuestR3Shared_LIBS.x86 = \
5232 $(VBOX_PATH_ADDITIONS_LIB)/VBox-SoftFloatGuestR3Shared-x86$(VBOX_SUFF_LIB)
5233SDK_VBoxSoftFloatGuestR3Shared_LIBS.$(KBUILD_TARGET_ARCH) = \
5234 $(VBOX_PATH_ADDITIONS_LIB)/VBox-SoftFloatGuestR3Shared$(VBOX_SUFF_LIB)
5235
5236ifdef VBOX_WITH_LIBSSH
5237 SDK_VBoxLibSsh := libssh for dynamic dll loading with assembly stubs.
5238 SDK_VBoxLibSsh_INCS ?= $(PATH_ROOT)/src/libs/libssh-0.10.6/include
5239 # SDK_VBoxLibSsh_LIBS is not defined, as VBoxLibSsh dll is not linked, but loaded explicitly
5240 # by auto-generated stub code (lazy loading)
5241endif
5242
5243ifdef VBOX_WITH_LIBTPMS
5244 SDK_VBoxLibTpms := libtpms for dll linking.
5245 SDK_VBoxLibTpms_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libtpms-0.9.6/include
5246 SDK_VBoxLibTpms_INCS ?= $(SDK_VBoxLibTpms_DEFAULT_INCS)
5247 SDK_VBoxLibTpms_LIBS ?= $(PATH_STAGE_LIB)/VBox-libtpms$(VBOX_SUFF_LIB)
5248endif
5249
5250ifdef VBOX_WITH_LIBVPX
5251 SDK_VBoxLibVpx := libvpx for dll linking.
5252 SDK_VBoxLibVpx_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libvpx-1.14.1
5253 SDK_VBoxLibVpx_INCS ?= $(SDK_VBoxLibVpx_DEFAULT_INCS)
5254 SDK_VBoxLibVpx_LIBS ?= $(PATH_STAGE_LIB)/VBox-libvpx$(VBOX_SUFF_LIB)
5255endif
5256
5257ifdef VBOX_WITH_LIBLZMA
5258 SDK_VBoxLibLzma := liblzma for dll linking.
5259 SDK_VBoxLibLzma_DEFAULT_INCS := $(PATH_ROOT)/src/libs/liblzma-5.4.1/api
5260 SDK_VBoxLibLzma_INCS ?= $(SDK_VBoxLibLzma_DEFAULT_INCS)
5261 SDK_VBoxLibLzma_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzma$(VBOX_SUFF_LIB)
5262
5263 SDK_VBoxLibLzma-x86 := liblzma/x86 compressor/decompressor for dll linking.
5264 SDK_VBoxLibLzma-x86_EXTENDS := VBoxLibLzma
5265 SDK_VBoxLibLzma-x86_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzma-x86$(VBOX_SUFF_LIB)
5266
5267 SDK_VBoxLibLzmaStatic := liblzma for static linking
5268 SDK_VBoxLibLzmaStatic_EXTENDS := VBoxLibLzma
5269 SDK_VBoxLibLzmaStatic_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzma-static$(VBOX_SUFF_LIB)
5270endif
5271
5272# libxml2
5273SDK_VBoxLibXml2 := libxml2 for dll linking.
5274SDK_VBoxLibXml2_INCS ?= $(PATH_ROOT)/src/libs/libxml2-2.13.2/include
5275SDK_VBoxLibXml2_DEFS ?= _REENTRANT LIBXML_STATIC LIBXML_STATIC_FOR_DLL
5276SDK_VBoxLibXml2_DEFS.win ?= WIN32 _WINDOWS _MBCS HAVE_WIN32_THREADS HAVE_COMPILER_TLS
5277# Note: no linking to LIB here, we do that explicitly in src/VBox/Runtime/Makefile.kmk to link
5278# libxml against VBoxRT
5279
5280# zlib
5281SDK_VBoxZlib := zlib for dll linking.
5282if1of ($(KBUILD_TARGET), os2 solaris win)
5283 SDK_VBoxZlib_INCS ?= $(PATH_ROOT)/src/libs/zlib-1.2.13
5284 SDK_VBoxZlib_LATE_LIBS ?= $(PATH_STAGE_LIB)/VBox-zlib$(VBOX_SUFF_LIB)
5285else
5286 SDK_VBoxZlib_INCS ?=
5287 SDK_VBoxZlib_LATE_LIBS ?= z
5288 SDK_VBoxZlib_DEFS.linux ?= _LARGEFILE64_SOURCE
5289endif
5290
5291SDK_VBoxZlib-x86 := zlib/x86
5292SDK_VBoxZlib-x86_EXTENDS = VBoxZlib
5293if1of ($(KBUILD_TARGET), os2 solaris win)
5294 SDK_VBoxZlib-x86_LIBS ?= $(PATH_STAGE_LIB)/VBox-zlib-x86$(VBOX_SUFF_LIB)
5295endif
5296
5297SDK_VBoxZlibStatic := zlib for static linking
5298SDK_VBoxZlibStatic_EXTENDS := VBoxZlib
5299if1of ($(KBUILD_TARGET), os2 win) # Not required on solaris.
5300 SDK_VBoxZlibStatic_LATE_LIBS ?= $(PATH_STAGE_LIB)/VBox-zlib-static$(VBOX_SUFF_LIB)
5301endif
5302
5303#
5304# Special SDK for the problematic NTDLL.LIB.
5305#
5306SDK_VBoxNtDll := Mini NTDLL import library, required by IPRT.
5307SDK_VBoxNtDll_LIBS.x86 ?= $(PATH_STAGE_LIB)/RuntimeR3NtDll-x86.lib
5308SDK_VBoxNtDll_LIBS.amd64 ?= $(PATH_STAGE_LIB)/RuntimeR3NtDll-amd64.lib
5309SDK_VBoxNtDll_LIBS.arm64 ?= $(PATH_STAGE_LIB)/RuntimeR3NtDll-arm64.lib
5310
5311#
5312# SDK for including newdev.lib.
5313# It conceptually moved from the WDK to the PSDK with W10, as it's now in the um subdir.
5314#
5315SDK_VBoxWinNewDevLib := Abstracts where to find newdev.lib.
5316ifn1of ($(VBOX_WINPSDK), WINPSDK71 WINPSDK80)
5317 SDK_VBoxWinNewDevLib_LIBS.x86 = $(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/newdev.lib
5318 SDK_VBoxWinNewDevLib_LIBS.amd64 = $(PATH_SDK_$(VBOX_WINPSDK)_LIB.amd64)/newdev.lib
5319 SDK_VBoxWinNewDevLib_LIBS.arm64 = $(PATH_SDK_$(VBOX_WINPSDK)_LIB.arm64)/newdev.lib
5320else
5321 SDK_VBoxWinNewDevLib_LIBS.x86 = $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/newdev.lib
5322 SDK_VBoxWinNewDevLib_LIBS.amd64 = $(PATH_SDK_$(VBOX_WINDDK)_LIB.amd64)/newdev.lib
5323endif
5324
5325#
5326# Determine Solaris version.
5327#
5328ifeq ($(KBUILD_TARGET),solaris)
5329 VBOX_SOLARIS_VERSION := $(expr $(KBUILD_HOST_VERSION_MAJOR) * 100 + $(KBUILD_HOST_VERSION_MINOR))
5330 ifeq ($(VBOX_SOLARIS_VERSION),510)
5331 DEFS.solaris += RT_OS_SOLARIS_10
5332 # Solaris 10 does not include crossbow.
5333 VBOX_SOLARIS_10 = 1
5334 # We cannot compile additions on Solaris 10, due kernel interface deps
5335 VBOX_WITHOUT_ADDITIONS := 1
5336 VBOX_WITH_ADDITIONS =
5337 else ifeq ($(VBOX_SOLARIS_VERSION),511)
5338 # OSS audio support for Solaris
5339 VBOX_WITH_AUDIO_OSS := 1
5340 endif
5341
5342 # XPCOM namespace cleanup issue with Solaris GCC 4.5.2 and newer, see @bugref{5838}.
5343 if $(VBOX_GCC_VERSION_CXX) >= 40502
5344 VBOX_WITH_XPCOM_NAMESPACE_CLEANUP =
5345 endif
5346endif
5347
5348#
5349# VBoxTpG tool.
5350#
5351TOOL_VBoxTpG = The VirtualBox Tracepoint Generator
5352TOOL_VBoxTpG_DTRACE_DEPORD = $(VBOX_VBOXTPG)
5353TOOL_VBoxTpG_DTRACE_HDR_FLAGS := \
5354 -h --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
5355define TOOL_VBoxTpG_DTRACE_HDR_CMDS
5356 $(QUIET)$(VBOX_VBOXTPG) $(if-expr $(intersects $(bld_trg_arch),$(KBUILD_ARCHES_64)),-64,-32) \
5357 $(flags) -o "$(out)" -s "$(source)"
5358endef
5359TOOL_VBoxTpG_DTRACE_OBJ_NOT_NEEDED :=
5360TOOL_VBoxTpG_DTRACE_OBJ_FLAGS := -G --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
5361define TOOL_VBoxTpG_DTRACE_OBJ_CMDS
5362 $(QUIET)$(VBOX_VBOXTPG) --assembler "$(TOOL_$(VBOX_ASTOOL)_AS)" \
5363 $(if-expr $(intersects $(bld_trg_arch),$(KBUILD_ARCHES_64)),-64,-32) \
5364 $(flags) \
5365 -o "$(out)" -s "$(source)"
5366endef
5367
5368
5369#
5370# VBoxTpG tool - Disabled, only generate the header.
5371#
5372TOOL_VBoxTpG-Disabled = The VirtualBox Tracepoint Generator, disabled.
5373TOOL_VBoxTpG-Disabled_DTRACE_DEPORD = $(VBOX_VBOXTPG)
5374TOOL_VBoxTpG-Disabled_DTRACE_HDR_FLAGS := -h
5375define TOOL_VBoxTpG-Disabled_DTRACE_HDR_CMDS
5376 $(QUIET)$(VBOX_VBOXTPG) $(flags) -o "$(out)" -s "$(source)"
5377endef
5378TOOL_VBoxTpG-Disabled_DTRACE_OBJ_NOT_NEEDED := $(KBUILD_OSES)
5379
5380
5381#
5382# dtrace+VBoxTpG tool for ring-3 to ring-0 pointer conversion.
5383#
5384TOOL_DTraceAndVBoxTpG = DTrace and the VirtualBox Tracepoint Generator working together on static ring-3 probes.
5385TOOL_DTraceAndVBoxTpG_EXTENDS = StandardDTrace
5386TOOL_DTraceAndVBoxTpG_DTRACE_DEPORD = $(VBOX_VBOXTPG)
5387TOOL_DTraceAndVBoxTpG_DTRACE_HDR_CMDS =
5388define TOOL_DTraceAndVBoxTpG_DTRACE_HDR_CMDS
5389 $(TOOL_StandardDTrace_DTRACE_HDR_CMDS)
5390 $(QUIET)$(VBOX_VBOXTPG) --generate-wrapper-header --host-$(VBOX_HC_ARCH_BITS)-bit --ring-3-context \
5391 $(filter-out -C, $(filter-out -h,$(flags))) \
5392 -o "$(out).tmp" -s "$(source)"
5393 $(APPEND) "$(out).tmp"
5394 $(SED) -e 's/\(#define.*\)(arg0/\1_ORIGINAL(arg0/' --append "$(out).tmp" "$(out)"
5395 $(MV) -f -- "$(out).tmp" "$(out)"
5396endef
5397TOOL_DTraceAndVBoxTpG_DTRACE_OBJ_NOT_NEEDED = $(TOOL_StandardDTrace_DTRACE_OBJ_NOT_NEEDED)
5398TOOL_DTraceAndVBoxTpG_DTRACE_OBJ_CMDS = $(TOOL_StandardDTrace_DTRACE_OBJ_CMDS)
5399
5400
5401ifdef VBOX_WITH_RAW_MODE
5402 #
5403 # Template for building RC things.
5404 #
5405 # Disabled Visual C++ warnings:
5406 # -wd4505: 'iemRaisePageFaultJmp' : unreferenced local function has been removed
5407 #
5408 TEMPLATE_VBoxRc = VBox Raw-Mode Context
5409 TEMPLATE_VBoxRc_ASTOOL := $(VBOX_ASTOOL32)
5410 TEMPLATE_VBoxRc_ASFLAGS = $(VBOX_ASFLAGS32)
5411 TEMPLATE_VBoxRc_DEFS = IN_RC IPRT_NO_CRT RT_WITH_NOCRT_ALIASES $(ARCH_BITS_DEFS)
5412 TEMPLATE_VBoxRc_INCS = $(PATH_ROOT)/include/iprt/nocrt
5413 TEMPLATE_VBoxRc_SYSSUFF = .rc
5414 TEMPLATE_VBoxRc_BLD_TRG_ARCH = x86
5415 TEMPLATE_VBoxRc_MODE = a+r,u+w
5416
5417 TEMPLATE_VBoxRc_USES += dtrace
5418 TEMPLATE_VBoxRc_DTRACE_HDR_FLAGS = --raw-mode-context
5419 TEMPLATE_VBoxRc_DTRACE_OBJ_FLAGS = --raw-mode-context --probe-fn-name "VMMRCProbeFire"
5420 ifdef VBOX_WITH_DTRACE_RC
5421 TEMPLATE_VBoxRc_DTRACETOOL = VBoxTpG
5422 TEMPLATE_VBoxRc_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_RC
5423 else
5424 TEMPLATE_VBoxRc_DTRACETOOL = VBoxTpG-Disabled
5425 endif
5426
5427 ifeq ($(VBOX_LDR_FMT32),pe)
5428 TEMPLATE_VBoxRc_TOOL = $(VBOX_VCC_TOOL_STEM)X86
5429 TEMPLATE_VBoxRc_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
5430 TEMPLATE_VBoxRc_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -GS- $(VBOX_VCC_WCHAR_T_VARIANT) -Gs8192 $(VBOX_VCC_GC_OPT) $(VBOX_VCC_GC_FP) \
5431 -Gy $(VBOX_VCC_WARN_ALL) -wd4505 $(VBOX_VCC_WERR)
5432 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
5433 TEMPLATE_VBoxRc_CXXFLAGS += -Gw
5434 endif
5435 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
5436 TEMPLATE_VBoxRc_CXXFLAGS += -Zc:inline
5437 endif
5438 ifdef VBOX_WITH_MSC_ANALYZE_THIS
5439 TEMPLATE_VBoxRc_CXXFLAGS += /analyze
5440 endif
5441 TEMPLATE_VBoxRc_CFLAGS = $(TEMPLATE_VBoxRc_CXXFLAGS)
5442 TEMPLATE_VBoxRc_LDFLAGS = -Ignore:4197 \
5443 -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Release -Debug -Opt:Ref -Opt:Icf \
5444 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5445 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5446 if defined(VBOX_SIGNING_MODE) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
5447 TEMPLATE_VBoxRc_LDFLAGS += -IntegrityCheck
5448 endif
5449 TEMPLATE_VBoxRc_LATE_LIBS += \
5450 $(PATH_STAGE_LIB)/RuntimeRCStub$(VBOX_SUFF_LIB)
5451 TEMPLATE_VBoxRc_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
5452 TEMPLATE_VBoxRc_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
5453 endif # pe
5454
5455 ifeq ($(VBOX_LDR_FMT32),elf)
5456 TEMPLATE_VBoxRc_TOOL = $(VBOX_GCC32_TOOL)
5457 TEMPLATE_VBoxRc_CXXFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC32_Wno-variadic-macros) -fno-exceptions $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fno-strict-aliasing $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden) -fno-rtti $(VBOX_GCC_IPRT_FMT_CHECK)
5458 TEMPLATE_VBoxRc_CFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC32_Wno-variadic-macros) -fno-exceptions $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fno-strict-aliasing $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_IPRT_FMT_CHECK)
5459 if $(VBOX_GCC32_VERSION_CC) < 30400
5460 TEMPLATE_VBoxRc_DEFS += RT_WITHOUT_PRAGMA_ONCE
5461 endif
5462 ifeq ($(KBUILD_TARGET),solaris)
5463 TEMPLATE_VBoxRc_LDFLAGS = -r
5464 else
5465 TEMPLATE_VBoxRc_LDFLAGS = -nostdlib -Bsymbolic -g
5466 ## @todo WTF doesn't the globals work? Debug info is supposed to be split everywhere. GRR
5467 TEMPLATE_VBoxRc_LD_DEBUG = split
5468 endif
5469 ifn1of ($(KBUILD_TARGET), solaris freebsd)
5470 TEMPLATE_VBoxRc_LATE_LIBS = \
5471 $(VBOX_GCC32_LIBGCC) # intrinsics
5472 endif
5473 if1of ($(KBUILD_TARGET), linux)
5474 TEMPLATE_VBoxRc_POST_CMDS = $(if $(eq $(tool_do),LINK_SYSMOD),if readelf -S $(out)|grep -q "[cd]tors"; then echo "Found ctors/dtors in $(out)!"; exit 1; fi)
5475 endif
5476 endif
5477
5478 ifeq ($(VBOX_LDR_FMT32),macho)
5479 TEMPLATE_VBoxRc_TOOL = $(VBOX_GCC_TOOL)
5480 TEMPLATE_VBoxRc_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
5481 TEMPLATE_VBoxRc_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
5482 TEMPLATE_VBoxRc_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) -m32 -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC32_Wno-variadic-macros) -fno-common -msoft-float -static $(VBOX_GCC_fno-stack-protector) -fno-exceptions $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing -fno-rtti $(VBOX_GCC_std)
5483 TEMPLATE_VBoxRc_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -m32 -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC32_Wno-variadic-macros) -fno-common -msoft-float -static $(VBOX_GCC_fno-stack-protector) -fno-exceptions $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing
5484 TEMPLATE_VBoxRc_LDFLAGS = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -m32 -nostdlib
5485 #TEMPLATE_VBoxRc_LDFLAGS.release = -Wl,-S ???
5486 endif
5487
5488 ifeq ($(VBOX_LDR_FMT32),lx)
5489 TEMPLATE_VBoxRc_TOOL = GXX3OMF
5490 if $(VBOX_GCC_VERSION_CC) < 30400
5491 TEMPLATE_VBoxRc_DEFS += RT_WITHOUT_PRAGMA_ONCE
5492 endif
5493 TEMPLATE_VBoxRc_CXXFLAGS = -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC32_Wno-variadic-macros) $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing -fno-exceptions -fno-rtti
5494 TEMPLATE_VBoxRc_CFLAGS = -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC32_Wno-variadic-macros) $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing -fno-exceptions
5495 TEMPLATE_VBoxRc_LDFLAGS = -Zdll -nostdlib
5496 TEMPLATE_VBoxRc_LATE_LIBS = \
5497 $(VBOX_GCC32_LIBGCC) \
5498 $(VBOX_OBJ_SYS0) \
5499 end
5500 endif
5501
5502
5503 #
5504 # Template for building a RC ring-3 testcase (tstVMStructGC, tstDevStructGC).
5505 #
5506 TEMPLATE_VBoxRcExe = VBox Raw-Mode as ring-3 testcase
5507 TEMPLATE_VBoxRcExe_EXTENDS = VBoxRc
5508 TEMPLATE_VBoxRcExe_DEFS = $(filter-out IPRT_NO_CRT RT_WITH_NOCRT_ALIASES,$(TEMPLATE_VBoxRc_DEFS))
5509 TEMPLATE_VBoxRcExe_INCS = $(NO_SUCH_VARIABLE)
5510 TEMPLATE_VBoxRcExe_MODE = $(NO_SUCH_VARIABLE)
5511
5512 ifeq ($(VBOX_LDR_FMT32),pe)
5513 TEMPLATE_VBoxRcExe_LDFLAGS = -Ignore:4197 \
5514 -Incremental:NO -MapInfo:Exports -NoD -Debug -Opt:Ref -Opt:Icf \
5515 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5516 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5517 TEMPLATE_VBoxRcExe_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK)
5518 TEMPLATE_VBoxRcExe_LATE_LIBS = \
5519 $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/libcmt.lib \
5520 $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/oldnames.lib
5521 endif
5522
5523 ifeq ($(VBOX_LDR_FMT32),elf)
5524 TEMPLATE_VBoxRcExe_CFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CFLAGS)) -O0
5525 TEMPLATE_VBoxRcExe_CXXFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CXXFLAGS)) -O0
5526 TEMPLATE_VBoxRcExe_LDFLAGS = -g
5527 TEMPLATE_VBoxRcExe_LDFLAGS.dbgopt = -g
5528 TEMPLATE_VBoxRcExe_LDFLAGS.strict = -g
5529 TEMPLATE_VBoxRcExe_LDFLAGS.release = -g
5530 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), freebsd.amd64)
5531 # The FreeBSD port of gcc isn't picking up -m32 where it should.
5532 TEMPLATE_VBoxRcExe_DEFS.$(KBUILD_TARGET) = $(TEMPLATE_VBoxRc_DEFS.$(KBUILD_TARGET)) IPRT_DONT_USE_SYSTEM_STDINT_H
5533 TEMPLATE_VBoxRcExe_LDFLAGS.$(KBUILD_TARGET) = /usr/lib32/crt1.o /usr/lib32/crti.o /usr/lib32/crtbegin.o $(TEMPLATE_VBoxRc_LDFLAGS.$(KBUILD_TARGET)) -nostdlib -v
5534 TEMPLATE_VBoxRcExe_LIBPATH.$(KBUILD_TARGET) = /usr/lib32
5535 TEMPLATE_VBoxRcExe_LATE_LIBS.$(KBUILD_TARGET) = /usr/lib32/crtend.o /usr/lib32/crtn.o /usr/lib32/libc.so
5536 endif
5537 endif
5538
5539 ifeq ($(VBOX_LDR_FMT32),macho)
5540 TEMPLATE_VBoxRcExe_CFLAGS = $(filter-out -static -nostdinc,$(TEMPLATE_VBoxRc_CFLAGS))
5541 TEMPLATE_VBoxRcExe_CXXFLAGS = $(filter-out -static -nostdinc,$(TEMPLATE_VBoxRc_CXXFLAGS))
5542 TEMPLATE_VBoxRcExe_LDFLAGS = -g -m32
5543 endif
5544
5545 ifeq ($(VBOX_LDR_FMT32),lx)
5546 TEMPLATE_VBoxRcExe_CFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CFLAGS))
5547 TEMPLATE_VBoxRcExe_CXXFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CXXFLAGS))
5548 TEMPLATE_VBoxRcExe_LDFLAGS = -g
5549 TEMPLATE_VBoxRcExe_LATE_LIBS = $(NO_SUCH_VARIABLE)
5550 endif
5551endif # VBOX_WITH_RAW_MODE
5552
5553
5554#
5555# Template for building R0 things.
5556#
5557# Disabled Visual C++ warnings:
5558# -wd4505: 'iemRaisePageFaultJmp' : unreferenced local function has been removed
5559#
5560TEMPLATE_VBoxR0 = VBox Ring 0
5561$(foreach arch,$(VBOX_TARGET_ARCHES)\
5562,$(eval TEMPLATE_VBoxR0_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
5563$(foreach arch,$(VBOX_TARGET_ARCHES)\
5564,$(eval TEMPLATE_VBoxR0_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
5565TEMPLATE_VBoxR0_DEFS = IN_RING0 IN_RING0_AGNOSTIC IPRT_NO_CRT RT_WITH_NOCRT_ALIASES $(ARCH_BITS_DEFS)
5566TEMPLATE_VBoxR0_INCS = $(PATH_ROOT)/include/iprt/nocrt
5567TEMPLATE_VBoxR0_SYSSUFF = .r0
5568TEMPLATE_VBoxR0_MODE = a+r,u+w
5569
5570TEMPLATE_VBoxR0_USES += dtrace
5571TEMPLATE_VBoxR0_DTRACE_HDR_FLAGS = --ring-0-context-agnostic
5572TEMPLATE_VBoxR0_DTRACE_OBJ_FLAGS = --ring-0-context-agnostic
5573ifdef VBOX_WITH_DTRACE_R0
5574 TEMPLATE_VBoxR0_DTRACETOOL = VBoxTpG
5575 TEMPLATE_VBoxR0_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0
5576else
5577 TEMPLATE_VBoxR0_DTRACETOOL = VBoxTpG-Disabled
5578endif
5579ifdef VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION
5580 TEMPLATE_VBoxR0_DEFS += RT_WITH_IBT_BRANCH_PROTECTION RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
5581endif
5582
5583ifeq ($(VBOX_LDR_FMT),pe)
5584 TEMPLATE_VBoxR0_TOOL = $(VBOX_VCC_TOOL)
5585 TEMPLATE_VBoxR0_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
5586 TEMPLATE_VBoxR0_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -GS- $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_OPT) $(VBOX_VCC_FP) \
5587 -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_std) $(VBOX_VCC_WARN_ALL) -wd4505 $(VBOX_VCC_WERR)
5588 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
5589 TEMPLATE_VBoxR0_CXXFLAGS += -Gw
5590 endif
5591 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
5592 TEMPLATE_VBoxR0_CXXFLAGS += -Zc:inline
5593 endif
5594 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5595 TEMPLATE_VBoxR0_CXXFLAGS += /volatileMetadata-
5596 endif
5597 ifdef VBOX_WITH_MSC_ANALYZE_THIS
5598 TEMPLATE_VBoxR0_CXXFLAGS += /analyze
5599 endif
5600 TEMPLATE_VBoxR0_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxR0_CXXFLAGS))
5601 TEMPLATE_VBoxR0_LDFLAGS = -Ignore:4197 \
5602 -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) \
5603 -Release -Debug -Opt:Ref -Opt:Icf $(VBOX_VCC_LD_GUARD_CF) \
5604 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5605 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5606 ifdef VBOX_WITH_DTRACE_R0
5607 TEMPLATE_VBoxR0_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
5608 endif
5609 ifdef VBOX_SIGNING_MODE
5610 TEMPLATE_VBoxR0_LDFLAGS += -IntegrityCheck
5611 endif
5612 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5613 TEMPLATE_VBoxR0_LDFLAGS += -EmitVolatileMetadata:NO
5614 endif
5615 TEMPLATE_VBoxR0_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5616 TEMPLATE_VBoxR0_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5617 ifneq ($(VBOX_VCC_CC_GUARD_CF),)
5618 TEMPLATE_VBoxR0_LDFLAGS.win.amd64 += -Include:__security_init_cookie -Export:ModuleInitSecurityCookie=__security_init_cookie
5619 TEMPLATE_VBoxR0_LDFLAGS.win.x86 += -Include:___security_init_cookie -Export:ModuleInitSecurityCookie=__security_init_cookie
5620 TEMPLATE_VBoxR0_LDFLAGS.win.arm64 += -Include:__security_init_cookie -Export:ModuleInitSecurityCookie=__security_init_cookie
5621 endif
5622 TEMPLATE_VBoxR0_LATE_LIBS = \
5623 $(PATH_STAGE_LIB)/RuntimeR0Stub$(VBOX_SUFF_LIB)
5624 ifneq ($(VBOX_VCC_CC_GUARD_CF),)
5625 TEMPLATE_VBoxR0_LATE_LIBS.x86 += \
5626 $(PATH_SDK_$(VBOX_WINDDK)_LIB)/BufferOverflowK.lib
5627 TEMPLATE_VBoxR0_LATE_LIBS.amd64 += \
5628 $(PATH_SDK_$(VBOX_WINDDK)_LIB)/BufferOverflowK.lib
5629 TEMPLATE_VBoxR0_LATE_LIBS.arm64 += \
5630 $(PATH_SDK_$(VBOX_WINDDK)_LIB)/BufferOverflowFastFailK.lib
5631 include $(KBUILD_PATH)/sdks/$(VBOX_WINDDK).kmk ## TODO: Add a kBuild feature for loading SDKs.
5632 endif
5633 TEMPLATE_VBoxR0_ORDERDEPS = $(VBOX_SIGN_DRIVER_ORDERDEPS)
5634 TEMPLATE_VBoxR0_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
5635endif # pe
5636
5637ifeq ($(VBOX_LDR_FMT),elf)
5638 TEMPLATE_VBoxR0_TOOL = $(VBOX_GCC_TOOL)
5639 TEMPLATE_VBoxR0_CFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) \
5640 $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \
5641 $(VBOX_GCC_fno-stack-protector) -fno-common -ffreestanding $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK)
5642 TEMPLATE_VBoxR0_CXXFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) \
5643 $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \
5644 $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
5645 -fno-rtti $(VBOX_GCC_std) $(VBOX_GCC_IPRT_FMT_CHECK)
5646 if $(VBOX_GCC_VERSION_CC) >= 40500 # 4.1.2 complains, 4.5.2 is okay, didn't check which version inbetween made it okay with g++.
5647 TEMPLATE_VBoxR0_CXXFLAGS += -ffreestanding
5648 endif
5649 TEMPLATE_VBoxR0_CFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables -ffreestanding
5650 TEMPLATE_VBoxR0_CXXFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables
5651 TEMPLATE_VBoxR0_CXXFLAGS.freebsd = -ffreestanding
5652 if $(VBOX_GCC_VERSION_CC) < 30400
5653 TEMPLATE_VBoxR0_DEFS += RT_WITHOUT_PRAGMA_ONCE
5654 endif
5655 ifeq ($(KBUILD_TARGET),solaris)
5656 TEMPLATE_VBoxR0_LDFLAGS = -r
5657 TEMPLATE_VBoxR0_LDFLAGS.solaris = -u _init -u _info
5658 TEMPLATE_VBoxR0_LDFLAGS.solaris.amd64 = -m64
5659 TEMPLATE_VBoxR0_LDFLAGS.solaris.x86 = -m32
5660 TEMPLATE_VBoxR0_LATE_LIBS.solaris = \
5661 $(PATH_STAGE_LIB)/RuntimeR0Stub$(VBOX_SUFF_LIB)
5662 ifdef VBOX_GCC_USING_SOLARIS_AS
5663 TEMPLATE_VBoxR0_CFLAGS.amd64 += -Wa,-xmodel=kernel
5664 TEMPLATE_VBoxR0_CXXFLAGS.amd64 += -Wa,-xmodel=kernel
5665 endif
5666 # Solaris driver signing.
5667 TEMPLATE_VBoxR0_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
5668 else
5669 TEMPLATE_VBoxR0_LDFLAGS = -nostdlib -Bsymbolic -g
5670 ## @todo WTF doesn't the globals work? Debug info is supposed to be split everywhere. GRR
5671 TEMPLATE_VBoxR0_LD_DEBUG = split
5672 endif
5673 if "$(KBUILD_TARGET)" == "linux" && !defined(VBOX_WITH_KMOD_WRAPPED_R0_MODS)
5674 VBOX_WITH_VBOXR0_AS_DLL = 1
5675 TEMPLATE_VBoxR0_DLLSUFF = .r0
5676 TEMPLATE_VBoxR0_CFLAGS += -fPIC
5677 TEMPLATE_VBoxR0_CXXFLAGS += -fPIC
5678 TEMPLATE_VBoxR0_LDFLAGS +=
5679 TEMPLATE_VBoxR0_DTRACE_HDR_FLAGS += --pic
5680 TEMPLATE_VBoxR0_DTRACE_OBJ_FLAGS += --pic
5681 else
5682 TEMPLATE_VBoxR0_CFLAGS.amd64 += -mcmodel=kernel
5683 TEMPLATE_VBoxR0_CXXFLAGS.amd64 += -mcmodel=kernel
5684 endif
5685 ifdef VBOX_WITH_KMOD_WRAPPED_R0_MODS # For BTF/pahold issue we use -g1
5686 TEMPLATE_VBoxR0_DEFS += VBOX_WITH_KMOD_WRAPPED_R0_MODS
5687 TEMPLATE_VBoxR0_LDFLAGS.linux += $(PATH_ROOT)/src/VBox/HostDrivers/Support/linux/VBoxR0-wrapped.lds
5688 TEMPLATE_VBoxR0_LNK_DEPS.linux += $(PATH_ROOT)/src/VBox/HostDrivers/Support/linux/VBoxR0-wrapped.lds
5689 TEMPLATE_VBoxR0_CFLAGS.linux += -g1
5690 TEMPLATE_VBoxR0_CXXFLAGS.linux += -g1
5691 endif
5692 ifdef VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION
5693 TEMPLATE_VBoxR0_CFLAGS += $(VBOX_GCC_fcf-protection_branch) -fno-jump-tables
5694 TEMPLATE_VBoxR0_CXXFLAGS += $(VBOX_GCC_fcf-protection_branch) -fno-jump-tables
5695 TEMPLATE_VBoxR0_LDFLAGS += $(VBOX_GCC_fcf-protection_branch) $(VBOX_GCC_fcf-protection_check)
5696 ifeq ($(VBOX_GCC_fcf-protection_branch),)
5697 $(warning VBox: VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION is set but gcc doesn't support branch protection)
5698 endif
5699 endif
5700 ifn1of ($(KBUILD_TARGET), solaris freebsd)
5701 TEMPLATE_VBoxR0_LATE_LIBS = \
5702 $(VBOX_GCC_LIBGCC) # intrinsics
5703 endif
5704 if1of ($(KBUILD_TARGET), linux)
5705 TEMPLATE_VBoxR0_POST_CMDS += $(NLTAB) \
5706 $(if $(eq $(tool_do),LINK_SYSMOD),if readelf -S $(out)|grep -q "[cd]tors"; then echo "Found ctors/dtors in $(out)!"; exit 1; fi)
5707 endif
5708endif # elf
5709
5710ifeq ($(VBOX_LDR_FMT),macho)
5711 TEMPLATE_VBoxR0_TOOL = $(VBOX_GCC_TOOL)
5712 TEMPLATE_VBoxR0_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
5713 TEMPLATE_VBoxR0_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
5714 TEMPLATE_VBoxR0_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) \
5715 -fno-common -static -fno-rtti -fno-exceptions $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing \
5716 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_std)
5717 TEMPLATE_VBoxR0_CXXFLAGS.amd64 = -m64 -msoft-float -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-red-zone -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-sse4a -fno-unwind-tables
5718 TEMPLATE_VBoxR0_CXXFLAGS.x86 = -m32 -msoft-float -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
5719 TEMPLATE_VBoxR0_CXXFLAGS.arm64 = -m64 -target arm64e-apple-macos11.0 # Assembly fixup issues w/o the -target bit. Why?
5720 TEMPLATE_VBoxR0_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros) \
5721 -fno-common -static -fno-exceptions $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing \
5722 $(VBOX_GCC_fno-stack-protector)
5723 TEMPLATE_VBoxR0_CFLAGS.amd64 = -m64 -msoft-float -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-red-zone -mno-sse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-sse4a -fno-unwind-tables
5724 TEMPLATE_VBoxR0_CFLAGS.x86 = -m32 -msoft-float -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
5725 TEMPLATE_VBoxR0_CFLAGS.arm64 = -m64 -target arm64e-apple-macos11.0
5726 TEMPLATE_VBoxR0_LDFLAGS = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -nostdlib
5727 TEMPLATE_VBoxR0_LDFLAGS.amd64 = -m64 -static
5728 TEMPLATE_VBoxR0_LDFLAGS.arm64 = -m64 -static
5729 TEMPLATE_VBoxR0_LDFLAGS.x86 = -m32
5730 TEMPLATE_VBoxR0_CXXFLAGS.amd64 += -mkernel
5731 TEMPLATE_VBoxR0_CFLAGS.amd64 += -mkernel
5732 TEMPLATE_VBoxR0_CXXFLAGS.arm64 += -mkernel
5733 TEMPLATE_VBoxR0_CFLAGS.arm64 += -mkernel
5734 TEMPLATE_VBoxR0_LDFLAGS += -Wl,-kext -mkernel
5735 TEMPLATE_VBoxR0_POST_CMDS = $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_VMM_MOD_FN,$(out),org.virtualbox.app.r0.$(target)))
5736endif
5737
5738ifeq ($(VBOX_LDR_FMT),lx)
5739 TEMPLATE_VBoxR0_TOOL = GXX3OMF
5740 TEMPLATE_VBoxR0_CFLAGS = -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions -fno-common
5741 TEMPLATE_VBoxR0_CXXFLAGS = -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions -fno-common -fno-rtti
5742 if $(VBOX_GCC_VERSION_CC) < 30400
5743 TEMPLATE_VBoxR0_DEFS += RT_WITHOUT_PRAGMA_ONCE
5744 endif
5745 TEMPLATE_VBoxR0_LDFLAGS = -nostdlib -Zdll
5746 TEMPLATE_VBoxR0_LATE_LIBS = \
5747 $(VBOX_GCC_LIBGCC) \
5748 $(VBOX_OBJ_SYS0) \
5749 end
5750endif
5751
5752
5753#
5754# Template for building SUPDRV R0 things.
5755#
5756# Disabled Visual C++ warnings:
5757# -wd4996: deprecated / insecure.
5758# -wd4127: conditional expression is constant [level 4]
5759# -wd4201: nonstandard extension used : nameless struct/union [level 4]
5760# -wd4214: nonstandard extension used : bit field types other than int [level 4]
5761# -wd4706: assignment within conditional expression [level 4]
5762# -wd4324: '_TDI_PNP_CONTEXT_XP' : structure was padded due to __declspec(align())
5763#
5764# -wd4100: 'identifier' : unreferenced formal parameter [level 4] --- TODO: Enable this one!
5765#
5766TEMPLATE_VBoxR0Drv = VBox SUPDRV Ring 0
5767$(foreach arch,$(VBOX_TARGET_ARCHES)\
5768,$(eval TEMPLATE_VBoxR0Drv_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
5769$(foreach arch,$(VBOX_TARGET_ARCHES)\
5770,$(eval TEMPLATE_VBoxR0Drv_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
5771TEMPLATE_VBoxR0Drv_DEFS = IN_RING0 IN_RT_R0 $(ARCH_BITS_DEFS)
5772TEMPLATE_VBoxR0Drv_USES += dtrace
5773ifdef VBOX_WITH_DTRACE_R0DRV
5774 TEMPLATE_VBoxR0Drv_DTRACETOOL = VBoxTpG
5775 TEMPLATE_VBoxR0Drv_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0DRV
5776 ifdef VBOX_WITH_NATIVE_DTRACE
5777 TEMPLATE_VBoxR0Drv_DEFS += VBOX_WITH_NATIVE_DTRACE
5778 endif
5779else
5780 TEMPLATE_VBoxR0Drv_DTRACETOOL = VBoxTpG-Disabled
5781endif
5782
5783ifeq ($(KBUILD_TARGET),win)
5784 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_VCC_TOOL)
5785 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # for stddef.h ## @todo 8489: check if still needed
5786 TEMPLATE_VBoxR0Drv_SDKS = WINSDK10-UCRT-INCS
5787 endif
5788 TEMPLATE_VBoxR0Drv_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
5789 TEMPLATE_VBoxR0Drv_DEFS += _KERNEL_MODE=1 # Needed with W10 to access things like KeQueryInterruptTime
5790 TEMPLATE_VBoxR0Drv_DEFS.x86 = _X86_
5791 TEMPLATE_VBoxR0Drv_DEFS.x86 += NO_INTERLOCKED_INTRINSICS # Avoids intrisic VC/WDK trouble
5792 TEMPLATE_VBoxR0Drv_DEFS.x86 += WIN9X_COMPAT_SPINLOCK # Avoid multiply defined _KeInitializeSpinLock@4
5793 TEMPLATE_VBoxR0Drv_DEFS.amd64 = _AMD64_
5794 TEMPLATE_VBoxR0Drv_DEFS.amd64 += WIN9X_COMPAT_SPINLOCK # For Windows 8+ WDKs where it is no longer inlined but imported from ntoskrnl.
5795 TEMPLATE_VBoxR0Drv_DEFS.amd64 += NT_INLINE_IRQL NT_INLINE_GET_CURRENT_IRQL # Prevent W10 WDK from importing KeLowerIrql and KeGetCurrentIrql.
5796 TEMPLATE_VBoxR0Drv_DEFS.arm64 = _ARM64_
5797 TEMPLATE_VBoxR0Drv_DEFS.win = IPRT_NT_MAP_TO_ZW
5798 TEMPLATE_VBoxR0Drv_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -Gz -GS- $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_FP) -Gs4096 $(VBOX_VCC_OPT) \
5799 -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
5800 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
5801 TEMPLATE_VBoxR0Drv_CXXFLAGS += -Gw
5802 endif
5803 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
5804 TEMPLATE_VBoxR0Drv_CXXFLAGS += -Zc:inline
5805 endif
5806 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5807 TEMPLATE_VBoxR0Drv_CXXFLAGS += /volatileMetadata-
5808 endif
5809 ifdef VBOX_WITH_MSC_ANALYZE_THIS
5810 TEMPLATE_VBoxR0Drv_CXXFLAGS += /analyze
5811 endif
5812 TEMPLATE_VBoxR0Drv_CFLAGS = $(TEMPLATE_VBoxR0Drv_CXXFLAGS)
5813 TEMPLATE_VBoxR0Drv_LDFLAGS = -Ignore:4197 \
5814 -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD -Release -Debug -Opt:Ref -Opt:Icf \
5815 $(VBOX_VCC_LD_GUARD_CF) \
5816 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5817 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5818 ifdef VBOX_WITH_DTRACE_R0DRV
5819 TEMPLATE_VBoxR0Drv_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
5820 endif
5821 ifdef VBOX_SIGNING_MODE
5822 TEMPLATE_VBoxR0Drv_LDFLAGS += -IntegrityCheck
5823 endif
5824 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5825 TEMPLATE_VBoxR0Drv_LDFLAGS += -EmitVolatileMetadata:NO
5826 endif
5827 TEMPLATE_VBoxR0Drv_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5828 TEMPLATE_VBoxR0Drv_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5829 TEMPLATE_VBoxR0Drv_ORDERDEPS = $(VBOX_SIGN_DRIVER_ORDERDEPS)
5830 TEMPLATE_VBoxR0Drv_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
5831endif
5832
5833ifeq ($(KBUILD_TARGET),linux)
5834 TEMPLATE_VBoxR0Drv_TOOL = $(NO_SUCH_VARIABLE)
5835
5836 ifndef KERN_DIR
5837 ifndef KERN_VER
5838 KERN_VER := $(patsubst /lib/modules/%/build/.config,%,$(firstword $(shell LC_ALL=C ls -t /lib/modules/*/build/.config 2>/dev/null)))
5839 endif
5840 ifeq ($(KERN_VER),)
5841 KERN_VER := $(shell uname -r)
5842 endif
5843 KERN_DIR := /lib/modules/$(KERN_VER)/build
5844 endif
5845
5846 ##
5847 ## Generates a rule for test-building a linux kernel module (use evalcall2 to invoke).
5848 ##
5849 ## Since Linux KBuild will not abort due to undefined symbols when building
5850 ## external modules we need to grep the error output ourselves. Since vboxdrv
5851 ## and vboxguest respectively provide symbols that other modules use, we use
5852 ## the rule target (tst*.run) to save those symbols so that KBuild can do its
5853 ## checking.
5854 ##
5855 ## @param 1 Module name.
5856 ## @param 2 The test build which symvers we need (empty if none)
5857 ## @param 3 Save symvers if non-empty.
5858 ##
5859 ## @note Using the extra expansion to replace $(1), $(2) and $(3) before eval,
5860 ## thus everything else needs escaped dollars.
5861 ##
5862 if defined(VBOX_WITH_TESTCASES) \
5863 && "$(KBUILD_HOST)" == "linux" \
5864 && "$(KBUILD_HOST_ARCH)" == "$(KBUILD_TARGET_ARCH)" \
5865 && !defined(VBOX_WITHOUT_LINUX_TEST_BUILDS) \
5866 && !defined(VBOX_ONLY_SDK) \
5867 && !defined(VBOX_ONLY_DOCS) \
5868 && !defined(VBOX_ONLY_VALIDATIONKIT)
5869 define VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN
5870 ifneq ($(KERN_DIR),)
5871 TESTING += $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5872 OTHERS += $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5873 OTHERS_CLEAN += $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5874 $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run: \
5875 $$(if $(2),$$(PATH_TARGET)/tst$(2)$(subst /,_,$(KERN_DIR))_mod.run,) \
5876 $$$$($(1)_2_STAGE_TARGETS)
5877 $(QUIET)$$(call MSG_L1,Doing a test build of the $(1) kernel module)
5878 $(QUIET)$$(RM) -f -- "$$@"
5879 $(QUIET)$$(TEST) -n "$$($(1)_INST)"
5880 $(QUIET)$$(RM) -Rf -- "$$(PATH_TARGET)/tst$(1)_mod"
5881 $(QUIET)$$(MKDIR) -p -- "$$(PATH_TARGET)/tst$(1)_mod"
5882 $(QUIET)$$(CP) -R -- "$$(PATH_STAGE_BIN)/../$$($(1)_INST)" "$$(PATH_TARGET)/tst$(1)_mod/"
5883 + $(QUIET)make KBUILD_VERBOSE=$(KBUILD_VERBOSE) KERN_DIR=$(KERN_DIR) VBOX_KERN_QUIET=1 \
5884 VBOX_KBUILD_TYPE=$(KBUILD_TYPE) VBOX_KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH) \
5885 KBUILD_TYPE= KBUILD_TARGET= KBUILD_TARGET_ARCH= KBUILD_TARGET_CPU= KBUILD_HOST= KBUILD_HOST_ARCH= KBUILD_HOST_CPU= \
5886 BUILD_TYPE= BUILD_TARGET= BUILD_TARGET_ARCH= BUILD_TARGET_CPU= BUILD_PLATFORM= BUILD_PLATFORM_ARCH= BUILD_PLATFORM_CPU= \
5887 -C $$(PATH_TARGET)/tst$(1)_mod clean
5888 ifneq ($(2),)
5889 $(QUIET)$$(CP) -f -- "$$<" "$$(PATH_TARGET)/tst$(1)_mod/Module.symvers"
5890 endif
5891 + $(QUIET)$(REDIRECT_EXT) -d2=1 -w1 "$$(PATH_TARGET)/tst$(1)_mod/make.err" -- \
5892 make KBUILD_VERBOSE=$(KBUILD_VERBOSE) KERN_DIR=$(KERN_DIR) VBOX_KERN_QUIET=1 $(if $(2),KBUILD_EXTRA_SYMBOLS="$$(PATH_TARGET)/tst$(1)_mod/Module.symvers",) $(if-expr $(KMK_OPTS_JOBS) != 0,JOBS=$(KMK_OPTS_JOBS),) \
5893 VBOX_KBUILD_TYPE=$(KBUILD_TYPE) VBOX_KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH) \
5894 KBUILD_TYPE= KBUILD_TARGET= KBUILD_TARGET_ARCH= KBUILD_TARGET_CPU= KBUILD_HOST= KBUILD_HOST_ARCH= KBUILD_HOST_CPU= \
5895 BUILD_TYPE= BUILD_TARGET= BUILD_TARGET_ARCH= BUILD_TARGET_CPU= BUILD_PLATFORM= BUILD_PLATFORM_ARCH= BUILD_PLATFORM_CPU= \
5896 -C $$(PATH_TARGET)/tst$(1)_mod
5897 $(CAT) "$$(PATH_TARGET)/tst$(1)_mod/make.err"
5898 $(QUIET)! grep "^WARNING: .* undefined!$$$$" "$$(PATH_TARGET)/tst$(1)_mod/make.err"
5899 if1of ($(USERNAME), bird)
5900 - nm -u "$$(PATH_TARGET)/tst$(1)_mod/"*.ko | sort
5901 endif
5902 ifneq ($(3),)
5903 $(QUIET)$$(CP) -f -- "$$(PATH_TARGET)/tst$(1)_mod/Module.symvers" "$$@"
5904 else
5905 $(QUIET)$$(APPEND) -t "$$@" "done"
5906 endif
5907 $(QUIET)$$(RM) -Rf -- "$$(PATH_TARGET)/tst$(1)_mod"
5908 vbox-linux-kmod-test-builds: $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5909 $$(foreach src,$$(notdir $$(filter %.c,$$(subst =>,/,$$($(1)_SOURCES)))),$$(patsubst %.c,%.o,$$(src))): $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5910 endif
5911 endef # VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN
5912 else
5913 VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN =
5914 endif
5915else
5916 VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN =
5917endif # linux target
5918
5919ifeq ($(KBUILD_TARGET),os2)
5920 ifndef VBOX_USE_WATCOM_FOR_OS2
5921 TEMPLATE_VBoxR0Drv_TOOL = GXX3OMF
5922 TEMPLATE_VBoxR0Drv_CXXFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions -fno-rtti
5923 TEMPLATE_VBoxR0Drv_CFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions
5924 TEMPLATE_VBoxR0Drv_LATE_LIBS = $(VBOX_GCC_LIBGCC)
5925 # wlink thinks physdevice doesn't need fixups and should have a stack - stupid!
5926 TEMPLATE_VBoxR0Drv_LDFLAGS = -Zlinker Option -Zlinker internalrelocs, -Zlinker togglerelocs
5927 else
5928 TEMPLATE_VBoxR0Drv_TOOL = OPENWATCOM
5929 TEMPLATE_VBoxR0Drv_CTOOL = OPENWATCOM
5930 TEMPLATE_VBoxR0Drv_CXXTOOL = OPENWATCOM
5931 TEMPLATE_VBoxR0Drv_LDTOOL = OPENWATCOM-WL
5932 TEMPLATE_VBoxR0Drv_ARTOOL = OPENWATCOM
5933 ## @todo see if we can eliminate this one...
5934 TEMPLATE_VBoxR0Drv_ASTOOL = NASM
5935 TEMPLATE_VBoxR0Drv_ASFLAGS = -fobj -DASM_FORMAT_OMF -D__NASM__ -w+orphan-labels #-g -F borland
5936 TEMPLATE_VBoxR0Drv_DEFS.os2 = #_OS2EMX_H
5937 TEMPLATE_VBoxR0Drv_INCS = \
5938 $(PATH_TOOL_OPENWATCOM)/h \
5939 $(PATH_TOOL_OPENWATCOM)/h/os2 \
5940 $(PATH_ROOT)/include \
5941 $(PATH_KLIBC_TRUNK)/libc/include # for os2ddk
5942 TEMPLATE_VBoxR0Drv_CFLAGS = -s -ze -w4 -hd -d1+ -nt=TEXT32 -nc=CODE -4 -of+
5943 TEMPLATE_VBoxR0Drv_CXXFLAGS = -s -ze -w4 -hd -d2t -nt=TEXT32 -nc=CODE -4 -of+
5944 TEMPLATE_VBoxR0Drv_LDFLAGS = \
5945 form os2 lx physdevice \
5946 option NODefaultlibs, internalrelocs, togglerelocs \
5947 debug dwarf all #option symfile
5948 # debug codeview all option symfile - wlink generates bad info, overwritten mod dir header.
5949 endif
5950endif
5951
5952ifeq ($(KBUILD_TARGET),darwin)
5953 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
5954 TEMPLATE_VBoxR0Drv_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
5955 TEMPLATE_VBoxR0Drv_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS) KERNEL KERNEL_PRIVATE DRIVER_PRIVATE APPLE NeXT
5956 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
5957 TEMPLATE_VBoxR0Drv_INCS += \
5958 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/PrivateHeaders \
5959 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/Headers
5960 ## @todo try use VBOX_GCC_PEDANTIC_CXX
5961 TEMPLATE_VBoxR0Drv_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) \
5962 -g $(VBOX_GCC_pipe) $(VBOX_GCC_WARN) -Wno-long-long $(VBOX_GCC_fdiagnostics-show-option) \
5963 -fno-common -nostdinc -fno-builtin -finline $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
5964 -fno-keep-inline-functions -fno-exceptions -msoft-float \
5965 -fapple-kext -fno-rtti -fcheck-new -force_cpusubtype_ALL \
5966 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fasm-blocks
5967 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = -m64 -mkernel -mno-red-zone -gdwarf-2
5968 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = -m32 -static
5969 TEMPLATE_VBoxR0Drv_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) \
5970 -g $(VBOX_GCC_pipe) $(VBOX_GCC_WARN) -Wno-long-long -fno-common -nostdinc -fno-builtin -finline \
5971 -fno-keep-inline-functions -fno-exceptions $(VBOX_GCC_fvisibility-hidden) -msoft-float \
5972 -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations \
5973 -Werror-implicit-function-declaration -force_cpusubtype_ALL \
5974 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fasm-blocks
5975 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -mkernel -mno-red-zone -gdwarf-2
5976 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -static
5977 TEMPLATE_VBoxR0Drv_LDFLAGS = $(filter-out $(VBOX_DARWIN_NO_COMPACT_LINKEDIT),$(VBOX_DARWIN_DEF_SDK_LDFLAGS)) \
5978 -nostdlib -Wl,-kext,-new_linker -Wl,-Y,1455 -keep_private_extern
5979 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m64
5980 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m32
5981 TEMPLATE_VBoxR0Drv_LATE_LIBS = kmodc++ kmod cc_kext cpp_kext $(VBOX_GCC_LIBGCC)
5982 else
5983 # Note xcode uses -fstrict-aliasing, we currently don't dare... We also add -mno-red-zone.
5984 TEMPLATE_VBoxR0Drv_INCS += \
5985 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/PrivateHeaders \
5986 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/Headers
5987 ## @todo try use VBOX_GCC_PEDANTIC_CXX
5988 # -Wno-c++11-extensions -Wno-c99-extensions -Wno-extra-semi -Wno-zero-length-array
5989 TEMPLATE_VBoxR0Drv_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) -mkernel \
5990 -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) -Wno-long-long $(VBOX_GCC_fdiagnostics-show-option) \
5991 -Wno-c++11-extensions -Wno-c99-extensions -Wno-extra-semi -Wno-zero-length-array \
5992 -Wno-gnu-zero-variadic-macro-arguments -Wno-four-char-constants \
5993 -fno-common -nostdinc -fno-builtin $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
5994 -fno-exceptions -fapple-kext -fno-rtti -mkernel \
5995 -fmodules -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -Wnon-modular-include-in-framework-module \
5996 -Werror=non-modular-include-in-framework-module \
5997 $(VBOX_GCC_Wno-nullability-extension) $(VBOX_GCC_Wno-gnu-statement-expression) \
5998 $(VBOX_GCC_Wno-import-preprocessor-directive-pedantic) $(VBOX_GCC_Wno-c11-extensions) \
5999 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fasm-blocks -fno-strict-aliasing -stdlib=libc++
6000 # if1of ($(VBOX_GCC_TOOL), CLANGXXMACHO) ## @todo check if we can safely use $(VBOX_GCC_std) @bugref{9790}, good for noexcept.
6001 #TEMPLATE_VBoxR0Drv_CXXFLAGS += $(VBOX_GCC_std)
6002 # endif
6003 # also used by xcode 6.2: \
6004 # -Werror=return-type \
6005 # -Werror=deprecated-objc-isa-usage \
6006 # -Werror=objc-root-class \
6007 # -Wno-missing-field-initializers -Wno-missing-prototypes -Wunreachable-code \
6008 # -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function \
6009 # -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body \
6010 # -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants \
6011 # -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion \
6012 # -Wshorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -Wdeprecated-declarations -Winvalid-offsetof -Wno-sign-conversion
6013 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = -m64 -msoft-float -mno-red-zone
6014 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = -m32 -msoft-float
6015 TEMPLATE_VBoxR0Drv_CXXFLAGS.arm64 = -m64 -fno-sanitize=vptr -target arm64e-apple-macos11.0
6016 TEMPLATE_VBoxR0Drv_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -mkernel \
6017 -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) -Wno-long-long $(VBOX_GCC_fdiagnostics-show-option) \
6018 -fno-common -nostdinc -fno-builtin $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
6019 -fno-exceptions -fapple-kext -fno-rtti \
6020 -fmodules -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -Wnon-modular-include-in-framework-module \
6021 -Werror=non-modular-include-in-framework-module $(VBOX_GCC_Wno-c11-extensions) \
6022 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fasm-blocks -fno-strict-aliasing
6023 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -msoft-float -mno-red-zone
6024 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -msoft-float
6025 TEMPLATE_VBoxR0Drv_CFLAGS.arm64 = -m64 -fno-sanitize=vptr -target arm64e-apple-macos11.0
6026 if 1
6027 TEMPLATE_VBoxR0Drv_CFLAGS += $(VBOX_GCC_WERR)
6028 TEMPLATE_VBoxR0Drv_CXXFLAGS += $(VBOX_GCC_WERR)
6029 endif
6030 TEMPLATE_VBoxR0Drv_LDFLAGS = $(filter-out $(VBOX_DARWIN_NO_COMPACT_LINKEDIT),$(VBOX_DARWIN_DEF_SDK_LDFLAGS)) \
6031 -nostdlib -stdlib=libc++ -Wl,-kext -Wl,-keep_private_externs
6032 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m64
6033 TEMPLATE_VBoxR0Drv_LDFLAGS.arm64 = -m64
6034 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m32
6035 TEMPLATE_VBoxR0Drv_LATE_LIBS = kmodc++ kmod cc_kext
6036 endif
6037endif
6038
6039ifeq ($(KBUILD_TARGET),solaris)
6040 ## The Solaris /usr/platform/i86pc/include and /usr/include directories.
6041 VBOX_SOLARIS_SYS_INCS ?= /usr/platform/i86pc/include /usr/include
6042
6043 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6044 TEMPLATE_VBoxR0Drv_DEFS += _MACHDEP _KERNEL _STRICT_STDC
6045 if $(VBOX_GCC_VERSION_CC) < 30400
6046 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6047 endif
6048 TEMPLATE_VBoxR0Drv_INCS = $(VBOX_SOLARIS_SYS_INCS)
6049 TEMPLATE_VBoxR0Drv_LDFLAGS = -r -dy
6050 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = $(if $(eq $(KBUILD_HOST),solaris),-64,-m elf_x86_64)
6051 # Exclude -Wall because of solaris headers' pragma ident warnings that gcc refuses to supress.
6052 TEMPLATE_VBoxR0Drv_CFLAGS = -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
6053 -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_fdiagnostics-show-option) \
6054 -Wshadow -Wuninitialized -Wunused-function -Wunused-label -Wunused-value -Wunused-variable \
6055 -Wformat -Wimplicit-int -Wimplicit-function-declaration -Werror-implicit-function-declaration -Wparentheses \
6056 -O2 -fno-omit-frame-pointer -ffreestanding -nodefaultlibs -fno-strict-aliasing -fno-common -std=c99
6057 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
6058 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow $(VBOX_GCC_msave-args) \
6059 -mno-red-zone -mcmodel=kernel $(if-expr defined(VBOX_GCC_USING_SOLARIS_AS),-Wa$(COMMA)-xmodel=kernel,) \
6060 -fno-reorder-blocks -fno-asynchronous-unwind-tables -funit-at-a-time
6061 TEMPLATE_VBoxR0Drv_CXXFLAGS = -Wpointer-arith \
6062 -Wshadow -Wuninitialized -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wformat \
6063 -O2 -nodefaultlibs -fno-omit-frame-pointer -fno-strict-aliasing -fno-common -fno-exceptions -fno-rtti
6064 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86)
6065 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64)
6066 TEMPLATE_VBoxR0Drv_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
6067endif # Solaris
6068
6069ifeq ($(KBUILD_TARGET),freebsd)
6070 # x86 FreeBSD (6.2 or something):
6071 # cc -O2 -fno-strict-aliasing -pipe -Werror -D_KERNEL -DKLD_MODULE \
6072 # -nostdinc -I- -I. -I@ -I@/contrib/altq -I@/../include -I/usr/include \
6073 # -finline-limit=8000 -fno-common -mno-align-long-strings -mpreferred-stack-boundary=2 \
6074 # -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -ffreestanding -Wall -Wredundant-decls -Wnested-externs \
6075 # -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -fformat-extensions \
6076 # -std=c99 -c ../my.c
6077 # ld -d -warn-common -r -d -o my.kld my.o
6078 # :> export_syms
6079 # awk -f /usr/src/sys/modules/my/../../conf/kmod_syms.awk my.kld export_syms | xargs -J% objcopy % my.kld
6080 # ld -Bsharable -d warn-commnon -o my.ko my.kld
6081 #
6082 # AMD64 FreeBSD (7.1):
6083 # cc -O2 -fno-strict-aliasing -pipe -D_KERNEL -DKLD_MODULE -std=c99 -nostdinc -I. -I@ -I@/contrib/altq \
6084 # -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-common \
6085 # -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx \
6086 # -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -ffreestanding \
6087 # -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign \
6088 # -fformat-extensions -c /usr/src/sys/modules/my/../../dev/my/if_my.c
6089 # ld -d -warn-common -r -d -o if_my.ko if_my.o
6090 # :> export_syms
6091 # awk -f /usr/src/sys/modules/my/../../conf/kmod_syms.awk if_my.ko export_syms | xargs -J% objcopy % if_my.ko
6092
6093 # Note: @ -> /usr/src/sys and machine -> /usr/src/sys/i386/include
6094
6095 ## The location of the FreeBSD kernel source.
6096 VBOX_FREEBSD_SRC ?= /usr/src/sys
6097 ## The FreeBSD /usr/include.
6098 VBOX_FREEBSD_SYS_INCS ?= /usr/include
6099
6100 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6101 TEMPLATE_VBoxR0Drv_LDTOOL = FreeBsdKModLd
6102 TEMPLATE_VBoxR0Drv_DEFS += _KERNEL KLD_MODULE
6103 if $(VBOX_GCC_VERSION_CC) < 30400
6104 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6105 endif
6106 TEMPLATE_VBoxR0Drv_INCS = \
6107 $(VBOX_FREEBSD_SRC) \
6108 $(VBOX_FREEBSD_SRC)/contrib/altq \
6109 $(VBOX_FREEBSD_SRC)/contrib/ck/include \
6110 $(VBOX_FREEBSD_SRC)/../include \
6111 $(VBOX_FREEBSD_SYS_INCS)
6112 # omitting: -Wcast-qual, -Wredundant-decls
6113 TEMPLATE_VBoxR0Drv_CFLAGS = \
6114 $(VBOX_GCC_WARN) -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) $(VBOX_GCC_fdiagnostics-show-option) \
6115 -Wstrict-prototypes -Wmissing-prototypes -Wstrict-prototypes \
6116 -Wimplicit-function-declaration -Werror-implicit-function-declaration \
6117 -O2 -ffreestanding -fno-strict-aliasing -fno-common \
6118 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6119 -nostdinc -std=c99
6120 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-align-long-strings -mno-mmx -mno-3dnow -mno-sse -mno-sse2
6121 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone -mfpmath=387 \
6122 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -Wundef
6123 TEMPLATE_VBoxR0Drv_CXXFLAGS = -fno-exceptions -fno-rtti \
6124 $(VBOX_GCC_WARN) -Wpointer-arith -Winline \
6125 -O2 -fno-strict-aliasing -fno-common \
6126 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6127 -nostdinc
6128 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86)
6129 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64)
6130 TEMPLATE_VBoxR0Drv_SYSSUFF = .ko
6131 TEMPLATE_VBoxR0Drv_LDFLAGS = -d --warn-common
6132 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m elf_i386_fbsd
6133 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m elf_x86_64_fbsd
6134
6135 TOOL_FreeBsdKModLd = FreeBSD kernel module linker.
6136 # See kBuild/tools/GCC3.kmk for docs.
6137 TOOL_FreeBsdKModLd_LINK_SYSMOD_OUTPUT_MAYBE = $(outbase).map
6138 TOOL_FreeBsdKModLd_LINK_SYSMOD_DEPEND = $(foreach lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib)))
6139 TOOL_FreeBsdKModLd_LINK_SYSMOD_DEPORD =
6140 ifeq ($(KBUILD_TARGET_ARCH),amd64)
6141 TOOL_FreeBsdKModLd_LINK_SYSMOD_OUTPUT =
6142 define TOOL_FreeBsdKModLd_LINK_SYSMOD_CMDS
6143 # Link intermediate .kld (a relocatable object).
6144 ld $(flags) -r -o $(out) $(objs) \
6145 $(foreach p,$(libpath), -L$(p))\
6146 $(foreach lib,$(libs), $(if $(findstring $(lib),$(subst /,x,$(lib))), -l$(patsubst lib%,%,$(basename $(lib))), $(lib)))
6147 # Strip non-exported symbols private and localize the exported ones.
6148 awk -f $(VBOX_FREEBSD_SRC)/conf/kmod_syms.awk $(out) $(if $(othersrc), $(othersrc),/dev/null) \
6149 | xargs -J% objcopy % $(out)
6150
6151 ## Strip debug info (comment out if debugging or something).
6152 objcopy --strip-debug $(out)
6153 endef
6154 else # x86
6155 TOOL_FreeBsdKModLd_LINK_SYSMOD_OUTPUT = $(outbase).kld
6156 define TOOL_FreeBsdKModLd_LINK_SYSMOD_CMDS
6157 # Link intermediate .kld (a relocatable object).
6158 ld $(flags) -r -o $(outbase).kld $(objs) \
6159 $(foreach p,$(libpath), -L$(p))\
6160 $(foreach lib,$(libs), $(if $(findstring $(lib),$(subst /,x,$(lib))), -l$(patsubst lib%,%,$(basename $(lib))), $(lib)))
6161 # Strip non-exported symbols private and localize the exported ones.
6162 awk -f $(VBOX_FREEBSD_SRC)/conf/kmod_syms.awk $(outbase).kld $(if $(othersrc), $(othersrc),/dev/null) \
6163 | xargs -J% objcopy % $(outbase).kld
6164
6165 # Link the final .ko (a shared object).
6166 ld $(flags) -Bshareable -o $(out) $(outbase).kld
6167 endef
6168 endif # x86
6169
6170endif # FreeBSD
6171
6172ifeq ($(KBUILD_TARGET),netbsd)
6173
6174 # The location of the NetBSD sources.
6175 VBOX_NETBSD_SRC ?= /usr/src
6176
6177 # NetBSD uses "i386" for 32-bit, "x86" for common 32- and 64-bit code.
6178 ifeq ($(KBUILD_TARGET_ARCH),amd64)
6179 VBOX_NETBSD_TARGET_ARCH = amd64
6180 else
6181 VBOX_NETBSD_TARGET_ARCH = i386
6182 endif
6183
6184 VBOX_NETBSD_TARGET_SRC = $(VBOX_NETBSD_SRC)/sys/arch/$(VBOX_NETBSD_TARGET_ARCH)
6185
6186 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6187 TEMPLATE_VBoxR0Drv_DEFS += _KERNEL _MODULE
6188 if $(VBOX_GCC_VERSION_CC) < 30400
6189 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6190 endif
6191 TEMPLATE_VBoxR0Drv_INCS = \
6192 $(VBOX_NETBSD_SRC)/sys \
6193 $(VBOX_NETBSD_SRC)/common/include \
6194 $(PATH_OBJ)/netbsd/include
6195
6196 TEMPLATE_VBoxR0Drv_CFLAGS = \
6197 $(VBOX_GCC_WARN) -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
6198 $(VBOX_GCC_fdiagnostics-show-option) \
6199 -Wstrict-prototypes -Wmissing-prototypes -Wstrict-prototypes \
6200 -Wimplicit-function-declaration -Werror-implicit-function-declaration \
6201 -O2 -ffreestanding -fno-strict-aliasing -fno-common -finline-limit=8000 \
6202 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6203 -nostdinc -std=c99 -msoft-float
6204 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-mmx -mno-sse -mno-avx \
6205 -mno-fp-ret-in-387
6206 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 --param inline-unit-growth=100 \
6207 --param large-function-growth=1000 -fno-omit-frame-pointer \
6208 -mcmodel=kernel -mno-red-zone -mno-sse -mno-mmx -mno-avx \
6209 -fno-asynchronous-unwind-tables -mno-fp-ret-in-387
6210 TEMPLATE_VBoxR0Drv_CXXFLAGS = -fno-exceptions -fno-rtti \
6211 $(VBOX_GCC_WARN) -Wpointer-arith -Winline \
6212 -O2 -fno-strict-aliasing -fno-common -finline-limit=8000 \
6213 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6214 -nostdinc -msoft-float
6215 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86)
6216 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64)
6217 TEMPLATE_VBoxR0Drv_SYSSUFF = .kmod
6218 TEMPLATE_VBoxR0Drv_LDFLAGS = -d --warn-common
6219 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m elf_i386
6220 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m elf_x86_64
6221
6222 # symlink kernel includes
6223 TEMPLATE_VBoxR0Drv_ORDERDEPS += \
6224 $(PATH_OBJ)/netbsd/include/$(VBOX_NETBSD_TARGET_ARCH) \
6225 $(PATH_OBJ)/netbsd/include/x86 \
6226 $(PATH_OBJ)/netbsd/include/machine
6227
6228 $$(PATH_OBJ)/netbsd/include/$(VBOX_NETBSD_TARGET_ARCH):
6229 $(QUIET)$(MKDIR) -p $(@D)
6230 $(QUIET)$(LN_SYMLINK) $(VBOX_NETBSD_TARGET_SRC)/include $@
6231
6232 $$(PATH_OBJ)/netbsd/include/x86:
6233 $(QUIET)$(MKDIR) -p $(@D)
6234 $(QUIET)$(LN_SYMLINK) $(VBOX_NETBSD_SRC)/sys/arch/x86/include $@
6235
6236 $$(PATH_OBJ)/netbsd/include/machine:
6237 $(QUIET)$(MKDIR) -p $(@D)
6238 $(QUIET)$(LN_SYMLINK) $(VBOX_NETBSD_TARGET_ARCH) $@
6239
6240endif # NetBSD
6241
6242ifeq ($(KBUILD_TARGET),haiku)
6243 ## The Haiku include directories
6244 VBOX_HAIKU_SYS_INCS ?= /boot/develop/headers/os/kernel /boot/develop/headers/os/drivers
6245
6246 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6247 TEMPLATE_VBoxR0Drv_LDTOOL = $(VBOX_GCC_TOOL)
6248 TEMPLATE_VBoxR0Drv_DEFS = _KERNEL_MODE=1 _STRICT_STDC IN_RING0 IN_RT_R0
6249 if $(VBOX_GCC_VERSION_CC) < 30400
6250 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6251 endif
6252 TEMPLATE_VBoxR0Drv_INCS = $(VBOX_HAIKU_SYS_INCS)
6253 #TODO: sort this out
6254 TEMPLATE_VBoxR0Drv_LDFLAGS = -shared $(VBOX_GCC_NO_UNDEFINED_R0) -dc -dy -lroot -rpath-link /boot/system/develop/lib/x86 --no-add-needed /boot/system/develop/lib/_KERNEL_ --no-add-needed /boot/system/develop/lib/haiku_version_glue.o
6255 TEMPLATE_VBoxR0Drv_CFLAGS = -fno-PIC \
6256 $(VBOX_GCC_WARN) -Wstrict-prototypes $(VBOX_GCC_Wno-pointer-sign) -Wno-sign-compare \
6257 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration
6258 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
6259 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
6260 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow \
6261 -fno-reorder-blocks -ffreestanding -fno-asynchronous-unwind-tables -funit-at-a-time \
6262 -Wno-sign-compare
6263 TEMPLATE_VBoxR0Drv_CXXFLAGS = -fno-PIC -Wpointer-arith \
6264 -Wshadow -Wuninitialized -Wunused-function -Wunused-label -Wunused-value -Wunused-variable \
6265 -Wformat \
6266 -O2 -nodefaultlibs -fno-omit-frame-pointer -fno-strict-aliasing -fno-common -fno-exceptions -fno-rtti
6267 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86) -fno-exceptions -fno-rtti
6268 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64) -fno-exceptions -fno-rtti
6269endif # Haiku
6270
6271ifdef VBOX_WITH_VBOXDRV
6272 ifndef TEMPLATE_VBoxR0Drv_TOOL
6273 $(warning Warning: VBox Build: Target $(KBUILD_HOST) is not officially supported!)
6274 endif
6275endif
6276
6277ifn1of ($(KBUILD_TARGET), darwin os2 win solaris freebsd)
6278 # This doesn't work if supdrv is natively loading VMMR0.r0 et al, but
6279 # fortunately it isn't really necessary.
6280 TEMPLATE_VBoxR0Drv_CFLAGS += -include $(PATH_ROOT)/include/VBox/SUPDrvMangling.h
6281 TEMPLATE_VBoxR0Drv_CXXFLAGS += -include $(PATH_ROOT)/include/VBox/SUPDrvMangling.h
6282 TEMPLATE_VBoxR0Drv_ASDEFS += RT_MANGLER_PREFIX=VBoxHost_
6283endif
6284
6285ifeq ($(KBUILD_TARGET),darwin)
6286 #
6287 # A variant of VBoxR0Drv that uses the 10.10 SDK.
6288 #
6289 TEMPLATE_VBoxR0DrvOSX10.10 = VBoxR0Drv variant using the 10.10 SDK
6290 TEMPLATE_VBoxR0DrvOSX10.10_EXTENDS = VBoxR0Drv
6291 TEMPLATE_VBoxR0DrvOSX10.10_SDKS = MACOSX1010
6292 TEMPLATE_VBoxR0DrvOSX10.10_INCS = $(filter-out $(VBOX_PATH_MACOSX_SDK)/%,$(TEMPLATE_VBoxR0Drv_INCS)) \
6293 $(PATH_SDK_MACOSX1010)/System/Library/Frameworks/Kernel.framework/PrivateHeaders \
6294 $(PATH_SDK_MACOSX1010)/System/Library/Frameworks/Kernel.framework/Headers
6295 TEMPLATE_VBoxR0DrvOSX10.10_DEFS = $(filter-out $(VBOX_DARWIN_DEF_SDK_DEFS),$(TEMPLATE_VBoxR0Drv_DEFS))
6296
6297endif
6298
6299#
6300# Template for building libraries used by ring-0 drivers.
6301#
6302TEMPLATE_VBoxR0DrvLib = VBox Ring 0 Driver Library
6303TEMPLATE_VBoxR0DrvLib_EXTENDS = VBoxR0Drv
6304TEMPLATE_VBoxR0DrvLib_INSTTYPE = stage
6305TEMPLATE_VBoxR0DrvLib_INSTTYPE.linux = stage
6306
6307#
6308# Template for installing INF and CAT files.
6309#
6310TEMPLATE_VBoxR0DrvInfCat = VBox SUPDRV Ring 0 - Install .sys, .cat, .inf
6311TEMPLATE_VBoxR0DrvInfCat_INST = $(INST_BIN)
6312TEMPLATE_VBoxR0DrvInfCat_MODE = a+r,u+w
6313TEMPLATE_VBoxR0DrvInfCat_IFFLAGS = --no-hard-link-files-when-possible
6314
6315
6316#
6317# Template for building R3 executables and static libraries which are linked into executables.
6318# Note! This is the base template for a whole lot of other ones, so be careful when changing it.
6319#
6320# Disabled Visual C++ warnings:
6321# -wd4065: switch statement contains 'default' but no 'case' labels
6322# -wd4244: 'conversion' conversion from 'type1' to 'type2', possible loss of data
6323# -wd4996: deprecated / insecure.
6324#
6325TEMPLATE_VBoxR3Exe = VBox Ring 3 Exe
6326$(foreach arch,$(VBOX_TARGET_ARCHES)\
6327,$(eval TEMPLATE_VBoxR3Exe_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
6328$(foreach arch,$(VBOX_TARGET_ARCHES)\
6329,$(eval TEMPLATE_VBoxR3Exe_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
6330TEMPLATE_VBoxR3Exe_DEFS = IN_RING3 $(VBOX_GC_ARCH_BITS_DEFS)
6331TEMPLATE_VBoxR3Exe_DEFS.x86 = HC_ARCH_BITS=32
6332TEMPLATE_VBoxR3Exe_DEFS.arm32 = HC_ARCH_BITS=32
6333TEMPLATE_VBoxR3Exe_DEFS.sparc32 = HC_ARCH_BITS=32
6334TEMPLATE_VBoxR3Exe_DEFS.amd64 = HC_ARCH_BITS=64
6335TEMPLATE_VBoxR3Exe_DEFS.arm64 = HC_ARCH_BITS=64
6336TEMPLATE_VBoxR3Exe_DEFS.sparc64 = HC_ARCH_BITS=64
6337TEMPLATE_VBoxR3Exe_DEFS.win = _CRT_SECURE_NO_DEPRECATE
6338TEMPLATE_VBoxR3Exe_USES = dtrace
6339if defined(VBOX_WITH_DTRACE_R3) && defined(VBOX_WITH_NATIVE_DTRACE)
6340 TEMPLATE_VBoxR3Exe_DTRACETOOL = DTraceAndVBoxTpG
6341 TEMPLATE_VBoxR3Exe_DTRACE_OBJ_FLAGS = -C
6342 TEMPLATE_VBoxR3Exe_DTRACE_HDR_FLAGS = -C
6343 TEMPLATE_VBoxR3Exe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3 VBOX_WITH_NATIVE_DTRACE
6344else
6345 TEMPLATE_VBoxR3Exe_DTRACE_HDR_FLAGS = --ring-3-context
6346 TEMPLATE_VBoxR3Exe_DTRACE_OBJ_FLAGS = --ring-3-context --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
6347 if defined(VBOX_WITH_DTRACE_R3)
6348 TEMPLATE_VBoxR3Exe_DTRACETOOL = VBoxTpG
6349 TEMPLATE_VBoxR3Exe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3
6350 else
6351 TEMPLATE_VBoxR3Exe_DTRACETOOL = VBoxTpG-Disabled
6352 endif
6353endif
6354TEMPLATE_VBoxR3Exe_LATE_LIBS.kprofile = $(LIB_KPROFILE)
6355ifeq ($(KBUILD_TARGET),win)
6356 # TEMPLATE_VBoxR3Exe_TOOL = $(VBOX_VCC_TOOL)
6357 TEMPLATE_VBoxR3Exe_TOOL.win.x86 = $(VBOX_VCC_TOOL_STEM)X86
6358 TEMPLATE_VBoxR3Exe_TOOL.win.amd64 = $(VBOX_VCC_TOOL_STEM)AMD64
6359 TEMPLATE_VBoxR3Exe_TOOL.win.arm64 = $(VBOX_VCC_TOOL_STEM)ARM64
6360 TEMPLATE_VBoxR3Exe_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
6361 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6362 TEMPLATE_VBoxR3Exe_SDKS = ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER) $(VBOX_WINPSDK)
6363 else
6364 TEMPLATE_VBoxR3Exe_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK)
6365 endif
6366 TEMPLATE_VBoxR3Exe_CXXFLAGS = -Zi -Zl -GR- -EHsc -GF -MD$(VBOX_VCC_CRT_TYPE) $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_OPT) $(VBOX_VCC_FP) \
6367 -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS) $(VBOX_VCC_std) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6368 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
6369 TEMPLATE_VBoxR3Exe_CXXFLAGS += -Gw
6370 endif
6371 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
6372 TEMPLATE_VBoxR3Exe_CXXFLAGS += -Zc:inline
6373 endif
6374 ifdef VBOX_WITH_MSC_ANALYZE_THIS
6375 TEMPLATE_VBoxR3Exe_CXXFLAGS += /analyze
6376 endif
6377 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
6378 TEMPLATE_VBoxR3Exe_CXXFLAGS += /volatileMetadata-
6379 endif
6380 TEMPLATE_VBoxR3Exe_CXXFLAGS.debug = -RTCsu
6381 TEMPLATE_VBoxR3Exe_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
6382 TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile = -Gh -GH
6383 TEMPLATE_VBoxR3Exe_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxR3Exe_CXXFLAGS))
6384 TEMPLATE_VBoxR3Exe_CFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6385 TEMPLATE_VBoxR3Exe_CFLAGS.dbgopt = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.dbgopt)
6386 TEMPLATE_VBoxR3Exe_CFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6387 TEMPLATE_VBoxR3Exe_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6388 TEMPLATE_VBoxR3Exe_PCHFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6389 TEMPLATE_VBoxR3Exe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.dbgopt)
6390 TEMPLATE_VBoxR3Exe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6391 TEMPLATE_VBoxR3Exe_LDFLAGS = -Ignore:4197 \
6392 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
6393 $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS) \
6394 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
6395 /STUB:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com \
6396 /DISALLOWLIB:libc.lib \
6397 /DISALLOWLIB:libcd.lib \
6398 /DISALLOWLIB:libcmt.lib \
6399 /DISALLOWLIB:libcmtd.lib \
6400 /DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE_N).lib \
6401 /DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE_N).lib
6402 ifdef VBOX_WITH_DTRACE_R3
6403 TEMPLATE_VBoxR3Exe_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
6404 endif
6405 if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
6406 TEMPLATE_VBoxR3Exe_LDFLAGS += -IntegrityCheck
6407 endif
6408 TEMPLATE_VBoxR3Exe_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
6409 TEMPLATE_VBoxR3Exe_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
6410 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
6411 TEMPLATE_VBoxR3Exe_LDFLAGS += -EmitVolatileMetadata:NO
6412 endif
6413
6414 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6415 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 = \
6416 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
6417 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6418 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6419 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
6420 TEMPLATE_VBoxR3Exe_LATE_LIBS.amd64 = \
6421 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
6422 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6423 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6424 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/oldnames.lib
6425 TEMPLATE_VBoxR3Exe_LATE_LIBS.arm64 = \
6426 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
6427 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6428 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6429 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/oldnames.lib
6430 ifeq ($(KBUILD_TYPE),asan)
6431 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 += \
6432 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic-i386.lib \
6433 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic_runtime_thunk-i386.lib
6434 TEMPLATE_VBoxR3Exe_LATE_LIBS.amd64 += \
6435 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic-x86_64.lib \
6436 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib
6437 endif
6438 else
6439 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 = \
6440 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6441 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6442 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
6443 TEMPLATE_VBoxR3Exe_LATE_LIBS.amd64 = \
6444 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6445 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6446 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/oldnames.lib
6447 endif
6448
6449 TEMPLATE_VBoxR3Exe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
6450 TEMPLATE_VBoxR3Exe_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
6451 if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
6452 TEMPLATE_VBoxR3Exe_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out)$$(NLTAB)$(TEMPLATE_VBoxR3Exe_POST_CMDS))
6453 TEMPLATE_VBoxR3Exe_LNK_DEPS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION))
6454 TEMPLATE_VBoxR3Exe_LDFLAGS.win.x86 = \
6455 -Include:_vcc100_kernel32_fakes_cpp \
6456 -Include:_vcc100_kernel32_fakes_asm
6457 TEMPLATE_VBoxR3Exe_LATE_LIBS.win.x86 = \
6458 $(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB)
6459 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 = \
6460 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib \
6461 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6462 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
6463 endif
6464
6465else # the gcc guys
6466 TEMPLATE_VBoxR3Exe_TOOL = $(VBOX_GCC_TOOL)
6467 if $(VBOX_GCC_VERSION_CC) < 30400
6468 TEMPLATE_VBoxR3Exe_DEFS += RT_WITHOUT_PRAGMA_ONCE
6469 endif
6470 TEMPLATE_VBoxR3Exe_CXXFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_OPT) \
6471 $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_std) $(VBOX_GCC_fvisibility-inlines-hidden) \
6472 $(VBOX_GCC_IPRT_FMT_CHECK) $(VBOX_GCC_SANITIZER_FLAGS)
6473 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
6474 TEMPLATE_VBoxR3Exe_CXXFLAGS += $(VBOX_GCC_WERR)
6475 endif
6476 TEMPLATE_VBoxR3Exe_CXXFLAGS.x86 = -m32
6477 TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64 = -m64
6478 TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc32 = -m32
6479 TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc64 = -m64
6480 TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile = -finstrument-functions
6481 TEMPLATE_VBoxR3Exe_CFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_OPT) \
6482 $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_IPRT_FMT_CHECK)
6483 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
6484 TEMPLATE_VBoxR3Exe_CFLAGS += $(VBOX_GCC_WERR)
6485 endif
6486 TEMPLATE_VBoxR3Exe_CFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.x86)
6487 TEMPLATE_VBoxR3Exe_CFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64)
6488 TEMPLATE_VBoxR3Exe_CFLAGS.sparc32 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc32)
6489 TEMPLATE_VBoxR3Exe_CFLAGS.sparc64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc64)
6490 TEMPLATE_VBoxR3Exe_CFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6491 TEMPLATE_VBoxR3Exe_CFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6492 TEMPLATE_VBoxR3Exe_OBJCFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS)
6493 TEMPLATE_VBoxR3Exe_OBJCFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CFLAGS.x86)
6494 TEMPLATE_VBoxR3Exe_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CFLAGS.amd64)
6495 TEMPLATE_VBoxR3Exe_OBJCFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CFLAGS.debug)
6496 TEMPLATE_VBoxR3Exe_OBJCFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CFLAGS.kprofile)
6497 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6498 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.x86)
6499 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64)
6500 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6501 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6502 TEMPLATE_VBoxR3Exe_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6503 TEMPLATE_VBoxR3Exe_PCHFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.x86)
6504 TEMPLATE_VBoxR3Exe_PCHFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64)
6505 TEMPLATE_VBoxR3Exe_PCHFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6506 TEMPLATE_VBoxR3Exe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6507 TEMPLATE_VBoxR3Exe_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
6508 TEMPLATE_VBoxR3Exe_LDFLAGS.x86 = -m32
6509 TEMPLATE_VBoxR3Exe_LDFLAGS.amd64 = -m64
6510 TEMPLATE_VBoxR3Exe_LDFLAGS.sparc32 = -m32
6511 TEMPLATE_VBoxR3Exe_LDFLAGS.sparc64 = -m64
6512 TEMPLATE_VBoxR3Exe_LDFLAGS.linux = -Wl,-z,noexecstack,-z,relro $(VBOX_LD_as_needed)
6513 TEMPLATE_VBoxR3Exe_LDFLAGS.solaris = -Wl,-z,ignore # same as VBOX_LD_as_needed
6514
6515 ifeq ($(KBUILD_TARGET),linux)
6516 TEMPLATE_VBoxR3Exe_LATE_LIBS = pthread m rt dl
6517 else ifeq ($(KBUILD_TARGET),os2)
6518 TEMPLATE_VBoxR3Exe_TOOL = GXX3OMF
6519 TEMPLATE_VBoxR3Exe_LATE_LIBS = socket iconv
6520 else ifeq ($(KBUILD_TARGET),darwin)
6521 TEMPLATE_VBoxR3Exe_TOOL = $(VBOX_GCC_TOOL)
6522 TEMPLATE_VBoxR3Exe_LATE_LIBS =
6523 TEMPLATE_VBoxR3Exe_DEFS += LIBICONV_PLUG # Avoid 3rd party libiconv (from macports).
6524 TEMPLATE_VBoxR3Exe_SDKS.darwin = $(VBOX_DARWIN_DEF_SDK_SDKS)
6525 TEMPLATE_VBoxR3Exe_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_DEFS)
6526 TEMPLATE_VBoxR3Exe_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
6527 TEMPLATE_VBoxR3Exe_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
6528 TEMPLATE_VBoxR3Exe_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
6529 TEMPLATE_VBoxR3Exe_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
6530 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS)
6531 TEMPLATE_VBoxR3Exe_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -Wl,-headerpad_max_install_names
6532 TEMPLATE_VBoxR3Exe_LDFLAGS.darwin.x86 = -read_only_relocs suppress
6533 TEMPLATE_VBoxR3Exe_POST_CMDS.darwin = $(VBOX_SIGN_IMAGE_CMDS)
6534 ifdef VBOX_WITH_DTRACE_R3
6535 TEMPLATE_VBoxR3Exe_CXXFLAGS := $(filter-out -pedantic,$(TEMPLATE_VBoxR3Exe_CXXFLAGS)) -fdollars-in-identifiers # annoying gcc option precedence.
6536 endif
6537 else ifeq ($(KBUILD_TARGET),haiku)
6538 TEMPLATE_VBoxR3Exe_TOOL = GXX3
6539 TEMPLATE_VBoxR3Exe_POST_CMDS = $(VBOX_HAIKU_XRES_SETVER_CMDS)
6540 TEMPLATE_VBoxR3Exe_LATE_LIBS = network iconv stdc++ supc++
6541 TEMPLATE_VBoxR3Exe_LIBPATH += \
6542 /boot/common/lib
6543 # Haiku uses PIC by default...
6544 TEMPLATE_VBoxR3Exe_CFLAGS += -fno-pic
6545 TEMPLATE_VBoxR3Exe_CXXFLAGS += -fno-pic
6546 TEMPLATE_VBoxR3Exe_LDFLAGS += -fno-pic
6547 else if1of ($(KBUILD_TARGET), freebsd openbsd)
6548 TEMPLATE_VBoxR3Exe_TOOL = GXX3
6549 TEMPLATE_VBoxR3Exe_LATE_LIBS = pthread
6550 TEMPLATE_VBoxR3Exe_INCS += \
6551 /usr/include \
6552 /usr/X11R6/include \
6553 /usr/local/include
6554 TEMPLATE_VBoxR3Exe_LIBPATH += \
6555 /usr/lib \
6556 /usr/X11R6/lib \
6557 /usr/local/lib
6558 else ifeq ($(KBUILD_TARGET),netbsd)
6559 TEMPLATE_VBoxR3Exe_TOOL = GXX3
6560 TEMPLATE_VBoxR3Exe_LATE_LIBS = pthread
6561 TEMPLATE_VBoxR3Exe_INCS += \
6562 /usr/include \
6563 /usr/X11R7/include
6564 TEMPLATE_VBoxR3Exe_LIBPATH += \
6565 /usr/lib \
6566 /usr/X11R7/lib
6567 else ifeq ($(KBUILD_TARGET),solaris)
6568 TEMPLATE_VBoxR3Exe_TOOL = GXX3PLAIN
6569 TEMPLATE_VBoxR3Exe_DEFS += LIBICONV_PLUG _REENTRANT # Avoid the GNU libiconv, for now at least.
6570 if $(VBOX_GCC_VERSION_CC) < 30500
6571 TEMPLATE_VBoxR3Exe_CFLAGS += -std=gnu99
6572 endif
6573 TEMPLATE_VBoxR3Exe_LATE_LIBS = rt socket
6574 else
6575 $(warning Warning: VBOX Build: Target $(KBUILD_TARGET) is not officially supported!)
6576 TEMPLATE_VBoxR3Exe_CXXFLAGS.profile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.release)
6577 TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.krelease)
6578 endif
6579 ifdef VBOX_WITH_RUNPATH
6580 TEMPLATE_VBoxR3Exe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
6581 else ifdef VBOX_WITH_RELATIVE_RUNPATH
6582 TEMPLATE_VBoxR3Exe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
6583 endif
6584 ifdef VBOX_WITH_ORIGIN
6585 TEMPLATE_VBoxR3Exe_LDFLAGS.linux += $(VBOX_GCC_ORIGIN_OPT)
6586 endif
6587endif
6588
6589#
6590# Template for building R3 shared objects / DLLs - base template, don't use directly.
6591# This is mostly identical to the VBoxR3Exe template. (Avoid PIC if possible!)
6592#
6593## @todo Eliminate VBoxR3DllBase in favor of VBoxR3Dll.
6594TEMPLATE_VBoxR3DllBase = VBox Ring 3 SO/DLLs Base Template - do not use directly!
6595TEMPLATE_VBoxR3DllBase_EXTENDS = VBoxR3Exe
6596TEMPLATE_VBoxR3DllBase_DEFS.darwin = $(TEMPLATE_VBoxR3Exe_DEFS.darwin) PIC
6597TEMPLATE_VBoxR3DllBase_LDFLAGS.darwin = $(TEMPLATE_VBoxR3Exe_LDFLAGS.darwin) \
6598 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
6599 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
6600ifn1of ($(KBUILD_TARGET), darwin win os2)
6601 TEMPLATE_VBoxR3DllBase_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS) PIC
6602 TEMPLATE_VBoxR3DllBase_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) -fPIC
6603 TEMPLATE_VBoxR3DllBase_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) -fPIC
6604 TEMPLATE_VBoxR3DllBase_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) -fPIC
6605 TEMPLATE_VBoxR3DllBase_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) -fPIC
6606endif
6607
6608#
6609# Temporary: Renaming the template and warnings will be errors ("soon").
6610#
6611TEMPLATE_VBoxR3Dll = VBox ring-3 SO/DLLs, no warnings
6612TEMPLATE_VBoxR3Dll_EXTENDS += VBoxR3DllBase
6613TEMPLATE_VBoxR3Dll_EXTENDS_BY += appending
6614ifeq ($(KBUILD_TARGET),win)
6615 TEMPLATE_VBoxR3Dll_CFLAGS += $(VBOX_VCC_WERR)
6616 TEMPLATE_VBoxR3Dll_CXXFLAGS += $(VBOX_VCC_WERR)
6617 TEMPLATE_VBoxR3Dll_PCHFLAGS += $(VBOX_VCC_WERR)
6618 TEMPLATE_VBoxR3Dll_LDFLAGS += $(VBOX_VCC_LD_WERR)
6619else
6620 TEMPLATE_VBoxR3Dll_CFLAGS += $(VBOX_GCC_WERR)
6621 TEMPLATE_VBoxR3Dll_CXXFLAGS += $(VBOX_GCC_WERR)
6622 TEMPLATE_VBoxR3Dll_PCHFLAGS += $(VBOX_GCC_WERR)
6623endif
6624
6625# x86 edition of the above template for use on AMD64 targets.
6626TEMPLATE_VBoxR3Dll-x86 = 32-bit VBox ring-3 SO/DLLs, no warnings
6627TEMPLATE_VBoxR3Dll-x86_EXTENDS = VBoxR3Dll
6628TEMPLATE_VBoxR3Dll-x86_BLD_TRG_ARCH = x86
6629TEMPLATE_VBoxR3Dll-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxR3Dll_DEFS)) \
6630 HC_ARCH_BITS=32 ARCH_BITS=32
6631
6632
6633#
6634# Template for building performance critical stuff with warnings-as-errors.
6635#
6636TEMPLATE_VBoxR3DllNoPic = VBox ring-3 SO/DLLs without PIC, without warnings.
6637TEMPLATE_VBoxR3DllNoPic_EXTENDS = VBoxR3DllBase
6638if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), linux.x86 freebsd.x86)
6639 TEMPLATE_VBoxR3DllNoPic_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS)
6640 TEMPLATE_VBoxR3DllNoPic_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) $(VBOX_GCC_WERR)
6641 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_GCC_WERR)
6642 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_GCC_WERR)
6643 TEMPLATE_VBoxR3DllNoPic_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS)
6644else ifeq ($(KBUILD_TARGET),win)
6645 TEMPLATE_VBoxR3DllNoPic_CFLAGS = $(filter-out -W3 -wd%,$(TEMPLATE_VBoxR3DllBase_CFLAGS)) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6646 TEMPLATE_VBoxR3DllNoPic_CFLAGS.debug = $(filter-out -RTC%,$(TEMPLATE_VBoxR3DllBase_CFLAGS.debug))
6647 TEMPLATE_VBoxR3DllNoPic_CFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CFLAGS.release) -GS-
6648 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS = $(filter-out -W3 -wd%,$(TEMPLATE_VBoxR3DllBase_CXXFLAGS)) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6649 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS.debug = $(filter-out -RTC%,$(TEMPLATE_VBoxR3DllBase_CXXFLAGS.debug)) # RTCsu Prevents IEM opt.
6650 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS.release) -GS-
6651 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS = $(filter-out -W3 -wd%,$(TEMPLATE_VBoxR3DllBase_PCHFLAGS)) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6652 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS.debug = $(filter-out -RTC%,$(TEMPLATE_VBoxR3DllBase_PCHFLAGS.debug)) # RTCsu Prevents IEM opt.
6653 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS.release = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS.release) -GS-
6654 TEMPLATE_VBoxR3DllNoPic_LDFLAGS = $(TEMPLATE_VBoxR3DllBase_LDFLAGS) $(VBOX_VCC_LD_WERR)
6655else
6656 TEMPLATE_VBoxR3DllNoPic_CFLAGS = $(TEMPLATE_VBoxR3DllBase_CFLAGS) $(VBOX_GCC_WERR)
6657 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS) $(VBOX_GCC_WERR)
6658 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS) $(VBOX_GCC_WERR)
6659endif
6660
6661# x86 edition of the above template for use on AMD64 targets.
6662TEMPLATE_VBoxR3DllNoPic-x86 = 32-bit VBox ring-3 SO/DLLs without PIC, without warnings.
6663TEMPLATE_VBoxR3DllNoPic-x86_EXTENDS = VBoxR3DllNoPic
6664TEMPLATE_VBoxR3DllNoPic-x86_BLD_TRG_ARCH = x86
6665TEMPLATE_VBoxR3DllNoPic-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxR3DllNoPic_DEFS)) \
6666 HC_ARCH_BITS=32 ARCH_BITS=32
6667
6668
6669#
6670# Template for building performance critical stuff without warnings-as-errors.
6671#
6672TEMPLATE_VBoxR3DllWarnNoPic = VBox ring-3 SO/DLLs without PIC, with warnings.
6673TEMPLATE_VBoxR3DllWarnNoPic_EXTENDS = VBoxR3DllBase
6674if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), linux.x86 freebsd.x86)
6675 TEMPLATE_VBoxR3DllWarnNoPic_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS)
6676 TEMPLATE_VBoxR3DllWarnNoPic_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS)
6677 TEMPLATE_VBoxR3DllWarnNoPic_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6678 TEMPLATE_VBoxR3DllWarnNoPic_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS)
6679 TEMPLATE_VBoxR3DllWarnNoPic_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS)
6680else ifeq ($(KBUILD_TARGET),win)
6681 TEMPLATE_VBoxR3DllWarnNoPic_CFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CFLAGS.release) -GS-
6682 TEMPLATE_VBoxR3DllWarnNoPic_CXXFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS.release) -GS-
6683 TEMPLATE_VBoxR3DllWarnNoPic_PCHFLAGS.release = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS.release) -GS-
6684endif
6685
6686#
6687# Base template for building static R3 executables and any static
6688# libraries they link with. Do _not_ use directly!
6689#
6690## @todo Bake this into VBoxR3Static.
6691TEMPLATE_VBoxR3StaticBase = VBox Static Ring 3 EXE
6692TEMPLATE_VBoxR3StaticBase_EXTENDS = VBoxR3Exe
6693TEMPLATE_VBoxR3StaticBase_DEFS = IN_RT_STATIC IN_RT_R3 IN_SUP_STATIC $(TEMPLATE_VBoxR3Exe_DEFS)
6694ifdef VBOX_WITH_NOCRT_STATIC
6695 TEMPLATE_VBoxR3StaticBase_DEFS += IPRT_NO_CRT
6696 TEMPLATE_VBoxR3StaticBase_INCS = $(PATH_ROOT)/include/iprt/nocrt $(TEMPLATE_VBoxR3Exe_INCS)
6697endif
6698ifeq ($(KBUILD_TARGET),win)
6699 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6700 ifdef VBOX_WITH_NOCRT_STATIC
6701 TEMPLATE_VBoxR3StaticBase_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER),,$(TEMPLATE_VBoxR3Exe_SDKS))
6702 else
6703 TEMPLATE_VBoxR3StaticBase_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER), WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC,$(TEMPLATE_VBoxR3Exe_SDKS))
6704 endif
6705 endif
6706 ifdef VBOX_WITH_NOCRT_STATIC
6707 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE) -EHsc -GR, $(TEMPLATE_VBoxR3Exe_CFLAGS)) \
6708 -Zl -EHc-s- -Gy -GR-
6709 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE) -EHsc -GR, $(TEMPLATE_VBoxR3Exe_CXXFLAGS)) \
6710 -Zl -EHc-s- -Gy -GR-
6711 TEMPLATE_VBoxR3StaticBase_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE) -EHsc -GR, $(TEMPLATE_VBoxR3Exe_PCHFLAGS)) \
6712 -Zl -EHc-s- -Gy -GR-
6713 else
6714 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Exe_CFLAGS)) \
6715 -MT$(VBOX_VCC_CRT_TYPE) -Gy
6716 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Exe_CXXFLAGS)) \
6717 -MT$(VBOX_VCC_CRT_TYPE) -Gy
6718 TEMPLATE_VBoxR3StaticBase_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Exe_PCHFLAGS)) \
6719 -MT$(VBOX_VCC_CRT_TYPE) -Gy
6720 endif
6721
6722 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120" # Do not use SSE so valkit stuff can run on NT4 w/o needing a separate runtime library.
6723 TEMPLATE_VBoxR3StaticBase_CFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_CFLAGS.win.86) /arch:IA32
6724 TEMPLATE_VBoxR3StaticBase_CXXFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.win.86) /arch:IA32
6725 TEMPLATE_VBoxR3StaticBase_PCHFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_PCHFLAGS.win.86) /arch:IA32
6726 TEMPLATE_VBoxR3StaticBase_CFLAGS += -Gw
6727 TEMPLATE_VBoxR3StaticBase_CXXFLAGS += -Gw
6728 TEMPLATE_VBoxR3StaticBase_PCHFLAGS += -Gw
6729 endif
6730
6731 ifdef VBOX_WITH_NOCRT_STATIC
6732 # .0000cfg normally merges into .idata, but the linker won't let us do so via /MERGE. Doesn't matter much,
6733 # because .idata can be writable when targeting x86 (NT 3.1 fun) and we don't want .0000cfg to be writable.
6734 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) /NODEFAULTLIB /Merge:.0000cfg=.rdata
6735 else
6736 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(filter-out /DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE).lib /DISALLOWLIB:libcpmt$(VBOX_VCC_CRT_TYPE).lib, $(TEMPLATE_VBoxR3Exe_LDFLAGS))
6737 endif
6738 TEMPLATE_VBoxR3StaticBase_LDFLAGS += \
6739 /DISALLOWLIB:msvcrt.lib \
6740 /DISALLOWLIB:msvcrtd.lib \
6741 /DISALLOWLIB:msvcprt.lib \
6742 /DISALLOWLIB:msvcprtd.lib \
6743 /DISALLOWLIB:vcruntime.lib \
6744 /DISALLOWLIB:vcruntimed.lib \
6745 /DISALLOWLIB:ucrt.lib \
6746 /DISALLOWLIB:ucrtd.lib
6747 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6748 ifdef VBOX_WITH_NOCRT_STATIC
6749 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
6750 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
6751 else
6752 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = \
6753 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
6754 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6755 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6756 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/oldnames.lib
6757 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = \
6758 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
6759 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6760 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6761 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/oldnames.lib
6762 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.arm64 = \
6763 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
6764 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6765 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6766 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/oldnames.lib
6767 endif
6768 ifeq ($(KBUILD_TYPE),asan)
6769 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 += \
6770 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/clang_rt.asan-i386.lib \
6771 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/clang_rt.asan_cxx-i386.lib
6772 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 += \
6773 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/clang_rt.asan-x86_64.lib \
6774 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/clang_rt.asan_cxx-x86_64.lib
6775 endif
6776 else
6777 ifdef VBOX_WITH_NOCRT_STATIC
6778 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
6779 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
6780 else
6781 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = \
6782 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/oldnames.lib \
6783 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6784 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
6785 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = \
6786 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6787 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6788 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/oldnames.lib
6789 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.arm64 = \
6790 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6791 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6792 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/oldnames.lib
6793 endif
6794 endif
6795else
6796 ifdef VBOX_WITH_NOCRT_STATIC
6797 TEMPLATE_VBoxR3StaticBase_DEFS += RT_WITH_NOCRT_WRAPPERS
6798 endif
6799 ifn1of ($(KBUILD_TARGET), darwin linux solaris)
6800 # The gcc guys sans darwin, linux and solaris (don't depend on statically compiled system libs there)
6801 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) -static
6802 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) -static
6803 TEMPLATE_VBoxR3StaticBase_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) -static
6804 TEMPLATE_VBoxR3StaticBase_OBJCFLAGS = $(TEMPLATE_VBoxR3Exe_OBJCFLAGS) -static
6805 TEMPLATE_VBoxR3StaticBase_OBJCXXFLAGS = $(TEMPLATE_VBoxR3Exe_OBJCXXFLAGS) -static
6806 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) -static
6807 else ifeq ($(KBUILD_TARGET),solaris)
6808 TEMPLATE_VBoxR3StaticBase_LATE_LIBS = $(TEMPLATE_VBoxR3Exe_LATE_LIBS) nsl
6809 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)',$(TEMPLATE_VBoxR3Exe_LDFLAGS))
6810 else
6811 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)',$(TEMPLATE_VBoxR3Exe_LDFLAGS))
6812 endif
6813 ifn1of ($(KBUILD_TARGET), darwin os2) # ELF only. Present in gcc 3.2.3 & binutils 2.15, possibly earlier.
6814 ifdef VBOX_LD_gc_sections # Older solaris linker versions doesn't grok --gc-sections (e.g. add build box).
6815 ifndef TEMPLATE_VBoxR3StaticBase_CXXFLAGS
6816 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6817 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS)
6818 endif
6819 TEMPLATE_VBoxR3StaticBase_CXXFLAGS += -ffunction-sections -fdata-sections
6820 TEMPLATE_VBoxR3StaticBase_CFLAGS += -ffunction-sections -fdata-sections
6821 TEMPLATE_VBoxR3StaticBase_LDFLAGS += $(VBOX_LD_gc_sections)
6822 endif
6823 endif
6824endif
6825
6826#
6827# Temporary: Renaming the template and warnings will be errors (soon).
6828# Unlike VBoxR3StaticBase, this is strict wrt warnings and includes IPRT.
6829#
6830TEMPLATE_VBoxR3Static = New name for VBoxR3StaticBase
6831TEMPLATE_VBoxR3Static_EXTENDS = VBoxR3StaticBase
6832TEMPLATE_VBoxR3Static_EXTENDS_BY = appending
6833TEMPLATE_VBoxR3Static_SDKS.$(KBUILD_TARGET_ARCH) += VBoxOpenSslStatic
6834TEMPLATE_VBoxR3Static_SDKS.win += VBoxNtDll
6835ifeq ($(KBUILD_TARGET),win)
6836 TEMPLATE_VBoxR3Static_CFLAGS += $(VBOX_VCC_WERR)
6837 TEMPLATE_VBoxR3Static_CXXFLAGS += $(VBOX_VCC_WERR)
6838 TEMPLATE_VBoxR3Static_PCHFLAGS += $(VBOX_VCC_WERR)
6839 TEMPLATE_VBoxR3Static_LDFLAGS += $(VBOX_VCC_LD_WERR)
6840else
6841 TEMPLATE_VBoxR3Static_CFLAGS += $(VBOX_GCC_WERR)
6842 TEMPLATE_VBoxR3Static_CXXFLAGS += $(VBOX_GCC_WERR)
6843 TEMPLATE_VBoxR3Static_PCHFLAGS += $(VBOX_GCC_WERR)
6844 TEMPLATE_VBoxR3Static_LDFLAGS.darwin.arm64 += $(TEMPLATE_VBoxR3StaticBase_LDFLAGS.darwin.arm64) -framework IOKit
6845endif
6846TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6847 $(VBOX_LIB_RUNTIME_STATIC)
6848ifneq ($(KBUILD_TARGET_ARCH),x86)
6849 TEMPLATE_VBoxR3Static_LATE_LIBS.x86 += \
6850 $(VBOX_LIB_RUNTIME_STATIC_X86)
6851endif
6852ifndef SDK_VBoxLibXml2_LIBS
6853 TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6854 $(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB)
6855endif
6856if1of ($(KBUILD_TARGET), os2 win)
6857 TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6858 $(SDK_VBoxLzfStatic_LIBS) \
6859 $(SDK_VBoxZlibStatic_LATE_LIBS) \
6860 $(SDK_VBoxLibLzmaStatic_LIBS)
6861else
6862 TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6863 $(SDK_VBoxLzf_LIBS) \
6864 $(SDK_VBoxZlib_LATE_LIBS) \
6865 $(SDK_VBoxLibLzma_LIBS)
6866 if1of ($(KBUILD_TARGET), darwin freebsd)
6867 TEMPLATE_VBoxR3Static_LATE_LIBS += iconv
6868 else ifeq ($(KBUILD_TARGET),solaris)
6869 TEMPLATE_VBoxR3Static_LATE_LIBS += kstat
6870 endif
6871endif
6872
6873#
6874# A no-ASAN version of VBoxR3Static for things like that automatically executed tests.
6875#
6876TEMPLATE_VBoxR3StaticExeNoAsan = VBoxR3Static but w/o ASAN
6877TEMPLATE_VBoxR3StaticExeNoAsan_EXTENDS = VBoxR3Static
6878if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
6879 TEMPLATE_VBoxR3StaticExeNoAsan_CFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3Static_CFLAGS))
6880 TEMPLATE_VBoxR3StaticExeNoAsan_CXXFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3Static_CXXFLAGS))
6881 TEMPLATE_VBoxR3StaticExeNoAsan_PCHFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3Static_PCHFLAGS))
6882 TEMPLATE_VBoxR3StaticExeNoAsan_LDFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3Static_LDFLAGS)) -InferAsanLibs:No
6883 TEMPLATE_VBoxR3StaticExeNoAsan_LATE_LIBS.x86 = $(subst $(VBOX_LIB_RUNTIME_STATIC),$(VBOX_LIB_RUNTIME_STATIC_NO_ASAN),$(filter-out %clang_rt.asan-i386.lib %clang_rt.asan_cxx-i386.lib , $(TEMPLATE_VBoxR3Static_LATE_LIBS.x86)))
6884 TEMPLATE_VBoxR3StaticExeNoAsan_LATE_LIBS.amd64 = $(subst $(VBOX_LIB_RUNTIME_STATIC),$(VBOX_LIB_RUNTIME_STATIC_NO_ASAN),$(filter-out %clang_rt.asan-x86_64.lib %clang_rt.asan_cxx-x86_64.lib, $(TEMPLATE_VBoxR3Static_LATE_LIBS.amd64)))
6885endif
6886
6887#
6888# A DLL capable version of VBoxR3Static
6889#
6890## @todo make VBoxR3StaticDll work on non-windows.
6891TEMPLATE_VBoxR3StaticDll = VBox Static Ring-3 DLL
6892TEMPLATE_VBoxR3StaticDll_EXTENDS = VBoxR3Static
6893if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
6894 TEMPLATE_VBoxR3StaticDll_LATE_LIBS.x86 = $(patsubst %clang_rt.asan-i386.lib, %clang_rt.asan_dll_thunk-i386.lib, $(filter-out %clang_rt.asan_cxx-i386.lib,$(TEMPLATE_VBoxR3Static_LATE_LIBS.x86)))
6895 TEMPLATE_VBoxR3StaticDll_LATE_LIBS.amd64 = $(patsubst %clang_rt.asan-x86_64.lib, %clang_rt.asan_dll_thunk-x86_64.lib, $(filter-out %clang_rt.asan_cxx-x86_64.lib,$(TEMPLATE_VBoxR3Static_LATE_LIBS.amd64)))
6896endif
6897
6898#
6899# A no-ASAN version of VBoxR3StaticDll for the installer helper DLL.
6900#
6901# Note! Not compatible with BLD_TRG_ARCH overrides yet.
6902#
6903TEMPLATE_VBoxR3StaticDllNoAsan = VBoxR3StaticDll but w/o ASAN
6904TEMPLATE_VBoxR3StaticDllNoAsan_EXTENDS = VBoxR3StaticDll
6905if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
6906 TEMPLATE_VBoxR3StaticDllNoAsan_CFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3StaticDll_CFLAGS))
6907 TEMPLATE_VBoxR3StaticDllNoAsan_CXXFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3StaticDll_CXXFLAGS))
6908 TEMPLATE_VBoxR3StaticDllNoAsan_PCHFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3StaticDll_PCHFLAGS))
6909 TEMPLATE_VBoxR3StaticDllNoAsan_LDFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3StaticDll_LDFLAGS)) -InferAsanLibs:No
6910 TEMPLATE_VBoxR3StaticDllNoAsan_LATE_LIBS.x86 = $(subst $(VBOX_LIB_RUNTIME_STATIC),$(VBOX_LIB_RUNTIME_STATIC_NO_ASAN),$(filter-out %clang_rt.asan_dll_thunk-i386.lib, $(TEMPLATE_VBoxR3StaticDll_LATE_LIBS.x86)))
6911 TEMPLATE_VBoxR3StaticDllNoAsan_LATE_LIBS.amd64 = $(subst $(VBOX_LIB_RUNTIME_STATIC),$(VBOX_LIB_RUNTIME_STATIC_NO_ASAN),$(filter-out %clang_rt.asan_dll_thunk-x86_64.lib, $(TEMPLATE_VBoxR3StaticDll_LATE_LIBS.amd64)))
6912endif
6913
6914
6915#
6916# Non-pedantic variation of VBoxR3Static
6917#
6918TEMPLATE_VBoxR3StaticNonPedantic = VBox Static Ring-3 EXE, non-pedantic.
6919TEMPLATE_VBoxR3StaticNonPedantic_EXTENDS = VBoxR3Static
6920ifeq ($(KBUILD_TARGET),win)
6921 TEMPLATE_VBoxR3StaticNonPedantic_CFLAGS = $(TEMPLATE_VBoxR3Static_CFLAGS) $(VBOX_VCC_NON_PEDANTIC)
6922 TEMPLATE_VBoxR3StaticNonPedantic_CXXFLAGS = $(TEMPLATE_VBoxR3Static_CXXFLAGS) $(VBOX_VCC_NON_PEDANTIC)
6923 TEMPLATE_VBoxR3StaticNonPedantic_PCHFLAGS = $(TEMPLATE_VBoxR3Static_PCHFLAGS) $(VBOX_VCC_NON_PEDANTIC)
6924else # gcc:
6925 TEMPLATE_VBoxR3StaticNonPedantic_TOOL = $(VBOX_GCC_TOOL)
6926 TEMPLATE_VBoxR3StaticNonPedantic_CFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_C) ,$(TEMPLATE_VBoxR3Static_CFLAGS)) \
6927 $(VBOX_GCC_NON_PEDANTIC_CXX)
6928 TEMPLATE_VBoxR3StaticNonPedantic_CXXFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3Static_CXXFLAGS)) \
6929 $(VBOX_GCC_NON_PEDANTIC_CXX)
6930 TEMPLATE_VBoxR3StaticNonPedantic_PCHFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3Static_PCHFLAGS)) \
6931 $(VBOX_GCC_NON_PEDANTIC_CXX)
6932endif
6933
6934#
6935# VBoxR3Static w/o any CRT (windows only atm, experimental).
6936# Implies no fancy C++, no exceptions, no static constructors or destructors, ++.
6937#
6938# Note! Not compatible with BLD_TRG_ARCH overrides yet.
6939#
6940TEMPLATE_VBoxR3StaticNoCrt = Static
6941TEMPLATE_VBoxR3StaticNoCrt_EXTENDS = VBoxR3Static
6942TEMPLATE_VBoxR3StaticNoCrt_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC,WINSDK10-UCRT-INCS, $(TEMPLATE_VBoxR3Static_SDKS))
6943TEMPLATE_VBoxR3StaticNoCrt_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_VBoxR3Static_SDKS.$(KBUILD_TARGET_ARCH)))
6944TEMPLATE_VBoxR3StaticNoCrt_DEFS = $(TEMPLATE_VBoxR3Static_DEFS) \
6945 RT_NO_CRT \
6946 IN_RT_STATIC
6947ifndef VBOX_WITH_NOCRT_STATIC
6948 TEMPLATE_VBoxR3StaticNoCrt_DEFS.win = $(TEMPLATE_VBoxR3Static_DEFS.win) \
6949 RT_WITHOUT_NOCRT_WRAPPERS
6950endif
6951TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS = \
6952 $(PATH_STAGE_LIB)/RuntimeR3NoCrt$(VBOX_SUFF_LIB)
6953ifeq ($(KBUILD_TARGET),win)
6954 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
6955 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
6956 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.arm64 = $(NO_SUCH_VARIABLE)
6957 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.win = $(NO_SUCH_VARIABLE)
6958 ifdef VBOX_WITH_NOCRT_STATIC
6959 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.$(KBUILD_TARGET_ARCH) = \
6960 $(PATH_STAGE_LIB)/RuntimeR3NoCrt$(VBOX_SUFF_LIB)
6961 ifneq ($(KBUILD_TARGET_ARCH),x86)
6962 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.x86 = \
6963 $(PATH_STAGE_LIB)/RuntimeR3NoCrt-x86$(VBOX_SUFF_LIB) # place holder, we don't have this library
6964 endif
6965 else
6966 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.win.x86 = \
6967 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticNoCrt_TOOL.win.x86)_LIB)/chkstk.obj
6968 endif
6969 TEMPLATE_VBoxR3StaticNoCrt_LDFLAGS = $(filter-out $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3Static_LDFLAGS))
6970 TEMPLATE_VBoxR3StaticNoCrt_LDFLAGS.win.x86 = $(filter-out -Include%, $(TEMPLATE_VBoxR3Static_LDFLAGS.win.x86))
6971 TEMPLATE_VBoxR3StaticNoCrt_CFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Static_CFLAGS)) /GS- -EHs-
6972 TEMPLATE_VBoxR3StaticNoCrt_CXXFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Static_CXXFLAGS)) /GS- -EHs-
6973 TEMPLATE_VBoxR3StaticNoCrt_PCHFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Static_PCHFLAGS)) /GS- -EHs-
6974 TEMPLATE_VBoxR3StaticNoCrt_CXXFLAGS.debug = $(filter-out /RTC% -RTC%, $(TEMPLATE_VBoxR3Static_CXXFLAGS.debug))
6975else
6976 TEMPLATE_VBoxR3StaticNoCrt_CXXFLAGS = $(TEMPLATE_VBoxR3Static_CXXFLAGS) -fno-exceptions
6977 TEMPLATE_VBoxR3StaticNoCrt_PCHFLAGS = $(TEMPLATE_VBoxR3Static_PCHFLAGS) -fno-exceptions
6978endif
6979
6980
6981#
6982# Executable w/o CRT (windows only atm, experimental).
6983# Implies no fancy C++, no exceptions, no static constructors or destructors, ++.
6984#
6985TEMPLATE_VBoxR3StaticNoCrtExe := VBoxR3StaticNoCrt with EXE startup code calling a main() function
6986TEMPLATE_VBoxR3StaticNoCrtExe_EXTENDS := VBoxR3StaticNoCrt
6987TEMPLATE_VBoxR3StaticNoCrtExe_EXTENDS_BY := appending
6988TEMPLATE_VBoxR3StaticNoCrtExe_LDFLAGS.win := /entry:CustomMainEntrypoint /subsystem:console
6989
6990
6991#
6992# Template for building hardened Ring-3 executables.
6993# These shall have no extra runpaths, esp. not origin ones.
6994#
6995TEMPLATE_VBoxR3HardenedExe := Hardened VBox Ring-3 EXE
6996TEMPLATE_VBoxR3HardenedExe_EXTENDS := VBoxR3Exe
6997TEMPLATE_VBoxR3HardenedExe_DEBUG_INST.win = $(INST_DEBUG)hardened-exes/
6998TEMPLATE_VBoxR3HardenedExe_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS) RTMEM_NO_WRAP_TO_EF_APIS
6999ifdef VBOX_WITH_HARDENING
7000 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS = $(VBOX_LIB_SUPHARDENED) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7001else
7002 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS = $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7003endif
7004TEMPLATE_VBoxR3HardenedExe_LDFLAGS.darwin = $(TEMPLATE_VBoxR3Exe_LDFLAGS.darwin) -framework IOKit
7005ifeq ($(KBUILD_TARGET),linux)
7006 # not necessary except USE_LIB_PCAP is defined in SUPR3HardenedMain.cpp
7007 # TEMPLATE_VBoxR3HardenedExe_LATE_LIBS += cap
7008endif
7009ifeq ($(KBUILD_TARGET),win) # No CRT!
7010 TEMPLATE_VBoxR3HardenedExe_SDKS = VBoxNtDll $(TEMPLATE_VBoxR3Exe_SDKS)
7011 ifneq ($(VBOX_VCC_LD_GUARD_CF),)
7012 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CXXFLAGS))
7013 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)) #-O2 -Oy-
7014 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_PCHFLAGS))
7015 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_PCHFLAGS.debug)) #-O2 -Oy-
7016 TEMPLATE_VBoxR3HardenedExe_CFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CFLAGS))
7017 TEMPLATE_VBoxR3HardenedExe_CFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CFLAGS.debug)) -O2 -Oy-
7018 else
7019 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CXXFLAGS)) -GS-
7020 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)) -GS- #-O2 -Oy-
7021 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_PCHFLAGS)) -GS-
7022 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_PCHFLAGS.debug)) -GS- #-O2 -Oy-
7023 TEMPLATE_VBoxR3HardenedExe_CFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CFLAGS)) -GS-
7024 TEMPLATE_VBoxR3HardenedExe_CFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CFLAGS.debug)) -GS- -O2 -Oy-
7025 endif
7026 TEMPLATE_VBoxR3HardenedExe_LDFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3Exe_LDFLAGS)) \
7027 /DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7028 /DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7029 /DISALLOWLIB:vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7030 /DISALLOWLIB:ucrt$(VBOX_VCC_CRT_TYPE).lib
7031 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_LDFLAGS.win.x86) /entry:suplibHardenedWindowsMain
7032 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.win.amd64 = $(TEMPLATE_VBoxR3Exe_LDFLAGS.win.amd64) /entry:suplibHardenedWindowsMain
7033 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.win.arm64 = $(TEMPLATE_VBoxR3Exe_LDFLAGS.win.arm64) /entry:suplibHardenedWindowsMain
7034 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS.x86 = $(NOT_SUCH_VARIABLE)
7035 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS.amd64 = $(NOT_SUCH_VARIABLE)
7036 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS.arm64 = $(NOT_SUCH_VARIABLE)
7037 TEMPLATE_VBoxR3HardenedExe_USES.win = $(TEMPLATE_VBoxR3Exe_USES.win) vboximportchecker
7038 TEMPLATE_VBoxR3HardenedExe_VBOX_IMPORT_CHECKER.win = noimports
7039else ifn1of ($(KBUILD_TARGET), os2)
7040 ifneq ($(KBUILD_TYPE),asan) # Keep RPATH in asan builds so we can find libasan.so.X and libubsan.so.Y.
7041 TEMPLATE_VBoxR3HardenedExe_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%,$(TEMPLATE_VBoxR3Exe_LDFLAGS))
7042 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.linux = $(filter-out $(VBOX_GCC_ORIGIN_OPT),$(TEMPLATE_VBoxR3Exe_LDFLAGS.linux))
7043 endif
7044endif
7045
7046#
7047# Template for building hardened Ring-3 libraries.
7048#
7049TEMPLATE_VBoxR3HardenedLib = Hardened VBox Ring-3 LIB
7050TEMPLATE_VBoxR3HardenedLib_EXTENDS = VBoxR3HardenedExe
7051TEMPLATE_VBoxR3HardenedLib_LATE_LIBS = $(NO_SUCH_VARIABLE)
7052TEMPLATE_VBoxR3HardenedLib_LIBS = $(NO_SUCH_VARIABLE)
7053TEMPLATE_VBoxR3HardenedLib_USES.win = $(NO_SUCH_VARIABLE)
7054TEMPLATE_VBoxR3HardenedLib_POST_CMDS = $(NO_SUCH_VARIABLE)
7055
7056
7057#
7058# Template for building hardened Ring-3 testcase executables.
7059#
7060TEMPLATE_VBoxR3HardenedTstExe = VBox Ring-3 Hardened Testcase Exe (currently windows only!)
7061TEMPLATE_VBoxR3HardenedTstExe_EXTENDS = VBoxR3HardenedExe
7062TEMPLATE_VBoxR3HardenedTstExe_INST = $(INST_TESTCASE)
7063
7064#
7065# Template for building hardened Ring-3 testcase DLLs (pairs with VBoxR3HardenedTstExe).
7066#
7067TEMPLATE_VBoxR3HardenedTstDll = VBox Ring-3 Hardened Testcase Dll (currently windows only!)
7068TEMPLATE_VBoxR3HardenedTstDll_EXTENDS = VBoxR3TstDll
7069TEMPLATE_VBoxR3HardenedTstDll_INST = $(INST_TESTCASE)
7070TEMPLATE_VBoxR3HardenedTstDll_LDFLAGS.win = $(TEMPLATE_VBoxR3TstDll_LDFLAGS.win) \
7071 $(if-expr !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT),-IntegrityCheck,)
7072ifn1of ($(KBUILD_TARGET), win os2)
7073 TEMPLATE_VBoxR3HardenedTstDll_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%,$(TEMPLATE_VBoxR3TstDll_LDFLAGS))
7074 TEMPLATE_VBoxR3HardenedTstDll_LDFLAGS.linux = $(filter-out $(VBOX_GCC_ORIGIN_OPT),$(TEMPLATE_VBoxR3TstDll_LDFLAGS.linux))
7075endif
7076
7077#
7078# Template for building set-uid-to-root helper programs.
7079# In hardened builds, these may only contain absolute runpaths!
7080#
7081TEMPLATE_VBoxR3SetUidToRoot = Set-uid-to-root helper program.
7082if1of ($(KBUILD_TARGET), win)
7083 TEMPLATE_VBoxR3SetUidToRoot_EXTENDS = VBoxR3Exe
7084else
7085 TEMPLATE_VBoxR3SetUidToRoot_EXTENDS = VBoxR3HardenedExe
7086 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
7087endif
7088TEMPLATE_VBoxR3SetUidToRoot_LIBS = $(NO_SUCH_VARIABLE)
7089TEMPLATE_VBoxR3SetUidToRoot_LATE_LIBS = $(NO_SUCH_VARIABLE)
7090ifdef VBOX_WITH_RUNPATH
7091 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
7092endif
7093ifndef VBOX_WITH_HARDENING
7094 ifdef VBOX_WITH_RELATIVE_RUNPATH
7095 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
7096 endif
7097 ifdef VBOX_WITH_ORIGIN
7098 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS.linux += $(VBOX_GCC_ORIGIN_OPT)
7099 endif
7100endif
7101
7102#
7103# Template for building R3 tools.
7104#
7105TEMPLATE_VBoxR3Tool = VBox Ring 3 Tools
7106TEMPLATE_VBoxR3Tool_EXTENDS = VBoxR3Exe
7107TEMPLATE_VBoxR3Tool_INST = $(VBOX_INST_TOOLS)
7108ifeq ($(KBUILD_TARGET),win)
7109 TEMPLATE_VBoxR3Tool_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) $(VBOX_VCC_WERR)
7110 TEMPLATE_VBoxR3Tool_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_VCC_WERR)
7111 TEMPLATE_VBoxR3Tool_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) $(VBOX_VCC_WERR)
7112 TEMPLATE_VBoxR3Tool_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) $(VBOX_VCC_LD_WERR)
7113else
7114 TEMPLATE_VBoxR3Tool_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) $(VBOX_GCC_WERR)
7115 TEMPLATE_VBoxR3Tool_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_GCC_WERR)
7116 TEMPLATE_VBoxR3Tool_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) $(VBOX_GCC_WERR)
7117 ifdef VBOX_WITH_RUNPATH
7118 TEMPLATE_VBoxR3Tool_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7119 else ifdef VBOX_WITH_RELATIVE_RUNPATH
7120 TEMPLATE_VBoxR3Tool_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7121 endif
7122endif
7123TEMPLATE_VBoxR3Tool_LATE_LIBS = $(LIB_RUNTIME) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7124if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
7125 TEMPLATE_VBoxR3Tool_LATE_LIBS.x86 = \
7126 $(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB) \
7127 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
7128endif
7129
7130
7131#
7132# Ring-3 testcase, running automatically during the build.
7133# This is the VBoxR3Exe template only with a different install dir.
7134#
7135TEMPLATE_VBoxR3AutoTest = VBox Ring 3 Testcase Exe
7136TEMPLATE_VBoxR3AutoTest_EXTENDS := VBoxR3Static
7137TEMPLATE_VBoxR3AutoTest_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_$(TEMPLATE_VBoxR3AutoTest_EXTENDS)_SDKS.$(KBUILD_TARGET_ARCH)))
7138ifeq ($(KBUILD_TARGET),win)
7139 if "$(KBUILD_HOST_VERSION)" vlt "10.0.0.0.10240" # The windows ASAN requires windows 10 APIs to work.
7140 TEMPLATE_VBoxR3AutoTest_EXTENDS := VBoxR3StaticExeNoAsan
7141 endif
7142 ifdef VBOX_SIGNING_MODE
7143 TEMPLATE_VBoxR3AutoTest_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_$(TEMPLATE_VBoxR3AutoTest_EXTENDS)_LDFLAGS))
7144 TEMPLATE_VBoxR3AutoTest_POST_CMDS = $(NO_SUCH_VARIABLE)
7145 endif
7146endif
7147TEMPLATE_VBoxR3AutoTest_INST = $(INST_TESTCASE)
7148TEMPLATE_VBoxR3AutoTest_LATE_LIBS.$(KBUILD_TARGET_ARCH) = $(filter-out \
7149 $(if-expr !defined(SDK_VBoxLibXml2_LIBS),$(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB),) \
7150 $(if-expr "$(KBUILD_TARGET)" == "win" || "$(KBUILD_TARGET)" == "os2" \
7151 ,$(SDK_VBoxLzfStatic_LIBS) $(SDK_VBoxZlibStatic_LATE_LIBS) $(SDK_VBoxLibLzmaStatic_LIBS) \
7152 ,$(SDK_VBoxLzf_LIBS) $(SDK_VBoxZlib_LATE_LIBS) $(SDK_VBoxLibLzma_LIBS)) \
7153 ,$(TEMPLATE_$(TEMPLATE_VBoxR3AutoTest_EXTENDS)_LATE_LIBS.$(KBUILD_TARGET_ARCH)))
7154
7155#
7156# Ring-3 testcase.
7157# This is the VBoxR3Exe template only with a different install dir.
7158#
7159TEMPLATE_VBoxR3TstExe = VBox Ring 3 Testcase Exe
7160TEMPLATE_VBoxR3TstExe_EXTENDS = VBoxR3Exe
7161TEMPLATE_VBoxR3TstExe_LATE_LIBS = $(LIB_RUNTIME) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7162TEMPLATE_VBoxR3TstExe_INST = $(INST_TESTCASE)
7163ifdef VBOX_WITH_RUNPATH
7164 TEMPLATE_VBoxR3TstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7165else ifdef VBOX_WITH_RELATIVE_RUNPATH
7166 TEMPLATE_VBoxR3TstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7167endif
7168if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
7169 TEMPLATE_VBoxR3TstExe_POST_CMDS =
7170 TEMPLATE_VBoxR3TstExe_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBoxR3Exe_LDFLAGS))
7171endif
7172if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
7173 TEMPLATE_VBoxR3TstExe_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out))
7174 TEMPLATE_VBoxR3TstExe_LATE_LIBS.x86 = \
7175 $(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB) \
7176 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
7177endif
7178
7179# x86 version of VBoxR3TstExe
7180TEMPLATE_VBoxR3TstExe-x86 := 32-bit VBox Ring 3 Testcase Exe
7181TEMPLATE_VBoxR3TstExe-x86_EXTENDS := VBoxR3TstExe
7182TEMPLATE_VBoxR3TstExe-x86_BLD_TRG_ARCH := x86
7183TEMPLATE_VBoxR3TstExe-x86_LATE_LIBS = $(LIB_RUNTIME_X86) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7184
7185#
7186# Ring-3 testcase DLL.
7187#
7188TEMPLATE_VBoxR3TstDll = VBox Ring-3 Testcase Dll
7189TEMPLATE_VBoxR3TstDll_EXTENDS = VBoxR3TstExe
7190ifn1of ($(KBUILD_TARGET), darwin win os2)
7191 TEMPLATE_VBoxR3TstDll_DEFS = $(TEMPLATE_VBoxR3TstExe_DEFS) PIC
7192 TEMPLATE_VBoxR3TstDll_CFLAGS = $(TEMPLATE_VBoxR3TstExe_CFLAGS) -fPIC
7193 TEMPLATE_VBoxR3TstDll_CXXFLAGS = $(TEMPLATE_VBoxR3TstExe_CXXFLAGS) -fPIC
7194 TEMPLATE_VBoxR3TstDll_PCHFLAGS = $(TEMPLATE_VBoxR3TstExe_PCHFLAGS) -fPIC
7195 TEMPLATE_VBoxR3TstDll_LDFLAGS = $(TEMPLATE_VBoxR3TstExe_LDFLAGS) -fPIC
7196endif
7197
7198
7199#
7200# Template for building bad C/C++ style R3 shared libraries / Dlls (no -pedantic).
7201# (Same transformation as for VBoxR3ExeNonPedantic.)
7202#
7203TEMPLATE_VBoxR3DllNonPedantic = VBox ring-3 Non-pedantic, with warnings.
7204TEMPLATE_VBoxR3DllNonPedantic_EXTENDS = VBoxR3DllBase
7205ifeq ($(KBUILD_TARGET),win)
7206 TEMPLATE_VBoxR3DllNonPedantic_CFLAGS = $(TEMPLATE_VBoxR3DllBase_CFLAGS) $(VBOX_VCC_NON_PEDANTIC)
7207 TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS) $(VBOX_VCC_NON_PEDANTIC)
7208 TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS) $(VBOX_VCC_NON_PEDANTIC)
7209else # gcc:
7210 TEMPLATE_VBoxR3DllNonPedantic_TOOL = $(VBOX_GCC_TOOL)
7211 TEMPLATE_VBoxR3DllNonPedantic_CFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_C) ,$(TEMPLATE_VBoxR3DllBase_CFLAGS)) \
7212 $(VBOX_GCC_NON_PEDANTIC_C)
7213 TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3DllBase_CXXFLAGS)) \
7214 $(VBOX_GCC_NON_PEDANTIC_CXX)
7215 TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3DllBase_PCHFLAGS)) \
7216 $(VBOX_GCC_NON_PEDANTIC_CXX)
7217endif
7218
7219# x86 edition of the above template for use on AMD64 targets.
7220TEMPLATE_VBoxR3DllNonPedantic-x86 = 32-bit VBox ring-3 SO/DLLs, no warnings
7221TEMPLATE_VBoxR3DllNonPedantic-x86_EXTENDS = VBoxR3DllNonPedantic
7222TEMPLATE_VBoxR3DllNonPedantic-x86_BLD_TRG_ARCH = x86
7223TEMPLATE_VBoxR3DllNonPedantic-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxR3DllNonPedantic_DEFS)) \
7224 HC_ARCH_BITS=32 ARCH_BITS=32
7225
7226
7227#
7228# Same as VBoxR3DllNonPedantic, only it optimizes debug builds.
7229#
7230TEMPLATE_VBoxR3DllNonPedanticFast = VBox ring-3 Non-pedantic, with warnings, optimized debug.
7231TEMPLATE_VBoxR3DllNonPedanticFast_EXTENDS = VBoxR3DllNonPedantic
7232ifeq ($(KBUILD_TYPE),debug)
7233 ifeq ($(KBUILD_TARGET),win)
7234 TEMPLATE_VBoxR3DllNonPedanticFast_CFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS)) -O2 -Oy-
7235 TEMPLATE_VBoxR3DllNonPedanticFast_CFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS.debug))
7236 TEMPLATE_VBoxR3DllNonPedanticFast_CXXFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS)) -O2 -Oy-
7237 TEMPLATE_VBoxR3DllNonPedanticFast_CXXFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS.debug))
7238 TEMPLATE_VBoxR3DllNonPedanticFast_PCHFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS)) -O2 -Oy-
7239 TEMPLATE_VBoxR3DllNonPedanticFast_PCHFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS.debug))
7240 else
7241 TEMPLATE_VBoxR3DllNonPedanticFast_CFLAGS = $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS) -O2 -fno-omit-frame-pointer
7242 TEMPLATE_VBoxR3DllNonPedanticFast_CXXFLAGS = $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS) -O2 -fno-omit-frame-pointer
7243 TEMPLATE_VBoxR3DllNonPedanticFast_PCHFLAGS = $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS) -O2 -fno-omit-frame-pointer
7244 endif
7245endif
7246
7247
7248#
7249# Template for building libraries that are linked into VBoxRT.dll
7250# and it's variations, pedantic variation.
7251#
7252TEMPLATE_VBoxR3RuntimeDll = For libraries that are linked into VBoxRT.
7253TEMPLATE_VBoxR3RuntimeDll_EXTENDS := VBoxR3Dll
7254TEMPLATE_VBoxR3RuntimeDll_DEFS = $(TEMPLATE_VBoxR3Dll_DEFS) IN_RT_R3
7255if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
7256 TEMPLATE_VBoxR3RuntimeDll_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7257 TEMPLATE_VBoxR3RuntimeDll_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7258 TEMPLATE_VBoxR3RuntimeDll_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_PCHFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7259 TEMPLATE_VBoxR3RuntimeDll_LATE_LIBS.x86 = $(filter-out $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/%, $(TEMPLATE_VBoxR3Dll_LATE_LIBS.x86)) \
7260 $(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/oldnames.lib \
7261 $(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
7262 $(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
7263endif
7264
7265#
7266# Template for building libraries that are linked into VBoxRT.dll
7267# and it's variations, non-pedantic variation.
7268#
7269TEMPLATE_VBoxR3RuntimeDllNonPedantic = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings.
7270TEMPLATE_VBoxR3RuntimeDllNonPedantic_EXTENDS := VBoxR3DllNonPedantic
7271TEMPLATE_VBoxR3RuntimeDllNonPedantic_DEFS = $(TEMPLATE_VBoxR3DllNonPedantic_DEFS) IN_RT_R3
7272if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && $(KBUILD_TARGET_ARCH) == "x86"
7273 TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7274 TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7275 TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7276endif
7277
7278#
7279# Template for building libraries that are linked into VBoxRT-x86.dll
7280# and it's variations, non-pedantic variation.
7281#
7282TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86 = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings.
7283TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_EXTENDS := VBoxR3DllNonPedantic-x86
7284TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_BLD_TRG_ARCH := x86
7285TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_DEFS = $(TEMPLATE_VBoxR3DllNonPedantic-x86_DEFS) IN_RT_R3
7286if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && $(KBUILD_TARGET_ARCH) == "x86"
7287 TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic-x86_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7288 TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic-x86_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7289 TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic-x86_PCHFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7290endif
7291
7292#
7293# Same as VBoxR3RuntimeDllNonPedantic, only it optimized debug builds too.
7294#
7295TEMPLATE_VBoxR3RuntimeDllNonPedanticFast = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings, optmized debug.
7296TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_EXTENDS = VBoxR3RuntimeDllNonPedantic
7297ifeq ($(KBUILD_TYPE),debug)
7298 ifeq ($(KBUILD_TARGET),win)
7299 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS)) -O2 -Oy-
7300 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS.debug))
7301 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CXXFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS)) -O2 -Oy-
7302 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CXXFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS.debug))
7303 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_PCHFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS)) -O2 -Oy-
7304 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_PCHFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS.debug))
7305 else
7306 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CFLAGS = $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS) -O2 -fno-omit-frame-pointer
7307 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CXXFLAGS = $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS) -O2 -fno-omit-frame-pointer
7308 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_PCHFLAGS = $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS) -O2 -fno-omit-frame-pointer
7309 endif
7310endif
7311
7312
7313#
7314# Template for building executables that are part of the VBox Main component
7315# (COM/XPCOM interface to VirtualBox).
7316#
7317TEMPLATE_VBoxMainExe = VBox Main Executable
7318
7319$(foreach arch,$(VBOX_TARGET_ARCHES)\
7320,$(eval TEMPLATE_VBoxMainExe_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
7321$(foreach arch,$(VBOX_TARGET_ARCHES)\
7322,$(eval TEMPLATE_VBoxMainExe_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
7323
7324TEMPLATE_VBoxMainExe_DEFS = IN_RING3 UNICODE NDEBUG=1
7325TEMPLATE_VBoxMainExe_DEFS.win = _UNICODE
7326TEMPLATE_VBoxMainExe_RCDEFS = $(TEMPLATE_VBoxR3Exe_RCDEFS)
7327TEMPLATE_VBoxMainExe_LATE_LIBS.kprofile = $(LIB_KPROFILE)
7328TEMPLATE_VBoxMainExe_USES = dtrace
7329if defined(VBOX_WITH_DTRACE_R3_MAIN) && defined(VBOX_WITH_NATIVE_DTRACE)
7330 TEMPLATE_VBoxMainExe_DTRACETOOL = DTraceAndVBoxTpG
7331 TEMPLATE_VBoxMainExe_DTRACE_OBJ_FLAGS = -C
7332 TEMPLATE_VBoxMainExe_DTRACE_HDR_FLAGS = -C
7333 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3 VBOX_WITH_DTRACE_R3_MAIN VBOX_WITH_NATIVE_DTRACE
7334else
7335 TEMPLATE_VBoxMainExe_DTRACE_HDR_FLAGS = --ring-3-context
7336 TEMPLATE_VBoxMainExe_DTRACE_OBJ_FLAGS = --ring-3-context --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
7337 if defined(VBOX_WITH_DTRACE_R3_MAIN)
7338 TEMPLATE_VBoxMainExe_DTRACETOOL = VBoxTpG
7339 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3 VBOX_WITH_DTRACE_R3_MAIN
7340 else
7341 TEMPLATE_VBoxMainExe_DTRACETOOL = VBoxTpG-Disabled
7342 endif
7343endif
7344
7345ifeq ($(KBUILD_TARGET),win)
7346 #TEMPLATE_VBoxMainExe_TOOL = $(VBOX_VCC_TOOL)
7347 TEMPLATE_VBoxMainExe_TOOL.win.x86 = $(VBOX_VCC_TOOL_STEM)X86
7348 TEMPLATE_VBoxMainExe_TOOL.win.amd64 = $(VBOX_VCC_TOOL_STEM)AMD64
7349 TEMPLATE_VBoxMainExe_TOOL.win.arm64 = $(VBOX_VCC_TOOL_STEM)ARM64
7350 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
7351 TEMPLATE_VBoxMainExe_SDKS = ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER) $(VBOX_WINPSDK) $(VBOX_WINDDK)
7352 else
7353 TEMPLATE_VBoxMainExe_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK)
7354 endif
7355 TEMPLATE_VBoxMainExe_CXXFLAGS = -Zi -Zl -GR -EHsc -GF -MD$(VBOX_VCC_CRT_TYPE) $(VBOX_VCC_WCHAR_T_VARIANT) \
7356 $(VBOX_VCC_OPT) $(VBOX_VCC_FP) $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS) $(VBOX_VCC_std)
7357 # -wd4625: 'DisplaySourceBitmap' : copy constructor could not be generated because a base class copy constructor is inaccessible
7358 # -wd4626: 'DisplaySourceBitmap' : assignment operator could not be generated because a base class assignment operator is inaccessible
7359 # The two above can be cured by adding private: DECLARE_CLS_COPY_CTOR_ASSIGN_NOOP(xxxx); but too much work.
7360 # -wd4355: 'this' : used in base member initializer list (e.g. VirtualBoxBase.cpp)
7361 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_VCC_WARN_ALL) -wd4625 -wd4626 -wd4355 $(VBOX_VCC_WERR)
7362 TEMPLATE_VBoxMainExe_CXXFLAGS += -Gy
7363 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
7364 TEMPLATE_VBoxMainExe_CXXFLAGS += -Gw
7365 endif
7366 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
7367 TEMPLATE_VBoxMainExe_CXXFLAGS += -Zc:inline
7368 endif
7369 ifdef VBOX_WITH_MSC_ANALYZE_THIS
7370 TEMPLATE_VBoxMainExe_CXXFLAGS += /analyze
7371 endif
7372 TEMPLATE_VBoxMainExe_CXXFLAGS.debug = -RTCsu
7373 TEMPLATE_VBoxMainExe_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
7374 TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile = -Gh -GH
7375 TEMPLATE_VBoxMainExe_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxMainExe_CXXFLAGS))
7376 TEMPLATE_VBoxMainExe_CFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7377 TEMPLATE_VBoxMainExe_CFLAGS.dbgopt = $(TEMPLATE_VBoxMainExe_CXXFLAGS.dbgopt)
7378 TEMPLATE_VBoxMainExe_CFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7379 TEMPLATE_VBoxMainExe_PCHFLAGS = $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7380 TEMPLATE_VBoxMainExe_PCHFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7381 TEMPLATE_VBoxMainExe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxMainExe_CXXFLAGS.dbgopt)
7382 TEMPLATE_VBoxMainExe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7383 TEMPLATE_VBoxMainExe_LDFLAGS = -Ignore:4197 \
7384 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
7385 $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS) \
7386 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
7387 /STUB:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com \
7388 /DISALLOWLIB:libc.lib \
7389 /DISALLOWLIB:libcd.lib \
7390 /DISALLOWLIB:libcmt.lib \
7391 /DISALLOWLIB:libcmtd.lib \
7392 /DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE_N).lib \
7393 /DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE_N).lib \
7394 /DISALLOWLIB:vcruntime$(VBOX_VCC_CRT_TYPE_N).lib \
7395 /DISALLOWLIB:ucrt$(VBOX_VCC_CRT_TYPE_N).lib \
7396 /DISALLOWLIB:libvcruntime.lib \
7397 /DISALLOWLIB:libvcruntimed.lib \
7398 /DISALLOWLIB:libucrt.lib \
7399 /DISALLOWLIB:libucrtd.lib
7400 if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
7401 TEMPLATE_VBoxMainExe_LDFLAGS += -IntegrityCheck
7402 endif
7403 ifdef VBOX_WITH_DTRACE_R3_MAIN
7404 TEMPLATE_VBoxMainExe_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
7405 endif
7406 TEMPLATE_VBoxMainExe_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
7407 TEMPLATE_VBoxMainExe_LATE_LIBS = \
7408 $(LIB_RUNTIME)
7409 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
7410 TEMPLATE_VBoxMainExe_LATE_LIBS.x86 = \
7411 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7412 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7413 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7414 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/oldnames.lib
7415 TEMPLATE_VBoxMainExe_LATE_LIBS.amd64 = \
7416 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7417 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7418 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7419 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/oldnames.lib
7420 TEMPLATE_VBoxMainExe_LATE_LIBS.arm64 = \
7421 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7422 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7423 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7424 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/oldnames.lib
7425 ifeq ($(KBUILD_TYPE),asan)
7426 TEMPLATE_VBoxMainExe_LATE_LIBS.x86 += \
7427 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic-i386.lib \
7428 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic_runtime_thunk-i386.lib
7429 TEMPLATE_VBoxMainExe_LATE_LIBS.amd64 += \
7430 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic-x86_64.lib \
7431 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib
7432 endif
7433 else
7434 TEMPLATE_VBoxMainExe_LATE_LIBS.x86 = \
7435 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7436 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7437 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/oldnames.lib
7438 TEMPLATE_VBoxMainExe_LATE_LIBS.amd64 = \
7439 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7440 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7441 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/oldnames.lib
7442 endif
7443 TEMPLATE_VBoxMainExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
7444 TEMPLATE_VBoxMainExe_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
7445
7446else # the GCC guys:
7447
7448 TEMPLATE_VBoxMainExe_TOOL = $(VBOX_GCC_TOOL)
7449 if $(VBOX_GCC_VERSION_CC) < 30400
7450 TEMPLATE_VBoxMainExe_DEFS += RT_WITHOUT_PRAGMA_ONCE
7451 endif
7452 TEMPLATE_VBoxMainExe_CXXFLAGS = -g $(VBOX_GCC_pipe) \
7453 $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_Wno-multistatement-macros) $(VBOX_GCC_Wno-class-memaccess) -Wshadow \
7454 -fshort-wchar -fpermissive -fexceptions -frtti $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing \
7455 $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_std) $(VBOX_GCC_IPRT_FMT_CHECK) \
7456 $(VBOX_GCC_SANITIZER_FLAGS)
7457 if !defined("VBOX_GCC_Wno-delete-non-virtual-dtor") && defined("VBOX_GCC_Wno-non-virtual-dtor")
7458 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_GCC_Wno-non-virtual-dtor)
7459 endif
7460 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
7461 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_GCC_WERR)
7462 endif
7463 ifdef VBOX_WITH_DTRACE_R3_MAIN
7464 TEMPLATE_VBoxMainExe_CXXFLAGS := $(filter-out -pedantic,$(TEMPLATE_VBoxMainExe_CXXFLAGS)) -fdollars-in-identifiers # annoying gcc option precedence.
7465 endif
7466 TEMPLATE_VBoxMainExe_CXXFLAGS.x86 = -m32
7467 TEMPLATE_VBoxMainExe_CXXFLAGS.amd64 = -m64
7468 TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile = -finstrument-functions
7469 TEMPLATE_VBoxMainExe_CFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros) \
7470 $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_IPRT_FMT_CHECK) \
7471 $(VBOX_GCC_SANITIZER_FLAGS)
7472 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
7473 TEMPLATE_VBoxMainExe_CFLAGS += $(VBOX_GCC_WERR)
7474 endif
7475 TEMPLATE_VBoxMainExe_CFLAGS.x86 = -m32
7476 TEMPLATE_VBoxMainExe_CFLAGS.amd64 = -m64
7477 TEMPLATE_VBoxMainExe_CFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7478 TEMPLATE_VBoxMainExe_CFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7479 TEMPLATE_VBoxMainExe_OBJCFLAGS = $(TEMPLATE_VBoxMainExe_CFLAGS)
7480 TEMPLATE_VBoxMainExe_OBJCFLAGS.x86 = $(TEMPLATE_VBoxMainExe_CFLAGS.x86)
7481 TEMPLATE_VBoxMainExe_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxMainExe_CFLAGS.amd64)
7482 TEMPLATE_VBoxMainExe_OBJCFLAGS.debug = $(TEMPLATE_VBoxMainExe_CFLAGS.debug)
7483 TEMPLATE_VBoxMainExe_OBJCFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CFLAGS.kprofile)
7484 TEMPLATE_VBoxMainExe_OBJCXXFLAGS = $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7485 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.x86)
7486 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.amd64)
7487 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7488 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7489 TEMPLATE_VBoxMainExe_PCHFLAGS = $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7490 TEMPLATE_VBoxMainExe_PCHFLAGS.x86 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.x86)
7491 TEMPLATE_VBoxMainExe_PCHFLAGS.amd64 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.amd64)
7492 TEMPLATE_VBoxMainExe_PCHFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7493 TEMPLATE_VBoxMainExe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7494 TEMPLATE_VBoxMainExe_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
7495 TEMPLATE_VBoxMainExe_LDFLAGS.x86 = -m32
7496 TEMPLATE_VBoxMainExe_LDFLAGS.amd64 = -m64
7497 ifeq ($(KBUILD_TARGET),linux)
7498 TEMPLATE_VBoxMainExe_LATE_LIBS = pthread m rt $(LIB_RUNTIME) dl
7499 TEMPLATE_VBoxMainExe_LDFLAGS.linux = -Wl,-z,noexecstack,-z,relro $(VBOX_LD_as_needed)
7500 else ifeq ($(KBUILD_TARGET),os2)
7501 TEMPLATE_VBoxMainExe_TOOL = GXX3OMF
7502 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7503 else ifeq ($(KBUILD_TARGET),darwin)
7504 TEMPLATE_VBoxMainExe_TOOL = $(VBOX_GCC_TOOL)
7505 TEMPLATE_VBoxMainExe_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
7506 TEMPLATE_VBoxMainExe_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
7507 TEMPLATE_VBoxMainExe_CFLAGS += $(VBOX_DARWIN_DEF_SDK_CFLAGS)
7508 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
7509 TEMPLATE_VBoxMainExe_OBJCFLAGS += $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
7510 TEMPLATE_VBoxMainExe_OBJCXXFLAGS += $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS)
7511 TEMPLATE_VBoxMainExe_LDFLAGS.darwin += -bind_at_load
7512 TEMPLATE_VBoxMainExe_LDFLAGS += $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -framework Carbon -Wl,-headerpad_max_install_names
7513 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7514 TEMPLATE_VBoxMainExe_POST_CMDS.darwin = $(VBOX_SIGN_IMAGE_CMDS)
7515 else ifeq ($(KBUILD_TARGET),haiku)
7516 TEMPLATE_VBoxMainExe_TOOL = GXX3
7517 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME) network stdc++ supc++
7518 else if1of ($(KBUILD_TARGET), freebsd openbsd)
7519 TEMPLATE_VBoxMainExe_TOOL = GXX3
7520 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7521 TEMPLATE_VBoxMainExe_INCS += \
7522 /usr/include \
7523 /usr/X11R6/include \
7524 /usr/local/include
7525 TEMPLATE_VBoxMainExe_LIBPATH += \
7526 /usr/lib \
7527 /usr/X11R6/lib \
7528 /usr/local/lib
7529 else ifeq ($(KBUILD_TARGET),netbsd)
7530 TEMPLATE_VBoxMainExe_TOOL = GXX3
7531 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7532 TEMPLATE_VBoxMainExe_INCS += \
7533 /usr/include \
7534 /usr/X11R7/include
7535 TEMPLATE_VBoxMainExe_LIBPATH += \
7536 /usr/lib \
7537 /usr/X11R7/lib
7538 else ifeq ($(KBUILD_TARGET),solaris)
7539 TEMPLATE_VBoxMainExe_TOOL = GXX3PLAIN
7540 TEMPLATE_VBoxMainExe_DEFS += _REENTRANT
7541 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME) rt thread
7542 else
7543 $(warning Warning: VBox Build: Target $(KBUILD_TARGET) is not officially supported and may need TEMPLATE_VBoxMainExe tweaking!)
7544 TEMPLATE_VBoxMainExe_LATE_LIBS =
7545 endif
7546 TEMPLATE_VBoxMainExe_LDFLAGS.solaris = -Wl,-z,ignore # Same as VBOX_LD_as_needed.
7547 ifdef VBOX_WITH_RUNPATH
7548 TEMPLATE_VBoxMainExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
7549 else ifdef VBOX_WITH_RELATIVE_RUNPATH
7550 TEMPLATE_VBoxMainExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
7551 endif
7552 ifdef VBOX_WITH_ORIGIN
7553 TEMPLATE_VBoxMainExe_LDFLAGS.linux += $(VBOX_GCC_ORIGIN_OPT)
7554 endif
7555
7556endif # !win
7557
7558# Add COM/XPCOM stuff
7559TEMPLATE_VBoxMainExe_LATE_LIBS += \
7560 $(PATH_STAGE_LIB)/VBoxCOM$(VBOX_SUFF_LIB)
7561ifdef VBOX_WITH_XPCOM
7562 ## @todo may be worth creating the VBOX_XPCOM SDK def
7563 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_XPCOM
7564 ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
7565 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
7566 endif
7567 TEMPLATE_VBoxMainExe_INCS += \
7568 $(VBOX_XPCOM_INCS)
7569 TEMPLATE_VBoxMainExe_LATE_LIBS += \
7570 $(LIB_XPCOM)
7571 TEMPLATE_VBoxMainExe_INTERMEDIATES += \
7572 $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
7573
7574else # COM
7575 TEMPLATE_VBoxMainExe_INCS += \
7576 $(VBOX_PATH_SDK)/bindings/mscom/include
7577 TEMPLATE_VBoxMainExe_INTERMEDIATES += \
7578 $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
7579endif # COM
7580
7581#
7582# Template for building the Main DLL modules (such as in-process COM/XPCOM
7583# components for Main).
7584#
7585# This differs from VBoxMainExe only in PIC handling and similar DLL stuff.
7586#
7587TEMPLATE_VBoxMainDll = VBox Main Component (shared library)
7588TEMPLATE_VBoxMainDll_EXTENDS = VBoxMainExe
7589ifn1of ($(KBUILD_TARGET), darwin haiku os2 win)
7590 TEMPLATE_VBoxMainDll_DEFS = PIC $(TEMPLATE_VBoxMainExe_DEFS)
7591 TEMPLATE_VBoxMainDll_CFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CFLAGS)
7592 TEMPLATE_VBoxMainDll_CXXFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7593 TEMPLATE_VBoxMainDll_PCHFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_PCHFLAGS)
7594 TEMPLATE_VBoxMainDll_LDFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_LDFLAGS)
7595endif
7596TEMPLATE_VBoxMainDll_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBoxMainExe_LDFLAGS.darwin)) \
7597 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
7598 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
7599
7600#
7601# Template identical to VBoxMainDll except for where the stuff is
7602# installed when using XPCOM (components/).
7603#
7604# Note! In the hardened build this gets a bit ugly since $ORIGIN/..
7605# doesn't work. So, we keep the $ORIGIN from VBoxMainExe and let
7606# the installers do the necessary .so symlinking.
7607#
7608# (No difference when building against COM on Windows.)
7609#
7610TEMPLATE_VBoxMainComp = VBox Main COM/XPCOM Component (shared library)
7611TEMPLATE_VBoxMainComp_EXTENDS = VBoxMainExe
7612ifn1of ($(KBUILD_TARGET), win)
7613 TEMPLATE_VBoxMainComp_INST = $(INST_BIN)components/
7614endif
7615ifneq ($(KBUILD_TARGET),win)
7616 ifeq ($(filter-out linux.arm64 solaris.x86 %.amd64 %.sparc32 %.sparc64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),) ## TODO: cleanup!
7617 TEMPLATE_VBoxMainComp_DEFS = PIC $(TEMPLATE_VBoxMainExe_DEFS)
7618 TEMPLATE_VBoxMainComp_CFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CFLAGS)
7619 TEMPLATE_VBoxMainComp_CXXFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7620 TEMPLATE_VBoxMainComp_PCHFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_PCHFLAGS)
7621 if defined(VBOX_WITH_RELATIVE_RUNPATH) && !defined(VBOX_WITH_HARDENING)
7622 TEMPLATE_VBoxMainComp_LDFLAGS = -fPIC $(filter-out '$(VBOX_GCC_RPATH_OPT)%',$(TEMPLATE_VBoxMainExe_LDFLAGS)) '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..'
7623 else
7624 TEMPLATE_VBoxMainComp_LDFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_LDFLAGS)
7625 endif
7626 else ifndef VBOX_WITH_HARDENING
7627 ifdef VBOX_WITH_RELATIVE_RUNPATH
7628 TEMPLATE_VBoxMainComp_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%',$(TEMPLATE_VBoxMainExe_LDFLAGS)) '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..'
7629 endif
7630 endif
7631endif
7632TEMPLATE_VBoxMainComp_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBoxMainExe_LDFLAGS.darwin)) \
7633 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
7634 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
7635
7636# x86 version of VBoxMainComp
7637TEMPLATE_VBoxMainComp-x86 = 32-bit VBox Main Component (shared library)
7638TEMPLATE_VBoxMainComp-x86_EXTENDS = VBoxMainComp
7639TEMPLATE_VBoxMainComp-x86_BLD_TRG_ARCH = x86
7640TEMPLATE_VBoxMainComp-x86_INST.win = $(INST_DLL)x86/
7641TEMPLATE_VBoxMainComp-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxMainComp_DEFS)) HC_ARCH_BIT=32 ARCH_BITS=32 \
7642 VBOX_IN_32_ON_64_MAIN_API
7643TEMPLATE_VBoxMainComp-x86_LATE_LIBS = \
7644 $(subst $(PATH_STAGE_LIB)/VBoxCOM$(VBOX_SUFF_LIB),$(PATH_STAGE_LIB)/VBoxCOM-x86$(VBOX_SUFF_LIB), \
7645 $(subst $(LIB_RUNTIME),$(VBOX_LIB_RUNTIME_X86), \
7646 $(subst $(LIB_XPCOM),$(VBOX_LIB_XPCOM_X86), \
7647 $(TEMPLATE_VBoxMainComp_LATE_LIBS))))
7648
7649
7650#
7651# Template for building the Main static libraries.
7652#
7653# This differs from VBoxMainDll only that it zeroes out the _LATE_LIBS definition.
7654#
7655TEMPLATE_VBoxMainLib = VBox Main Component (static library)
7656TEMPLATE_VBoxMainLib_EXTENDS = VBoxMainDll
7657TEMPLATE_VBoxMainLib_LATE_LIBS = $(NO_SUCH_VARIABLE)
7658
7659TEMPLATE_VBoxMainLib-x86 = 32-bit VBox Main Component (static library)
7660TEMPLATE_VBoxMainLib-x86_EXTENDS = VBoxMainLib
7661TEMPLATE_VBoxMainLib-x86_BLD_TRG_ARCH = x86
7662TEMPLATE_VBoxMainLib-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxMainLib_DEFS)) HC_ARCH_BIT=32 ARCH_BITS=32 \
7663 VBOX_IN_32_ON_64_MAIN_API
7664
7665#
7666# Main unit testing, for compiling API implementation files into a testcase.
7667# This is the VBoxMainExe template only with a different install dir.
7668#
7669TEMPLATE_VBoxMainTstExe = VBox Main Testcase Exe
7670TEMPLATE_VBoxMainTstExe_EXTENDS = VBoxMainExe
7671TEMPLATE_VBoxMainTstExe_INST = $(INST_TESTCASE)
7672ifdef VBOX_WITH_RUNPATH
7673 TEMPLATE_VBoxMainTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxMainExe_LDFLAGS)
7674else ifdef VBOX_WITH_RELATIVE_RUNPATH
7675 TEMPLATE_VBoxMainTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxMainExe_LDFLAGS)
7676endif
7677if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
7678 TEMPLATE_VBoxMainTstExe_POST_CMDS =
7679endif
7680
7681#
7682# Template for building executables that use the VBox Main component.
7683#
7684TEMPLATE_VBoxMainClientExe = VBox Main Client (executable)
7685TEMPLATE_VBoxMainClientExe_EXTENDS = VBoxMainExe
7686ifeq ($(KBUILD_TARGET),win)
7687 TEMPLATE_VBoxMainClientExe_DEPS = $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
7688 TEMPLATE_VBoxMainClientExe_LATE_LIBS.win = $(TEMPLATE_VBoxMainExe_LATE_LIBS.win) \
7689 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/User32.Lib \
7690 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/Shell32.Lib \
7691 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/ShLwApi.Lib \
7692 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/Ole32.Lib \
7693 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/OleAut32.Lib \
7694 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/Uuid.Lib
7695else
7696 TEMPLATE_VBoxMainClientExe_DEPS = $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
7697 TEMPLATE_VBoxMainClientExe_DEFS = $(TEMPLATE_VBoxMainExe_DEFS) \
7698 NDEBUG TRIMMED
7699 TEMPLATE_VBoxMainClientExe_CXXFLAGS.linux = $(TEMPLATE_VBoxMainExe_CXXFLAGS.linux) -pthread
7700 TEMPLATE_VBoxMainClientExe_PCHFLAGS.linux = $(TEMPLATE_VBoxMainExe_PCHFLAGS.linux) -pthread
7701endif
7702
7703#
7704# Template for building shared libraries / DLLs that use the VBox Main component.
7705#
7706# This differs from VBoxMainClientExe only in PIC handling and similar DLL stuff.
7707#
7708TEMPLATE_VBoxMainClientDll = VBox MAIN Client (shared library)
7709TEMPLATE_VBoxMainClientDll_EXTENDS = VBoxMainClientExe
7710ifn1of ($(KBUILD_TARGET), darwin os2 win)
7711 TEMPLATE_VBoxMainClientDll_DEFS = PIC $(TEMPLATE_VBoxMainClientExe_DEFS)
7712 TEMPLATE_VBoxMainClientDll_CFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_CFLAGS)
7713 TEMPLATE_VBoxMainClientDll_CXXFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_CXXFLAGS)
7714 TEMPLATE_VBoxMainClientDll_PCHFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_PCHFLAGS)
7715 TEMPLATE_VBoxMainClientDll_LDFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_LDFLAGS)
7716endif
7717TEMPLATE_VBoxMainClientDll_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBoxMainClientExe_LDFLAGS.darwin))
7718
7719# x86 version of VBoxMainClientDll
7720TEMPLATE_VBoxMainClientDll-x86 := 32-bit VBox MAIN Client (shared library)
7721TEMPLATE_VBoxMainClientDll-x86_EXTENDS := VBoxMainClientDll
7722TEMPLATE_VBoxMainClientDll-x86_BLD_TRG_ARCH := x86
7723TEMPLATE_VBoxMainClientDll-x86_INST.win = $(INST_DLL)x86/
7724TEMPLATE_VBoxMainClientDll-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxMainClientDll_DEFS)) \
7725 HC_ARCH_BIT=32 ARCH_BITS=32 VBOX_IN_32_ON_64_MAIN_API
7726TEMPLATE_VBoxMainClientDll-x86_LATE_LIBS = \
7727 $(subst $(PATH_STAGE_LIB)/VBoxCOM$(VBOX_SUFF_LIB),$(PATH_STAGE_LIB)/VBoxCOM-x86$(VBOX_SUFF_LIB), \
7728 $(subst $(LIB_RUNTIME),$(VBOX_LIB_RUNTIME_X86), \
7729 $(subst $(LIB_XPCOM),$(VBOX_LIB_XPCOM_X86), \
7730 $(TEMPLATE_VBoxMainClientDll_LATE_LIBS))))
7731
7732#
7733# Template for building testcases which are API clients.
7734#
7735TEMPLATE_VBoxMainClientTstExe = VBox Main Client Testcase (executable)
7736TEMPLATE_VBoxMainClientTstExe_EXTENDS = VBoxMainClientExe
7737TEMPLATE_VBoxMainClientTstExe_INST = $(INST_TESTCASE)
7738ifdef VBOX_WITH_RUNPATH
7739 TEMPLATE_VBoxMainClientTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxMainClientExe_LDFLAGS)
7740else ifdef VBOX_WITH_RELATIVE_RUNPATH
7741 TEMPLATE_VBoxMainClientTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxMainClientExe_LDFLAGS)
7742endif
7743if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
7744 TEMPLATE_VBoxMainClientTstExe_POST_CMDS =
7745endif
7746
7747
7748
7749#
7750# Templates used for building the extension packs.
7751#
7752ifdef VBOX_WITH_EXTPACK
7753 # Base templates (native or portable).
7754 TEMPLATE_VBoxR3ExtPack = For the ring-3 context extension pack modules.
7755 if 1 # Native for now.
7756 TEMPLATE_VBoxR3ExtPack_EXTENDS = VBoxR3Dll
7757 TEMPLATE_VBoxR3ExtPack_DEFS = $(TEMPLATE_VBoxR3Dll_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3
7758 else
7759 TEMPLATE_VBoxR3ExtPack_EXTENDS = VBoxNoCrtGccLib
7760 TEMPLATE_VBoxR3ExtPack_DEFS = $(TEMPLATE_VBoxNoCrtGccLib_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3 IPRT_NO_CRT IN_RING3
7761 TEMPLATE_VBoxR3ExtPack_INCS = $(PATH_ROOT)/include/iprt/nocrt $(TEMPLATE_VBoxR3Dll_INCS)
7762 endif
7763 ifneq ($(KBUILD_TARGET),win)
7764 TEMPLATE_VBoxR3ExtPack_CXXFLAGS = $(TEMPLATE_VBoxR3Dll_CXXFLAGS) -fno-rtti
7765 TEMPLATE_VBoxR3ExtPack_PCHFLAGS = $(TEMPLATE_VBoxR3Dll_PCHFLAGS) -fno-rtti
7766 endif
7767 TEMPLATE_VBoxR3ExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7768 ifeq ($(KBUILD_TARGET),linux)
7769 TEMPLATE_VBoxR3ExtPack_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxR3Dll_LDFLAGS))
7770 else if !defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_RELATIVE_RUNPATH)
7771 TEMPLATE_VBoxR3ExtPack_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/../../..' $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxR3Dll_LDFLAGS))
7772 endif
7773 ifdef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
7774 if1of ($(KBUILD_TARGET), win os2)
7775 TEMPLATE_VBoxR3ExtPack_LATE_LIBS = \
7776 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_LIB)
7777 else
7778 TEMPLATE_VBoxR3ExtPack_LATE_LIBS = \
7779 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_DLL)
7780 endif
7781 else
7782 TEMPLATE_VBoxR3ExtPack_LATE_LIBS = \
7783 $(LIB_RUNTIME)
7784 endif
7785 ifeq ($(KBUILD_TARGET),darwin)
7786 TEMPLATE_VBoxR3ExtPack_POST_CMDS = $(VBOX_SIGN_EXTPACK_DYLIB_CMDS)
7787 endif
7788
7789 TEMPLATE_VBoxR3ExtPackApi = For the ring-3 context extension pack modules using the Main API.
7790 TEMPLATE_VBoxR3ExtPackApi_EXTENDS = VBoxMainDll
7791 TEMPLATE_VBoxR3ExtPackApi_DEFS = $(TEMPLATE_VBoxMainDll_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3
7792 TEMPLATE_VBoxR3ExtPackApi_INST = $(INST_EXTPACK)YouShallOverrideThis/
7793 ifeq ($(KBUILD_TARGET),linux)
7794 TEMPLATE_VBoxR3ExtPackApi_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxMainDll_LDFLAGS))
7795 else if !defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_RELATIVE_RUNPATH)
7796 TEMPLATE_VBoxR3ExtPackApi_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/../../..' $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxMainDll_LDFLAGS))
7797 endif
7798 ifdef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
7799 if1of ($(KBUILD_TARGET), win os2)
7800 TEMPLATE_VBoxR3ExtPackApi_LATE_LIBS = \
7801 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_LIB)
7802 else
7803 TEMPLATE_VBoxR3ExtPackApi_LATE_LIBS = \
7804 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_DLL)
7805 endif
7806 else
7807 TEMPLATE_VBoxR3ExtPackApi_LATE_LIBS = \
7808 $(LIB_RUNTIME)
7809 endif
7810 ifeq ($(KBUILD_TARGET),darwin)
7811 TEMPLATE_VBoxR3ExtPackApi_POST_CMDS = $(VBOX_SIGN_EXTPACK_DYLIB_CMDS)
7812 endif
7813
7814 TEMPLATE_VBoxR0ExtPack = For the ring-0 context extension pack modules.
7815 TEMPLATE_VBoxR0ExtPack_EXTENDS = VBoxR0
7816 TEMPLATE_VBoxR0ExtPack_EXTENDS_BY = appending
7817 TEMPLATE_VBoxR0ExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7818 TEMPLATE_VBoxR0ExtPack_DEFS = VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R0
7819 if1of ($(VBOX_LDR_FMT), pe lx)
7820 TEMPLATE_VBoxR0ExtPack_LATE_LIBS = \
7821 $(PATH_STAGE_LIB)/VMMR0Imp$(VBOX_SUFF_LIB)
7822 endif
7823 TEMPLATE_VBoxR0ExtPack_LATE_LIBS += \
7824 $(VBOX_LIB_SUPR0)
7825
7826 TEMPLATE_VBoxRcExtPack = For the raw-mode context extension pack modules.
7827 TEMPLATE_VBoxRcExtPack_EXTENDS = VBoxRc
7828 TEMPLATE_VBoxRcExtPack_EXTENDS_BY = appending
7829 TEMPLATE_VBoxRcExtPack_SYSSUFF = .rc
7830 TEMPLATE_VBoxRcExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7831 TEMPLATE_VBoxRcExtPack_DEFS = VBOX_IN_EXTPACK VBOX_IN_EXTPACK_RC
7832 if1of ($(VBOX_LDR_FMT32), pe lx)
7833 TEMPLATE_VBoxRcExtPack_LATE_LIBS = \
7834 $(PATH_STAGE_LIB)/VMMRCBuiltin$(VBOX_SUFF_LIB) \
7835 $(PATH_STAGE_LIB)/VMMRCImp$(VBOX_SUFF_LIB)
7836 endif
7837
7838 TEMPLATE_VBoxInsExtPack = For the install targets of an extension pack.
7839 TEMPLATE_VBoxInsExtPack_MODE = 0644
7840 TEMPLATE_VBoxInsExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7841
7842 # For each individual extension pack
7843 ifdef VBOX_WITH_EXTPACK_PUEL
7844 TEMPLATE_VBoxR3ExtPackPuel = For the ring-3 context modules in the PUEL extension pack.
7845 TEMPLATE_VBoxR3ExtPackPuel_EXTENDS = VBoxR3ExtPack
7846 TEMPLATE_VBoxR3ExtPackPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7847 TEMPLATE_VBoxR3ExtPackPuel_DEFS = $(TEMPLATE_VBoxR3ExtPack_DEFS) VBOX_IN_PUEL_EXTPACK
7848 TEMPLATE_VBoxR3ExtPackPuel_LD_DEBUG = split
7849
7850 TEMPLATE_VBoxR3ExtPackApiPuel = For the ring-3 context modules in the PUEL extension pack.
7851 TEMPLATE_VBoxR3ExtPackApiPuel_EXTENDS = VBoxR3ExtPackApi
7852 TEMPLATE_VBoxR3ExtPackApiPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7853 TEMPLATE_VBoxR3ExtPackApiPuel_DEFS = $(TEMPLATE_VBoxR3ExtPackApi_DEFS) VBOX_IN_PUEL_EXTPACK
7854 TEMPLATE_VBoxR3ExtPackApiPuel_LD_DEBUG = split
7855
7856 TEMPLATE_VBoxR3ExtPackPuelWithOpenSsl = For the ring-3 context modules in the PUEL extension pack using ExtPack OpenSSL.
7857 TEMPLATE_VBoxR3ExtPackPuelWithOpenSsl_EXTENDS = VBoxR3ExtPackPuel
7858
7859 TEMPLATE_VBoxR0ExtPackPuel = For the ring-0 context modules in the PUEL extension pack.
7860 TEMPLATE_VBoxR0ExtPackPuel_EXTENDS = VBoxR0ExtPack
7861 TEMPLATE_VBoxR0ExtPackPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7862 TEMPLATE_VBoxR0ExtPackPuel_DEFS = $(TEMPLATE_VBoxR0ExtPack_DEFS) VBOX_IN_PUEL_EXTPACK
7863
7864 TEMPLATE_VBoxRcExtPackPuel = For the raw-mode context modules in the PUEL extension pack.
7865 TEMPLATE_VBoxRcExtPackPuel_EXTENDS = VBoxRcExtPack
7866 TEMPLATE_VBoxRcExtPackPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7867 TEMPLATE_VBoxRcExtPackPuel_DEFS = $(TEMPLATE_VBoxRcExtPack_DEFS) VBOX_IN_PUEL_EXTPACK
7868
7869 TEMPLATE_VBoxInsExtPackPuel = For the install targets of an extension pack.
7870 TEMPLATE_VBoxInsExtPackPuel_EXTENDS = VBoxR0ExtPack
7871 TEMPLATE_VBoxInsExtPackPuel_INST = $(INST_EXTPACK_PUEL)
7872 endif
7873
7874endif # VBOX_WITH_EXTPACK
7875
7876
7877#
7878# Qt
7879# Qt
7880# Qt
7881#
7882if defined(VBOX_WITH_QTGUI) || defined(VBOX_WITH_NLS)
7883
7884 # Guess VBOX_WITH_ORACLE_QT
7885 ifndef VBOX_WITH_ORACLE_QT
7886 ifndef VBOX_OSE
7887 if1of ($(KBUILD_TARGET), darwin solaris win)
7888 VBOX_WITH_ORACLE_QT := 1
7889 endif
7890 endif
7891 endif
7892
7893 #
7894 # Handmade configuration of Qt - very annoying, this needs to
7895 # be cleaned up properly later some time (not important now).
7896 #
7897 # When using a debug QT build set VBOX_QT_DBG:=d in LocalConfig.kmk.
7898 #
7899 ifeq ($(VBOX_PATH_QT),)
7900 ifeq ($(KBUILD_TARGET),darwin)
7901 VBOX_PATH_QT := $(lastword $(sort $(wildcard $(KBUILD_DEVTOOLS_TRG)/qt/v6*)))
7902 ifeq ($(VBOX_PATH_QT),)
7903 ifneq ($(wildcard /Library/Frameworks/QtCore.framework),)
7904 # Using the global installation (for OSE).
7905 VBOX_PATH_QT ?= /usr
7906 VBOX_PATH_QT_FRAMEWORKS ?= /Library/Frameworks
7907 endif
7908 endif
7909 else if1of ($(KBUILD_TARGET), win)
7910 VBOX_PATH_QT := $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_TRG)/qt/v6*))
7911 VBOX_PATH_QT := $(firstfile $(qfilter ,%-$(tolower $(VBOX_VCC_TOOL_STEM)),$(VBOX_PATH_QT)) \
7912 $(qfilter-out ,%-vcc100 %-vcc110 %-vcc120 %-vcc140 %-vcc141 %-vcc142 %-vcc143 %-vcc150, $(VBOX_PATH_QT)))
7913 ifdef VBOX_PATH_QT
7914 PATH_SDK_QT6 := $(VBOX_PATH_QT)
7915 PATH_TOOL_QT6 := $(VBOX_PATH_QT)
7916 ifneq ($(KBUILD_HOST_ARCH),$(KBUILD_TARGET_ARCH))
7917 PATH_TOOL_QT6 := $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST)/qt/v6*))
7918 PATH_TOOL_QT6 := $(firstfile $(qfilter ,%-$(tolower $(VBOX_VCC_TOOL_STEM)),$(PATH_TOOL_QT6)) \
7919 $(qfilter-out ,%-vcc100 %-vcc110 %-vcc120 %-vcc140 %-vcc141 %-vcc142 %-vcc143 %-vcc150, $(PATH_TOOL_QT6)))
7920 ifndef VBOX_PATH_QT
7921 PATH_SDK_QT6 := $(VBOX_PATH_QT)
7922 endif
7923 endif
7924 endif
7925 else if1of ($(KBUILD_TARGET), linux solaris)
7926 VBOX_PATH_QT ?= $(firstfile $(versortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_TRG)/qt/v6*)))
7927 ifneq ($(VBOX_PATH_QT),)
7928 VBOX_WITH_ORACLE_QT = 1
7929 endif
7930 endif
7931 endif
7932 VBOX_PATH_QT ?= /usr
7933 VBOX_PATH_QT_LIB ?= $(VBOX_PATH_QT)/lib
7934
7935 ifdef VBOX_WITH_ORACLE_QT
7936 if "$(KBUILD_TARGET)" != "darwin"
7937 VBOX_QT_INFIX := VBox$(VBOX_QT_DBG)
7938 endif
7939 VBOX_QT_POSTFIX := VBox
7940 endif
7941
7942 if "$(VBOX_QT_DBG)" != "" && "$(VBOX_QT_DBG)" != "$(VBOX_VCC_CRT_TYPE)" && "$(KBUILD_TARGET)" == "win"
7943 $(warning WARNING! VBOX_QT_DBG (=$(VBOX_QT_DBG)) and VBOX_VCC_CRT_TYPE (=$(VBOX_VCC_CRT_TYPE)) does not match!)
7944 $(warning WARNING! This may cause heap troubles in the GUI in places where something is)
7945 $(warning WARNING! allocated in the Qt DLLs freed in our code (or vice versa) because they)
7946 $(warning WARNING! will be using different allocators. See r156914 for more details.)
7947 $(warning WARNING! VBOX_WITH_DEBUG_VCC_CRT=1 in enabled debug CRT.)
7948 endif
7949
7950 ifeq ($(KBUILD_TARGET),darwin)
7951 VBOX_QT_MOD := QtCore QtGui QtWidgets QtPrintSupport QtHelp QtNetwork QtSql QtStateMachine
7952 else if1of ($(KBUILD_TARGET), linux freebsd netbsd openbsd solaris win)
7953 if1of ($(KBUILD_TARGET), linux freebsd netbsd openbsd solaris)
7954 VBOX_QT_MOD += Qt6Core Qt6Gui Qt6Widgets Qt6PrintSupport Qt6StateMachine
7955 VBOX_QT_MOD += Qt6DBus Qt6Xml Qt6XcbQpa Qt6Help Qt6Network Qt6Sql
7956 ifeq ($(KBUILD_TARGET),linux)
7957 VBOX_QT_MOD += Qt6WaylandClient
7958 endif
7959 VBOX_QT_PLUGINS = \
7960 plugins/platforms/libqxcb$(VBOX_QT_POSTFIX).so \
7961 plugins/platformthemes/libqgtk3$(VBOX_QT_POSTFIX).so \
7962 plugins/sqldrivers/libqsqlite$(VBOX_QT_POSTFIX).so
7963 ifdef VBOX_WITH_ORACLE_QT
7964 VBOX_QT_PLUGINS += \
7965 plugins/platformthemes/libqgtk2$(VBOX_QT_POSTFIX).so \
7966 plugins/styles/libqgtk2style$(VBOX_QT_POSTFIX).so
7967 endif
7968 ifeq ($(KBUILD_TARGET),linux)
7969 VBOX_QT_PLUGINS += \
7970 plugins/platforms/libqwayland-generic$(VBOX_QT_POSTFIX).so \
7971 plugins/wayland-shell-integration/libxdg-shell$(VBOX_QT_POSTFIX).so
7972 endif
7973 else ifeq ($(KBUILD_TARGET),win)
7974 VBOX_QT_MOD += Qt6Core Qt6Gui Qt6Widgets Qt6PrintSupport Qt6StateMachine Qt6Help Qt6Network Qt6Sql
7975 endif # win
7976 endif # linux freebsd netbsd openbsd solaris win
7977
7978 VBOX_QT_MOD_NAMES = $(foreach qtmod,$(VBOX_QT_MOD),$(qtmod)$(VBOX_QT_INFIX))
7979
7980 # Hack LD_LIBRARY_PATH for stuff in tools.
7981 ifdef VBOX_WITH_ORACLE_QT
7982 if1of ($(KBUILD_TARGET), linux solaris)
7983 export LD_LIBRARY_PATH := $(VBOX_PATH_QT_LIB):$(LD_LIBRARY_PATH)
7984 endif
7985 endif
7986
7987 # WORKAROUND:
7988 # Both files included automatically, 1st include is included from 2nd one,
7989 # but moc can't include it due to problem with parsing framework structure,
7990 # as a result QT_VERSION can't be calculated and it's not only used in our
7991 # GUI but by the moc itself to parse modern signal/slot definitions.
7992 # We were hardcoding QT_VERSION for TEMPLATE_VBoxQtGuiExe below for quite
7993 # a long, but this have to end. Instead we can pass both includes manually.
7994 TOOL_QT5_MOCFLAGS.darwin += --include qconfig.h --include qglobal.h
7995endif # defined(VBOX_WITH_QTGUI) || defined(VBOX_WITH_NLS)
7996
7997ifdef VBOX_WITH_QTGUI
7998 #
7999 # Template for building Qt GUI executables.
8000 #
8001 TEMPLATE_VBoxQtGuiExe = VBox Qt GUI Executable
8002 TEMPLATE_VBoxQtGuiExe_USES := qt6
8003 TEMPLATE_VBoxQtGuiExe_QTTOOL := QT6
8004 TEMPLATE_VBoxQtGuiExe_MOCTOOL := QT6
8005 TEMPLATE_VBoxQtGuiExe_UICTOOL := QT6
8006 TEMPLATE_VBoxQtGuiExe_RCCTOOL := QT6
8007 TEMPLATE_VBoxQtGuiExe_LRCTOOL := QT6
8008 TEMPLATE_VBoxQtGuiExe_SDKS := QT6
8009 TEMPLATE_VBoxQtGuiExe_QT_INFIX = $(VBOX_QT_INFIX)
8010 TEMPLATE_VBoxQtGuiExe_DEFS = IN_RING3 QT_NO_DEBUG QT_THREAD_SUPPORT QT_SHARED HAVE_CONFIG_H $(ARCH_BITS_DEFS)
8011 TEMPLATE_VBoxQtGuiExe_RCDEFS = $(TEMPLATE_VBoxR3Exe_RCDEFS)
8012
8013 ifeq ($(KBUILD_TARGET),win)
8014 # Note! Only use VBOX_VCC_CRT_TYPE when it matches VBOX_QT_DBG.
8015 TEMPLATE_VBoxQtGuiExe_TOOL = $(VBOX_VCC_TOOL)
8016 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8017 TEMPLATE_VBoxQtGuiExe_SDKS = WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)
8018 endif
8019 TEMPLATE_VBoxQtGuiExe_DEFS += \
8020 _WIN32_WINNT=0x0500 UNICODE _UNICODE \
8021 QT_DLL _CRT_SECURE_NO_DEPRECATE \
8022 $(QMAKE_PRL_DEFINES)
8023 TEMPLATE_VBoxQtGuiExe_CXXFLAGS = -nologo -Zm200 -MD$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),) \
8024 -Zi -EHsc $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS) $(VBOX_VCC_std)
8025 # -wd4481: nonstandard extension used: override specifier 'override'
8026 # -wd4625: 'QRubberBand' : copy constructor could not be generated because a base class copy constructor is inaccessible
8027 # -wd4626: 'QRubberBand' : assignment operator could not be generated because a base class assignment operator is inaccessible
8028 # -wd4640: qmetatype.h(2210): warning C4640: 'f' : construction of local static object is not thread-safe [too bad]
8029 # -wd4350: behavior change: 'int QStringList::indexOf(const QRegExp &,int) const' called instead of 'int QStringList::indexOf(QRegExp &,int) const'
8030 # -wd4121: UIActionPool.h(393) : warning C4121: 'UIActionPool::PointerToFunction' : alignment of a member was sensitive to packing
8031 # -wd4718: qmap.h(222) : warning C4718: 'QMapNode<enum DetailsElementType,bool>::destroySubTree' : recursive call has no side effects, deleting
8032 # -wd5204: pplwin.h(78): warning C5204: 'Concurrency::details::_DefaultPPLTaskScheduler': class has virtual functions
8033 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += $(VBOX_VCC_WARN_ALL) -wd4481 -wd4625 -wd4626 -wd4640 -wd4350 -wd4371 -wd4121 -wd4718 -wd5204 $(VBOX_VCC_WERR)
8034 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
8035 # -wd4619: qvectro.h(305 : warning C4619: #pragma warning : there is no warning number '4345'
8036 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4619
8037 endif
8038 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8039 # -wd4774: string(530): warning C4774: '_scprintf' : format string expected in argument 1 is not a string literal
8040 # -wd4456: UICommon.cpp(1471): warning C4456: declaration of '_container_' hides previous local declaration [nested foreach]
8041 # -wd4458: UISettingsDialogSpecific.cpp(416): warning C4458: declaration of 'data' hides class member
8042 # qwidget.h(730): note: see declaration of 'QWidget::data'
8043 # -wd4946: qmap.h(213): warning C4946: reinterpret_cast used between related classes: 'QMapNodeBase' and 'QMapNode<Key,T>'
8044 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4774 -wd4456 -wd4458 -wd4946
8045 endif
8046 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC141"
8047 # -wd4866: UIVirtualBoxManager.cpp(221) : warning C4866: compiler may not enforce left-to-right evaluation order for call to 'QStringList::operator<<'
8048 # Only with -std=c++17 and later.
8049 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4866
8050 endif
8051 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # With v16.11.9, not with v16.6.0 4242
8052 # -wd5219: qpoint.h(187): warning C5219: implicit conversion from 'const int' to 'float', possible loss of data
8053 # -wd5240: qcolor.h(235): warning C5240: 'nodiscard': attribute is ignored in this syntactic position
8054 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd5219 -wd5240
8055 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += /volatileMetadata- # Don't waste space on x86/amd64-on-arm emulation optimizations.
8056 endif
8057 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC143" # (with qt 6.5.3 - reevalue when upgrading qt)
8058 # -wd5246: qobjectdefs.h(203): warning C5246: '_Elems': the initialization of a subobject should be wrapped in braces
8059 # -wd5249: qstyleoption.h(207): warning C5249: 'QStyleOptionHeaderV2::textElideMode' of type 'Qt::TextElideMode' has named enumerators with values that cannot be represented in the given bit field width of '2'
8060 # -wd5266: qhash.h(1083): warning C5266: 'const' qualifier on return type has no effect
8061 # -wd5267: qlist.h(50): warning C5267: definition of implicit copy constructor for 'QListSpecialMethods<T>' is deprecated because it has a user-provided destructor
8062 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd5246 -wd5249 -wd5266 -wd5267
8063 endif
8064 if1of ($(KBUILD_TARGET_ARCH), arm64) # (with qt 6.8.0)
8065 # -wd4668: qnumeric.h(88): warning C4668: 'Q_CC_GNU' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
8066 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4668
8067 endif
8068
8069 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -Gy
8070 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
8071 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -Gw
8072 endif
8073 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
8074 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -Zc:inline
8075 endif
8076 ifdef VBOX_WITH_MSC_ANALYZE_THIS
8077 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += /analyze
8078 endif
8079
8080 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug = -RTCsu
8081 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug = -RTCsu
8082 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
8083 TEMPLATE_VBoxQtGuiExe_PCHFLAGS = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8084 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.debug = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug)
8085 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.dbgopt)
8086 TEMPLATE_VBoxQtGuiExe_LDFLAGS = -Ignore:4197 \
8087 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
8088 $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS) \
8089 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
8090 /STUB:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
8091 if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
8092 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -IntegrityCheck
8093 endif
8094 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
8095 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -EmitVolatileMetadata:NO
8096 endif
8097 TEMPLATE_VBoxQtGuiExe_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8098 TEMPLATE_VBoxQtGuiExe_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8099
8100 TEMPLATE_VBoxQtGuiExe_SDKS += $(VBOX_WINPSDK)
8101 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8102 TEMPLATE_VBoxQtGuiExe_LATE_LIBS = \
8103 $(VBOX_LIBS_QT) \
8104 $(LIB_RUNTIME) \
8105 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/vcruntime$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8106 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8107 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8108 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \
8109 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib
8110 ifeq ($(KBUILD_TYPE),asan)
8111 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8112 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/clang_rt.asan_dynamic-x86_64.lib \
8113 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib
8114 endif
8115 else
8116 TEMPLATE_VBoxQtGuiExe_LATE_LIBS = \
8117 $(VBOX_LIBS_QT) \
8118 $(LIB_RUNTIME) \
8119 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8120 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8121 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \
8122 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib
8123 endif
8124 TEMPLATE_VBoxQtGuiExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
8125 TEMPLATE_VBoxQtGuiExe_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
8126
8127 else # the gcc guys:
8128 TEMPLATE_VBoxQtGuiExe_TOOL = $(VBOX_GCC_TOOL)
8129 if $(VBOX_GCC_VERSION_CC) < 30400
8130 TEMPLATE_VBoxQtGuiExe_DEFS += RT_WITHOUT_PRAGMA_ONCE
8131 endif
8132 TEMPLATE_VBoxQtGuiExe_DEFS.linux = _REENTRANT
8133 TEMPLATE_VBoxQtGuiExe_DEFS.solaris = _REENTRANT
8134
8135 ## @todo Use VBOX_GCC_PEDANTIC_CXX?
8136 TEMPLATE_VBoxQtGuiExe_CXXFLAGS = \
8137 -g $(VBOX_GCC_pipe) $(filter-out -Wno-unused $(VBOX_GCC_Wno-unused-parameter),$(VBOX_GCC_WARN)) -frtti -fno-exceptions \
8138 -Wno-long-long -fshort-wchar -fno-strict-aliasing \
8139 $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_Wno-multistatement-macros) $(VBOX_GCC_Wno-ignored-qualifiers) \
8140 $(VBOX_GCC_Wno-return-type-c-linkage) $(VBOX_GCC_std) $(VBOX_GCC_IPRT_FMT_CHECK) $(VBOX_GCC_SANITIZER_FLAGS)
8141 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8142 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += $(VBOX_GCC_WERR)
8143 endif
8144 ifn1of ($(USERNAME), dsen serkan) # Bunch of stuff deprecated after 5.6.*. These guys knows how to deal with it. :)
8145 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += $(VBOX_GCC_Wno-deprecated-declarations)
8146 endif
8147 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -std=gnu++17
8148 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86 = -m32
8149 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64 = -m64
8150 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.linux = -pthread
8151 TEMPLATE_VBoxQtGuiExe_PCHFLAGS = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8152 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.x86 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86)
8153 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.amd64 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64)
8154 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.linux = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.linux)
8155 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.debug = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug)
8156 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.dbgopt)
8157 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) -fno-exceptions $(VBOX_GCC_IPRT_FMT_CHECK)
8158 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS.x86 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86)
8159 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64)
8160 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS = \
8161 -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) \
8162 -frtti -fno-exceptions $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_IPRT_FMT_CHECK)
8163 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8164 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS += $(VBOX_GCC_WERR)
8165 endif
8166 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS += -std=gnu++17
8167 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86)
8168 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64)
8169 TEMPLATE_VBoxQtGuiExe_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
8170 TEMPLATE_VBoxQtGuiExe_LDFLAGS.x86 = -m32
8171 TEMPLATE_VBoxQtGuiExe_LDFLAGS.amd64 = -m64
8172 TEMPLATE_VBoxQtGuiExe_LATE_LIBS = \
8173 $(VBOX_LIBS_QT) \
8174 $(LIB_RUNTIME)
8175
8176 ifeq ($(KBUILD_TARGET),linux)
8177 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -Wl,-z,noexecstack,-z,relro $(VBOX_LD_as_needed)
8178 TEMPLATE_VBOXQTGUIEXE_LDFLAGS += -Wl,-rpath,$(PATH_SDK_QT6_LIB)
8179 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8180 $(VBOX_XCURSOR_LIBS) \
8181 Xext \
8182 X11
8183 TEMPLATE_VBoxQtGuiExe_LIBPATH += \
8184 $(VBOX_LIBPATH_X11)
8185 else ifeq ($(KBUILD_TARGET),darwin)
8186 TEMPLATE_VBoxQtGuiExe_SDKS.darwin += $(VBOX_DARWIN_DEF_SDK_SDKS)
8187 TEMPLATE_VBoxQtGuiExe_DEFS.darwin += $(VBOX_DARWIN_DEF_SDK_DEFS)
8188 TEMPLATE_VBoxQtGuiExe_CFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_CFLAGS)
8189 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
8190 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.darwin += $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.darwin)
8191 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
8192 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS)
8193 TEMPLATE_VBoxQtGuiExe_LDFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -bind_at_load -Wl,-headerpad_max_install_names
8194 TEMPLATE_VBoxQtGuiExe_LATE_LIBS +=
8195 TEMPLATE_VBoxQtGuiExe_LIBPATH +=
8196 TEMPLATE_VBoxQtGuiExe_POST_CMDS.darwin = $(VBOX_SIGN_IMAGE_CMDS)
8197 else
8198 TEMPLATE_VBoxQtGuiExe_INCS += \
8199 $(VBOX_XCURSOR_INCS)
8200 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8201 $(VBOX_XCURSOR_LATE_LIBS) \
8202 Xext \
8203 X11 \
8204 m \
8205 $(LIB_PTHREAD)
8206 TEMPLATE_VBoxQtGuiExe_LIBPATH += \
8207 $(VBOX_LIBPATH_X11)
8208 ifeq ($(KBUILD_TARGET),freebsd)
8209 TEMPLATE_VBoxQtGuiExe_INCS += \
8210 /usr/include \
8211 /usr/X11R6/include \
8212 /usr/local/include
8213 TEMPLATE_VBoxQtGuiExe_LIBPATH += \
8214 /usr/lib \
8215 /usr/X11R6/lib \
8216 /usr/local/lib
8217 endif
8218 ifeq ($(KBUILD_TARGET),solaris)
8219 TEMPLATE_VBoxQtGuiExe_LDFLAGS.solaris = -Wl,-z,ignore # Same as VBOX_LD_as_needed.
8220 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8221 rt socket nsl
8222 endif
8223 endif
8224 # Assume the Qt shared objects are in the same directory as the executable, on Solaris too.
8225 ifdef VBOX_WITH_RUNPATH
8226 TEMPLATE_VBoxQtGuiExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
8227 else ifdef VBOX_WITH_RELATIVE_RUNPATH
8228 TEMPLATE_VBoxQtGuiExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
8229 endif
8230
8231 endif
8232
8233 # Add COM/XPCOM stuff
8234 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8235 $(PATH_STAGE_LIB)/VBoxCOM$(if-expr "$(VBOX_QT_DBG)" != "$(VBOX_VCC_CRT_TYPE)" && $(KBUILD_TARGET) == win,-GUI,)$(VBOX_SUFF_LIB)
8236 ifdef VBOX_WITH_XPCOM
8237 ## @todo may be worth creating the VBOX_XPCOM SDK def, or just a SDK_VBOXXPCOM.
8238 TEMPLATE_VBoxQtGuiExe_DEFS += VBOX_WITH_XPCOM
8239 ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
8240 TEMPLATE_VBoxQtGuiExe_DEFS += VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
8241 endif
8242 TEMPLATE_VBoxQtGuiExe_INCS += \
8243 $(VBOX_XPCOM_INCS)
8244 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8245 $(LIB_XPCOM)
8246 TEMPLATE_VBoxQtGuiExe_INTERMEDIATES += \
8247 $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
8248 else # COM
8249 TEMPLATE_VBoxQtGuiExe_INCS += \
8250 $(VBOX_PATH_SDK)/bindings/mscom/include
8251 TEMPLATE_VBoxQtGuiExe_INTERMEDIATES += \
8252 $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
8253 endif # COM
8254
8255 ifn1of ($(KBUILD_TARGET), darwin os2 win)
8256 TEMPLATE_VBoxQtGuiExe_DEFS += PIC
8257 TEMPLATE_VBoxQtGuiExe_CFLAGS += -fPIC
8258 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -fPIC
8259 # Needed for GCC 9. Even system's Qt 5.12.4 (on Ubuntu 19.10) did not have this fixed yet.
8260 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.linux = $(VBOX_GCC_Wno-deprecated-copy) $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8261 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -fPIC
8262 endif # not darwin, os2 or win
8263
8264 ifeq ($(KBUILD_TARGET),darwin)
8265 TEMPLATE_VBoxQtGuiExe_POST_CMDS = $(QUIET)install_name_tool $(foreach qtmod, $(VBOX_QT_MOD_NAMES), \
8266 $(foreach prefix, @executable_path/../Frameworks/ $(VBOX_PATH_QT)/Frameworks/ $(PATH_SDK_QT6)/, \
8267 -change "$(prefix)$(qtmod).framework/Versions/A/$(qtmod)" \
8268 "$(if $(VBOX_WITH_HARDENING),/Applications/VirtualBox.app/Contents/Frameworks,@rpath)/$(qtmod).framework/Versions/A/$(qtmod)" ) ) "$(out)"
8269 endif
8270
8271 #
8272 # Template for building Qt GUI components.
8273 #
8274 TEMPLATE_VBoxQtGuiDll = VBox Qt GUI Components
8275 TEMPLATE_VBoxQtGuiDll_EXTENDS = VBoxQtGuiExe
8276 TEMPLATE_VBoxQtGuiDll_LATE_LIBS = $(filter-out $(QTMAIN),$(TEMPLATE_VBoxQtGuiExe_LATE_LIBS))
8277 ifeq ($(KBUILD_TARGET),darwin)
8278 TEMPLATE_VBoxQtGuiDll_LDFLAGS.darwin += $(filter-out -bind_at_load,$(TEMPLATE_VBoxQtGuiExe_LDFLAGS.darwin)) \
8279 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
8280 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
8281 endif
8282 ifn1of ($(KBUILD_TARGET), darwin os2 win)
8283 TEMPLATE_VBoxQtGuiDll_DEFS = PIC $(TEMPLATE_VBoxQtGuiExe_DEFS)
8284 TEMPLATE_VBoxQtGuiDll_CFLAGS = -fPIC $(TEMPLATE_VBoxQtGuiExe_CFLAGS)
8285 TEMPLATE_VBoxQtGuiDll_CXXFLAGS = -fPIC $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8286 TEMPLATE_VBoxQtGuiDll_PCHFLAGS = $(TEMPLATE_VBoxQtGuiDll_CXXFLAGS)
8287 TEMPLATE_VBoxQtGuiDll_LDFLAGS = -fPIC $(TEMPLATE_VBoxQtGuiExe_LDFLAGS)
8288 endif
8289endif # VBOX_WITH_QTGUI
8290
8291ifdef VBOX_WITH_NLS
8292 #
8293 # Template for translation compilation.
8294 # Made as simple program without installing itself.
8295 # To archive it, the dummy code without runtime is used,
8296 # i.e. only compiler and system standard libs are linked.
8297 #
8298 TEMPLATE_VBoxNLS = VBox NLS template for installing translation files
8299 TEMPLATE_VBoxNLS_EXTENDS = VBoxR3Static
8300 TEMPLATE_VBoxNLS_USES := qt6
8301 TEMPLATE_VBoxNLS_QTTOOL := QT6
8302 TEMPLATE_VBoxNLS_QT_INFIX = $(VBOX_QT_INFIX)
8303 TEMPLATE_VBoxNLS_INSTTYPE = none
8304 TEMPLATE_VBoxNLS_LRCFLAGS += -silent
8305 TEMPLATE_VBoxNLS_QT_TRANSLATIONS_INST = $(INST_BIN)nls/
8306 TEMPLATE_VBoxNLS_SOURCES = \
8307 $(PATH_ROOT)/src/VBox/Main/nls/dummy.c
8308 TEMPLATE_VBoxNLS_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_VBoxR3Static_SDKS.$(KBUILD_TARGET_ARCH)))
8309 ifdef VBOX_WITH_NOCRT_STATIC
8310 TEMPLATE_VBoxNLS_LATE_LIBS.$(KBUILD_TARGET_ARCH) = $(filter-out \
8311 $(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB), \
8312 $(TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH)))
8313 else
8314 TEMPLATE_VBoxNLS_LATE_LIBS.$(KBUILD_TARGET_ARCH) = $(filter-out \
8315 $(VBOX_LIB_RUNTIME_STATIC) \
8316 $(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB), \
8317 $(TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH)))
8318 endif
8319endif # !VBOX_WITH_NLS
8320
8321
8322#
8323# Template for installing symbol files that we wish to ship.
8324#
8325TEMPLATE_VBoxDbgSyms = Symbol files for VBoxDbg and gurus.
8326TEMPLATE_VBoxDbgSyms_INST = $(INST_VBOXDBG_SYMS)
8327
8328
8329#
8330# Template for building build bldprogs.
8331# HACK ALERT! The BLD_TRG_* is a hack to allow building libraries as well.
8332#
8333TEMPLATE_VBoxBldProg = VBox Build Program
8334TEMPLATE_VBoxBldProg_BLD_TRG := $(KBUILD_HOST)
8335TEMPLATE_VBoxBldProg_BLD_TRG_ARCH := $(KBUILD_HOST_ARCH)
8336TEMPLATE_VBoxBldProg_BLD_TRG_CPU := $(KBUILD_HOST_CPU)
8337TEMPLATE_VBoxBldProg_DEFS := IN_RING3 LOG_DISABLED IN_BLD_PROG
8338TEMPLATE_VBoxBldProg_DEFS.win := _CRT_SECURE_NO_DEPRECATE
8339TEMPLATE_VBoxBldProg_ASTOOL.$(KBUILD_HOST).$(KBUILD_HOST_ARCH) := $(VBOX_ASTOOL.$(KBUILD_HOST).$(KBUILD_HOST_ARCH))
8340TEMPLATE_VBoxBldProg_ASFLAGS.$(KBUILD_HOST).$(KBUILD_HOST_ARCH) = $(VBOX_ASFLAGS.$(KBUILD_HOST).$(KBUILD_HOST_ARCH))
8341ifeq ($(KBUILD_HOST),win)
8342 TEMPLATE_VBoxBldProg_TOOL := $(VBOX_VCC_TOOL_STEM)$(toupper $(KBUILD_HOST_ARCH))
8343 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8344 TEMPLATE_VBoxBldProg_SDKS := ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC $(VBOX_WINPSDK)
8345 else
8346 TEMPLATE_VBoxBldProg_SDKS := ReorderCompilerIncs $(VBOX_WINPSDK)
8347 endif
8348 TEMPLATE_VBoxBldProg_CXXFLAGS := -Zi -Zl -GR- -EHsc -GF $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_OPT) $(VBOX_VCC_FP) \
8349 -MT$(VBOX_VCC_CRT_TYPE) -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_std) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
8350 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
8351 TEMPLATE_VBoxBldProg_CXXFLAGS += -Gw
8352 endif
8353 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
8354 TEMPLATE_VBoxBldProg_CXXFLAGS += -Zc:inline
8355 endif
8356 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
8357 TEMPLATE_VBoxBldProg_CXXFLAGS += /volatileMetadata-
8358 endif
8359 ifdef VBOX_WITH_MSC_ANALYZE_THIS
8360 TEMPLATE_VBoxBldProg_CXXFLAGS += /analyze
8361 endif
8362 TEMPLATE_VBoxBldProg_CXXFLAGS.debug := -RTCsu
8363 TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
8364 TEMPLATE_VBoxBldProg_CXXFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8365 TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8366 TEMPLATE_VBoxBldProg_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxBldProg_CXXFLAGS))
8367 TEMPLATE_VBoxBldProg_CFLAGS.debug = $(TEMPLATE_VBoxBldProg_CXXFLAGS.debug)
8368 TEMPLATE_VBoxBldProg_CFLAGS.dbgopt = $(TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt)
8369 TEMPLATE_VBoxBldProg_CFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8370 TEMPLATE_VBoxBldProg_CFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8371 TEMPLATE_VBoxBldProg_CFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8372 TEMPLATE_VBoxBldProg_PCHFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
8373 TEMPLATE_VBoxBldProg_PCHFLAGS.debug = $(TEMPLATE_VBoxBldProg_CXXFLAGS.debug)
8374 TEMPLATE_VBoxBldProg_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt)
8375 TEMPLATE_VBoxBldProg_PCHFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8376 TEMPLATE_VBoxBldProg_PCHFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8377 TEMPLATE_VBoxBldProg_PCHFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8378 TEMPLATE_VBoxBldProg_LDFLAGS = -Ignore:4197 \
8379 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
8380 $(VBOX_VCC_LD_GUARD_CF) \
8381 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
8382 /DISALLOWLIB:libc$(VBOX_VCC_CRT_TYPE_N).lib \
8383 /DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE_N).lib \
8384 /DISALLOWLIB:msvcrt.lib \
8385 /DISALLOWLIB:msvcrtd.lib \
8386 /DISALLOWLIB:msvcprt.lib \
8387 /DISALLOWLIB:msvcprtd.lib \
8388 /DISALLOWLIB:libvcruntime$(VBOX_VCC_CRT_TYPE_N).lib \
8389 /DISALLOWLIB:libucrt$(VBOX_VCC_CRT_TYPE_N).lib \
8390 /DISALLOWLIB:vcruntime.lib \
8391 /DISALLOWLIB:vcruntimed.lib \
8392 /DISALLOWLIB:ucrt.lib \
8393 /DISALLOWLIB:ucrtd.lib
8394 TEMPLATE_VBoxBldProg_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8395 TEMPLATE_VBoxBldProg_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8396 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
8397 TEMPLATE_VBoxBldProg_LDFLAGS += -EmitVolatileMetadata:NO
8398 endif
8399 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8400 TEMPLATE_VBoxBldProg_LATE_LIBS = \
8401 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
8402 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
8403 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
8404 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/oldnames.lib
8405 else
8406 TEMPLATE_VBoxBldProg_LATE_LIBS = \
8407 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/oldnames.lib \
8408 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
8409 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
8410 endif
8411
8412else
8413 # (gcc of some kind )
8414 TEMPLATE_VBoxBldProg_TOOL = GXX3
8415 if $(VBOX_GCC_VERSION_CC) < 30400
8416 TEMPLATE_VBoxBldProg_DEFS += RT_WITHOUT_PRAGMA_ONCE
8417 endif
8418 TEMPLATE_VBoxBldProg_CFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros)
8419 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8420 TEMPLATE_VBoxBldProg_CFLAGS += $(VBOX_GCC_WERR)
8421 endif
8422 TEMPLATE_VBoxBldProg_CFLAGS.x86 = -m32
8423 TEMPLATE_VBoxBldProg_CFLAGS.sparc32 = -m32
8424 TEMPLATE_VBoxBldProg_CFLAGS.amd64 = -m64
8425 TEMPLATE_VBoxBldProg_CFLAGS.sparc64 = -m64
8426 TEMPLATE_VBoxBldProg_CFLAGS.release = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
8427 TEMPLATE_VBoxBldProg_CFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8428 TEMPLATE_VBoxBldProg_CFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8429 TEMPLATE_VBoxBldProg_CXXFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_std)
8430 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8431 TEMPLATE_VBoxBldProg_CXXFLAGS += $(VBOX_GCC_WERR)
8432 endif
8433 TEMPLATE_VBoxBldProg_CXXFLAGS.x86 = -m32
8434 TEMPLATE_VBoxBldProg_CXXFLAGS.sparc32 = -m32
8435 TEMPLATE_VBoxBldProg_CXXFLAGS.amd64 = -m64
8436 TEMPLATE_VBoxBldProg_CXXFLAGS.sparc64 = -m64
8437 TEMPLATE_VBoxBldProg_CXXFLAGS.release = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
8438 TEMPLATE_VBoxBldProg_CXXFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8439 TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8440 TEMPLATE_VBoxBldProg_OBJCFLAGS = $(TEMPLATE_VBoxBldProg_CFLAGS)
8441 TEMPLATE_VBoxBldProg_OBJCFLAGS.x86 = $(TEMPLATE_VBoxBldProg_CFLAGS.x86)
8442 TEMPLATE_VBoxBldProg_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxBldProg_CFLAGS.amd64)
8443 TEMPLATE_VBoxBldProg_OBJCFLAGS.release = $(TEMPLATE_VBoxBldProg_CFLAGS.release)
8444 TEMPLATE_VBoxBldProg_OBJCFLAGS.profile = $(TEMPLATE_VBoxBldProg_CFLAGS.profile)
8445 TEMPLATE_VBoxBldProg_OBJCFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CFLAGS.kprofile)
8446 TEMPLATE_VBoxBldProg_OBJCXXFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
8447 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.x86)
8448 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.amd64)
8449 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8450 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8451 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8452 TEMPLATE_VBoxBldProg_PCHFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
8453 TEMPLATE_VBoxBldProg_PCHFLAGS.x86 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.x86)
8454 TEMPLATE_VBoxBldProg_PCHFLAGS.amd64 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.amd64)
8455 TEMPLATE_VBoxBldProg_PCHFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8456 TEMPLATE_VBoxBldProg_PCHFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8457 TEMPLATE_VBoxBldProg_PCHFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8458 TEMPLATE_VBoxBldProg_LDFLAGS.x86 = -m32
8459 TEMPLATE_VBoxBldProg_LDFLAGS.sparc32 = -m32
8460 TEMPLATE_VBoxBldProg_LDFLAGS.amd64 = -m64
8461 TEMPLATE_VBoxBldProg_LDFLAGS.sparc64 = -m64
8462 ifeq ($(KBUILD_HOST),linux)
8463 TEMPLATE_VBoxBldProg_LATE_LIBS = pthread m rt dl
8464 else ifeq ($(KBUILD_HOST),os2)
8465 TEMPLATE_VBoxBldProg_TOOL = GXX3OMF
8466 TEMPLATE_VBoxBldProg_LATE_LIBS = socket iconv
8467 else ifeq ($(KBUILD_HOST),darwin)
8468 TEMPLATE_VBoxBldProg_TOOL = $(VBOX_GCC_TOOL)
8469 if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.7" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "7"
8470 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_DEFS)
8471 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_CFLAGS) -fno-common
8472 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS)
8473 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS)
8474 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8475 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8476 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS)
8477 else if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.6" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "6"
8478 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_DEFS)
8479 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_CFLAGS) -fno-common
8480 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS)
8481 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS)
8482 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8483 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8484 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS)
8485 else if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.5" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "5" || defined(VBOX_MACOS_10_5_WORKAROUND)
8486 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_DEFS)
8487 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_CFLAGS) -fno-common
8488 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS)
8489 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS)
8490 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8491 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8492 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_LDFLAGS)
8493 else
8494 TEMPLATE_VBoxBldProg_SDKS.darwin = $(VBOX_DARWIN_DEF_SDK_SDKS)
8495 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_DEFS)
8496 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
8497 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
8498 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
8499 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8500 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8501 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
8502 endif
8503 TEMPLATE_VBoxBldProg_LATE_LIBS =
8504 else ifeq ($(KBUILD_HOST),haiku)
8505 TEMPLATE_VBoxBldProg_TOOL = GXX3
8506 TEMPLATE_VBoxBldProg_LATE_LIBS = network iconv
8507 TEMPLATE_VBoxBldProg_LIBPATH += \
8508 /boot/common/lib
8509 else if1of ($(KBUILD_HOST), freebsd openbsd)
8510 TEMPLATE_VBoxBldProg_TOOL = $(VBOX_GCC_TOOL)
8511 TEMPLATE_VBoxBldProg_LATE_LIBS = pthread
8512 TEMPLATE_VBoxBldProg_INCS += \
8513 /usr/include \
8514 /usr/X11R6/include \
8515 /usr/local/include
8516 TEMPLATE_VBoxBldProg_LIBPATH += \
8517 /usr/lib \
8518 /usr/X11R6/lib \
8519 /usr/local/lib
8520 else ifeq ($(KBUILD_HOST),netbsd)
8521 TEMPLATE_VBoxBldProg_TOOL = GXX3
8522 TEMPLATE_VBoxBldProg_LATE_LIBS = pthread
8523 TEMPLATE_VBoxBldProg_INCS += \
8524 /usr/include \
8525 /usr/X11R7/include
8526 TEMPLATE_VBoxBldProg_LIBPATH += \
8527 /usr/lib \
8528 /usr/X11R7/lib
8529 else ifeq ($(KBUILD_HOST),solaris)
8530 TEMPLATE_VBoxBldProg_TOOL = GXX3PLAIN
8531 TEMPLATE_VBoxBldProg_LATE_LIBS = rt
8532 else
8533 $(warning Warning: VBOX Build: Target $(KBUILD_HOST) is not officially supported!)
8534 endif
8535
8536endif # !win
8537
8538
8539#
8540# Advanced build programs using IPRT and stuff.
8541#
8542TEMPLATE_VBoxAdvBldProg = Advanced VBox Build Program
8543TEMPLATE_VBoxAdvBldProg_EXTENDS = VBoxBldProg
8544TEMPLATE_VBoxAdvBldProg_SDKS = $(TEMPLATE_VBoxBldProg_SDKS)
8545TEMPLATE_VBoxAdvBldProg_SDKS.win = $(TEMPLATE_VBoxBldProg_SDKS.win) VBoxNtDll
8546TEMPLATE_VBoxAdvBldProg_DEFS = $(TEMPLATE_VBoxBldProg_DEFS) IN_RT_R3 IN_ADV_BLD_PROG
8547ifeq ($(KBUILD_HOST),win)
8548 TEMPLATE_VBoxAdvBldProg_CFLAGS = $(TEMPLATE_VBoxBldProg_CFLAGS) $(VBOX_VCC_WERR)
8549 TEMPLATE_VBoxAdvBldProg_CXXFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS) $(VBOX_VCC_WERR)
8550 TEMPLATE_VBoxAdvBldProg_PCHFLAGS = $(TEMPLATE_VBoxAdvBldProg_CXXFLAGS)
8551endif
8552TEMPLATE_VBoxAdvBldProg_LDFLAGS.darwin.arm64 = \
8553 $(TEMPLATE_VBoxBldProg_LDFLAGS.darwin.arm64) -framework IOKit
8554TEMPLATE_VBoxAdvBldProg_LATE_LIBS = \
8555 $(PATH_STAGE_LIB)/RuntimeBldProg$(VBOX_HOSTSUFF_LIB) \
8556 $(TEMPLATE_VBoxBldProg_LATE_LIBS)
8557TEMPLATE_VBoxAdvBldProg_LATE_LIBS.darwin = \
8558 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8559 iconv \
8560 $(TEMPLATE_VBoxBldProg_LATE_LIBS.darwin)
8561TEMPLATE_VBoxAdvBldProg_LATE_LIBS.freebsd = \
8562 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8563 iconv \
8564 rt \
8565 $(TEMPLATE_VBoxBldProg_LATE_LIBS.freebsd)
8566TEMPLATE_VBoxAdvBldProg_LATE_LIBS.linux = \
8567 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8568 $(TEMPLATE_VBoxBldProg_LATE_LIBS.linux)
8569TEMPLATE_VBoxAdvBldProg_LATE_LIBS.solaris = \
8570 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8571 contract \
8572 kstat \
8573 rt \
8574 socket \
8575 nsl \
8576 $(TEMPLATE_VBoxBldProg_LATE_LIBS.solaris)
8577
8578
8579#
8580# Windows rc workaround for crosscompiling.
8581# (Some (old) Wine versions fails loading msvcrt.dll from the VCC bin directory.)
8582#
8583ifneq ($(KBUILD_HOST),win)
8584 TOOL_VCC80X86_RC := $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/rc.exe
8585 TOOL_VCC80AMD64_RC := $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/rc.exe
8586 TOOL_VCC70_RC := $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/rc.exe
8587 WIN32_MC = $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/mc.exe
8588else
8589 WIN32_MC = $(EXEC_X86_WIN32) $(firstword $(wildcard \
8590 $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/MC.Exe \
8591 $(PATH_SDK_WINPSDK_BIN)/MC.Exe \
8592 $(PATH_SDK_WINPSDK)/Bin/MC.Exe \
8593 $(PATH_SDK_WIN32SDK_BIN)/MC.Exe \
8594 $(PATH_SDK_WIN64SDK_BIN)/MC.Exe \
8595 $(KBUILD_DEVTOOLS)/win.x86/bin/mc.exe \
8596 ) Sorry_Cannot_find_mc_in_the_PSDK)
8597endif
8598
8599
8600#
8601# Base template for building R3 programs for the guest additions.
8602# Do _note_ use directly!
8603#
8604## @todo bake it into VBoxGuestR3Exe.
8605TEMPLATE_VBoxGuestR3ExeBase = VBox Guest Program
8606ifeq ($(KBUILD_TARGET),win)
8607 TEMPLATE_VBoxGuestR3ExeBase_EXTENDS = VBoxR3StaticBase
8608 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8609 ifdef VBOX_WITH_NOCRT_STATIC
8610 TEMPLATE_VBoxGuestR3ExeBase_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK_GST) VBoxNtDll
8611 else
8612 TEMPLATE_VBoxGuestR3ExeBase_SDKS = ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC $(VBOX_WINPSDK_GST) VBoxNtDll
8613 endif
8614 else
8615 TEMPLATE_VBoxGuestR3ExeBase_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK_GST) VBoxNtDll
8616 endif
8617 # Hack for running on NT3x, NT4, W2K and XP w/o SP:
8618 # 1. Change OS and subsystem version in the image.
8619 # 2. NT 3.1 requires the IAT to be writable. To avoid making all of .rdata
8620 # writable we use the undocumented -NoOptIData option to prevent .idata$*
8621 # from being merged into .rdata.
8622 # 3. NT 3.1 doesn't support merging initialized and uninitialized section
8623 # because it doesn't recognize Misc.VirtualSize. So, we set the uncached
8624 # flag (!K) on the .bss section make it incompatible with .data.
8625 # VBOX_PE_SET_VERSION will clear the !K flag. (Not needed in no-CRT mode,
8626 # as the init code zeros uninitialized data there when running on NT 3.1.)
8627 # Similarly, for XP64 and 64-bit W2K3 we need to make sure the subsystem version
8628 # in the binaries are set to 5.2. The Visual C++ 2019 linker defaults to 6.0.
8629 # HACK ALERT! Double expansion of $$(NLTAB).
8630 TEMPLATE_VBoxGuestR3ExeBase_USES.win = $(TEMPLATE_VBoxR3StaticBase_USES.win) vboximportchecker vboxsetpeversion
8631 TEMPLATE_VBoxGuestR3ExeBase_VBOX_IMPORT_CHECKER.win.x86 = nt31
8632 TEMPLATE_VBoxGuestR3ExeBase_VBOX_IMPORT_CHECKER.win.amd64 = xp64
8633 TEMPLATE_VBoxGuestR3ExeBase_VBOX_IMPORT_CHECKER.win.arm64 = w10-1709
8634 TEMPLATE_VBoxGuestR3ExeBase_VBOX_SET_PE_VERSION.win.x86 = default
8635 TEMPLATE_VBoxGuestR3ExeBase_VBOX_SET_PE_VERSION.win.amd64 = default
8636 TEMPLATE_VBoxGuestR3ExeBase_VBOX_SET_PE_VERSION.win.arm64 = default
8637 ifdef VBOX_WITH_NOCRT_STATIC
8638 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.win.x86 = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS.win.x86) -NoOptIData
8639 else
8640 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.win.x86 = -NoOptIData -Section:.bss,RW!K $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS.win.x86)
8641 endif
8642
8643 if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
8644 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.win.x86 = $(NO_SUCH_VARIABLE)# Ditch RuntimeR3VccTricks2
8645 endif
8646
8647else # the gcc guys
8648 TEMPLATE_VBoxGuestR3ExeBase_EXTENDS = VBoxR3Exe
8649 ifn1of ($(KBUILD_TARGET), darwin)
8650 TEMPLATE_VBoxGuestR3ExeBase_TOOL := $(subst GXX,GCC,$(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_TOOL))
8651 endif
8652 TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_CXXFLAGS) -fno-exceptions -fno-rtti
8653 # Do not inherit sanitizer flags from VBoxR3Exe in guest executables. Deal with them separately.
8654 TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS.debug = $(NO_SUCH_VARIABLE)
8655 TEMPLATE_VBoxGuestR3ExeBase_CFLAGS.debug = $(NO_SUCH_VARIABLE)
8656 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.linux = $(filter-out $(VBOX_GCC_ORIGIN_OPT),$(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS.linux))
8657 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.debug = $(NO_SUCH_VARIABLE)
8658 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%,$(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS))
8659 ifn1of ($(KBUILD_TARGET), darwin os2) # ELF only. Present in gcc 3.2.3 & binutils 2.15, possibly earlier.
8660 ifdef VBOX_LD_gc_sections # Older solaris linker versions doesn't grok --gc-sections (e.g. add build box).
8661 TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS += -ffunction-sections -fdata-sections
8662 TEMPLATE_VBoxGuestR3ExeBase_CFLAGS += -ffunction-sections -fdata-sections
8663 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS += $(VBOX_LD_gc_sections)
8664 endif
8665 endif
8666endif
8667TEMPLATE_VBoxGuestR3ExeBase_INST = $(INST_ADDITIONS)
8668TEMPLATE_VBoxGuestR3ExeBase_DEFS := \
8669 $(filter-out $(ARCH_BITS_DEFS) VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3, $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_DEFS)) \
8670 IN_GUEST \
8671 IN_GUEST_R3 \
8672 IN_RT_R3 \
8673 IN_RT_STATIC \
8674 $(VBOX_GC_ARCH_BITS_DEFS) \
8675 RT_NEED_NEW_AND_DELETE
8676ifeq ($(KBUILD_TARGET),linux) # As few libs as possible on linux.
8677 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS = pthread rt m dl
8678else if1of ($(KBUILD_TARGET), darwin freebsd openbsd)
8679 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LATE_LIBS) iconv
8680else ifeq ($(KBUILD_TARGET),solaris)
8681 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LATE_LIBS) nsl
8682endif
8683
8684# Use older versions of APIs which were improved in versions of glibc later
8685# than what we are targetting, and do not use the stack protector, which
8686# needs glibc 2.4 or later.
8687TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS.linux = \
8688 -include $(PATH_ROOT)/include/iprt/linux/symvers.h \
8689 $(VBOX_GCC_fno-stack-protector)
8690TEMPLATE_VBoxGuestR3ExeBase_CFLAGS.linux = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS.linux)
8691# The GNU_HASH ELF tag is not supported by older systems.
8692TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.linux += $(VBOX_LD_hash_style_sysv)
8693
8694
8695#
8696# Template for building normal R3 programs for the guest additions, strict.
8697#
8698TEMPLATE_VBoxGuestR3Exe = VBox Guest Program w/ IPRT and VBGL.
8699TEMPLATE_VBoxGuestR3Exe_EXTENDS := VBoxGuestR3ExeBase
8700ifeq ($(KBUILD_TARGET),win)
8701 TEMPLATE_VBoxGuestR3Exe_CFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS) $(VBOX_VCC_WERR)
8702 TEMPLATE_VBoxGuestR3Exe_CXXFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS) $(VBOX_VCC_WERR)
8703 if1of ($(VBOX_VCC_TOOL_STEM), VCC120)
8704 # VBoxDrvInst.cpp(520) : warning C4313: 'wprintf' : '%d' in format string conflicts with argument 1 of type 'const TCHAR *' [false positive - buggy compiler?]
8705 TEMPLATE_VBoxGuestR3Exe_CXXFLAGS += -wd4313
8706 endif
8707 TEMPLATE_VBoxGuestR3Exe_LDFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS) $(VBOX_VCC_LD_WERR)
8708 ifndef VBOX_WITH_NOCRT_STATIC # Temporary kludge to deal with some link order issues.
8709 TEMPLATE_VBoxGuestR3Exe_LDFLAGS.win.x86 = $(TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.win.x86) -Include:_vcc100_kernel32_fakes_asm
8710 endif
8711 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS.x86 = \
8712 $(VBOX_LIB_IPRT_GUEST_R3_X86) \
8713 $(VBOX_LIB_VBGL_R3_X86) \
8714 $(VBOX_LIB_IPRT_GUEST_R3_X86) \
8715 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.x86)
8716 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS.$(KBUILD_TARGET_ARCH) = \
8717 $(VBOX_LIB_IPRT_GUEST_R3) \
8718 $(VBOX_LIB_VBGL_R3) \
8719 $(VBOX_LIB_IPRT_GUEST_R3) \
8720 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.$(KBUILD_TARGET_ARCH))
8721else
8722 TEMPLATE_VBoxGuestR3Exe_CFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS) $(VBOX_GCC_WERR)
8723 TEMPLATE_VBoxGuestR3Exe_CXXFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS) $(VBOX_GCC_WERR)
8724 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS = \
8725 $(VBOX_LIB_IPRT_GUEST_R3) \
8726 $(VBOX_LIB_VBGL_R3) \
8727 $(VBOX_LIB_IPRT_GUEST_R3) \
8728 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS)
8729 ifeq ($(KBUILD_TARGET),solaris)
8730 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS += contract
8731 endif
8732endif
8733
8734#
8735# Template for building R3 (dynamic) libraries for the guest additions, relaxed.
8736#
8737TEMPLATE_VBoxGuestR3DllNonPedantic := VBox Guest User Dynamic Libraries w/ IPRT and VBGL, non-pedantic.
8738TEMPLATE_VBoxGuestR3DllNonPedantic_EXTENDS := VBoxGuestR3ExeBase
8739## @todo add a INSTFUN that separates dlls and libs.
8740ifeq ($(KBUILD_TARGET),win)
8741 ifeq ($(KBUILD_TYPE),asan)
8742 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS.x86 = $(patsubst %clang_rt.asan-i386.lib, %clang_rt.asan_dll_thunk-i386.lib, $(filter-out %clang_rt.asan_cxx-i386.lib,$(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.x86)))
8743 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS.amd64 = $(patsubst %clang_rt.asan-x86_64.lib, %clang_rt.asan_dll_thunk-x86_64.lib, $(filter-out %clang_rt.asan_cxx-x86_64.lib,$(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.amd64)))
8744 endif
8745else ifn1of ($(KBUILD_TARGET), darwin os2 win)
8746 TEMPLATE_VBoxGuestR3DllNonPedantic_DEFS = $(TEMPLATE_VBoxGuestR3ExeBase_DEFS) PIC
8747 TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS) -fPIC
8748 TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS) -fPIC -fno-exceptions
8749 TEMPLATE_VBoxGuestR3DllNonPedantic_LDFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS) -fPIC
8750endif
8751ifeq ($(KBUILD_TARGET),win)
8752 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS.x86 = \
8753 $(VBOX_LIB_IPRT_GUEST_R3_SHARED_X86) \
8754 $(VBOX_LIB_VBGL_R3_SHARED_X86) \
8755 $(VBOX_LIB_IPRT_GUEST_R3_SHARED_X86) \
8756 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.x86)
8757 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS.$(KBUILD_TARGET_ARCH) = \
8758 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8759 $(VBOX_LIB_VBGL_R3_SHARED) \
8760 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8761 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.$(KBUILD_TARGET_ARCH))
8762else
8763 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS = \
8764 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8765 $(VBOX_LIB_VBGL_R3_SHARED) \
8766 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8767 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS)
8768endif
8769
8770#
8771# Template for building normal R3 (dynamic) libraries for the guest additions, strict.
8772#
8773TEMPLATE_VBoxGuestR3Dll := VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8774TEMPLATE_VBoxGuestR3Dll_EXTENDS := VBoxGuestR3DllNonPedantic
8775ifeq ($(KBUILD_TARGET),win)
8776 TEMPLATE_VBoxGuestR3Dll_CFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS) $(VBOX_VCC_WERR)
8777 TEMPLATE_VBoxGuestR3Dll_CXXFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS) $(VBOX_VCC_WERR)
8778 TEMPLATE_VBoxGuestR3Dll_LDFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_LDFLAGS) $(VBOX_VCC_LD_WERR)
8779else
8780 TEMPLATE_VBoxGuestR3Dll_CFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS) $(VBOX_GCC_WERR)
8781 TEMPLATE_VBoxGuestR3Dll_CXXFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS) $(VBOX_GCC_WERR)
8782endif
8783
8784#
8785# Variant of VBoxGuestR3Dll that requires Windows 2000 or later for x86, and W2K3 for AMD64.
8786#
8787TEMPLATE_VBoxGuestR3DllMinW2K = VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8788TEMPLATE_VBoxGuestR3DllMinW2K_EXTENDS = VBoxGuestR3Dll
8789TEMPLATE_VBoxGuestR3DllMinW2K_VBOX_IMPORT_CHECKER.win.x86 = w2k
8790TEMPLATE_VBoxGuestR3DllMinW2K_VBOX_SET_PE_VERSION.win.x86 = w2k
8791ifeq ($(KBUILD_TARGET),win)
8792 ifdef VBOX_WITH_NOCRT_STATIC
8793 TEMPLATE_VBoxGuestR3DllMinW2K_LDFLAGS.win.x86 = $(filter-out -NoOptIData,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8794 else
8795 TEMPLATE_VBoxGuestR3DllMinW2K_LDFLAGS.win.x86 = $(filter-out -NoOptIData -Section:.bss$(COMMA)RW!K,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8796 endif
8797endif
8798
8799#
8800# Variant of VBoxGuestR3Dll that requires Windows Vista or later.
8801#
8802TEMPLATE_VBoxGuestR3DllMinVista = VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8803TEMPLATE_VBoxGuestR3DllMinVista_EXTENDS = VBoxGuestR3Dll
8804TEMPLATE_VBoxGuestR3DllMinVista_VBOX_IMPORT_CHECKER.win.x86 = vista
8805TEMPLATE_VBoxGuestR3DllMinVista_VBOX_IMPORT_CHECKER.win.amd64 = vista
8806TEMPLATE_VBoxGuestR3DllMinVista_VBOX_IMPORT_CHECKER.win.arm64 = w10-1709
8807TEMPLATE_VBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.x86 = vista
8808TEMPLATE_VBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.amd64 = vista
8809TEMPLATE_VBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.arm64 = w10
8810ifeq ($(KBUILD_TARGET),win)
8811 ifdef VBOX_WITH_NOCRT_STATIC
8812 TEMPLATE_VBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8813 else
8814 TEMPLATE_VBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData -Section:.bss$(COMMA)RW!K,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8815 endif
8816endif
8817
8818#
8819# Template for building normal R3 (dynamic) libraries for the guest additions with Visual C++ 2013 or later, strict.
8820#
8821TEMPLATE_NewerVccVBoxGuestR3Dll = VBoxGuestR3DllNonPedantic with the newer Visual C++ version (2013 or later).
8822TEMPLATE_NewerVccVBoxGuestR3Dll_EXTENDS = VBoxGuestR3DllNonPedantic
8823if "$(KBUILD_TARGET)" == "win" && "$(VBOX_NEWER_VCC_TOOL_STEM)" != "$(VBOX_VCC_TOOL_STEM)"
8824 TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.x86 = $(VBOX_NEWER_VCC_TOOL_STEM)X86
8825 TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.amd64 = $(VBOX_NEWER_VCC_TOOL_STEM)AMD64
8826 TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.arm64 = $(VBOX_NEWER_VCC_TOOL_STEM)ARM64
8827 TEMPLATE_NewerVccVBoxGuestR3Dll_CXXFLAGS = \
8828 $(filter-out $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR), $(TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS)) \
8829 $(VBOX_NEWER_VCC_WARN_ALL) $(VBOX_VCC_WERR)
8830 TEMPLATE_NewerVccVBoxGuestR3Dll_CFLAGS = $(TEMPLATE_NewerVccVBoxGuestR3DllNonPedantic_CXXFLAGS)
8831 ifndef VBOX_WITH_NOCRT_STATIC
8832 TEMPLATE_NewerVccVBoxGuestR3Dll_LATE_LIBS.x86 = \
8833 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.x86)_LIB)/oldnames.lib \
8834 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
8835 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
8836 TEMPLATE_NewerVccVBoxGuestR3Dll_LATE_LIBS.amd64 = \
8837 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.amd64)_LIB)/oldnames.lib \
8838 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.amd64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
8839 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.amd64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
8840 TEMPLATE_NewerVccVBoxGuestR3Dll_LATE_LIBS.arm64 = \
8841 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.arm64)_LIB)/oldnames.lib \
8842 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.arm64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
8843 $(PATH_TOOL_$(TEMPLATE_NewerVccVBoxGuestR3Dll_TOOL.win.arm64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
8844 endif # !VBOX_WITH_NOCRT_STATIC
8845 # Hack end
8846endif
8847TEMPLATE_NewerVccVBoxGuestR3Dll_LATE_LIBS = $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS) # Not sure why this is here...
8848
8849#
8850# Variant of NewerVccVBoxGuestR3Dll that requires Windows Vista or later.
8851#
8852TEMPLATE_NewerVccVBoxGuestR3DllMinVista = NewerVccVBoxGuestR3Dll with the newer Visual C++ version (2013 or later).
8853TEMPLATE_NewerVccVBoxGuestR3DllMinVista_EXTENDS := NewerVccVBoxGuestR3Dll
8854TEMPLATE_NewerVccVBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.x86 := vista
8855TEMPLATE_NewerVccVBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.amd64 := vista
8856TEMPLATE_NewerVccVBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.arm64 := w10
8857ifeq ($(KBUILD_TARGET),win)
8858 ifdef VBOX_WITH_NOCRT_STATIC
8859 TEMPLATE_NewerVccVBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData,$(TEMPLATE_NewerVccVBoxGuestR3Dll_LDFLAGS.win.x86))
8860 else
8861 TEMPLATE_NewerVccVBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData -Section:.bss$(COMMA)RW!K,$(TEMPLATE_NewerVccVBoxGuestR3Dll_LDFLAGS.win.x86))
8862 endif
8863endif
8864
8865#
8866# Template for building R3 (static) libraries for the guest additions, strict.
8867#
8868TEMPLATE_VBoxGuestR3Lib := VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8869TEMPLATE_VBoxGuestR3Lib_EXTENDS := VBoxGuestR3ExeBase
8870TEMPLATE_VBoxGuestR3Lib_EXTENDS_BY := appending
8871TEMPLATE_VBoxGuestR3Lib_INST = $(INST_ADDITIONS_LIB)
8872ifeq ($(KBUILD_TARGET),win)
8873 TEMPLATE_VBoxGuestR3Lib_CFLAGS += $(VBOX_VCC_WERR)
8874 TEMPLATE_VBoxGuestR3Lib_CXXFLAGS += $(VBOX_VCC_WERR)
8875 TEMPLATE_VBoxGuestR3Lib_LDFLAGS += $(VBOX_VCC_LD_WERR)
8876else
8877 TEMPLATE_VBoxGuestR3Lib_CFLAGS += $(VBOX_GCC_WERR)
8878 TEMPLATE_VBoxGuestR3Lib_CXXFLAGS += $(VBOX_GCC_WERR)
8879endif
8880
8881
8882#
8883# Guest version of VBoxR3StaticNoCrtExe.
8884#
8885TEMPLATE_VBoxGuestR3NoCrtExe := ...
8886TEMPLATE_VBoxGuestR3NoCrtExe_EXTENDS := VBoxGuestR3Exe
8887TEMPLATE_VBoxGuestR3NoCrtExe_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC,WINSDK10-UCRT-INCS, $(TEMPLATE_VBoxGuestR3Exe_SDKS))
8888TEMPLATE_VBoxGuestR3NoCrtExe_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_VBoxGuestR3Exe_SDKS.$(KBUILD_TARGET_ARCH)))
8889TEMPLATE_VBoxGuestR3NoCrtExe_DEFS = $(TEMPLATE_VBoxGuestR3Exe_DEFS) \
8890 RT_NO_CRT \
8891 IN_RT_STATIC
8892ifndef VBOX_WITH_NOCRT_STATIC
8893 TEMPLATE_VBoxGuestR3NoCrtExe_DEFS.win = $(TEMPLATE_VBoxGuestR3Exe_DEFS.win) \
8894 RT_WITHOUT_NOCRT_WRAPPERS
8895endif
8896TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS = \
8897 $(PATH_STAGE_LIB)/RuntimeR3NoCrt$(VBOX_SUFF_LIB)
8898ifeq ($(KBUILD_TARGET),win)
8899 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
8900 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
8901 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.win = $(NO_SUCH_VARIABLE)
8902 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.win.x86 = \
8903 $(PATH_TOOL_$(TEMPLATE_VBoxGuestR3NoCrtExe_TOOL.win.x86)_LIB)/chkstk.obj
8904 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS = $(NO_SUCH_VARIABLE) # These four aren't necessary, just being careful.
8905 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS.x86 = $(NO_SUCH_VARIABLE)
8906 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS.amd64 = $(NO_SUCH_VARIABLE)
8907 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS.win = $(NO_SUCH_VARIABLE)
8908 TEMPLATE_VBoxGuestR3NoCrtExe_LDFLAGS = $(filter-out $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxGuestR3Exe_LDFLAGS))
8909 TEMPLATE_VBoxGuestR3NoCrtExe_LDFLAGS.win.x86 = $(filter-out -Include%, $(TEMPLATE_VBoxGuestR3Exe_LDFLAGS.win.x86))
8910 TEMPLATE_VBoxGuestR3NoCrtExe_LDFLAGS.win = $(TEMPLATE_VBoxGuestR3Exe_LDFLAGS.win) /entry:CustomMainEntrypoint /subsystem:console
8911 TEMPLATE_VBoxGuestR3NoCrtExe_CFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3Exe_CFLAGS)) /GS- -EHs-
8912 TEMPLATE_VBoxGuestR3NoCrtExe_CXXFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3Exe_CXXFLAGS)) /GS- -EHs-
8913 TEMPLATE_VBoxGuestR3NoCrtExe_PCHFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3Exe_PCHFLAGS)) /GS- -EHs-
8914 TEMPLATE_VBoxGuestR3NoCrtExe_CXXFLAGS.debug = $(filter-out /RTC% -RTC%, $(TEMPLATE_VBoxGuestR3Exe_CXXFLAGS.debug))
8915else
8916 TEMPLATE_VBoxGuestR3NoCrtExe_CXXFLAGS = $(TEMPLATE_VBoxGuestR3Exe_CXXFLAGS) -fno-exceptions
8917 TEMPLATE_VBoxGuestR3NoCrtExe_PCHFLAGS = $(TEMPLATE_VBoxGuestR3Exe_PCHFLAGS) -fno-exceptions
8918endif
8919
8920
8921#
8922# Template for XFree86 guest modules (relocatable module, i.e. sysmod).
8923# This mostly about zapping the VBoxR3Exe linker flags and libraries.
8924#
8925TEMPLATE_VBoxGuestR3XFree86Mod := VBox XFree86 Guest Module
8926TEMPLATE_VBoxGuestR3XFree86Mod_EXTENDS := VBoxGuestR3ExeBase
8927TEMPLATE_VBoxGuestR3XFree86Mod_SYSSUFF := .o
8928TEMPLATE_VBoxGuestR3XFree86Mod_DEFS = $(TEMPLATE_VBoxGuestR3ExeBase_DEFS) VBOX_GUESTR3XF86MOD RTMEM_NO_WRAP_TO_EF_APIS
8929TEMPLATE_VBoxGuestR3XFree86Mod_CFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS)) \
8930 -fno-pie -fno-merge-constants -std=c99 -ffreestanding
8931TEMPLATE_VBoxGuestR3XFree86Mod_CXXFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS)) \
8932 -fno-pie -fno-merge-constants -ffreestanding
8933TEMPLATE_VBoxGuestR3XFree86Mod_CFLAGS.linux = $(VBOX_GCC_fno-stack-protector) # Remove symvers.h
8934TEMPLATE_VBoxGuestR3XFree86Mod_CXXFLAGS.linux = $(VBOX_GCC_fno-stack-protector) # Remove symvers.h
8935TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8936# The GNU_HASH ELF tag is not supported by older glibc dynamic linkers.
8937TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.linux = $(subst -Wl$(COMMA),,$(VBOX_LD_hash_style_sysv))
8938TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8939TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS := -r
8940if1of ($(KBUILD_TARGET), dragonfly freebsd linux netbsd openbsd) # the gnu ld guys.
8941 TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.release := -S
8942 TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.x86 := -m elf_i386
8943 TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.amd64 := -m elf_x86_64
8944endif
8945TEMPLATE_VBoxGuestR3XFree86Mod_LATE_LIBS = $(VBOX_LIB_VBGL_R3_XFREE86)
8946TEMPLATE_VBoxGuestR3XFree86Mod_LATE_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8947TEMPLATE_VBoxGuestR3XFree86Mod_LATE_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8948TEMPLATE_VBoxGuestR3XFree86Mod_LIBS = $(NO_SUCH_VARIABLE) # These three aren't necessary, just being careful.
8949TEMPLATE_VBoxGuestR3XFree86Mod_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8950TEMPLATE_VBoxGuestR3XFree86Mod_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8951
8952
8953#
8954# Template for XFree86 guest libraries.
8955#
8956TEMPLATE_VBoxGuestR3XFree86Lib := VBox XFree86 Guest Library
8957TEMPLATE_VBoxGuestR3XFree86Lib_EXTENDS := VBoxGuestR3XFree86Mod
8958TEMPLATE_VBoxGuestR3XFree86Lib_INST = $(INST_ADDITIONS_LIB)
8959
8960
8961#
8962# Template for X.Org guest modules (shared libs).
8963# This mostly about zapping unnecessary LIBS from VBoxGuestR3DllNonPedantic and adding some flags.
8964#
8965TEMPLATE_VBoxGuestR3XOrgMod := VBox X.Org Guest Module
8966TEMPLATE_VBoxGuestR3XOrgMod_EXTENDS := VBoxGuestR3DllNonPedantic
8967TEMPLATE_VBoxGuestR3XOrgMod_DEFS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_DEFS) VBOX_GUESTR3XORGMOD RTMEM_NO_WRAP_TO_EF_APIS
8968ifeq ($(KBUILD_TARGET_ARCH),amd64)
8969 TEMPLATE_VBoxGuestR3XOrgMod_DEFS += _XSERVER64
8970endif
8971TEMPLATE_VBoxGuestR3XOrgMod_CFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS)) -std=c99
8972TEMPLATE_VBoxGuestR3XOrgMod_CXXFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS))
8973if1of ($(KBUILD_TARGET), linux)
8974 TEMPLATE_VBoxGuestR3XOrgMod_CFLAGS += -Wno-conversion -Wno-unused-parameter
8975endif
8976TEMPLATE_VBoxGuestR3XOrgMod_LDFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS),$(TEMPLATE_VBoxGuestR3DllNonPedantic_LDFLAGS))
8977TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS = $(VBOX_LIB_VBGL_R3_XORG)
8978TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8979TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8980TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS.freebsd = iconv
8981TEMPLATE_VBoxGuestR3XOrgMod_LIBS = $(NO_SUCH_VARIABLE) # These three aren't necessary, just being careful.
8982TEMPLATE_VBoxGuestR3XOrgMod_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8983TEMPLATE_VBoxGuestR3XOrgMod_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8984
8985
8986#
8987# Template for X.Org guest libraries.
8988#
8989TEMPLATE_VBoxGuestR3XOrgLib := VBox X.Org Guest Library
8990TEMPLATE_VBoxGuestR3XOrgLib_EXTENDS := VBoxGuestR3XOrgMod
8991TEMPLATE_VBoxGuestR3XOrgLib_INST = $(INST_ADDITIONS_LIB)
8992
8993
8994#
8995# Template for building R0 drivers for the guest additions.
8996#
8997TEMPLATE_VBoxGuestR0Drv = VBox Guest Driver
8998TEMPLATE_VBoxGuestR0Drv_EXTENDS = VBoxR0Drv
8999TEMPLATE_VBoxGuestR0Drv_INST = $(INST_ADDITIONS)
9000TEMPLATE_VBoxGuestR0Drv_SDKS.win.x86 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9001TEMPLATE_VBoxGuestR0Drv_SDKS.win.amd64 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9002TEMPLATE_VBoxGuestR0Drv_SDKS.win.arm32 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9003TEMPLATE_VBoxGuestR0Drv_SDKS.win.arm64 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9004TEMPLATE_VBoxGuestR0Drv_DEFS = $(TEMPLATE_VBoxR0Drv_DEFS) IN_GUEST IN_GUEST_R0
9005TEMPLATE_VBoxGuestR0Drv_DEFS.linux = RT_NO_EXPORT_SYMBOL
9006ifeq ($(KBUILD_TARGET),solaris)
9007 TEMPLATE_VBoxGuestR0Drv_LDFLAGS = -r -dy
9008endif
9009ifn1of ($(KBUILD_TARGET), darwin os2 win)
9010 TEMPLATE_VBoxGuestR0Drv_CFLAGS = $(patsubst %/VBox/SUPDrvMangling.h,%/VBox/VBoxGuestMangling.h,$(TEMPLATE_VBoxR0Drv_CFLAGS))
9011 TEMPLATE_VBoxGuestR0Drv_CXXFLAGS = $(patsubst %/VBox/SUPDrvMangling.h,%/VBox/VBoxGuestMangling.h,$(TEMPLATE_VBoxR0Drv_CXXFLAGS))
9012 TEMPLATE_VBoxGuestR0Drv_ASDEFS = $(patsubst RT_MANGLER_PREFIX=%,RT_MANGLER_PREFIX=VBoxGuest_,$(TEMPLATE_VBoxR0Drv_ASDEFS))
9013endif
9014if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120" # Do not use SSE so the binaries might works on NT4 and earlier.
9015 TEMPLATE_VBoxGuestR0Drv_CFLAGS.win.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.win.x86) /arch:IA32
9016 TEMPLATE_VBoxGuestR0Drv_CXXFLAGS.win.x86 = $(TEMPLATE_VBoxR0Drv_CXXFLAGS.win.x86) /arch:IA32
9017endif
9018
9019
9020#
9021# Template for building R0 libraries for the guest additions.
9022#
9023TEMPLATE_VBoxGuestR0DrvLib = VBox Guest Driver Libraries
9024TEMPLATE_VBoxGuestR0DrvLib_EXTENDS = VBoxGuestR0Drv
9025TEMPLATE_VBoxGuestR0DrvLib_INSTTYPE = stage
9026TEMPLATE_VBoxGuestR0DrvLib_INSTTYPE.linux = stage
9027TEMPLATE_VBoxGuestR0DrvLib_INST = $(INST_ADDITIONS_LIB)
9028ifeq ($(KBUILD_TARGET),haiku)
9029 TEMPLATE_VBoxGuestR0DrvLib_LDFLAGS = -r -dy
9030endif
9031
9032
9033#
9034# Guest additions libraries (all static).
9035# The _SHARED variants are compiled as PIC and intended for linking into a .so/.dll/.dylib.
9036#
9037VBOX_LIB_IPRT_GUEST_R3 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3$(VBOX_SUFF_LIB)
9038VBOX_LIB_IPRT_GUEST_R3_SHARED = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3Shared$(VBOX_SUFF_LIB)
9039VBOX_LIB_IPRT_GUEST_R0 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR0$(VBOX_SUFF_LIB)
9040#ifeq ($(KBUILD_TARGET_ARCH),x86)
9041# VBOX_LIB_IPRT_GUEST_R0_NT4 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR0NT4$(VBOX_SUFF_LIB)
9042#else
9043VBOX_LIB_IPRT_GUEST_R0_NT4 = $(VBOX_LIB_IPRT_GUEST_R0)
9044#endif
9045VBOX_LIB_VBGL_R3 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3Lib$(VBOX_SUFF_LIB)
9046VBOX_LIB_VBGL_R3_XFREE86 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibXFree86$(VBOX_SUFF_LIB)
9047VBOX_LIB_VBGL_R3_XORG = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibXOrg$(VBOX_SUFF_LIB)
9048VBOX_LIB_VBGL_R3_SHARED = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibShared$(VBOX_SUFF_LIB)
9049VBOX_LIB_VBGL_R0BASE = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR0LibBase$(VBOX_SUFF_LIB)
9050VBOX_LIB_VBGL_R0 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR0Lib$(VBOX_SUFF_LIB)
9051ifeq ($(KBUILD_TARGET_ARCH),x86)
9052 VBOX_LIB_IPRT_GUEST_R3_X86 = $(VBOX_LIB_IPRT_GUEST_R3)
9053 VBOX_LIB_IPRT_GUEST_R3_SHARED_X86 = $(VBOX_LIB_IPRT_GUEST_R3_SHARED)
9054 VBOX_LIB_VBGL_R3_X86 = $(VBOX_LIB_VBGL_R3)
9055 VBOX_LIB_VBGL_R3_SHARED_X86 = $(VBOX_LIB_VBGL_R3_SHARED)
9056else
9057 VBOX_LIB_IPRT_GUEST_R3_X86 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3-x86$(VBOX_SUFF_LIB)
9058 VBOX_LIB_IPRT_GUEST_R3_SHARED_X86 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3Shared-x86$(VBOX_SUFF_LIB)
9059 VBOX_LIB_VBGL_R3_X86 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3Lib-x86$(VBOX_SUFF_LIB)
9060 VBOX_LIB_VBGL_R3_SHARED_X86 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibShared-x86$(VBOX_SUFF_LIB)
9061endif
9062
9063
9064#
9065# Check the publisher and version string.
9066#
9067# We are being very strict because the version string is visible in various
9068# APIs and logs and must be machine readable.
9069#
9070VBOX_VERSION_COMP_VALID_CHAR_SET = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz()[]{}+-.,
9071ifneq ($(VBOX_BUILD_PUBLISHER),)
9072 if !defined(VBOX_BUILD_TAG) && $(length $(VBOX_BUILD_PUBLISHER)) > 10
9073 $(error VBox: VBOX_BUILD_PUBLISHER must not be longer than 10 characters!)
9074 else if defined(VBOX_BUILD_TAG) && $(length $(VBOX_BUILD_PUBLISHER)) > 48
9075 $(error VBox: VBOX_BUILD_PUBLISHER must not be longer than 48 characters!)
9076 endif
9077 if "$(substr $(VBOX_BUILD_PUBLISHER), 1, 1)" != "_"
9078 $(error VBox: VBOX_BUILD_PUBLISHER must start with an underscore!)
9079 endif
9080 if "$(translate $(substr $(VBOX_BUILD_PUBLISHER),2),$(VBOX_VERSION_COMP_VALID_CHAR_SET),)" != ""
9081 $(error VBox: VBOX_BUILD_PUBLISHER='$(VBOX_BUILD_PUBLISHER)' contains bad characters! Valid set is:$(NLTAB)$(VBOX_VERSION_COMP_VALID_CHAR_SET))
9082 endif
9083endif
9084
9085if $(words $(VBOX_VERSION_STRING)) != 1
9086 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' contains spaces or is empty.)
9087endif
9088if "$(subst __,-,$(VBOX_VERSION_STRING))" != "$(VBOX_VERSION_STRING)"
9089 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' contains double underscores.)
9090endif
9091
9092VBOX_VER_TMP1 := $(subst _,$(SP),$(VBOX_VERSION_STRING))
9093
9094if $(words $(VBOX_VER_TMP1)) > 3
9095 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' contains too many parts (underscores), max 3!)
9096endif
9097if "$(translate $(word 1,$(VBOX_VER_TMP1)),0123456789,)" != ".."
9098 $(error VBox: The x.y.z part of VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' is malformed: '$(word 1,$(VBOX_VER_TMP1))')
9099endif
9100if "$(word 1,$(VBOX_VER_TMP1))" != "$(VBOX_VERSION_STRING_RAW)"
9101 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' does not start with VBOX_VERSION_STRING_RAW='$(VBOX_VERSION_STRING_RAW)')
9102endif
9103
9104if $(words $(VBOX_VER_TMP1)) == 3 || ($(words $(VBOX_VER_TMP1)) == 2 && "$(VBOX_BUILD_PUBLISHER)" == "")
9105 if "$(substr $(word 2,$(VBOX_VER_TMP1)),1,4)" == "BETA"
9106 VBOX_VER_TMP2 = 5
9107 else if "$(substr $(word 2,$(VBOX_VER_TMP1)),1,5)" == "ALPHA"
9108 VBOX_VER_TMP2 = 6
9109 else if "$(substr $(word 2,$(VBOX_VER_TMP1)),1,2)" == "RC"
9110 VBOX_VER_TMP2 = 3
9111 else
9112 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' uses an unknown build type: '$(word 2,$(VBOX_VER_TMP1))')
9113 endif
9114 if "$(translate $(substr $(word 2,$(VBOX_VER_TMP1)),$(VBOX_VER_TMP2)),0123456789)" != ""
9115 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' uses an unknown build type: '$(word 2,$(VBOX_VER_TMP1))')
9116 endif
9117endif
9118
9119VBOX_VER_TMP1 :=
9120VBOX_VER_TMP2 :=
9121
9122
9123#
9124# Two targets to coordinate version number changes properly. Note that the
9125# only way to get a really consistent build is to run 'kmk' in the top-level
9126# directory. If you don't run it there, you get a consistent sub-tree only.
9127#
9128VBOX_BAD_CHAR_SET = ,;:/\$(SP)$(TAB)$(HASH)=![]@%&''()*""<>?^{}|~
9129VBOX_VERSION_STAMP = $(PATH_OUT)/version-stamp-raw-api-puel-$(translate $(VBOX_VERSION_STRING)-$(VBOX_C_YEAR)-$(VBOX_VENDOR)-$(VBOX_PRODUCT)-$(VBOX_API_VERSION)-$(VBOX_PUEL_PRODUCT)-$(VBOX_BUILD_PUBLISHER)-$(USERNAME),$(VBOX_BAD_CHAR_SET),,_)
9130VBOX_VERSION_HEADER = $(PATH_OUT)/version-generated.h
9131VBOX_VERSION_MK = $(PATH_OUT)/version-generated.mk
9132
9133$(VBOX_VERSION_STAMP): | $(PATH_ROOT)/Config.kmk
9134 $(call MSG_GENERATE,,$@)
9135 $(QUIET)$(MKDIR) -p $(@D)
9136 $(QUIET)$(RM) -f $(wildcard $(PATH_OUT)/version-stamp-*)
9137 $(QUIET)$(APPEND) $@ $(VBOX_VERSION_STRING)
9138
9139$(VBOX_VERSION_HEADER): $(VBOX_VERSION_STAMP)
9140 $(call MSG_GENERATE,,$@)
9141 $(QUIET)$(MKDIR) -p $(@D)
9142 $(QUIET)$(RM) -f $@ $@.tmp
9143 $(QUIET)$(APPEND) $@.tmp '#ifndef ___version_generated_h___'
9144 $(QUIET)$(APPEND) $@.tmp '#define ___version_generated_h___'
9145 $(QUIET)$(APPEND) $@.tmp ''
9146 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_MAJOR $(VBOX_VERSION_MAJOR)'
9147 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_MINOR $(VBOX_VERSION_MINOR)'
9148 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_BUILD $(VBOX_VERSION_BUILD)'
9149ifneq ($(VBOX_VERSION_PRERELEASE),)
9150 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_PRERELEASE "$(strip $(VBOX_VERSION_PRERELEASE))"'
9151endif
9152 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_STRING_RAW "$(VBOX_VERSION_STRING_RAW)"'
9153 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_STRING "$(VBOX_VERSION_STRING)"'
9154 $(QUIET)$(APPEND) $@.tmp '#define VBOX_API_VERSION_STRING "$(VBOX_API_VERSION)"'
9155 $(QUIET)$(APPEND) $@.tmp ''
9156ifdef VBOX_BUILD_SERVER_BUILD
9157 $(QUIET)$(APPEND) $@.tmp '#define VBOX_BUILD_SERVER_BUILD 1'
9158else
9159 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PRIVATE_BUILD_DESC "Private build by $(USERNAME)"'
9160endif
9161 $(QUIET)$(APPEND) $@.tmp ''
9162 $(QUIET)$(APPEND) $@.tmp '#endif'
9163 $(QUIET)$(MV) -f $@.tmp $@
9164
9165
9166VBOX_PACKAGE_HEADER = $(PATH_OUT)/package-generated.h
9167
9168$(VBOX_PACKAGE_HEADER):
9169 $(call MSG_GENERATE,,$@)
9170 $(QUIET)$(MKDIR) -p $(@D)
9171 $(QUIET)$(RM) -f $@ $@.tmp
9172 $(QUIET)$(APPEND) $@.tmp '#ifndef ___package_generated_h___'
9173 $(QUIET)$(APPEND) $@.tmp '#define ___package_generated_h___'
9174 $(QUIET)$(APPEND) $@.tmp ''
9175 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PACKAGE_STRING "$(VBOX_PACKAGE_STRING)"'
9176 $(QUIET)$(APPEND) $@.tmp ''
9177 $(QUIET)$(APPEND) $@.tmp '#endif'
9178 $(QUIET)$(MV) -f $@.tmp $@
9179
9180VBOX_PRODUCT_HEADER = $(PATH_OUT)/product-generated.h
9181
9182$(VBOX_PRODUCT_HEADER): $(VBOX_VERSION_STAMP)
9183 $(call MSG_GENERATE,,$@)
9184 $(QUIET)$(MKDIR) -p $(@D)
9185 $(QUIET)$(RM) -f $@ $@.tmp
9186 $(QUIET)$(APPEND) $@.tmp '#ifndef ___product_generated_h___'
9187 $(QUIET)$(APPEND) $@.tmp '#define ___product_generated_h___'
9188 $(QUIET)$(APPEND) $@.tmp ''
9189 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VENDOR "$(VBOX_VENDOR)"'
9190 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VENDOR_SHORT "$(VBOX_VENDOR_SHORT)"'
9191 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PRODUCT "$(VBOX_PRODUCT)"'
9192 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PUEL_PRODUCT "$(VBOX_PUEL_PRODUCT)"'
9193 $(QUIET)$(APPEND) $@.tmp '#define VBOX_BUILD_PUBLISHER "$(VBOX_BUILD_PUBLISHER)"'
9194 $(QUIET)$(APPEND) $@.tmp '#define VBOX_C_YEAR "$(VBOX_C_YEAR)"'
9195 $(QUIET)$(APPEND) $@.tmp ''
9196 $(QUIET)$(APPEND) $@.tmp '#endif'
9197 $(QUIET)$(MV) -f $@.tmp $@
9198
9199#
9200# Used for external makefiles which cannot include Config.kmk
9201#
9202$(VBOX_VERSION_MK): $(VBOX_VERSION_STAMP)
9203 $(call MSG_GENERATE,,$@)
9204 $(QUIET)$(RM) -f $@ $@.tmp
9205 $(QUIET)$(MKDIR) -p $(@D)
9206 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_MAJOR = $(VBOX_VERSION_MAJOR)'
9207 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_MINOR = $(VBOX_VERSION_MINOR)'
9208 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_BUILD = $(VBOX_VERSION_BUILD)'
9209 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_STRING = $(VBOX_VERSION_STRING)'
9210ifneq ($(VBOX_VERSION_PRERELEASE),)
9211 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_PRERELEASE = $(strip $(VBOX_VERSION_PRERELEASE))'
9212endif
9213 $(QUIET)$(APPEND) $@.tmp 'VBOX_VENDOR = $(VBOX_VENDOR)'
9214 $(QUIET)$(APPEND) $@.tmp 'VBOX_VENDOR_SHORT = $(VBOX_VENDOR_SHORT)'
9215 $(QUIET)$(APPEND) $@.tmp 'VBOX_PRODUCT = $(VBOX_PRODUCT)'
9216 $(QUIET)$(APPEND) $@.tmp 'VBOX_C_YEAR = $(VBOX_C_YEAR)'
9217ifdef VBOX_BUILD_SERVER_BUILD
9218 $(QUIET)$(APPEND) $@.tmp 'VBOX_BUILD_SERVER_BUILD = 1'
9219else
9220 $(QUIET)$(APPEND) $@.tmp 'VBOX_PRIVATE_BUILD_DESC = Private build by $(USERNAME)'
9221endif
9222 $(QUIET)$(MV) -f $@.tmp $@
9223
9224if !defined(VBOX_OSE) && !defined(VBOX_NOINC_LICENSE_VER_KMK)
9225 if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd solaris)
9226 # VBOX_LICENSE_VER is used in several Makefiles
9227 VBOX_LICENSE_VER_KMK = $(PATH_OUT)/license-version.kmk
9228 $(VBOX_LICENSE_VER_KMK): $(VBOX_BRAND_LICENSE_HTML)
9229 $(call MSG_GENERATE,,$(VBOX_LICENSE_VER_KMK))
9230 $(QUIET)$(MKDIR) -p $(@D)
9231 ifdef VBOX_BRAND_LICENSE_VER
9232 $(QUIET)$(RM) -f '$@'
9233 $(APPEND) '$@' 'VBOX_LICENSE_VER=$(VBOX_BRAND_LICENSE_VER)'
9234 else
9235 $(QUIET)$(SED) -e "s/.*License version \([0-9.]*\) *[,&].*/VBOX_LICENSE_VER=\1/;t;d" --output $@ $(VBOX_BRAND_LICENSE_HTML)
9236 endif
9237 -include $(VBOX_LICENSE_VER_KMK)
9238 ifdef VBOX_LICENSE_VER
9239 VBOX_LICENSE_FILES = \
9240 License-$(VBOX_LICENSE_VER).html \
9241 $(foreach f,$(VBOX_INSTALLER_ADD_LANGUAGES),License-$(VBOX_LICENSE_VER)-$(f).html)
9242 VBOX_LICENSE_BINS = $(addprefix $(PATH_STAGE_BIN)/,$(VBOX_LICENSE_FILES))
9243 endif
9244 endif
9245endif
9246
9247
9248ifeq ($(KBUILD_TARGET),darwin)
9249 $(VBOX_DARWIN_ENTITLEMENTS_FILE):
9250 $(call MSG_GENERATE,,$@)
9251 $(QUIET)$(MKDIR) -p $(@D)
9252 $(QUIET)$(RM) -f $@ $@.tmp
9253 $(QUIET)$(APPEND) $@.tmp '<?xml version="1.0" encoding="UTF-8"?>'
9254 $(QUIET)$(APPEND) $@.tmp '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">'
9255 $(QUIET)$(APPEND) $@.tmp '<plist version="1.0">'
9256 $(QUIET)$(APPEND) $@.tmp '<dict>'
9257 $(QUIET)$(APPEND) -n $@.tmp $(foreach entitlement,$(VBOX_DARWIN_ENTITLEMENTS_LIST_COMMON), ' <key>$(entitlement)</key><true/>')
9258 $(QUIET)$(APPEND) $@.tmp '</dict>'
9259 $(QUIET)$(APPEND) $@.tmp '</plist>'
9260 $(QUIET)$(MV) -f $@.tmp $@
9261
9262 $(VBOX_DARWIN_ENTITLEMENTS_FILE_VM):
9263 $(call MSG_GENERATE,,$@)
9264 $(QUIET)$(MKDIR) -p $(@D)
9265 $(QUIET)$(RM) -f $@ $@.tmp
9266 $(QUIET)$(APPEND) $@.tmp '<?xml version="1.0" encoding="UTF-8"?>'
9267 $(QUIET)$(APPEND) $@.tmp '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">'
9268 $(QUIET)$(APPEND) $@.tmp '<plist version="1.0">'
9269 $(QUIET)$(APPEND) $@.tmp '<dict>'
9270 $(QUIET)$(APPEND) -n $@.tmp $(foreach entitlement,$(VBOX_DARWIN_ENTITLEMENTS_LIST_VM), ' <key>$(entitlement)</key><true/>')
9271 $(QUIET)$(APPEND) $@.tmp '</dict>'
9272 $(QUIET)$(APPEND) $@.tmp '</plist>'
9273 $(QUIET)$(MV) -f $@.tmp $@
9274endif
9275
9276ifndef VBOX_NOINC_MISC
9277 # Force building of the version header file as the first thing anywhere in
9278 # the tree. This eliminates the need for manual dependencies on it.
9279 ## @todo there gotta be a better way of doing this.
9280 Makefile.kmk: | $(VBOX_VERSION_HEADER) $(VBOX_VERSION_MK) $(VBOX_PRODUCT_HEADER) $(VBOX_PACKAGE_HEADER)
9281 ifeq ($(KBUILD_TARGET),darwin)
9282 Makefile.kmk: | $(VBOX_DARWIN_ENTITLEMENTS_FILE) $(VBOX_DARWIN_ENTITLEMENTS_FILE_VM)
9283 endif
9284endif
9285
9286
9287#
9288# Subversion tree revision.
9289#
9290# The VBOX_SVN_REV contains our best guess. Use svn info on the root of the
9291# tree to determine this it if .svn/wc.db or .svn/entries is found (the former
9292# also up to two directory levels higher to allow for checkouts of the entire
9293# repository), otherwise fall back on maximum value of Config.kmk and
9294# Version.kmk revision.
9295#
9296# Makefile rules using this information shall list $(VBOX_SVN_REV_KMK) as a
9297# prerequisite.
9298#
9299SVN ?= svn$(HOSTSUFF_EXE)
9300VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk
9301ifndef VBOX_SVN_REV
9302 VBOX_SVN_REV_CONFIG_FALLBACK := $(patsubst %:,, $Rev: 106925 $ )
9303 VBOX_SVN_REV_FALLBACK := $(if-expr $(VBOX_SVN_REV_CONFIG_FALLBACK) > $(VBOX_SVN_REV_VERSION_FALLBACK),$(VBOX_SVN_REV_CONFIG_FALLBACK),$(VBOX_SVN_REV_VERSION_FALLBACK))
9304 VBOX_SVN_DEP := $(firstword $(wildcard $(PATH_ROOT)/.svn/wc.db $(abspath $(PATH_ROOT)/../.svn/wc.db) $(abspath $(PATH_ROOT)/../../.svn/wc.db) $(PATH_ROOT)/.svn/entries))
9305 ifeq ($(which $(SVN)),)
9306 VBOX_SVN_DEP :=
9307 endif
9308
9309 # Rule for generating a timestamp and updating the real thing on change.
9310 $(VBOX_SVN_REV_KMK).ts +| $(VBOX_SVN_REV_KMK): $(if $(VBOX_SVN_DEP), $(VBOX_SVN_DEP), $(PATH_ROOT)/Config.kmk)
9311 $(call MSG_GENERATE,,$(VBOX_SVN_REV_KMK))
9312 $(QUIET)$(RM) -f $@ $@.tmp
9313 $(QUIET)$(MKDIR) -p $(@D)
9314 ifneq ($(VBOX_SVN_DEP),)
9315 -$(REDIRECT) -E 'LC_ALL=C' -wo $@.tmp -- $(SVN) info $(PATH_ROOT)
9316 # Append fallback. Will be ignored if "svn info" provides meaningful data.
9317 $(QUIET)$(APPEND) $@.tmp 'Last Changed Rev: $(VBOX_SVN_REV_FALLBACK)'
9318 $(SED) -e '/^Last Changed Rev/!d' -e 's/Last Changed Rev\: */export VBOX_SVN_REV=/; t a; :a q' --output $@ $@.tmp
9319 $(QUIET)$(RM) -f $@.tmp
9320 else
9321 $(QUIET)$(APPEND) $@ 'export VBOX_SVN_REV=$(VBOX_SVN_REV_FALLBACK)'
9322 endif
9323 $(QUIET)$(CP) --changed -fv $@ $(VBOX_SVN_REV_KMK)
9324
9325 ifndef VBOX_NOINC_SVN_REV_KMK
9326 include $(VBOX_SVN_REV_KMK)
9327 endif
9328else
9329 # allow to overwrite VBOX_SVN_REV externally (mainly for building .debs/.rpms)
9330 $(VBOX_SVN_REV_KMK):
9331 $(call MSG_GENERATE,,$(VBOX_SVN_REV_KMK))
9332 $(QUIET)$(RM) -f $@
9333 $(QUIET)$(MKDIR) -p $(@D)
9334 $(QUIET)$(APPEND) $@ 'export VBOX_SVN_REV=$(VBOX_SVN_REV)'
9335 $(QUIET)echo '* $(VBOX_SVN_REV_KMK) was externally overwritten:'
9336 $(QUIET)$(CAT) $(VBOX_SVN_REV_KMK)
9337endif
9338
9339# only needed for VBoxGuest for Linux/FreeBSD guests
9340VBOX_SVN_REV_HEADER = $(PATH_OUT)/revision-generated.h
9341$(VBOX_SVN_REV_HEADER): $(VBOX_SVN_REV_KMK)
9342 $(call MSG_GENERATE,,$@)
9343 $(QUIET)$(RM) -f $@ $@.tmp
9344 $(QUIET)$(MKDIR) -p $(@D)
9345 $(QUIET)$(APPEND) $@.tmp '#define VBOX_SVN_REV $(VBOX_SVN_REV)'
9346 $(QUIET)$(MV) -f $@.tmp $@
9347
9348#
9349# Shared definitions of the XIDL file to use as a source for
9350# generating various other files (VBoxSVC, webservice, docs, front-ends, ...)
9351#
9352
9353# Real XIDL source file; from this we strip the <desc> elements to generate
9354# a second XIDL file, from which the COM/XPCOM IDL files are then generated:
9355VBOX_XIDL_FILE_SRC = $(PATH_ROOT)/src/VBox/Main/idl/VirtualBox.xidl
9356# second XIDL file to use as source for COM/XPCOM IDL (with stripped docs):
9357VBOX_XIDL_FILE = $(PATH_OUT)/obj/VirtualBox_stripped.xidl
9358
9359
9360#
9361# VBOX_SEP needs to be quoted when used on the shell command line.
9362#
9363if1of ($(KBUILD_TARGET), os2 win)
9364 VBOX_SEP = $(SEMICOLON)
9365else
9366 VBOX_SEP = $(COLON)
9367endif
9368
9369# Java compiler options, needs some version checking.
9370if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 110000
9371 VBOX_JAVA_WS_PATH ?= /usr/share/java
9372 VBOX_JAVA_WS_EXTRA_JARS ?= $(VBOX_JAVA_WS_PATH)/jws-api.jar$(VBOX_SEP)$(VBOX_JAVA_WS_PATH)/jaxb-api.jar$(VBOX_SEP)$(VBOX_JAVA_WS_PATH)/jaxws-api.jar
9373else if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 10900
9374 VBOX_JAVA_WS_OPTS ?= --add-modules java.xml.ws
9375endif
9376if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 110000
9377 VBOX_JAVAC_OPTS = -encoding UTF-8 -source 9 -target 9 -Xlint:unchecked
9378else if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 90000
9379 VBOX_JAVAC_OPTS = -encoding UTF-8 -source 6 -target 6 -Xlint:unchecked
9380else
9381 VBOX_JAVAC_OPTS = -encoding UTF-8 -source 1.5 -target 1.5 -Xlint:unchecked
9382endif
9383VBOX_JAVADOC_OPTS = -encoding UTF-8
9384
9385
9386#
9387# Legacy.
9388#
9389## @todo try remove this.
9390ifneq ($(LOCALCFG),)
9391 include $(LOCALCFG)
9392endif
9393
9394
9395#
9396# For efficiently build serveral build types / archs.
9397#
9398both-debug-release both-release-debug: \
9399 build-release-$(KBUILD_TARGET_ARCH) \
9400 build-debug-$(KBUILD_TARGET_ARCH)
9401both-x86-amd64 both-amd64-x86: \
9402 build-$(KBUILD_TYPE)-x86 \
9403 build-$(KBUILD_TYPE)-x86
9404both-types-archs both-archs-types: \
9405 build-debug-x86 \
9406 build-release-x86 \
9407 build-debug-amd64 \
9408 build-release-amd64
9409
9410build-release-x86:
9411 +$(MAKE) KBUILD_TYPE=release KBUILD_TARGET_ARCH=x86
9412
9413build-debug-x86:
9414 +$(MAKE) KBUILD_TYPE=debug KBUILD_TARGET_ARCH=x86
9415
9416build-release-amd64:
9417 +$(MAKE) KBUILD_TYPE=release KBUILD_TARGET_ARCH=amd64
9418
9419build-debug-amd64:
9420 +$(MAKE) KBUILD_TYPE=debug KBUILD_TARGET_ARCH=amd64
9421
9422build-release-arm64:
9423 +$(MAKE) KBUILD_TYPE=release KBUILD_TARGET_ARCH=arm64
9424
9425build-debug-arm64:
9426 +$(MAKE) KBUILD_TYPE=debug KBUILD_TARGET_ARCH=arm64
9427
9428
9429#
9430# Some extra goals.
9431#
9432.PHONY: up update st stat status
9433up update::
9434 $(SVN) up
9435
9436up2 update2::
9437 $(SVN) up --ignore-externals
9438
9439st stat status:
9440 $(SVN) status
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