VirtualBox

source: vbox/trunk/Config.kmk

Last change on this file was 107019, checked in by vboxsync, 10 days ago

/Config.kmk,tools/Makefile.kmk,Add/3d/VBoxICD/Makefile.kmk: Switch to VCC143 for amd64 & x86 (windows) - requires symlink creation rigths for the tools. jiraref:VBP-1439

This means we'll be using the same compiler versions for all three windows architectures (arm64 already uses VCC143).
We cannot upgrade the SDK for amd64 & x86, though, because there are no x86 kernel mode libs in 10.0.26000.0 and neither are there any amd64 libs for win7 kernel mode any more.

WARNING! For fetching the tools you need symbolic link creation rights. See comments above the win.vcc.v14.3.17.11.5 tool in tools/Makefile.kmk for details.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 440.0 KB
Line 
1# $Id: Config.kmk 107019 2024-11-15 22:15:20Z 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
1150ifndef VBOX_WITH_DRIVERLESS_FORCED # No need for hardening when not using the driver.
1151 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.arm64)
1152 # Enables minimal driver hardening (windows only).
1153 VBOX_WITH_MINIMAL_HARDENING := 1
1154 else
1155 # Enables hardening.
1156 # Most developers will want to disable this in their LocalConfig.kmk (VBOX_WITHOUT_HARDENING := 1).
1157 VBOX_WITH_HARDENING := 1
1158 endif
1159endif
1160# Where the application files are (going to be) installed.
1161#VBOX_PATH_APP_PRIVATE = /usr/lib/virtualbox
1162ifdef VBOX_WITH_HARDENING
1163 if1of ($(KBUILD_TARGET), linux solaris)
1164 VBOX_PATH_APP_PRIVATE = /opt/VirtualBox
1165 else ifeq ($(KBUILD_TARGET),darwin)
1166 VBOX_PATH_APP_PRIVATE = /Applications/VirtualBox.app/Contents/MacOS
1167 else ifeq ($(KBUILD_TARGET),freebsd)
1168 VBOX_PATH_APP_PRIVATE = /usr/local/lib/virtualbox
1169 else ifeq ($(KBUILD_TARGET),haiku)
1170 VBOX_PATH_APP_PRIVATE = /boot/system/apps/VirtualBox
1171 endif
1172endif
1173# Where the architecture specific application files are (going to be) installed.
1174#VBOX_PATH_APP_PRIVATE_ARCH = /usr/lib/virtualbox
1175ifdef VBOX_WITH_HARDENING
1176 if1of ($(KBUILD_TARGET), solaris)
1177 VBOX_PATH_APP_PRIVATE_ARCH_TOP = $(VBOX_PATH_APP_PRIVATE)
1178 VBOX_PATH_APP_PRIVATE_ARCH = $(VBOX_PATH_APP_PRIVATE_ARCH_TOP)/$(if-expr $(KBUILD_TARGET_ARCH) == "amd64",amd64,i386)
1179 else ifdef VBOX_PATH_APP_PRIVATE
1180 VBOX_PATH_APP_PRIVATE_ARCH = $(VBOX_PATH_APP_PRIVATE)
1181 endif
1182endif
1183# Where the shared libraries are (going to be) installed.
1184#VBOX_PATH_SHARED_LIBS = /usr/lib
1185ifdef VBOX_WITH_HARDENING
1186 if1of ($(KBUILD_TARGET), solaris)
1187 VBOX_PATH_SHARED_LIBS = $(VBOX_PATH_APP_PRIVATE)/$(if-expr $(KBUILD_TARGET_ARCH) == "amd64",amd64,i386)
1188 else ifdef VBOX_PATH_APP_PRIVATE
1189 VBOX_PATH_SHARED_LIBS = $(VBOX_PATH_APP_PRIVATE)
1190 endif
1191endif
1192# Where the documentation is (going to be) installed.
1193#VBOX_PATH_APP_DOCS = /usr/share/doc/virtualbox
1194ifdef VBOX_WITH_HARDENING
1195 ifdef VBOX_PATH_APP_PRIVATE
1196 VBOX_PATH_APP_DOCS = $(VBOX_PATH_APP_PRIVATE)
1197 endif
1198endif
1199# The DT_RPATH/DT_RUNPATH to embed into the binaries (ELF).
1200# (This one is used for all binaries, there is no need to adjust this
1201# depending on the location of the object.)
1202#VBOX_WITH_RUNPATH = /usr/lib/virtualbox
1203ifdef VBOX_WITH_HARDENING
1204 if1of ($(KBUILD_TARGET), solaris)
1205 VBOX_WITH_RUNPATH = $(VBOX_PATH_APP_PRIVATE)/$(if-expr $(KBUILD_TARGET_ARCH) == "amd64",amd64,i386)
1206 else if1of ($(KBUILD_TARGET), freebsd linux)
1207 VBOX_WITH_RUNPATH = $(VBOX_PATH_APP_PRIVATE)
1208 endif
1209endif
1210# Enable use of the $ORIGIN DT_RPATH/DT_RUNPATH feature (ELF).
1211# Because of the setuid usage on all ELF platforms when hardening the build
1212# things gets a bit complicated since the $ORIGIN+setuid policy differs.
1213#VBOX_WITH_ORIGIN = 1
1214ifndef VBOX_WITH_HARDENING
1215 if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd solaris) # duplicated further down
1216 VBOX_WITH_ORIGIN = 1
1217 endif
1218endif
1219# Building windows without a kernel code signing certificate (as good as
1220# impossible to get these days, so enabled by default).
1221VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT = 1
1222# Enable the system wide support service/daemon.
1223# Very sketchy work in progress.
1224#VBOX_WITH_SUPSVC = 1
1225
1226# Continue to support Vista w/o any service pack, at least for now.
1227VBOX_WITH_VISTA_NO_SP = 1
1228ifdef VBOX_WITH_VBOXDRV
1229 # Enable image verification on darwin @bugref{9232}.
1230 VBOX_WITH_DARWIN_R0_DARWIN_IMAGE_VERIFICATION = 1
1231endif
1232## @}
1233
1234
1235# Strip binaries of release and profile builds before packing them into the installer
1236# archive. When building .deb/.rpms, don't strip the symbols as they are required for
1237# the debug packages containing symbols for gdb located in /usr/lib/debug.
1238# In rpm Additions we also need to do part of packing without strip.
1239ifndef VBOX_ONLY_RPM_ADDITIONS
1240 VBOX_DO_STRIP := $(if $(filter release profile,$(KBUILD_TYPE)),1,)
1241endif
1242
1243
1244#
1245# Config items for enabling work in progress.
1246#
1247# It's good pratice to add stuff here even if it is currently disabled by
1248# default.
1249#
1250# Note! Please, do *not* add stuff to the global DEFS unless it is *really*
1251# necessary! The other guys will hate for it you when they have to
1252# recompile everything when the feature is enabled or disabled. Put
1253# the ifdefs in target or template definitions.
1254#
1255
1256# Mask all Local APIC interrupt vectors which are set up to NMI mode when switching
1257# to/from the guest in raw mode. Modern Linux kernels use the performance counter
1258# to raise an NMI from time to time.
1259if1of ($(KBUILD_TARGET), linux)
1260 VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI = 1
1261endif
1262## For testing deadlock detection and lock order validation.
1263# If issues are found, create high priority defects and temporarily comment
1264# the next line.
1265VBOX_WITH_STRICT_LOCKS = 1
1266## VBoxSDS is the bridge windows service that sits between
1267# VirtualBox object client and VBoxSVC that fixes problem
1268# when multiple VBoxSVC starts for the same user
1269# it is enabled for windows build only
1270ifeq ($(KBUILD_TARGET),win)
1271 VBOX_WITH_SDS = 1
1272endif
1273
1274#
1275# To make it easier to build the host side VBox bits and not have to
1276# care about multiple page sizes right now.
1277#
1278ifdef VBOX_WITH_16K_PAGE_SIZE_ON_LINUX_ARM64
1279 VBOX_WITH_STATIC_ARM64_PAGE_SHIFT = 14
1280else
1281 ifdef VBOX_WITH_4K_PAGE_SIZE_ON_LINUX_ARM64
1282 VBOX_WITH_STATIC_ARM64_PAGE_SHIFT = 10
1283 else
1284 ifdef VBOX_WITH_64K_PAGE_SIZE_ON_LINUX_ARM64
1285 VBOX_WITH_STATIC_ARM64_PAGE_SHIFT = 16
1286 endif
1287 endif
1288endif
1289
1290#
1291# Branding
1292#
1293VBOX_BRAND_BIOS_LOGO := $(PATH_ROOT)/src/VBox/Devices/Graphics/BIOS/vbox_bios_splash_oracle.bmp
1294VBOX_BRAND_LICENSE_HTML := $(PATH_ROOT)/doc/License-gpl-3.0.html
1295VBOX_BRAND_LICENSE_RTF := $(PATH_ROOT)/doc/License-gpl-3.0.rtf
1296VBOX_BRAND_LICENSE_TXT := $(PATH_ROOT)/doc/License-gpl-3.0.txt
1297VBOX_BRAND_LICENSE_VER :=
1298VBOX_BRAND_GUI_ABOUT_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about.png
1299VBOX_BRAND_GUI_ABOUT_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_x2.png
1300VBOX_BRAND_GUI_ABOUT_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_x3.png
1301VBOX_BRAND_GUI_ABOUT_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_x4.png
1302VBOX_BRAND_GUI_ABOUT_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px.png
1303VBOX_BRAND_GUI_ABOUT_16PX_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px_x2.png
1304VBOX_BRAND_GUI_ABOUT_16PX_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px_x3.png
1305VBOX_BRAND_GUI_ABOUT_16PX_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/about_16px_x4.png
1306VBOX_BRAND_GUI_VBOX_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_16px.png
1307VBOX_BRAND_GUI_VBOX_20PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_20px.png
1308VBOX_BRAND_GUI_VBOX_32PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_32px.png
1309VBOX_BRAND_GUI_VBOX_40PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_40px.png
1310VBOX_BRAND_GUI_VBOX_48PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_48px.png
1311VBOX_BRAND_GUI_VBOX_64PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/NonOSE/VirtualBox_64px.png
1312VBOX_BRAND_GUI_VBOX_SVG := $(PATH_ROOT)/src/VBox/Artwork/NonOSE/virtualbox.svg
1313VBOX_BRAND_WIN_INST_DLGJPG := $(PATH_ROOT)/src/VBox/Installer/win/Binary/Dialog.jpg
1314VBOX_BRAND_WIN_INST_EXT :=
1315VBOX_BRAND_WIN_ADD_INST_DLGBMP := $(PATH_ROOT)/src/VBox/Additions/WINNT/Installer/welcome.bmp
1316VBOX_BRAND_DARWIN_DISKIMAGE_DS_STORE := $(PATH_ROOT)/src/VBox/Installer/darwin/DiskImage/DS_Store
1317VBOX_BRAND_DARWIN_DISKIMAGE_BG := $(PATH_ROOT)/src/VBox/Installer/darwin/DiskImage/vbox_folder.tiff
1318VBOX_BRAND_DARWIN_INSTALLER_BG := $(PATH_ROOT)/src/VBox/Installer/darwin/VirtualBox_mpkg/background.tif
1319
1320#
1321# Skip stuff.
1322#
1323
1324ifdef VBOX_ONLY_EXTPACKS
1325 # Clear some VBOX_WITH_XXX variables instead of adding ifdefs all over the place.
1326 VBOX_WITH_DEBUGGER =
1327 VBOX_WITH_ADDITIONS =
1328 VBOX_WITH_VBOXDRV =
1329 VBOX_WITH_TESTCASES =
1330endif
1331
1332# VBOX_QUICK can be used by core developers to speed to the build
1333ifdef VBOX_QUICK
1334 # undefine variables by assigning blank.
1335 VBOX_WITH_ADDITIONS =
1336 VBOX_WITH_VALIDATIONKIT =
1337 VBOX_WITH_TESTCASES =
1338 VBOX_WITH_VBOXSDL =
1339 VBOX_WITH_HEADLESS =
1340 VBOX_WITH_VRDP =
1341 VBOX_WITH_VRDP_RDESKTOP =
1342 VBOX_WITH_DOCS =
1343 VBOX_WITH_WEBSERVICES =
1344 VBOX_WITH_32_ON_64_MAIN_API =
1345endif # VBOX_QUICK
1346
1347# Only AMD64 is supported for the main product, so disable most of the other bits.
1348ifn1of ($(KBUILD_TARGET_ARCH), $(VBOX_SUPPORTED_HOST_ARCHS))
1349 VBOX_WITH_MAIN =
1350 VBOX_WITH_QTGUI =
1351 VBOX_WITH_VBOXSDL =
1352 VBOX_WITH_VBOXHEADLESS =
1353 VBOX_WITH_WEBSERVICES =
1354 VBOX_WITH_DEBUGGER_GUI =
1355endif
1356
1357ifeq ($(KBUILD_TARGET),darwin)
1358 VBOX_WITH_VRDP_RDESKTOP =
1359 # Permanent (no working SDL).
1360 VBOX_WITH_VBOXSDL =
1361
1362 ifeq ($(KBUILD_TARGET_ARCH),arm64)
1363 # No Qt yet, so no GUI, NLS or qhelp.
1364 VBOX_WITH_NLS :=
1365 VBOX_WITH_MAIN_NLS :=
1366 VBOX_WITH_PUEL_NLS :=
1367 VBOX_WITH_VBOXMANAGE_NLS :=
1368 VBOX_WITH_DOCS_QHELP :=
1369 VBOX_WITH_DOCS_QHELP_PACKING :=
1370 # Skip webservices as those are tedious to build.
1371 VBOX_WITH_WEBSERVICES :=
1372 # Ditto for the java<->XPCOM bridge.
1373 VBOX_WITH_JXPCOM :=
1374 endif
1375endif
1376
1377ifeq ($(KBUILD_TARGET),freebsd)
1378 VBOX_WITH_DOCS =
1379endif
1380
1381ifeq ($(KBUILD_TARGET),haiku)
1382 VBOX_WITH_VRDP_RDESKTOP =
1383 # Permanent (no working SDL).
1384 VBOX_WITH_VBOXSDL =
1385 VBOX_WITH_DOCS =
1386 VBOX_WITH_VBOXDRV =
1387 VBOX_WITH_VRDP =
1388 VBOX_WITH_HEADLESS =
1389 VBOX_WITH_VBOXSDL =
1390 VBOX_WITH_QTGUI =
1391 # VBOX_WITH_MAIN=
1392 VBOX_WITH_DOCS =
1393 VBOX_WITH_ISCSI =
1394 VBOX_WITH_INIP =
1395 VBOX_WITH_INTERNAL_NETWORKING =
1396 VBOX_WITH_PDM_ASYNC_COMPLETION =
1397 VBOX_WITHOUT_HARDENING = 1
1398endif
1399
1400
1401ifeq ($(KBUILD_TARGET),os2)
1402 VBOX_WITH_WEBSERVICES =
1403 VBOX_WITH_INSTALLER =
1404 VBOX_WITH_VRDP_AUTHMOD =
1405 VBOX_WITH_VRDP_RDESKTOP =
1406 VBOX_WITH_VALIDATIONKIT =
1407 VBOX_WITH_QTGUI =
1408 VBOX_WITH_USB =
1409 VBOX_WITH_EHCI =
1410 VBOX_WITH_DOCS =
1411 VBOX_WITH_PDM_ASYNC_COMPLETION =
1412 VBOX_WITHOUT_HARDENING = 1
1413endif
1414
1415ifeq ($(KBUILD_TARGET),win)
1416 VBOX_WITH_VRDP_RDESKTOP =
1417endif
1418
1419ifn1of ($(KBUILD_TARGET_ARCH), x86 amd64 arm64)
1420 VBOX_WITH_ADDITION_DRIVERS =
1421 VBOX_WITH_DEBUGGER =
1422 VBOX_WITH_DOCS =
1423 VBOX_WITH_EHCI =
1424 VBOX_WITHOUT_HARDENING = 1
1425 VBOX_WITH_HEADLESS =
1426 VBOX_WITH_HGCM =
1427 VBOX_WITH_HGSMI =
1428 VBOX_WITH_INIP =
1429 VBOX_WITH_INSTALLER =
1430 VBOX_WITH_INTERNAL_NETWORKING =
1431 VBOX_WITH_ISCSI =
1432 VBOX_WITH_MAIN =
1433 VBOX_WITH_PDM_ASYNC_COMPLETION =
1434 VBOX_WITH_QTGUI =
1435 VBOX_WITH_RAW_MODE =
1436 VBOX_WITH_VALIDATIONKIT =
1437 VBOX_WITH_USB =
1438 VBOX_WITH_VBOXDRV =
1439 VBOX_WITH_VBOXSDL =
1440 VBOX_WITH_WEBSERVICES =
1441 VBOX_WITH_XPCOM =
1442 VBOX_WITHOUT_HARDENING = 1
1443 # remove later:
1444 VBOX_WITH_VRDP =
1445 VBOX_WITH_VRDP_AUTHMOD =
1446 VBOX_WITH_VRDP_RDESKTOP =
1447endif
1448
1449
1450#
1451# Include automatic and local config file to override the above settings
1452# and to provide defaults for the settings below this point.
1453#
1454ifndef AUTOCFG
1455 AUTOCFG := $(wildcard $(PATH_ROOT)/AutoConfig.kmk)
1456endif
1457ifneq ($(AUTOCFG),)
1458 include $(AUTOCFG)
1459endif
1460
1461ifndef LOCALCFG
1462 LOCALCFG := $(wildcard $(PATH_ROOT)/LocalConfig.kmk)
1463 ifneq ($(LOCALCFG),)
1464 include $(LOCALCFG)
1465 endif
1466else
1467 # Ignore it if it doesn't exist.
1468 if exists "$(LOCALCFG)"
1469 include $(LOCALCFG)
1470 else
1471 $(warning LOCALCFG='$(LOCALCFG)' does not exist)
1472 override LOCALCFG :=
1473 endif
1474endif
1475
1476
1477#
1478# Configure 'parfait' and 'parfait-dbg' builds.
1479#
1480# We ASSUME that anyone doing this kind of build has the parfait tools
1481# package already fetched using:
1482# kmk VBOX_WITH_PARFAIT=1 -C tools fetch
1483#
1484if1of ($(KBUILD_TYPE), parfait parfait-dbg)
1485 VBOX_WITH_PARFAIT := 1
1486 VBOX_WITHOUT_PRECOMPILED_HEADERS := 1 # @todo Remove when working everywhere
1487endif
1488
1489
1490if defined(VBOX_WITH_PARFAIT)
1491 #
1492 # This includes the tool overrides for running with parfait.
1493 # Ideally there would be a dedicated parfait tool but when targetting
1494 # different hosts with different compiler toolchains and compiler flags
1495 # we would have to duplicate a lot of the already existing tools for each
1496 # supported toolchain. Instead we just override the paths to the compilers
1497 # for the currently used tools (as this is kind of static and doesn't change that often).
1498 # To not clutter this file too much this lives in a separate file.
1499 #
1500 include $(PATH_ROOT)/tools/ParfaitConfig.kmk
1501endif
1502
1503
1504#
1505# Allow overriding the branding information from an external file
1506#
1507ifdef VBOX_BRANDING_CFG
1508 include $(VBOX_BRANDING_CFG)
1509endif
1510
1511#
1512# Bitch about old settings.
1513#
1514ifdef VBOX_WITHOUT_LINUX_COMPILER_H
1515 $(warning VBOX_WITHOUT_LINUX_COMPILER_H was renamed to VBOX_WITH_LINUX_COMPILER_H, the meaning is inverted.)
1516endif
1517
1518#
1519# Indicate VBOX_ONLY build if any of the VBOX_ONLY_* variables are set.
1520#
1521VBOX_ONLY_BUILD_NEW := $(strip $(foreach x, ADDITIONS DOCS EXTPACKS SDK VALIDATIONKIT \
1522 , $(if-expr defined(VBOX_ONLY_$(x)),VBOX_ONLY_$(x))))
1523ifneq ($(VBOX_ONLY_BUILD),$(VBOX_ONLY_BUILD_NEW))
1524 $(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))
1525endif
1526
1527#
1528# Enforce VBOX_WITH_NLS. It controls all NLS (except the GUI at the moment).
1529#
1530if defined(VBOX_WITH_MAIN_NLS) || defined(VBOX_WITH_PUEL_NLS) || defined(VBOX_WITH_VBOXMANAGE_NLS)
1531 VBOX_WITH_NLS := 1
1532 ifndef VBOX_WITH_NLS # (We test again to account for 'override VBOX_WITH_NLS :=')
1533 VBOX_WITH_MAIN_NLS :=
1534 VBOX_WITH_PUEL_NLS :=
1535 VBOX_WITH_VBOXMANAGE_NLS :=
1536 endif
1537endif
1538
1539#
1540# For the docs build box.
1541#
1542ifdef VBOX_ONLY_DOCS
1543 # Always produce HTML docs (for publishing on website as part of release)
1544 VBOX_WITH_DOCS_HTML = 1
1545 # Always produce QHelp docs (for help in the UI, replacing CHM)
1546 VBOX_WITH_DOCS_QHELP = 1
1547 VBOX_WITH_TOOLS_QT_LINUX = 1
1548endif
1549
1550#
1551# Disable components that are not open sourced.
1552#
1553ifdef VBOX_OSE
1554 VBOX_WITH_VRDP =
1555 VBOX_WITH_USB_VIDEO_IMPL =
1556 VBOX_WITH_NVME_IMPL =
1557 VBOX_WITH_EXTPACK_PUEL =
1558 VBOX_WITH_EXTPACK_PUEL_BUILD =
1559 VBOX_WITH_PCI_PASSTHROUGH_IMPL =
1560 VBOX_WITH_OS2_ADDITIONS_BIN =
1561 VBOX_WITH_LIBSSH =
1562 # not yet
1563 VBOX_WITH_PLUGIN_CRYPT =
1564 VBOX_WITH_DRAG_AND_DROP_PROMISES =
1565 ifn1of ($(KBUILD_TARGET), linux)
1566 VBOX_WITH_DOCS =
1567 VBOX_WITH_DOCS_PACKING =
1568 endif
1569 if1of ($(KBUILD_TARGET), solaris)
1570 VBOX_WITH_32_ON_64_MAIN_API =
1571 endif
1572 if1of ($(KBUILD_TARGET), win)
1573 # tar/gzip uncommon on Windows
1574 VBOX_WITH_EXTPACK_VBOXDTRACE =
1575 endif
1576 # Enable any translations in OSE, even partial ones.
1577 ifndef ($(VBOX_NO_DOCS_TRANSLATIONS))
1578 VBOX_WITH_DOCS_TRANSLATIONS = 1
1579 endif
1580 VBOX_WITH_INTEL_PXE =
1581 # Disable for OSE, requires snv_159+.
1582 VBOX_WITH_NETFLT_CROSSBOW =
1583 ifn1of ($(KBUILD_TARGET), darwin linux solaris win)
1584 VBOX_WITH_INSTALLER =
1585 endif
1586 if1of ($(KBUILD_TARGET), win)
1587 # Undefine codec libraries which are not needed.
1588 VBOX_WITH_LIBVPX =
1589 VBOX_WITH_LIBVORBIS =
1590 VBOX_WITH_LIBOGG =
1591 # Disable recording (with audio support).
1592 VBOX_WITH_RECORDING =
1593 VBOX_WITH_AUDIO_RECORDING =
1594 endif
1595 # branding
1596 VBOX_BRAND_LICENSE_HTML := $(PATH_ROOT)/doc/License-gpl-3.0.html
1597 VBOX_BRAND_LICENSE_RTF := $(PATH_ROOT)/doc/License-gpl-3.0.rtf
1598 VBOX_BRAND_LICENSE_TXT := $(PATH_ROOT)/doc/License-gpl-3.0.txt
1599 VBOX_BRAND_LICENSE_VER :=
1600 VBOX_BRAND_BIOS_LOGO := $(PATH_ROOT)/src/VBox/Devices/Graphics/BIOS/vbox_bios_splash.bmp
1601 VBOX_BRAND_GUI_ABOUT_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about.png
1602 VBOX_BRAND_GUI_ABOUT_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_x2.png
1603 VBOX_BRAND_GUI_ABOUT_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_x3.png
1604 VBOX_BRAND_GUI_ABOUT_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_x4.png
1605 VBOX_BRAND_GUI_ABOUT_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px.png
1606 VBOX_BRAND_GUI_ABOUT_16PX_X2_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px_x2.png
1607 VBOX_BRAND_GUI_ABOUT_16PX_X3_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px_x3.png
1608 VBOX_BRAND_GUI_ABOUT_16PX_X4_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/about_16px_x4.png
1609 VBOX_BRAND_GUI_VBOX_16PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_16px.png
1610 VBOX_BRAND_GUI_VBOX_20PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_20px.png
1611 VBOX_BRAND_GUI_VBOX_32PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_32px.png
1612 VBOX_BRAND_GUI_VBOX_40PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_40px.png
1613 VBOX_BRAND_GUI_VBOX_48PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_48px.png
1614 VBOX_BRAND_GUI_VBOX_64PX_PNG := $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_64px.png
1615 VBOX_BRAND_GUI_VBOX_SVG := $(PATH_ROOT)/src/VBox/Artwork/OSE/virtualbox.svg
1616endif
1617
1618#
1619# VBOX_WITHOUT_HARDENING is for developers (put in LocalConfig.kmk).
1620# Note that this is a bit rough since hardening governs more than one
1621# variable... Also note that we allow VBOX_WITH_HARDENING=1 on the
1622# command line to overrule VBOX_WITHOUT_HARDENING (the check below).
1623#
1624ifdef VBOX_WITHOUT_HARDENING
1625 VBOX_WITH_HARDENING =
1626 ifeq ($(VBOX_WITH_HARDENING),)
1627 VBOX_PATH_APP_PRIVATE =
1628 VBOX_PATH_APP_PRIVATE_ARCH =
1629 VBOX_PATH_APP_PRIVATE_ARCH_TOP =
1630 VBOX_PATH_SHARED_LIBS =
1631 VBOX_PATH_APP_DOCS =
1632 VBOX_WITH_RUNPATH =
1633 if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd solaris) # duplicated up above
1634 VBOX_WITH_ORIGIN = 1
1635 endif
1636 endif
1637endif
1638
1639# Disable minimal hardening if no signing is configured.
1640if defined(VBOX_WITH_MINIMAL_HARDENING) && !defined(VBOX_SIGNING_MODE)
1641 VBOX_WITH_MINIMAL_HARDENING :=
1642endif
1643
1644#
1645# Sanitize the additions build config variables.
1646#
1647ifdef VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER
1648 VBOX_WITHOUT_ADDITIONS := 1
1649 ifdef VBOX_ONLY_ADDITIONS
1650 $(error VBOX_ONLY_ADDITIONS + VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER does not add up!)
1651 endif
1652endif
1653
1654ifdef VBOX_ONLY_ADDITIONS
1655 ifdef VBOX_WITHOUT_ADDITIONS
1656 $(error VBOX_ONLY_ADDITIONS + VBOX_WITHOUT_ADDITIONS does not add up!)
1657 endif
1658 ifndef VBOX_WITH_ADDITIONS
1659 $(error VBOX_ONLY_ADDITIONS + unset VBOX_WITH_ADDITIONS does not add up!)
1660 endif
1661endif
1662
1663ifdef VBOX_WITHOUT_ADDITIONS
1664 # Zap anything that could be contradicting this.
1665 VBOX_WITH_ADDITIONS :=
1666endif
1667
1668#
1669# Sanitize the documentation build config variables.
1670#
1671ifdef VBOX_WITH_DOCS_FROM_BUILD_SERVER
1672 VBOX_WITHOUT_DOCS := 1
1673 ifdef VBOX_ONLY_DOCS
1674 $(error VBOX_ONLY_DOCS + VBOX_WITH_DOCS_FROM_BUILD_SERVER does not add up!)
1675 endif
1676else ifeq ($(KBUILD_HOST),solaris)
1677 # We require JDK 17 for the user manual now, and since that isn't available for solaris
1678 # (see JEP-381) we're forced to get the docs from the doc build server or disable them.
1679 VBOX_WITHOUT_DOCS := 1
1680endif
1681
1682ifdef VBOX_ONLY_DOCS
1683 ifdef VBOX_WITHOUT_DOCS
1684 $(error VBOX_ONLY_DOCS + VBOX_WITHOUT_DOCS does not add up!)
1685 endif
1686endif
1687
1688ifdef VBOX_WITHOUT_DOCS
1689 # Zap anything that could be contradicting this.
1690 VBOX_WITH_DOCS :=
1691 VBOX_WITH_DOCS_QHELP :=
1692 VBOX_WITH_DOCS_HTML :=
1693endif
1694
1695#
1696# Disable components for headless
1697#
1698ifdef VBOX_HEADLESS
1699 VBOX_WITH_QTGUI =
1700 VBOX_WITH_VBOXSDL =
1701 VBOX_WITH_VRDP_RDESKTOP =
1702endif
1703
1704#
1705# Undefined VBOX_WITH_MAIN implies exclusion of a few more items.
1706#
1707ifndef VBOX_WITH_MAIN
1708 VBOX_WITH_VBOXSDL =
1709 VBOX_WITH_QTGUI =
1710 VBOX_WITH_DEBUGGER_GUI =
1711 VBOX_WITH_HEADLESS =
1712 ifdef VBOX_ONLY_DOCS
1713 $(error Oh, does VBOX_ONLY_DOCS actually end up here. sweet.)
1714 endif
1715 VBOX_WITH_DOCS =
1716endif
1717
1718ifdef VBOX_WITH_EXTPACK_PUEL_BUILD
1719 VBOX_WITH_EXTPACK_PUEL = 1
1720endif
1721
1722ifdef VBOX_WITH_TESTSUITE
1723 $(warning VBOX_WITH_TESTSUITE was renamed to VBOX_WITH_VALIDATIONKIT)
1724 VBOX_WITH_VALIDATIONKIT = $(VBOX_WITH_TESTSUITE)
1725endif
1726
1727
1728#
1729# Derived indicators.
1730#
1731
1732#
1733# Mark OSE builds clearly, helps figuring out limitations more easily.
1734#
1735ifdef VBOX_OSE
1736 # This can be overridden (e.g. in LocalConfig.kmk) by whoever publishes a set
1737 # of VirtualBox binaries. We request though that you always use something that
1738 # clearly identifies your build and makes it clear that it is not one done by
1739 # the VirtualBox team.
1740 VBOX_BUILD_PUBLISHER ?= _OSE
1741endif
1742
1743# Keep in sync with G_virtualBoxPackage in glue-jaxws.xsl and glue-java.xsl
1744# Changed with every new version, so beware!
1745if $(VBOX_VERSION_BUILD) < 51
1746 VBOX_API_VERSION = $(VBOX_VERSION_MAJOR)_$(VBOX_VERSION_MINOR)
1747else
1748 VBOX_API_VERSION = $(VBOX_VERSION_MAJOR)_$(expr $(VBOX_VERSION_MINOR) + 1)
1749endif
1750VBOX_API_SUFFIX = _$(VBOX_API_VERSION)
1751VBOX_JAVA_PACKAGE = org.virtualbox$(VBOX_API_SUFFIX)
1752
1753#
1754# Derived / helper config indicators. Not configurable.
1755#
1756
1757# Use the OpenGL module in qt when the video hardware acceleration feature
1758# is enabled.
1759if defined(VBOX_WITH_VIDEOHWACCEL) && defined(VBOX_WITH_QTGUI)
1760 VBOX_GUI_USE_QGL = 1
1761else
1762 VBOX_GUI_USE_QGL =
1763endif
1764
1765# Collection macro mainly for deciding whether VBoxDTrace needs shipping.
1766VBOX_WITH_DTRACE := $(if-expr defined(VBOX_WITH_DTRACE_R0) || defined(VBOX_WITH_DTRACE_R0DRV) \
1767 || defined(VBOX_WITH_DTRACE_R3) || defined(VBOX_WITH_DTRACE_RC),1,)
1768
1769# kSubmit / kWorker is only available on windows.
1770ifdef VBOX_USE_KSUBMIT
1771 ifeq ($(KBUILD_HOST),win)
1772 TOOL_VCC142AMD64_USE_KSUBMIT := 1
1773 TOOL_VCC142X86_USE_KSUBMIT := 1
1774 # TOOL_VCC120AMD64_USE_KSUBMIT := 1
1775 # TOOL_VCC120X86_USE_KSUBMIT := 1
1776 TOOL_VCC100AMD64_USE_KSUBMIT := 1
1777 TOOL_VCC100X86_USE_KSUBMIT := 1
1778 TOOL_QT5_USE_KSUBMIT := 1
1779 TOOL_OPENWATCOM_USE_KSUBMIT := 1
1780 TOOL_YASM_USE_KSUBMIT := 1
1781 TOOL_NASM_USE_KSUBMIT := 1
1782 TOOL_VBoxNasm_USE_KSUBMIT := 1
1783 else
1784 VBOX_USE_KSUBMIT :=
1785 endif
1786endif
1787
1788#
1789# Requested permissions to the host OS (only the entitlements
1790# crap on darwin for now).
1791#
1792ifeq ($(KBUILD_TARGET),darwin)
1793 #
1794 # Common entitlements for the main and VM process bundle.
1795 #
1796 # The following two are required in the main bundle even though they apply only to the VM
1797 # process. The issue is that TCC is looking up the primary bundle for these entitlements
1798 # and crashes the VM process if the entitlements are not here even though they are used
1799 # in the VM process only. This is not documented anywhere by Apple.
1800 # From Console.app when these are missing:
1801 # tccd: [com.apple.TCC:access] Prompting policy for hardened runtime; service:
1802 # kTCCServiceMicrophone requires entitlement com.apple.security.device.audio-input but it is missing for
1803 # RESP:{
1804 # ID: org.virtualbox.app.VirtualBox,
1805 # PID[17253],
1806 # auid: 501,
1807 # euid: 501,
1808 # responsible path: '/Applications/VirtualBox.app/Contents/MacOS/VirtualBox',
1809 # binary path: '/Applications/VirtualBox.app/Contents/MacOS/VirtualBox'
1810 # },
1811 # REQ:{
1812 # ID: org.virtualbox.app.VirtualBoxVM,
1813 # PID[17331],
1814 # auid: 501,
1815 # euid: 501,
1816 # binary path: '/Applications/VirtualBox.app/Contents/Resources/VirtualBoxVM.app/Contents/MacOS/VirtualBoxVM'
1817 # }
1818 VBOX_DARWIN_ENTITLEMENTS_LIST_COMMON := \
1819 com.apple.security.device.audio-input \
1820 com.apple.security.device.camera
1821
1822 #
1823 # The first two entitlements are required to get everything working
1824 # on Catalina which we want to keep supported for now:
1825 #
1826 # The first entitlement allows us to have unsigned executable memory in the guests
1827 # address space like the BIOS code (and essentially all the guests address space which
1828 # is mapped as RWX).
1829 # The second entitlement is required in order to map guest memory as RWX into the
1830 # guests address space.
1831 # These entitlements are not required starting with BigSur+ where Apple has clearly
1832 # changed something in their entitlement scheme without properly documenting it.
1833 #
1834 # allow-jit - for the recompiler in order to be able to generate and execute native code.
1835 # audio-input - recording audio from a guest.
1836 # camera - accessing the webcam from a guest.
1837 # usb - USB passthrough.
1838 # hypervisor - Hypervisor entitlement in order to be able to use Hypervisor.framework
1839 #
1840 VBOX_DARWIN_ENTITLEMENTS_LIST_VM := \
1841 $(VBOX_DARWIN_ENTITLEMENTS_LIST_COMMON) \
1842 com.apple.security.cs.allow-unsigned-executable-memory \
1843 com.apple.security.cs.disable-executable-page-protection \
1844 com.apple.security.cs.allow-jit \
1845 com.apple.security.device.usb \
1846 com.apple.security.hypervisor
1847
1848 #
1849 # The device-access and networking entitlements are reserved for
1850 # only specific vendors and are only available in release mode signing
1851 # (binaries signed with these entitlements in adhoc mode will just crash
1852 # with a code signing error).
1853 #
1854 ifeq ($(VBOX_SIGNING_MODE),release)
1855 VBOX_DARWIN_ENTITLEMENTS_LIST_VM += \
1856 com.apple.vm.device-access \
1857 com.apple.vm.networking
1858 endif
1859
1860 # Where the dynamic generated entitlements can be found.
1861 VBOX_DARWIN_ENTITLEMENTS_FILE := $(PATH_OUT)/Entitlements.plist
1862 VBOX_DARWIN_ENTITLEMENTS_FILE_VM := $(PATH_OUT)/EntitlementsVM.plist
1863endif
1864
1865
1866#
1867# List of OSes and architectures we may possibly try build on/for.
1868# This is used for the complicated assembler setup among other things.
1869#
1870VBOX_TARGET_OSES := freebsd darwin haiku linux netbsd openbsd solaris darwin os2 win
1871VBOX_TARGET_ARCHES := amd64 x86 arm64 sparc32 sparc64
1872
1873#
1874# VBOX_GCC_TOOL is the kBuild tool name for gcc or clang.
1875# VBOX_GCC32_TOOL is the same for 32-bit x86 code.
1876#
1877# Note! On Windows only the arm64 variant makes use of it.
1878#
1879ifndef VBOX_GCC_TOOL
1880 ifeq ($(KBUILD_TARGET),win)
1881 ifeq ($(KBUILD_TARGET_ARCH),arm64)
1882 VBOX_GCC_TOOL := VCC143-CLANGXX
1883 endif
1884 else ifeq ($(KBUILD_TARGET),os2)
1885 VBOX_GCC_TOOL := GXX3OMF
1886 else ifeq ($(KBUILD_TARGET),darwin)
1887 ifdef VBOX_WITH_EVEN_NEWER_XCODE
1888 VBOX_GCC_TOOL := CLANGXXMACHO
1889 DARWINCMN_TOOLCHAIN_DIRS_IGNORE_DEVTOOLS = 1# Use the system toolchains, not anything from tools/darwin.*.
1890 else ifdef VBOX_WITH_NEW_XCODE
1891 VBOX_GCC_TOOL := VBoxXcode62
1892 else
1893 VBOX_GCC_TOOL := GXX4MACHO
1894 endif
1895 else ifeq ($(KBUILD_TARGET),haiku)
1896 # Haiku shouldn't pass '-r' to the linker by default
1897 VBOX_GCC_TOOL := GXX3PLAIN
1898 else ifeq ($(KBUILD_TARGET),solaris)
1899 VBOX_GCC_TOOL := GXX3PLAIN
1900 VBOX_GCC32_TOOL := GCC3PLAIN
1901 ifeq ($(KBUILD_HOST),solaris)
1902 TOOL_GXX3PLAIN_LD_SYSMOD ?= /usr/ccs/bin/ld
1903 endif
1904 else
1905 VBOX_GCC_TOOL := GXX3
1906 ifeq ($(KBUILD_TARGET_ARCH).$(KBUILD_HOST_ARCH),x86.amd64) ## @todo mixing target/host here!
1907 VBOX_GCC_TOOL := GXX32
1908 VBOX_WITH_VBOXDRV =
1909 else ifeq ($(KBUILD_TARGET_ARCH).$(KBUILD_HOST_ARCH),amd64.x86)
1910 VBOX_GCC_TOOL := GXX64
1911 VBOX_WITH_VBOXDRV =
1912 endif
1913 endif
1914endif
1915
1916if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
1917 ifn1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.x86 win.amd64)
1918 ifndef VBOX_GCC32_TOOL
1919 ifeq ($(KBUILD_TARGET_ARCH),x86)
1920 VBOX_GCC32_TOOL := $(VBOX_GCC_TOOL)
1921 else
1922 VBOX_GCC32_TOOL := GCC32
1923 endif
1924 endif
1925 endif
1926endif
1927
1928#
1929# Decide which Visual C++ compiler version we're using by default.
1930#
1931ifndef VBOX_VCC_TOOL_STEM
1932 VBOX_VCC_TOOL_STEM := VCC143
1933else ifn1of ($(VBOX_VCC_TOOL_STEM), VCC141 VCC142 VCC143)
1934 $(error VBox: VBOX_VCC_TOOL_STEM='$(VBOX_VCC_TOOL_STEM)' is not supported, only 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# Temporary measure while kBuild / tools updates their define quoting.
1942#
1943ifdef KMK_WITH_QUOTING
1944 if ("$(VBOX_VCC_TOOL_STEM)" >= "VCC140" && "$(KBUILD_TARGET)" == "win") \
1945 || ("$(KBUILD_TARGET)" != "darwin" && "$(KBUILD_TARGET)" != "win" && "$(KMK_REVISION)" >= 3566) \
1946 || ("$(KBUILD_TARGET)" == "darwin" && "$(KMK_REVISION)" >= 3579)
1947 VBOX_WITH_AUTOMATIC_DEFS_QUOTING := 1
1948 endif
1949endif
1950
1951
1952#
1953# Image and object format config.
1954#
1955VBOX_LDR_FMT.freebsd := elf
1956VBOX_LDR_FMT.haiku := elf
1957VBOX_LDR_FMT.linux := elf
1958VBOX_LDR_FMT.netbsd := elf
1959VBOX_LDR_FMT.openbsd := elf
1960VBOX_LDR_FMT.solaris := elf
1961VBOX_LDR_FMT.darwin := macho
1962VBOX_LDR_FMT.os2 := lx
1963VBOX_LDR_FMT.win := pe
1964# Spread the above OS-level defaults to os+architecture specifics:
1965$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES)\
1966,$(eval VBOX_LDR_FMT.$(os).$(arch) := $(VBOX_LDR_FMT.$(os)))))
1967# os.arch overrides:
1968VBOX_LDR_FMT.os2.amd64 := elf
1969# The build target format.
1970VBOX_LDR_FMT := $(firstword $(VBOX_LDR_FMT.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) $(VBOX_LDR_FMT.$(KBUILD_TARGET)))
1971# Legacy:
1972VBOX_LDR_FMT32 := $(firstword $(VBOX_LDR_FMT.$(KBUILD_TARGET).x86) $(VBOX_LDR_FMT))
1973VBOX_LDR_FMT64 := $(firstword $(VBOX_LDR_FMT.$(KBUILD_TARGET).amd64) $(VBOX_LDR_FMT))
1974if1of (os2, $(KBUILD_TARGET) $(KBUILD_HOST)) # This isn't too helpful
1975 DONT_USE_YASM = 1 # yasm doesn't implement omf yet.
1976endif
1977
1978#
1979# Assembler setup.
1980#
1981# This is a bit complicated since we have to support two different assmblers
1982# (yasm/nasm) and possibly two different formats (32-bit/64-bit).
1983#
1984
1985# First the assembler tool.
1986VBOX_ASTOOL.x86 := $(if-expr defined(DONT_USE_YASM),NASM,YASM)
1987VBOX_ASTOOL.amd64 := $(if-expr defined(DONT_USE_YASM),NASM,YASM)
1988VBOX_ASTOOL.arm64 := $(VBOX_GCC_TOOL)
1989VBOX_ASTOOL.sparc32 := $(VBOX_GCC_TOOL)
1990VBOX_ASTOOL.sparc64 := $(VBOX_GCC_TOOL)
1991# Spread the above OS-level defaults to os+architecture specifics:
1992$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES)\
1993,$(eval VBOX_ASTOOL.$(os).$(arch) := $(VBOX_ASTOOL.$(arch)))))
1994# os.arch overrides:
1995VBOX_ASTOOL.os2.x86 := NASM
1996
1997# Assembler tool flag config.
1998VBOX_YASM_ASFLAGS.elf.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f elf32 -DASM_FORMAT_ELF -g dwarf2
1999VBOX_YASM_ASFLAGS.elf.amd64 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f elf64 -DASM_FORMAT_ELF -g dwarf2
2000VBOX_YASM_ASFLAGS.macho.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f macho32 -DASM_FORMAT_MACHO #-g dwarf2
2001VBOX_YASM_ASFLAGS.macho.amd64 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f macho64 -DASM_FORMAT_MACHO #-g dwarf2
2002VBOX_YASM_ASFLAGS.pe.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f win32 -DASM_FORMAT_PE -g cv8
2003VBOX_YASM_ASFLAGS.pe.amd64 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f win64 -DASM_FORMAT_PE -g cv8
2004VBOX_YASM_ASFLAGS.lx.x86 = -D__YASM__ -Worphan-labels $(VBOX_YASM_Wno-segreg-in-64bit) -f obj -DASM_FORMAT_OMF -g stabs
2005$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2006,$(eval VBOX_YASM_ASFLAGS.$(os).$(arch) = $$(VBOX_YASM_ASFLAGS.$(VBOX_LDR_FMT.$(os).$(arch)).$(arch)))))
2007
2008VBOX_NASM_ASFLAGS.elf.x86 := -D__NASM__ -w+orphan-labels -f elf32 -DASM_FORMAT_ELF -F dwarf
2009VBOX_NASM_ASFLAGS.elf.amd64 := -D__NASM__ -w+orphan-labels -f elf64 -DASM_FORMAT_ELF -F dwarf
2010VBOX_NASM_ASFLAGS.macho.x86 := -D__NASM__ -w+orphan-labels -f macho32 -DASM_FORMAT_MACHO -F dwarf
2011VBOX_NASM_ASFLAGS.macho.amd64 := -D__NASM__ -w+orphan-labels -f macho64 -DASM_FORMAT_MACHO -F dwarf
2012VBOX_NASM_ASFLAGS.pe.x86 := -D__NASM__ -w+orphan-labels -f win32 -DASM_FORMAT_PE -F cv8
2013VBOX_NASM_ASFLAGS.pe.amd64 := -D__NASM__ -w+orphan-labels -f win64 -DASM_FORMAT_PE -F cv8
2014VBOX_NASM_ASFLAGS.lx.x86 := -D__NASM__ -w+orphan-labels -f obj -DASM_FORMAT_OMF -F borland
2015$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2016,$(eval VBOX_NASM_ASFLAGS.$(os).$(arch) = $$(VBOX_NASM_ASFLAGS.$(VBOX_LDR_FMT.$(os).$(arch)).$(arch)))))
2017
2018ifdef VBOX_GCC_TOOL
2019 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.x86 := -DASM_FORMAT_ELF -m32
2020 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.amd64 := -DASM_FORMAT_ELF -m64
2021 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.arm64 := -DASM_FORMAT_ELF
2022 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.sparc32 := -DASM_FORMAT_ELF -m32
2023 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.elf.sparc64 := -DASM_FORMAT_ELF -m64
2024 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.macho.x86 := -DASM_FORMAT_MACHO -m32
2025 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.macho.amd64 := -DASM_FORMAT_MACHO -m64
2026 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.macho.arm64 := -DASM_FORMAT_MACHO
2027 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.pe.x86 := -DASM_FORMAT_PE
2028 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.pe.amd64 := -DASM_FORMAT_PE
2029 VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.pe.arm64 := -DASM_FORMAT_PE
2030 $(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2031 ,$(eval VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.$(os).$(arch) = $$(VBOX_$(VBOX_GCC_TOOL)_ASFLAGS.$(VBOX_LDR_FMT.$(os).$(arch)).$(arch)))))
2032endif
2033
2034# Combine the above ASFLAGS with the ASTOOL for each os+arch variation.
2035$(foreach os,$(VBOX_TARGET_OSES),$(foreach arch,$(VBOX_TARGET_ARCHES) \
2036,$(eval VBOX_ASFLAGS.$(os).$(arch) = $$(VBOX_$(VBOX_ASTOOL.$(os).$(arch))_ASFLAGS.$(os).$(arch)))))
2037
2038# Default target:
2039VBOX_ASTOOL = $(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
2040VBOX_ASFLAGS = $(VBOX_$(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))_ASFLAGS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))
2041
2042# Legacy targets:
2043VBOX_ASTOOL32 = $(VBOX_ASTOOL.$(KBUILD_TARGET).x86)
2044VBOX_ASFLAGS32 = $(VBOX_$(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))_ASFLAGS.$(KBUILD_TARGET).x86)
2045VBOX_ASFLAGS64 = $(VBOX_$(VBOX_ASTOOL.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH))_ASFLAGS.$(KBUILD_TARGET).amd64)
2046
2047
2048#
2049# Default tool nonsense.
2050#
2051## @todo Remove the default tool crap here!
2052TOOL = $(VBOX_GCC_TOOL)
2053TOOL.win.x86 = $(VBOX_VCC_TOOL_STEM)X86
2054TOOL.win.amd64 = $(VBOX_VCC_TOOL_STEM)AMD64
2055ASTOOL := $(VBOX_ASTOOL)
2056
2057
2058#
2059# Setup the global defines and includes.
2060#
2061# Note! The __SOMETHING__ #defines are deprecated as they violate the C/C++ specs.
2062#
2063INCS += $(PATH_ROOT)/include $(PATH_OUT)
2064DEFS += VBOX
2065DEFS.debug := DEBUG DEBUG_$(subst $(subst _, ,_),_,$(USERNAME)) DEBUG_USERNAME=$(subst $(subst _, ,_),_,$(USERNAME))
2066DEFS.dbgopt = $(DEFS.debug)
2067DEFS.profile = VBOX_WITH_STATISTICS
2068DEFS.strict = RT_STRICT VBOX_STRICT
2069DEFS.asan = RT_STRICT VBOX_STRICT
2070DEFS.parfait = VBOX_WITH_PARFAIT
2071DEFS.parfait-dbg = VBOX_WITH_PARFAIT
2072DEFS.x86 = RT_ARCH_X86 __X86__
2073DEFS.amd64 = RT_ARCH_AMD64 __AMD64__
2074DEFS.arm64 = RT_ARCH_ARM64
2075DEFS.sparc32 = RT_ARCH_SPARC
2076DEFS.sparc64 = RT_ARCH_SPARC64
2077DEFS.darwin = RT_OS_DARWIN __DARWIN__
2078DEFS.freebsd = RT_OS_FREEBSD __FREEBSD__
2079DEFS.haiku = RT_OS_HAIKU
2080DEFS.linux = RT_OS_LINUX _FILE_OFFSET_BITS=64
2081DEFS.netbsd = RT_OS_NETBSD
2082DEFS.openbsd = RT_OS_OPENBSD
2083DEFS.os2 = RT_OS_OS2
2084DEFS.os-agnostic = RT_OS_AGNOSTIC
2085DEFS.solaris = RT_OS_SOLARIS _FILE_OFFSET_BITS=64
2086DEFS.win = RT_OS_WINDOWS __WIN__
2087DEFS.win.x86 = __WIN32__
2088DEFS.win.amd64 = __WIN64__
2089DEFS.win.arm64 = __WIN64__
2090# optional defines (use environment or make commandline)
2091ifdef VBOX_WITH_STATISTICS
2092 DEFS += VBOX_WITH_STATISTICS
2093endif
2094ifdef VBOX_STRICT
2095 DEFS += VBOX_STRICT
2096endif
2097ifdef LOG_ENABLED
2098 DEFS += LOG_ENABLED
2099endif
2100ifdef VBOX_OSE
2101 DEFS += VBOX_OSE
2102endif
2103ifdef VBOX_WITH_64_BITS_GUESTS
2104 DEFS += VBOX_WITH_64_BITS_GUESTS
2105endif
2106ifdef VBOX_WITH_REM
2107 DEFS += VBOX_WITH_REM
2108endif
2109ifdef VBOX_WITH_RAW_MODE
2110 DEFS += VBOX_WITH_RAW_MODE
2111endif
2112ifdef VBOX_WITH_DRIVERLESS_FORCED
2113 DEFS += VBOX_WITH_DRIVERLESS_FORCED
2114endif
2115ifdef VBOX_WITH_PARFAIT
2116 ifn1of ($(KBUILD_TYPE), parfait parfait-dbg)
2117 DEFS += VBOX_WITH_PARFAIT
2118 endif
2119 ifeq ($(KBUILD_TARGET),win)
2120 DEFS += RT_RELAXED_CALLBACKS_TYPES
2121 endif
2122endif
2123ifdef VBOX_WITH_STATIC_ARM64_PAGE_SHIFT
2124 DEFS.linux.arm64 += IPRT_STATIC_ARM64_PAGE_SHIFT=$(VBOX_WITH_STATIC_ARM64_PAGE_SHIFT)
2125endif
2126
2127# Don't flood CDEFS, old MASMs doesn't like too many defines.
2128ifdef VBOX_WITH_DEBUGGER
2129 CDEFS += VBOX_WITH_DEBUGGER
2130endif
2131ifdef VBOX_WITH_HARDENING
2132 CDEFS += VBOX_WITH_HARDENING
2133endif
2134if defined(VBOX_WITH_STRICT_LOCKS) && ($(KBUILD_TYPE) == "debug" || $(KBUILD_TYPE) == "strict" || $(KBUILD_TYPE) == "asan")
2135 CDEFS += RT_LOCK_STRICT RT_LOCK_STRICT_ORDER
2136endif
2137ifdef VBOX_WITH_EF_WRAPS
2138 CDEFS += RTMEM_WRAP_TO_EF_APIS RTMEM_WRAP_SOME_NEW_AND_DELETE_TO_EF
2139endif
2140
2141# Quoted strings should not be passed to the assemblers since they might not
2142# subscribe to C preprocessing semantics.
2143ifdef VBOX_PATH_APP_PRIVATE
2144 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2145 CDEFS += RTPATH_APP_PRIVATE="$(VBOX_PATH_APP_PRIVATE)"
2146 else
2147 CDEFS += RTPATH_APP_PRIVATE=\"$(VBOX_PATH_APP_PRIVATE)\"
2148 endif
2149endif
2150ifdef VBOX_PATH_APP_PRIVATE_ARCH
2151 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2152 CDEFS += RTPATH_APP_PRIVATE_ARCH="$(VBOX_PATH_APP_PRIVATE_ARCH)"
2153 else
2154 CDEFS += RTPATH_APP_PRIVATE_ARCH=\"$(VBOX_PATH_APP_PRIVATE_ARCH)\"
2155 endif
2156endif
2157ifdef VBOX_PATH_APP_PRIVATE_ARCH_TOP
2158 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2159 CDEFS += RTPATH_APP_PRIVATE_ARCH_TOP="$(VBOX_PATH_APP_PRIVATE_ARCH_TOP)"
2160 else
2161 CDEFS += RTPATH_APP_PRIVATE_ARCH_TOP=\"$(VBOX_PATH_APP_PRIVATE_ARCH_TOP)\"
2162 endif
2163endif
2164ifdef VBOX_PATH_SHARED_LIBS
2165 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2166 CDEFS += RTPATH_SHARED_LIBS="$(VBOX_PATH_SHARED_LIBS)"
2167 else
2168 CDEFS += RTPATH_SHARED_LIBS=\"$(VBOX_PATH_SHARED_LIBS)\"
2169 endif
2170endif
2171ifdef VBOX_PATH_APP_DOCS
2172 ifdef VBOX_WITH_AUTOMATIC_DEFS_QUOTING
2173 CDEFS += RTPATH_APP_DOCS="$(VBOX_PATH_APP_DOCS)"
2174 else
2175 CDEFS += RTPATH_APP_DOCS=\"$(VBOX_PATH_APP_DOCS)\"
2176 endif
2177endif
2178if1of ($(KBUILD_TARGET), os2) # The gcc here is too old to grok #pragma once, instead it complains.
2179 CDEFS += RT_WITHOUT_PRAGMA_ONCE
2180endif
2181CXXDEFS += $(CDEFS)
2182PCHDEFS += $(CDEFS)
2183OBJCDEFS += $(CDEFS)
2184
2185USES += dtrace
2186USES.win += vboximportchecker vboxsetpeversion
2187
2188
2189#
2190# Decide which Windows DDK to use by default.
2191#
2192# Note! For the VBoxSF.sys to build correctly, VBOX_WINDDK_GST_WLH must be
2193# set up to the Windows 7 WDK as it ships Vista libraries with some
2194# compatibility helpers and stuff (copysup.lib).
2195# (WLH = windows longhorn, the codenamefor Vista).
2196#
2197# Note! WDK 10.0.26100.0 (Windows 11 24h2) no longer ships x86 kernel mode
2198# libraries. Nor does it ship any win7, win8 or win6.3 (8.1) kernel
2199# mode libraries for amd64. So, for building x86 and amd64 drivers, we
2200# must use an older WDK version (like 10.0.22621.0, or 10.0.22000.0).
2201# (It is possible we could use the w10/11 km libs for the x64 GA, but
2202# that needs somewhat careful checking.)
2203#
2204if1of ($(KBUILD_TARGET_ARCH), x86 amd64)
2205 SDK_WINSDK10_MAX_VERSION = 10.0.22621.0
2206endif
2207VBOX_WINDDK ?= WINSDK10-KM
2208VBOX_WINDDK_WLH ?= $(VBOX_WINDDK)
2209
2210VBOX_WINDDK_GST ?= $(VBOX_WINDDK)
2211if1of ($(KBUILD_TARGET_ARCH), x86 amd64)
2212 VBOX_WINDDK_GST_W8 ?= WINSDK10-KM-W8
2213 VBOX_WINDDK_GST_W7 ?= WINSDK10-KM-W7
2214 VBOX_WINDDK_GST_WLH ?= WINDDK71WLH
2215 VBOX_WINDDK_GST_W2K3 ?= WINDDK71WNET
2216 ifeq ($(KBUILD_TARGET_ARCH),x86)
2217 VBOX_WINDDK_GST_WXP ?= WINDDK71WXP
2218 else
2219 VBOX_WINDDK_GST_WXP ?= $(VBOX_WINDDK_GST_W2K3)
2220 endif
2221 VBOX_WINDDK_GST_W2K ?= $(VBOX_WINDDK_GST_WXP)
2222 VBOX_WINDDK_GST_NT4 ?= $(VBOX_WINDDK_GST_WXP)
2223else
2224 VBOX_WINDDK_GST_W8 ?= $(VBOX_WINDDK_GST)
2225 VBOX_WINDDK_GST_W7 ?= $(VBOX_WINDDK_GST)
2226 VBOX_WINDDK_GST_WLH ?= $(VBOX_WINDDK_GST)
2227 VBOX_WINDDK_GST_W2K3 ?= $(VBOX_WINDDK_GST)
2228 VBOX_WINDDK_GST_WXP ?= $(VBOX_WINDDK_GST)
2229 VBOX_WINDDK_GST_W2K ?= $(VBOX_WINDDK_GST)
2230 VBOX_WINDDK_GST_NT4 ?= $(VBOX_WINDDK_GST)
2231endif
2232
2233#
2234# Decide which Windows SDK to use by default.
2235#
2236VBOX_WINPSDK ?= WINSDK10-UM
2237VBOX_WINPSDK_INCS ?= $(VBOX_WINPSDK)-INCS
2238VBOX_WINPSDK_GST ?= $(VBOX_WINPSDK)
2239VBOX_WINPSDK_GST_INCS ?= $(VBOX_WINPSDK_INCS)
2240VBOX_WINPSDK_GST_W8 ?= $(VBOX_WINPSDK_GST)
2241VBOX_WINPSDK_GST_W7 ?= $(VBOX_WINPSDK_GST)
2242VBOX_WINPSDK_GST_WLH ?= $(VBOX_WINPSDK_GST)
2243VBOX_WINPSDK_GST_WXP ?= $(VBOX_WINPSDK_GST)
2244VBOX_WINPSDK_GST_W2K ?= $(VBOX_WINPSDK_GST)
2245VBOX_WINPSDK_GST_NT4 ?= $(VBOX_WINPSDK_GST)
2246
2247#
2248# ARCH_BITS_DEFS.
2249#
2250if1of ($(KBUILD_TARGET_ARCH), amd64 sparc64 arm64)
2251 VBOX_HC_ARCH_BITS := 64
2252 ARCH_BITS_DEFS := HC_ARCH_BITS=64
2253else if1of ($(KBUILD_TARGET_ARCH), x86 sparc32)
2254 VBOX_HC_ARCH_BITS := 32
2255 ARCH_BITS_DEFS := HC_ARCH_BITS=32
2256else
2257 $(error VBox: KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH))
2258endif
2259
2260ifdef VBOX_WITH_64_BITS_GUESTS
2261 VBOX_GC_ARCH_BITS_DEFS := GC_ARCH_BITS=64
2262else
2263 VBOX_GC_ARCH_BITS_DEFS := GC_ARCH_BITS=32
2264endif
2265ARCH_BITS_DEFS += $(VBOX_GC_ARCH_BITS_DEFS)
2266
2267#
2268# Add the output dir(s) to the dynamic loader search path.
2269#
2270if1of ($(KBUILD_HOST), freebsd linux netbsd openbsd solaris)
2271 export LD_LIBRARY_PATH:=$(PATH_STAGE_BIN):$(PATH_STAGE_LIB):$(LD_LIBRARY_PATH)
2272endif
2273ifeq ($(KBUILD_HOST),haiku)
2274 export LIBRARY_PATH:=$(PATH_STAGE_BIN):$(PATH_STAGE_LIB):$(LIBRARY_PATH)
2275endif
2276ifeq ($(KBUILD_HOST),os2)
2277 #fixme! export BEGINLIBPATH:=$(PATH_STAGE_BIN);$(PATH_STAGE_LIB);$(BEGINLIBPATH)
2278endif
2279ifeq ($(KBUILD_HOST),win)
2280 # This check is a bit hacky, but avoids problems with PATH being changed
2281 # again when the makefiles are reread because some automatically generated
2282 # makefile has been modified.
2283 ifeq ($(findstring $(PATH_STAGE_BIN);$(PATH_STAGE_LIB);,$(PATH)),)
2284 export PATH:=$(PATH_STAGE_BIN);$(PATH_STAGE_LIB);$(PATH)
2285 endif
2286endif
2287
2288#
2289# Common libraries and tools.
2290#
2291ifeq ($(KBUILD_TARGET),darwin)
2292 LIB_RUNTIME = $(PATH_STAGE_BIN)/VBoxRT.dylib
2293 LIB_RUNTIME_EF = #$(PATH_STAGE_LIB)/RuntimeEFCPP.a
2294 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_BIN)/VBoxRT-x86.dylib
2295 LIB_KPROFILE = $(PATH_STAGE_BIN)/kPrf2.dylib
2296 LIB_VMM = $(PATH_STAGE_BIN)/VBoxVMM.dylib
2297 LIB_VMMRC = $(PATH_STAGE_BIN)/VMMRC.rc
2298 LIB_REM = $(PATH_STAGE_LIB)/VBoxREM.dylib
2299 LIB_XPCOM = $(PATH_STAGE_BIN)/VBoxXPCOM.dylib
2300 LIB_XPCOM_IMP = $(PATH_STAGE_LIB)/VBoxXPCOMImp.dylib
2301 VBOX_LIB_XPCOM_X86 = $(PATH_STAGE_BIN)/VBoxXPCOM-x86.dylib
2302 LIB_DDU = $(PATH_STAGE_BIN)/VBoxDDU.dylib
2303 VBOX_LIB_SUPR0 :=
2304 LIB_VBOXXPCOMIPCD = $(PATH_STAGE_BIN)/VBoxXPCOMIPCD.dylib
2305endif
2306if1of ($(KBUILD_TARGET), freebsd haiku linux netbsd openbsd solaris)
2307 LIB_RUNTIME = $(PATH_STAGE_BIN)/VBoxRT.so
2308 LIB_RUNTIME_EF = $(PATH_STAGE_LIB)/RuntimeEFCPP.a
2309 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_BIN)/VBoxRT-x86.so
2310 LIB_KPROFILE = $(PATH_STAGE_BIN)/kPrf2.so
2311 LIB_VMM = $(PATH_STAGE_BIN)/VBoxVMM.so
2312 LIB_VMMRC = $(PATH_STAGE_BIN)/VMMRC.rc
2313 LIB_REM = $(PATH_STAGE_LIB)/VBoxREM.so
2314 LIB_XPCOM = $(PATH_STAGE_BIN)/VBoxXPCOM.so
2315 LIB_XPCOM_IMP = $(PATH_STAGE_LIB)/VBoxXPCOMImp.so
2316 VBOX_LIB_XPCOM_X86 = $(PATH_STAGE_BIN)/VBoxXPCOM-x86.so
2317 LIB_DDU = $(PATH_STAGE_BIN)/VBoxDDU.so
2318 VBOX_LIB_SUPR0 :=
2319 LIB_VBOXXPCOMIPCD = $(PATH_STAGE_BIN)/VBoxXPCOMIPCD.so
2320endif
2321ifeq ($(KBUILD_TARGET),os2)
2322 LIB_RUNTIME = $(PATH_STAGE_BIN)/VBoxRT.dll
2323 LIB_RUNTIME_EF = #$(PATH_STAGE_LIB)/RuntimeEFCPP.a
2324 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_BIN)/VBoxRT-x86.dll
2325 LIB_KPROFILE = $(PATH_STAGE_BIN)/kPrf2.dll
2326 LIB_VMM = $(PATH_STAGE_BIN)/VBoxVMM.dll
2327 LIB_VMMRC = $(PATH_STAGE_LIB)/VMMRCImp.lib
2328 LIB_REM = $(PATH_STAGE_LIB)/VBoxREMImp.lib
2329 LIB_XPCOM = $(PATH_STAGE_BIN)/VBoxXCOM.dll
2330 LIB_XPCOM_IMP = $(PATH_STAGE_LIB)/VBoxXPCOMImp.lib
2331 VBOX_LIB_XPCOM_X86 = $(PATH_STAGE_BIN)/VBoxXPCOM-x86.dll
2332 LIB_DDU = $(PATH_STAGE_BIN)/VBoxDDU.dll
2333 VBOX_OBJ_SYS0 = $(PATH_OBJ)/RuntimeR0/os2/sys0.obj
2334 VBOX_LIB_SUPR0 = $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
2335endif
2336ifeq ($(KBUILD_TARGET),win)
2337 LIB_RUNTIME = $(PATH_STAGE_LIB)/VBoxRT.lib
2338 LIB_RUNTIME_EF = #$(PATH_STAGE_LIB)/RuntimeEFCPP.lib
2339 VBOX_LIB_RUNTIME_X86 = $(PATH_STAGE_LIB)/VBoxRT-x86.lib
2340 LIB_KPROFILE = $(PATH_STAGE_LIB)/kPrf2.lib
2341 LIB_VMM = $(PATH_STAGE_LIB)/VBoxVMM.lib
2342 LIB_VMMRC = $(PATH_OBJ)/VMMRC/VMMRC.lib
2343 LIB_REM = $(PATH_STAGE_LIB)/VBoxREMImp.lib
2344 LIB_XPCOM =
2345 LIB_XPCOM_IMP =
2346 VBOX_LIB_XPCOM_X86 =
2347 LIB_DDU = $(PATH_STAGE_LIB)/VBoxDDU.lib
2348 VBOX_LIB_SUPR0 = $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
2349endif
2350ifn1of ($(KBUILD_TARGET_ARCH), $(VBOX_SUPPORTED_HOST_ARCHS)) # Hack to build a couple of extpack things that thing they need the VMM lib.
2351 LIB_VMM :=
2352 LIB_VMMRC :=
2353endif
2354VBOX_LIB_SUPHARDENED = $(PATH_STAGE_LIB)/SUPR3HardenedStatic$(VBOX_SUFF_LIB)
2355VBOX_LIB_RUNTIME_STATIC = $(PATH_STAGE_LIB)/RuntimeR3$(VBOX_SUFF_LIB)
2356VBOX_LIB_RUNTIME_STATIC_X86 = $(PATH_STAGE_LIB)/RuntimeR3-x86$(VBOX_SUFF_LIB)
2357if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
2358 VBOX_LIB_RUNTIME_STATIC_NO_ASAN = $(PATH_STAGE_LIB)/RuntimeR3NoAsan$(VBOX_SUFF_LIB)
2359else
2360 VBOX_LIB_RUNTIME_STATIC_NO_ASAN = $(VBOX_LIB_RUNTIME_STATIC)
2361endif
2362
2363ifndef VBOX_WITH_REM
2364 LIB_REM :=
2365endif
2366
2367# Python
2368ifndef VBOX_BLD_PYTHON
2369 if1of ($(KBUILD_HOST), win)
2370 VBOX_BLD_PYTHON := $(firstword $(rsort $(wildcard $(KBUILD_DEVTOOLS)/win.x86/python/v*/python$(HOSTSUFF_EXE))) \
2371 python-not-found.exe)
2372 else ifndef VBOX_WITH_PYTHON2_PREFERENCE
2373 VBOX_BLD_PYTHON := $(firstword \
2374 $(which python3$(HOSTSUFF_EXE)) \
2375 $(which python3.11$(HOSTSUFF_EXE)) \
2376 $(which python3.10$(HOSTSUFF_EXE)) \
2377 $(which python3.9$(HOSTSUFF_EXE)) \
2378 $(which python3.8$(HOSTSUFF_EXE)) \
2379 $(which python3.7$(HOSTSUFF_EXE)) \
2380 $(which python3.6$(HOSTSUFF_EXE)) \
2381 $(which python3.5$(HOSTSUFF_EXE)) \
2382 $(which python3.4$(HOSTSUFF_EXE)) \
2383 $(which python2.7$(HOSTSUFF_EXE)) \
2384 $(which python$(HOSTSUFF_EXE)) \
2385 $(which python2.6$(HOSTSUFF_EXE)) \
2386 python-not-found$(HOSTSUFF_EXE) )
2387 else
2388 VBOX_BLD_PYTHON := $(firstword \
2389 $(which python2.7$(HOSTSUFF_EXE)) \
2390 $(which python2.6$(HOSTSUFF_EXE)) \
2391 $(which python$(HOSTSUFF_EXE)) \
2392 $(which python3$(HOSTSUFF_EXE)) \
2393 python-not-found$(HOSTSUFF_EXE) )
2394 endif
2395endif
2396## For running python unittests in the validation kit.
2397VBOX_UNITTEST_PYTHON ?= $(VBOX_BLD_PYTHON)
2398
2399#
2400# pylint setup, see https://www.pylint.org/.
2401#
2402# Disabled:
2403# W0301 - Unnecessary semicolon.
2404# W0511 - TODO/XXX/FIXME/+++.
2405# W0603 - Using the global statement.
2406# W0702 - No exception type(s) specified.
2407# W0703 - Catch "Exception".
2408# I0011 - Locally disabling XXXXX.
2409# C0321 - More than one statement on a single line.
2410# R0201 - Method could be a function.
2411# C0326 - ????
2412# W0123 - ????
2413# C0330:bad-continuation - Wrong continued indentation (add X spaces).
2414# * Triggering on perfectly legal comments in array initializers and stuff.
2415# C0413:wrong-import-position - Import "YYYYY XXXXX" should be placed at the top of the module.
2416# * False positives due to __copyright__, __version__, probably.
2417# E0012:bad-option-value - Bad option value XXXXX.
2418# * Newer pylint doesn't grok older warning disables in sources (e.g. W0142 in db.py). Wonderful!
2419# I0012:locally-enabled - Locally enabling XXXXX.
2420# * We temporarily disable stuff and then renabled it. Very tedious.
2421# :nested-min-max - Buggy in 2.16.2 when mixing iterable and regular form, thus disabled.
2422#
2423# Note! Yes, --max-branchs is a typo, but not by me.
2424#
2425# Note! Users of older pylint release (< 1.0) needs to define
2426# VBOX_WITH_PYLINT_PRE_V1_0 in LocalConfig because they changed the
2427# output arguments in an backwards incompatible way and added more
2428# attribute regex options.
2429#
2430ifndef VBOX_PYLINT
2431 VBOX_PYLINT := $(firstword $(which pylint-2.7) $(which pylint-2.6) $(which pylint2) $(which pylint))
2432 #ifdef VBOX_PYLINT # -- why was this needed. It messes up when using pylint w/ 3.x and building with 2.7.
2433 # VBOX_PYLINT := $(VBOX_BLD_PYTHON) $(VBOX_PYLINT)
2434 #endif
2435endif
2436if !defined(VBOX_WITH_PYLINT) && defined(VBOX_PYLINT)
2437 VBOX_WITH_PYLINT := 1
2438 ifndef VBOX_PYLINT_VERSION
2439 ifdef VBOX_WITH_PYLINT_PRE_V1_0
2440 VBOX_PYLINT_VERSION = 9999
2441 else ifdef VBOX_WITH_PYLINT_V1_2_1_PLUS
2442 VBOX_PYLINT_VERSION = 10201
2443 else ifdef VBOX_WITH_PYLINT_V1_1_PLUS
2444 VBOX_PYLINT_VERSION = 10100
2445 else
2446 VBOX_PYLINT_VERSION = 10000
2447 endif
2448 endif
2449endif
2450VBOX_PYLINT_FLAGS = $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--reports=n,--report=n) \
2451 $(if-expr $(VBOX_PYLINT_VERSION) >= 10000 \
2452 ,--msg-template='{path}:{line}: <{msg_id}>({obj}:{symbol}): {msg}' \
2453 ,--output-format=msvs --include-ids=y) \
2454 --persistent=n \
2455 --rcfile=$(PATH_ROOT)/tools/pylintrc \
2456 --max-line-length=130 \
2457 --max-attributes=32 \
2458 --max-branch$(if-expr $(VBOX_PYLINT_VERSION) >= 10000,e,)s=50 \
2459 --max-statements=100 \
2460 --max-returns=100 \
2461 --max-public-methods=139 \
2462 --max-args=9 \
2463 --max-module-lines=4096 \
2464 --max-locals=32 \
2465 $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--max-bool-expr=99,) \
2466 --min-public-methods=0 \
2467 --function-rgx='[a-z_][a-zA-Z0-9_]{2,40}$(DOLLAR)' \
2468 --method-rgx='[a-z_][a-zA-Z0-9_]{2,40}$(DOLLAR)' \
2469 --argument-rgx='([a-z_][a-zA-Z0-9_]{2,30}|rc|hr|s|c|ch|cx|cy|cb|fn)$(DOLLAR)' \
2470 --variable-rgx='([a-z_][a-zA-Z0-9_]{2,30}|rc|hr|s|c|ch|cx|cy|cb|fn)$(DOLLAR)' \
2471 --attr-rgx='([a-z_][a-zA-Z0-9_]{2,30}|rc|hr|o)$(DOLLAR)' \
2472 --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)' \
2473 --class-rgx='(td|)[A-Z_][a-zA-Z0-9_]+$(DOLLAR)' \
2474 --const-rgx='(g_(k|)[abcdefhmnpilorstu]+[A-Z][a-zA-Z0-9]+|[A-Z_][A-Z0-9_]+|__copyright__|__version__|__file__|__all__)$(DOLLAR)' \
2475 --good-names='i,j,k,t,o,c,e,ch,s,_' \
2476 $(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})',) \
2477 $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--max-nested-blocks=9,) \
2478 $(if-expr $(VBOX_PYLINT_VERSION) >= 10100,--disable=bad-whitespace,) \
2479 $(if-expr $(VBOX_PYLINT_VERSION) >= 10201,--disable=bad-continuation --disable=eval-used,) \
2480 $(if-expr $(VBOX_PYLINT_VERSION) >= 10201 && $(VBOX_PYLIN_VERSION) < 10500,--disable=bad-option-value,) \
2481 $(if-expr $(VBOX_PYLINT_VERSION) >= 10500,--disable=wrong-import-position --disable=E0012 --disable=locally-enabled,) \
2482 $(if-expr $(VBOX_PYLINT_VERSION) >= 10600,--disable=missing-docstring --disable=trailing-newlines --disable=ungrouped-imports,) \
2483 $(if-expr $(VBOX_PYLINT_VERSION) >= 10800,--disable=redundant-keyword-arg,) \
2484 $(if-expr $(VBOX_PYLINT_VERSION) >= 20000,--disable=useless-object-inheritance --disable=useless-return,) \
2485 $(if-expr $(VBOX_PYLINT_VERSION) >= 20400,--disable=import-outside-toplevel,) \
2486 $(if-expr $(VBOX_PYLINT_VERSION) >= 20900,--disable=super-with-arguments --disable=raise-missing-from,) \
2487 $(if-expr $(VBOX_PYLINT_VERSION) >= 21200,--disable=consider-using-f-string --disable=unnecessary-semicolon --disable=redundant-u-string-prefix) \
2488 $(if-expr $(VBOX_PYLINT_VERSION) >= 21602,--disable=broad-exception-raised) \
2489 $(if-expr $(VBOX_PYLINT_VERSION) >= 21602,--disable=nested-min-max) \
2490 --disable=unnecessary-semicolon,invalid-encoded-data,global-statement,bare-except,broad-except,multiple-statements,no-self-use,fixme \
2491 --disable=I0011 \
2492 --ignored-classes=testdriver.vboxcon
2493
2494
2495# Define the macro for win path conversion.
2496if !defined(VBOX_ONLY_SDK) || defined(VBOX_ONLY_SDK_ON_HOST) || defined(VBOX_ONLY_SDK_IN_VM)
2497 VBOX_FN_MAKE_WIN_PATH = "$(quote-sh-dq $(subst /,\,$(requote unq, $(1))))"
2498else
2499 # Z: is always FS root for Wine.
2500 VBOX_FN_MAKE_WIN_PATH = $(subst /,\\,$(patsubst /%,Z:/%,$(1)))
2501endif
2502
2503# The kprofile build automagically links with kProfile.
2504ifeq ($(KBUILD_TYPE),kprofile)
2505 LIB_RUNTIME += $(LIB_KPROFILE)
2506endif
2507
2508# Enable C++ electric fence heap. (Warning: will easily run out of virtual memory / kernel stuff on Linux/Windows.)
2509ifdef VBOX_WITH_CPP_EF
2510 LIB_RUNTIME <= $(LIB_RUNTIME_EF)
2511endif
2512
2513# Overridable libraries (unix).
2514LIB_PTHREAD ?= pthread
2515
2516# Xcursor (consider an SDK for this).
2517ifeq ($(VBOX_XCURSOR_LIBS),)
2518 ifeq ($(KBUILD_TARGET),solaris)
2519 VBOX_XCURSOR_LIBS := $(lastword $(wildcard $(KBUILD_DEVTOOLS_TRG)/libXcursor/*/lib/libXcursor.a))
2520 ifneq ($(VBOX_XCURSOR_LIBS),)
2521 VBOX_XCURSOR_INCS := $(patsubst %/lib/libXcursor.a,%/include, $(VBOX_XCURSOR_LIBS))
2522 VBOX_XCURSOR_LIBS += X11 Xrender Xfixes
2523 endif
2524 endif
2525 ifeq ($(VBOX_XCURSOR_LIBS),)
2526 VBOX_XCURSOR_LIBS := Xcursor
2527 endif
2528endif
2529
2530
2531# Intel ASL compiler for ACPI
2532VBOX_IASLCMD ?= $(firstword $(wildcard $(KBUILD_DEVTOOLS_HST)/bin/iasl$(HOSTSUFF_EXE)) iasl$(HOSTSUFF_EXE))
2533
2534# libxslt XSLT processor. (see PATH_TOOL_YASM for explanation why it's temporarily located in bin.)
2535ifeq ($(VBOX_XSLTPROC),)
2536 ifeq ($(KBUILD_HOST),win)
2537 VBOX_XSLTPROC := $(firstfile \
2538 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST)/libxslt/*/bin/xsltproc.exe)) \
2539 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST_ALT)/libxslt/*/bin/xsltproc.exe)) )
2540 ifeq ($(VBOX_XSLTPROC),)
2541 VBOX_XSLTPROC := $(firstfile $(which xsltproc$(HOSTSUFF_EXE)) xsltproc$(HOSTSUFF_EXE))
2542 endif
2543 else ifeq ($(KBUILD_HOST),os2)
2544 VBOX_XSLTPROC := BEGINLIBPATH="$(KBUILD_DEVTOOLS_HST)/bin;$$BEGINLIBPATH" $(KBUILD_DEVTOOLS_HST)/bin/xsltproc.exe
2545 else ifeq ($(KBUILD_HOST),haiku)
2546 VBOX_XSLTPROC := $(KBUILD_DEVTOOLS)/haiku.x86/bin/xsltproc
2547 else
2548 VBOX_XSLTPROC := xsltproc$(HOSTSUFF_EXE)
2549 endif
2550endif
2551
2552# Doxygen
2553ifeq ($(VBOX_DOXYGEN),)
2554 VBOX_DOXYGEN := $(firstfile $(rversortfiles $(qwildcard , $(KBUILD_DEVTOOLS_HST)/doxygen/v*/doxygen$(HOSTSUFF_EXE))) doxygen$(HOSTSUFF_EXE))
2555endif
2556
2557# bin2c (convert binary files into C arrays)
2558VBOX_BIN2C ?= $(PATH_OBJ)/bin2c/bin2c$(HOSTSUFF_EXE)
2559
2560# genalias (generate aliases for nocrt_ functions)
2561VBOX_GENALIAS ?= $(PATH_OBJ)/genalias/genalias$(HOSTSUFF_EXE)
2562
2563# RTManifest (extension pack manifest utility)
2564VBOX_RTMANIFEST ?= $(PATH_OBJ)/bldRTManifest/bldRTManifest$(HOSTSUFF_EXE)
2565
2566# RTSignTool (certificate extraction tool)
2567VBOX_RTSIGNTOOL ?= $(PATH_OBJ)/bldRTSignTool/bldRTSignTool$(HOSTSUFF_EXE)
2568
2569# RTIsoMaker (our own ISO maker).
2570VBOX_RTISOMAKER ?= $(PATH_OBJ)/bldRTIsoMaker/bldRTIsoMaker$(HOSTSUFF_EXE)
2571
2572# RTLdrCheckImports (checks imports against oldest supported OS version (GAs typically))
2573VBOX_RTLDRCHECKIMPORTS ?= $(PATH_OBJ)/bldRTLdrCheckImports/bldRTLdrCheckImports$(HOSTSUFF_EXE)
2574
2575# VBoxCmp (simple /bin/cmp with more sensible output)
2576VBOX_VBOXCMP ?= $(PATH_OBJ)/VBoxCmp/VBoxCmp$(HOSTSUFF_EXE)
2577
2578# VBoxCPP (special purpose C preprocessor)
2579VBOX_VBOXCPP ?= $(PATH_OBJ)/VBoxCPP/VBoxCPP$(HOSTSUFF_EXE)
2580
2581# VBoxTpG (tracepoint generator)
2582VBOX_VBOXTPG ?= $(PATH_OBJ)/VBoxTpG/VBoxTpG$(HOSTSUFF_EXE)
2583
2584# VBoxPeSetVersion (changes the minimum OS version of an image)
2585VBOX_PE_SET_VERSION ?= $(PATH_OBJ)/VBoxPeSetVersion/VBoxPeSetVersion$(HOSTSUFF_EXE)
2586
2587# Visual C++ EditBin.exe.
2588VBOX_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
2589
2590# filesplitter (splits java files)
2591VBOX_FILESPLIT ?= $(PATH_OBJ)/filesplitter/filesplitter$(HOSTSUFF_EXE)
2592
2593# biossums (set BIOS checksums)
2594VBOX_BIOSSUMS ?= $(PATH_OBJ)/biossums/biossums$(HOSTSUFF_EXE)
2595
2596# MakeAlternativeSource (for BIOSes)
2597VBOX_MAKE_ALTERNATIVE_SOURCE ?= $(PATH_OBJ)/MakeAlternativeSource/MakeAlternativeSource$(HOSTSUFF_EXE)
2598
2599# VBoxDef2LazyLoad (lazy dynamic library loader assembly generator)
2600VBOX_DEF_2_LAZY_LOAD ?= $(PATH_OBJ)/VBoxDef2LazyLoad/VBoxDef2LazyLoad$(HOSTSUFF_EXE)
2601
2602# VBoxCheckImports (checks what we imports from on windows)
2603VBOX_CHECK_IMPORTS ?= $(PATH_OBJ)/VBoxCheckImports/VBoxCheckImports$(HOSTSUFF_EXE)
2604
2605# VBoxEditCoffLib (symbol name tweaking for VBoxSF on windows)
2606VBOX_EDIT_COFF_LIB ?= $(PATH_OBJ)/VBoxEditCoffLib/VBoxEditCoffLib$(HOSTSUFF_EXE)
2607
2608# GNU tar if present.
2609if1of ($(KBUILD_TARGET), linux os2 win)
2610 VBOX_GTAR ?= tar
2611else if1of ($(KBUILD_TARGET), freebsd netbsd solaris)
2612 VBOX_GTAR ?= gtar
2613endif
2614
2615# zip
2616VBOX_ZIP ?= zip$(HOSTSUFF_EXE)
2617
2618ifeq ($(KBUILD_HOST),darwin) # Xcode 7.3.1 nm doesn't like -t, and -x behaves very differently. Throwing in -B (bsd) to make sure.
2619 VBOX_NM ?= $(subst $(REDIRECT_INT),$(REDIRECT_EXT),$(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN_BIN_SLASH)nm) -p \
2620 $(if-expr $(VBOX_XCODE_VERSION_MAJOR) > 7 || ($(VBOX_XCODE_VERSION_MAJOR) == 7 && $(VBOX_XCODE_VERSION_MINOR) >= 3),-B,)
2621else
2622 VBOX_NM ?= nm -p -t x
2623endif
2624
2625# Makeself for the linux installers.
2626VBOX_MAKESELF ?= $(KBUILD_DEVTOOLS)/common/makeself/v2.4.5-r2/makeself.sh
2627
2628# Microsoft HTML Help Workshop.
2629VBOX_PATH_HTML_HELP_WORKSHOP ?= $(KBUILD_DEVTOOLS)/win.x86/HTML_Help_Workshop/v1.3/
2630
2631# Path to the null soft installer.
2632VBOX_PATH_NSIS ?= $(KBUILD_DEVTOOLS)/win.x86/nsis/v3.09-log
2633
2634# Windows Installer XML (WIX) toolset.
2635VBOX_PATH_WIX ?= $(KBUILD_DEVTOOLS)/win.x86/wix/v4.0.5
2636VBOX_PATH_MSITRAN ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/../x86/MsiTran.Exe
2637VBOX_PATH_MSIDB ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/../x86/MsiDb.Exe
2638# Note! The scripts has been moved to Bin in v8.0.
2639VBOX_PATH_WISUBSTG ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/WiSubStg.vbs
2640VBOX_PATH_WISUMINFO ?= $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/WiSumInf.vbs
2641VBOX_PATH_DIFX ?= $(KBUILD_DEVTOOLS)/win.$(KBUILD_TARGET_ARCH)/DIFx/v2.1-r3
2642
2643ifdef 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.
2644 # We need to export YASM for OSE, but since it was converted to .zip we need to
2645 # allow for the location used by the zip to be properly cleaned up first.
2646 if1of ($(KBUILD_HOST).$(KBUILD_HOST_ARCH), linux.x86 solaris.x86 win.x86)
2647 PATH_TOOL_YASM ?= $(KBUILD_DEVTOOLS_HST)/bin
2648 endif
2649endif
2650
2651# bison and flex for windows. Needed by mesa and also used by VBoxDTrace.
2652ifeq ($(KBUILD_HOST),win)
2653 ifndef TOOL_BISON_YACC
2654 TOOL_BISON_YACC := $(firstfile $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS)/win.x86/win_flex_bison/v*/*bison*$(HOSTSUFF_EXE))) bison.exe)
2655 endif
2656 ifndef TOOL_FLEX_LEX
2657 TOOL_FLEX_LEX := $(firstfile $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS)/win.x86/win_flex_bison/v*/*flex*$(HOSTSUFF_EXE))) flex.exe)
2658 endif
2659endif
2660
2661
2662# The Microsoft IDL compiler (the SDK build needs this on non-Windows).
2663VBOX_WIN_MIDL ?= $(EXEC_X86_WIN32) $(call VBOX_FN_MAKE_WIN_PATH,$(qfirstfile ,$(qwildcard ,$(qaddsuffix ,/[Mm][Ii][Dd][Ll].[Ee][Xx][Ee], \
2664 $(PATH_SDK_$(VBOX_WINPSDK)_BIN) \
2665 $(KBUILD_DEVTOOLS)/win.x86/sdk/v7.1/Bin$(if-expr "$(KBUILD_HOST).$(KBUILD_HOST_ARCH)" == "win.amd64",/x64,) \
2666 $(KBUILD_DEVTOOLS)/win.x86/ddk/7600.16385.1/bin/x86 \
2667 $(KBUILD_DEVTOOLS)/win.x86/bin \
2668 $(PATH_SDK_$(VBOX_WINPSDK)_BIN) \
2669 $(PATH_SDK_$(VBOX_WINPSDK)) \
2670 $(PATH_SDK_WINPSDK_BIN) \
2671 $(PATH_SDK_WINPSDK) \
2672 )) Sorry_Cannot_Find_The_Midl_Compiler_In_The_PSDK))
2673
2674# Tricks to work around midl.exe problems with spaces in the /cpp_cmd value, it
2675# forgets to quote it when creating the commandline and cl.exe gets very confused.
2676ifndef VBOX_WITH_PARFAIT
2677 if1of (quote, $(KMK_FEATURES))
2678 VBOX_MIDL_REDIRECT = $(REDIRECT) --prepend "$(quote-sh-dq PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(qaddsuffix ,;,$(PATH_TOOL_$(VBOX_VCC_TOOL)_DLL_BIN)))" --
2679 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)))" --
2680 else
2681 VBOX_MIDL_REDIRECT = $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(PATH)' --
2682 VBOX_MIDL_REDIRECT_X86 = $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_BIN);$(PATH)' --
2683 endif
2684else
2685 if1of (quote, $(KMK_FEATURES))
2686 VBOX_MIDL_REDIRECT = \
2687 $(REDIRECT) --prepend "$(quote-sh-dq PATH=$(VBOX_PARFAIT_PATH_BIN);$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(qaddsuffix ,;,$(PATH_TOOL_$(VBOX_VCC_TOOL)_DLL_BIN)))" --
2688 VBOX_MIDL_REDIRECT_X86 = \
2689 $(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)))" --
2690 else
2691 VBOX_MIDL_REDIRECT = \
2692 $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(VBOX_PARFAIT_PATH_BIN);$(PATH)' --
2693 VBOX_MIDL_REDIRECT_X86 = \
2694 $(REDIRECT) --prepend 'PATH=$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN);$(VBOX_PARFAIT_PATH_BIN);$(PATH)' --
2695 endif
2696endif
2697VBOX_MIDL_CPP_CMD = $(lastword $(notdir ,$(subst $(EXEC_X86_WIN32),,$(TOOL_$(VBOX_VCC_TOOL)_CC))))
2698VBOX_MIDL_CPP_CMD_X86 = $(lastword $(notdir ,$(subst $(EXEC_X86_WIN32),,$(TOOL_$(VBOX_VCC_TOOL_STEM)X86_CC))))
2699
2700##
2701# Edits $1 and adding #pragma directives for disabling warnings windows.h causes.
2702# @param 1 The name of the file to edit.
2703define def_VBoxMidlOutputDisableMscWarnings
2704 $(QUIET)$(MV) -f "$1" "$1.tmp"
2705 $(QUIET)$(APPEND) -nt "$1" \
2706 '#if _MSC_VER >= 1920 /* RT_MSC_VER_VS2019 */' \
2707 '# pragma warning(disable:5031 5032) /* buggy winioctl.h in some w10 sdks */ ' \
2708 '#endif' \
2709 '#pragma warning(push) /* -Wall and windows.h */' \
2710 '#pragma warning(disable:4668 4255)' \
2711 '#if _MSC_VER >= 1800 /* RT_MSC_VER_VC120 */' \
2712 '# pragma warning(disable:4005)' \
2713 '#endif' \
2714 '#if _MSC_VER >= 1900 /* RT_MSC_VER_VC140 */' \
2715 '# pragma warning(disable:5039)' \
2716 '#endif' \
2717 ''
2718 $(QUIET)$(CAT_EXT) "$1.tmp" >> "$1"
2719 $(QUIET)$(APPEND) -n "$1" \
2720 '' \
2721 '#pragma warning(pop)' \
2722 ''
2723 $(QUIET)$(RM) -f "$1.tmp"
2724
2725endef
2726
2727# XPCOM setup for all but win32.
2728ifneq ($(KBUILD_TARGET),win)
2729 VBOX_WITH_XPCOM = 1
2730 # if updating, also update xpidl_INST var in src/libs/xpcom18a4/Makefile.kmk
2731 VBOX_XPIDL ?= $(PATH_STAGE_BIN)/xpidl$(HOSTSUFF_EXE)
2732 ifeq ($(KBUILD_TARGET),os2)
2733 VBOX_XPIDL_ENV = BEGINLIBPATH="$(dir $(VBOX_XPIDL));$$BEGINLIBPATH"$(SP)
2734 endif
2735 VBOX_PATH_XPCOM_IDL ?= $(VBOX_PATH_SDK)/bindings/xpcom/idl
2736 VBOX_XPCOM_INCS ?= \
2737 $(VBOX_PATH_SDK)/bindings/xpcom/include \
2738 $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \
2739 $(VBOX_PATH_SDK)/bindings/xpcom/include/string \
2740 $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \
2741 $(VBOX_PATH_SDK)/bindings/xpcom/include/nsprpub \
2742 $(VBOX_PATH_SDK)/bindings/xpcom/include/ipcd
2743 ifneq ($(KBUILD_TARGET),os2)
2744 # libIDL-config (for xpcom18a4)
2745 ifeq ($(origin VBOX_LIBIDL_CONFIG),undefined)
2746 ifeq ($(KBUILD_HOST),solaris)
2747 VBOX_LIBIDL_CONFIG_FALLBACK = $(lastword $(wildcard $(KBUILD_DEVTOOLS)/solaris.amd64/libIDL/*/bin/libIDL-config-2))
2748 endif
2749 export VBOX_LIBIDL_CONFIG := $(firstword $(which libIDL-config-2 libIDL-config) $(VBOX_LIBIDL_CONFIG_FALLBACK) libIDL-config-2-not-found)
2750 endif
2751 endif
2752endif
2753
2754# The X11 LIBPATH. (The amd64 hack is for RHEL4.)
2755ifeq ($(KBUILD_TARGET_ARCH),amd64)
2756 VBOX_LIBPATH_X11 ?= /usr/X11R6/lib64 /usr/X11R6/lib
2757else
2758 VBOX_LIBPATH_X11 ?= /usr/X11R6/lib
2759endif
2760
2761# 32bit X11 LIBPATH for building 32bit guest additions
2762VBOX_LIBPATH32_X11 ?= /usr/X11R6/lib32 /usr/X11R6/lib
2763
2764# Good windows shell.
2765VBOX_GOOD_COMSPEC = $(subst \,/,$(SystemRoot))/System32/cmd.exe
2766VBOX_GOOD_COMSPEC_BS ?= $(subst /,\,$(VBOX_GOOD_COMSPEC))
2767
2768#
2769# Macros dealing with the darwin version we're targeting.
2770# The DEF in VBOX_DEF_MACOSX_VERSION_MIN mean default. The default min
2771# version is assumed to be the
2772#
2773ifeq ($(KBUILD_TARGET),darwin)
2774 # The minimum macOS version we're targetting.
2775 ifndef VBOX_DEF_MACOSX_VERSION_MIN
2776 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO) # For GAs.
2777 VBOX_DEF_MACOSX_VERSION_MIN := 10.6# Snow Leopard
2778 else if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2779 VBOX_DEF_MACOSX_VERSION_MIN := 10.9# Mavericks
2780 else
2781 VBOX_DEF_MACOSX_VERSION_MIN := 11.0# Big Sur
2782 endif
2783 endif
2784 VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT := $(subst .,,$(VBOX_DEF_MACOSX_VERSION_MIN))
2785
2786 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO) # For GAs.
2787 # Check for the Xcode 4.1 bits in tools/darwin.x86.
2788 if !defined(VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL) \
2789 && !defined(VBOX_XCODE_VERSION) \
2790 && exists "$(KBUILD_DEVTOOLS)/darwin.x86/xcode/v4.1"
2791 VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL := 1
2792 VBOX_PATH_MACOSX_DEVEL_ROOT := $(KBUILD_DEVTOOLS)/darwin.x86/xcode/v4.1
2793 VBOX_XCODE_VERSION := 4.1
2794 else
2795 # Fallback - system / LocalConfig.kmk.
2796 VBOX_PATH_MACOSX_DEVEL_ROOT ?= /Developer
2797 VBOX_PATH_MACOSX_SDK_ROOT ?= $(VBOX_PATH_MACOSX_DEVEL_ROOT)/SDKs
2798 VBOX_PATH_MACOSX_TOOLCHAIN_ROOT ?= $(VBOX_PATH_MACOSX_DEVEL_ROOT)
2799 endif
2800 else ifeq ($(VBOX_GCC_TOOL),VBoxXcode62)
2801 # Use the tool path of the compiler (it's clang, not gcc in this instance).
2802 include $(KBUILD_TOOL_PATHS)/$(VBOX_GCC_TOOL).kmk
2803 VBOX_PATH_MACOSX_DEVEL_ROOT := $(PATH_TOOL_$(VBOX_GCC_TOOL))
2804 # Fallback - system / LocalConfig.kmk.
2805 ifndef VBOX_PATH_MACOSX_DEVEL_ROOT
2806 VBOX_PATH_MACOSX_DEVEL_ROOT := $(firstword $(wildcard /Applications/Xcode.app/Contents/Developer /Developer /Library/Developer))
2807 endif
2808 ifndef VBOX_PATH_MACOSX_SDK_ROOT
2809 VBOX_PATH_MACOSX_SDK_ROOT := $(firstword $(wildcard \
2810 $(PATH_TOOL_$(VBOX_GCC_TOOL)_SDKS) \
2811 $(VBOX_PATH_MACOSX_DEVEL_ROOT)/SDKs/. \
2812 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/. \
2813 /Developer/SDKs/. \
2814 /Library/Developer/CommandLineTools/SDKs/. ))
2815 endif
2816 ifndef VBOX_PATH_MACOSX_TOOLCHAIN_ROOT
2817 VBOX_PATH_MACOSX_TOOLCHAIN_ROOT := $(firstword $(wildcard \
2818 $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN) \
2819 $(VBOX_PATH_MACOSX_DEVEL_ROOT)/Library/Developer/CommandLineTools/. \
2820 $(VBOX_PATH_MACOSX_DEVEL_ROOT)/Toolchains/XcodeDefault.xctoolchain/. \
2821 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/. \
2822 /Library/Developer/CommandLineTools/. \
2823 ) /. )
2824 endif
2825 else
2826 # VBOX_WITH_EVEN_NEWER_XCODE ends up here.
2827 include $(KBUILD_PATH)/tools/$(VBOX_GCC_TOOL).kmk
2828 include $(KBUILD_PATH)/sdks/MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT).kmk
2829 ifndef VBOX_PATH_MACOSX_SDK
2830 VBOX_PATH_MACOSX_SDK := $(PATH_SDK_MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT))
2831 endif
2832 VBOX_PATH_MACOSX_SDK_ROOT = $(dir $(VBOX_PATH_MACOSX_SDK))
2833 endif
2834
2835 # Figure the default SDK location and obsolete linker tricks.
2836 ifeq ($(VBOX_DEF_MACOSX_VERSION_MIN),10.4)
2837 ifeq ($(origin VBOX_DARWIN_CLASSIC_LINKER),undefined)
2838 VBOX_DARWIN_CLASSIC_LINKER := $(shell ld -v 2>&1 )
2839 ifneq ($(filter ld64%, $(subst :, , $(VBOX_DARWIN_CLASSIC_LINKER))),)
2840 export VBOX_DARWIN_CLASSIC_LINKER := -Wl,-classic_linker
2841 else
2842 export VBOX_DARWIN_CLASSIC_LINKER :=
2843 endif
2844 endif
2845 endif
2846 if !defined(VBOX_PATH_MACOSX_SDK) && !defined(VBOX_WITH_EVEN_NEWER_XCODE) # newer xcode handles this above
2847 VBOX_PATH_MACOSX_SDK_ROOT_DIRS ?= \
2848 $(VBOX_PATH_MACOSX_SDK_ROOT) \
2849 $(KBUILD_DEVTOOLS)/darwin.x86/SDKs/ \
2850 $(KBUILD_DEVTOOLS)/darwin.amd64/SDKs/ \
2851 $(KBUILD_DEVTOOLS)/darwin.x86/xcode/v4.1/SDKs \
2852 $(KBUILD_DEVTOOLS)/darwin.x86/xcode/v3.2.6/SDKs
2853 ifeq ($(VBOX_DEF_MACOSX_VERSION_MIN),10.4)
2854 VBOX_PATH_MACOSX_SDK := $(firstword $(wildcard $(addsuffix /MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN)u.sdk, $(VBOX_PATH_MACOSX_SDK_ROOT_DIRS))) \
2855 $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN)u.sdk )
2856 else
2857 VBOX_PATH_MACOSX_SDK := $(firstword $(wildcard $(addsuffix /MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN).sdk, $(VBOX_PATH_MACOSX_SDK_ROOT_DIRS))) \
2858 $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN).sdk )
2859 endif
2860 endif
2861
2862 ## The Xcode version (not relevant for command line tools, so we skip this in VBOX_WITH_EVEN_NEWER_XCODE mode).
2863 ifdef VBOX_WITH_EVEN_NEWER_XCODE
2864 VBOX_XCODE_VERSION ?= 10.98## Just a high non-existing version number.
2865 else ifeq ($(KBUILD_HOST),darwin)
2866 ifndef VBOX_XCODE_VERSION
2867 if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2868 VBOX_XCODE_VERSION := $(shell exec $(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/xcodebuild -version 2>&1)
2869 ifneq ($(pos Symbol not found,$(VBOX_XCODE_VERSION)),0) # Try detect unresolved symbol running Xcode 6.2 on Catalina.
2870 VBOX_XCODE_VERSION = 6.2
2871 else
2872 VBOX_XCODE_VERSION := $(word 2, $(VBOX_XCODE_VERSION))
2873 endif
2874 else if defined(VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL) || exists "$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/xcodebuild"
2875 VBOX_XCODE_VERSION := $(word 2, $(shell $(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/xcodebuild -version))
2876 else
2877 VBOX_XCODE_VERSION := $(word 2, $(shell xcodebuild -version))
2878 endif
2879 ifeq ($(strip $(VBOX_XCODE_VERSION)),)
2880 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
2881 VBOX_XCODE_VERSION := 4.1
2882 else if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2883 VBOX_XCODE_VERSION := 6.2
2884 else
2885 VBOX_XCODE_VERSION := 9.4# whatever
2886 endif
2887 endif
2888 endif
2889 if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2890 ifdef KBUILD_USE_KOBJCACHE
2891 $(warning KBUILD_USE_KOBJCACHE does _not_ currently work with this version of Xcode)
2892 endif
2893 endif
2894 else
2895 VBOX_XCODE_VERSION ?= 4.1## @todo Anything special for GA, extpack and valkit tools fetching?
2896 endif
2897 VBOX_XCODE_VERSION_MAJOR := $(word 1, $(subst ., ,$(VBOX_XCODE_VERSION)))
2898 VBOX_XCODE_VERSION_MINOR := $(word 2, $(subst ., ,$(VBOX_XCODE_VERSION)))
2899 VBOX_XCODE_VERSION := $(VBOX_XCODE_VERSION_MAJOR).$(VBOX_XCODE_VERSION_MINOR)
2900
2901 ifeq ($(KBUILD_TARGET_ARCH),x86)
2902 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5)
2903 VBOX_DARWIN_NO_COMPACT_LINKEDIT ?= $(VBOX_LD_no_compact_linkedit)
2904 TOOL_GXX4MACHO_SUFFIX ?= -4.0
2905 endif
2906 else if $(VBOX_XCODE_VERSION_MAJOR) < 4 && "$(VBOX_XCODE_VERSION)" != "3.2"
2907 ifeq ($(PATH_CURRENT),$(PATH_ROOT)/tools)
2908 $(warning VBox: 64-bit darwin builds require Xcode 3.2 or later, you have $(VBOX_XCODE_VERSION))
2909 else
2910 $(error VBox: 64-bit darwin builds require Xcode 3.2 or later, you have $(VBOX_XCODE_VERSION))
2911 endif
2912 endif
2913 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
2914 if $(VBOX_XCODE_VERSION_MAJOR) > 4 || ($(VBOX_XCODE_VERSION_MAJOR) == 4 && $(VBOX_XCODE_VERSION_MINOR) >= 2)
2915 TOOL_GXX4MACHO_PREFIX ?= llvm-
2916 endif
2917 if $(VBOX_XCODE_VERSION_MAJOR) < 5
2918 TOOL_GXX4MACHO_SUFFIX ?= -4.2
2919 endif
2920 VBOX_DARWIN_NO_COMPACT_LINKEDIT ?=
2921
2922 TOOL_GCC4MACHO_SUFFIX ?= $(TOOL_GXX4MACHO_SUFFIX)$(HOSTSUFF_EXE)
2923 TOOL_GCC4MACHO_PREFIX ?= $(TOOL_GXX4MACHO_PREFIX)
2924 if defined(VBOX_WITH_MACOSX_COMPILERS_FROM_DEVEL)
2925 TOOL_GCC4MACHO_PREFIX := $(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)/usr/bin/$(TOOL_GCC4MACHO_PREFIX)
2926 TOOL_GXX4MACHO_PREFIX := $(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)/usr/bin/$(TOOL_GXX4MACHO_PREFIX)
2927 TOOL_GCC4MACHO_SUFFIX := $(TOOL_GCC4MACHO_SUFFIX) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2928 TOOL_GXX4MACHO_SUFFIX := $(TOOL_GXX4MACHO_SUFFIX) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2929 ifndef SVN # must expand first so we won't be using old svn.
2930 SVN := $(firstword $(which svn) svn)
2931 endif
2932 if $(VBOX_XCODE_VERSION_MAJOR) > 4 || ($(VBOX_XCODE_VERSION_MAJOR) == 4 && $(VBOX_XCODE_VERSION_MINOR) >= 2)
2933 export PATH:=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/:$(VBOX_PATH_MACOSX_SDK)/usr/bin:$(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)/usr/bin:$(PATH)
2934 export DEVELOPER_DIR:=$(VBOX_PATH_MACOSX_DEVEL_ROOT)
2935 else
2936 export PATH:=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/:$(PATH)
2937 endif
2938 TOOL_GXX32_CC = $(TOOL_GCC4MACHO_PREFIX)gcc$(TOOL_GCC4MACHO_SUFFIX) -m32
2939 TOOL_GXX32_CXX = $(TOOL_GCC4MACHO_PREFIX)g++$(TOOL_GCC4MACHO_SUFFIX) -m32
2940 TOOL_GXX32_LD = $(TOOL_GXX32_CXX)
2941 override TOOL_StandardDTrace_DTRACE := dtrace "-xcpppath=$(TOOL_GCC4MACHO_PREFIX)cpp-4.2"
2942 endif
2943 if $(VBOX_XCODE_VERSION_MAJOR) < 5
2944 ## @todo WTF do we do the -m32/64 stuff here for these compilers? Also the visibility should be elsewhere...
2945 TOOL_GXX4MACHO_OBJC = $(TOOL_GCC4MACHO_PREFIX)gcc$(TOOL_GCC4MACHO_SUFFIX) $(if-expr $(KBUILD_TARGET_ARCH) == "x86",-m32,-m64) -fvisibility=hidden
2946 TOOL_GXX4MACHO_OBJCXX = $(TOOL_GCC4MACHO_PREFIX)gcc$(TOOL_GCC4MACHO_SUFFIX) $(if-expr $(KBUILD_TARGET_ARCH) == "x86",-m32,-m64) -fvisibility=hidden -fvisibility-inlines-hidden
2947 endif
2948 else if1of ($(VBOX_GCC_TOOL), VBoxXcode62)
2949 if $(KBUILD_HOST_VERSION_MAJOR) >= 18 # HACK ALERT! dtrace doesn't work on Mojave if we specify our Xcode 6.2 environment.
2950 override TOOL_StandardDTrace_DTRACE := dtrace "-xcpppath=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/gcc"
2951 else
2952 override TOOL_StandardDTrace_DTRACE := $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) dtrace "-xcpppath=$(VBOX_PATH_MACOSX_DEVEL_ROOT)/usr/bin/gcc"
2953 endif
2954 export PATH:=$(VBOX_PATH_MACOSX_SDK)/usr/bin:$(PATH)
2955 else # effectively VBOX_WITH_EVEN_NEWER_XCODE
2956 override TOOL_StandardDTrace_DTRACE := $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) dtrace "-xcpppath=$(filter-out -f%,$(TOOL_$(VBOX_GCC_TOOL)_CC))"
2957 endif
2958
2959 ifdef VBOX_WITH_EVEN_NEWER_XCODE
2960 VBOX_DARWIN_DEF_SDK_SDKS := MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)
2961 VBOX_DARWIN_DEF_SDK_DEFS := MAC_OS_X_VERSION_MAX_ALLOWED=$(SDK_MACOSX$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)_VERSION_VALUE)
2962 VBOX_DARWIN_DEF_SDK_LDFLAGS = $(VBOX_DARWIN_CLASSIC_LINKER) $(VBOX_DARWIN_NO_COMPACT_LINKEDIT)
2963 else
2964 VBOX_DARWIN_DEF_SDK_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)0 \
2965 MAC_OS_X_VERSION_MAX_ALLOWED=$(VBOX_DEF_MACOSX_VERSION_MIN_NO_DOT)0
2966 VBOX_DARWIN_DEF_SDK_CFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2967 VBOX_DARWIN_DEF_SDK_CXXFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2968 VBOX_DARWIN_DEF_SDK_OBJCFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2969 VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot "$(VBOX_PATH_MACOSX_SDK)"
2970 VBOX_DARWIN_DEF_SDK_LDFLAGS = -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK)" \
2971 $(VBOX_DARWIN_CLASSIC_LINKER) $(VBOX_DARWIN_NO_COMPACT_LINKEDIT)
2972 endif
2973
2974 # specific versions - only used by xpcom18a4 (python) and 10.7 by UsbWebcam.
2975 ## @todo s/VBOX_DARWIN_DEF_SDK_10/VBOX_DARWIN_SDK_10/g
2976
2977 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4) # classic linker detection is bust otherwise
2978 VBOX_PATH_MACOSX_SDK_10_4 ?= $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.4u.sdk
2979 VBOX_DARWIN_DEF_SDK_10_4_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1040 MAC_OS_X_VERSION_MAX_ALLOWED=1040
2980 VBOX_DARWIN_DEF_SDK_10_4_CFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2981 VBOX_DARWIN_DEF_SDK_10_4_CXXFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2982 VBOX_DARWIN_DEF_SDK_10_4_OBJCFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2983 VBOX_DARWIN_DEF_SDK_10_4_OBJCXXFLAGS := -mmacosx-version-min=10.4 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_4)"
2984 VBOX_DARWIN_DEF_SDK_10_4_LDFLAGS := -mmacosx-version-min=10.4 -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK_10_4)" $(VBOX_DARWIN_CLASSIC_LINKER)
2985 else
2986 VBOX_PATH_MACOSX_SDK_10_4 = $(error VBox: $(if $(target),$(target): ,)Using 10.4 SDK)
2987 VBOX_DARWIN_DEF_SDK_10_4_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.4 SDK)
2988 VBOX_DARWIN_DEF_SDK_10_4_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.4 SDK)
2989 endif
2990
2991 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5)
2992 VBOX_PATH_MACOSX_SDK_10_5 ?= $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.5.sdk
2993 VBOX_DARWIN_DEF_SDK_10_5_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1050 MAC_OS_X_VERSION_MAX_ALLOWED=1050
2994 VBOX_DARWIN_DEF_SDK_10_5_CFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
2995 VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
2996 VBOX_DARWIN_DEF_SDK_10_5_OBJCFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
2997 VBOX_DARWIN_DEF_SDK_10_5_OBJCXXFLAGS := -mmacosx-version-min=10.5 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_5)"
2998 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)
2999 else
3000 VBOX_PATH_MACOSX_SDK_10_5 = $(error VBox: $(if $(target),$(target): ,)Using 10.5 SDK)
3001 VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.5 SDK)
3002 VBOX_DARWIN_DEF_SDK_10_5_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.5 SDK)
3003 endif
3004
3005 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5 10.6)
3006 VBOX_PATH_MACOSX_SDK_10_6 ?= $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.6.sdk
3007 VBOX_DARWIN_DEF_SDK_10_6_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1060 MAC_OS_X_VERSION_MAX_ALLOWED=1060
3008 VBOX_DARWIN_DEF_SDK_10_6_CFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3009 VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3010 VBOX_DARWIN_DEF_SDK_10_6_OBJCFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3011 VBOX_DARWIN_DEF_SDK_10_6_OBJCXXFLAGS := -mmacosx-version-min=10.6 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_6)"
3012 VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS := -mmacosx-version-min=10.6 -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK_10_6)"
3013 else
3014 VBOX_PATH_MACOSX_SDK_10_6 = $(error VBox: $(if $(target),$(target): ,)Using 10.6 SDK)
3015 VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.6 SDK)
3016 VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.6 SDK)
3017 endif
3018
3019 if1of ($(VBOX_DEF_MACOSX_VERSION_MIN), 10.4 10.5 10.6 10.7)
3020 ifndef VBOX_PATH_MACOSX_SDK_10_7
3021 ifneq ($(wildcard $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.7.sdk),)
3022 VBOX_PATH_MACOSX_SDK_10_7 = $(VBOX_PATH_MACOSX_SDK_ROOT)/MacOSX10.7.sdk
3023 else
3024 VBOX_PATH_MACOSX_SDK_10_7 = $(KBUILD_DEVTOOLS)/darwin.x86/SDKs/MacOSX10.7.sdk
3025 endif
3026 endif
3027 VBOX_DARWIN_DEF_SDK_10_7_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=1070 MAC_OS_X_VERSION_MAX_ALLOWED=1070
3028 VBOX_DARWIN_DEF_SDK_10_7_CFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3029 VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3030 VBOX_DARWIN_DEF_SDK_10_7_OBJCFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3031 VBOX_DARWIN_DEF_SDK_10_7_OBJCXXFLAGS := -mmacosx-version-min=10.7 -isysroot "$(VBOX_PATH_MACOSX_SDK_10_7)"
3032 VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS := -mmacosx-version-min=10.7 -Wl,-syslibroot,"$(VBOX_PATH_MACOSX_SDK_10_7)"
3033 else
3034 VBOX_PATH_MACOSX_SDK_10_7 = $(error VBox: $(if $(target),$(target): ,)Using 10.7 SDK)
3035 VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.7 SDK)
3036 VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS = $(error VBox: $(if $(target),$(target): ,)Using 10.7 SDK)
3037 endif
3038
3039 #
3040 # Use bison and flex from Xcode to avoid linking issues (bison).
3041 #
3042 TOOL_BISON_YACC ?= $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN_BIN_SLASH)bison
3043 TOOL_FLEX_LEX ?= $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(PATH_TOOL_$(VBOX_GCC_TOOL)_TOOLCHAIN_BIN_SLASH)flex
3044
3045 #
3046 # Disable VMNet if the SDK is too old.
3047 #
3048 if defined(VBOX_WITH_VMNET) && "$(VBOX_DEF_MACOSX_VERSION_MIN)" vlt "10.15"
3049 VBOX_WITH_VMNET :=
3050 endif
3051
3052endif # target=darwin
3053
3054#
3055# Macro switching between @executable_path, @rpath and /Applications/VirtualBox.app
3056# depending on whether the build is hardened or not (dylib install_name).
3057#
3058ifeq ($(KBUILD_TARGET),darwin)
3059 ifndef VBOX_DYLD_EXECUTABLE_PATH
3060 ifdef VBOX_WITH_HARDENING
3061 VBOX_DYLD_EXECUTABLE_PATH = $(VBOX_PATH_APP_PRIVATE_ARCH)
3062 else if 0
3063 VBOX_DYLD_EXECUTABLE_PATH = @executable_path
3064 else
3065 VBOX_DYLD_EXECUTABLE_PATH = @rpath
3066 VBOX_WITH_RELATIVE_RUNPATH = @loader_path/
3067 endif
3068 endif
3069endif
3070
3071#
3072# Check for incompatible rpath combinations.
3073#
3074if defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_ORIGIN)
3075 $(error VBox: VBOX_WITH_RUNPATH and VBOX_WITH_ORIGIN are mutually exclusive)
3076endif
3077if defined(VBOX_WITH_RELATIVE_RUNPATH) && defined(VBOX_WITH_ORIGIN)
3078 $(error VBox: VBOX_WITH_RELATIVE_RUNPATH and VBOX_WITH_ORIGIN are mutually exclusive)
3079endif
3080if defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_RELATIVE_RUNPATH)
3081 $(error VBox: VBOX_WITH_RUNPATH and VBOX_WITH_RELATIVE_RUNPATH are mutually exclusive)
3082endif
3083if defined(VBOX_WITH_RELATIVE_RUNPATH) && defined(VBOX_WITH_HARDENING)
3084 $(error VBox: VBOX_WITH_RELATIVE_RUNPATH and VBOX_WITH_HARDENING are mutually exclusive)
3085endif
3086
3087#
3088# VBOX_WITH_ORIGIN translates into VBOX_WITH_RELATIVE_RUNPATH.
3089#
3090# We use two helper variables for the VBOX_WITH_ORIGIN stuff:
3091# VBOX_ORIGIN - Indirect expansion trick.
3092# VBOX_GCC_RPATH_OPT - Different GCC/LD combinations needs different options.
3093#
3094VBOX_ORIGIN = $$ORIGIN
3095ifeq ($(KBUILD_TARGET),solaris)
3096 VBOX_GCC_RPATH_OPT = -R
3097else
3098 VBOX_GCC_RPATH_OPT = -Wl,-rpath,
3099 VBOX_GCC_ORIGIN_OPT = -Wl,-z,origin
3100endif
3101ifdef VBOX_WITH_ORIGIN
3102 VBOX_WITH_RELATIVE_RUNPATH = $$(VBOX_ORIGIN)
3103endif
3104
3105
3106#
3107# Configure 'asan' type builds.
3108#
3109# We ASSUME that anyone doing this kind of build on linux has a compiler
3110# with sanitizer support (otherwise we'd end up with a circular dependency
3111# with DynamicConfig.kmk here to check the compiler version).
3112#
3113ifeq ($(KBUILD_TYPE),asan)
3114 if "$(KBUILD_TARGET)" == "linux"
3115 VBOX_WITH_GCC_SANITIZER := 1
3116 else if "$(KBUILD_TARGET)" == "darwin"
3117 VBOX_WITH_GCC_SANITIZER := 1
3118 else if "$(KBUILD_TARGET)" == "win"
3119 VBOX_WITH_VCC_SANITIZER := 1
3120 else
3121 VBOX_WITH_EF_WRAPS := 1
3122 endif
3123endif
3124
3125#
3126# The address sanitiser library intercepts dlopen() and breaks RPATH $ORIGIN,
3127# so we need to link it statically or set LD_LIBRARY_PATH. To link statically,
3128# set VBOX_WITH_GCC_SANITIZER_STATIC in addition.
3129#
3130ifdef VBOX_WITH_GCC_SANITIZER
3131 VBOX_GCC_SANITIZER_FLAGS := \
3132 -fsanitize=undefined \
3133 -fsanitize=address \
3134 -fsanitize=return \
3135 -fsanitize=bounds \
3136 -fsanitize=object-size \
3137 -fno-sanitize=alignment \
3138 -fno-sanitize=vptr \
3139 -fno-common \
3140 -DIPRT_WITH_GCC_SANITIZER \
3141 -DVBOX_WITH_GCC_SANITIZER
3142else ifdef VBOX_WITH_CLANG_SANITIZER ## @todo make work...
3143 VBOX_GCC_SANITIZER_FLAGS := \
3144 -DIPRT_WITH_GCC_SANITIZER \
3145 -DVBOX_WITH_GCC_SANITIZER \
3146 -fsanitize=object-size \
3147 -fsanitize-undefined-trap-on-error
3148else
3149 VBOX_GCC_SANITIZER_FLAGS =
3150endif
3151
3152# -libasan-static is currently not supported in combination with -no-undefined.
3153VBOX_GCC_NO_UNDEFINED :=
3154VBOX_GCC_NO_UNDEFINED_R0 :=
3155ifdef VBOX_WITH_GCC_SANITIZER
3156 ifdef VBOX_WITH_GCC_SANITIZER_STATIC
3157 VBOX_GCC_NO_UNDEFINED := -Wl,--no-undefined
3158 VBOX_GCC_NO_UNDEFINED_R0 := -no-undefined
3159 VBOX_GCC_SANITIZER_LDFLAGS += -static-libasan
3160 else
3161 if "$(KBUILD_TARGET)" == "darwin"
3162 VBOX_GCC_SANITIZER_LDFLAGS += -fsanitize=address
3163 else
3164 VBOX_GCC_SANITIZER_LDFLAGS += -lasan
3165 endif
3166 endif
3167endif
3168
3169# The config for Visual C++ 2019 update 9 and later.
3170ifdef VBOX_WITH_VCC_SANITIZER
3171 VBOX_VCC_SANITIZER_FLAGS := -fsanitize=address -fno-sanitize-address-vcasan-lib
3172 # experimental: VBOX_VCC_SANITIZER_FLAGS += /fsanitize-address-use-after-return
3173 VBOX_VCC_SANITIZER_LDFLAGS :=
3174else
3175 VBOX_VCC_SANITIZER_FLAGS :=
3176 VBOX_VCC_SANITIZER_LDFLAGS :=
3177endif
3178
3179
3180#
3181# The X11 headers.
3182#
3183VBOX_PATH_X11_ROOT = $(PATH_ROOT)/src/VBox/Additions/x11/x11include
3184
3185
3186#
3187# Miscellaneous includes
3188#
3189VBOX_GRAPHICS_INCS = $(PATH_ROOT)/include/VBox/Graphics
3190VBOX_JPEG_INCS = $(PATH_ROOT)/src/libs/libjpeg-turbo-2.1.3
3191
3192
3193# The icons to use.
3194ifdef VBOX_OSE
3195 VBOX_WINDOWS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/OSE/VirtualBox_win.ico
3196 VBOX_WINDOWS_ADDITIONS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/OSE/VirtualBox_win.ico
3197 VBOX_NSIS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/OSE/VirtualBox_win.ico
3198 VBOX_MACOSX_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/darwin/OSE/VirtualBox.icns
3199else
3200 VBOX_WINDOWS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/NonOSE/VirtualBox-vista.ico
3201 VBOX_WINDOWS_ADDITIONS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/NonOSE/VirtualBoxGA-vista.ico
3202 VBOX_NSIS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/win/NonOSE/VirtualBoxGA-nsis.ico
3203 VBOX_MACOSX_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/darwin/NonOSE/VirtualBox.icns
3204 ifeq ($(KBUILD_HOST),win)
3205 TOOL_VCC80X86_RC := $(KBUILD_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
3206 TOOL_VCC80AMD64_RC := $(KBUILD_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
3207 TOOL_VCC70_RC := $(KBUILD_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
3208 endif
3209endif
3210
3211
3212ifndef VBOX_NOINC_DYNAMIC_CONFIG_KMK
3213 #
3214 # GCC, YASM, PyLint, ++ dynamic properties.
3215 #
3216 # Most of this is resolved on first kmk invocation and cached in PATH_OUT.
3217 #
3218 # Note! That a harmless warning is printed if the file doesn't exist.
3219 # Note! Changes in GCC are not detected automatically (yet).
3220 #
3221 ifndef CLOSEPAR
3222 CLOSEPAR := )
3223 endif
3224 if1of ($(KBUILD_HOST), os2 win)
3225 VBOX_DEV_NULL := nul
3226 VBOX_DEV_NULL_ALT := NUL
3227 else
3228 VBOX_DEV_NULL := /dev/null
3229 VBOX_DEV_NULL_ALT := /dev/./null
3230 endif
3231
3232 # GCC macros.
3233 ifdef VBOX_GCC_TOOL
3234 # Load the tools files first.
3235 if $(pos VBox,$(VBOX_GCC_TOOL)) > 0
3236 include $(KBUILD_TOOL_PATHS)/$(VBOX_GCC_TOOL).kmk
3237 else
3238 include $(KBUILD_PATH)/tools/$(VBOX_GCC_TOOL).kmk
3239 endif
3240 ifdef VBOX_GCC32_TOOL
3241 ifneq ($(VBOX_GCC_TOOL),$(VBOX_GCC32_TOOL))
3242 if $(pos VBox,$(VBOX_GCC32_TOOL)) > 0
3243 include $(KBUILD_TOOL_PATHS)/$(VBOX_GCC32_TOOL).kmk
3244 else
3245 include $(KBUILD_PATH)/tools/$(VBOX_GCC32_TOOL).kmk
3246 endif
3247 endif
3248 endif
3249
3250 # Note! The chcking for 'error: unknown warning option' is for clang on darwin not giving us a
3251 # non-zero exit code when using an invalid option here, but it does later on.
3252 VBOX_GCC_CHECK_EX_CC_CXX = $(shell \
3253 if $(1) $(subst -Wno-,-W,$(2)) -Werror -c -o $(VBOX_DEV_NULL) $(4) > $(VBOX_DEV_NULL) 2>&1; then \
3254 case "`LC_ALL=C $(1) $(subst -Wno-,-W,$(2)) -Werror -c -o $(VBOX_DEV_NULL) $(4) 2>&1`" in \
3255 "error: unknown warning option"*$(CLOSEPAR) echo "$(3)";; \
3256 *$(CLOSEPAR) echo "$(2)";; \
3257 esac; \
3258 else echo "$(3)"; fi; )
3259 VBOX_GCC_CHECK_EX_CC = $(call VBOX_GCC_CHECK_EX_CC_CXX,$(1),$(2),$(3),-xc $(PATH_OUT)/DynamicConfig.c)
3260 VBOX_GCC_CHECK_EX_CXX = $(call VBOX_GCC_CHECK_EX_CC_CXX,$(1),$(2),$(3),-xc++ $(PATH_OUT)/DynamicConfig.cpp)
3261 VBOX_GCC_CHECK_EX_LD = $(shell \
3262 if $(1) -Wl,$(2) $(if $(eq $(KBUILD_HOST),darwin),-Wl$(COMMA)-u$(COMMA)start -Wl$(COMMA)-undefined$(COMMA)dynamic_lookup,) \
3263 -nostdlib -o $(VBOX_DEV_NULL) -xc $(VBOX_DEV_NULL) > /dev/null 2>&1; \
3264 then echo "-Wl,$(2)"; else echo "$(3)"; fi; )
3265
3266 VBOX_GCC_CHECK_CC = $(call VBOX_GCC_CHECK_EX_CC, $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_CC),$1,$2)
3267 VBOX_GCC_CHECK_CXX = $(call VBOX_GCC_CHECK_EX_CXX, $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_CXX),$1,$2)
3268 VBOX_GCC_CHECK_LD = $(call VBOX_GCC_CHECK_EX_LD, $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_LD),$1,$2)
3269 ifdef VBOX_GCC32_TOOL
3270 VBOX_GCC32_CHECK_CXX = $(call VBOX_GCC_CHECK_EX_CXX, $(TOOL_$(VBOX_GCC32_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC32_TOOL)_CXX),$1,$2)
3271 endif
3272
3273 # This is kind of bad, the returned string needs to be re-evaluated before use.
3274 # The reason for this hack is that the windows kmk_ash cannot deal with $((1+1)). <-- no longer true.
3275 # Some versions of gcc (e.g. openSUSE11) return only major.minor on `gcc -dumpversion`.
3276 # gcc-5 of openSUSE42.1 only returns the major version on `gcc -dumpversion`!
3277 VBOX_GCC_VERSION = $(shell ($(1) -dumpfullversion 2>/dev/null || $(1) -dumpversion) | \
3278 $(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))|' )
3279 VBOX_CLANG_VERSION = $(shell $(1) --version | \
3280 $(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' )
3281 endif # VBOX_GCC_TOOL
3282
3283 # YASM macros
3284 if !defined(DONT_USE_YASM) && "$(intersects $(KBUILD_HOST_ARCH) $(KBUILD_TARGET_ARCH), x86 amd64 arm64)" != ""
3285 include $(KBUILD_PATH)/tools/YASM.kmk
3286 VBOX_YASM_CHECK = $(if-expr "$(shell $(TOOL_YASM_AS) -e -o $(VBOX_DEV_NULL) $1 - < /dev/null 2>&1)" == "",$(1),)
3287 endif
3288
3289 # NASM macros (input and output must differ with recent versions (strcmp)).
3290 if !defined(DONT_USE_NASM) && "$(intersects $(KBUILD_HOST_ARCH) $(KBUILD_TARGET_ARCH), x86 amd64 arm64)" != ""
3291 include $(KBUILD_PATH)/tools/NASM.kmk
3292 VBOX_NASM_CHECK = $(if-expr "$(shell $(TOOL_NASM_AS) -e -o $(VBOX_DEV_NULL) $1 $(VBOX_DEV_NULL_ALT) 2>&1)" == "",$(1),$(2))
3293 endif
3294
3295 # Figures the pylint version.
3296 VBOX_PYLINT_FIGURE_VERSION = $(shell $(1) --version 2> /dev/null \
3297 | $(SED_EXT) -n -e 's/pylint-[^[:blank:]]*/pylint/' \
3298 -e 's|^ *pylint *\([0-9][0-9]*\).\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$(DOLLAR)|$$(expr \1 * 10000 + \2 * 100 + \3)|p' )
3299
3300 # Java stuff.
3301 ifeq ($(KBUILD_TARGET),darwin)
3302 VBOX_JAVA_BIN_PATH = $(firstword $(wildcard \
3303 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Commands \
3304 /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands \
3305 $(if-expr $(VBOX_XCODE_VERSION_MAJOR) >= 4,/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands,) \
3306 $(if-expr $(VBOX_XCODE_VERSION_MAJOR) >= 10,/Library/Java/JavaVirtualMachines/jdk1.8.*.jdk/Contents/Home/bin,) \
3307 ) /usr/bin)
3308 VBOX_JAVA = $(VBOX_JAVA_BIN_PATH)/java
3309 VBOX_JAVAC = $(VBOX_JAVA_BIN_PATH)/javac
3310 VBOX_JAVAH = $(VBOX_JAVA_BIN_PATH)/javah
3311 VBOX_JAR = $(VBOX_JAVA_BIN_PATH)/jar
3312 VBOX_JAVADOC = $(VBOX_JAVA_BIN_PATH)/javadoc
3313 VBOX_WSIMPORT = $(VBOX_JAVA_BIN_PATH)/wsimport
3314 if $(VBOX_XCODE_VERSION_MAJOR) >= 4 # Lion (4.1-preview 5) has a broken CurrentJDK link. Blindly applying it to 4.0.
3315 VBOX_JAVA_INC = $(firstword $(wildcard \
3316 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers \
3317 /Library/Java/JavaVirtualMachines/jdk*1.8*.jdk/Contents/Home/include \
3318 ) )
3319 else
3320 VBOX_JAVA_INC = $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Headers
3321 endif
3322
3323 else # !darwin
3324
3325 ifeq ($(KBUILD_TARGET),linux)
3326 ifeq ($(origin VBOX_JAVA_HOME),undefined)
3327 # Add correct detection for you distro after the /usr/../java-6-sun line.
3328 VBOX_JAVA_HOME := $(firstword $(wildcard \
3329 $(KBUILD_DEVTOOLS)/linux.x86/jdk1.6.0_27 \
3330 /usr/lib/jvm/java-6-sun \
3331 /usr/lib/jvm/java-6-openjdk \
3332 /usr/lib/jvm/java-6-openjdk-i386 \
3333 /usr/lib/jvm/java-6-openjdk-amd64 \
3334 /usr/lib/jvm/java-7-openjdk-i386 \
3335 /usr/lib/jvm/java-7-openjdk-amd64 \
3336 /usr/lib/jvm/default-java \
3337 /usr/lib/jvm/java \
3338 /usr/lib/jvm/jre \
3339 \
3340 /usr/lib/jvm/sun-jdk-1.6 \
3341 ) /usr/lib/jvm/java-6-sun)
3342 endif
3343 endif
3344
3345 ifeq ($(KBUILD_TARGET),solaris)
3346 # VBOX_JAVA_HOME ?= /usr/jdk/jdk1.6.0
3347 VBOX_JAVA_HOME ?= $(firstword $(abspath $(wildcard \
3348 /usr/jdk/latest/include/.. \
3349 /usr/jdk/instances/jdk1.8*/include/.. \
3350 /usr/jdk/instances/jdk1.7*/include/.. \
3351 /usr/jdk/instances/jdk1.6*/include/.. \
3352 )) /usr/java)
3353 endif
3354
3355 ifeq ($(KBUILD_TARGET),win)
3356 VBOX_JAVA_HOME ?= c:/jdk
3357 endif
3358
3359 VBOX_JAVA_BIN_PATH ?= $(VBOX_JAVA_HOME)/bin
3360 VBOX_JAVA ?= "$(VBOX_JAVA_BIN_PATH)/java$(HOSTSUFF_EXE)"
3361 VBOX_JAVAC = "$(VBOX_JAVA_BIN_PATH)/javac$(HOSTSUFF_EXE)"
3362 VBOX_JAVAH = "$(VBOX_JAVA_BIN_PATH)/javah$(HOSTSUFF_EXE)"
3363 VBOX_JAR = "$(VBOX_JAVA_BIN_PATH)/jar$(HOSTSUFF_EXE)"
3364 VBOX_JAVADOC = "$(VBOX_JAVA_BIN_PATH)/javadoc$(HOSTSUFF_EXE)"
3365 # With Java 11 wsimport was removed, usually part of a separate install now.
3366 VBOX_WSIMPORT = $(firstword $(wildcard $(VBOX_JAVA_BIN_PATH)/wsimport$(HOSTSUFF_EXE)) wsimport$(HOSTSUFF_EXE))
3367 # correct for targets we care about
3368 VBOX_MD_OS = $(KBUILD_TARGET)
3369 VBOX_JAVA_INC = \
3370 $(VBOX_JAVA_HOME)/include \
3371 $(VBOX_JAVA_HOME)/include/$(VBOX_MD_OS)
3372 endif # !darwin
3373
3374 # The first transform the almost usless openjdk versions like "javac 9-Ubuntu" into something the 2nd expression groks.
3375 VBOX_JAVA_FIGURE_VERSION = $(shell $(1) -version 2>&1 \
3376 | $(SED_EXT) -n \
3377 -e 's/ \([0-9][0-9]*\)\(-[[:alpha:]][[:alpha:]]\)/ \1.0.0\2/' \
3378 -e 's|^[^ ]* *\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$(DOLLAR)|$$(expr \1 * 10000 + \2 * 100 + \3)|p' )
3379
3380
3381 # Test C and C++ files.
3382 $(PATH_OUT)/DynamicConfig.c $(PATH_OUT)/DynamicConfig.cpp:
3383 $(QUIET)$(MKDIR) -p $(@D)
3384 $(QUIET)$(APPEND) -tn "$@" "int foobar(void)" "{" " return 42;" "}" ""
3385
3386 # No $(QUIET) here as it's interesting to see what goes into the file.
3387 $(PATH_OUT)/DynamicConfig.kmk: \
3388 $(PATH_ROOT)/Config.kmk \
3389 $(LOCALCFG) \
3390 $(AUTOCFG) \
3391 $(VBOX_GCC_PATH_CC) \
3392 $(VBOX_GCC_PATH_CXX) \
3393 $(VBOX_GCC_LIBGCC) \
3394 $(VBOX_GCC32_PATH_CC) \
3395 $(VBOX_GCC32_PATH_CXX) \
3396 $(VBOX_GCC32_LIBGCC) \
3397 $(if-expr "$(KBUILD_HOST).$(KBUILD_HOST_ARCH)" == "solaris.amd64" && $(KBUILD_HOST_VERSION_MINOR) >= 11 \
3398 , /platform/i86pc/kernel/$(KBUILD_HOST_ARCH)/unix,) \
3399 | $(PATH_OUT)/DynamicConfig.c $(PATH_OUT)/DynamicConfig.cpp
3400 $(call MSG_GENERATE,,$@,)
3401 $(QUIET)$(RM) -f '$@'
3402 $(QUIET)$(MKDIR) -p $(@D)
3403 $(QUIET)$(APPEND) '$@' '# Host version: $(KBUILD_HOST_VERSION_MAJOR).$(KBUILD_HOST_VERSION_MINOR).$(KBUILD_HOST_VERSION_PATCH); full: $(KBUILD_HOST_VERSION)'
3404 ifneq ($(KBUILD_TARGET),win)
3405 $(QUIET)$(APPEND) '$@' '# $(KBUILD_HOST_UNAME_SYSNAME) - $(KBUILD_HOST_UNAME_RELEASE) - $(KBUILD_HOST_UNAME_VERSION)'
3406 endif
3407 ifeq ($(KBUILD_TARGET),darwin)
3408 $(QUIET)$(APPEND) '$@' '# VBOX_XCODE_VERSION: $(VBOX_XCODE_VERSION)'
3409 $(QUIET)$(APPEND) '$@' '# VBOX_PATH_MACOSX_TOOLCHAIN_ROOT: $(VBOX_PATH_MACOSX_TOOLCHAIN_ROOT)'
3410 $(QUIET)$(APPEND) '$@' '# VBOX_PATH_MACOSX_SDK_ROOT: $(VBOX_PATH_MACOSX_SDK_ROOT)'
3411 $(QUIET)$(APPEND) '$@' '# VBOX_PATH_MACOSX_DEVEL_ROOT: $(VBOX_PATH_MACOSX_DEVEL_ROOT)'
3412 endif
3413 ifdef VBOX_GCC_TOOL
3414 # HC compiler switch detection.
3415 $(QUIET)$(APPEND) '$@' '# VBOX_GCC_TOOL=$(VBOX_GCC_TOOL)'
3416 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CC))'
3417 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CXX))'
3418 if "$(KBUILD_TARGET)" == "darwin" || $(pos CLANG,$(VBOX_GCC_TOOL)) > 0
3419 $(QUIET)$(APPEND) '$@' 'VBOX_CLANG_VERSION_CC ?= $(call VBOX_CLANG_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CC))'
3420 $(QUIET)$(APPEND) '$@' 'VBOX_CLANG_VERSION_CXX ?= $(call VBOX_CLANG_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CXX))'
3421 endif
3422 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_PATH_CC ?= $(which $(TOOL_$(VBOX_GCC_TOOL)_CC))'
3423 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_PATH_CXX ?= $(which $(TOOL_$(VBOX_GCC_TOOL)_CXX))'
3424 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_LIBGCC ?= $(shell $(TOOL_$(VBOX_GCC_TOOL)_CC) -print-libgcc-file-name)'
3425 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-pointer-sign ?= $(call VBOX_GCC_CHECK_CC,-Wno-pointer-sign,)'
3426 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-array_bounds ?= $(call VBOX_GCC_CHECK_CC,-Wno-array-bounds,)'
3427 # -Wextra produces additional useful warnings but includes -Wno-missing-field-initializers (too noisy)
3428 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wextra ?= $(call VBOX_GCC_CHECK_CC,-Wextra,)'
3429 $(QUIET)$(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CC),)'
3430 $(QUIET)$(APPEND) '$@' ' if $$(VBOX_GCC_VERSION_CC) >= 40500'
3431 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_Wlogical-op ?= $(call VBOX_GCC_CHECK_CC,-Wlogical-op,)'
3432 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_Wno-logical-op ?= $$(subst -Wlogical-op,-Wno-logical-op,$$(VBOX_GCC_Wlogical-op))
3433 $(QUIET)$(APPEND) '$@' ' endif'
3434 $(QUIET)$(APPEND) '$@' 'endif'
3435 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-address ?= $(call VBOX_GCC_CHECK_CXX,-Wno-address,)'
3436 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-delete-non-virtual-dtor ?= $(call VBOX_GCC_CHECK_CXX,-Wno-delete-non-virtual-dtor,)'
3437 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-non-virtual-dtor ?= $(call VBOX_GCC_CHECK_CXX,-Wno-non-virtual-dtor,)'
3438 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-int-in-bool-context ?= $(call VBOX_GCC_CHECK_CC,-Wno-int-in-bool-context,)'
3439 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-int-to-pointer-cast ?= $(call VBOX_GCC_CHECK_CC,-Wno-int-to-pointer-cast,)'
3440 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-invalid-offsetof ?= $(call VBOX_GCC_CHECK_CXX,-Wno-invalid-offsetof,)'
3441 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-literal-suffix ?= $(call VBOX_GCC_CHECK_CXX,-Wno-literal-suffix,)'
3442 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-misleading-indentation ?= $(call VBOX_GCC_CHECK_CC,-Wno-misleading-indentation,)'
3443 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-missing-field-initializers ?= $(call VBOX_GCC_CHECK_CC,-Wno-missing-field-initializers,)'
3444 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-pointer-to-int-cast ?= $(call VBOX_GCC_CHECK_CC,-Wno-pointer-to-int-cast,)'
3445 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-variadic-macros ?= $(call VBOX_GCC_CHECK_CXX,-Wno-variadic-macros,)'
3446 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-vla ?= $(call VBOX_GCC_CHECK_CXX,-Wno-vla,)'
3447 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-overlength-strings ?= $(call VBOX_GCC_CHECK_CC,-Wno-overlength-strings,)'
3448 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-overloaded-virtual ?= $(call VBOX_GCC_CHECK_CXX,-Wno-overloaded-virtual,)'
3449 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-ignored-qualifiers ?= $(call VBOX_GCC_CHECK_CXX,-Wno-ignored-qualifiers,)'
3450 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-multistatement-macros ?= $(call VBOX_GCC_CHECK_CXX,-Wno-multistatement-macros,)'
3451 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-class-memaccess ?= $(call VBOX_GCC_CHECK_CXX,-Wno-class-memaccess,)'
3452 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-stringop-overflow ?= $(call VBOX_GCC_CHECK_CXX,-Wno-stringop-overflow,)'
3453 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-stringop-truncation ?= $(call VBOX_GCC_CHECK_CXX,-Wno-stringop-truncation,)'
3454 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-cast-function-type ?= $(call VBOX_GCC_CHECK_CC,-Wno-cast-function-type,)'
3455 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-deprecated-declarations ?= $(call VBOX_GCC_CHECK_CC,-Wno-deprecated-declarations,)'
3456 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-implicit-fallthrough ?= $(call VBOX_GCC_CHECK_CC,-Wno-implicit-fallthrough,)'
3457 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-inline ?= $(call VBOX_GCC_CHECK_CXX,-Wno-inline,)'
3458 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-unknown-pragmas ?= $(call VBOX_GCC_CHECK_CXX,-Wno-unknown-pragmas,)'
3459 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-deprecated-copy ?= $(call VBOX_GCC_CHECK_CXX,-Wno-deprecated-copy,)'
3460 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fno-stack-protector ?= $(call VBOX_GCC_CHECK_CC,-fno-stack-protector,)'
3461 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fno-dwarf2-cfi-asm ?= $(call VBOX_GCC_CHECK_CC,-fno-dwarf2-cfi-asm,)'
3462 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_m64 ?= $(call VBOX_GCC_CHECK_CC,-m64,)'
3463 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_msse4.1 ?= $(call VBOX_GCC_CHECK_CC,-msse4.1,)'
3464 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mavx ?= $(call VBOX_GCC_CHECK_CC,-mavx,)'
3465 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mavx2 ?= $(call VBOX_GCC_CHECK_CC,-mavx2,)'
3466 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_no-pie ?= $(call VBOX_GCC_CHECK_CC,-no-pie,)'
3467 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fdiagnostics-show-option ?= $(call VBOX_GCC_CHECK_CC,-fdiagnostics-show-option,)'
3468 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fno-printf-return-value ?= $(call VBOX_GCC_CHECK_CC,-fno-printf-return-value,)'
3469 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wa_cma_nocompress_debug_sections ?= $(call VBOX_GCC_CHECK_CC,-Wa$(COMMA)--nocompress-debug-sections,)'
3470 # Produce code optimized for the most common IA32/AMD64/EM64T processors. Introduced with gcc version 4.2.
3471 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_mtune-generic ?= $(call VBOX_GCC_CHECK_CC,-mtune=generic,)'
3472 $(QUIET)$(APPEND) '$@' 'VBOX_LD_as_needed ?= $(call VBOX_GCC_CHECK_LD,--as-needed,)'
3473 $(QUIET)$(APPEND) '$@' 'VBOX_LD_hash_style_sysv ?= $(call VBOX_GCC_CHECK_LD,--hash-style=sysv,)'
3474 $(QUIET)$(APPEND) '$@' 'VBOX_LD_gc_sections ?= $(call VBOX_GCC_CHECK_LD,--gc-sections,)'
3475 # Set default attribute for ELF and MACH-O symbols to ``hidden'' to reduce the number
3476 # of relocation entries and PLT indirections in shared libraries. Don't allow for gcc version < 4.
3477 $(QUIET)$(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CC),)'
3478 $(QUIET)$(APPEND) '$@' ' if $$(VBOX_GCC_VERSION_CC) >= 40000'
3479 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_fvisibility-hidden ?= $(call VBOX_GCC_CHECK_CC,-fvisibility=hidden -DVBOX_HAVE_VISIBILITY_HIDDEN -DRT_USE_VISIBILITY_DEFAULT,)'
3480 $(QUIET)$(APPEND) '$@' ' endif'
3481 $(QUIET)$(APPEND) '$@' 'endif'
3482 ifn1of ($(KBUILD_TARGET), haiku)
3483 # Set default attribute for inline functions to ``hidden'' to reduce the number
3484 # of relocation entries and PLT indirections in shared libraries. Don't allow for gcc version < 4.
3485 $(QUIET)$(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CXX),)'
3486 $(QUIET)$(APPEND) '$@' ' if $$(VBOX_GCC_VERSION_CXX) >= 40000'
3487 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_fvisibility-inlines-hidden ?= $(call VBOX_GCC_CHECK_CXX,-fvisibility-inlines-hidden,)'
3488 $(QUIET)$(APPEND) '$@' ' endif'
3489 $(QUIET)$(APPEND) '$@' 'endif'
3490 endif
3491 # Prevent warnings about unused parameters as of gcc-4.8 / clang 6 as this warning is now very verbose
3492 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-unused-parameter ?= $(call VBOX_GCC_CHECK_CC,-Wno-unused-parameter,)'
3493 # Clang 6.
3494 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-language-extension-token ?= $(call VBOX_GCC_CHECK_CC,-Wno-language-extension-token,)'
3495 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-extended-offsetof ?= $(call VBOX_GCC_CHECK_CC,-Wno-extended-offsetof,)'
3496 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-gnu-folding-constant ?= $(call VBOX_GCC_CHECK_CC,-Wno-gnu-folding-constant,)'
3497 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-return-type-c-linkage ?= $(call VBOX_GCC_CHECK_CXX,-Wno-return-type-c-linkage,)'
3498 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-string-plus-int ?= $(call VBOX_GCC_CHECK_CC,-Wno-string-plus-int,)'
3499 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-nested-anon-types ?= $(call VBOX_GCC_CHECK_CC,-Wno-nested-anon-types,)'
3500 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-gnu-anonymous-struct ?= $(call VBOX_GCC_CHECK_CXX,-Wno-gnu-anonymous-struct,)'
3501 # Clang 11.
3502 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-c++17-compat-mangling ?= $(call VBOX_GCC_CHECK_CXX,-Wno-c++17-compat-mangling,)'
3503 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-nullability-extension ?= $(call VBOX_GCC_CHECK_CXX,-Wno-nullability-extension,)'
3504 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-gnu-statement-expression ?= $(call VBOX_GCC_CHECK_CXX,-Wno-gnu-statement-expression,)'
3505 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-import-preprocessor-directive-pedantic ?= $(call VBOX_GCC_CHECK_CXX,-Wno-import-preprocessor-directive-pedantic,)'
3506 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-undefined-var-template ?= $(call VBOX_GCC_CHECK_CXX,-Wno-undefined-var-template,)'
3507 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-c11-extensions ?= $(call VBOX_GCC_CHECK_CXX,-Wno-c11-extensions,)'
3508 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-tautological-pointer-compare ?= $(call VBOX_GCC_CHECK_CC,-Wno-tautological-pointer-compare,)'
3509 # Clang 13.
3510 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_Wno-deprecated-copy ?= $(call VBOX_GCC_CHECK_CC,-Wno-deprecated-copy,)'
3511 ifdef VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION
3512 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fcf-protection_branch ?= $(call VBOX_GCC_CHECK_CXX,-fcf-protection=branch,)'
3513 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_fcf-protection_check ?= $(call VBOX_GCC_CHECK_CXX,-fcf-protection=check)'
3514 endif
3515 ifeq ($(KBUILD_TARGET),solaris)
3516 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_msave-args ?= $(call VBOX_GCC_CHECK_CXX,-msave-args,)'
3517 # Detect the solaris assembler. It is used by the the 4.x gcc compilers,
3518 # apparently. It will not be able to handle IEMAll via a -pipe, only when
3519 # passed a file. The solaris assmbler rulez ... not!
3520 $(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: *//' )'
3521 $(QUIET)$(APPEND) '$@' 'if $$(pos Sun Compiler Common,$$(VBOX_AS_VERSION)) > 0'
3522 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_USING_SOLARIS_AS = 1'
3523 $(QUIET)$(APPEND) '$@' 'endif'
3524 $(QUIET)$(APPEND) '$@' 'ifndef VBOX_GCC_USING_SOLARIS_AS'
3525 $(QUIET)$(APPEND) '$@' ' VBOX_GCC_pipe ?= -pipe'
3526 $(QUIET)$(APPEND) '$@' 'endif'
3527 else
3528 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_pipe ?= -pipe'
3529 endif
3530 # Find the compiler includes for IPRT no-crt.
3531 # Note that `$(dir $(gcc -print-libgcc-file-name))/include does not work for a 64-bit cross build on a 32-bit build host.
3532 $(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'
3533 ifdef VBOX_GCC32_TOOL
3534 # 32-bit (GC) compiler switch detection.
3535 $(QUIET)$(APPEND) '$@' '# VBOX_GCC32_TOOL=$(VBOX_GCC32_TOOL)'
3536 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_PATH_CC ?= $(which $(TOOL_$(VBOX_GCC32_TOOL)_CC))'
3537 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_PATH_CXX ?= $(which $(TOOL_$(VBOX_GCC32_TOOL)_CXX))'
3538 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC32_TOOL)_CC))'
3539 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC32_TOOL)_CXX))'
3540 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_LIBGCC ?= $(shell $(TOOL_$(VBOX_GCC32_TOOL)_CC) -print-libgcc-file-name)'
3541 $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_Wno-variadic-macros ?= $(call VBOX_GCC32_CHECK_CXX,-Wno-variadic-macros,)'
3542 endif
3543 # darwin no_compact_linkedit starting at Xcode 3.2
3544 ifeq ($(KBUILD_HOST),darwin)
3545 $(QUIET)$(APPEND) '$@' 'VBOX_LD_no_compact_linkedit ?= $(call VBOX_GCC_CHECK_LD,-no_compact_linkedit,)'
3546 endif
3547 endif # ifdef VBOX_GCC_TOOL
3548
3549 ifdef VBOX_YASM_CHECK
3550 # YASM
3551 $(QUIET)$(APPEND) '$@' '# debug: TOOL_YASM_AS="$(TOOL_YASM_AS)"'
3552 $(QUIET)$(APPEND) '$@' 'VBOX_YASM_Wno-segreg-in-64bit ?= $(call VBOX_YASM_CHECK,-Wno-segreg-in-64bit,)'
3553 endif
3554 ifdef VBOX_NASM_CHECK
3555 # NASM (--allow-64-bit: 2.12rc2)
3556 $(QUIET)$(APPEND) '$@' 'VBOX_NASM_allow_64_bit ?= $(call VBOX_NASM_CHECK,--allow-64-bit,)'
3557 endif
3558
3559 if1of ($(KBUILD_TARGET), linux)
3560 ifeq ($(KBUILD_TARGET),$(KBUILD_HOST))
3561 $(QUIET)$(RM) -f -- "$@.sanitizer.so" "$@.sanitizer32.so" '$@.sanitizer.c'
3562 $(APPEND) -t '$@.sanitizer.c' 'int foo() { return 42; }'
3563 $(QUIET)$(APPEND) '$@' 'VBOX_GCC_SANITIZER_SO_FILES := \'
3564 $(TOOL_$(VBOX_GCC_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC_TOOL)_CC) -fPIC -shared \
3565 $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS) -o "$@.sanitizer.so" "$@.sanitizer.c"
3566 ldd "$@.sanitizer.so" | $(SED_EXT) --append '$@' -re '/lib(a|ub)san\.so/!d' -e 's/.* => //' -e 's/ \(0x[0-9a-fA-F]*\) *$(DOLLAR)/ \\/'
3567 $(QUIET)$(APPEND) '$@' ''
3568 # $(QUIET)$(APPEND) '$@' 'VBOX_GCC32_SANITIZER_SO_FILES := \'
3569 # $(TOOL_$(VBOX_GCC32_TOOL)_ENV_SETUP) $(TOOL_$(VBOX_GCC32_TOOL)_CC) -fPIC -shared \
3570 # $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS) -o "$@.sanitizer32.so" "$@.sanitizer.c"
3571 # ldd "$@.sanitizer32.so" | $(SED_EXT) --append '$@' -re '/lib(a|ub)san\.so/!d' -e 's/.* => //' -e 's/ \(0x[0-9a-fA-F]*\) *$(DOLLAR)/ \\/'
3572 # $(QUIET)$(APPEND) '$@' ''
3573 $(QUIET)$(RM) -f -- "$@.sanitizer.so" "$@.sanitizer32.so" '$@.sanitizer.c'
3574 endif
3575 endif
3576 ifdef VBOX_PATH_PREFIX_MINGW32
3577 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW32)gcc -m32)'
3578 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW32)g++ -m32)'
3579 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_Wno-array-bounds ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW32)g++ -m32,-Wno-array-bounds,)'
3580 $(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,)'
3581 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_Wno-maybe-uninitialized ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW32)g++ -m32,-Wno-maybe-uninitialized,)'
3582 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW32_USER_LABEL_PREFIX ?= $(shell echo "__USER_LABEL_PREFIX__" | $(VBOX_PATH_PREFIX_MINGW32)g++ -m32 -E -xc++ - | $(SED) -e "/^$(HASH)/d")'
3583 endif
3584 ifdef VBOX_PATH_PREFIX_MINGW64
3585 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW64)gcc -m64)'
3586 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(VBOX_PATH_PREFIX_MINGW64)g++ -m64)'
3587 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_Wno-array-bounds ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW64)g++ -m64,-Wno-array-bounds,)'
3588 $(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,)'
3589 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_Wno-maybe-uninitialized ?= $(call VBOX_GCC_CHECK_EX_CXX,$(VBOX_PATH_PREFIX_MINGW64)g++ -m64,-Wno-maybe-uninitialized,)'
3590 $(QUIET)$(APPEND) '$@' 'VBOX_MINGW64_USER_LABEL_PREFIX ?= $(shell echo "__USER_LABEL_PREFIX__" | $(VBOX_PATH_PREFIX_MINGW64)g++ -m64 -E -xc++ - | $(SED) -e "/^$(HASH)/d")'
3591 endif
3592 if defined(TOOL_FLEX) || defined(TOOL_BISON)
3593 echo "Do NOT include the flex or bison tools before Config.kmk gets loaded"
3594 exit 1 #
3595 endif
3596 $(QUIET)$(APPEND) '$@' 'VBOX_HAVE_FLEX ?= $(firstfile $(TOOL_FLEX_LEX) $(which flex))'
3597 $(QUIET)$(APPEND) '$@' 'VBOX_HAVE_BISON ?= $(firstfile $(TOOL_BISON_YACC) $(which bison))'
3598 if "$(KBUILD_HOST)" == "solaris" && $(KBUILD_HOST_VERSION_MAJOR) == 5 && $(KBUILD_HOST_VERSION_MINOR) == 11
3599 # BRANCH_VERSION format on S11 - S11.3:
3600 # <trunk_id>.<update>.<sru>.<reserved>.<buildid>.<nightly_id>
3601 # e.g.: 0.175.3.32.0.4.0:20180427T232405Z - N.B. trunk_id = 0.175
3602 # BRANCH_VERSION format on S11.4:
3603 # <minor>.<update>.<sru>.<reserved>.<reserved>.<buildid>.<nightly_id>
3604 # e.g.: 11.4.0.0.1.10.0:20180702T173343Z
3605 # We're interested in <update> and <buildid>.
3606 $(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/.*,//')"
3607 $(QUIET)$(APPEND) '$@' 'ifeq ($$(word 2, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION))),175)'
3608 $(QUIET)$(APPEND) '$@' ' VBOX_SOLARIS_11_UPDATE_VERSION := $$(word 3, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION)))'
3609 $(QUIET)$(APPEND) '$@' 'else'
3610 $(QUIET)$(APPEND) '$@' ' VBOX_SOLARIS_11_UPDATE_VERSION := $$(word 2, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION)))'
3611 $(QUIET)$(APPEND) '$@' 'endif'
3612 $(QUIET)$(APPEND) '$@' 'VBOX_SOLARIS_11_BUILD_VERSION := $$(word 6, $$(subst ., ,$$(VBOX_SOLARIS_11_BRANCH_VERSION)))'
3613 endif
3614 if1of ($(KBUILD_HOST), darwin freebsd solaris)
3615 $(QUIET)$(APPEND) '$@' 'VBOX_HOST_DTRACE_VERSION := $(shell dtrace -V)'
3616 endif
3617 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)
3618 $(QUIET)$(APPEND) '$@' "VBOX_PYLINT_VERSION := $(call VBOX_PYLINT_FIGURE_VERSION, $(VBOX_PYLINT))"
3619 endif
3620 if defined(VBOX_JAVAC)
3621 $(QUIET)$(APPEND) '$@' 'VBOX_JAVA_VERSION := $(call VBOX_JAVA_FIGURE_VERSION, $(VBOX_JAVAC))'
3622 endif
3623 $(QUIET)$(APPEND) '$@' '#$(which $(VBOX_XSLTPROC))'
3624 $(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)'
3625 $(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)'
3626
3627 $(QUIET)$(ECHO) '========= START OF $@ ========='
3628 $(QUIET)$(CAT) $@
3629 $(QUIET)$(ECHO) '=========== END OF $@ ========='
3630
3631 include $(PATH_OUT)/DynamicConfig.kmk
3632endif # !VBOX_NOINC_DYNAMIC_CONFIG_KMK
3633
3634
3635#
3636# C++ language level
3637# See https://en.cppreference.com/w/cpp/compiler_support and compiler docs.
3638#
3639## @todo consider maxing this out.
3640ifndef VBOX_GCC_std
3641 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), darwin.arm64) # Go straight for c++17 here.
3642 VBOX_GCC_std := -std=c++17
3643 # 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.
3644 #VBOX_GCC_std := -std=c++17
3645 else if "$(VBOX_CLANG_VERSION_CXX)" vge 50000 # darwin Xcode 5 allegedly knows what C++11 is
3646 VBOX_GCC_std := -std=c++11
3647 # 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.
3648 #VBOX_GCC_std := -std=gnu++17
3649 else if "$(VBOX_GCC_VERSION_CXX)" vge 40800
3650 VBOX_GCC_std := -std=c++11
3651 else if "$(VBOX_GCC_VERSION_CXX)" vge 40600
3652 VBOX_GCC_std := -std=c++0x
3653 endif
3654endif
3655ifndef VBOX_VCC_std
3656 if $(VBOX_VCC_TOOL_STEM) >= VCC141 # since 2017 15.3
3657 VBOX_VCC_std := -Zc:__cplusplus -std:c++17
3658 endif
3659endif
3660
3661
3662#
3663# Compiler warning control.
3664#
3665VBOX_GCC_WARN ?= -Wall $(VBOX_GCC_Wextra) $(VBOX_GCC_Wno-missing-field-initializers) -Wno-unused -Wno-trigraphs \
3666 $(VBOX_GCC_fdiagnostics-show-option) $(VBOX_GCC_Wno-unused-parameter) $(VBOX_GCC_Wno-language-extension-token) \
3667 $(VBOX_GCC_Wno-extended-offsetof) $(VBOX_GCC_Wno-gnu-folding-constant) $(VBOX_GCC_Wno-gnu-anonymous-struct) \
3668 $(VBOX_GCC_Wlogical-op) $(VBOX_GCC_Wno-string-plus-int) $(VBOX_GCC_Wno-nested-anon-types) $(VBOX_GCC_Wno-variadic-macros) \
3669 $(VBOX_GCC_Wno-c++17-compat-mangling)
3670VBOX_GCC_WARN_PEDANTIC = -Wshadow $(VBOX_GCC_WARN) -Wno-long-long
3671if $(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)
3672 VBOX_GCC_WARN_MASOCHISTIC ?= -Wunused-variable -Wunused-function -Wunused-label -Wunused-parameter
3673endif
3674if $(KBUILD_TARGET) == "linux" \
3675 || ($(KBUILD_TARGET) == "darwin" && "$(VBOX_GCC_TOOL)" != "GXX4MACHO" && "$(VBOX_GCC_TOOL)" != "GXX42MACHO") \
3676 || defined(VBOX_WITH_MASOCHISTIC_WARNINGS)
3677 VBOX_GCC_WARN_PEDANTIC += $(VBOX_GCC_WARN_MASOCHISTIC)
3678endif
3679
3680ifdef VBOX_GCC_Wno-variadic-macros # Don't use -pedantic unless -Wno-variadic-macros also works. Too noisy.
3681 VBOX_GCC_PEDANTIC_OPTION ?= -pedantic
3682else
3683 VBOX_GCC_PEDANTIC_OPTION ?=
3684endif
3685VBOX_GCC_PEDANTIC_CXX ?= $(VBOX_GCC_PEDANTIC_OPTION) $(VBOX_GCC_WARN_PEDANTIC) \
3686 $(VBOX_GCC_Wno-return-type-c-linkage) $(VBOX_GCC_Wno-overloaded-virtual) $(VBOX_GCC_Wno-undefined-var-template) $(VBOX_GCC_Wno-deprecated-copy)
3687VBOX_GCC_PEDANTIC_C ?= $(VBOX_GCC_PEDANTIC_OPTION) $(VBOX_GCC_WARN_PEDANTIC) -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Werror-implicit-function-declaration
3688
3689# Avoid freaking out when using flexible arrays in C++ code (ldrPE.cpp, ++).
3690if ($(VBOX_GCC_VERSION_CXX) < 60100 || $(VBOX_GCC_VERSION_CXX) >= 70000) && "$(VBOX_GCC_Wno-array_bounds)" != ""
3691 VBOX_GCC_PEDANTIC_CXX += $(VBOX_GCC_Wno-array_bounds)
3692endif
3693# Stupid problem with (__typeof__((*ppv)) casts in asm.h where volatile is involved and ignored.
3694if $(VBOX_GCC_VERSION_CXX) >= 80000 && "$(VBOX_GCC_Wno-ignored-qualifiers)"
3695 VBOX_GCC_PEDANTIC_CXX += $(VBOX_GCC_Wno-ignored-qualifiers)
3696endif
3697
3698
3699VBOX_GCC_NON_PEDANTIC_CXX ?= -Wno-sign-compare
3700VBOX_GCC_NON_PEDANTIC_C ?= -Wno-sign-compare -Werror-implicit-function-declaration
3701
3702if "$(KBUILD_TARGET)" == "darwin" && "$(VBOX_GCC_TOOL)" != "GXX4MACHO" && "$(VBOX_GCC_TOOL)" != "GXX42MACHO"
3703 VBOX_GCC_PEDANTIC_CXX += -Wno-c99-extensions
3704 VBOX_GCC_NON_PEDANTIC_CXX += -Wno-c99-extensions
3705endif
3706
3707
3708# Disabled Visual C++ warnings, W4:
3709# -wd4065: switch statement contains 'default' but no 'case' labels
3710# -wd4996: deprecated / insecure.
3711# -wd4127: conditional expression is constant [level 4]
3712# -wd4706: assignment within conditional expression [level 4]
3713# -wd4201: nonstandard extension used : nameless struct/union [level 4]
3714# -wd4214: nonstandard extension used : bit field types other than int [level 4]
3715# -wd4510: 'VM::<unnamed-tag>' : default constructor could not be generated
3716# -wd4512: 'VM' : assignment operator could not be generated
3717# -wd4610: union 'VM::<unnamed-tag>' can never be instantiated - user defined constructor required
3718# Disabled Visual C++ warnings, Wall:
3719# -wd4514: unreferenced inline function has been removed
3720# -wd4820: 'RTSTRSPACECORE' : '7' bytes padding added after data member 'RTSTRSPACECORE::uchHeight'
3721# -wd4365: '=' : conversion from 'unsigned char' to 'char', signed/unsigned mismatch
3722# -wd4987: nonstandard extension used: 'throw (...)' (setjmp.h + our stuff)
3723# -wd4710: 'std::string std::_Narrow_str(std::wstring)' : function not inlined
3724# -wd4061: enumerator 'RTASN1TYPE_END' in switch of enum 'RTASN1TYPE' is not explicitly handled by a case label
3725# Note! C4062 checks for the same but includes the 'default' case, just like gcc. So, no trouble disabling this.
3726# -wd4986: 'operator new[]': exception specification does not match previous declaration (crtdbg.h vs new, exception specification only)
3727# -wd4191: 'type cast' : unsafe conversion from 'int (__cdecl *)(gzFile)' to 'PFNRT'
3728# -wd4574: 'INCL_WINSOCK_API_TYPEDEFS' is defined to be '0': did you mean to use '#if INCL_WINSOCK_API_TYPEDEFS'?
3729# -wd4917: 'OLE_XPOS_HIMETRIC' : a GUID can only be associated with a class, interface or namespace
3730# -wd4711: function 'void __cdecl rtMemCacheFreeOne(struct RTMEMCACHEINT * __ptr64,void * __ptr64)' selected for automatic inline expansion
3731# -wd4571: Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
3732# -wd4611: interaction between '_setjmp' and C++ object destruction is non-portable
3733# -wd4324: '_TDI_PNP_CONTEXT_XP' : structure was padded due to __declspec(align())
3734# -wd4505: VBoxNetFltNobj.h(45) : warning C4505: 'VBoxNetFltNobj::Release' : unreferenced local function has been removed
3735# Probably related to http://stackoverflow.com/questions/3051992/compiler-warning-at-c-template-base-class
3736# -wd4263: 'int VRDPChannelClipboard::SendPacket(const void *,uint32_t)' : member function does not override any base class virtual member function
3737# Probably useful, but impractical, just like the next one.
3738# -wd4264: 'int VRDPOutputCtx::SendPacket(void)' : no override available for virtual member function from base 'VRDPOutputCtx'; function is hidden
3739# -wd4738: storing 32-bit float result in memory, possible loss of performance
3740# -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'
3741# -wd4748: uiactionpoolmanager.cpp(2723) : warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
3742# Want to enable these:
3743# -wd4242: '=' : conversion from 'uint32_t' to 'uint8_t', possible loss of data
3744# -wd4244: 'conversion' conversion from 'type1' to 'type2', possible loss of data
3745# -wd4200: nonstandard extension used : zero-sized array in struct/union
3746# Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
3747VBOX_VCC_WARN_ALL := -W4 -Wall -wd4065 -wd4996 -wd4127 -wd4706 -wd4201 -wd4214 -wd4510 -wd4512 -wd4610 \
3748 -wd4514 -wd4820 -wd4365 -wd4987 -wd4710 -wd4061 -wd4986 -wd4191 -wd4574 -wd4917 -wd4711 -wd4611 -wd4571 -wd4324 -wd4505 \
3749 -wd4263 -wd4264 -wd4738 -wd4200 -wd4371 -wd4748
3750if1of ($(VBOX_VCC_TOOL_STEM), VCC120)
3751 # -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()'
3752 # -wd4435: iprt/cpp/xml.h(185) : warning C4435: 'xml::Input' : Object layout under /vd2 will change due to virtual base 'xml::Stream'
3753 VBOX_VCC_WARN_ALL += -wd4350 -wd4435
3754endif
3755if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
3756 # -wd5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
3757 # -wd4464: relative include path contains '..' (iprt/nocrt/compiler.msc.h)
3758 # -wd4623: 'VM': default constructor was implicitly defined as deleted
3759 # -wd4625: 'SUPDRVTRACERDATA': copy constructor was implicitly defined as deleted
3760 # -wd4626: 'SUPDRVTRACERDATA': assignment operator was implicitly defined as deleted
3761 # -wd5026: 'SUPDRVTRACERDATA': move constructor was implicitly defined as deleted
3762 # -wd5027: 'SUPDRVTRACERDATA': move assignment operator was implicitly defined as deleted
3763 # -wd4435: 'xml::Input': Object layout under /vd2 will change due to virtual base 'xml::Stream'
3764 # -wd4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
3765 VBOX_VCC_WARN_ALL += -wd5045 -wd4464 -wd4623 -wd4625 -wd4626 -wd5026 -wd5027 -wd4435 -wd4577
3766endif
3767if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # With v16.11.9, not with v16.6.0 4242
3768 # -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
3769 VBOX_VCC_WARN_ALL += -wd5220
3770 # Temporarily:
3771 # -wd4242: asn1-ut-string.cpp(729): warning C4242: 'argument': conversion from 'uint32_t' to 'uint16_t', possibl loss of data
3772 # -wd4244: asn1-ut-objid.cpp(124): warning C4244: '=': conversion from 'uint32_t' to 'uint8_t', possible loss of data
3773 VBOX_VCC_WARN_ALL += -wd4242 -wd4244
3774 if1of (RT_RELAXED_CALLBACKS_TYPES, $(DEFS))
3775 # -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.
3776 VBOX_VCC_WARN_ALL += -wd5039
3777 endif
3778endif
3779# -wd4548: socket.cpp(1931): warning C4548: expression before comma has no effect; expected expression with side-effect
3780VBOX_VCC_WARN_ALL += -wd4548
3781if "$(VBOX_VCC_TOOL_STEM)" >= "VCC143" && "$(KBUILD_TARGET_ARCH)" == "arm64"
3782 VBOX_VCC_WARN_ALL += -wd4746
3783endif
3784ifndef VBOX_NEWER_VCC_WARN_ALL
3785 if "$(VBOX_VCC_TOOL_STEM)" < "VCC120"
3786 VBOX_NEWER_VCC_WARN_ALL := $(VBOX_VCC_WARN_ALL) -wd4350 -wd4435
3787 else
3788 VBOX_NEWER_VCC_WARN_ALL := $(VBOX_VCC_WARN_ALL)
3789 endif
3790endif
3791
3792
3793# Disable pedantic warnings for NP/NonPedantic templates.
3794# -wd4131: 'bi_flush' : uses old-style declarator
3795# -wd4255: 'tr_static_init' : no function prototype given: converting '()' to '(void)'
3796# -wd4668: '_WIN32_WCE' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'/
3797# -wd4100: 'cinfo' : unreferenced formal parameter
3798# -wd4189: 'sz' : local variable is initialized but not referenced
3799# -wd4132: 'xmlStringComment' : const object should be initialized
3800# -wd4152: nonstandard extension, function/data pointer conversion in expression
3801# -wd4702: unreachable code
3802# -wd4057: '=' : 'xmlChar *' differs in indirection to slightly different base types from 'char *'
3803# -wd4296: '>=' : expression is always true
3804# -wd4389: '==' : signed/unsigned mismatch
3805# -wd4018: '<=' : signed/unsigned mismatch
3806# -wd4245: '=' : conversion from 'int' to 'unsigned int', signed/unsigned mismatch
3807# -wd4267: '+=' : conversion from 'size_t' to 'long', possible loss of data
3808# -wd4295: 'vendor_string' : array is too small to include a terminating null character
3809VBOX_VCC_NON_PEDANTIC = -wd4131 -wd4255 -wd4668 -wd4100 -wd4189 -wd4132 -wd4152 -wd4702 -wd4057 -wd4296 -wd4389 -wd4018 -wd4245 \
3810 -wd4267 -wd4295
3811VBOX_NEWER_VCC_NON_PEDANTIC = $(VBOX_VCC_NON_PEDANTIC)
3812
3813ifeq ($(KBUILD_TARGET),win)
3814 VBOX_C_CXX_FLAGS_NO_UNUSED_PARAMETERS = -wd4100
3815else
3816 VBOX_C_CXX_FLAGS_NO_UNUSED_PARAMETERS = -Wno-unused-parameter
3817endif
3818
3819#
3820# Version dependent Visual C++ stuff.
3821#
3822if1of (win, $(KBUILD_TARGET) $(KBUILD_HOST))
3823 ifn1of ($(VBOX_VCC_TOOL_STEM), VCC100 VCC110 VCC120)
3824 ifndef VBOX_WITHOUT_CONTROL_FLOW_GUARD
3825 VBOX_VCC_CC_GUARD_CF = -guard:cf
3826 VBOX_VCC_LD_GUARD_CF = -Guard:CF
3827 else
3828 VBOX_VCC_CC_GUARD_CF =
3829 VBOX_VCC_LD_GUARD_CF =
3830 endif
3831 VBOX_VCC_LD_HIGH_ENTRYOPY_VA = /HighEntropyVA
3832 else
3833 VBOX_VCC_CC_GUARD_CF =
3834 VBOX_VCC_LD_GUARD_CF =
3835 VBOX_VCC_LD_HIGH_ENTRYOPY_VA =
3836 endif
3837 ifn1of ((VBOX_VCC_TOOL_STEM), VCC100 VCC110 VCC120 VCC140 VCC141)
3838 # 16.7 and later, so not in our linker yet.
3839 ## @todo BUGBUG! Update VCC before 7.0 is released.
3840 #VBOX_VCC_LD_CET_COMPAT = /CetCompat
3841 VBOX_VCC_LD_CET_COMPAT =
3842 else
3843 VBOX_VCC_LD_CET_COMPAT =
3844 endif
3845endif
3846
3847#
3848# Compiler optimization flags.
3849#
3850ifeq ($(KBUILD_TYPE),debug)
3851 VBOX_GCC_FP ?= -fno-omit-frame-pointer
3852 VBOX_GCC_OPT ?= -O0
3853 VBOX_VCC_FP ?= -Oy-
3854 VBOX_VCC_OPT ?=
3855 VBOX_GCC_R0_FP ?= -fno-omit-frame-pointer -fno-optimize-sibling-calls
3856 VBOX_GCC_R0_OPT ?= -O2
3857 VBOX_VCC_R0_FP ?= -Oy-
3858 VBOX_VCC_R0_OPT ?=
3859 VBOX_GCC_GC_FP ?= -fno-omit-frame-pointer -fno-optimize-sibling-calls
3860 VBOX_GCC_GC_OPT ?= -O2
3861 VBOX_VCC_GC_FP ?= -Oy-
3862 VBOX_VCC_GC_OPT ?=
3863else
3864 # We should use -fomit-frame-pointer for GCC / -Oy for VCC.
3865 # -funwind-tables provides support for backtraces in gdb then.
3866 VBOX_GCC_FP ?= -fno-omit-frame-pointer
3867 VBOX_GCC_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
3868 VBOX_VCC_FP ?= -Oy-
3869 VBOX_VCC_OPT ?= -O2
3870 VBOX_GCC_R0_FP ?= -fno-omit-frame-pointer
3871 VBOX_GCC_R0_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
3872 VBOX_VCC_R0_FP ?= -Oy-
3873 VBOX_VCC_R0_OPT ?= -O2
3874 VBOX_GCC_GC_FP ?= -fno-omit-frame-pointer
3875 VBOX_GCC_GC_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
3876 VBOX_VCC_GC_FP ?= -Oy-
3877 VBOX_VCC_GC_OPT ?= -O2
3878endif
3879ifeq ($(KBUILD_TARGET_ARCH),x86)
3880 ifneq ($(KBUILD_TARGET),darwin)
3881 # (The '<=' operator is for prepending (kmk specific).)
3882 VBOX_GCC_OPT <= -march=i586
3883 endif
3884endif
3885
3886
3887#
3888# Select the CRT type we're using with Microsoft Visual C++.
3889#
3890if1of ($(KBUILD_TYPE), debug dbgopt strict)
3891 #not yet# VBOX_WITH_DEBUG_VCC_CRT = 1
3892endif
3893ifdef VBOX_WITH_DEBUG_VCC_CRT
3894 VBOX_VCC_CRT_TYPE := d
3895 VBOX_VCC_CRT_TYPE_UPPER := D
3896 VBOX_VCC_CRT_TYPE_N :=
3897else
3898 VBOX_VCC_CRT_TYPE :=
3899 VBOX_VCC_CRT_TYPE_UPPER :=
3900 VBOX_VCC_CRT_TYPE_N := d
3901endif
3902
3903#
3904# Select whether wchar_t is a native compiler defined type or not with
3905# Microsoft Visual C++. We've been avoiding the native type for ever,
3906# but now that is causing issues with Qt 6.x.
3907#
3908VBOX_VCC_WCHAR_T_VARIANT = -Zc:wchar_t
3909
3910
3911#
3912# Warnings as errors.
3913#
3914# GCC: We disable warnings on non-X86 systems because of the variadic
3915# macro usage in the logger.
3916#
3917ifdef VBOX_WITH_WARNINGS_AS_ERRORS
3918 if $(VBOX_GCC_VERSION_CXX) >= 40000
3919 VBOX_GCC_WERR ?= -Werror
3920 endif
3921 VBOX_VCC_WERR ?= -WX
3922 VBOX_VCC_LD_WERR ?= ## @todo later also: -WX
3923endif
3924
3925#
3926# The general GCC/Clang no warning policy.
3927#
3928# Note! This doesn't control everything. Instead set VBOX_GCC_WERR=$(NO_SUCH_VARIABLE) to
3929# completely disable -Werror.
3930#
3931if !defined(VBOX_WITHOUT_NO_GCC_WARNING_POLICY) && !defined(VBOX_WITH_NO_GCC_WARNING_POLICY)
3932 if defined(VBOX_WITH_MASOCHISTIC_WARNINGS) # gcc 4.6.x+
3933 VBOX_WITH_NO_GCC_WARNING_POLICY = 1
3934 else if "$(KBUILD_TARGET)" == "darwin"
3935 ifn1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
3936 VBOX_WITH_NO_GCC_WARNING_POLICY = 1
3937 endif
3938 else if1of ($(KBUILD_TARGET), linux)
3939 if $(VBOX_GCC_VERSION_CXX) >= 40600 # gcc 4.6.x+
3940 VBOX_WITH_NO_GCC_WARNING_POLICY = 1
3941 endif
3942 endif
3943endif
3944ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
3945 $(info build debug: VBOX_WITH_NO_GCC_WARNING_POLICY is enabled)
3946endif
3947
3948#
3949# Misc stuff that should be after including DynamicConfig.kmk.
3950#
3951
3952# libxml XML linter.
3953ifeq ($(VBOX_XMLLINT),)
3954 ifeq ($(KBUILD_HOST),win)
3955 VBOX_XMLLINT := $(firstfile \
3956 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST)/libxslt/*/bin/xmllint.exe)) \
3957 $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST_ALT)/libxslt/*/bin/xmllint.exe)) )
3958 endif
3959 ifeq ($(VBOX_XMLLINT),)
3960 VBOX_XMLLINT := $(firstfile $(which xmllint) xmllint$(HOSTSUFF_EXE))
3961 endif
3962 ifneq ($(VBOX_XMLLINT),)
3963 VBOX_HAVE_XMLLINT := 1
3964 else
3965 VBOX_XMLLINT := xmllint
3966 VBOX_HAVE_XMLLINT :=
3967 endif
3968else
3969 VBOX_HAVE_XMLLINT := 1
3970endif
3971
3972# Older versions of GCC cannot compile libssh, so disable it and the feature if that's the case.
3973ifn1of ($(KBUILD_TARGET), darwin win)
3974 if $(VBOX_GCC_VERSION_CC) < 50000
3975 VBOX_WITH_LIBSSH :=
3976 VBOX_WITH_CLOUD_NET :=
3977 endif
3978endif
3979
3980
3981#
3982# Misc macros.
3983#
3984
3985##
3986# Edits VirtualBox version, vendor and package strings in a text file.
3987#
3988# The rule using this must list $(VBOX_SVN_REV_KMK) as a prerequisite.
3989#
3990# @param 1 The input filename.
3991# @param 2 The output filename.
3992#
3993VBOX_EDIT_VERSION_CMD_FN = $(SED) \
3994 -e 's+@VBOX_VERSION_MAJOR@+$(VBOX_VERSION_MAJOR)+g' \
3995 -e 's+@VBOX_VERSION_MINOR@+$(VBOX_VERSION_MINOR)+g' \
3996 -e 's+@VBOX_VERSION_BUILD@+$(VBOX_VERSION_BUILD)+g' \
3997 -e 's+@VBOX_VERSION_STRING@+$(VBOX_VERSION_STRING)+g' \
3998 -e 's+@VBOX_SVN_REV@+$(VBOX_SVN_REV)+g' \
3999 -e 's+@VBOX_VENDOR@+$(VBOX_VENDOR)+g' \
4000 -e 's+@VBOX_VENDOR_SHORT@+$(VBOX_VENDOR_SHORT)+g' \
4001 -e 's+@VBOX_PRODUCT@+$(VBOX_PRODUCT)+g' \
4002 -e 's+@VBOX_C_YEAR@+$(VBOX_C_YEAR)+g' \
4003 -e 's+@VBOX_PACKAGE_STRING@+$(VBOX_PACKAGE_STRING)+g' \
4004 --output $(2) $(1)
4005
4006##
4007# Generates a rule for editing a file using VBOX_EDIT_VERSION_CMD_FN.
4008#
4009# @param 1 The target name.
4010# @param 2 The input filename relative to the current sub-makefile.
4011# @param 3 The output filename relative to the target output dir.
4012# Optional, defaults to 2.
4013#
4014VBOX_EDIT_VERSION_RULE_FN = $(eval $(value VBOX_EDIT_VERSION_RULE_DEF))
4015define VBOX_EDIT_VERSION_RULE_DEF
4016 $$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2)): $(PATH_SUB_CURRENT)/$(2) $(VBOX_SVN_REV_KMK) | $$(dir $$@)
4017 $(call MSG_GENERATE,$(1),$@,$<)
4018 $(QUIET)$(call VBOX_EDIT_VERSION_CMD_FN,$<,$@)
4019 $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2)))
4020endef
4021
4022
4023##
4024# Edits VirtualBox version, vendor, package, build target, build arch, and build type strings in a text file.
4025#
4026# Please use VBOX_EDIT_VERSION_AND_BUILD_RULE_FN to generate edit rule.
4027#
4028# @param 1 The input filename.
4029# @param 2 The output filename.
4030#
4031VBOX_EDIT_VERSION_AND_BUILD_CMD_FN = $(SED) \
4032 -e 's+@VBOX_VERSION_MAJOR@+$(VBOX_VERSION_MAJOR)+g' \
4033 -e 's+@VBOX_VERSION_MINOR@+$(VBOX_VERSION_MINOR)+g' \
4034 -e 's+@VBOX_VERSION_BUILD@+$(VBOX_VERSION_BUILD)+g' \
4035 -e 's+@VBOX_VERSION_STRING@+$(VBOX_VERSION_STRING)+g' \
4036 -e 's+@VBOX_SVN_REV@+$(VBOX_SVN_REV)+g' \
4037 -e 's+@VBOX_VENDOR@+$(VBOX_VENDOR)+g' \
4038 -e 's+@VBOX_VENDOR_SHORT@+$(VBOX_VENDOR_SHORT)+g' \
4039 -e 's+@VBOX_PRODUCT@+$(VBOX_PRODUCT)+g' \
4040 -e 's+@VBOX_C_YEAR@+$(VBOX_C_YEAR)+g' \
4041 -e 's+@VBOX_PACKAGE_STRING@+$(VBOX_PACKAGE_STRING)+g' \
4042 -e 's+@KBUILD_TYPE@+$(KBUILD_TYPE)+g' \
4043 -e 's+@KBUILD_TARGET@+$(KBUILD_TARGET)+g' \
4044 -e 's+@KBUILD_TARGET_ARCH@+$(KBUILD_TARGET_ARCH)+g' \
4045 --output $(2) $(1)
4046
4047##
4048# Generates a rule for editing a file using VBOX_EDIT_VERSION_CMD_FN.
4049#
4050# @param 1 The target name.
4051# @param 2 The input filename relative to the current sub-makefile.
4052# @param 3 The output filename relative to the target output dir.
4053# Optional, defaults to 2.
4054#
4055VBOX_EDIT_VERSION_AND_BUILD_RULE_FN = $(eval $(VBOX_EDIT_VERSION_AND_BUILD_RULE_DEF))
4056define VBOX_EDIT_VERSION_AND_BUILD_RULE_DEF
4057 $$$$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2)): $$(PATH_SUB_CURRENT)/$(2) $$(VBOX_SVN_REV_KMK) | $$$$(dir $$$$@)
4058 $$(call MSG_GENERATE,$(1),$$@,$$<)
4059 $$(QUIET)$$(call VBOX_EDIT_VERSION_AND_BUILD_CMD_FN,$$<,$$@)
4060 $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(if $(3),$(3),$(2))
4061endef
4062
4063
4064##
4065# Fill in am import library target based on a somewhat special windows .def file.
4066#
4067# @param 1 The target name of the import library.
4068# @param 2 The name of the real library.
4069# @param 3 The .def-file paths relative to the current makefile.
4070#
4071VBOX_GENERATE_IMPORT_TARGET_FN = $(eval $(VBOX_GENERATE_IMPORT_TARGET_DEF))
4072define VBOX_GENERATE_IMPORT_TARGET_DEF
4073 $(1)_TEMPLATE = VBoxR3Dll
4074 $(1)_INST = $(INST_LIB)
4075 if $(KBUILD_TARGET) == "darwin"
4076 $(1)_LDFLAGS = -install_name $(VBOX_DYLD_EXECUTABLE_PATH)/$(2)$(SUFF_DLL)
4077 else ifn1of ($(KBUILD_TARGET), os2 win)
4078 $(1)_SONAME = $(2)$(SUFF_DLL)
4079 endif
4080 if1of ($(KBUILD_TARGET), os2 win)
4081 $(1)_SOURCES = $$($(1)_0_OUTDIR)/$(1)Imp.def
4082 $(1)_CLEAN = $$($(1)_0_OUTDIR)/$(1)Imp.def
4083 else
4084 $(1)_SOURCES = $$($(1)_0_OUTDIR)/$(1)Imp.c
4085 $(1)_CLEAN = $$($(1)_0_OUTDIR)/$(1)Imp.c
4086 endif
4087
4088 $$$$($(1)_SOURCES): $(addprefix $(PATH_SUB_CURRENT)/,$(3)) $(PATH_ROOT)/src/bldprogs/deftoimp.sed | $$$$(dir $$$$@)
4089 $$(call MSG_GENERATE,,$$@)
4090 ifeq ($(KBUILD_TARGET),os2)
4091 $$(SED) \
4092 -e '/not-$(KBUILD_TARGET)/d' \
4093 -e '/not-$(KBUILD_TARGET_ARCH)/d' \
4094 -e 's/^LIBRARY[[:space:]][[:space:]]*\(.*\)\.dll/LIBRARY \1 INITINSTANCE TERMINSTANCE\nDATA MULTIPLE\n/' \
4095 -e 's/^[ \t][ \t]*\([_a-zA-Z]\)/ _\1/' \
4096 -e 's/[ \t]DATA[ \t]*/ /' \
4097 --output $$@ $(addprefix $(PATH_SUB_CURRENT)/,$(3))
4098 else ifeq ($(KBUILD_TARGET),win)
4099 $$(SED) \
4100 -e '/not-$(KBUILD_TARGET)/d' \
4101 -e '/not-$(KBUILD_TARGET_ARCH)/d' \
4102 --output $$@ $(addprefix $(PATH_SUB_CURRENT)/,$(3))
4103 else
4104 $$(QUIET)$$(APPEND) -tn $$@ \
4105 '#ifdef VBOX_HAVE_VISIBILITY_HIDDEN' \
4106 '# define EXPORT __attribute__((visibility("default")))' \
4107 '# define EXPORT_DATA __attribute__((visibility("default")))' \
4108 '#else' \
4109 '# define EXPORT' \
4110 '# define EXPORT_DATA' \
4111 '#endif' \
4112 ''
4113 $$(SED) \
4114 -e '/not-$(KBUILD_TARGET)/d' \
4115 -e '/not-$(KBUILD_TARGET_ARCH)/d' \
4116 -f $(PATH_ROOT)/src/bldprogs/deftoimp.sed \
4117 --append $$@ $(addprefix $(PATH_SUB_CURRENT)/,$(3))
4118 endif
4119endef # VBOX_GENERATE_IMPORT_TARGET_DEF
4120
4121
4122## VBOX_UTF8_MANIFEST_CMDS
4123# Wrapper around VBOX_UTF8_MANIFEST_FN that makes sure it's an EXE link target,
4124# as this UTF-8 manifest doesn't make sense for non-executables.
4125ifn1of ($(VBOX_VCC_TOOL_STEM), VCC100 VCC110 VCC120)
4126 ## VBOX_UTF8_MANIFEST_FN
4127 # Adds a manifest resource with ID 1 that tells windows 10 1903 and later to
4128 # use UTF-8 for the ANSI and OEM code pages. We only do this when using UCRT
4129 # as the VCC100 CRT typically ends up with its internal code page not being
4130 # CP_UTF8 but the default codepage for the locale.
4131 #
4132 # This has also been hijacked for opting in on the new segmented heap in
4133 # Windows 10.
4134 #
4135 # @param 1 the output filename.
4136 # @param 2 the architecture (required for xp rtm)
4137 #
4138 VBOX_UTF8_MANIFEST_FN = \
4139 $(QUIET)$(APPEND) -tn "$(1).manifest" \
4140 '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' \
4141 '<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">' \
4142 ' <assemblyIdentity type="win32" name="$(notdir $(1))" processorArchitecture="$(2)" version="$(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD).$(expr $(VBOX_SVN_REV) % 50000)" />' \
4143 ' <asmv3:application>' \
4144 ' <asmv3:windowsSettings>' \
4145 ' <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>' \
4146 ' <heapType xmlns="http://schemas.microsoft.com/SMI/2020/WindowsSettings">SegmentHeap</heapType>' \
4147 ' </asmv3:windowsSettings>' \
4148 ' </asmv3:application>' \
4149 '</assembly>' \
4150 $(NLTAB)$(QUIET)$(REDIRECT) -- $(WINCMN_MT_RETRY) $(requote sh,$(PATH_SDK_$(VBOX_WINPSDK)_BIN)/mt.exe) \
4151 -nologo -manifest '$(subst /,\,$(1).manifest)' '-outputresource:$(subst /,\,$(1));$(HASH)1' \
4152 $(NLTAB)$(QUIET)$(RM) -f -- "$(1).manifest"
4153 VBOX_UTF8_MANIFEST_CMDS ?= $(if-expr "$(tool_do)" == "LINK_PROGRAM",$(call VBOX_UTF8_MANIFEST_FN,$(out),$(bld_trg_arch)),)
4154else
4155 VBOX_UTF8_MANIFEST_CMDS =
4156endif
4157
4158
4159#
4160# Code Signing.
4161#
4162# There are two signing modes; 'test' and 'release'.
4163# - The 'test' mode is tailored local development, where typically test
4164# certificates are involved. Only the bar minimum of files are signed and
4165# nothing is timestamped (if we can control timestamping) in order to reduce
4166# build time and to allow working offline.
4167# - The 'release' mode is tailored for creating builds that are give to other
4168# people, like the ones the build servers create. As much as possible is
4169# signed and timestamped.
4170# - The 'adhoc' mode is specific to building on macOS and is similar to 'test'
4171# mode but doesn't require any certificates but a host set up for development work.
4172# Binaries are signed in adhoc mode and include required entitlements as appropriate
4173# (something we would only do in the 'packing' target). This seem to be the only working
4174# way with newer versions of macOS (tested with Ventura) with 'test' not working anymore.
4175#
4176ifdef VBOX_SIGNING_MODE
4177 VBOX_SIGNING_MODE := $(strip $(VBOX_SIGNING_MODE))
4178 ifn1of ($(VBOX_SIGNING_MODE), test release adhoc)
4179 $(error VBOX_SIGNING_MODE must be either 'test', 'release' or 'adhoc'. The value '$(VBOX_SIGNING_MODE)' is not recognized.)
4180 endif
4181 if "$(VBOX_SIGNING_MODE)" == "adhoc" && "$(KBUILD_TARGET)" != "darwin"
4182 $(error 'adhoc' signing mode is only available on macOS)
4183 endif
4184 VBOX_RETRY ?= $(ASH) $(KBUILD_DEVTOOLS)/bin/retry.sh
4185 # temporary solution for a $(dir ...) equivalent which assumes that it gets a single path, possibly with spaces.
4186 VBOX_DIRX = $(subst ?,$(SP),$(dir $(subst $(SP),?,$1)))
4187 VBOX_NOTDIRX = $(subst ?,$(SP),$(notdir $(subst $(SP),?,$1)))
4188 # Corp code signing client.
4189 VBOX_CCS_CLIENT_JAR := $(firstword $(rsort \
4190 $(wildcard $(KBUILD_DEVTOOLS)/common/ccs/v*/Client.jar)) \
4191 $(KBUILD_DEVTOOLS)/common/ccs/notfound/Client.jar )
4192 VBOX_CCS_USER ?= virtualbox_grp
4193 VBOX_CCS_GLOBAL_UID ?= non-of-your-business
4194 VBOX_CCS_SERVER ?= UK
4195 ##
4196 # Corp Code Signing command line.
4197 # @param $1 Signing method: solaris_elf, solaris_pkg, driver (microsoft), ...
4198 # @param $2 The file to be submitted for signing.
4199 # @param $3 The directory to put the signed file in. Defaults to $(dir $2).
4200 # @param $4 Additional options.
4201 VBOX_CCS_SIGN_CMD = $(VBOX_RETRY) $(VBOX_JAVA) -Xmx256m -jar "$(VBOX_CCS_CLIENT_JAR)" \
4202 sign -user "$(VBOX_CCS_USER)" -global_uid "$(VBOX_CCS_GLOBAL_UID)" \
4203 -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER)" \
4204 -sign_method "$1" -file_to_sign "$2" -signed_location "$(if $3,$3,$(call VBOX_DIRX,$2))" $4
4205
4206 ifeq ($(KBUILD_HOST),win)
4207 #
4208 # Windows
4209 #
4210
4211 # VBOX_PATH_SELFSIGN points to the Vista WDK bin/SelfSign directory.
4212 ifndef VBOX_PATH_SELFSIGN
4213 VBOX_PATH_SELFSIGN := $(firstword $(rsort $(wildcard $(KBUILD_DEVTOOLS)/win.x86/selfsign/*)))
4214 ifeq ($(VBOX_PATH_SELFSIGN),)
4215 VBOX_PATH_SELFSIGN := $(KBUILD_DEVTOOLS)/win.x86/selfsign/r1
4216 endif
4217 endif
4218 ifndef VBOX_PATH_SIGN_TOOLS
4219 $(evalcall KB_FN_LOAD_SDK,$(VBOX_WINPSDK))
4220 VBOX_PATH_SIGN_TOOLS = $(PATH_SDK_$(VBOX_WINPSDK)_BIN)
4221 endif
4222
4223 VBOX_SIGNTOOL ?= $(VBOX_RETRY) $(requote sh,$(VBOX_PATH_SIGN_TOOLS)/signtool.exe)
4224 VBOX_SIGNTOOL_SHA1 ?= $(VBOX_SIGNTOOL)
4225 VBOX_SIGNTOOL_SHA1_ORDERDEPS ?=
4226 VBOX_SIGNTOOL_SHA2 ?= $(VBOX_SIGNTOOL)
4227 VBOX_SIGNTOOL_SHA2_ORDERDEPS ?=
4228 VBOX_SIGNTOOL_ORDERDEPS ?= $(VBOX_SIGNTOOL_SHA1_ORDERDEPS) $(VBOX_SIGNTOOL_SHA2_ORDERDEPS)
4229 ifndef VBOX_INF2CAT # Inf2Cat.exe is only found in the bin/*/x86 directory in WINSDK10. Arm64 requires a W10+ one.
4230 VBOX_INF2CAT = $(requote sh,$(firstfile $(qwildcard , $(qaddsuffix ,/[Ii][Nn][Ff]2[Cc][Aa][Tt].[Ee][Xx][Ee], \
4231 $(PATH_SDK_WINSDK10_BIN.x86) \
4232 $(PATH_SDK_WINSDK10_BIN) \
4233 $(if-expr defined(PATH_SDK_WINSDK10_BASE_BIN) && defined(SDK_WINSDK10_VERSION),$(PATH_SDK_WINSDK10_BASE_BIN)/$(SDK_WINSDK10_VERSION)/x86) \
4234 )) $(VBOX_PATH_SELFSIGN)/Inf2Cat.exe ))
4235 endif
4236
4237 ifeq ($(VBOX_SIGNING_MODE),test)
4238 VBOX_CERTIFICATE_SUBJECT_NAME ?= MyTestCertificate
4239 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4240 else # release
4241 VBOX_CERTIFICATE_SUBJECT_NAME ?= VirtualBox 2022
4242 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)" /a
4243 #VBOX_CERTIFICATE_FINGERPRINT ?= 7e 92 b6 6b e5 1b 79 d8 ce 3f f2 5c 15 c2 df 6a b8 c7 f2 f2
4244 #VBOX_CERTIFICATE_FINGERPRINT ?= 5b de fe 58 0a 81 66 61 cd b5 7a 57 10 7b f4 18 74 86 ef cc
4245 #VBOX_CERTIFICATE_FINGERPRINT ?= 6f 47 42 06 bc bb 39 1b b8 2b a9 e5 dc 03 02 de f3 7a eb be
4246 VBOX_CERTIFICATE_FINGERPRINT ?= 5f 0b fe c5 53 17 c1 25 5a a4 7f cd bc 49 a2 fb 61 09 03 cc
4247 #VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/VeriSign Class 3 Public Primary Certification Authority - G5.cer
4248 #VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/DigiCert Assured ID Root CA.crt
4249 #VBOX_TSA_URL ?= http://timestamp.verisign.com/scripts/timstamp.dll - Appears to be broken between 2020-12-25 and 2020-12-30 (bugref:9849).
4250 VBOX_TSA_URL ?= http://timestamp.digicert.com
4251 endif
4252 if !defined(VBOX_CROSS_CERTIFICATE_FILE_ARGS) && defined(VBOX_CROSS_CERTIFICATE_FILE)
4253 VBOX_CROSS_CERTIFICATE_FILE_ARGS = /ac "$(VBOX_CROSS_CERTIFICATE_FILE)"
4254 endif
4255 if !defined(VBOX_TSA_URL_ARGS) && defined(VBOX_TSA_URL)
4256 VBOX_TSA_URL_ARGS = /t "$(VBOX_TSA_URL)"
4257 endif
4258 VBOX_CERTIFICATE_STORE ?= my
4259 VBOX_CERTIFICATE_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_STORE)"
4260 VBOX_CERTIFICATE_FINGERPRINT_ARGS := $(if-expr "$(VBOX_CERTIFICATE_FINGERPRINT)" != "" \
4261 ,/sha1 "$(subst $(SP),,$(VBOX_CERTIFICATE_FINGERPRINT))",)
4262
4263 ifeq ($(VBOX_SIGNING_MODE),test)
4264 #VBOX_CERTIFICATE_SHA2_SUBJECT_NAME ?= MyTestCertificateSha2
4265 VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME)"
4266 else # release
4267 VBOX_CERTIFICATE_SHA2_SUBJECT_NAME ?= Oracle Corporation
4268 VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME)" /a
4269 #VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 31 31 bb 58 8b 19 9e 6e 85 0f d3 35 82 b0 c5 82 55 e1 6c 49
4270 #VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 22 05 6a 4d 46 2e 3d 2b b2 c3 2f bf b0 5b 84 c4 65 9c f7 fe
4271 #VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 17 3a 19 bf 8e 62 72 be 25 04 d3 08 aa 68 b1 b0 0e 03 33 2c
4272 VBOX_CERTIFICATE_SHA2_FINGERPRINT ?= 30 65 6f ca 8c 48 b1 d9 86 23 a9 4b 40 a6 bc 98 bd 87 bf ad
4273 VBOX_CROSS_CERTIFICATE_SHA2_FILE ?= $(VBOX_PATH_SELFSIGN)/DigiCert Assured ID Root CA.crt
4274 #VBOX_TSA_SHA2_URL ?= http://sha256timestamp.ws.symantec.com/sha256/timestamp - phase out for consistency reasons
4275 VBOX_TSA_SHA2_URL ?= http://timestamp.digicert.com
4276 endif
4277 if !defined(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) && defined(VBOX_CROSS_CERTIFICATE_SHA2_FILE)
4278 VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS = /ac "$(VBOX_CROSS_CERTIFICATE_SHA2_FILE)"
4279 endif
4280 if !defined(VBOX_TSA_SHA2_URL_ARGS) && defined(VBOX_TSA_SHA2_URL)
4281 VBOX_TSA_SHA2_URL_ARGS = /tr "$(VBOX_TSA_SHA2_URL)" /td SHA256
4282 endif
4283 VBOX_CERTIFICATE_SHA2_STORE ?= my
4284 VBOX_CERTIFICATE_SHA2_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_SHA2_STORE)"
4285 VBOX_CERTIFICATE_SHA2_FINGERPRINT_ARGS := $(if-expr "$(VBOX_CERTIFICATE_SHA2_FINGERPRINT)" != "" \
4286 ,/sha1 "$(subst $(SP),,$(VBOX_CERTIFICATE_SHA2_FINGERPRINT))",) # Still using SHA-1 for fingerprinting, it's good enough for that!
4287 #VBOX_CERTIFICATE_EV_SUBJECT_NAME ?= MyEvCertificate
4288 VBOX_CERTIFICATE_EV_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_EV_SUBJECT_NAME)"
4289 VBOX_CERTIFICATE_EV_STORE ?= my
4290 VBOX_CERTIFICATE_EV_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_EV_STORE)"
4291 #VBOX_CERTIFICATE_EV_FINGERPRINT ?= my ev cert fingerprint
4292 VBOX_CERTIFICATE_EV_FINGERPRINT_ARGS := $(if-expr "$(VBOX_CERTIFICATE_EV_FINGERPRINT)" != "" \
4293 ,/sha1 "$(subst $(SP),,$(VBOX_CERTIFICATE_EV_FINGERPRINT))",) # Still using SHA-1 for fingerprinting, it's good enough for that!
4294
4295 ## Sign a file (generic).
4296 # @param 1 The file to sign.
4297 # @param 2 File description. Optional.
4298 # @param 3 Additional parameters. Optional.
4299 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4300 # @param 5 Disables dual signing if non-empty, picking the SHA2 signature (since 2022-07-18).
4301 # @param 6 non-zero for alternative command separator. This is used for generating repacking scripts.
4302 # @param 7 non-zero for timed execution if possible
4303 ifndef VBOX_SIGN_FILE_FN
4304 if $(intersects win all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4305 # CCS has lost the ability to do dual signing a while ago, can do SHA256 only
4306 VBOX_SIGN_FILE_FN = $(if $(strip $7),$(TIME) ,)$(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo SHA2)
4307 else ifdef VBOX_CERTIFICATE_SHA2_SUBJECT_NAME
4308 ifdef VBOX_CERTIFICATE_SUBJECT_NAME
4309 VBOX_SIGN_FILE_FN = $(if-expr "$5" == "",$(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL_SHA1) \
4310 sign /fd sha1 \
4311 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4312 $(VBOX_CERTIFICATE_STORE_ARGS) \
4313 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4314 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4315 $(VBOX_TSA_URL_ARGS) \
4316 $(if $(strip $(2)),/d "$(strip $(2))",) \
4317 $(3) \
4318 "$(1)" \
4319 $(if-expr "$6" == "",$(if-expr "$4" == "2",$$(NLTAB),$(NLTAB)),$6))$(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL_SHA2) \
4320 sign $(if-expr "$5" == "",/as,) /fd sha256 \
4321 $(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) \
4322 $(VBOX_CERTIFICATE_SHA2_STORE_ARGS) \
4323 $(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS) \
4324 $(VBOX_CERTIFICATE_SHA2_FINGERPRINT_ARGS) \
4325 $(VBOX_TSA_SHA2_URL_ARGS) \
4326 $(if $(strip $(2)),/d "$(strip $(2))",) \
4327 $(3) \
4328 "$(1)"
4329 else
4330 VBOX_SIGN_FILE_FN = $(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL_SHA2) \
4331 sign /fd sha256 \
4332 $(VBOX_CROSS_CERTIFICATE_SHA2_FILE_ARGS) \
4333 $(VBOX_CERTIFICATE_SHA2_STORE_ARGS) \
4334 $(VBOX_CERTIFICATE_SHA2_SUBJECT_NAME_ARGS) \
4335 $(VBOX_CERTIFICATE_SHA2_FINGERPRINT_ARGS) \
4336 $(VBOX_TSA_SHA2_URL_ARGS) \
4337 $(if $(strip $(2)),/d "$(strip $(2))",) \
4338 $(3) \
4339 "$(1)"
4340 endif
4341 else
4342 VBOX_SIGN_FILE_FN = $(if $(strip $7),$(TIME) ,)$(VBOX_SIGNTOOL) \
4343 sign /fd $(firstword $(VBOX_TEST_SIGN_ALGORITHM) sha256) \
4344 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4345 $(VBOX_CERTIFICATE_STORE_ARGS) \
4346 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4347 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4348 $(VBOX_TSA_URL_ARGS) \
4349 $(if $(strip $(2)),/d "$(strip $(2))",) \
4350 $(3) \
4351 "$(1)"
4352 endif
4353 endif
4354
4355 ## EV sign a file (generic).
4356 # @param 1 The file to sign.
4357 # @param 2 The directory to put the signed file in. Defaults to $(dir $1).
4358 ifndef VBOX_SIGN_EV_FILE_FN
4359 if $(intersects win_ev all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4360 VBOX_SIGN_EV_FILE_FN = $(call VBOX_CCS_SIGN_CMD,microsoftev,$1,$(if $2,$2,))
4361 else ifdef VBOX_CERTIFICATE_EV_SUBJECT_NAME
4362 VBOX_SIGN_EV_FILE_FN = $(VBOX_SIGNTOOL_SHA2) \
4363 sign /fd sha256 \
4364 $(VBOX_CERTIFICATE_EV_STORE_ARGS) \
4365 $(VBOX_CERTIFICATE_EV_SUBJECT_NAME_ARGS) \
4366 $(VBOX_CERTIFICATE_EV_FINGERPRINT_ARGS) \
4367 $(VBOX_TSA_SHA2_URL_ARGS) \
4368 "$(1)"
4369 endif
4370 endif
4371
4372 ## Local SHA-1 and SHA-256 signatures with EV SHA-256 signature from corp code signing.
4373 #
4374 # This builds on Plan B, since the corp code signing always replaces existing
4375 # signatures. Since we're signing more, though, we do things slightly differently
4376 # so we can apply this to VBOX_RTSIGNTOOL as well - only that didn't work because
4377 # kmk tries to help windows caching images it executes. So HACK ALERT on that.
4378 #
4379 # So, here is what we do.
4380 # 1. Sign $1 using the regular signing, probably dual signing it using local certs.
4381 # 2. Make temporary copy of $1 as $1.dual
4382 # 3. Do SHA-256 corp code signing of $1
4383 # 4. Add the SHA-256 signature from $1 to $1.dual using bldRTSignTool.
4384 # 5. Replace $1 with $1.dual.
4385 #
4386 # @param 1 The file to sign.
4387 # @param 2 File description. Optional.
4388 # @param 3 Additional parameters. Optional.
4389 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4390 # @param 5 Disables dual & tripple signing if non-empty.
4391 # @param 6 Disables triple signing if non-empty.
4392 #
4393 # @remarks The parameters are the same as VBOX_SIGN_FILE_FN.
4394 VBOX_SIGN_IMAGE_WITH_EV_FN = $(call VBOX_SIGN_FILE_FN,$1,$2,$3,$4,$5)$(if-expr "$5" == "" && "$(target)" != "bldRTSignTool", \
4395 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(RM) -f -- "$1.dual" \
4396 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(CP) -- "$1" "$1.dual" \
4397 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(call VBOX_CCS_SIGN_CMD,microsoftev,$1,,-digest_algo SHA2) \
4398 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(VBOX_RTSIGNTOOL) add-nested-$(if-expr "$(suffix $1)" == ".cat",cat,exe)-signature -v "$1.dual" "$1" \
4399 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(MV) -f -- "$1.dual" "$1" \
4400 ,)
4401
4402
4403 ## Corp code signing for drivers and catalogs, plan B.
4404 #
4405 # Since the corp code signing cannot dual signing and doesn't even have a
4406 # SHA-1 cert, we have to get creative:
4407 # 1. Sign $1 using local SHA-1 certificate.
4408 # 2. Make temporary copy of $1 as $1.dual
4409 # 3. Do SHA-256 corp code signing of $1
4410 # 4. Add the SHA-256 signature from $1 to $1.dual using bldRTSignTool.
4411 # 5. Move $1.dual to $1.
4412 #
4413 # @param 1 The file to sign.
4414 # @param 2 File description. Optional.
4415 # @param 3 Additional parameters. Optional.
4416 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4417 # @param 5 Disables dual signing if non-empty.
4418 #
4419 # @remarks The parameters are the same as VBOX_SIGN_FILE_FN.
4420 VBOX_SIGN_IMAGE_PLAN_B_FN = $(VBOX_SIGNTOOL_SHA1) \
4421 sign /fd sha1 \
4422 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4423 $(VBOX_CERTIFICATE_STORE_ARGS) \
4424 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4425 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4426 $(VBOX_TSA_URL_ARGS) \
4427 $(if $(strip $(2)),/d "$(strip $(2))",) \
4428 $(3) \
4429 "$(1)" \
4430 $(if-expr "$5" == "", \
4431 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(RM) -f -- "$1.dual" \
4432 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(CP) -- "$1" "$1.dual" \
4433 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo SHA2) \
4434 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(VBOX_RTSIGNTOOL) add-nested-$(if-expr "$(suffix $1)" == ".cat",cat,exe)-signature -v "$1.dual" "$1" \
4435 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(MV) -f -- "$1.dual" "$1" \
4436 ,)
4437
4438 ## Corp code signing for drivers and catalogs, plan C.
4439 #
4440 # This does a local SHA-1 signature before submitting to corp code signing. The end
4441 # result will have just a SHA-256 signature:
4442 # 1. Sign $1 using local SHA-1 certificate.
4443 # 2. Do SHA-256 corp code signing of $1
4444 #
4445 # @param 1 The file to sign.
4446 # @param 2 File description. Optional.
4447 # @param 3 Additional parameters. Optional.
4448 # @param 4 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4449 # @param 5 Disables dual signing if non-empty. Ignored because this can't do dual signing.
4450 # @remarks The parameters are the same as VBOX_SIGN_FILE_FN.
4451 VBOX_SIGN_IMAGE_PLAN_C_FN = $(VBOX_SIGNTOOL_SHA1) \
4452 sign /fd sha1 \
4453 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
4454 $(VBOX_CERTIFICATE_STORE_ARGS) \
4455 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4456 $(VBOX_CERTIFICATE_FINGERPRINT_ARGS) \
4457 $(VBOX_TSA_URL_ARGS) \
4458 $(if $(strip $(2)),/d "$(strip $(2))",) \
4459 $(3) \
4460 "$(1)" \
4461 $(if-expr "$4" == "2",$$(NLTAB),$(NLTAB))$(call VBOX_CCS_SIGN_CMD,driver$(if-expr "$3" == "/ph",_pagehash,),$1,,-digest_algo SHA2)
4462
4463 ## Sign an executable image, normal method.
4464 # @param 1 The file to sign.
4465 # @param 2 File description. Optional.
4466 # @param 3 Set to 2 if the expression will be expanded twice before chopped into commands (for _CMDS).
4467 if1of (win_with_ev, $(VBOX_WITH_CORP_CODE_SIGNING))
4468 VBOX_SIGN_IMAGE_NORMAL_FN ?= $(call VBOX_SIGN_IMAGE_WITH_EV_FN,$(1),$(2),/ph,$(3))
4469 VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS)
4470 else
4471 VBOX_SIGN_IMAGE_NORMAL_FN ?= $(call VBOX_SIGN_FILE_FN,$(1),$(2),/ph,$(3))
4472 VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS ?= $(VBOX_SIGNTOOL_ORDERDEPS)
4473 endif
4474
4475 ## Commands for signing a driver image after link.
4476 if $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4477 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(out),,/ph,2))
4478 VBOX_SIGN_DRIVER_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS))
4479 else if $(intersects win_planc,$(VBOX_WITH_CORP_CODE_SIGNING))
4480 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_NORMAL_FN,$(out),,2,nodual))
4481 VBOX_SIGN_DRIVER_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS))
4482 else
4483 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_NORMAL_FN,$(out),,2))
4484 VBOX_SIGN_DRIVER_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS))
4485 endif
4486
4487 ## Create a security catalog file.
4488 # @param 1 The directory containing the stuff to sign.
4489 # @param 2 The expected .cat name. (Inf2Cat lowercases it)
4490 # @param 3 The list of OSes, separated by ';'.
4491 ifndef VBOX_MAKE_CAT_HLP_FN
4492 VBOX_MAKE_CAT_HLP_FN = \
4493 $(RM) -f -- "$(2)" \
4494 $(NL)$(TAB)$(VBOX_INF2CAT) "/driver:$(strip $(1))" "/os:$(strip $(subst ;,$(COMMA),$(3)))" /verbose \
4495 $(NL)$(TAB)$(MV) -- "$(2)" "$(2)"
4496 if $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4497 VBOX_MAKE_CAT_HLP_FN += $(NL)$(TAB)$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(2),,,$(NL)$(TAB))
4498 else
4499 VBOX_MAKE_CAT_HLP_FN += $(NL)$(TAB)$(call VBOX_SIGN_FILE_FN,$(2),,,$(NL)$(TAB))
4500 endif
4501 endif
4502 VBOX_MAKE_CAT_FN.amd64 ?= $(call VBOX_MAKE_CAT_HLP_FN,$(1),$(2),XP_X64;Server2003_X64;Vista_X64)
4503 VBOX_MAKE_CAT_FN.x86 ?= $(call VBOX_MAKE_CAT_HLP_FN,$(1),$(2),2000;XP_X86;Server2003_X86;Vista_X86)
4504 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)
4505 VBOX_MAKE_CAT_FN = $(VBOX_MAKE_CAT_FN.$(KBUILD_TARGET_ARCH))
4506
4507 ## Functions + deps for signing an executable or a dll image. See VBOX_SIGN_IMAGE_NORMAL_FN for parameters.
4508 if defined(VBOX_CERTIFICATE_SUBJECT_NAME) && $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4509 VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(1),$(2),/ph,$(3))
4510 VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS)
4511 else if defined(VBOX_CERTIFICATE_SUBJECT_NAME) && $(intersects win_planc,$(VBOX_WITH_CORP_CODE_SIGNING))
4512 VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_IMAGE_PLAN_C_FN,$(1),$(2),/ph,$(3))
4513 VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS)
4514 else
4515 VBOX_SIGN_IMAGE_FN ?= $(call VBOX_SIGN_IMAGE_NORMAL_FN,$(1),$(2),$(3))
4516 VBOX_SIGN_IMAGE_ORDERDEPS ?= $(VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS)
4517 endif
4518
4519 # Go nuts, sign everything.
4520 if "$(VBOX_SIGNING_MODE)" == "release" || defined(VBOX_WITH_HARDENING)
4521 ## Commands for signing an executable or a dll image after link.
4522 if defined(VBOX_CERTIFICATE_SUBJECT_NAME) && $(intersects win_planb,$(VBOX_WITH_CORP_CODE_SIGNING))
4523 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_B_FN,$(out),,/ph,2))
4524 VBOX_SIGN_IMAGE_CMDS_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(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_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_PLAN_C_FN,$(out),,/ph,2))
4527 VBOX_SIGN_IMAGE_CMDS_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_RTSIGNTOOL) $(VBOX_SIGNTOOL_ORDERDEPS))
4528 else
4529 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_NORMAL_FN,$(out),,2))
4530 VBOX_SIGN_IMAGE_CMDS_ORDERDEPS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_SIGN_IMAGE_NORMAL_ORDERDEPS))
4531 endif
4532 endif
4533 ## Enable signing of the additions drivers, i.e. create CAT files.
4534 ## @todo r=bird: This bugger is entirely misplaced, as it belongs in the additions config section so it can be properly overriden.
4535 VBOX_SIGN_ADDITIONS ?= 1
4536 ## Set if we should include the legacy timestamp CA.
4537 ifndef VBOX_WITH_VBOX_LEGACY_TS_CA
4538 if "$(findstring 805af82410a4827b71f59479a222670391bec2d5,$(VBOX_TSA_URL_ARGS))" != ""
4539 VBOX_WITH_VBOX_LEGACY_TS_CA = 1
4540 endif
4541 endif
4542
4543 else ifeq ($(KBUILD_HOST),darwin)
4544
4545 ## Sign a VM process binary with the given entitlements
4546 # @param 1 The file to sign.
4547 # @param 2 Identifier, optional.
4548 ifeq ($(VBOX_SIGNING_MODE),adhoc)
4549 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4550 ## @todo cannot handle $(2), the identifier.
4551 VBOX_SIGN_IMAGE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4552 $(call VBOX_CCS_SIGN_CMD,binary,$(1),,$(subst --entitlements=,-entitlement_file_path ,$(3)) \
4553 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime))
4554 else
4555 VBOX_SIGN_IMAGE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4556 --verbose=9 \
4557 --force \
4558 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4559 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4560 --file-list - \
4561 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4562 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4563 --entitlements="$(VBOX_DARWIN_ENTITLEMENTS_FILE_VM)" \
4564 "$(1)" \
4565 $(if $(2),--identifier "$(2)",)
4566 endif
4567 else
4568 VBOX_SIGN_IMAGE_FN =
4569 endif
4570
4571 #
4572 # Darwin code signing.
4573 #
4574 # Currently release signing is done when packing. This may change later.
4575 # (Installer package signing is done elsewhere (VBOX_MACOSX_INSTALLER_SIGN).)
4576 #
4577 if defined(VBOX_CERTIFICATE_FINGERPRINT) && !defined(VBOX_CERTIFICATE_SUBJECT_NAME)
4578 VBOX_CERTIFICATE_SUBJECT_NAME = $(subst $(SP),,$(VBOX_CERTIFICATE_FINGERPRINT))
4579 endif
4580 ifeq ($(VBOX_SIGNING_MODE),test)
4581 VBOX_CERTIFICATE_SUBJECT_NAME ?= $(error You need to set VBOX_CERTIFICATE_SUBJECT_NAME in LocalConfig.kmk.)
4582 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= --sign "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4583 VBOX_TSA_URL ?= none
4584 else ifeq ($(VBOX_SIGNING_MODE),adhoc)
4585 ifdef VBOX_CERTIFICATE_SUBJECT_NAME
4586 $(error VBOX_CERTIFICATE_SUBJECT_NAME must not be set in 'adhoc' signing mode)
4587 endif
4588 VBOX_CERTIFICATE_SUBJECT_NAME = -
4589 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= --sign "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4590 VBOX_TSA_URL ?= none
4591 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out),,2))
4592 else
4593 VBOX_CERTIFICATE_SUBJECT_NAME ?= Developer ID Application: Oracle America, Inc.
4594 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= --sign "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
4595 endif
4596
4597 VBOX_CODESIGN ?= codesign
4598 if 0
4599 VBOX_DARWIN_KEXT_SIGN_FILES = CodeDirectory CodeRequirement CodeResources CodeSignature
4600 else
4601 VBOX_DARWIN_KEXT_SIGN_FILES = CodeResources
4602 endif
4603
4604 # Always enable the hardened runtime when signing. Can be disabled if
4605 # trying to build on quite old macOS, which will likely need some effort.
4606 VBOX_WITH_MACOS_HARDENED_RUNTIME ?= 1
4607
4608 ##
4609 # Corp Code Notarization command line. Modifies the file because the tickets are stapled.
4610 # @param 1 The file to be submitted for signing.
4611 # @param 2 Identifier, mandatory.
4612 # @param 3 The directory to put the notarized file in. Defaults to $(dir $1).
4613 VBOX_CCS_NOTARIZE_CMD = $(VBOX_RETRY) $(VBOX_JAVA) -jar "$(VBOX_CCS_CLIENT_JAR)" \
4614 mac_notarize -user "$(VBOX_CCS_USER)" -global_uid "$(VBOX_CCS_GLOBAL_UID)" \
4615 -job_timeout 90 -server_timeout 75 -server "$(VBOX_CCS_SERVER)" \
4616 -file_to_notarize "$1" -bundle_id "$2" -download_location "$(if $3,$3,$(call VBOX_DIRX,$1))"
4617
4618 ## Sign an application bundle, framework or kernel extension.
4619 # @param 1 The bundle to sign.
4620 # @param 2 Identifier, optional.
4621 # @param 3 Additional codesign command line parameters, optional.
4622 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4623 ## @todo cannot handle $(2), the identifier.
4624 ## @todo $(3) is hopefully either empty, --deep or --entitlements=...
4625 VBOX_SIGN_BUNDLE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4626 ditto -c -k --keepParent "$(1)" "$(1).zip"$(NLTAB) \
4627 $(call VBOX_CCS_SIGN_CMD,apple,$(1).zip,,$(subst --entitlements=,-entitlement_file_path ,$(subst --deep,-deep,$(3))) \
4628 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime))$(NLTAB) \
4629 ditto -x -k "$(1).zip" "$(1)/../"$(NLTAB) \
4630 $(RM) -f -- "$(1).zip"
4631 else
4632 VBOX_SIGN_BUNDLE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4633 --verbose=9 \
4634 --force \
4635 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4636 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4637 --file-list - \
4638 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4639 $(3) \
4640 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4641 "$(1)" $(if $(2),--identifier "$(2)",)
4642 endif
4643
4644 ## Sign a Mach-O image.
4645 # @param 1 The file to sign.
4646 # @param 2 Identifier, optional.
4647 # @param 3 Additional codesign command line parameters, optional.
4648 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4649 ## @todo cannot handle $(2), the identifier.
4650 ## @todo $(3) is hopefully either empty or --entitlements=...
4651 VBOX_SIGN_MACHO_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4652 $(call VBOX_CCS_SIGN_CMD,binary,$(1),,$(subst --entitlements=,-entitlement_file_path ,$(3)) \
4653 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime))
4654 else
4655 VBOX_SIGN_MACHO_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4656 --verbose=9 \
4657 --force \
4658 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4659 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4660 --file-list - \
4661 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4662 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4663 $(3) \
4664 "$(1)" \
4665 $(if $(2),--identifier "$(2)",)
4666 endif
4667
4668 ## Commands for signing an extpack dylib file after link.
4669 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4670 VBOX_SIGN_EXTPACK_DYLIB_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),, \
4671 $(call VBOX_CCS_SIGN_CMD,binary,$(out),, \
4672 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),-hardened_runtime)) )
4673 else
4674 VBOX_SIGN_EXTPACK_DYLIB_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),, \
4675 $(VBOX_CODESIGN) \
4676 --verbose=9 \
4677 --force \
4678 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4679 $(if $(VBOX_WITH_MACOS_HARDENED_RUNTIME),$(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 16,--options 0x10000,--options runtime)) \
4680 --file-list - \
4681 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4682 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4683 $(out) )
4684 endif
4685
4686 ## Sign a VMM Mach-O image.
4687 # @param 1 The file to sign.
4688 # @param 2 Identifier, optional.
4689 VBOX_SIGN_VMM_MOD_FN = $(VBOX_SIGN_MACHO_FN)
4690
4691 ## Sign a non-executable file.
4692 # @param 1 The file to sign.
4693 # @param 2 Identifier, optional.
4694 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4695 ## @todo cannot handle $(2), the identifier.
4696 VBOX_SIGN_FILE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB) \
4697 $(call VBOX_CCS_SIGN_CMD,mac_dmg,$(1))$(NLTAB) \
4698 $(REDIRECT) -E 'LC_ALL=C' -we "$(1).tmp" -- ditto -x -k -V "$(1).zip" "$(call VBOX_DIRX,$(1))"$(NLTAB) \
4699 dirname="$(call VBOX_DIRX,$(1))$(DOLLAR)($(SED) -n -e 's+^copying file \([0-9]\{1,\}\)/.\{1,\}$(DOLLAR)+\1+p' "$(1).tmp")" ; \
4700 $(MV) -f -- "$(DOLLAR)dirname/$(DOLLAR)(basename "$(1)")" "$(call VBOX_DIRX,$(1))" ; \
4701 $(RM) -Rf -- "$(DOLLAR)dirname/"$(NLTAB) \
4702 $(RM) -f -- "$(1).zip" "$(1).tmp"
4703 else
4704 VBOX_SIGN_FILE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(VBOX_CODESIGN) \
4705 --verbose=9 \
4706 --force \
4707 $(if-expr $(KBUILD_HOST_VERSION_MAJOR) <= 14,--digest-algorithm sha256,) \
4708 --file-list=- \
4709 $(if-expr defined(VBOX_TSA_URL),--timestamp="$(VBOX_TSA_URL)") \
4710 $(if $(2),--identifier "$(2)",) \
4711 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
4712 "$(1)"
4713 endif
4714
4715 ## Sign a DMG image.
4716 # @param 1 The file to sign.
4717 # @param 2 Identifier, optional.
4718 # @note Will segfault if --file-list is used on 10.15.2 (kSecCodeInfoChangedFiles -> NULL, outputter doesn't check for NULL).
4719 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4720 VBOX_SIGN_DMG_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(call VBOX_CCS_SIGN_CMD,binary,$(1))
4721 else
4722 VBOX_SIGN_DMG_FN = $(filter-out --file-list=-,$(VBOX_SIGN_FILE_FN))
4723 endif
4724
4725 ## Sign a PKG file. Used with corp code signing only.
4726 # @param 1 The file to sign.
4727 # @param 2 Identifier, optional.
4728 if $(intersects darwin all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4729 ## @todo cannot handle $(2), the identifier.
4730 VBOX_SIGN_PKG_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(call VBOX_CCS_SIGN_CMD,mac_pkg,$(1))
4731 endif
4732
4733 ## Notarize a file (usually DMG, can also be PKG). Used with corp code signing only.
4734 # @param 1 The file to notarize.
4735 # @param 2 Identifier, mandatory.
4736 # @param 3 The directory to put the notarized file in. Defaults to $(dir $1).
4737 if $(intersects darwin darwin_notarize all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4738 VBOX_NOTARIZE_FILE_FN = $(call MSG_TOOL,SIGNTOOL,,$(1),$(2))$(NLTAB)$(call VBOX_CCS_NOTARIZE_CMD,$(1),$(2),$(3))
4739 endif
4740
4741 ## @def VBOX_TEST_SIGN_KEXT
4742 # Adds test signing to a $1.kext target (the plist installer target).
4743 #
4744 # After both targets has been defined:
4745 # $(evalcall2 VBOX_TEST_SIGN_KEXT,VBoxDrv)
4746 #
4747 # @param 1 The kext name. Assumes there is a SYSMODS target of name $1
4748 # as well as an .plist installer by the name of '$1.kext'.
4749 # @remarks Currently assumes only binary + Info.plist in the bundle, no
4750 # other files. Should there be more, add them as a list in
4751 # a 2nd parameter.
4752 # @note This is only for the 'test' signing mode, we skip this in
4753 # 'release' signing mode as to not waste time on the build boxes.
4754 ifeq ($(VBOX_SIGNING_MODE),test) ## @todo when kBuild is updated to r2742+, this should be enabled for both modes.
4755 define VBOX_TEST_SIGN_KEXT
4756 $1_INSTTYPE.darwin = none
4757
4758 $1.kext_SOURCES += $$($1.kext_0_OUTDIR)/Contents/MacOS/$1=>MacOS/$1 \
4759 $(foreach extfile, $(VBOX_DARWIN_KEXT_SIGN_FILES) \
4760 , $$($1.kext_0_OUTDIR)/Contents/_CodeSignature/$(extfile)=>_CodeSignature/$(extfile))
4761 $1.kext_SYMLINKS += $(foreach symfile, $(VBOX_DARWIN_KEXT_SIGN_SYMLINKS), $(symfile)=>_CodeSignature/$(symfile))
4762 $1.kext_CLEAN += \
4763 $(foreach extfile, $(VBOX_DARWIN_KEXT_SIGN_FILES) , $$($1.kext_0_OUTDIR)/Contents/_CodeSignature/$(extfile)) \
4764 $(foreach symfile, $(VBOX_DARWIN_KEXT_SIGN_SYMLINKS), $$($1.kext_0_OUTDIR)/Contents/$(symfile)) \
4765 $$($1.kext_0_OUTDIR)/Contents/MacOS/$1 \
4766 $$($1.kext_0_OUTDIR)/$1.kext/Contents/_CodeSignature/
4767 $1.kext_BLDDIRS += $$($1.kext_0_OUTDIR)/Contents/MacOS/
4768
4769 $$$$($1.kext_0_OUTDIR)/Contents/MacOS/$1 \
4770 + $(foreach file,$(VBOX_DARWIN_KEXT_SIGN_FILES), $$$$($1.kext_0_OUTDIR)/Contents/_CodeSignature/$(file)): \
4771 $$$$($1.kext_0_OUTDIR)/Contents/Info.plist $$$$($1_1_TARGET) | $$$$($1.kext_0_OUTDIR)/
4772 $(RM) -Rf -- "$$($1.kext_0_OUTDIR)/Contents/_CodeSignature/" "$$($1.kext_0_OUTDIR)/Contents/MacOS/"
4773 $(MKDIR) -p -- "$$($1.kext_0_OUTDIR)/Contents/MacOS/"
4774 $(INSTALL) -m 644 $$($1_1_TARGET) $$($1.kext_0_OUTDIR)/Contents/MacOS/$1
4775 $(call VBOX_SIGN_BUNDLE_FN,$$($1.kext_0_OUTDIR),org.virtualbox.app.kext.$1,)
4776 endef
4777 else
4778 VBOX_TEST_SIGN_KEXT =
4779 endif
4780
4781
4782 else ifeq ($(KBUILD_HOST),solaris)
4783 #
4784 # Solaris code signing.
4785 #
4786 ifeq ($(VBOX_SIGNING_MODE),test)
4787 VBOX_CERTIFICATE_FILE ?= $(error You need to set VBOX_CERTIFICATE_FILE in LocalConfig.kmk.)
4788 VBOX_TOKEN_NAME ?= $(error You need to set VBOX_TOKEN_NAME in LocalConfig.kmk.)
4789 VBOX_PIN_FILE ?= $(error You need to set VBOX_PIN_FILE in LocalConfig.kmk.)
4790 else
4791 VBOX_CERTIFICATE_FILE ?= $(PATH_ROOT)/oracle.pem
4792 VBOX_TOKEN_NAME ?= "Sun Software PKCS\#11 softtoken"
4793 VBOX_PIN_FILE ?= $(PATH_ROOT)/oracle.pin
4794 endif
4795 VBOX_CERTIFICATE_FILE_ARGS ?= -c $(VBOX_CERTIFICATE_FILE)
4796 VBOX_TOKEN_NAME_ARGS ?= -T $(VBOX_TOKEN_NAME)
4797 VBOX_PIN_ARGS ?= -P $(VBOX_PIN_FILE)
4798
4799 VBOX_ELFSIGN ?= elfsign
4800
4801 # Sign an ELF image.
4802 # @param 1 The elf object file to sign.
4803 VBOX_SIGN_ELF_FN ?= $(VBOX_ELFSIGN) \
4804 sign \
4805 $(VBOX_CERTIFICATE_FILE_ARGS) \
4806 $(VBOX_TOKEN_NAME_ARGS) \
4807 $(VBOX_PIN_ARGS) \
4808 -e "$(1)"
4809
4810 ## Commands for signing a driver image after link.
4811 if $(intersects solaris all 1,$(VBOX_WITH_CORP_CODE_SIGNING))
4812 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_CCS_SIGN_CMD,solaris_elf,$(out)))
4813 else
4814 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_ELF_FN,$(out)))
4815 endif
4816
4817 else
4818 # Not Windows, Mac OS X or Solaris build host, ignore.
4819 VBOX_SIGNING_MODE :=
4820 endif
4821
4822 #
4823 # Complain if windows hardening is enabled but not code signing.
4824 #
4825else if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING) && !defined(VBOX_ONLY_BUILD)
4826 $(error You need to enable code signing for a hardened windows build to work.)
4827endif
4828
4829#
4830# Windows .inf editing.
4831#
4832VBOX_EDIT_INF_FN = $(VBOX_EDIT_INF_FN.$(KBUILD_TARGET_ARCH))
4833## Edit an inf file a x86 target.
4834# @param 1 The inf file to edit.
4835# @param 2 The output file.
4836VBOX_EDIT_INF_FN.x86 = $(SED) $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d') \
4837 -e 's/^;x86 *//' \
4838 -e '/^;amd64 /d' \
4839 -e '/^;arm64 /d' \
4840 -e 's/@DOT-NT-ARCH@/.NTx86/g' \
4841 -e 's/@COMMA-NT-ARCH@/,NTx86/g' \
4842 -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)/' \
4843 --output $(2) \
4844 $(1)
4845## Edit an inf file an amd64 target.
4846# @param 1 The inf file to edit.
4847# @param 2 The output file.
4848VBOX_EDIT_INF_FN.amd64 = $(SED) \
4849 $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d') \
4850 -e 's/^;amd64 *//' \
4851 -e '/^;x86 /d' \
4852 -e '/^;arm64 /d' \
4853 -e 's/@DOT-NT-ARCH@/.NTAMD64/g' \
4854 -e 's/@COMMA-NT-ARCH@/,NTAMD64/g' \
4855 -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)/' \
4856 --output $(2) \
4857 $(1)
4858## Edit an inf file for an arm64 target.
4859# @param 1 The inf file to edit.
4860# @param 2 The output file.
4861VBOX_EDIT_INF_FN.arm64 = $(SED) \
4862 $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d') \
4863 -e 's/^;arm64 *//' \
4864 -e '/^;x86 /d' \
4865 -e '/^;amd64 /d' \
4866 -e 's/@DOT-NT-ARCH@/.NTARM64/g' \
4867 -e 's/@COMMA-NT-ARCH@/,NTARM64/g' \
4868 -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)/' \
4869 --output $(2) \
4870 $(1)
4871
4872## @def VBOX_RE_SIGN_DLL_FN
4873# Helper macro for re-signing DLL images from tools that we ship so they won't
4874# cause trouble for the hardened build requirements.
4875#
4876# Invoke via $(call VBOX_RE_SIGN_DLL_FN) inside the SOURCES list. Necessary
4877# _CLEAN entry will be added to the target. If hardening is not enabled or
4878# we're not on windows, the source will be returned.
4879#
4880# @returns Name of the output file name. May have leading space, but no trailing.
4881# @param 1 Target name.
4882# @param 2 The source name.
4883# @param 3 Optional prefix to avoid name collisions.
4884#
4885if defined(VBOX_SIGNING_MODE) && "$(KBUILD_TARGET)" == "win"
4886 if1of (quote, $(KMK_FEATURES))
4887 VBOX_RE_SIGN_DLL_FN = $(if-expr !defined($(1)_VBOX_RE_SIGNED_$(3)$(qnotdir ,$(2))), \
4888 $(evalcall VBOX_RE_SIGN_DLL_INTERNAL_FN,$1,$2,$3) \
4889 ,)$($(1)_0_OUTDIR)/$(3)$(qnotdir ,$2)
4890
4891 define VBOX_RE_SIGN_DLL_INTERNAL_FN
4892 local n = $(3)$(qnotdir ,$2)
4893 ifndef $(1)_VBOX_RE_SIGNED_$(n)
4894 $(1)_VBOX_RE_SIGNED_$(n) := 1
4895 $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(n))
4896
4897 $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@) $(VBOX_SIGN_IMAGE_ORDERDEPS)
4898 $(call MSG_TOOL,SIGNTOOL,,$<,$@)
4899 $(RM) -f -- "$@"
4900 $(CP) -- "$(quote-sh-dq $<)" "$@"
4901 $(CHMOD) a+rw -- "$@"
4902 $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release \
4903 $(if-expr !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT),/IntegrityCheck,) \
4904 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
4905 "$@"
4906 $(call VBOX_SIGN_IMAGE_FN,$@)
4907 endif
4908 endef # VBOX_RE_SIGN_DLL_INTERNAL_FN
4909
4910 else # old kmk: no quote feature
4911 VBOX_RE_SIGN_DLL_FN = $(if-expr !defined($(1)_VBOX_RE_SIGNED_$(3)$(notdir $(2))), \
4912 $(evalcall VBOX_RE_SIGN_DLL_INTERNAL_FN,$1,$2,$3) \
4913 ,)$($(1)_0_OUTDIR)/$(3)$(notdir $2)
4914 define VBOX_RE_SIGN_DLL_INTERNAL_FN
4915 local n = $(3)$(notdir $2)
4916 ifndef $(1)_VBOX_RE_SIGNED_$(n)
4917 $(1)_VBOX_RE_SIGNED_$(n) := 1
4918 $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(n))
4919
4920 $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@) $(VBOX_SIGN_IMAGE_ORDERDEPS)
4921 $(call MSG_TOOL,SIGNTOOL,,$<,$@)
4922 $(RM) -f -- "$@"
4923 $(CP) -- "$<" "$@"
4924 $(CHMOD) a+rw -- "$@"
4925 $(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release \
4926 $(if-expr !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT),/IntegrityCheck,) \
4927 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
4928 "$@"
4929 $(call VBOX_SIGN_IMAGE_FN,$@)
4930 endif
4931 endef # VBOX_RE_SIGN_DLL_INTERNAL_FN
4932 endif # old kmk: no quote feature
4933else
4934 VBOX_RE_SIGN_DLL_FN = $(2)
4935endif
4936
4937
4938#
4939# File version info and description macros (ignored on most OSes).
4940#
4941
4942##
4943# Internal macro.
4944#
4945# @param 1 The target name.
4946# @param 2 The description
4947# @param 3 Optional icon file.
4948# @param 4 The template base name.
4949# @param 5 Additional RC options.
4950# @param 6 Original filename to use.
4951#
4952# @remarks ASSUMES RCFLAGS isn't a simple variable (var := value).
4953define VBOX_SET_VER_INFO_INTERNAL
4954 ifeq ($(KBUILD_TARGET),win)
4955 $(1)_SOURCES.win += $(PATH_ROOT)/src/VBox/Artwork/win/$(4)
4956 $(1)_RCFLAGS += /nologo /dIN_INTERNAL_NAME="\"$(1)\"" /dIN_FILE_DESCRIPTION="\"$(2)\"" \
4957 /dIN_ORIGINAL_NAME="\"$(if $(6),$6,$$(notdir $$($(1)_1_INST_TARGET)))\"" \
4958 $(if $(3), /dIN_ICON_FILE="\"$(subst \\,/,$(strip $(3)))\"") $(5)
4959 $$$$($(1)_0_OUTDIR)/src/VBox/Artwork/win/$(basename $(4)).res: \
4960 $(PATH_ROOT)/include/VBox/version.h $$$$(VBOX_VERSION_HEADER)
4961 endif
4962endef
4963
4964##
4965# Macro for setting DLL/SO/DYLIB version information and description.
4966#
4967# The macro must be invoked using evalcall2 after the whole target has
4968# been declared.
4969#
4970# @param 1 The target name.
4971# @param 2 The description
4972# @param 3 Optional icon file.
4973VBOX_SET_VER_INFO_DLL = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateDll.rc,)
4974
4975##
4976# Macro for setting EXE version information and description.
4977#
4978# The macro must be invoked using call after the whole target has been declared.
4979#
4980# @param 1 The target name.
4981# @param 2 The description
4982# @param 3 Optional icon file.
4983# @param 4 Optional OriginalFilename value to use. Defaults to target name w/o dir.
4984VBOX_SET_VER_INFO_EXE = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateExe.rc,,$4)
4985
4986##
4987# Macro for setting driver version information and description.
4988#
4989# The macro must be invoked using call after the whole target has been declared.
4990#
4991# @param 1 The target name.
4992# @param 2 The description
4993# @param 3 Optional icon file.
4994# @param 4 Optional VFT2_DRV_xxx define for windows. Uses VFT2_UNKNOWN by default.
4995VBOX_SET_VER_INFO_DRV = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateDrv.rc,$(if $(4), /dIN_FILE_SUBTYPE=$(4)))
4996
4997##
4998# Macro for setting the version information and description for a ring-0 module.
4999#
5000# The macro must be invoked using call after the whole target has been declared.
5001#
5002# @param 1 The target name.
5003# @param 2 The description
5004# @param 3 Optional icon file.
5005VBOX_SET_VER_INFO_R0 = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateR0.rc,)
5006
5007##
5008# Macro for setting the version information and description for a raw-mode context module.
5009#
5010# The macro must be invoked using call after the whole target has been declared.
5011#
5012# @param 1 The target name.
5013# @param 2 The description
5014# @param 3 Optional icon file.
5015VBOX_SET_VER_INFO_RC = $(evalcall2 VBOX_SET_VER_INFO_INTERNAL,$1,$2,$3,TemplateRc.rc,)
5016
5017
5018
5019#
5020# Adjust kBuild defaults.
5021#
5022kBuildGlobalDefaults_DEBUG_NOSTAGE.win = true
5023kBuildGlobalDefaults_DEBUG_NOSTAGE.os2 = true
5024if1of ($(KBUILD_TARGET), darwin win)
5025 kBuildGlobalDefaults_LD_DEBUG = split
5026endif
5027
5028
5029#
5030# Haiku resource and version generation.
5031#
5032ifeq ($(KBUILD_HOST),haiku)
5033 VBOX_HAIKU_RCTOOL := rc
5034 VBOX_HAIKU_XRESTOOL := xres
5035 VBOX_HAIKU_SETVERSIONTOOL := setversion
5036 # XXX: install won't preserve attributes...
5037 VBOX_HAIKU_MIMESETTOOL := mimeset
5038
5039 ## Add optional resources to the program, set its version info, and sniff its mime properties.
5040 # @param 1 The file to add resources to.
5041 # @param 2 The resource files.
5042 # @param 3 The target name.
5043 define VBOX_HAIKU_XRES_SETVER_FN
5044 $(if $(2),$(call MSG_TOOL,HaikuAddResources,$(3),$(2))
5045 $(QUIET)$(VBOX_HAIKU_XRESTOOL) -o $(1) $(2),)
5046 $(call MSG_TOOL,HaikuSetVersion,$(3))
5047 $(QUIET)$(VBOX_HAIKU_SETVERSIONTOOL) $(1) \
5048 -app $(VBOX_VERSION_MAJOR) $(VBOX_VERSION_MINOR) $(VBOX_VERSION_BUILD) d $(VBOX_SVN_REV) \
5049 -short "$(VBOX_PRODUCT)" \
5050 -long "$(VBOX_PRODUCT) $(VBOX_VERSION_STRING) $(shell /bin/echo -e '\xC2\xA9')2009-$(VBOX_C_YEAR) $(VBOX_VENDOR)"
5051 $(call MSG_TOOL,HaikuMimeSet,$(3))
5052 $(QUIET)$(VBOX_HAIKU_MIMESETTOOL) -f $(1)
5053 endef
5054
5055 VBOX_HAIKU_XRES_SETVER_CMDS ?= $(if $(eq $(tool_do),LINK_PROGRAM),$(call VBOX_HAIKU_XRES_SETVER_FN,$(out),$($(target)_RSRCS),$(target)),)
5056endif
5057
5058#
5059# Default prefixes and suffixes.
5060#
5061VBOX_PREF_LIB =
5062if1of ($(KBUILD_TARGET), os2 win)
5063 VBOX_SUFF_LIB = .lib
5064else
5065 VBOX_SUFF_LIB = .a
5066endif
5067if1of ($(KBUILD_HOST), os2 win)
5068 VBOX_HOSTSUFF_LIB = .lib
5069else
5070 VBOX_HOSTSUFF_LIB = .a
5071endif
5072VBOX_SUFF_DLL = $(SUFF_DLL)
5073ifeq ($(KBUILD_TARGET),os2) # GXX3OMF produces out .o at the moment.
5074 VBOX_SUFF_OBJ = .o
5075else
5076 VBOX_SUFF_OBJ = $(SUFF_OBJ)
5077endif
5078VBOXW32GUEST_SUFF_LIB = .lib
5079VBOXLNX32GUEST_SUFF_LIB = .a
5080
5081#
5082# SDKs for external libraries.
5083#
5084ifdef VBOX_WITH_DXVK
5085 SDK_VBoxDxVk := Direct3D 9/10/11 to Vulkan - for dll linking.
5086 SDK_VBoxDxVk_DEFAULT_INCS := \
5087 $(PATH_ROOT)/src/libs/dxvk-2.3.1/include/native/directx \
5088 $(PATH_ROOT)/src/libs/dxvk-2.3.1/include/native/windows
5089 SDK_VBoxDxVk_INCS ?= $(SDK_VBoxDxVk_DEFAULT_INCS)
5090 # Loaded dynamically
5091 SDK_VBoxDxVk_LIBS ?=
5092endif
5093
5094ifdef VBOX_WITH_LIBCURL
5095 SDK_VBoxLibCurl := libcurl for dll linking.
5096 SDK_VBoxLibCurl_INCS ?= $(PATH_ROOT)/src/libs/curl-8.7.1/include
5097 SDK_VBoxLibCurl_LIBS ?= $(PATH_STAGE_LIB)/VBox-libcurl$(VBOX_SUFF_LIB)
5098 SDK_VBoxLibCurl_DEFS ?= BUILDING_LIBCURL
5099
5100 SDK_VBoxLibCurl-x86 = libcurl/x86 for dll linking.
5101 SDK_VBoxLibCurl-x86_INCS ?= $(PATH_ROOT)/src/libs/curl-8.7.1/include
5102 SDK_VBoxLibCurl-x86_LIBS.x86 ?= $(PATH_STAGE_LIB)/VBox-libcurl-x86$(VBOX_SUFF_LIB)
5103 SDK_VBoxLibCurl-x86_DEFS ?= BUILDING_LIBCURL
5104endif
5105
5106SDK_VBoxLibPng := protable network graphics (png) library for dll linking.
5107SDK_VBoxLibPng_INCS ?= $(PATH_ROOT)/src/libs/libpng-1.6.43
5108SDK_VBoxLibPng_LIBS ?= $(PATH_STAGE_LIB)/VBox-libpng$(VBOX_SUFF_LIB)
5109
5110# lzf
5111SDK_VBoxLzf := lzf compressor/decompressor for dll linking.
5112SDK_VBoxLzf_INCS ?= $(PATH_ROOT)/src/libs/liblzf-3.6
5113SDK_VBoxLzf_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzf$(VBOX_SUFF_LIB)
5114
5115SDK_VBoxLzf-x86 := lzf/x86 compressor/decompressor for dll linking.
5116SDK_VBoxLzf-x86_EXTENDS := VBoxLzf
5117SDK_VBoxLzf-x86_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzf-x86$(VBOX_SUFF_LIB)
5118
5119SDK_VBoxLzfStatic := lzf compressor/decompressor for static linking.
5120SDK_VBoxLzfStatic_EXTENDS := VBoxLzf
5121if1of ($(KBUILD_TARGET), os2 win)
5122 SDK_VBoxLzfStatic_LIBS := $(PATH_STAGE_LIB)/VBox-liblzf-static$(VBOX_SUFF_LIB)
5123endif
5124
5125# openssl
5126SDK_VBoxOpenSslStatic := OpenSSL - Only for VBoxRT and/or statically linked programs.
5127SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.1.7-headers/include
5128SDK_VBoxOpenSslStatic_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)
5129SDK_VBoxOpenSslStatic_ORDERDEPS ?= $(crypto-headers_1_TARGET)
5130if !defined(VBOX_ONLY_SDK) \
5131 && (!defined(VBOX_ONLY_ADDITIONS) || !defined(VBOX_ONLY_ADDITIONS_WITHOUT_RTISOMAKER)) \
5132 && (!defined(VBOX_ONLY_EXTPACKS) || !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS)) \
5133 && ("$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)")
5134 SDK_VBoxOpenSslStatic_DEPS ?= $(SDK_VBoxOpenSslStatic_INCS)/openssl/openssl-mangling.h
5135endif
5136SDK_VBoxOpenSslStatic_LIBS ?= \
5137 $(PATH_STAGE_LIB)/VBox-libssl$(VBOX_SUFF_LIB) \
5138 $(PATH_STAGE_LIB)/VBox-libcrypto$(VBOX_SUFF_LIB)
5139
5140SDK_VBoxOpenSslStatic-x86 := OpenSSL/x86 - Only for VBoxRT and/or statically linked programs.
5141SDK_VBoxOpenSslStatic-x86_VBOX_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-3.1.7-headers/include
5142SDK_VBoxOpenSslStatic-x86_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)
5143SDK_VBoxOpenSslStatic-x86_ORDERDEPS ?= $(crypto-headers_1_TARGET)
5144if ("$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)")
5145 SDK_VBoxOpenSslStatic-x86_DEPS ?= $(SDK_VBoxOpenSslStatic_INCS)/openssl/openssl-mangling.h
5146endif
5147SDK_VBoxOpenSslStatic-x86_LIBS ?= \
5148 $(PATH_STAGE_LIB)/VBox-libssl-x86$(VBOX_SUFF_LIB) \
5149 $(PATH_STAGE_LIB)/VBox-libcrypto-x86$(VBOX_SUFF_LIB)
5150
5151ifdef VBOX_WITH_BLD_RTSIGNTOOL_SIGNING
5152 SDK_VBoxOpenSslBldProg := OpenSSL - Build tools verison (i.e. bldRTSignTool)
5153 SDK_VBoxOpenSslBldProg_INCS ?= $(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)
5154 SDK_VBoxOpenSslBldProg_ORDERDEPS ?= $(crypto-headers_1_TARGET)
5155 if !defined(VBOX_ONLY_SDK) \
5156 && ("$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)")
5157 SDK_VBoxOpenSslBldProg_DEPS ?= $(SDK_VBoxOpenSslStatic_INCS)/openssl/openssl-mangling.h
5158 endif
5159 SDK_VBoxOpenSslBldProg_LIBS ?= \
5160 $(PATH_STAGE_LIB)/VBoxBldProg-libssl$(VBOX_SUFF_LIB) \
5161 $(PATH_STAGE_LIB)/VBoxBldProg-libcrypto$(VBOX_SUFF_LIB)
5162endif
5163
5164SDK_VBoxOpenSsl := This is what you should be using! It links against VBoxRT.
5165SDK_VBoxOpenSsl_EXTENDS := VBoxOpenSslStatic
5166if "$(SDK_VBoxOpenSslStatic_INCS)" == "$(SDK_VBoxOpenSslStatic_VBOX_DEFAULT_INCS)"
5167 SDK_VBoxOpenSsl_LIBS = $(NO_SUCH_VARIABLE)
5168endif
5169
5170ifdef VBOX_WITH_LIBOGG
5171 SDK_VBoxLibOgg := libogg for dll linking.
5172 SDK_VBoxLibOgg_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libogg-1.3.5/include
5173 SDK_VBoxLibOgg_INCS ?= $(SDK_VBoxLibOgg_DEFAULT_INCS)
5174 SDK_VBoxLibOgg_LIBS ?= $(PATH_STAGE_LIB)/VBox-libogg$(VBOX_SUFF_LIB)
5175endif
5176
5177ifdef VBOX_WITH_LIBVORBIS
5178 SDK_VBoxLibVorbis := libvorbis for dll linking.
5179 SDK_VBoxLibVorbis_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libvorbis-1.3.7/include
5180 SDK_VBoxLibVorbis_INCS ?= $(SDK_VBoxLibVorbis_DEFAULT_INCS)
5181 SDK_VBoxLibVorbis_LIBS ?= $(PATH_STAGE_LIB)/VBox-libvorbis$(VBOX_SUFF_LIB)
5182endif
5183
5184# Our SoftFloat 3e variant.
5185SDK_VBoxSoftFloatR3Shared := SoftFloat 3 for dll linking.
5186SDK_VBoxSoftFloatR3Shared_DEFS := SOFTFLOAT_FAST_INT64
5187SDK_VBoxSoftFloatR3Shared_DEFS.amd64 := LITTLEENDIAN
5188SDK_VBoxSoftFloatR3Shared_DEFS.arm64 := LITTLEENDIAN
5189SDK_VBoxSoftFloatR3Shared_DEFS.x86 := LITTLEENDIAN
5190if1of ($(KBUILD_TARGET), win)
5191 SDK_VBoxSoftFloatR3Shared_DEFS += THREAD_LOCAL=__declspec(thread)
5192else
5193 SDK_VBoxSoftFloatR3Shared_DEFS += THREAD_LOCAL=__thread
5194endif
5195SDK_VBoxSoftFloatR3Shared_INCS = \
5196 $(PATH_ROOT)/src/libs/softfloat-3e/source/include
5197SDK_VBoxSoftFloatR3Shared_LIBS = \
5198 $(PATH_STAGE_LIB)/VBox-SoftFloat$(VBOX_SUFF_LIB)
5199
5200SDK_VBoxSoftFloatR0 := SoftFloat 3 for ring-0 linking.
5201SDK_VBoxSoftFloatR0_DEFS := SOFTFLOAT_FAST_INT64
5202SDK_VBoxSoftFloatR0_DEFS.amd64 := LITTLEENDIAN
5203SDK_VBoxSoftFloatR0_DEFS.arm64 := LITTLEENDIAN
5204SDK_VBoxSoftFloatR0_DEFS.x86 := LITTLEENDIAN
5205SDK_VBoxSoftFloatR0_INCS = \
5206 $(PATH_ROOT)/src/libs/softfloat-3e/source/include
5207SDK_VBoxSoftFloatR0_LIBS = \
5208 $(PATH_STAGE_LIB)/VBox-SoftFloatR0$(VBOX_SUFF_LIB)
5209
5210SDK_VBoxSoftFloatGuestR3Shared := SoftFloat 3 for ring-0 linking.
5211SDK_VBoxSoftFloatGuestR3Shared_DEFS := SOFTFLOAT_FAST_INT64
5212SDK_VBoxSoftFloatGuestR3Shared_DEFS.amd64 := LITTLEENDIAN
5213SDK_VBoxSoftFloatGuestR3Shared_DEFS.arm64 := LITTLEENDIAN
5214SDK_VBoxSoftFloatGuestR3Shared_DEFS.x86 := LITTLEENDIAN
5215SDK_VBoxSoftFloatGuestR3Shared_INCS = \
5216 $(PATH_ROOT)/src/libs/softfloat-3e/source/include
5217SDK_VBoxSoftFloatGuestR3Shared_LIBS.x86 = \
5218 $(VBOX_PATH_ADDITIONS_LIB)/VBox-SoftFloatGuestR3Shared-x86$(VBOX_SUFF_LIB)
5219SDK_VBoxSoftFloatGuestR3Shared_LIBS.$(KBUILD_TARGET_ARCH) = \
5220 $(VBOX_PATH_ADDITIONS_LIB)/VBox-SoftFloatGuestR3Shared$(VBOX_SUFF_LIB)
5221
5222ifdef VBOX_WITH_LIBSSH
5223 SDK_VBoxLibSsh := libssh for dynamic dll loading with assembly stubs.
5224 SDK_VBoxLibSsh_INCS ?= $(PATH_ROOT)/src/libs/libssh-0.10.6/include
5225 # SDK_VBoxLibSsh_LIBS is not defined, as VBoxLibSsh dll is not linked, but loaded explicitly
5226 # by auto-generated stub code (lazy loading)
5227endif
5228
5229ifdef VBOX_WITH_LIBTPMS
5230 SDK_VBoxLibTpms := libtpms for dll linking.
5231 SDK_VBoxLibTpms_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libtpms-0.9.6/include
5232 SDK_VBoxLibTpms_INCS ?= $(SDK_VBoxLibTpms_DEFAULT_INCS)
5233 SDK_VBoxLibTpms_LIBS ?= $(PATH_STAGE_LIB)/VBox-libtpms$(VBOX_SUFF_LIB)
5234endif
5235
5236ifdef VBOX_WITH_LIBVPX
5237 SDK_VBoxLibVpx := libvpx for dll linking.
5238 SDK_VBoxLibVpx_DEFAULT_INCS := $(PATH_ROOT)/src/libs/libvpx-1.14.1
5239 SDK_VBoxLibVpx_INCS ?= $(SDK_VBoxLibVpx_DEFAULT_INCS)
5240 SDK_VBoxLibVpx_LIBS ?= $(PATH_STAGE_LIB)/VBox-libvpx$(VBOX_SUFF_LIB)
5241endif
5242
5243ifdef VBOX_WITH_LIBLZMA
5244 SDK_VBoxLibLzma := liblzma for dll linking.
5245 SDK_VBoxLibLzma_DEFAULT_INCS := $(PATH_ROOT)/src/libs/liblzma-5.4.1/api
5246 SDK_VBoxLibLzma_INCS ?= $(SDK_VBoxLibLzma_DEFAULT_INCS)
5247 SDK_VBoxLibLzma_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzma$(VBOX_SUFF_LIB)
5248
5249 SDK_VBoxLibLzma-x86 := liblzma/x86 compressor/decompressor for dll linking.
5250 SDK_VBoxLibLzma-x86_EXTENDS := VBoxLibLzma
5251 SDK_VBoxLibLzma-x86_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzma-x86$(VBOX_SUFF_LIB)
5252
5253 SDK_VBoxLibLzmaStatic := liblzma for static linking
5254 SDK_VBoxLibLzmaStatic_EXTENDS := VBoxLibLzma
5255 SDK_VBoxLibLzmaStatic_LIBS ?= $(PATH_STAGE_LIB)/VBox-liblzma-static$(VBOX_SUFF_LIB)
5256endif
5257
5258# libxml2
5259SDK_VBoxLibXml2 := libxml2 for dll linking.
5260SDK_VBoxLibXml2_INCS ?= $(PATH_ROOT)/src/libs/libxml2-2.13.2/include
5261SDK_VBoxLibXml2_DEFS ?= _REENTRANT LIBXML_STATIC LIBXML_STATIC_FOR_DLL
5262SDK_VBoxLibXml2_DEFS.win ?= WIN32 _WINDOWS _MBCS HAVE_WIN32_THREADS HAVE_COMPILER_TLS
5263# Note: no linking to LIB here, we do that explicitly in src/VBox/Runtime/Makefile.kmk to link
5264# libxml against VBoxRT
5265
5266# zlib
5267SDK_VBoxZlib := zlib for dll linking.
5268if1of ($(KBUILD_TARGET), os2 solaris win)
5269 SDK_VBoxZlib_INCS ?= $(PATH_ROOT)/src/libs/zlib-1.2.13
5270 SDK_VBoxZlib_LATE_LIBS ?= $(PATH_STAGE_LIB)/VBox-zlib$(VBOX_SUFF_LIB)
5271else
5272 SDK_VBoxZlib_INCS ?=
5273 SDK_VBoxZlib_LATE_LIBS ?= z
5274 SDK_VBoxZlib_DEFS.linux ?= _LARGEFILE64_SOURCE
5275endif
5276
5277SDK_VBoxZlib-x86 := zlib/x86
5278SDK_VBoxZlib-x86_EXTENDS = VBoxZlib
5279if1of ($(KBUILD_TARGET), os2 solaris win)
5280 SDK_VBoxZlib-x86_LIBS ?= $(PATH_STAGE_LIB)/VBox-zlib-x86$(VBOX_SUFF_LIB)
5281endif
5282
5283SDK_VBoxZlibStatic := zlib for static linking
5284SDK_VBoxZlibStatic_EXTENDS := VBoxZlib
5285if1of ($(KBUILD_TARGET), os2 win) # Not required on solaris.
5286 SDK_VBoxZlibStatic_LATE_LIBS ?= $(PATH_STAGE_LIB)/VBox-zlib-static$(VBOX_SUFF_LIB)
5287endif
5288
5289#
5290# Special SDK for the problematic NTDLL.LIB.
5291#
5292SDK_VBoxNtDll := Mini NTDLL import library, required by IPRT.
5293SDK_VBoxNtDll_LIBS.x86 ?= $(PATH_STAGE_LIB)/RuntimeR3NtDll-x86.lib
5294SDK_VBoxNtDll_LIBS.amd64 ?= $(PATH_STAGE_LIB)/RuntimeR3NtDll-amd64.lib
5295SDK_VBoxNtDll_LIBS.arm64 ?= $(PATH_STAGE_LIB)/RuntimeR3NtDll-arm64.lib
5296
5297#
5298# SDK for including newdev.lib.
5299# It conceptually moved from the WDK to the PSDK with W10, as it's now in the um subdir.
5300#
5301SDK_VBoxWinNewDevLib := Abstracts where to find newdev.lib.
5302ifn1of ($(VBOX_WINPSDK), WINPSDK71 WINPSDK80)
5303 SDK_VBoxWinNewDevLib_LIBS.x86 = $(PATH_SDK_$(VBOX_WINPSDK)_LIB.x86)/newdev.lib
5304 SDK_VBoxWinNewDevLib_LIBS.amd64 = $(PATH_SDK_$(VBOX_WINPSDK)_LIB.amd64)/newdev.lib
5305 SDK_VBoxWinNewDevLib_LIBS.arm64 = $(PATH_SDK_$(VBOX_WINPSDK)_LIB.arm64)/newdev.lib
5306else
5307 SDK_VBoxWinNewDevLib_LIBS.x86 = $(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/newdev.lib
5308 SDK_VBoxWinNewDevLib_LIBS.amd64 = $(PATH_SDK_$(VBOX_WINDDK)_LIB.amd64)/newdev.lib
5309endif
5310
5311#
5312# Determine Solaris version.
5313#
5314ifeq ($(KBUILD_TARGET),solaris)
5315 VBOX_SOLARIS_VERSION := $(expr $(KBUILD_HOST_VERSION_MAJOR) * 100 + $(KBUILD_HOST_VERSION_MINOR))
5316 ifeq ($(VBOX_SOLARIS_VERSION),510)
5317 DEFS.solaris += RT_OS_SOLARIS_10
5318 # Solaris 10 does not include crossbow.
5319 VBOX_SOLARIS_10 = 1
5320 # We cannot compile additions on Solaris 10, due kernel interface deps
5321 VBOX_WITHOUT_ADDITIONS := 1
5322 VBOX_WITH_ADDITIONS =
5323 else ifeq ($(VBOX_SOLARIS_VERSION),511)
5324 # OSS audio support for Solaris
5325 VBOX_WITH_AUDIO_OSS := 1
5326 endif
5327
5328 # XPCOM namespace cleanup issue with Solaris GCC 4.5.2 and newer, see @bugref{5838}.
5329 if $(VBOX_GCC_VERSION_CXX) >= 40502
5330 VBOX_WITH_XPCOM_NAMESPACE_CLEANUP =
5331 endif
5332endif
5333
5334#
5335# VBoxTpG tool.
5336#
5337TOOL_VBoxTpG = The VirtualBox Tracepoint Generator
5338TOOL_VBoxTpG_DTRACE_DEPORD = $(VBOX_VBOXTPG)
5339TOOL_VBoxTpG_DTRACE_HDR_FLAGS := \
5340 -h --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
5341define TOOL_VBoxTpG_DTRACE_HDR_CMDS
5342 $(QUIET)$(VBOX_VBOXTPG) $(if-expr $(intersects $(bld_trg_arch),$(KBUILD_ARCHES_64)),-64,-32) \
5343 $(flags) -o "$(out)" -s "$(source)"
5344endef
5345TOOL_VBoxTpG_DTRACE_OBJ_NOT_NEEDED :=
5346TOOL_VBoxTpG_DTRACE_OBJ_FLAGS := -G --host-$(VBOX_HC_ARCH_BITS)-bit #-vvv
5347define TOOL_VBoxTpG_DTRACE_OBJ_CMDS
5348 $(QUIET)$(VBOX_VBOXTPG) --assembler "$(TOOL_$(VBOX_ASTOOL)_AS)" \
5349 $(if-expr $(intersects $(bld_trg_arch),$(KBUILD_ARCHES_64)),-64,-32) \
5350 $(flags) \
5351 -o "$(out)" -s "$(source)"
5352endef
5353
5354
5355#
5356# VBoxTpG tool - Disabled, only generate the header.
5357#
5358TOOL_VBoxTpG-Disabled = The VirtualBox Tracepoint Generator, disabled.
5359TOOL_VBoxTpG-Disabled_DTRACE_DEPORD = $(VBOX_VBOXTPG)
5360TOOL_VBoxTpG-Disabled_DTRACE_HDR_FLAGS := -h
5361define TOOL_VBoxTpG-Disabled_DTRACE_HDR_CMDS
5362 $(QUIET)$(VBOX_VBOXTPG) $(flags) -o "$(out)" -s "$(source)"
5363endef
5364TOOL_VBoxTpG-Disabled_DTRACE_OBJ_NOT_NEEDED := $(KBUILD_OSES)
5365
5366
5367#
5368# dtrace+VBoxTpG tool for ring-3 to ring-0 pointer conversion.
5369#
5370TOOL_DTraceAndVBoxTpG = DTrace and the VirtualBox Tracepoint Generator working together on static ring-3 probes.
5371TOOL_DTraceAndVBoxTpG_EXTENDS = StandardDTrace
5372TOOL_DTraceAndVBoxTpG_DTRACE_DEPORD = $(VBOX_VBOXTPG)
5373TOOL_DTraceAndVBoxTpG_DTRACE_HDR_CMDS =
5374define TOOL_DTraceAndVBoxTpG_DTRACE_HDR_CMDS
5375 $(TOOL_StandardDTrace_DTRACE_HDR_CMDS)
5376 $(QUIET)$(VBOX_VBOXTPG) --generate-wrapper-header --host-$(VBOX_HC_ARCH_BITS)-bit --ring-3-context \
5377 $(filter-out -C, $(filter-out -h,$(flags))) \
5378 -o "$(out).tmp" -s "$(source)"
5379 $(APPEND) "$(out).tmp"
5380 $(SED) -e 's/\(#define.*\)(arg0/\1_ORIGINAL(arg0/' --append "$(out).tmp" "$(out)"
5381 $(MV) -f -- "$(out).tmp" "$(out)"
5382endef
5383TOOL_DTraceAndVBoxTpG_DTRACE_OBJ_NOT_NEEDED = $(TOOL_StandardDTrace_DTRACE_OBJ_NOT_NEEDED)
5384TOOL_DTraceAndVBoxTpG_DTRACE_OBJ_CMDS = $(TOOL_StandardDTrace_DTRACE_OBJ_CMDS)
5385
5386
5387ifdef VBOX_WITH_RAW_MODE
5388 #
5389 # Template for building RC things.
5390 #
5391 # Disabled Visual C++ warnings:
5392 # -wd4505: 'iemRaisePageFaultJmp' : unreferenced local function has been removed
5393 #
5394 TEMPLATE_VBoxRc = VBox Raw-Mode Context
5395 TEMPLATE_VBoxRc_ASTOOL := $(VBOX_ASTOOL32)
5396 TEMPLATE_VBoxRc_ASFLAGS = $(VBOX_ASFLAGS32)
5397 TEMPLATE_VBoxRc_DEFS = IN_RC IPRT_NO_CRT RT_WITH_NOCRT_ALIASES $(ARCH_BITS_DEFS)
5398 TEMPLATE_VBoxRc_INCS = $(PATH_ROOT)/include/iprt/nocrt
5399 TEMPLATE_VBoxRc_SYSSUFF = .rc
5400 TEMPLATE_VBoxRc_BLD_TRG_ARCH = x86
5401 TEMPLATE_VBoxRc_MODE = a+r,u+w
5402
5403 TEMPLATE_VBoxRc_USES += dtrace
5404 TEMPLATE_VBoxRc_DTRACE_HDR_FLAGS = --raw-mode-context
5405 TEMPLATE_VBoxRc_DTRACE_OBJ_FLAGS = --raw-mode-context --probe-fn-name "VMMRCProbeFire"
5406 ifdef VBOX_WITH_DTRACE_RC
5407 TEMPLATE_VBoxRc_DTRACETOOL = VBoxTpG
5408 TEMPLATE_VBoxRc_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_RC
5409 else
5410 TEMPLATE_VBoxRc_DTRACETOOL = VBoxTpG-Disabled
5411 endif
5412
5413 ifeq ($(VBOX_LDR_FMT32),pe)
5414 TEMPLATE_VBoxRc_TOOL = $(VBOX_VCC_TOOL_STEM)X86
5415 TEMPLATE_VBoxRc_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
5416 TEMPLATE_VBoxRc_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -GS- $(VBOX_VCC_WCHAR_T_VARIANT) -Gs8192 $(VBOX_VCC_GC_OPT) $(VBOX_VCC_GC_FP) \
5417 -Gy $(VBOX_VCC_WARN_ALL) -wd4505 $(VBOX_VCC_WERR)
5418 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
5419 TEMPLATE_VBoxRc_CXXFLAGS += -Gw
5420 endif
5421 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
5422 TEMPLATE_VBoxRc_CXXFLAGS += -Zc:inline
5423 endif
5424 ifdef VBOX_WITH_MSC_ANALYZE_THIS
5425 TEMPLATE_VBoxRc_CXXFLAGS += /analyze
5426 endif
5427 TEMPLATE_VBoxRc_CFLAGS = $(TEMPLATE_VBoxRc_CXXFLAGS)
5428 TEMPLATE_VBoxRc_LDFLAGS = -Ignore:4197 \
5429 -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Release -Debug -Opt:Ref -Opt:Icf \
5430 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5431 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5432 if defined(VBOX_SIGNING_MODE) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
5433 TEMPLATE_VBoxRc_LDFLAGS += -IntegrityCheck
5434 endif
5435 TEMPLATE_VBoxRc_LATE_LIBS += \
5436 $(PATH_STAGE_LIB)/RuntimeRCStub$(VBOX_SUFF_LIB)
5437 TEMPLATE_VBoxRc_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
5438 TEMPLATE_VBoxRc_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
5439 endif # pe
5440
5441 ifeq ($(VBOX_LDR_FMT32),elf)
5442 TEMPLATE_VBoxRc_TOOL = $(VBOX_GCC32_TOOL)
5443 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)
5444 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)
5445 if $(VBOX_GCC32_VERSION_CC) < 30400
5446 TEMPLATE_VBoxRc_DEFS += RT_WITHOUT_PRAGMA_ONCE
5447 endif
5448 ifeq ($(KBUILD_TARGET),solaris)
5449 TEMPLATE_VBoxRc_LDFLAGS = -r
5450 else
5451 TEMPLATE_VBoxRc_LDFLAGS = -nostdlib -Bsymbolic -g
5452 ## @todo WTF doesn't the globals work? Debug info is supposed to be split everywhere. GRR
5453 TEMPLATE_VBoxRc_LD_DEBUG = split
5454 endif
5455 ifn1of ($(KBUILD_TARGET), solaris freebsd)
5456 TEMPLATE_VBoxRc_LATE_LIBS = \
5457 $(VBOX_GCC32_LIBGCC) # intrinsics
5458 endif
5459 if1of ($(KBUILD_TARGET), linux)
5460 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)
5461 endif
5462 endif
5463
5464 ifeq ($(VBOX_LDR_FMT32),macho)
5465 TEMPLATE_VBoxRc_TOOL = $(VBOX_GCC_TOOL)
5466 TEMPLATE_VBoxRc_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
5467 TEMPLATE_VBoxRc_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
5468 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)
5469 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
5470 TEMPLATE_VBoxRc_LDFLAGS = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -m32 -nostdlib
5471 #TEMPLATE_VBoxRc_LDFLAGS.release = -Wl,-S ???
5472 endif
5473
5474 ifeq ($(VBOX_LDR_FMT32),lx)
5475 TEMPLATE_VBoxRc_TOOL = GXX3OMF
5476 if $(VBOX_GCC_VERSION_CC) < 30400
5477 TEMPLATE_VBoxRc_DEFS += RT_WITHOUT_PRAGMA_ONCE
5478 endif
5479 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
5480 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
5481 TEMPLATE_VBoxRc_LDFLAGS = -Zdll -nostdlib
5482 TEMPLATE_VBoxRc_LATE_LIBS = \
5483 $(VBOX_GCC32_LIBGCC) \
5484 $(VBOX_OBJ_SYS0) \
5485 end
5486 endif
5487
5488
5489 #
5490 # Template for building a RC ring-3 testcase (tstVMStructGC, tstDevStructGC).
5491 #
5492 TEMPLATE_VBoxRcExe = VBox Raw-Mode as ring-3 testcase
5493 TEMPLATE_VBoxRcExe_EXTENDS = VBoxRc
5494 TEMPLATE_VBoxRcExe_DEFS = $(filter-out IPRT_NO_CRT RT_WITH_NOCRT_ALIASES,$(TEMPLATE_VBoxRc_DEFS))
5495 TEMPLATE_VBoxRcExe_INCS = $(NO_SUCH_VARIABLE)
5496 TEMPLATE_VBoxRcExe_MODE = $(NO_SUCH_VARIABLE)
5497
5498 ifeq ($(VBOX_LDR_FMT32),pe)
5499 TEMPLATE_VBoxRcExe_LDFLAGS = -Ignore:4197 \
5500 -Incremental:NO -MapInfo:Exports -NoD -Debug -Opt:Ref -Opt:Icf \
5501 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5502 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5503 TEMPLATE_VBoxRcExe_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK)
5504 TEMPLATE_VBoxRcExe_LATE_LIBS = \
5505 $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/libcmt.lib \
5506 $(PATH_TOOL_$(VBOX_VCC_TOOL_STEM)X86_LIB)/oldnames.lib
5507 endif
5508
5509 ifeq ($(VBOX_LDR_FMT32),elf)
5510 TEMPLATE_VBoxRcExe_CFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CFLAGS)) -O0
5511 TEMPLATE_VBoxRcExe_CXXFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CXXFLAGS)) -O0
5512 TEMPLATE_VBoxRcExe_LDFLAGS = -g
5513 TEMPLATE_VBoxRcExe_LDFLAGS.dbgopt = -g
5514 TEMPLATE_VBoxRcExe_LDFLAGS.strict = -g
5515 TEMPLATE_VBoxRcExe_LDFLAGS.release = -g
5516 if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), freebsd.amd64)
5517 # The FreeBSD port of gcc isn't picking up -m32 where it should.
5518 TEMPLATE_VBoxRcExe_DEFS.$(KBUILD_TARGET) = $(TEMPLATE_VBoxRc_DEFS.$(KBUILD_TARGET)) IPRT_DONT_USE_SYSTEM_STDINT_H
5519 TEMPLATE_VBoxRcExe_LDFLAGS.$(KBUILD_TARGET) = /usr/lib32/crt1.o /usr/lib32/crti.o /usr/lib32/crtbegin.o $(TEMPLATE_VBoxRc_LDFLAGS.$(KBUILD_TARGET)) -nostdlib -v
5520 TEMPLATE_VBoxRcExe_LIBPATH.$(KBUILD_TARGET) = /usr/lib32
5521 TEMPLATE_VBoxRcExe_LATE_LIBS.$(KBUILD_TARGET) = /usr/lib32/crtend.o /usr/lib32/crtn.o /usr/lib32/libc.so
5522 endif
5523 endif
5524
5525 ifeq ($(VBOX_LDR_FMT32),macho)
5526 TEMPLATE_VBoxRcExe_CFLAGS = $(filter-out -static -nostdinc,$(TEMPLATE_VBoxRc_CFLAGS))
5527 TEMPLATE_VBoxRcExe_CXXFLAGS = $(filter-out -static -nostdinc,$(TEMPLATE_VBoxRc_CXXFLAGS))
5528 TEMPLATE_VBoxRcExe_LDFLAGS = -g -m32
5529 endif
5530
5531 ifeq ($(VBOX_LDR_FMT32),lx)
5532 TEMPLATE_VBoxRcExe_CFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CFLAGS))
5533 TEMPLATE_VBoxRcExe_CXXFLAGS = $(filter-out -nostdinc,$(TEMPLATE_VBoxRc_CXXFLAGS))
5534 TEMPLATE_VBoxRcExe_LDFLAGS = -g
5535 TEMPLATE_VBoxRcExe_LATE_LIBS = $(NO_SUCH_VARIABLE)
5536 endif
5537endif # VBOX_WITH_RAW_MODE
5538
5539
5540#
5541# Template for building R0 things.
5542#
5543# Disabled Visual C++ warnings:
5544# -wd4505: 'iemRaisePageFaultJmp' : unreferenced local function has been removed
5545#
5546TEMPLATE_VBoxR0 = VBox Ring 0
5547$(foreach arch,$(VBOX_TARGET_ARCHES)\
5548,$(eval TEMPLATE_VBoxR0_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
5549$(foreach arch,$(VBOX_TARGET_ARCHES)\
5550,$(eval TEMPLATE_VBoxR0_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
5551TEMPLATE_VBoxR0_DEFS = IN_RING0 IN_RING0_AGNOSTIC IPRT_NO_CRT RT_WITH_NOCRT_ALIASES $(ARCH_BITS_DEFS)
5552TEMPLATE_VBoxR0_INCS = $(PATH_ROOT)/include/iprt/nocrt
5553TEMPLATE_VBoxR0_SYSSUFF = .r0
5554TEMPLATE_VBoxR0_MODE = a+r,u+w
5555
5556TEMPLATE_VBoxR0_USES += dtrace
5557TEMPLATE_VBoxR0_DTRACE_HDR_FLAGS = --ring-0-context-agnostic
5558TEMPLATE_VBoxR0_DTRACE_OBJ_FLAGS = --ring-0-context-agnostic
5559ifdef VBOX_WITH_DTRACE_R0
5560 TEMPLATE_VBoxR0_DTRACETOOL = VBoxTpG
5561 TEMPLATE_VBoxR0_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0
5562else
5563 TEMPLATE_VBoxR0_DTRACETOOL = VBoxTpG-Disabled
5564endif
5565ifdef VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION
5566 TEMPLATE_VBoxR0_DEFS += RT_WITH_IBT_BRANCH_PROTECTION RT_WITH_IBT_BRANCH_PROTECTION_WITHOUT_NOTRACK
5567endif
5568
5569ifeq ($(VBOX_LDR_FMT),pe)
5570 TEMPLATE_VBoxR0_TOOL = $(VBOX_VCC_TOOL)
5571 TEMPLATE_VBoxR0_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
5572 TEMPLATE_VBoxR0_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -GS- $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_OPT) $(VBOX_VCC_FP) \
5573 -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_std) $(VBOX_VCC_WARN_ALL) -wd4505 $(VBOX_VCC_WERR)
5574 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
5575 TEMPLATE_VBoxR0_CXXFLAGS += -Gw
5576 endif
5577 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
5578 TEMPLATE_VBoxR0_CXXFLAGS += -Zc:inline
5579 endif
5580 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5581 TEMPLATE_VBoxR0_CXXFLAGS += /volatileMetadata-
5582 endif
5583 ifdef VBOX_WITH_MSC_ANALYZE_THIS
5584 TEMPLATE_VBoxR0_CXXFLAGS += /analyze
5585 endif
5586 TEMPLATE_VBoxR0_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxR0_CXXFLAGS))
5587 TEMPLATE_VBoxR0_LDFLAGS = -Ignore:4197 \
5588 -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) \
5589 -Release -Debug -Opt:Ref -Opt:Icf $(VBOX_VCC_LD_GUARD_CF) \
5590 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5591 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5592 ifdef VBOX_WITH_DTRACE_R0
5593 TEMPLATE_VBoxR0_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
5594 endif
5595 ifdef VBOX_SIGNING_MODE
5596 TEMPLATE_VBoxR0_LDFLAGS += -IntegrityCheck
5597 endif
5598 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5599 TEMPLATE_VBoxR0_LDFLAGS += -EmitVolatileMetadata:NO
5600 endif
5601 TEMPLATE_VBoxR0_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5602 TEMPLATE_VBoxR0_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5603 ifneq ($(VBOX_VCC_CC_GUARD_CF),)
5604 TEMPLATE_VBoxR0_LDFLAGS.win.amd64 += -Include:__security_init_cookie -Export:ModuleInitSecurityCookie=__security_init_cookie
5605 TEMPLATE_VBoxR0_LDFLAGS.win.x86 += -Include:___security_init_cookie -Export:ModuleInitSecurityCookie=__security_init_cookie
5606 TEMPLATE_VBoxR0_LDFLAGS.win.arm64 += -Include:__security_init_cookie -Export:ModuleInitSecurityCookie=__security_init_cookie
5607 endif
5608 TEMPLATE_VBoxR0_LATE_LIBS = \
5609 $(PATH_STAGE_LIB)/RuntimeR0Stub$(VBOX_SUFF_LIB)
5610 ifneq ($(VBOX_VCC_CC_GUARD_CF),)
5611 TEMPLATE_VBoxR0_LATE_LIBS.x86 += \
5612 $(PATH_SDK_$(VBOX_WINDDK)_LIB)/BufferOverflowK.lib
5613 TEMPLATE_VBoxR0_LATE_LIBS.amd64 += \
5614 $(PATH_SDK_$(VBOX_WINDDK)_LIB)/BufferOverflowK.lib
5615 TEMPLATE_VBoxR0_LATE_LIBS.arm64 += \
5616 $(PATH_SDK_$(VBOX_WINDDK)_LIB)/BufferOverflowFastFailK.lib
5617 include $(KBUILD_PATH)/sdks/$(VBOX_WINDDK).kmk ## TODO: Add a kBuild feature for loading SDKs.
5618 endif
5619 TEMPLATE_VBoxR0_ORDERDEPS = $(VBOX_SIGN_DRIVER_ORDERDEPS)
5620 TEMPLATE_VBoxR0_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
5621endif # pe
5622
5623ifeq ($(VBOX_LDR_FMT),elf)
5624 TEMPLATE_VBoxR0_TOOL = $(VBOX_GCC_TOOL)
5625 TEMPLATE_VBoxR0_CFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_C) \
5626 $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \
5627 $(VBOX_GCC_fno-stack-protector) -fno-common -ffreestanding $(VBOX_GCC_fvisibility-hidden) -std=gnu99 $(VBOX_GCC_IPRT_FMT_CHECK)
5628 TEMPLATE_VBoxR0_CXXFLAGS = -fno-pie -nostdinc -g $(VBOX_GCC_pipe) $(VBOX_GCC_WERR) $(VBOX_GCC_PEDANTIC_CXX) \
5629 $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-exceptions \
5630 $(VBOX_GCC_fno-stack-protector) -fno-common $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
5631 -fno-rtti $(VBOX_GCC_std) $(VBOX_GCC_IPRT_FMT_CHECK)
5632 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++.
5633 TEMPLATE_VBoxR0_CXXFLAGS += -ffreestanding
5634 endif
5635 TEMPLATE_VBoxR0_CFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables -ffreestanding
5636 TEMPLATE_VBoxR0_CXXFLAGS.amd64 = -m64 -mno-red-zone -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fasynchronous-unwind-tables
5637 TEMPLATE_VBoxR0_CXXFLAGS.freebsd = -ffreestanding
5638 if $(VBOX_GCC_VERSION_CC) < 30400
5639 TEMPLATE_VBoxR0_DEFS += RT_WITHOUT_PRAGMA_ONCE
5640 endif
5641 ifeq ($(KBUILD_TARGET),solaris)
5642 TEMPLATE_VBoxR0_LDFLAGS = -r
5643 TEMPLATE_VBoxR0_LDFLAGS.solaris = -u _init -u _info
5644 TEMPLATE_VBoxR0_LDFLAGS.solaris.amd64 = -m64
5645 TEMPLATE_VBoxR0_LDFLAGS.solaris.x86 = -m32
5646 TEMPLATE_VBoxR0_LATE_LIBS.solaris = \
5647 $(PATH_STAGE_LIB)/RuntimeR0Stub$(VBOX_SUFF_LIB)
5648 ifdef VBOX_GCC_USING_SOLARIS_AS
5649 TEMPLATE_VBoxR0_CFLAGS.amd64 += -Wa,-xmodel=kernel
5650 TEMPLATE_VBoxR0_CXXFLAGS.amd64 += -Wa,-xmodel=kernel
5651 endif
5652 # Solaris driver signing.
5653 TEMPLATE_VBoxR0_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
5654 else
5655 TEMPLATE_VBoxR0_LDFLAGS = -nostdlib -Bsymbolic -g
5656 ## @todo WTF doesn't the globals work? Debug info is supposed to be split everywhere. GRR
5657 TEMPLATE_VBoxR0_LD_DEBUG = split
5658 endif
5659 if "$(KBUILD_TARGET)" == "linux" && !defined(VBOX_WITH_KMOD_WRAPPED_R0_MODS)
5660 VBOX_WITH_VBOXR0_AS_DLL = 1
5661 TEMPLATE_VBoxR0_DLLSUFF = .r0
5662 TEMPLATE_VBoxR0_CFLAGS += -fPIC
5663 TEMPLATE_VBoxR0_CXXFLAGS += -fPIC
5664 TEMPLATE_VBoxR0_LDFLAGS +=
5665 TEMPLATE_VBoxR0_DTRACE_HDR_FLAGS += --pic
5666 TEMPLATE_VBoxR0_DTRACE_OBJ_FLAGS += --pic
5667 else
5668 TEMPLATE_VBoxR0_CFLAGS.amd64 += -mcmodel=kernel
5669 TEMPLATE_VBoxR0_CXXFLAGS.amd64 += -mcmodel=kernel
5670 endif
5671 ifdef VBOX_WITH_KMOD_WRAPPED_R0_MODS # For BTF/pahold issue we use -g1
5672 TEMPLATE_VBoxR0_DEFS += VBOX_WITH_KMOD_WRAPPED_R0_MODS
5673 TEMPLATE_VBoxR0_LDFLAGS.linux += $(PATH_ROOT)/src/VBox/HostDrivers/Support/linux/VBoxR0-wrapped.lds
5674 TEMPLATE_VBoxR0_LNK_DEPS.linux += $(PATH_ROOT)/src/VBox/HostDrivers/Support/linux/VBoxR0-wrapped.lds
5675 TEMPLATE_VBoxR0_CFLAGS.linux += -g1
5676 TEMPLATE_VBoxR0_CXXFLAGS.linux += -g1
5677 endif
5678 ifdef VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION
5679 TEMPLATE_VBoxR0_CFLAGS += $(VBOX_GCC_fcf-protection_branch) -fno-jump-tables
5680 TEMPLATE_VBoxR0_CXXFLAGS += $(VBOX_GCC_fcf-protection_branch) -fno-jump-tables
5681 TEMPLATE_VBoxR0_LDFLAGS += $(VBOX_GCC_fcf-protection_branch) $(VBOX_GCC_fcf-protection_check)
5682 ifeq ($(VBOX_GCC_fcf-protection_branch),)
5683 $(warning VBox: VBOX_WITH_R0_MOD_IBT_BRANCH_PROTECTION is set but gcc doesn't support branch protection)
5684 endif
5685 endif
5686 ifn1of ($(KBUILD_TARGET), solaris freebsd)
5687 TEMPLATE_VBoxR0_LATE_LIBS = \
5688 $(VBOX_GCC_LIBGCC) # intrinsics
5689 endif
5690 if1of ($(KBUILD_TARGET), linux)
5691 TEMPLATE_VBoxR0_POST_CMDS += $(NLTAB) \
5692 $(if $(eq $(tool_do),LINK_SYSMOD),if readelf -S $(out)|grep -q "[cd]tors"; then echo "Found ctors/dtors in $(out)!"; exit 1; fi)
5693 endif
5694endif # elf
5695
5696ifeq ($(VBOX_LDR_FMT),macho)
5697 TEMPLATE_VBoxR0_TOOL = $(VBOX_GCC_TOOL)
5698 TEMPLATE_VBoxR0_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
5699 TEMPLATE_VBoxR0_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
5700 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) \
5701 -fno-common -static -fno-rtti -fno-exceptions $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing \
5702 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_std)
5703 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
5704 TEMPLATE_VBoxR0_CXXFLAGS.x86 = -m32 -msoft-float -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
5705 TEMPLATE_VBoxR0_CXXFLAGS.arm64 = -m64 -target arm64e-apple-macos11.0 # Assembly fixup issues w/o the -target bit. Why?
5706 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) \
5707 -fno-common -static -fno-exceptions $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing \
5708 $(VBOX_GCC_fno-stack-protector)
5709 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
5710 TEMPLATE_VBoxR0_CFLAGS.x86 = -m32 -msoft-float -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
5711 TEMPLATE_VBoxR0_CFLAGS.arm64 = -m64 -target arm64e-apple-macos11.0
5712 TEMPLATE_VBoxR0_LDFLAGS = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -nostdlib
5713 TEMPLATE_VBoxR0_LDFLAGS.amd64 = -m64 -static
5714 TEMPLATE_VBoxR0_LDFLAGS.arm64 = -m64 -static
5715 TEMPLATE_VBoxR0_LDFLAGS.x86 = -m32
5716 TEMPLATE_VBoxR0_CXXFLAGS.amd64 += -mkernel
5717 TEMPLATE_VBoxR0_CFLAGS.amd64 += -mkernel
5718 TEMPLATE_VBoxR0_CXXFLAGS.arm64 += -mkernel
5719 TEMPLATE_VBoxR0_CFLAGS.arm64 += -mkernel
5720 TEMPLATE_VBoxR0_LDFLAGS += -Wl,-kext -mkernel
5721 TEMPLATE_VBoxR0_POST_CMDS = $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_VMM_MOD_FN,$(out),org.virtualbox.app.r0.$(target)))
5722endif
5723
5724ifeq ($(VBOX_LDR_FMT),lx)
5725 TEMPLATE_VBoxR0_TOOL = GXX3OMF
5726 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
5727 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
5728 if $(VBOX_GCC_VERSION_CC) < 30400
5729 TEMPLATE_VBoxR0_DEFS += RT_WITHOUT_PRAGMA_ONCE
5730 endif
5731 TEMPLATE_VBoxR0_LDFLAGS = -nostdlib -Zdll
5732 TEMPLATE_VBoxR0_LATE_LIBS = \
5733 $(VBOX_GCC_LIBGCC) \
5734 $(VBOX_OBJ_SYS0) \
5735 end
5736endif
5737
5738
5739#
5740# Template for building SUPDRV R0 things.
5741#
5742# Disabled Visual C++ warnings:
5743# -wd4996: deprecated / insecure.
5744# -wd4127: conditional expression is constant [level 4]
5745# -wd4201: nonstandard extension used : nameless struct/union [level 4]
5746# -wd4214: nonstandard extension used : bit field types other than int [level 4]
5747# -wd4706: assignment within conditional expression [level 4]
5748# -wd4324: '_TDI_PNP_CONTEXT_XP' : structure was padded due to __declspec(align())
5749#
5750# -wd4100: 'identifier' : unreferenced formal parameter [level 4] --- TODO: Enable this one!
5751#
5752TEMPLATE_VBoxR0Drv = VBox SUPDRV Ring 0
5753$(foreach arch,$(VBOX_TARGET_ARCHES)\
5754,$(eval TEMPLATE_VBoxR0Drv_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
5755$(foreach arch,$(VBOX_TARGET_ARCHES)\
5756,$(eval TEMPLATE_VBoxR0Drv_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
5757TEMPLATE_VBoxR0Drv_DEFS = IN_RING0 IN_RT_R0 $(ARCH_BITS_DEFS)
5758TEMPLATE_VBoxR0Drv_USES += dtrace
5759ifdef VBOX_WITH_DTRACE_R0DRV
5760 TEMPLATE_VBoxR0Drv_DTRACETOOL = VBoxTpG
5761 TEMPLATE_VBoxR0Drv_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0DRV
5762 ifdef VBOX_WITH_NATIVE_DTRACE
5763 TEMPLATE_VBoxR0Drv_DEFS += VBOX_WITH_NATIVE_DTRACE
5764 endif
5765else
5766 TEMPLATE_VBoxR0Drv_DTRACETOOL = VBoxTpG-Disabled
5767endif
5768
5769ifeq ($(KBUILD_TARGET),win)
5770 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_VCC_TOOL)
5771 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # for stddef.h ## @todo 8489: check if still needed
5772 TEMPLATE_VBoxR0Drv_SDKS = WINSDK10-UCRT-INCS
5773 endif
5774 TEMPLATE_VBoxR0Drv_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
5775 TEMPLATE_VBoxR0Drv_DEFS += _KERNEL_MODE=1 # Needed with W10 to access things like KeQueryInterruptTime
5776 TEMPLATE_VBoxR0Drv_DEFS.x86 = _X86_
5777 TEMPLATE_VBoxR0Drv_DEFS.x86 += NO_INTERLOCKED_INTRINSICS # Avoids intrisic VC/WDK trouble
5778 TEMPLATE_VBoxR0Drv_DEFS.x86 += WIN9X_COMPAT_SPINLOCK # Avoid multiply defined _KeInitializeSpinLock@4
5779 TEMPLATE_VBoxR0Drv_DEFS.amd64 = _AMD64_
5780 TEMPLATE_VBoxR0Drv_DEFS.amd64 += WIN9X_COMPAT_SPINLOCK # For Windows 8+ WDKs where it is no longer inlined but imported from ntoskrnl.
5781 TEMPLATE_VBoxR0Drv_DEFS.amd64 += NT_INLINE_IRQL NT_INLINE_GET_CURRENT_IRQL # Prevent W10 WDK from importing KeLowerIrql and KeGetCurrentIrql.
5782 TEMPLATE_VBoxR0Drv_DEFS.arm64 = _ARM64_
5783 TEMPLATE_VBoxR0Drv_DEFS.win = IPRT_NT_MAP_TO_ZW
5784 TEMPLATE_VBoxR0Drv_CXXFLAGS = -Zi -Zl -GR- -EHs- -GF -Gz -GS- $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_FP) -Gs4096 $(VBOX_VCC_OPT) \
5785 -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
5786 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
5787 TEMPLATE_VBoxR0Drv_CXXFLAGS += -Gw
5788 endif
5789 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
5790 TEMPLATE_VBoxR0Drv_CXXFLAGS += -Zc:inline
5791 endif
5792 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5793 TEMPLATE_VBoxR0Drv_CXXFLAGS += /volatileMetadata-
5794 endif
5795 ifdef VBOX_WITH_MSC_ANALYZE_THIS
5796 TEMPLATE_VBoxR0Drv_CXXFLAGS += /analyze
5797 endif
5798 TEMPLATE_VBoxR0Drv_CFLAGS = $(TEMPLATE_VBoxR0Drv_CXXFLAGS)
5799 TEMPLATE_VBoxR0Drv_LDFLAGS = -Ignore:4197 \
5800 -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD -Release -Debug -Opt:Ref -Opt:Icf \
5801 $(VBOX_VCC_LD_GUARD_CF) \
5802 -Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
5803 -Stub:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
5804 ifdef VBOX_WITH_DTRACE_R0DRV
5805 TEMPLATE_VBoxR0Drv_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
5806 endif
5807 ifdef VBOX_SIGNING_MODE
5808 TEMPLATE_VBoxR0Drv_LDFLAGS += -IntegrityCheck
5809 endif
5810 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
5811 TEMPLATE_VBoxR0Drv_LDFLAGS += -EmitVolatileMetadata:NO
5812 endif
5813 TEMPLATE_VBoxR0Drv_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5814 TEMPLATE_VBoxR0Drv_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
5815 TEMPLATE_VBoxR0Drv_ORDERDEPS = $(VBOX_SIGN_DRIVER_ORDERDEPS)
5816 TEMPLATE_VBoxR0Drv_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
5817endif
5818
5819ifeq ($(KBUILD_TARGET),linux)
5820 TEMPLATE_VBoxR0Drv_TOOL = $(NO_SUCH_VARIABLE)
5821
5822 ifndef KERN_DIR
5823 ifndef KERN_VER
5824 KERN_VER := $(patsubst /lib/modules/%/build/.config,%,$(firstword $(shell LC_ALL=C ls -t /lib/modules/*/build/.config 2>/dev/null)))
5825 endif
5826 ifeq ($(KERN_VER),)
5827 KERN_VER := $(shell uname -r)
5828 endif
5829 KERN_DIR := /lib/modules/$(KERN_VER)/build
5830 endif
5831
5832 ##
5833 ## Generates a rule for test-building a linux kernel module (use evalcall2 to invoke).
5834 ##
5835 ## Since Linux KBuild will not abort due to undefined symbols when building
5836 ## external modules we need to grep the error output ourselves. Since vboxdrv
5837 ## and vboxguest respectively provide symbols that other modules use, we use
5838 ## the rule target (tst*.run) to save those symbols so that KBuild can do its
5839 ## checking.
5840 ##
5841 ## @param 1 Module name.
5842 ## @param 2 The test build which symvers we need (empty if none)
5843 ## @param 3 Save symvers if non-empty.
5844 ##
5845 ## @note Using the extra expansion to replace $(1), $(2) and $(3) before eval,
5846 ## thus everything else needs escaped dollars.
5847 ##
5848 if defined(VBOX_WITH_TESTCASES) \
5849 && "$(KBUILD_HOST)" == "linux" \
5850 && "$(KBUILD_HOST_ARCH)" == "$(KBUILD_TARGET_ARCH)" \
5851 && !defined(VBOX_WITHOUT_LINUX_TEST_BUILDS) \
5852 && !defined(VBOX_ONLY_SDK) \
5853 && !defined(VBOX_ONLY_DOCS) \
5854 && !defined(VBOX_ONLY_VALIDATIONKIT)
5855 define VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN
5856 ifneq ($(KERN_DIR),)
5857 TESTING += $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5858 OTHERS += $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5859 OTHERS_CLEAN += $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5860 $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run: \
5861 $$(if $(2),$$(PATH_TARGET)/tst$(2)$(subst /,_,$(KERN_DIR))_mod.run,) \
5862 $$$$($(1)_2_STAGE_TARGETS)
5863 $(QUIET)$$(call MSG_L1,Doing a test build of the $(1) kernel module)
5864 $(QUIET)$$(RM) -f -- "$$@"
5865 $(QUIET)$$(TEST) -n "$$($(1)_INST)"
5866 $(QUIET)$$(RM) -Rf -- "$$(PATH_TARGET)/tst$(1)_mod"
5867 $(QUIET)$$(MKDIR) -p -- "$$(PATH_TARGET)/tst$(1)_mod"
5868 $(QUIET)$$(CP) -R -- "$$(PATH_STAGE_BIN)/../$$($(1)_INST)" "$$(PATH_TARGET)/tst$(1)_mod/"
5869 + $(QUIET)make KBUILD_VERBOSE=$(KBUILD_VERBOSE) KERN_DIR=$(KERN_DIR) VBOX_KERN_QUIET=1 \
5870 VBOX_KBUILD_TYPE=$(KBUILD_TYPE) VBOX_KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH) \
5871 KBUILD_TYPE= KBUILD_TARGET= KBUILD_TARGET_ARCH= KBUILD_TARGET_CPU= KBUILD_HOST= KBUILD_HOST_ARCH= KBUILD_HOST_CPU= \
5872 BUILD_TYPE= BUILD_TARGET= BUILD_TARGET_ARCH= BUILD_TARGET_CPU= BUILD_PLATFORM= BUILD_PLATFORM_ARCH= BUILD_PLATFORM_CPU= \
5873 -C $$(PATH_TARGET)/tst$(1)_mod clean
5874 ifneq ($(2),)
5875 $(QUIET)$$(CP) -f -- "$$<" "$$(PATH_TARGET)/tst$(1)_mod/Module.symvers"
5876 endif
5877 + $(QUIET)$(REDIRECT_EXT) -d2=1 -w1 "$$(PATH_TARGET)/tst$(1)_mod/make.err" -- \
5878 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),) \
5879 VBOX_KBUILD_TYPE=$(KBUILD_TYPE) VBOX_KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH) \
5880 KBUILD_TYPE= KBUILD_TARGET= KBUILD_TARGET_ARCH= KBUILD_TARGET_CPU= KBUILD_HOST= KBUILD_HOST_ARCH= KBUILD_HOST_CPU= \
5881 BUILD_TYPE= BUILD_TARGET= BUILD_TARGET_ARCH= BUILD_TARGET_CPU= BUILD_PLATFORM= BUILD_PLATFORM_ARCH= BUILD_PLATFORM_CPU= \
5882 -C $$(PATH_TARGET)/tst$(1)_mod
5883 $(CAT) "$$(PATH_TARGET)/tst$(1)_mod/make.err"
5884 $(QUIET)! grep "^WARNING: .* undefined!$$$$" "$$(PATH_TARGET)/tst$(1)_mod/make.err"
5885 if1of ($(USERNAME), bird)
5886 - nm -u "$$(PATH_TARGET)/tst$(1)_mod/"*.ko | sort
5887 endif
5888 ifneq ($(3),)
5889 $(QUIET)$$(CP) -f -- "$$(PATH_TARGET)/tst$(1)_mod/Module.symvers" "$$@"
5890 else
5891 $(QUIET)$$(APPEND) -t "$$@" "done"
5892 endif
5893 $(QUIET)$$(RM) -Rf -- "$$(PATH_TARGET)/tst$(1)_mod"
5894 vbox-linux-kmod-test-builds: $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5895 $$(foreach src,$$(notdir $$(filter %.c,$$(subst =>,/,$$($(1)_SOURCES)))),$$(patsubst %.c,%.o,$$(src))): $$(PATH_TARGET)/tst$(1)$(subst /,_,$(KERN_DIR))_mod.run
5896 endif
5897 endef # VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN
5898 else
5899 VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN =
5900 endif
5901else
5902 VBOX_LINUX_KMOD_TEST_BUILD_RULE_FN =
5903endif # linux target
5904
5905ifeq ($(KBUILD_TARGET),os2)
5906 ifndef VBOX_USE_WATCOM_FOR_OS2
5907 TEMPLATE_VBoxR0Drv_TOOL = GXX3OMF
5908 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
5909 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
5910 TEMPLATE_VBoxR0Drv_LATE_LIBS = $(VBOX_GCC_LIBGCC)
5911 # wlink thinks physdevice doesn't need fixups and should have a stack - stupid!
5912 TEMPLATE_VBoxR0Drv_LDFLAGS = -Zlinker Option -Zlinker internalrelocs, -Zlinker togglerelocs
5913 else
5914 TEMPLATE_VBoxR0Drv_TOOL = OPENWATCOM
5915 TEMPLATE_VBoxR0Drv_CTOOL = OPENWATCOM
5916 TEMPLATE_VBoxR0Drv_CXXTOOL = OPENWATCOM
5917 TEMPLATE_VBoxR0Drv_LDTOOL = OPENWATCOM-WL
5918 TEMPLATE_VBoxR0Drv_ARTOOL = OPENWATCOM
5919 ## @todo see if we can eliminate this one...
5920 TEMPLATE_VBoxR0Drv_ASTOOL = NASM
5921 TEMPLATE_VBoxR0Drv_ASFLAGS = -fobj -DASM_FORMAT_OMF -D__NASM__ -w+orphan-labels #-g -F borland
5922 TEMPLATE_VBoxR0Drv_DEFS.os2 = #_OS2EMX_H
5923 TEMPLATE_VBoxR0Drv_INCS = \
5924 $(PATH_TOOL_OPENWATCOM)/h \
5925 $(PATH_TOOL_OPENWATCOM)/h/os2 \
5926 $(PATH_ROOT)/include \
5927 $(PATH_KLIBC_TRUNK)/libc/include # for os2ddk
5928 TEMPLATE_VBoxR0Drv_CFLAGS = -s -ze -w4 -hd -d1+ -nt=TEXT32 -nc=CODE -4 -of+
5929 TEMPLATE_VBoxR0Drv_CXXFLAGS = -s -ze -w4 -hd -d2t -nt=TEXT32 -nc=CODE -4 -of+
5930 TEMPLATE_VBoxR0Drv_LDFLAGS = \
5931 form os2 lx physdevice \
5932 option NODefaultlibs, internalrelocs, togglerelocs \
5933 debug dwarf all #option symfile
5934 # debug codeview all option symfile - wlink generates bad info, overwritten mod dir header.
5935 endif
5936endif
5937
5938ifeq ($(KBUILD_TARGET),darwin)
5939 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
5940 TEMPLATE_VBoxR0Drv_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
5941 TEMPLATE_VBoxR0Drv_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS) KERNEL KERNEL_PRIVATE DRIVER_PRIVATE APPLE NeXT
5942 if1of ($(VBOX_GCC_TOOL), GXX4MACHO GXX42MACHO)
5943 TEMPLATE_VBoxR0Drv_INCS += \
5944 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/PrivateHeaders \
5945 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/Headers
5946 ## @todo try use VBOX_GCC_PEDANTIC_CXX
5947 TEMPLATE_VBoxR0Drv_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) \
5948 -g $(VBOX_GCC_pipe) $(VBOX_GCC_WARN) -Wno-long-long $(VBOX_GCC_fdiagnostics-show-option) \
5949 -fno-common -nostdinc -fno-builtin -finline $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
5950 -fno-keep-inline-functions -fno-exceptions -msoft-float \
5951 -fapple-kext -fno-rtti -fcheck-new -force_cpusubtype_ALL \
5952 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fasm-blocks
5953 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = -m64 -mkernel -mno-red-zone -gdwarf-2
5954 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = -m32 -static
5955 TEMPLATE_VBoxR0Drv_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) \
5956 -g $(VBOX_GCC_pipe) $(VBOX_GCC_WARN) -Wno-long-long -fno-common -nostdinc -fno-builtin -finline \
5957 -fno-keep-inline-functions -fno-exceptions $(VBOX_GCC_fvisibility-hidden) -msoft-float \
5958 -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations \
5959 -Werror-implicit-function-declaration -force_cpusubtype_ALL \
5960 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fasm-blocks
5961 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -mkernel -mno-red-zone -gdwarf-2
5962 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -static
5963 TEMPLATE_VBoxR0Drv_LDFLAGS = $(filter-out $(VBOX_DARWIN_NO_COMPACT_LINKEDIT),$(VBOX_DARWIN_DEF_SDK_LDFLAGS)) \
5964 -nostdlib -Wl,-kext,-new_linker -Wl,-Y,1455 -keep_private_extern
5965 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m64
5966 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m32
5967 TEMPLATE_VBoxR0Drv_LATE_LIBS = kmodc++ kmod cc_kext cpp_kext $(VBOX_GCC_LIBGCC)
5968 else
5969 # Note xcode uses -fstrict-aliasing, we currently don't dare... We also add -mno-red-zone.
5970 TEMPLATE_VBoxR0Drv_INCS += \
5971 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/PrivateHeaders \
5972 $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/Headers
5973 ## @todo try use VBOX_GCC_PEDANTIC_CXX
5974 # -Wno-c++11-extensions -Wno-c99-extensions -Wno-extra-semi -Wno-zero-length-array
5975 TEMPLATE_VBoxR0Drv_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) -mkernel \
5976 -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) -Wno-long-long $(VBOX_GCC_fdiagnostics-show-option) \
5977 -Wno-c++11-extensions -Wno-c99-extensions -Wno-extra-semi -Wno-zero-length-array \
5978 -Wno-gnu-zero-variadic-macro-arguments -Wno-four-char-constants \
5979 -fno-common -nostdinc -fno-builtin $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
5980 -fno-exceptions -fapple-kext -fno-rtti -mkernel \
5981 -fmodules -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -Wnon-modular-include-in-framework-module \
5982 -Werror=non-modular-include-in-framework-module \
5983 $(VBOX_GCC_Wno-nullability-extension) $(VBOX_GCC_Wno-gnu-statement-expression) \
5984 $(VBOX_GCC_Wno-import-preprocessor-directive-pedantic) $(VBOX_GCC_Wno-c11-extensions) \
5985 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fasm-blocks -fno-strict-aliasing -stdlib=libc++
5986 # if1of ($(VBOX_GCC_TOOL), CLANGXXMACHO) ## @todo check if we can safely use $(VBOX_GCC_std) @bugref{9790}, good for noexcept.
5987 #TEMPLATE_VBoxR0Drv_CXXFLAGS += $(VBOX_GCC_std)
5988 # endif
5989 # also used by xcode 6.2: \
5990 # -Werror=return-type \
5991 # -Werror=deprecated-objc-isa-usage \
5992 # -Werror=objc-root-class \
5993 # -Wno-missing-field-initializers -Wno-missing-prototypes -Wunreachable-code \
5994 # -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wunused-function \
5995 # -Wno-unused-label -Wno-unused-parameter -Wunused-variable -Wunused-value -Wempty-body \
5996 # -Wconditional-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants \
5997 # -Wno-conversion -Wconstant-conversion -Wint-conversion -Wbool-conversion -Wenum-conversion \
5998 # -Wshorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -Wdeprecated-declarations -Winvalid-offsetof -Wno-sign-conversion
5999 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = -m64 -msoft-float -mno-red-zone
6000 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = -m32 -msoft-float
6001 TEMPLATE_VBoxR0Drv_CXXFLAGS.arm64 = -m64 -fno-sanitize=vptr -target arm64e-apple-macos11.0
6002 TEMPLATE_VBoxR0Drv_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -mkernel \
6003 -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) -Wno-long-long $(VBOX_GCC_fdiagnostics-show-option) \
6004 -fno-common -nostdinc -fno-builtin $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) \
6005 -fno-exceptions -fapple-kext -fno-rtti \
6006 -fmodules -fmodules-prune-interval=86400 -fmodules-prune-after=345600 -Wnon-modular-include-in-framework-module \
6007 -Werror=non-modular-include-in-framework-module $(VBOX_GCC_Wno-c11-extensions) \
6008 $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fasm-blocks -fno-strict-aliasing
6009 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -msoft-float -mno-red-zone
6010 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -msoft-float
6011 TEMPLATE_VBoxR0Drv_CFLAGS.arm64 = -m64 -fno-sanitize=vptr -target arm64e-apple-macos11.0
6012 if 1
6013 TEMPLATE_VBoxR0Drv_CFLAGS += $(VBOX_GCC_WERR)
6014 TEMPLATE_VBoxR0Drv_CXXFLAGS += $(VBOX_GCC_WERR)
6015 endif
6016 TEMPLATE_VBoxR0Drv_LDFLAGS = $(filter-out $(VBOX_DARWIN_NO_COMPACT_LINKEDIT),$(VBOX_DARWIN_DEF_SDK_LDFLAGS)) \
6017 -nostdlib -stdlib=libc++ -Wl,-kext -Wl,-keep_private_externs
6018 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m64
6019 TEMPLATE_VBoxR0Drv_LDFLAGS.arm64 = -m64
6020 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m32
6021 TEMPLATE_VBoxR0Drv_LATE_LIBS = kmodc++ kmod cc_kext
6022 endif
6023endif
6024
6025ifeq ($(KBUILD_TARGET),solaris)
6026 ## The Solaris /usr/platform/i86pc/include and /usr/include directories.
6027 VBOX_SOLARIS_SYS_INCS ?= /usr/platform/i86pc/include /usr/include
6028
6029 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6030 TEMPLATE_VBoxR0Drv_DEFS += _MACHDEP _KERNEL _STRICT_STDC
6031 if $(VBOX_GCC_VERSION_CC) < 30400
6032 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6033 endif
6034 TEMPLATE_VBoxR0Drv_INCS = $(VBOX_SOLARIS_SYS_INCS)
6035 TEMPLATE_VBoxR0Drv_LDFLAGS = -r -dy
6036 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = $(if $(eq $(KBUILD_HOST),solaris),-64,-m elf_x86_64)
6037 # Exclude -Wall because of solaris headers' pragma ident warnings that gcc refuses to supress.
6038 TEMPLATE_VBoxR0Drv_CFLAGS = -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
6039 -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_fdiagnostics-show-option) \
6040 -Wshadow -Wuninitialized -Wunused-function -Wunused-label -Wunused-value -Wunused-variable \
6041 -Wformat -Wimplicit-int -Wimplicit-function-declaration -Werror-implicit-function-declaration -Wparentheses \
6042 -O2 -fno-omit-frame-pointer -ffreestanding -nodefaultlibs -fno-strict-aliasing -fno-common -std=c99
6043 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
6044 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow $(VBOX_GCC_msave-args) \
6045 -mno-red-zone -mcmodel=kernel $(if-expr defined(VBOX_GCC_USING_SOLARIS_AS),-Wa$(COMMA)-xmodel=kernel,) \
6046 -fno-reorder-blocks -fno-asynchronous-unwind-tables -funit-at-a-time
6047 TEMPLATE_VBoxR0Drv_CXXFLAGS = -Wpointer-arith \
6048 -Wshadow -Wuninitialized -Wunused-function -Wunused-label -Wunused-value -Wunused-variable -Wformat \
6049 -O2 -nodefaultlibs -fno-omit-frame-pointer -fno-strict-aliasing -fno-common -fno-exceptions -fno-rtti
6050 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86)
6051 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64)
6052 TEMPLATE_VBoxR0Drv_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
6053endif # Solaris
6054
6055ifeq ($(KBUILD_TARGET),freebsd)
6056 # x86 FreeBSD (6.2 or something):
6057 # cc -O2 -fno-strict-aliasing -pipe -Werror -D_KERNEL -DKLD_MODULE \
6058 # -nostdinc -I- -I. -I@ -I@/contrib/altq -I@/../include -I/usr/include \
6059 # -finline-limit=8000 -fno-common -mno-align-long-strings -mpreferred-stack-boundary=2 \
6060 # -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -ffreestanding -Wall -Wredundant-decls -Wnested-externs \
6061 # -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -fformat-extensions \
6062 # -std=c99 -c ../my.c
6063 # ld -d -warn-common -r -d -o my.kld my.o
6064 # :> export_syms
6065 # awk -f /usr/src/sys/modules/my/../../conf/kmod_syms.awk my.kld export_syms | xargs -J% objcopy % my.kld
6066 # ld -Bsharable -d warn-commnon -o my.ko my.kld
6067 #
6068 # AMD64 FreeBSD (7.1):
6069 # cc -O2 -fno-strict-aliasing -pipe -D_KERNEL -DKLD_MODULE -std=c99 -nostdinc -I. -I@ -I@/contrib/altq \
6070 # -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-common \
6071 # -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx \
6072 # -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -ffreestanding \
6073 # -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign \
6074 # -fformat-extensions -c /usr/src/sys/modules/my/../../dev/my/if_my.c
6075 # ld -d -warn-common -r -d -o if_my.ko if_my.o
6076 # :> export_syms
6077 # awk -f /usr/src/sys/modules/my/../../conf/kmod_syms.awk if_my.ko export_syms | xargs -J% objcopy % if_my.ko
6078
6079 # Note: @ -> /usr/src/sys and machine -> /usr/src/sys/i386/include
6080
6081 ## The location of the FreeBSD kernel source.
6082 VBOX_FREEBSD_SRC ?= /usr/src/sys
6083 ## The FreeBSD /usr/include.
6084 VBOX_FREEBSD_SYS_INCS ?= /usr/include
6085
6086 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6087 TEMPLATE_VBoxR0Drv_LDTOOL = FreeBsdKModLd
6088 TEMPLATE_VBoxR0Drv_DEFS += _KERNEL KLD_MODULE
6089 if $(VBOX_GCC_VERSION_CC) < 30400
6090 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6091 endif
6092 TEMPLATE_VBoxR0Drv_INCS = \
6093 $(VBOX_FREEBSD_SRC) \
6094 $(VBOX_FREEBSD_SRC)/contrib/altq \
6095 $(VBOX_FREEBSD_SRC)/contrib/ck/include \
6096 $(VBOX_FREEBSD_SRC)/../include \
6097 $(VBOX_FREEBSD_SYS_INCS)
6098 # omitting: -Wcast-qual, -Wredundant-decls
6099 TEMPLATE_VBoxR0Drv_CFLAGS = \
6100 $(VBOX_GCC_WARN) -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) $(VBOX_GCC_fdiagnostics-show-option) \
6101 -Wstrict-prototypes -Wmissing-prototypes -Wstrict-prototypes \
6102 -Wimplicit-function-declaration -Werror-implicit-function-declaration \
6103 -O2 -ffreestanding -fno-strict-aliasing -fno-common \
6104 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6105 -nostdinc -std=c99
6106 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-align-long-strings -mno-mmx -mno-3dnow -mno-sse -mno-sse2
6107 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone -mfpmath=387 \
6108 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -Wundef
6109 TEMPLATE_VBoxR0Drv_CXXFLAGS = -fno-exceptions -fno-rtti \
6110 $(VBOX_GCC_WARN) -Wpointer-arith -Winline \
6111 -O2 -fno-strict-aliasing -fno-common \
6112 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6113 -nostdinc
6114 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86)
6115 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64)
6116 TEMPLATE_VBoxR0Drv_SYSSUFF = .ko
6117 TEMPLATE_VBoxR0Drv_LDFLAGS = -d --warn-common
6118 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m elf_i386_fbsd
6119 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m elf_x86_64_fbsd
6120
6121 TOOL_FreeBsdKModLd = FreeBSD kernel module linker.
6122 # See kBuild/tools/GCC3.kmk for docs.
6123 TOOL_FreeBsdKModLd_LINK_SYSMOD_OUTPUT_MAYBE = $(outbase).map
6124 TOOL_FreeBsdKModLd_LINK_SYSMOD_DEPEND = $(foreach lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib)))
6125 TOOL_FreeBsdKModLd_LINK_SYSMOD_DEPORD =
6126 ifeq ($(KBUILD_TARGET_ARCH),amd64)
6127 TOOL_FreeBsdKModLd_LINK_SYSMOD_OUTPUT =
6128 define TOOL_FreeBsdKModLd_LINK_SYSMOD_CMDS
6129 # Link intermediate .kld (a relocatable object).
6130 ld $(flags) -r -o $(out) $(objs) \
6131 $(foreach p,$(libpath), -L$(p))\
6132 $(foreach lib,$(libs), $(if $(findstring $(lib),$(subst /,x,$(lib))), -l$(patsubst lib%,%,$(basename $(lib))), $(lib)))
6133 # Strip non-exported symbols private and localize the exported ones.
6134 awk -f $(VBOX_FREEBSD_SRC)/conf/kmod_syms.awk $(out) $(if $(othersrc), $(othersrc),/dev/null) \
6135 | xargs -J% objcopy % $(out)
6136
6137 ## Strip debug info (comment out if debugging or something).
6138 objcopy --strip-debug $(out)
6139 endef
6140 else # x86
6141 TOOL_FreeBsdKModLd_LINK_SYSMOD_OUTPUT = $(outbase).kld
6142 define TOOL_FreeBsdKModLd_LINK_SYSMOD_CMDS
6143 # Link intermediate .kld (a relocatable object).
6144 ld $(flags) -r -o $(outbase).kld $(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 $(outbase).kld $(if $(othersrc), $(othersrc),/dev/null) \
6149 | xargs -J% objcopy % $(outbase).kld
6150
6151 # Link the final .ko (a shared object).
6152 ld $(flags) -Bshareable -o $(out) $(outbase).kld
6153 endef
6154 endif # x86
6155
6156endif # FreeBSD
6157
6158ifeq ($(KBUILD_TARGET),netbsd)
6159
6160 # The location of the NetBSD sources.
6161 VBOX_NETBSD_SRC ?= /usr/src
6162
6163 # NetBSD uses "i386" for 32-bit, "x86" for common 32- and 64-bit code.
6164 ifeq ($(KBUILD_TARGET_ARCH),amd64)
6165 VBOX_NETBSD_TARGET_ARCH = amd64
6166 else
6167 VBOX_NETBSD_TARGET_ARCH = i386
6168 endif
6169
6170 VBOX_NETBSD_TARGET_SRC = $(VBOX_NETBSD_SRC)/sys/arch/$(VBOX_NETBSD_TARGET_ARCH)
6171
6172 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6173 TEMPLATE_VBoxR0Drv_DEFS += _KERNEL _MODULE
6174 if $(VBOX_GCC_VERSION_CC) < 30400
6175 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6176 endif
6177 TEMPLATE_VBoxR0Drv_INCS = \
6178 $(VBOX_NETBSD_SRC)/sys \
6179 $(VBOX_NETBSD_SRC)/common/include \
6180 $(PATH_OBJ)/netbsd/include
6181
6182 TEMPLATE_VBoxR0Drv_CFLAGS = \
6183 $(VBOX_GCC_WARN) -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
6184 $(VBOX_GCC_fdiagnostics-show-option) \
6185 -Wstrict-prototypes -Wmissing-prototypes -Wstrict-prototypes \
6186 -Wimplicit-function-declaration -Werror-implicit-function-declaration \
6187 -O2 -ffreestanding -fno-strict-aliasing -fno-common -finline-limit=8000 \
6188 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6189 -nostdinc -std=c99 -msoft-float
6190 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-mmx -mno-sse -mno-avx \
6191 -mno-fp-ret-in-387
6192 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 --param inline-unit-growth=100 \
6193 --param large-function-growth=1000 -fno-omit-frame-pointer \
6194 -mcmodel=kernel -mno-red-zone -mno-sse -mno-mmx -mno-avx \
6195 -fno-asynchronous-unwind-tables -mno-fp-ret-in-387
6196 TEMPLATE_VBoxR0Drv_CXXFLAGS = -fno-exceptions -fno-rtti \
6197 $(VBOX_GCC_WARN) -Wpointer-arith -Winline \
6198 -O2 -fno-strict-aliasing -fno-common -finline-limit=8000 \
6199 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) \
6200 -nostdinc -msoft-float
6201 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86)
6202 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64)
6203 TEMPLATE_VBoxR0Drv_SYSSUFF = .kmod
6204 TEMPLATE_VBoxR0Drv_LDFLAGS = -d --warn-common
6205 TEMPLATE_VBoxR0Drv_LDFLAGS.x86 = -m elf_i386
6206 TEMPLATE_VBoxR0Drv_LDFLAGS.amd64 = -m elf_x86_64
6207
6208 # symlink kernel includes
6209 TEMPLATE_VBoxR0Drv_ORDERDEPS += \
6210 $(PATH_OBJ)/netbsd/include/$(VBOX_NETBSD_TARGET_ARCH) \
6211 $(PATH_OBJ)/netbsd/include/x86 \
6212 $(PATH_OBJ)/netbsd/include/machine
6213
6214 $$(PATH_OBJ)/netbsd/include/$(VBOX_NETBSD_TARGET_ARCH):
6215 $(QUIET)$(MKDIR) -p $(@D)
6216 $(QUIET)$(LN_SYMLINK) $(VBOX_NETBSD_TARGET_SRC)/include $@
6217
6218 $$(PATH_OBJ)/netbsd/include/x86:
6219 $(QUIET)$(MKDIR) -p $(@D)
6220 $(QUIET)$(LN_SYMLINK) $(VBOX_NETBSD_SRC)/sys/arch/x86/include $@
6221
6222 $$(PATH_OBJ)/netbsd/include/machine:
6223 $(QUIET)$(MKDIR) -p $(@D)
6224 $(QUIET)$(LN_SYMLINK) $(VBOX_NETBSD_TARGET_ARCH) $@
6225
6226endif # NetBSD
6227
6228ifeq ($(KBUILD_TARGET),haiku)
6229 ## The Haiku include directories
6230 VBOX_HAIKU_SYS_INCS ?= /boot/develop/headers/os/kernel /boot/develop/headers/os/drivers
6231
6232 TEMPLATE_VBoxR0Drv_TOOL = $(VBOX_GCC_TOOL)
6233 TEMPLATE_VBoxR0Drv_LDTOOL = $(VBOX_GCC_TOOL)
6234 TEMPLATE_VBoxR0Drv_DEFS = _KERNEL_MODE=1 _STRICT_STDC IN_RING0 IN_RT_R0
6235 if $(VBOX_GCC_VERSION_CC) < 30400
6236 TEMPLATE_VBoxR0Drv_DEFS += RT_WITHOUT_PRAGMA_ONCE
6237 endif
6238 TEMPLATE_VBoxR0Drv_INCS = $(VBOX_HAIKU_SYS_INCS)
6239 #TODO: sort this out
6240 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
6241 TEMPLATE_VBoxR0Drv_CFLAGS = -fno-PIC \
6242 $(VBOX_GCC_WARN) -Wstrict-prototypes $(VBOX_GCC_Wno-pointer-sign) -Wno-sign-compare \
6243 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_R0_OPT) $(VBOX_GCC_R0_FP) -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration
6244 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
6245 TEMPLATE_VBoxR0Drv_CFLAGS.x86 = -m32 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
6246 TEMPLATE_VBoxR0Drv_CFLAGS.amd64 = -m64 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow \
6247 -fno-reorder-blocks -ffreestanding -fno-asynchronous-unwind-tables -funit-at-a-time \
6248 -Wno-sign-compare
6249 TEMPLATE_VBoxR0Drv_CXXFLAGS = -fno-PIC -Wpointer-arith \
6250 -Wshadow -Wuninitialized -Wunused-function -Wunused-label -Wunused-value -Wunused-variable \
6251 -Wformat \
6252 -O2 -nodefaultlibs -fno-omit-frame-pointer -fno-strict-aliasing -fno-common -fno-exceptions -fno-rtti
6253 TEMPLATE_VBoxR0Drv_CXXFLAGS.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.x86) -fno-exceptions -fno-rtti
6254 TEMPLATE_VBoxR0Drv_CXXFLAGS.amd64 = $(TEMPLATE_VBoxR0Drv_CFLAGS.amd64) -fno-exceptions -fno-rtti
6255endif # Haiku
6256
6257ifdef VBOX_WITH_VBOXDRV
6258 ifndef TEMPLATE_VBoxR0Drv_TOOL
6259 $(warning Warning: VBox Build: Target $(KBUILD_HOST) is not officially supported!)
6260 endif
6261endif
6262
6263ifn1of ($(KBUILD_TARGET), darwin os2 win solaris freebsd)
6264 # This doesn't work if supdrv is natively loading VMMR0.r0 et al, but
6265 # fortunately it isn't really necessary.
6266 TEMPLATE_VBoxR0Drv_CFLAGS += -include $(PATH_ROOT)/include/VBox/SUPDrvMangling.h
6267 TEMPLATE_VBoxR0Drv_CXXFLAGS += -include $(PATH_ROOT)/include/VBox/SUPDrvMangling.h
6268 TEMPLATE_VBoxR0Drv_ASDEFS += RT_MANGLER_PREFIX=VBoxHost_
6269endif
6270
6271ifeq ($(KBUILD_TARGET),darwin)
6272 #
6273 # A variant of VBoxR0Drv that uses the 10.10 SDK.
6274 #
6275 TEMPLATE_VBoxR0DrvOSX10.10 = VBoxR0Drv variant using the 10.10 SDK
6276 TEMPLATE_VBoxR0DrvOSX10.10_EXTENDS = VBoxR0Drv
6277 TEMPLATE_VBoxR0DrvOSX10.10_SDKS = MACOSX1010
6278 TEMPLATE_VBoxR0DrvOSX10.10_INCS = $(filter-out $(VBOX_PATH_MACOSX_SDK)/%,$(TEMPLATE_VBoxR0Drv_INCS)) \
6279 $(PATH_SDK_MACOSX1010)/System/Library/Frameworks/Kernel.framework/PrivateHeaders \
6280 $(PATH_SDK_MACOSX1010)/System/Library/Frameworks/Kernel.framework/Headers
6281 TEMPLATE_VBoxR0DrvOSX10.10_DEFS = $(filter-out $(VBOX_DARWIN_DEF_SDK_DEFS),$(TEMPLATE_VBoxR0Drv_DEFS))
6282
6283endif
6284
6285#
6286# Template for building libraries used by ring-0 drivers.
6287#
6288TEMPLATE_VBoxR0DrvLib = VBox Ring 0 Driver Library
6289TEMPLATE_VBoxR0DrvLib_EXTENDS = VBoxR0Drv
6290TEMPLATE_VBoxR0DrvLib_INSTTYPE = stage
6291TEMPLATE_VBoxR0DrvLib_INSTTYPE.linux = stage
6292
6293#
6294# Template for installing INF and CAT files.
6295#
6296TEMPLATE_VBoxR0DrvInfCat = VBox SUPDRV Ring 0 - Install .sys, .cat, .inf
6297TEMPLATE_VBoxR0DrvInfCat_INST = $(INST_BIN)
6298TEMPLATE_VBoxR0DrvInfCat_MODE = a+r,u+w
6299TEMPLATE_VBoxR0DrvInfCat_IFFLAGS = --no-hard-link-files-when-possible
6300
6301
6302#
6303# Template for building R3 executables and static libraries which are linked into executables.
6304# Note! This is the base template for a whole lot of other ones, so be careful when changing it.
6305#
6306# Disabled Visual C++ warnings:
6307# -wd4065: switch statement contains 'default' but no 'case' labels
6308# -wd4244: 'conversion' conversion from 'type1' to 'type2', possible loss of data
6309# -wd4996: deprecated / insecure.
6310#
6311TEMPLATE_VBoxR3Exe = VBox Ring 3 Exe
6312$(foreach arch,$(VBOX_TARGET_ARCHES)\
6313,$(eval TEMPLATE_VBoxR3Exe_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
6314$(foreach arch,$(VBOX_TARGET_ARCHES)\
6315,$(eval TEMPLATE_VBoxR3Exe_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
6316TEMPLATE_VBoxR3Exe_DEFS = IN_RING3 $(VBOX_GC_ARCH_BITS_DEFS)
6317TEMPLATE_VBoxR3Exe_DEFS.x86 = HC_ARCH_BITS=32
6318TEMPLATE_VBoxR3Exe_DEFS.arm32 = HC_ARCH_BITS=32
6319TEMPLATE_VBoxR3Exe_DEFS.sparc32 = HC_ARCH_BITS=32
6320TEMPLATE_VBoxR3Exe_DEFS.amd64 = HC_ARCH_BITS=64
6321TEMPLATE_VBoxR3Exe_DEFS.arm64 = HC_ARCH_BITS=64
6322TEMPLATE_VBoxR3Exe_DEFS.sparc64 = HC_ARCH_BITS=64
6323TEMPLATE_VBoxR3Exe_DEFS.win = _CRT_SECURE_NO_DEPRECATE
6324TEMPLATE_VBoxR3Exe_USES = dtrace
6325if defined(VBOX_WITH_DTRACE_R3) && defined(VBOX_WITH_NATIVE_DTRACE)
6326 TEMPLATE_VBoxR3Exe_DTRACETOOL = DTraceAndVBoxTpG
6327 TEMPLATE_VBoxR3Exe_DTRACE_OBJ_FLAGS = -C
6328 TEMPLATE_VBoxR3Exe_DTRACE_HDR_FLAGS = -C
6329 TEMPLATE_VBoxR3Exe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3 VBOX_WITH_NATIVE_DTRACE
6330else
6331 TEMPLATE_VBoxR3Exe_DTRACE_HDR_FLAGS = --ring-3-context
6332 TEMPLATE_VBoxR3Exe_DTRACE_OBJ_FLAGS = --ring-3-context --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
6333 if defined(VBOX_WITH_DTRACE_R3)
6334 TEMPLATE_VBoxR3Exe_DTRACETOOL = VBoxTpG
6335 TEMPLATE_VBoxR3Exe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3
6336 else
6337 TEMPLATE_VBoxR3Exe_DTRACETOOL = VBoxTpG-Disabled
6338 endif
6339endif
6340TEMPLATE_VBoxR3Exe_LATE_LIBS.kprofile = $(LIB_KPROFILE)
6341ifeq ($(KBUILD_TARGET),win)
6342 # TEMPLATE_VBoxR3Exe_TOOL = $(VBOX_VCC_TOOL)
6343 TEMPLATE_VBoxR3Exe_TOOL.win.x86 = $(VBOX_VCC_TOOL_STEM)X86
6344 TEMPLATE_VBoxR3Exe_TOOL.win.amd64 = $(VBOX_VCC_TOOL_STEM)AMD64
6345 TEMPLATE_VBoxR3Exe_TOOL.win.arm64 = $(VBOX_VCC_TOOL_STEM)ARM64
6346 TEMPLATE_VBoxR3Exe_RCDEFS = VBOX_SVN_REV=$(VBOX_SVN_REV) VBOX_SVN_REV_MOD_5K=$(expr $(VBOX_SVN_REV) % 50000)
6347 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6348 TEMPLATE_VBoxR3Exe_SDKS = ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER) $(VBOX_WINPSDK)
6349 else
6350 TEMPLATE_VBoxR3Exe_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK)
6351 endif
6352 TEMPLATE_VBoxR3Exe_CXXFLAGS = -Zi -Zl -GR- -EHsc -GF -MD$(VBOX_VCC_CRT_TYPE) $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_OPT) $(VBOX_VCC_FP) \
6353 -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS) $(VBOX_VCC_std) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6354 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
6355 TEMPLATE_VBoxR3Exe_CXXFLAGS += -Gw
6356 endif
6357 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
6358 TEMPLATE_VBoxR3Exe_CXXFLAGS += -Zc:inline
6359 endif
6360 ifdef VBOX_WITH_MSC_ANALYZE_THIS
6361 TEMPLATE_VBoxR3Exe_CXXFLAGS += /analyze
6362 endif
6363 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
6364 TEMPLATE_VBoxR3Exe_CXXFLAGS += /volatileMetadata-
6365 endif
6366 TEMPLATE_VBoxR3Exe_CXXFLAGS.debug = -RTCsu
6367 TEMPLATE_VBoxR3Exe_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
6368 TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile = -Gh -GH
6369 TEMPLATE_VBoxR3Exe_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxR3Exe_CXXFLAGS))
6370 TEMPLATE_VBoxR3Exe_CFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6371 TEMPLATE_VBoxR3Exe_CFLAGS.dbgopt = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.dbgopt)
6372 TEMPLATE_VBoxR3Exe_CFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6373 TEMPLATE_VBoxR3Exe_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6374 TEMPLATE_VBoxR3Exe_PCHFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6375 TEMPLATE_VBoxR3Exe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.dbgopt)
6376 TEMPLATE_VBoxR3Exe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6377 TEMPLATE_VBoxR3Exe_LDFLAGS = -Ignore:4197 \
6378 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
6379 $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS) \
6380 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
6381 /STUB:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com \
6382 /DISALLOWLIB:libc.lib \
6383 /DISALLOWLIB:libcd.lib \
6384 /DISALLOWLIB:libcmt.lib \
6385 /DISALLOWLIB:libcmtd.lib \
6386 /DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE_N).lib \
6387 /DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE_N).lib
6388 ifdef VBOX_WITH_DTRACE_R3
6389 TEMPLATE_VBoxR3Exe_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
6390 endif
6391 if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
6392 TEMPLATE_VBoxR3Exe_LDFLAGS += -IntegrityCheck
6393 endif
6394 TEMPLATE_VBoxR3Exe_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
6395 TEMPLATE_VBoxR3Exe_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
6396 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
6397 TEMPLATE_VBoxR3Exe_LDFLAGS += -EmitVolatileMetadata:NO
6398 endif
6399
6400 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6401 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 = \
6402 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
6403 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6404 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6405 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
6406 TEMPLATE_VBoxR3Exe_LATE_LIBS.amd64 = \
6407 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
6408 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6409 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6410 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/oldnames.lib
6411 TEMPLATE_VBoxR3Exe_LATE_LIBS.arm64 = \
6412 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
6413 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6414 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6415 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.arm64)_LIB)/oldnames.lib
6416 ifeq ($(KBUILD_TYPE),asan)
6417 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 += \
6418 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic-i386.lib \
6419 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic_runtime_thunk-i386.lib
6420 TEMPLATE_VBoxR3Exe_LATE_LIBS.amd64 += \
6421 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic-x86_64.lib \
6422 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib
6423 endif
6424 else
6425 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 = \
6426 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6427 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6428 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
6429 TEMPLATE_VBoxR3Exe_LATE_LIBS.amd64 = \
6430 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
6431 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
6432 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.amd64)_LIB)/oldnames.lib
6433 endif
6434
6435 TEMPLATE_VBoxR3Exe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
6436 TEMPLATE_VBoxR3Exe_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
6437 if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
6438 TEMPLATE_VBoxR3Exe_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out)$$(NLTAB)$(TEMPLATE_VBoxR3Exe_POST_CMDS))
6439 TEMPLATE_VBoxR3Exe_LNK_DEPS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION))
6440 TEMPLATE_VBoxR3Exe_LDFLAGS.win.x86 = \
6441 -Include:_vcc100_kernel32_fakes_cpp \
6442 -Include:_vcc100_kernel32_fakes_asm
6443 TEMPLATE_VBoxR3Exe_LATE_LIBS.win.x86 = \
6444 $(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB)
6445 TEMPLATE_VBoxR3Exe_LATE_LIBS.x86 = \
6446 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib \
6447 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6448 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
6449 endif
6450
6451else # the gcc guys
6452 TEMPLATE_VBoxR3Exe_TOOL = $(VBOX_GCC_TOOL)
6453 if $(VBOX_GCC_VERSION_CC) < 30400
6454 TEMPLATE_VBoxR3Exe_DEFS += RT_WITHOUT_PRAGMA_ONCE
6455 endif
6456 TEMPLATE_VBoxR3Exe_CXXFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_OPT) \
6457 $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_std) $(VBOX_GCC_fvisibility-inlines-hidden) \
6458 $(VBOX_GCC_IPRT_FMT_CHECK) $(VBOX_GCC_SANITIZER_FLAGS)
6459 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
6460 TEMPLATE_VBoxR3Exe_CXXFLAGS += $(VBOX_GCC_WERR)
6461 endif
6462 TEMPLATE_VBoxR3Exe_CXXFLAGS.x86 = -m32
6463 TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64 = -m64
6464 TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc32 = -m32
6465 TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc64 = -m64
6466 TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile = -finstrument-functions
6467 TEMPLATE_VBoxR3Exe_CFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_OPT) \
6468 $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_IPRT_FMT_CHECK)
6469 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
6470 TEMPLATE_VBoxR3Exe_CFLAGS += $(VBOX_GCC_WERR)
6471 endif
6472 TEMPLATE_VBoxR3Exe_CFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.x86)
6473 TEMPLATE_VBoxR3Exe_CFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64)
6474 TEMPLATE_VBoxR3Exe_CFLAGS.sparc32 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc32)
6475 TEMPLATE_VBoxR3Exe_CFLAGS.sparc64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.sparc64)
6476 TEMPLATE_VBoxR3Exe_CFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6477 TEMPLATE_VBoxR3Exe_CFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6478 TEMPLATE_VBoxR3Exe_OBJCFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS)
6479 TEMPLATE_VBoxR3Exe_OBJCFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CFLAGS.x86)
6480 TEMPLATE_VBoxR3Exe_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CFLAGS.amd64)
6481 TEMPLATE_VBoxR3Exe_OBJCFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CFLAGS.debug)
6482 TEMPLATE_VBoxR3Exe_OBJCFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CFLAGS.kprofile)
6483 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6484 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.x86)
6485 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64)
6486 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6487 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6488 TEMPLATE_VBoxR3Exe_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6489 TEMPLATE_VBoxR3Exe_PCHFLAGS.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.x86)
6490 TEMPLATE_VBoxR3Exe_PCHFLAGS.amd64 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.amd64)
6491 TEMPLATE_VBoxR3Exe_PCHFLAGS.debug = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)
6492 TEMPLATE_VBoxR3Exe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile)
6493 TEMPLATE_VBoxR3Exe_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
6494 TEMPLATE_VBoxR3Exe_LDFLAGS.x86 = -m32
6495 TEMPLATE_VBoxR3Exe_LDFLAGS.amd64 = -m64
6496 TEMPLATE_VBoxR3Exe_LDFLAGS.sparc32 = -m32
6497 TEMPLATE_VBoxR3Exe_LDFLAGS.sparc64 = -m64
6498 TEMPLATE_VBoxR3Exe_LDFLAGS.linux = -Wl,-z,noexecstack,-z,relro $(VBOX_LD_as_needed)
6499 TEMPLATE_VBoxR3Exe_LDFLAGS.solaris = -Wl,-z,ignore # same as VBOX_LD_as_needed
6500
6501 ifeq ($(KBUILD_TARGET),linux)
6502 TEMPLATE_VBoxR3Exe_LATE_LIBS = pthread m rt dl
6503 else ifeq ($(KBUILD_TARGET),os2)
6504 TEMPLATE_VBoxR3Exe_TOOL = GXX3OMF
6505 TEMPLATE_VBoxR3Exe_LATE_LIBS = socket iconv
6506 else ifeq ($(KBUILD_TARGET),darwin)
6507 TEMPLATE_VBoxR3Exe_TOOL = $(VBOX_GCC_TOOL)
6508 TEMPLATE_VBoxR3Exe_LATE_LIBS =
6509 TEMPLATE_VBoxR3Exe_DEFS += LIBICONV_PLUG # Avoid 3rd party libiconv (from macports).
6510 TEMPLATE_VBoxR3Exe_SDKS.darwin = $(VBOX_DARWIN_DEF_SDK_SDKS)
6511 TEMPLATE_VBoxR3Exe_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_DEFS)
6512 TEMPLATE_VBoxR3Exe_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
6513 TEMPLATE_VBoxR3Exe_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
6514 TEMPLATE_VBoxR3Exe_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
6515 TEMPLATE_VBoxR3Exe_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
6516 TEMPLATE_VBoxR3Exe_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS)
6517 TEMPLATE_VBoxR3Exe_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -Wl,-headerpad_max_install_names
6518 TEMPLATE_VBoxR3Exe_LDFLAGS.darwin.x86 = -read_only_relocs suppress
6519 TEMPLATE_VBoxR3Exe_POST_CMDS.darwin = $(VBOX_SIGN_IMAGE_CMDS)
6520 ifdef VBOX_WITH_DTRACE_R3
6521 TEMPLATE_VBoxR3Exe_CXXFLAGS := $(filter-out -pedantic,$(TEMPLATE_VBoxR3Exe_CXXFLAGS)) -fdollars-in-identifiers # annoying gcc option precedence.
6522 endif
6523 else ifeq ($(KBUILD_TARGET),haiku)
6524 TEMPLATE_VBoxR3Exe_TOOL = GXX3
6525 TEMPLATE_VBoxR3Exe_POST_CMDS = $(VBOX_HAIKU_XRES_SETVER_CMDS)
6526 TEMPLATE_VBoxR3Exe_LATE_LIBS = network iconv stdc++ supc++
6527 TEMPLATE_VBoxR3Exe_LIBPATH += \
6528 /boot/common/lib
6529 # Haiku uses PIC by default...
6530 TEMPLATE_VBoxR3Exe_CFLAGS += -fno-pic
6531 TEMPLATE_VBoxR3Exe_CXXFLAGS += -fno-pic
6532 TEMPLATE_VBoxR3Exe_LDFLAGS += -fno-pic
6533 else if1of ($(KBUILD_TARGET), freebsd openbsd)
6534 TEMPLATE_VBoxR3Exe_TOOL = GXX3
6535 TEMPLATE_VBoxR3Exe_LATE_LIBS = pthread
6536 TEMPLATE_VBoxR3Exe_INCS += \
6537 /usr/include \
6538 /usr/X11R6/include \
6539 /usr/local/include
6540 TEMPLATE_VBoxR3Exe_LIBPATH += \
6541 /usr/lib \
6542 /usr/X11R6/lib \
6543 /usr/local/lib
6544 else ifeq ($(KBUILD_TARGET),netbsd)
6545 TEMPLATE_VBoxR3Exe_TOOL = GXX3
6546 TEMPLATE_VBoxR3Exe_LATE_LIBS = pthread
6547 TEMPLATE_VBoxR3Exe_INCS += \
6548 /usr/include \
6549 /usr/X11R7/include
6550 TEMPLATE_VBoxR3Exe_LIBPATH += \
6551 /usr/lib \
6552 /usr/X11R7/lib
6553 else ifeq ($(KBUILD_TARGET),solaris)
6554 TEMPLATE_VBoxR3Exe_TOOL = GXX3PLAIN
6555 TEMPLATE_VBoxR3Exe_DEFS += LIBICONV_PLUG _REENTRANT # Avoid the GNU libiconv, for now at least.
6556 if $(VBOX_GCC_VERSION_CC) < 30500
6557 TEMPLATE_VBoxR3Exe_CFLAGS += -std=gnu99
6558 endif
6559 TEMPLATE_VBoxR3Exe_LATE_LIBS = rt socket
6560 else
6561 $(warning Warning: VBOX Build: Target $(KBUILD_TARGET) is not officially supported!)
6562 TEMPLATE_VBoxR3Exe_CXXFLAGS.profile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.release)
6563 TEMPLATE_VBoxR3Exe_CXXFLAGS.kprofile = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.krelease)
6564 endif
6565 ifdef VBOX_WITH_RUNPATH
6566 TEMPLATE_VBoxR3Exe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
6567 else ifdef VBOX_WITH_RELATIVE_RUNPATH
6568 TEMPLATE_VBoxR3Exe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
6569 endif
6570 ifdef VBOX_WITH_ORIGIN
6571 TEMPLATE_VBoxR3Exe_LDFLAGS.linux += $(VBOX_GCC_ORIGIN_OPT)
6572 endif
6573endif
6574
6575
6576#
6577# Variant of VBoxR3Exe that is always signed on windows.
6578# This is used for executables that are normally hardened.
6579#
6580TEMPLATE_VBoxR3SignedExe = VBox Ring 3 Exe, signed on windows for VBoxSup.sys use.
6581TEMPLATE_VBoxR3SignedExe_EXTENDS = VBoxR3Exe
6582if "$(KBUILD_TARGET)" == "win" && "$(VBOX_SIGNING_MODE)" == "test"
6583 TEMPLATE_VBoxR3SignedExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(call VBOX_SIGN_IMAGE_FN,$(out),,2)
6584endif
6585
6586#
6587# Template for building R3 shared objects / DLLs - base template, don't use directly.
6588# This is mostly identical to the VBoxR3Exe template. (Avoid PIC if possible!)
6589#
6590## @todo Eliminate VBoxR3DllBase in favor of VBoxR3Dll.
6591TEMPLATE_VBoxR3DllBase = VBox Ring 3 SO/DLLs Base Template - do not use directly!
6592TEMPLATE_VBoxR3DllBase_EXTENDS = VBoxR3Exe
6593TEMPLATE_VBoxR3DllBase_DEFS.darwin = $(TEMPLATE_VBoxR3Exe_DEFS.darwin) PIC
6594TEMPLATE_VBoxR3DllBase_LDFLAGS.darwin = $(TEMPLATE_VBoxR3Exe_LDFLAGS.darwin) \
6595 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
6596 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
6597ifn1of ($(KBUILD_TARGET), darwin win os2)
6598 TEMPLATE_VBoxR3DllBase_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS) PIC
6599 TEMPLATE_VBoxR3DllBase_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) -fPIC
6600 TEMPLATE_VBoxR3DllBase_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) -fPIC
6601 TEMPLATE_VBoxR3DllBase_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) -fPIC
6602 TEMPLATE_VBoxR3DllBase_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) -fPIC
6603endif
6604
6605#
6606# Temporary: Renaming the template and warnings will be errors ("soon").
6607#
6608TEMPLATE_VBoxR3Dll = VBox ring-3 SO/DLLs, no warnings
6609TEMPLATE_VBoxR3Dll_EXTENDS += VBoxR3DllBase
6610TEMPLATE_VBoxR3Dll_EXTENDS_BY += appending
6611ifeq ($(KBUILD_TARGET),win)
6612 TEMPLATE_VBoxR3Dll_CFLAGS += $(VBOX_VCC_WERR)
6613 TEMPLATE_VBoxR3Dll_CXXFLAGS += $(VBOX_VCC_WERR)
6614 TEMPLATE_VBoxR3Dll_PCHFLAGS += $(VBOX_VCC_WERR)
6615 TEMPLATE_VBoxR3Dll_LDFLAGS += $(VBOX_VCC_LD_WERR)
6616else
6617 TEMPLATE_VBoxR3Dll_CFLAGS += $(VBOX_GCC_WERR)
6618 TEMPLATE_VBoxR3Dll_CXXFLAGS += $(VBOX_GCC_WERR)
6619 TEMPLATE_VBoxR3Dll_PCHFLAGS += $(VBOX_GCC_WERR)
6620endif
6621
6622# x86 edition of the above template for use on AMD64 targets.
6623TEMPLATE_VBoxR3Dll-x86 = 32-bit VBox ring-3 SO/DLLs, no warnings
6624TEMPLATE_VBoxR3Dll-x86_EXTENDS = VBoxR3Dll
6625TEMPLATE_VBoxR3Dll-x86_BLD_TRG_ARCH = x86
6626TEMPLATE_VBoxR3Dll-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxR3Dll_DEFS)) \
6627 HC_ARCH_BITS=32 ARCH_BITS=32
6628
6629
6630#
6631# Template for building performance critical stuff with warnings-as-errors.
6632#
6633TEMPLATE_VBoxR3DllNoPic = VBox ring-3 SO/DLLs without PIC, without warnings.
6634TEMPLATE_VBoxR3DllNoPic_EXTENDS = VBoxR3DllBase
6635if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), linux.x86 freebsd.x86)
6636 TEMPLATE_VBoxR3DllNoPic_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS)
6637 TEMPLATE_VBoxR3DllNoPic_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) $(VBOX_GCC_WERR)
6638 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_GCC_WERR)
6639 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_GCC_WERR)
6640 TEMPLATE_VBoxR3DllNoPic_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS)
6641else ifeq ($(KBUILD_TARGET),win)
6642 TEMPLATE_VBoxR3DllNoPic_CFLAGS = $(filter-out -W3 -wd%,$(TEMPLATE_VBoxR3DllBase_CFLAGS)) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6643 TEMPLATE_VBoxR3DllNoPic_CFLAGS.debug = $(filter-out -RTC%,$(TEMPLATE_VBoxR3DllBase_CFLAGS.debug))
6644 TEMPLATE_VBoxR3DllNoPic_CFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CFLAGS.release) -GS-
6645 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS = $(filter-out -W3 -wd%,$(TEMPLATE_VBoxR3DllBase_CXXFLAGS)) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6646 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS.debug = $(filter-out -RTC%,$(TEMPLATE_VBoxR3DllBase_CXXFLAGS.debug)) # RTCsu Prevents IEM opt.
6647 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS.release) -GS-
6648 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS = $(filter-out -W3 -wd%,$(TEMPLATE_VBoxR3DllBase_PCHFLAGS)) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
6649 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS.debug = $(filter-out -RTC%,$(TEMPLATE_VBoxR3DllBase_PCHFLAGS.debug)) # RTCsu Prevents IEM opt.
6650 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS.release = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS.release) -GS-
6651 TEMPLATE_VBoxR3DllNoPic_LDFLAGS = $(TEMPLATE_VBoxR3DllBase_LDFLAGS) $(VBOX_VCC_LD_WERR)
6652else
6653 TEMPLATE_VBoxR3DllNoPic_CFLAGS = $(TEMPLATE_VBoxR3DllBase_CFLAGS) $(VBOX_GCC_WERR)
6654 TEMPLATE_VBoxR3DllNoPic_CXXFLAGS = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS) $(VBOX_GCC_WERR)
6655 TEMPLATE_VBoxR3DllNoPic_PCHFLAGS = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS) $(VBOX_GCC_WERR)
6656endif
6657
6658# x86 edition of the above template for use on AMD64 targets.
6659TEMPLATE_VBoxR3DllNoPic-x86 = 32-bit VBox ring-3 SO/DLLs without PIC, without warnings.
6660TEMPLATE_VBoxR3DllNoPic-x86_EXTENDS = VBoxR3DllNoPic
6661TEMPLATE_VBoxR3DllNoPic-x86_BLD_TRG_ARCH = x86
6662TEMPLATE_VBoxR3DllNoPic-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxR3DllNoPic_DEFS)) \
6663 HC_ARCH_BITS=32 ARCH_BITS=32
6664
6665
6666#
6667# Template for building performance critical stuff without warnings-as-errors.
6668#
6669TEMPLATE_VBoxR3DllWarnNoPic = VBox ring-3 SO/DLLs without PIC, with warnings.
6670TEMPLATE_VBoxR3DllWarnNoPic_EXTENDS = VBoxR3DllBase
6671if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), linux.x86 freebsd.x86)
6672 TEMPLATE_VBoxR3DllWarnNoPic_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS)
6673 TEMPLATE_VBoxR3DllWarnNoPic_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS)
6674 TEMPLATE_VBoxR3DllWarnNoPic_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6675 TEMPLATE_VBoxR3DllWarnNoPic_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS)
6676 TEMPLATE_VBoxR3DllWarnNoPic_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS)
6677else ifeq ($(KBUILD_TARGET),win)
6678 TEMPLATE_VBoxR3DllWarnNoPic_CFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CFLAGS.release) -GS-
6679 TEMPLATE_VBoxR3DllWarnNoPic_CXXFLAGS.release = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS.release) -GS-
6680 TEMPLATE_VBoxR3DllWarnNoPic_PCHFLAGS.release = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS.release) -GS-
6681endif
6682
6683#
6684# Base template for building static R3 executables and any static
6685# libraries they link with. Do _not_ use directly!
6686#
6687## @todo Bake this into VBoxR3Static.
6688TEMPLATE_VBoxR3StaticBase = VBox Static Ring 3 EXE
6689TEMPLATE_VBoxR3StaticBase_EXTENDS = VBoxR3Exe
6690TEMPLATE_VBoxR3StaticBase_DEFS = IN_RT_STATIC IN_RT_R3 IN_SUP_STATIC $(TEMPLATE_VBoxR3Exe_DEFS)
6691ifdef VBOX_WITH_NOCRT_STATIC
6692 TEMPLATE_VBoxR3StaticBase_DEFS += IPRT_NO_CRT
6693 TEMPLATE_VBoxR3StaticBase_INCS = $(PATH_ROOT)/include/iprt/nocrt $(TEMPLATE_VBoxR3Exe_INCS)
6694endif
6695ifeq ($(KBUILD_TARGET),win)
6696 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6697 ifdef VBOX_WITH_NOCRT_STATIC
6698 TEMPLATE_VBoxR3StaticBase_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER),,$(TEMPLATE_VBoxR3Exe_SDKS))
6699 else
6700 TEMPLATE_VBoxR3StaticBase_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER), WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC,$(TEMPLATE_VBoxR3Exe_SDKS))
6701 endif
6702 endif
6703 ifdef VBOX_WITH_NOCRT_STATIC
6704 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE) -EHsc -GR, $(TEMPLATE_VBoxR3Exe_CFLAGS)) \
6705 -Zl -EHc-s- -Gy -GR-
6706 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE) -EHsc -GR, $(TEMPLATE_VBoxR3Exe_CXXFLAGS)) \
6707 -Zl -EHc-s- -Gy -GR-
6708 TEMPLATE_VBoxR3StaticBase_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE) -EHsc -GR, $(TEMPLATE_VBoxR3Exe_PCHFLAGS)) \
6709 -Zl -EHc-s- -Gy -GR-
6710 else
6711 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Exe_CFLAGS)) \
6712 -MT$(VBOX_VCC_CRT_TYPE) -Gy
6713 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Exe_CXXFLAGS)) \
6714 -MT$(VBOX_VCC_CRT_TYPE) -Gy
6715 TEMPLATE_VBoxR3StaticBase_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Exe_PCHFLAGS)) \
6716 -MT$(VBOX_VCC_CRT_TYPE) -Gy
6717 endif
6718
6719 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120" # Do not use SSE so valkit stuff can run on NT4 w/o needing a separate runtime library.
6720 TEMPLATE_VBoxR3StaticBase_CFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_CFLAGS.win.86) /arch:IA32
6721 TEMPLATE_VBoxR3StaticBase_CXXFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_CXXFLAGS.win.86) /arch:IA32
6722 TEMPLATE_VBoxR3StaticBase_PCHFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_PCHFLAGS.win.86) /arch:IA32
6723 TEMPLATE_VBoxR3StaticBase_CFLAGS += -Gw
6724 TEMPLATE_VBoxR3StaticBase_CXXFLAGS += -Gw
6725 TEMPLATE_VBoxR3StaticBase_PCHFLAGS += -Gw
6726 endif
6727
6728 ifdef VBOX_WITH_NOCRT_STATIC
6729 # .0000cfg normally merges into .idata, but the linker won't let us do so via /MERGE. Doesn't matter much,
6730 # because .idata can be writable when targeting x86 (NT 3.1 fun) and we don't want .0000cfg to be writable.
6731 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) /NODEFAULTLIB /Merge:.0000cfg=.rdata
6732 else
6733 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(filter-out /DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE).lib /DISALLOWLIB:libcpmt$(VBOX_VCC_CRT_TYPE).lib, $(TEMPLATE_VBoxR3Exe_LDFLAGS))
6734 endif
6735 TEMPLATE_VBoxR3StaticBase_LDFLAGS += \
6736 /DISALLOWLIB:msvcrt.lib \
6737 /DISALLOWLIB:msvcrtd.lib \
6738 /DISALLOWLIB:msvcprt.lib \
6739 /DISALLOWLIB:msvcprtd.lib \
6740 /DISALLOWLIB:vcruntime.lib \
6741 /DISALLOWLIB:vcruntimed.lib \
6742 /DISALLOWLIB:ucrt.lib \
6743 /DISALLOWLIB:ucrtd.lib
6744 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
6745 ifdef VBOX_WITH_NOCRT_STATIC
6746 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
6747 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
6748 else
6749 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = \
6750 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
6751 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6752 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6753 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/oldnames.lib
6754 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = \
6755 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
6756 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6757 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6758 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/oldnames.lib
6759 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.arm64 = \
6760 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
6761 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6762 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6763 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/oldnames.lib
6764 endif
6765 ifeq ($(KBUILD_TYPE),asan)
6766 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 += \
6767 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/clang_rt.asan-i386.lib \
6768 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/clang_rt.asan_cxx-i386.lib
6769 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 += \
6770 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/clang_rt.asan-x86_64.lib \
6771 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/clang_rt.asan_cxx-x86_64.lib
6772 endif
6773 else
6774 ifdef VBOX_WITH_NOCRT_STATIC
6775 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
6776 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
6777 else
6778 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.x86 = \
6779 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/oldnames.lib \
6780 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6781 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
6782 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.amd64 = \
6783 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6784 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6785 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.amd64)_LIB)/oldnames.lib
6786 TEMPLATE_VBoxR3StaticBase_LATE_LIBS.arm64 = \
6787 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
6788 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
6789 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticBase_TOOL.win.arm64)_LIB)/oldnames.lib
6790 endif
6791 endif
6792else
6793 ifdef VBOX_WITH_NOCRT_STATIC
6794 TEMPLATE_VBoxR3StaticBase_DEFS += RT_WITH_NOCRT_WRAPPERS
6795 endif
6796 ifn1of ($(KBUILD_TARGET), darwin linux solaris)
6797 # The gcc guys sans darwin, linux and solaris (don't depend on statically compiled system libs there)
6798 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) -static
6799 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) -static
6800 TEMPLATE_VBoxR3StaticBase_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) -static
6801 TEMPLATE_VBoxR3StaticBase_OBJCFLAGS = $(TEMPLATE_VBoxR3Exe_OBJCFLAGS) -static
6802 TEMPLATE_VBoxR3StaticBase_OBJCXXFLAGS = $(TEMPLATE_VBoxR3Exe_OBJCXXFLAGS) -static
6803 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) -static
6804 else ifeq ($(KBUILD_TARGET),solaris)
6805 TEMPLATE_VBoxR3StaticBase_LATE_LIBS = $(TEMPLATE_VBoxR3Exe_LATE_LIBS) nsl
6806 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)',$(TEMPLATE_VBoxR3Exe_LDFLAGS))
6807 else
6808 TEMPLATE_VBoxR3StaticBase_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)',$(TEMPLATE_VBoxR3Exe_LDFLAGS))
6809 endif
6810 ifn1of ($(KBUILD_TARGET), darwin os2) # ELF only. Present in gcc 3.2.3 & binutils 2.15, possibly earlier.
6811 ifdef VBOX_LD_gc_sections # Older solaris linker versions doesn't grok --gc-sections (e.g. add build box).
6812 ifndef TEMPLATE_VBoxR3StaticBase_CXXFLAGS
6813 TEMPLATE_VBoxR3StaticBase_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS)
6814 TEMPLATE_VBoxR3StaticBase_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS)
6815 endif
6816 TEMPLATE_VBoxR3StaticBase_CXXFLAGS += -ffunction-sections -fdata-sections
6817 TEMPLATE_VBoxR3StaticBase_CFLAGS += -ffunction-sections -fdata-sections
6818 TEMPLATE_VBoxR3StaticBase_LDFLAGS += $(VBOX_LD_gc_sections)
6819 endif
6820 endif
6821endif
6822
6823#
6824# Temporary: Renaming the template and warnings will be errors (soon).
6825# Unlike VBoxR3StaticBase, this is strict wrt warnings and includes IPRT.
6826#
6827TEMPLATE_VBoxR3Static = New name for VBoxR3StaticBase
6828TEMPLATE_VBoxR3Static_EXTENDS = VBoxR3StaticBase
6829TEMPLATE_VBoxR3Static_EXTENDS_BY = appending
6830TEMPLATE_VBoxR3Static_SDKS.$(KBUILD_TARGET_ARCH) += VBoxOpenSslStatic
6831TEMPLATE_VBoxR3Static_SDKS.win += VBoxNtDll
6832ifeq ($(KBUILD_TARGET),win)
6833 TEMPLATE_VBoxR3Static_CFLAGS += $(VBOX_VCC_WERR)
6834 TEMPLATE_VBoxR3Static_CXXFLAGS += $(VBOX_VCC_WERR)
6835 TEMPLATE_VBoxR3Static_PCHFLAGS += $(VBOX_VCC_WERR)
6836 TEMPLATE_VBoxR3Static_LDFLAGS += $(VBOX_VCC_LD_WERR)
6837else
6838 TEMPLATE_VBoxR3Static_CFLAGS += $(VBOX_GCC_WERR)
6839 TEMPLATE_VBoxR3Static_CXXFLAGS += $(VBOX_GCC_WERR)
6840 TEMPLATE_VBoxR3Static_PCHFLAGS += $(VBOX_GCC_WERR)
6841 TEMPLATE_VBoxR3Static_LDFLAGS.darwin.arm64 += $(TEMPLATE_VBoxR3StaticBase_LDFLAGS.darwin.arm64) -framework IOKit
6842endif
6843TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6844 $(VBOX_LIB_RUNTIME_STATIC)
6845ifneq ($(KBUILD_TARGET_ARCH),x86)
6846 TEMPLATE_VBoxR3Static_LATE_LIBS.x86 += \
6847 $(VBOX_LIB_RUNTIME_STATIC_X86)
6848endif
6849ifndef SDK_VBoxLibXml2_LIBS
6850 TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6851 $(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB)
6852endif
6853if1of ($(KBUILD_TARGET), os2 win)
6854 TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6855 $(SDK_VBoxLzfStatic_LIBS) \
6856 $(SDK_VBoxZlibStatic_LATE_LIBS) \
6857 $(SDK_VBoxLibLzmaStatic_LIBS)
6858else
6859 TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH) += \
6860 $(SDK_VBoxLzf_LIBS) \
6861 $(SDK_VBoxZlib_LATE_LIBS) \
6862 $(SDK_VBoxLibLzma_LIBS)
6863 if1of ($(KBUILD_TARGET), darwin freebsd)
6864 TEMPLATE_VBoxR3Static_LATE_LIBS += iconv
6865 else ifeq ($(KBUILD_TARGET),solaris)
6866 TEMPLATE_VBoxR3Static_LATE_LIBS += kstat
6867 endif
6868endif
6869
6870#
6871# A no-ASAN version of VBoxR3Static for things like that automatically executed tests.
6872#
6873TEMPLATE_VBoxR3StaticExeNoAsan = VBoxR3Static but w/o ASAN
6874TEMPLATE_VBoxR3StaticExeNoAsan_EXTENDS = VBoxR3Static
6875if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
6876 TEMPLATE_VBoxR3StaticExeNoAsan_CFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3Static_CFLAGS))
6877 TEMPLATE_VBoxR3StaticExeNoAsan_CXXFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3Static_CXXFLAGS))
6878 TEMPLATE_VBoxR3StaticExeNoAsan_PCHFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3Static_PCHFLAGS))
6879 TEMPLATE_VBoxR3StaticExeNoAsan_LDFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3Static_LDFLAGS)) -InferAsanLibs:No
6880 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)))
6881 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)))
6882endif
6883
6884#
6885# A DLL capable version of VBoxR3Static
6886#
6887## @todo make VBoxR3StaticDll work on non-windows.
6888TEMPLATE_VBoxR3StaticDll = VBox Static Ring-3 DLL
6889TEMPLATE_VBoxR3StaticDll_EXTENDS = VBoxR3Static
6890if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
6891 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)))
6892 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)))
6893endif
6894
6895#
6896# A no-ASAN version of VBoxR3StaticDll for the installer helper DLL.
6897#
6898# Note! Not compatible with BLD_TRG_ARCH overrides yet.
6899#
6900TEMPLATE_VBoxR3StaticDllNoAsan = VBoxR3StaticDll but w/o ASAN
6901TEMPLATE_VBoxR3StaticDllNoAsan_EXTENDS = VBoxR3StaticDll
6902if "$(KBUILD_TARGET)" == "win" && "$(KBUILD_TYPE)" == "asan"
6903 TEMPLATE_VBoxR3StaticDllNoAsan_CFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3StaticDll_CFLAGS))
6904 TEMPLATE_VBoxR3StaticDllNoAsan_CXXFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3StaticDll_CXXFLAGS))
6905 TEMPLATE_VBoxR3StaticDllNoAsan_PCHFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_FLAGS) , $(TEMPLATE_VBoxR3StaticDll_PCHFLAGS))
6906 TEMPLATE_VBoxR3StaticDllNoAsan_LDFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3StaticDll_LDFLAGS)) -InferAsanLibs:No
6907 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)))
6908 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)))
6909endif
6910
6911
6912#
6913# Non-pedantic variation of VBoxR3Static
6914#
6915TEMPLATE_VBoxR3StaticNonPedantic = VBox Static Ring-3 EXE, non-pedantic.
6916TEMPLATE_VBoxR3StaticNonPedantic_EXTENDS = VBoxR3Static
6917ifeq ($(KBUILD_TARGET),win)
6918 TEMPLATE_VBoxR3StaticNonPedantic_CFLAGS = $(TEMPLATE_VBoxR3Static_CFLAGS) $(VBOX_VCC_NON_PEDANTIC)
6919 TEMPLATE_VBoxR3StaticNonPedantic_CXXFLAGS = $(TEMPLATE_VBoxR3Static_CXXFLAGS) $(VBOX_VCC_NON_PEDANTIC)
6920 TEMPLATE_VBoxR3StaticNonPedantic_PCHFLAGS = $(TEMPLATE_VBoxR3Static_PCHFLAGS) $(VBOX_VCC_NON_PEDANTIC)
6921else # gcc:
6922 TEMPLATE_VBoxR3StaticNonPedantic_TOOL = $(VBOX_GCC_TOOL)
6923 TEMPLATE_VBoxR3StaticNonPedantic_CFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_C) ,$(TEMPLATE_VBoxR3Static_CFLAGS)) \
6924 $(VBOX_GCC_NON_PEDANTIC_CXX)
6925 TEMPLATE_VBoxR3StaticNonPedantic_CXXFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3Static_CXXFLAGS)) \
6926 $(VBOX_GCC_NON_PEDANTIC_CXX)
6927 TEMPLATE_VBoxR3StaticNonPedantic_PCHFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3Static_PCHFLAGS)) \
6928 $(VBOX_GCC_NON_PEDANTIC_CXX)
6929endif
6930
6931#
6932# VBoxR3Static w/o any CRT (windows only atm, experimental).
6933# Implies no fancy C++, no exceptions, no static constructors or destructors, ++.
6934#
6935# Note! Not compatible with BLD_TRG_ARCH overrides yet.
6936#
6937TEMPLATE_VBoxR3StaticNoCrt = Static
6938TEMPLATE_VBoxR3StaticNoCrt_EXTENDS = VBoxR3Static
6939TEMPLATE_VBoxR3StaticNoCrt_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC,WINSDK10-UCRT-INCS, $(TEMPLATE_VBoxR3Static_SDKS))
6940TEMPLATE_VBoxR3StaticNoCrt_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_VBoxR3Static_SDKS.$(KBUILD_TARGET_ARCH)))
6941TEMPLATE_VBoxR3StaticNoCrt_DEFS = $(TEMPLATE_VBoxR3Static_DEFS) \
6942 RT_NO_CRT \
6943 IN_RT_STATIC
6944ifndef VBOX_WITH_NOCRT_STATIC
6945 TEMPLATE_VBoxR3StaticNoCrt_DEFS.win = $(TEMPLATE_VBoxR3Static_DEFS.win) \
6946 RT_WITHOUT_NOCRT_WRAPPERS
6947endif
6948TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS = \
6949 $(PATH_STAGE_LIB)/RuntimeR3NoCrt$(VBOX_SUFF_LIB)
6950ifeq ($(KBUILD_TARGET),win)
6951 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
6952 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
6953 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.arm64 = $(NO_SUCH_VARIABLE)
6954 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.win = $(NO_SUCH_VARIABLE)
6955 ifdef VBOX_WITH_NOCRT_STATIC
6956 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.$(KBUILD_TARGET_ARCH) = \
6957 $(PATH_STAGE_LIB)/RuntimeR3NoCrt$(VBOX_SUFF_LIB)
6958 ifneq ($(KBUILD_TARGET_ARCH),x86)
6959 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.x86 = \
6960 $(PATH_STAGE_LIB)/RuntimeR3NoCrt-x86$(VBOX_SUFF_LIB) # place holder, we don't have this library
6961 endif
6962 else
6963 TEMPLATE_VBoxR3StaticNoCrt_LATE_LIBS.win.x86 = \
6964 $(PATH_TOOL_$(TEMPLATE_VBoxR3StaticNoCrt_TOOL.win.x86)_LIB)/chkstk.obj
6965 endif
6966 TEMPLATE_VBoxR3StaticNoCrt_LDFLAGS = $(filter-out $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3Static_LDFLAGS))
6967 TEMPLATE_VBoxR3StaticNoCrt_LDFLAGS.win.x86 = $(filter-out -Include%, $(TEMPLATE_VBoxR3Static_LDFLAGS.win.x86))
6968 TEMPLATE_VBoxR3StaticNoCrt_CFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Static_CFLAGS)) /GS- -EHs-
6969 TEMPLATE_VBoxR3StaticNoCrt_CXXFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Static_CXXFLAGS)) /GS- -EHs-
6970 TEMPLATE_VBoxR3StaticNoCrt_PCHFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Static_PCHFLAGS)) /GS- -EHs-
6971 TEMPLATE_VBoxR3StaticNoCrt_CXXFLAGS.debug = $(filter-out /RTC% -RTC%, $(TEMPLATE_VBoxR3Static_CXXFLAGS.debug))
6972else
6973 TEMPLATE_VBoxR3StaticNoCrt_CXXFLAGS = $(TEMPLATE_VBoxR3Static_CXXFLAGS) -fno-exceptions
6974 TEMPLATE_VBoxR3StaticNoCrt_PCHFLAGS = $(TEMPLATE_VBoxR3Static_PCHFLAGS) -fno-exceptions
6975endif
6976
6977
6978#
6979# Executable w/o CRT (windows only atm, experimental).
6980# Implies no fancy C++, no exceptions, no static constructors or destructors, ++.
6981#
6982TEMPLATE_VBoxR3StaticNoCrtExe := VBoxR3StaticNoCrt with EXE startup code calling a main() function
6983TEMPLATE_VBoxR3StaticNoCrtExe_EXTENDS := VBoxR3StaticNoCrt
6984TEMPLATE_VBoxR3StaticNoCrtExe_EXTENDS_BY := appending
6985TEMPLATE_VBoxR3StaticNoCrtExe_LDFLAGS.win := /entry:CustomMainEntrypoint /subsystem:console
6986
6987
6988#
6989# Template for building hardened Ring-3 executables.
6990# These shall have no extra runpaths, esp. not origin ones.
6991#
6992TEMPLATE_VBoxR3HardenedExe := Hardened VBox Ring-3 EXE
6993TEMPLATE_VBoxR3HardenedExe_EXTENDS := VBoxR3Exe
6994TEMPLATE_VBoxR3HardenedExe_DEBUG_INST.win = $(INST_DEBUG)hardened-exes/
6995TEMPLATE_VBoxR3HardenedExe_DEFS = $(TEMPLATE_VBoxR3Exe_DEFS) RTMEM_NO_WRAP_TO_EF_APIS
6996ifdef VBOX_WITH_HARDENING
6997 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS = $(VBOX_LIB_SUPHARDENED) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
6998else
6999 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS = $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7000endif
7001TEMPLATE_VBoxR3HardenedExe_LDFLAGS.darwin = $(TEMPLATE_VBoxR3Exe_LDFLAGS.darwin) -framework IOKit
7002ifeq ($(KBUILD_TARGET),linux)
7003 # not necessary except USE_LIB_PCAP is defined in SUPR3HardenedMain.cpp
7004 # TEMPLATE_VBoxR3HardenedExe_LATE_LIBS += cap
7005endif
7006ifeq ($(KBUILD_TARGET),win) # No CRT!
7007 TEMPLATE_VBoxR3HardenedExe_SDKS = VBoxNtDll $(TEMPLATE_VBoxR3Exe_SDKS)
7008 ifneq ($(VBOX_VCC_LD_GUARD_CF),)
7009 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CXXFLAGS))
7010 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)) #-O2 -Oy-
7011 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_PCHFLAGS))
7012 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_PCHFLAGS.debug)) #-O2 -Oy-
7013 TEMPLATE_VBoxR3HardenedExe_CFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CFLAGS))
7014 TEMPLATE_VBoxR3HardenedExe_CFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxR3Exe_CFLAGS.debug)) -O2 -Oy-
7015 else
7016 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CXXFLAGS)) -GS-
7017 TEMPLATE_VBoxR3HardenedExe_CXXFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CXXFLAGS.debug)) -GS- #-O2 -Oy-
7018 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_PCHFLAGS)) -GS-
7019 TEMPLATE_VBoxR3HardenedExe_PCHFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_PCHFLAGS.debug)) -GS- #-O2 -Oy-
7020 TEMPLATE_VBoxR3HardenedExe_CFLAGS = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CFLAGS)) -GS-
7021 TEMPLATE_VBoxR3HardenedExe_CFLAGS.debug = $(filter-out -RTC% -GZ $(VBOX_VCC_SANITIZER_FLAGS) -GS,$(TEMPLATE_VBoxR3Exe_CFLAGS.debug)) -GS- -O2 -Oy-
7022 endif
7023 TEMPLATE_VBoxR3HardenedExe_LDFLAGS = $(filter-out $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxR3Exe_LDFLAGS)) \
7024 /DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7025 /DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7026 /DISALLOWLIB:vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7027 /DISALLOWLIB:ucrt$(VBOX_VCC_CRT_TYPE).lib
7028 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.win.x86 = $(TEMPLATE_VBoxR3Exe_LDFLAGS.win.x86) /entry:suplibHardenedWindowsMain
7029 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.win.amd64 = $(TEMPLATE_VBoxR3Exe_LDFLAGS.win.amd64) /entry:suplibHardenedWindowsMain
7030 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.win.arm64 = $(TEMPLATE_VBoxR3Exe_LDFLAGS.win.arm64) /entry:suplibHardenedWindowsMain
7031 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS.x86 = $(NOT_SUCH_VARIABLE)
7032 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS.amd64 = $(NOT_SUCH_VARIABLE)
7033 TEMPLATE_VBoxR3HardenedExe_LATE_LIBS.arm64 = $(NOT_SUCH_VARIABLE)
7034 TEMPLATE_VBoxR3HardenedExe_USES.win = $(TEMPLATE_VBoxR3Exe_USES.win) vboximportchecker
7035 TEMPLATE_VBoxR3HardenedExe_VBOX_IMPORT_CHECKER.win = noimports
7036else ifn1of ($(KBUILD_TARGET), os2)
7037 ifneq ($(KBUILD_TYPE),asan) # Keep RPATH in asan builds so we can find libasan.so.X and libubsan.so.Y.
7038 TEMPLATE_VBoxR3HardenedExe_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%,$(TEMPLATE_VBoxR3Exe_LDFLAGS))
7039 TEMPLATE_VBoxR3HardenedExe_LDFLAGS.linux = $(filter-out $(VBOX_GCC_ORIGIN_OPT),$(TEMPLATE_VBoxR3Exe_LDFLAGS.linux))
7040 endif
7041endif
7042
7043#
7044# Template for building hardened Ring-3 libraries.
7045#
7046TEMPLATE_VBoxR3HardenedLib = Hardened VBox Ring-3 LIB
7047TEMPLATE_VBoxR3HardenedLib_EXTENDS = VBoxR3HardenedExe
7048TEMPLATE_VBoxR3HardenedLib_LATE_LIBS = $(NO_SUCH_VARIABLE)
7049TEMPLATE_VBoxR3HardenedLib_LIBS = $(NO_SUCH_VARIABLE)
7050TEMPLATE_VBoxR3HardenedLib_USES.win = $(NO_SUCH_VARIABLE)
7051TEMPLATE_VBoxR3HardenedLib_POST_CMDS = $(NO_SUCH_VARIABLE)
7052
7053#
7054# Template for building hardened Ring-3 testcase executables.
7055#
7056TEMPLATE_VBoxR3HardenedTstExe = VBox Ring-3 Hardened Testcase Exe (currently windows only!)
7057TEMPLATE_VBoxR3HardenedTstExe_EXTENDS = VBoxR3HardenedExe
7058TEMPLATE_VBoxR3HardenedTstExe_INST = $(INST_TESTCASE)
7059
7060#
7061# Template for building hardened Ring-3 testcase DLLs (pairs with VBoxR3HardenedTstExe).
7062#
7063TEMPLATE_VBoxR3HardenedTstDll = VBox Ring-3 Hardened Testcase Dll (currently windows only!)
7064TEMPLATE_VBoxR3HardenedTstDll_EXTENDS = VBoxR3TstDll
7065TEMPLATE_VBoxR3HardenedTstDll_INST = $(INST_TESTCASE)
7066TEMPLATE_VBoxR3HardenedTstDll_LDFLAGS.win = $(TEMPLATE_VBoxR3TstDll_LDFLAGS.win) \
7067 $(if-expr !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT),-IntegrityCheck,)
7068ifn1of ($(KBUILD_TARGET), win os2)
7069 TEMPLATE_VBoxR3HardenedTstDll_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%,$(TEMPLATE_VBoxR3TstDll_LDFLAGS))
7070 TEMPLATE_VBoxR3HardenedTstDll_LDFLAGS.linux = $(filter-out $(VBOX_GCC_ORIGIN_OPT),$(TEMPLATE_VBoxR3TstDll_LDFLAGS.linux))
7071endif
7072
7073#
7074# Template for building set-uid-to-root helper programs.
7075# In hardened builds, these may only contain absolute runpaths!
7076#
7077TEMPLATE_VBoxR3SetUidToRoot = Set-uid-to-root helper program.
7078if1of ($(KBUILD_TARGET), win)
7079 TEMPLATE_VBoxR3SetUidToRoot_EXTENDS = VBoxR3Exe
7080else
7081 TEMPLATE_VBoxR3SetUidToRoot_EXTENDS = VBoxR3HardenedExe
7082 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
7083endif
7084TEMPLATE_VBoxR3SetUidToRoot_LIBS = $(NO_SUCH_VARIABLE)
7085TEMPLATE_VBoxR3SetUidToRoot_LATE_LIBS = $(NO_SUCH_VARIABLE)
7086ifdef VBOX_WITH_RUNPATH
7087 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
7088endif
7089ifndef VBOX_WITH_HARDENING
7090 ifdef VBOX_WITH_RELATIVE_RUNPATH
7091 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
7092 endif
7093 ifdef VBOX_WITH_ORIGIN
7094 TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS.linux += $(VBOX_GCC_ORIGIN_OPT)
7095 endif
7096endif
7097
7098#
7099# Template for building R3 tools.
7100#
7101TEMPLATE_VBoxR3Tool = VBox Ring 3 Tools
7102TEMPLATE_VBoxR3Tool_EXTENDS = VBoxR3Exe
7103TEMPLATE_VBoxR3Tool_INST = $(VBOX_INST_TOOLS)
7104ifeq ($(KBUILD_TARGET),win)
7105 TEMPLATE_VBoxR3Tool_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) $(VBOX_VCC_WERR)
7106 TEMPLATE_VBoxR3Tool_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_VCC_WERR)
7107 TEMPLATE_VBoxR3Tool_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) $(VBOX_VCC_WERR)
7108 TEMPLATE_VBoxR3Tool_LDFLAGS = $(TEMPLATE_VBoxR3Exe_LDFLAGS) $(VBOX_VCC_LD_WERR)
7109else
7110 TEMPLATE_VBoxR3Tool_CFLAGS = $(TEMPLATE_VBoxR3Exe_CFLAGS) $(VBOX_GCC_WERR)
7111 TEMPLATE_VBoxR3Tool_CXXFLAGS = $(TEMPLATE_VBoxR3Exe_CXXFLAGS) $(VBOX_GCC_WERR)
7112 TEMPLATE_VBoxR3Tool_PCHFLAGS = $(TEMPLATE_VBoxR3Exe_PCHFLAGS) $(VBOX_GCC_WERR)
7113 ifdef VBOX_WITH_RUNPATH
7114 TEMPLATE_VBoxR3Tool_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7115 else ifdef VBOX_WITH_RELATIVE_RUNPATH
7116 TEMPLATE_VBoxR3Tool_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7117 endif
7118endif
7119TEMPLATE_VBoxR3Tool_LATE_LIBS = $(LIB_RUNTIME) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7120if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
7121 TEMPLATE_VBoxR3Tool_LATE_LIBS.x86 = \
7122 $(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB) \
7123 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
7124endif
7125
7126
7127#
7128# Ring-3 testcase, running automatically during the build.
7129# This is the VBoxR3Exe template only with a different install dir.
7130#
7131TEMPLATE_VBoxR3AutoTest = VBox Ring 3 Testcase Exe
7132TEMPLATE_VBoxR3AutoTest_EXTENDS := VBoxR3Static
7133TEMPLATE_VBoxR3AutoTest_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_$(TEMPLATE_VBoxR3AutoTest_EXTENDS)_SDKS.$(KBUILD_TARGET_ARCH)))
7134ifeq ($(KBUILD_TARGET),win)
7135 if "$(KBUILD_HOST_VERSION)" vlt "10.0.0.0.10240" # The windows ASAN requires windows 10 APIs to work.
7136 TEMPLATE_VBoxR3AutoTest_EXTENDS := VBoxR3StaticExeNoAsan
7137 endif
7138 ifdef VBOX_SIGNING_MODE
7139 TEMPLATE_VBoxR3AutoTest_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_$(TEMPLATE_VBoxR3AutoTest_EXTENDS)_LDFLAGS))
7140 TEMPLATE_VBoxR3AutoTest_POST_CMDS = $(NO_SUCH_VARIABLE)
7141 endif
7142endif
7143TEMPLATE_VBoxR3AutoTest_INST = $(INST_TESTCASE)
7144TEMPLATE_VBoxR3AutoTest_LATE_LIBS.$(KBUILD_TARGET_ARCH) = $(filter-out \
7145 $(if-expr !defined(SDK_VBoxLibXml2_LIBS),$(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB),) \
7146 $(if-expr "$(KBUILD_TARGET)" == "win" || "$(KBUILD_TARGET)" == "os2" \
7147 ,$(SDK_VBoxLzfStatic_LIBS) $(SDK_VBoxZlibStatic_LATE_LIBS) $(SDK_VBoxLibLzmaStatic_LIBS) \
7148 ,$(SDK_VBoxLzf_LIBS) $(SDK_VBoxZlib_LATE_LIBS) $(SDK_VBoxLibLzma_LIBS)) \
7149 ,$(TEMPLATE_$(TEMPLATE_VBoxR3AutoTest_EXTENDS)_LATE_LIBS.$(KBUILD_TARGET_ARCH)))
7150
7151#
7152# Ring-3 testcase.
7153# This is the VBoxR3Exe template only with a different install dir.
7154#
7155TEMPLATE_VBoxR3TstExe = VBox Ring 3 Testcase Exe
7156TEMPLATE_VBoxR3TstExe_EXTENDS = VBoxR3Exe
7157TEMPLATE_VBoxR3TstExe_LATE_LIBS = $(LIB_RUNTIME) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7158TEMPLATE_VBoxR3TstExe_INST = $(INST_TESTCASE)
7159ifdef VBOX_WITH_RUNPATH
7160 TEMPLATE_VBoxR3TstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7161else ifdef VBOX_WITH_RELATIVE_RUNPATH
7162 TEMPLATE_VBoxR3TstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxR3Exe_LDFLAGS)
7163endif
7164if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
7165 TEMPLATE_VBoxR3TstExe_POST_CMDS =
7166 TEMPLATE_VBoxR3TstExe_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBoxR3Exe_LDFLAGS))
7167endif
7168if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
7169 TEMPLATE_VBoxR3TstExe_POST_CMDS.win.x86 = $(if $(eq $(tool_do),LINK_LIBRARY),,$(VBOX_PE_SET_VERSION) $(out))
7170 TEMPLATE_VBoxR3TstExe_LATE_LIBS.x86 = \
7171 $(PATH_STAGE_LIB)/RuntimeR3VccTricks2$(VBOX_SUFF_LIB) \
7172 $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/oldnames.lib
7173endif
7174
7175# x86 version of VBoxR3TstExe
7176TEMPLATE_VBoxR3TstExe-x86 := 32-bit VBox Ring 3 Testcase Exe
7177TEMPLATE_VBoxR3TstExe-x86_EXTENDS := VBoxR3TstExe
7178TEMPLATE_VBoxR3TstExe-x86_BLD_TRG_ARCH := x86
7179TEMPLATE_VBoxR3TstExe-x86_LATE_LIBS = $(LIB_RUNTIME_X86) $(TEMPLATE_VBoxR3Exe_LATE_LIBS)
7180
7181#
7182# Variant of VBoxR3TstExe that always gets signed on windows.
7183# This is used for executables that are normally hardened.
7184#
7185TEMPLATE_VBoxR3SignedTstExe = VBox Ring 3 Test Exe, signed on windows for VBoxSup.sys use.
7186TEMPLATE_VBoxR3SignedTstExe_EXTENDS = VBoxR3TstExe
7187if "$(KBUILD_TARGET)" == "win" && "$(VBOX_SIGNING_MODE)" == "test"
7188 TEMPLATE_VBoxR3SignedTstExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(call VBOX_SIGN_IMAGE_FN,$(out),,2)
7189endif
7190
7191#
7192# Ring-3 testcase DLL.
7193#
7194TEMPLATE_VBoxR3TstDll = VBox Ring-3 Testcase Dll
7195TEMPLATE_VBoxR3TstDll_EXTENDS = VBoxR3TstExe
7196ifn1of ($(KBUILD_TARGET), darwin win os2)
7197 TEMPLATE_VBoxR3TstDll_DEFS = $(TEMPLATE_VBoxR3TstExe_DEFS) PIC
7198 TEMPLATE_VBoxR3TstDll_CFLAGS = $(TEMPLATE_VBoxR3TstExe_CFLAGS) -fPIC
7199 TEMPLATE_VBoxR3TstDll_CXXFLAGS = $(TEMPLATE_VBoxR3TstExe_CXXFLAGS) -fPIC
7200 TEMPLATE_VBoxR3TstDll_PCHFLAGS = $(TEMPLATE_VBoxR3TstExe_PCHFLAGS) -fPIC
7201 TEMPLATE_VBoxR3TstDll_LDFLAGS = $(TEMPLATE_VBoxR3TstExe_LDFLAGS) -fPIC
7202endif
7203
7204
7205#
7206# Template for building bad C/C++ style R3 shared libraries / Dlls (no -pedantic).
7207# (Same transformation as for VBoxR3ExeNonPedantic.)
7208#
7209TEMPLATE_VBoxR3DllNonPedantic = VBox ring-3 Non-pedantic, with warnings.
7210TEMPLATE_VBoxR3DllNonPedantic_EXTENDS = VBoxR3DllBase
7211ifeq ($(KBUILD_TARGET),win)
7212 TEMPLATE_VBoxR3DllNonPedantic_CFLAGS = $(TEMPLATE_VBoxR3DllBase_CFLAGS) $(VBOX_VCC_NON_PEDANTIC)
7213 TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS = $(TEMPLATE_VBoxR3DllBase_CXXFLAGS) $(VBOX_VCC_NON_PEDANTIC)
7214 TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS = $(TEMPLATE_VBoxR3DllBase_PCHFLAGS) $(VBOX_VCC_NON_PEDANTIC)
7215else # gcc:
7216 TEMPLATE_VBoxR3DllNonPedantic_TOOL = $(VBOX_GCC_TOOL)
7217 TEMPLATE_VBoxR3DllNonPedantic_CFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_C) ,$(TEMPLATE_VBoxR3DllBase_CFLAGS)) \
7218 $(VBOX_GCC_NON_PEDANTIC_C)
7219 TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3DllBase_CXXFLAGS)) \
7220 $(VBOX_GCC_NON_PEDANTIC_CXX)
7221 TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS = $(filter-out $(VBOX_GCC_WERR) $(VBOX_GCC_WARN_MASOCHISTIC) $(VBOX_GCC_PEDANTIC_CXX),$(TEMPLATE_VBoxR3DllBase_PCHFLAGS)) \
7222 $(VBOX_GCC_NON_PEDANTIC_CXX)
7223endif
7224
7225# x86 edition of the above template for use on AMD64 targets.
7226TEMPLATE_VBoxR3DllNonPedantic-x86 = 32-bit VBox ring-3 SO/DLLs, no warnings
7227TEMPLATE_VBoxR3DllNonPedantic-x86_EXTENDS = VBoxR3DllNonPedantic
7228TEMPLATE_VBoxR3DllNonPedantic-x86_BLD_TRG_ARCH = x86
7229TEMPLATE_VBoxR3DllNonPedantic-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxR3DllNonPedantic_DEFS)) \
7230 HC_ARCH_BITS=32 ARCH_BITS=32
7231
7232
7233#
7234# Same as VBoxR3DllNonPedantic, only it optimizes debug builds.
7235#
7236TEMPLATE_VBoxR3DllNonPedanticFast = VBox ring-3 Non-pedantic, with warnings, optimized debug.
7237TEMPLATE_VBoxR3DllNonPedanticFast_EXTENDS = VBoxR3DllNonPedantic
7238ifeq ($(KBUILD_TYPE),debug)
7239 ifeq ($(KBUILD_TARGET),win)
7240 TEMPLATE_VBoxR3DllNonPedanticFast_CFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS)) -O2 -Oy-
7241 TEMPLATE_VBoxR3DllNonPedanticFast_CFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS.debug))
7242 TEMPLATE_VBoxR3DllNonPedanticFast_CXXFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS)) -O2 -Oy-
7243 TEMPLATE_VBoxR3DllNonPedanticFast_CXXFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS.debug))
7244 TEMPLATE_VBoxR3DllNonPedanticFast_PCHFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS)) -O2 -Oy-
7245 TEMPLATE_VBoxR3DllNonPedanticFast_PCHFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS.debug))
7246 else
7247 TEMPLATE_VBoxR3DllNonPedanticFast_CFLAGS = $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS) -O2 -fno-omit-frame-pointer
7248 TEMPLATE_VBoxR3DllNonPedanticFast_CXXFLAGS = $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS) -O2 -fno-omit-frame-pointer
7249 TEMPLATE_VBoxR3DllNonPedanticFast_PCHFLAGS = $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS) -O2 -fno-omit-frame-pointer
7250 endif
7251endif
7252
7253
7254#
7255# Template for building libraries that are linked into VBoxRT.dll
7256# and it's variations, pedantic variation.
7257#
7258TEMPLATE_VBoxR3RuntimeDll = For libraries that are linked into VBoxRT.
7259TEMPLATE_VBoxR3RuntimeDll_EXTENDS := VBoxR3Dll
7260TEMPLATE_VBoxR3RuntimeDll_DEFS = $(TEMPLATE_VBoxR3Dll_DEFS) IN_RT_R3
7261if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
7262 TEMPLATE_VBoxR3RuntimeDll_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7263 TEMPLATE_VBoxR3RuntimeDll_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7264 TEMPLATE_VBoxR3RuntimeDll_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3Dll_PCHFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7265 TEMPLATE_VBoxR3RuntimeDll_LATE_LIBS.x86 = $(filter-out $(PATH_TOOL_$(TEMPLATE_VBoxR3Exe_TOOL.win.x86)_LIB)/%, $(TEMPLATE_VBoxR3Dll_LATE_LIBS.x86)) \
7266 $(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/oldnames.lib \
7267 $(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
7268 $(PATH_TOOL_$(TEMPLATE_VBoxR3RuntimeDll_TOOL.win.x86)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
7269endif
7270
7271#
7272# Template for building libraries that are linked into VBoxRT.dll
7273# and it's variations, non-pedantic variation.
7274#
7275TEMPLATE_VBoxR3RuntimeDllNonPedantic = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings.
7276TEMPLATE_VBoxR3RuntimeDllNonPedantic_EXTENDS := VBoxR3DllNonPedantic
7277TEMPLATE_VBoxR3RuntimeDllNonPedantic_DEFS = $(TEMPLATE_VBoxR3DllNonPedantic_DEFS) IN_RT_R3
7278if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && $(KBUILD_TARGET_ARCH) == "x86"
7279 TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7280 TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7281 TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic_PCHFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7282endif
7283
7284#
7285# Template for building libraries that are linked into VBoxRT-x86.dll
7286# and it's variations, non-pedantic variation.
7287#
7288TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86 = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings.
7289TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_EXTENDS := VBoxR3DllNonPedantic-x86
7290TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_BLD_TRG_ARCH := x86
7291TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_DEFS = $(TEMPLATE_VBoxR3DllNonPedantic-x86_DEFS) IN_RT_R3
7292if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && $(KBUILD_TARGET_ARCH) == "x86"
7293 TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_CFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic-x86_CFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7294 TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_CXXFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic-x86_CXXFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7295 TEMPLATE_VBoxR3RuntimeDllNonPedantic-x86_PCHFLAGS = $(filter-out -MD$(VBOX_VCC_CRT_TYPE), $(TEMPLATE_VBoxR3DllNonPedantic-x86_PCHFLAGS)) -MT$(VBOX_VCC_CRT_TYPE)
7296endif
7297
7298#
7299# Same as VBoxR3RuntimeDllNonPedantic, only it optimized debug builds too.
7300#
7301TEMPLATE_VBoxR3RuntimeDllNonPedanticFast = For libraries that are linked into VBoxRT, but must be excluded from -pedantic warnings, optmized debug.
7302TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_EXTENDS = VBoxR3RuntimeDllNonPedantic
7303ifeq ($(KBUILD_TYPE),debug)
7304 ifeq ($(KBUILD_TARGET),win)
7305 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS)) -O2 -Oy-
7306 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS.debug))
7307 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CXXFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS)) -O2 -Oy-
7308 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CXXFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS.debug))
7309 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_PCHFLAGS = $(filter-out -O0, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS)) -O2 -Oy-
7310 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_PCHFLAGS.debug = $(filter-out -RTC%, $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS.debug))
7311 else
7312 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CFLAGS = $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CFLAGS) -O2 -fno-omit-frame-pointer
7313 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_CXXFLAGS = $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_CXXFLAGS) -O2 -fno-omit-frame-pointer
7314 TEMPLATE_VBoxR3RuntimeDllNonPedanticFast_PCHFLAGS = $(TEMPLATE_VBoxR3RuntimeDllNonPedantic_PCHFLAGS) -O2 -fno-omit-frame-pointer
7315 endif
7316endif
7317
7318
7319#
7320# Template for building executables that are part of the VBox Main component
7321# (COM/XPCOM interface to VirtualBox).
7322#
7323TEMPLATE_VBoxMainExe = VBox Main Executable
7324
7325$(foreach arch,$(VBOX_TARGET_ARCHES)\
7326,$(eval TEMPLATE_VBoxMainExe_ASTOOL.$(KBUILD_TARGET).$(arch) := $(VBOX_ASTOOL.$(KBUILD_TARGET).$(arch))))
7327$(foreach arch,$(VBOX_TARGET_ARCHES)\
7328,$(eval TEMPLATE_VBoxMainExe_ASFLAGS.$(KBUILD_TARGET).$(arch) = $$(VBOX_ASFLAGS.$(KBUILD_TARGET).$(arch))))
7329
7330TEMPLATE_VBoxMainExe_DEFS = IN_RING3 UNICODE NDEBUG=1
7331TEMPLATE_VBoxMainExe_DEFS.win = _UNICODE
7332TEMPLATE_VBoxMainExe_RCDEFS = $(TEMPLATE_VBoxR3Exe_RCDEFS)
7333TEMPLATE_VBoxMainExe_LATE_LIBS.kprofile = $(LIB_KPROFILE)
7334TEMPLATE_VBoxMainExe_USES = dtrace
7335if defined(VBOX_WITH_DTRACE_R3_MAIN) && defined(VBOX_WITH_NATIVE_DTRACE)
7336 TEMPLATE_VBoxMainExe_DTRACETOOL = DTraceAndVBoxTpG
7337 TEMPLATE_VBoxMainExe_DTRACE_OBJ_FLAGS = -C
7338 TEMPLATE_VBoxMainExe_DTRACE_HDR_FLAGS = -C
7339 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3 VBOX_WITH_DTRACE_R3_MAIN VBOX_WITH_NATIVE_DTRACE
7340else
7341 TEMPLATE_VBoxMainExe_DTRACE_HDR_FLAGS = --ring-3-context
7342 TEMPLATE_VBoxMainExe_DTRACE_OBJ_FLAGS = --ring-3-context --pic --probe-fn-imported --probe-fn-name "SUPTracerFireProbe"
7343 if defined(VBOX_WITH_DTRACE_R3_MAIN)
7344 TEMPLATE_VBoxMainExe_DTRACETOOL = VBoxTpG
7345 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3 VBOX_WITH_DTRACE_R3_MAIN
7346 else
7347 TEMPLATE_VBoxMainExe_DTRACETOOL = VBoxTpG-Disabled
7348 endif
7349endif
7350
7351ifeq ($(KBUILD_TARGET),win)
7352 #TEMPLATE_VBoxMainExe_TOOL = $(VBOX_VCC_TOOL)
7353 TEMPLATE_VBoxMainExe_TOOL.win.x86 = $(VBOX_VCC_TOOL_STEM)X86
7354 TEMPLATE_VBoxMainExe_TOOL.win.amd64 = $(VBOX_VCC_TOOL_STEM)AMD64
7355 TEMPLATE_VBoxMainExe_TOOL.win.arm64 = $(VBOX_VCC_TOOL_STEM)ARM64
7356 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
7357 TEMPLATE_VBoxMainExe_SDKS = ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER) $(VBOX_WINPSDK) $(VBOX_WINDDK)
7358 else
7359 TEMPLATE_VBoxMainExe_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK) $(VBOX_WINDDK)
7360 endif
7361 TEMPLATE_VBoxMainExe_CXXFLAGS = -Zi -Zl -GR -EHsc -GF -MD$(VBOX_VCC_CRT_TYPE) $(VBOX_VCC_WCHAR_T_VARIANT) \
7362 $(VBOX_VCC_OPT) $(VBOX_VCC_FP) $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS) $(VBOX_VCC_std)
7363 # -wd4625: 'DisplaySourceBitmap' : copy constructor could not be generated because a base class copy constructor is inaccessible
7364 # -wd4626: 'DisplaySourceBitmap' : assignment operator could not be generated because a base class assignment operator is inaccessible
7365 # The two above can be cured by adding private: DECLARE_CLS_COPY_CTOR_ASSIGN_NOOP(xxxx); but too much work.
7366 # -wd4355: 'this' : used in base member initializer list (e.g. VirtualBoxBase.cpp)
7367 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_VCC_WARN_ALL) -wd4625 -wd4626 -wd4355 $(VBOX_VCC_WERR)
7368 TEMPLATE_VBoxMainExe_CXXFLAGS += -Gy
7369 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
7370 TEMPLATE_VBoxMainExe_CXXFLAGS += -Gw
7371 endif
7372 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
7373 TEMPLATE_VBoxMainExe_CXXFLAGS += -Zc:inline
7374 endif
7375 ifdef VBOX_WITH_MSC_ANALYZE_THIS
7376 TEMPLATE_VBoxMainExe_CXXFLAGS += /analyze
7377 endif
7378 TEMPLATE_VBoxMainExe_CXXFLAGS.debug = -RTCsu
7379 TEMPLATE_VBoxMainExe_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
7380 TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile = -Gh -GH
7381 TEMPLATE_VBoxMainExe_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxMainExe_CXXFLAGS))
7382 TEMPLATE_VBoxMainExe_CFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7383 TEMPLATE_VBoxMainExe_CFLAGS.dbgopt = $(TEMPLATE_VBoxMainExe_CXXFLAGS.dbgopt)
7384 TEMPLATE_VBoxMainExe_CFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7385 TEMPLATE_VBoxMainExe_PCHFLAGS = $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7386 TEMPLATE_VBoxMainExe_PCHFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7387 TEMPLATE_VBoxMainExe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxMainExe_CXXFLAGS.dbgopt)
7388 TEMPLATE_VBoxMainExe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7389 TEMPLATE_VBoxMainExe_LDFLAGS = -Ignore:4197 \
7390 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
7391 $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS) \
7392 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
7393 /STUB:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com \
7394 /DISALLOWLIB:libc.lib \
7395 /DISALLOWLIB:libcd.lib \
7396 /DISALLOWLIB:libcmt.lib \
7397 /DISALLOWLIB:libcmtd.lib \
7398 /DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE_N).lib \
7399 /DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE_N).lib \
7400 /DISALLOWLIB:vcruntime$(VBOX_VCC_CRT_TYPE_N).lib \
7401 /DISALLOWLIB:ucrt$(VBOX_VCC_CRT_TYPE_N).lib \
7402 /DISALLOWLIB:libvcruntime.lib \
7403 /DISALLOWLIB:libvcruntimed.lib \
7404 /DISALLOWLIB:libucrt.lib \
7405 /DISALLOWLIB:libucrtd.lib
7406 if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
7407 TEMPLATE_VBoxMainExe_LDFLAGS += -IntegrityCheck
7408 endif
7409 ifdef VBOX_WITH_DTRACE_R3_MAIN
7410 TEMPLATE_VBoxMainExe_LDFLAGS += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
7411 endif
7412 TEMPLATE_VBoxMainExe_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
7413 TEMPLATE_VBoxMainExe_LATE_LIBS = \
7414 $(LIB_RUNTIME)
7415 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
7416 TEMPLATE_VBoxMainExe_LATE_LIBS.x86 = \
7417 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7418 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7419 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7420 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/oldnames.lib
7421 TEMPLATE_VBoxMainExe_LATE_LIBS.amd64 = \
7422 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7423 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7424 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7425 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/oldnames.lib
7426 TEMPLATE_VBoxMainExe_LATE_LIBS.arm64 = \
7427 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/vcruntime$(VBOX_VCC_CRT_TYPE).lib \
7428 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7429 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7430 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.arm64)_LIB)/oldnames.lib
7431 ifeq ($(KBUILD_TYPE),asan)
7432 TEMPLATE_VBoxMainExe_LATE_LIBS.x86 += \
7433 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic-i386.lib \
7434 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/clang_rt.asan_dynamic_runtime_thunk-i386.lib
7435 TEMPLATE_VBoxMainExe_LATE_LIBS.amd64 += \
7436 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic-x86_64.lib \
7437 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib
7438 endif
7439 else
7440 TEMPLATE_VBoxMainExe_LATE_LIBS.x86 = \
7441 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7442 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7443 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.x86)_LIB)/oldnames.lib
7444 TEMPLATE_VBoxMainExe_LATE_LIBS.amd64 = \
7445 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
7446 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib \
7447 $(PATH_TOOL_$(TEMPLATE_VBoxMainExe_TOOL.win.amd64)_LIB)/oldnames.lib
7448 endif
7449 TEMPLATE_VBoxMainExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
7450 TEMPLATE_VBoxMainExe_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
7451
7452else # the GCC guys:
7453
7454 TEMPLATE_VBoxMainExe_TOOL = $(VBOX_GCC_TOOL)
7455 if $(VBOX_GCC_VERSION_CC) < 30400
7456 TEMPLATE_VBoxMainExe_DEFS += RT_WITHOUT_PRAGMA_ONCE
7457 endif
7458 TEMPLATE_VBoxMainExe_CXXFLAGS = -g $(VBOX_GCC_pipe) \
7459 $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_Wno-multistatement-macros) $(VBOX_GCC_Wno-class-memaccess) -Wshadow \
7460 -fshort-wchar -fpermissive -fexceptions -frtti $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing \
7461 $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_std) $(VBOX_GCC_IPRT_FMT_CHECK) \
7462 $(VBOX_GCC_SANITIZER_FLAGS)
7463 if !defined("VBOX_GCC_Wno-delete-non-virtual-dtor") && defined("VBOX_GCC_Wno-non-virtual-dtor")
7464 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_GCC_Wno-non-virtual-dtor)
7465 endif
7466 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
7467 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_GCC_WERR)
7468 endif
7469 ifdef VBOX_WITH_DTRACE_R3_MAIN
7470 TEMPLATE_VBoxMainExe_CXXFLAGS := $(filter-out -pedantic,$(TEMPLATE_VBoxMainExe_CXXFLAGS)) -fdollars-in-identifiers # annoying gcc option precedence.
7471 endif
7472 TEMPLATE_VBoxMainExe_CXXFLAGS.x86 = -m32
7473 TEMPLATE_VBoxMainExe_CXXFLAGS.amd64 = -m64
7474 TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile = -finstrument-functions
7475 TEMPLATE_VBoxMainExe_CFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros) \
7476 $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_IPRT_FMT_CHECK) \
7477 $(VBOX_GCC_SANITIZER_FLAGS)
7478 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
7479 TEMPLATE_VBoxMainExe_CFLAGS += $(VBOX_GCC_WERR)
7480 endif
7481 TEMPLATE_VBoxMainExe_CFLAGS.x86 = -m32
7482 TEMPLATE_VBoxMainExe_CFLAGS.amd64 = -m64
7483 TEMPLATE_VBoxMainExe_CFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7484 TEMPLATE_VBoxMainExe_CFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7485 TEMPLATE_VBoxMainExe_OBJCFLAGS = $(TEMPLATE_VBoxMainExe_CFLAGS)
7486 TEMPLATE_VBoxMainExe_OBJCFLAGS.x86 = $(TEMPLATE_VBoxMainExe_CFLAGS.x86)
7487 TEMPLATE_VBoxMainExe_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxMainExe_CFLAGS.amd64)
7488 TEMPLATE_VBoxMainExe_OBJCFLAGS.debug = $(TEMPLATE_VBoxMainExe_CFLAGS.debug)
7489 TEMPLATE_VBoxMainExe_OBJCFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CFLAGS.kprofile)
7490 TEMPLATE_VBoxMainExe_OBJCXXFLAGS = $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7491 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.x86)
7492 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.amd64)
7493 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7494 TEMPLATE_VBoxMainExe_OBJCXXFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7495 TEMPLATE_VBoxMainExe_PCHFLAGS = $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7496 TEMPLATE_VBoxMainExe_PCHFLAGS.x86 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.x86)
7497 TEMPLATE_VBoxMainExe_PCHFLAGS.amd64 = $(TEMPLATE_VBoxMainExe_CXXFLAGS.amd64)
7498 TEMPLATE_VBoxMainExe_PCHFLAGS.debug = $(TEMPLATE_VBoxMainExe_CXXFLAGS.debug)
7499 TEMPLATE_VBoxMainExe_PCHFLAGS.kprofile = $(TEMPLATE_VBoxMainExe_CXXFLAGS.kprofile)
7500 TEMPLATE_VBoxMainExe_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
7501 TEMPLATE_VBoxMainExe_LDFLAGS.x86 = -m32
7502 TEMPLATE_VBoxMainExe_LDFLAGS.amd64 = -m64
7503 ifeq ($(KBUILD_TARGET),linux)
7504 TEMPLATE_VBoxMainExe_LATE_LIBS = pthread m rt $(LIB_RUNTIME) dl
7505 TEMPLATE_VBoxMainExe_LDFLAGS.linux = -Wl,-z,noexecstack,-z,relro $(VBOX_LD_as_needed)
7506 else ifeq ($(KBUILD_TARGET),os2)
7507 TEMPLATE_VBoxMainExe_TOOL = GXX3OMF
7508 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7509 else ifeq ($(KBUILD_TARGET),darwin)
7510 TEMPLATE_VBoxMainExe_TOOL = $(VBOX_GCC_TOOL)
7511 TEMPLATE_VBoxMainExe_SDKS += $(VBOX_DARWIN_DEF_SDK_SDKS)
7512 TEMPLATE_VBoxMainExe_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
7513 TEMPLATE_VBoxMainExe_CFLAGS += $(VBOX_DARWIN_DEF_SDK_CFLAGS)
7514 TEMPLATE_VBoxMainExe_CXXFLAGS += $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
7515 TEMPLATE_VBoxMainExe_OBJCFLAGS += $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
7516 TEMPLATE_VBoxMainExe_OBJCXXFLAGS += $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS)
7517 TEMPLATE_VBoxMainExe_LDFLAGS.darwin += -bind_at_load
7518 TEMPLATE_VBoxMainExe_LDFLAGS += $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -framework Carbon -Wl,-headerpad_max_install_names
7519 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7520 TEMPLATE_VBoxMainExe_POST_CMDS.darwin = $(VBOX_SIGN_IMAGE_CMDS)
7521 else ifeq ($(KBUILD_TARGET),haiku)
7522 TEMPLATE_VBoxMainExe_TOOL = GXX3
7523 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME) network stdc++ supc++
7524 else if1of ($(KBUILD_TARGET), freebsd openbsd)
7525 TEMPLATE_VBoxMainExe_TOOL = GXX3
7526 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7527 TEMPLATE_VBoxMainExe_INCS += \
7528 /usr/include \
7529 /usr/X11R6/include \
7530 /usr/local/include
7531 TEMPLATE_VBoxMainExe_LIBPATH += \
7532 /usr/lib \
7533 /usr/X11R6/lib \
7534 /usr/local/lib
7535 else ifeq ($(KBUILD_TARGET),netbsd)
7536 TEMPLATE_VBoxMainExe_TOOL = GXX3
7537 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME)
7538 TEMPLATE_VBoxMainExe_INCS += \
7539 /usr/include \
7540 /usr/X11R7/include
7541 TEMPLATE_VBoxMainExe_LIBPATH += \
7542 /usr/lib \
7543 /usr/X11R7/lib
7544 else ifeq ($(KBUILD_TARGET),solaris)
7545 TEMPLATE_VBoxMainExe_TOOL = GXX3PLAIN
7546 TEMPLATE_VBoxMainExe_DEFS += _REENTRANT
7547 TEMPLATE_VBoxMainExe_LATE_LIBS = $(LIB_RUNTIME) rt thread
7548 else
7549 $(warning Warning: VBox Build: Target $(KBUILD_TARGET) is not officially supported and may need TEMPLATE_VBoxMainExe tweaking!)
7550 TEMPLATE_VBoxMainExe_LATE_LIBS =
7551 endif
7552 TEMPLATE_VBoxMainExe_LDFLAGS.solaris = -Wl,-z,ignore # Same as VBOX_LD_as_needed.
7553 ifdef VBOX_WITH_RUNPATH
7554 TEMPLATE_VBoxMainExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
7555 else ifdef VBOX_WITH_RELATIVE_RUNPATH
7556 TEMPLATE_VBoxMainExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
7557 endif
7558 ifdef VBOX_WITH_ORIGIN
7559 TEMPLATE_VBoxMainExe_LDFLAGS.linux += $(VBOX_GCC_ORIGIN_OPT)
7560 endif
7561
7562endif # !win
7563
7564# Add COM/XPCOM stuff
7565TEMPLATE_VBoxMainExe_LATE_LIBS += \
7566 $(PATH_STAGE_LIB)/VBoxCOM$(VBOX_SUFF_LIB)
7567ifdef VBOX_WITH_XPCOM
7568 ## @todo may be worth creating the VBOX_XPCOM SDK def
7569 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_XPCOM
7570 ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
7571 TEMPLATE_VBoxMainExe_DEFS += VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
7572 endif
7573 TEMPLATE_VBoxMainExe_INCS += \
7574 $(VBOX_XPCOM_INCS)
7575 TEMPLATE_VBoxMainExe_LATE_LIBS += \
7576 $(LIB_XPCOM)
7577 TEMPLATE_VBoxMainExe_INTERMEDIATES += \
7578 $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
7579
7580else # COM
7581 TEMPLATE_VBoxMainExe_INCS += \
7582 $(VBOX_PATH_SDK)/bindings/mscom/include
7583 TEMPLATE_VBoxMainExe_INTERMEDIATES += \
7584 $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
7585endif # COM
7586
7587#
7588# Template for building the Main DLL modules (such as in-process COM/XPCOM
7589# components for Main).
7590#
7591# This differs from VBoxMainExe only in PIC handling and similar DLL stuff.
7592#
7593TEMPLATE_VBoxMainDll = VBox Main Component (shared library)
7594TEMPLATE_VBoxMainDll_EXTENDS = VBoxMainExe
7595ifn1of ($(KBUILD_TARGET), darwin haiku os2 win)
7596 TEMPLATE_VBoxMainDll_DEFS = PIC $(TEMPLATE_VBoxMainExe_DEFS)
7597 TEMPLATE_VBoxMainDll_CFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CFLAGS)
7598 TEMPLATE_VBoxMainDll_CXXFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7599 TEMPLATE_VBoxMainDll_PCHFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_PCHFLAGS)
7600 TEMPLATE_VBoxMainDll_LDFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_LDFLAGS)
7601endif
7602TEMPLATE_VBoxMainDll_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBoxMainExe_LDFLAGS.darwin)) \
7603 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
7604 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
7605
7606#
7607# Template identical to VBoxMainDll except for where the stuff is
7608# installed when using XPCOM (components/).
7609#
7610# Note! In the hardened build this gets a bit ugly since $ORIGIN/..
7611# doesn't work. So, we keep the $ORIGIN from VBoxMainExe and let
7612# the installers do the necessary .so symlinking.
7613#
7614# (No difference when building against COM on Windows.)
7615#
7616TEMPLATE_VBoxMainComp = VBox Main COM/XPCOM Component (shared library)
7617TEMPLATE_VBoxMainComp_EXTENDS = VBoxMainExe
7618ifn1of ($(KBUILD_TARGET), win)
7619 TEMPLATE_VBoxMainComp_INST = $(INST_BIN)components/
7620endif
7621ifneq ($(KBUILD_TARGET),win)
7622 ifeq ($(filter-out linux.arm64 solaris.x86 %.amd64 %.sparc32 %.sparc64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),) ## TODO: cleanup!
7623 TEMPLATE_VBoxMainComp_DEFS = PIC $(TEMPLATE_VBoxMainExe_DEFS)
7624 TEMPLATE_VBoxMainComp_CFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CFLAGS)
7625 TEMPLATE_VBoxMainComp_CXXFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_CXXFLAGS)
7626 TEMPLATE_VBoxMainComp_PCHFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_PCHFLAGS)
7627 if defined(VBOX_WITH_RELATIVE_RUNPATH) && !defined(VBOX_WITH_HARDENING)
7628 TEMPLATE_VBoxMainComp_LDFLAGS = -fPIC $(filter-out '$(VBOX_GCC_RPATH_OPT)%',$(TEMPLATE_VBoxMainExe_LDFLAGS)) '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..'
7629 else
7630 TEMPLATE_VBoxMainComp_LDFLAGS = -fPIC $(TEMPLATE_VBoxMainExe_LDFLAGS)
7631 endif
7632 else ifndef VBOX_WITH_HARDENING
7633 ifdef VBOX_WITH_RELATIVE_RUNPATH
7634 TEMPLATE_VBoxMainComp_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%',$(TEMPLATE_VBoxMainExe_LDFLAGS)) '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..'
7635 endif
7636 endif
7637endif
7638TEMPLATE_VBoxMainComp_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBoxMainExe_LDFLAGS.darwin)) \
7639 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
7640 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
7641
7642# x86 version of VBoxMainComp
7643TEMPLATE_VBoxMainComp-x86 = 32-bit VBox Main Component (shared library)
7644TEMPLATE_VBoxMainComp-x86_EXTENDS = VBoxMainComp
7645TEMPLATE_VBoxMainComp-x86_BLD_TRG_ARCH = x86
7646TEMPLATE_VBoxMainComp-x86_INST.win = $(INST_DLL)x86/
7647TEMPLATE_VBoxMainComp-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxMainComp_DEFS)) HC_ARCH_BIT=32 ARCH_BITS=32 \
7648 VBOX_IN_32_ON_64_MAIN_API
7649TEMPLATE_VBoxMainComp-x86_LATE_LIBS = \
7650 $(subst $(PATH_STAGE_LIB)/VBoxCOM$(VBOX_SUFF_LIB),$(PATH_STAGE_LIB)/VBoxCOM-x86$(VBOX_SUFF_LIB), \
7651 $(subst $(LIB_RUNTIME),$(VBOX_LIB_RUNTIME_X86), \
7652 $(subst $(LIB_XPCOM),$(VBOX_LIB_XPCOM_X86), \
7653 $(TEMPLATE_VBoxMainComp_LATE_LIBS))))
7654
7655
7656#
7657# Template for building the Main static libraries.
7658#
7659# This differs from VBoxMainDll only that it zeroes out the _LATE_LIBS definition.
7660#
7661TEMPLATE_VBoxMainLib = VBox Main Component (static library)
7662TEMPLATE_VBoxMainLib_EXTENDS = VBoxMainDll
7663TEMPLATE_VBoxMainLib_LATE_LIBS = $(NO_SUCH_VARIABLE)
7664
7665TEMPLATE_VBoxMainLib-x86 = 32-bit VBox Main Component (static library)
7666TEMPLATE_VBoxMainLib-x86_EXTENDS = VBoxMainLib
7667TEMPLATE_VBoxMainLib-x86_BLD_TRG_ARCH = x86
7668TEMPLATE_VBoxMainLib-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxMainLib_DEFS)) HC_ARCH_BIT=32 ARCH_BITS=32 \
7669 VBOX_IN_32_ON_64_MAIN_API
7670
7671#
7672# Main unit testing, for compiling API implementation files into a testcase.
7673# This is the VBoxMainExe template only with a different install dir.
7674#
7675TEMPLATE_VBoxMainTstExe = VBox Main Testcase Exe
7676TEMPLATE_VBoxMainTstExe_EXTENDS = VBoxMainExe
7677TEMPLATE_VBoxMainTstExe_INST = $(INST_TESTCASE)
7678ifdef VBOX_WITH_RUNPATH
7679 TEMPLATE_VBoxMainTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxMainExe_LDFLAGS)
7680else ifdef VBOX_WITH_RELATIVE_RUNPATH
7681 TEMPLATE_VBoxMainTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxMainExe_LDFLAGS)
7682endif
7683if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
7684 TEMPLATE_VBoxMainTstExe_POST_CMDS =
7685endif
7686
7687#
7688# Template for building executables that use the VBox Main component.
7689#
7690TEMPLATE_VBoxMainClientExe = VBox Main Client (executable)
7691TEMPLATE_VBoxMainClientExe_EXTENDS = VBoxMainExe
7692ifeq ($(KBUILD_TARGET),win)
7693 TEMPLATE_VBoxMainClientExe_DEPS = $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
7694 TEMPLATE_VBoxMainClientExe_LATE_LIBS.win = $(TEMPLATE_VBoxMainExe_LATE_LIBS.win) \
7695 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/User32.Lib \
7696 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/Shell32.Lib \
7697 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/ShLwApi.Lib \
7698 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/Ole32.Lib \
7699 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/OleAut32.Lib \
7700 $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/Uuid.Lib
7701else
7702 TEMPLATE_VBoxMainClientExe_DEPS = $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
7703 TEMPLATE_VBoxMainClientExe_DEFS = $(TEMPLATE_VBoxMainExe_DEFS) \
7704 NDEBUG TRIMMED
7705 TEMPLATE_VBoxMainClientExe_CXXFLAGS.linux = $(TEMPLATE_VBoxMainExe_CXXFLAGS.linux) -pthread
7706 TEMPLATE_VBoxMainClientExe_PCHFLAGS.linux = $(TEMPLATE_VBoxMainExe_PCHFLAGS.linux) -pthread
7707endif
7708
7709#
7710# Variant of VBoxMainClientExe for VM processes that needs to be signed on windows when using minimal hardening.
7711#
7712TEMPLATE_VBoxMainClientSignedExe = VBox Main Client VM (executable), signed on Windows for using VBoxSup.sys.
7713TEMPLATE_VBoxMainClientSignedExe_EXTENDS = VBoxMainClientExe
7714if "$(KBUILD_TARGET)" == "win" && "$(VBOX_SIGNING_MODE)" == "test"
7715 TEMPLATE_VBoxMainClientSignedExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(call VBOX_SIGN_IMAGE_FN,$(out),,2)
7716endif
7717
7718#
7719# Template for building shared libraries / DLLs that use the VBox Main component.
7720#
7721# This differs from VBoxMainClientExe only in PIC handling and similar DLL stuff.
7722#
7723TEMPLATE_VBoxMainClientDll = VBox MAIN Client (shared library)
7724TEMPLATE_VBoxMainClientDll_EXTENDS = VBoxMainClientExe
7725ifn1of ($(KBUILD_TARGET), darwin os2 win)
7726 TEMPLATE_VBoxMainClientDll_DEFS = PIC $(TEMPLATE_VBoxMainClientExe_DEFS)
7727 TEMPLATE_VBoxMainClientDll_CFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_CFLAGS)
7728 TEMPLATE_VBoxMainClientDll_CXXFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_CXXFLAGS)
7729 TEMPLATE_VBoxMainClientDll_PCHFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_PCHFLAGS)
7730 TEMPLATE_VBoxMainClientDll_LDFLAGS = -fPIC $(TEMPLATE_VBoxMainClientExe_LDFLAGS)
7731endif
7732TEMPLATE_VBoxMainClientDll_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBoxMainClientExe_LDFLAGS.darwin))
7733
7734# x86 version of VBoxMainClientDll
7735TEMPLATE_VBoxMainClientDll-x86 := 32-bit VBox MAIN Client (shared library)
7736TEMPLATE_VBoxMainClientDll-x86_EXTENDS := VBoxMainClientDll
7737TEMPLATE_VBoxMainClientDll-x86_BLD_TRG_ARCH := x86
7738TEMPLATE_VBoxMainClientDll-x86_INST.win = $(INST_DLL)x86/
7739TEMPLATE_VBoxMainClientDll-x86_DEFS = $(filter-out HC_ARCH_BITS%,$(TEMPLATE_VBoxMainClientDll_DEFS)) \
7740 HC_ARCH_BIT=32 ARCH_BITS=32 VBOX_IN_32_ON_64_MAIN_API
7741TEMPLATE_VBoxMainClientDll-x86_LATE_LIBS = \
7742 $(subst $(PATH_STAGE_LIB)/VBoxCOM$(VBOX_SUFF_LIB),$(PATH_STAGE_LIB)/VBoxCOM-x86$(VBOX_SUFF_LIB), \
7743 $(subst $(LIB_RUNTIME),$(VBOX_LIB_RUNTIME_X86), \
7744 $(subst $(LIB_XPCOM),$(VBOX_LIB_XPCOM_X86), \
7745 $(TEMPLATE_VBoxMainClientDll_LATE_LIBS))))
7746
7747#
7748# Template for building testcases which are API clients.
7749#
7750TEMPLATE_VBoxMainClientTstExe = VBox Main Client Testcase (executable)
7751TEMPLATE_VBoxMainClientTstExe_EXTENDS = VBoxMainClientExe
7752TEMPLATE_VBoxMainClientTstExe_INST = $(INST_TESTCASE)
7753ifdef VBOX_WITH_RUNPATH
7754 TEMPLATE_VBoxMainClientTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBoxMainClientExe_LDFLAGS)
7755else ifdef VBOX_WITH_RELATIVE_RUNPATH
7756 TEMPLATE_VBoxMainClientTstExe_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBoxMainClientExe_LDFLAGS)
7757endif
7758if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
7759 TEMPLATE_VBoxMainClientTstExe_POST_CMDS =
7760endif
7761
7762
7763
7764#
7765# Templates used for building the extension packs.
7766#
7767ifdef VBOX_WITH_EXTPACK
7768 # Base templates (native or portable).
7769 TEMPLATE_VBoxR3ExtPack = For the ring-3 context extension pack modules.
7770 if 1 # Native for now.
7771 TEMPLATE_VBoxR3ExtPack_EXTENDS = VBoxR3Dll
7772 TEMPLATE_VBoxR3ExtPack_DEFS = $(TEMPLATE_VBoxR3Dll_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3
7773 else
7774 TEMPLATE_VBoxR3ExtPack_EXTENDS = VBoxNoCrtGccLib
7775 TEMPLATE_VBoxR3ExtPack_DEFS = $(TEMPLATE_VBoxNoCrtGccLib_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3 IPRT_NO_CRT IN_RING3
7776 TEMPLATE_VBoxR3ExtPack_INCS = $(PATH_ROOT)/include/iprt/nocrt $(TEMPLATE_VBoxR3Dll_INCS)
7777 endif
7778 ifneq ($(KBUILD_TARGET),win)
7779 TEMPLATE_VBoxR3ExtPack_CXXFLAGS = $(TEMPLATE_VBoxR3Dll_CXXFLAGS) -fno-rtti
7780 TEMPLATE_VBoxR3ExtPack_PCHFLAGS = $(TEMPLATE_VBoxR3Dll_PCHFLAGS) -fno-rtti
7781 endif
7782 TEMPLATE_VBoxR3ExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7783 ifeq ($(KBUILD_TARGET),linux)
7784 TEMPLATE_VBoxR3ExtPack_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxR3Dll_LDFLAGS))
7785 else if !defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_RELATIVE_RUNPATH)
7786 TEMPLATE_VBoxR3ExtPack_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/../../..' $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxR3Dll_LDFLAGS))
7787 endif
7788 ifdef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
7789 if1of ($(KBUILD_TARGET), win os2)
7790 TEMPLATE_VBoxR3ExtPack_LATE_LIBS = \
7791 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_LIB)
7792 else
7793 TEMPLATE_VBoxR3ExtPack_LATE_LIBS = \
7794 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_DLL)
7795 endif
7796 else
7797 TEMPLATE_VBoxR3ExtPack_LATE_LIBS = \
7798 $(LIB_RUNTIME)
7799 endif
7800 ifeq ($(KBUILD_TARGET),darwin)
7801 TEMPLATE_VBoxR3ExtPack_POST_CMDS = $(VBOX_SIGN_EXTPACK_DYLIB_CMDS)
7802 endif
7803
7804 TEMPLATE_VBoxR3ExtPackApi = For the ring-3 context extension pack modules using the Main API.
7805 TEMPLATE_VBoxR3ExtPackApi_EXTENDS = VBoxMainDll
7806 TEMPLATE_VBoxR3ExtPackApi_DEFS = $(TEMPLATE_VBoxMainDll_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3
7807 TEMPLATE_VBoxR3ExtPackApi_INST = $(INST_EXTPACK)YouShallOverrideThis/
7808 ifeq ($(KBUILD_TARGET),linux)
7809 TEMPLATE_VBoxR3ExtPackApi_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxMainDll_LDFLAGS))
7810 else if !defined(VBOX_WITH_RUNPATH) && defined(VBOX_WITH_RELATIVE_RUNPATH)
7811 TEMPLATE_VBoxR3ExtPackApi_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/../../..' $(filter-out '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)', $(TEMPLATE_VBoxMainDll_LDFLAGS))
7812 endif
7813 ifdef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
7814 if1of ($(KBUILD_TARGET), win os2)
7815 TEMPLATE_VBoxR3ExtPackApi_LATE_LIBS = \
7816 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_LIB)
7817 else
7818 TEMPLATE_VBoxR3ExtPackApi_LATE_LIBS = \
7819 $(PATH_STAGE_LIB)/VBoxRTImp$(VBOX_SUFF_DLL)
7820 endif
7821 else
7822 TEMPLATE_VBoxR3ExtPackApi_LATE_LIBS = \
7823 $(LIB_RUNTIME)
7824 endif
7825 ifeq ($(KBUILD_TARGET),darwin)
7826 TEMPLATE_VBoxR3ExtPackApi_POST_CMDS = $(VBOX_SIGN_EXTPACK_DYLIB_CMDS)
7827 endif
7828
7829 TEMPLATE_VBoxR0ExtPack = For the ring-0 context extension pack modules.
7830 TEMPLATE_VBoxR0ExtPack_EXTENDS = VBoxR0
7831 TEMPLATE_VBoxR0ExtPack_EXTENDS_BY = appending
7832 TEMPLATE_VBoxR0ExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7833 TEMPLATE_VBoxR0ExtPack_DEFS = VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R0
7834 if1of ($(VBOX_LDR_FMT), pe lx)
7835 TEMPLATE_VBoxR0ExtPack_LATE_LIBS = \
7836 $(PATH_STAGE_LIB)/VMMR0Imp$(VBOX_SUFF_LIB)
7837 endif
7838 TEMPLATE_VBoxR0ExtPack_LATE_LIBS += \
7839 $(VBOX_LIB_SUPR0)
7840
7841 TEMPLATE_VBoxRcExtPack = For the raw-mode context extension pack modules.
7842 TEMPLATE_VBoxRcExtPack_EXTENDS = VBoxRc
7843 TEMPLATE_VBoxRcExtPack_EXTENDS_BY = appending
7844 TEMPLATE_VBoxRcExtPack_SYSSUFF = .rc
7845 TEMPLATE_VBoxRcExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7846 TEMPLATE_VBoxRcExtPack_DEFS = VBOX_IN_EXTPACK VBOX_IN_EXTPACK_RC
7847 if1of ($(VBOX_LDR_FMT32), pe lx)
7848 TEMPLATE_VBoxRcExtPack_LATE_LIBS = \
7849 $(PATH_STAGE_LIB)/VMMRCBuiltin$(VBOX_SUFF_LIB) \
7850 $(PATH_STAGE_LIB)/VMMRCImp$(VBOX_SUFF_LIB)
7851 endif
7852
7853 TEMPLATE_VBoxInsExtPack = For the install targets of an extension pack.
7854 TEMPLATE_VBoxInsExtPack_MODE = 0644
7855 TEMPLATE_VBoxInsExtPack_INST = $(INST_EXTPACK)YouShallOverrideThis/
7856
7857 # For each individual extension pack
7858 ifdef VBOX_WITH_EXTPACK_PUEL
7859 TEMPLATE_VBoxR3ExtPackPuel = For the ring-3 context modules in the PUEL extension pack.
7860 TEMPLATE_VBoxR3ExtPackPuel_EXTENDS = VBoxR3ExtPack
7861 TEMPLATE_VBoxR3ExtPackPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7862 TEMPLATE_VBoxR3ExtPackPuel_DEFS = $(TEMPLATE_VBoxR3ExtPack_DEFS) VBOX_IN_PUEL_EXTPACK
7863 TEMPLATE_VBoxR3ExtPackPuel_LD_DEBUG = split
7864
7865 TEMPLATE_VBoxR3ExtPackApiPuel = For the ring-3 context modules in the PUEL extension pack.
7866 TEMPLATE_VBoxR3ExtPackApiPuel_EXTENDS = VBoxR3ExtPackApi
7867 TEMPLATE_VBoxR3ExtPackApiPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7868 TEMPLATE_VBoxR3ExtPackApiPuel_DEFS = $(TEMPLATE_VBoxR3ExtPackApi_DEFS) VBOX_IN_PUEL_EXTPACK
7869 TEMPLATE_VBoxR3ExtPackApiPuel_LD_DEBUG = split
7870
7871 TEMPLATE_VBoxR3ExtPackPuelWithOpenSsl = For the ring-3 context modules in the PUEL extension pack using ExtPack OpenSSL.
7872 TEMPLATE_VBoxR3ExtPackPuelWithOpenSsl_EXTENDS = VBoxR3ExtPackPuel
7873
7874 TEMPLATE_VBoxR0ExtPackPuel = For the ring-0 context modules in the PUEL extension pack.
7875 TEMPLATE_VBoxR0ExtPackPuel_EXTENDS = VBoxR0ExtPack
7876 TEMPLATE_VBoxR0ExtPackPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7877 TEMPLATE_VBoxR0ExtPackPuel_DEFS = $(TEMPLATE_VBoxR0ExtPack_DEFS) VBOX_IN_PUEL_EXTPACK
7878
7879 TEMPLATE_VBoxRcExtPackPuel = For the raw-mode context modules in the PUEL extension pack.
7880 TEMPLATE_VBoxRcExtPackPuel_EXTENDS = VBoxRcExtPack
7881 TEMPLATE_VBoxRcExtPackPuel_INST = $(INST_EXTPACK_PUEL)$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)/
7882 TEMPLATE_VBoxRcExtPackPuel_DEFS = $(TEMPLATE_VBoxRcExtPack_DEFS) VBOX_IN_PUEL_EXTPACK
7883
7884 TEMPLATE_VBoxInsExtPackPuel = For the install targets of an extension pack.
7885 TEMPLATE_VBoxInsExtPackPuel_EXTENDS = VBoxR0ExtPack
7886 TEMPLATE_VBoxInsExtPackPuel_INST = $(INST_EXTPACK_PUEL)
7887 endif
7888
7889endif # VBOX_WITH_EXTPACK
7890
7891
7892#
7893# Qt
7894# Qt
7895# Qt
7896#
7897if defined(VBOX_WITH_QTGUI) || defined(VBOX_WITH_NLS)
7898
7899 # Guess VBOX_WITH_ORACLE_QT
7900 ifndef VBOX_WITH_ORACLE_QT
7901 ifndef VBOX_OSE
7902 if1of ($(KBUILD_TARGET), darwin solaris win)
7903 VBOX_WITH_ORACLE_QT := 1
7904 endif
7905 endif
7906 endif
7907
7908 #
7909 # Handmade configuration of Qt - very annoying, this needs to
7910 # be cleaned up properly later some time (not important now).
7911 #
7912 # When using a debug QT build set VBOX_QT_DBG:=d in LocalConfig.kmk.
7913 #
7914 ifeq ($(VBOX_PATH_QT),)
7915 ifeq ($(KBUILD_TARGET),darwin)
7916 VBOX_PATH_QT := $(lastword $(sort $(wildcard $(KBUILD_DEVTOOLS_TRG)/qt/v6*)))
7917 ifeq ($(VBOX_PATH_QT),)
7918 ifneq ($(wildcard /Library/Frameworks/QtCore.framework),)
7919 # Using the global installation (for OSE).
7920 VBOX_PATH_QT ?= /usr
7921 VBOX_PATH_QT_FRAMEWORKS ?= /Library/Frameworks
7922 endif
7923 endif
7924 else if1of ($(KBUILD_TARGET), win)
7925 VBOX_PATH_QT := $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_TRG)/qt/v6*))
7926 VBOX_PATH_QT := $(firstfile $(qfilter ,%-$(tolower $(VBOX_VCC_TOOL_STEM)),$(VBOX_PATH_QT)) \
7927 $(qfilter-out ,%-vcc100 %-vcc110 %-vcc120 %-vcc140 %-vcc141 %-vcc142 %-vcc143 %-vcc150, $(VBOX_PATH_QT)))
7928 ifdef VBOX_PATH_QT
7929 PATH_SDK_QT6 := $(VBOX_PATH_QT)
7930 PATH_TOOL_QT6 := $(VBOX_PATH_QT)
7931 ifneq ($(KBUILD_HOST_ARCH),$(KBUILD_TARGET_ARCH))
7932 PATH_TOOL_QT6 := $(rversortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_HST)/qt/v6*))
7933 PATH_TOOL_QT6 := $(firstfile $(qfilter ,%-$(tolower $(VBOX_VCC_TOOL_STEM)),$(PATH_TOOL_QT6)) \
7934 $(qfilter-out ,%-vcc100 %-vcc110 %-vcc120 %-vcc140 %-vcc141 %-vcc142 %-vcc143 %-vcc150, $(PATH_TOOL_QT6)))
7935 ifndef VBOX_PATH_QT
7936 PATH_SDK_QT6 := $(VBOX_PATH_QT)
7937 endif
7938 endif
7939 endif
7940 else if1of ($(KBUILD_TARGET), linux solaris)
7941 VBOX_PATH_QT ?= $(firstfile $(versortfiles $(qwildcard ,$(KBUILD_DEVTOOLS_TRG)/qt/v6*)))
7942 ifneq ($(VBOX_PATH_QT),)
7943 VBOX_WITH_ORACLE_QT = 1
7944 endif
7945 endif
7946 endif
7947 VBOX_PATH_QT ?= /usr
7948 VBOX_PATH_QT_LIB ?= $(VBOX_PATH_QT)/lib
7949
7950 ifdef VBOX_WITH_ORACLE_QT
7951 if "$(KBUILD_TARGET)" != "darwin"
7952 VBOX_QT_INFIX := VBox$(VBOX_QT_DBG)
7953 endif
7954 VBOX_QT_POSTFIX := VBox
7955 endif
7956
7957 if "$(VBOX_QT_DBG)" != "" && "$(VBOX_QT_DBG)" != "$(VBOX_VCC_CRT_TYPE)" && "$(KBUILD_TARGET)" == "win"
7958 $(warning WARNING! VBOX_QT_DBG (=$(VBOX_QT_DBG)) and VBOX_VCC_CRT_TYPE (=$(VBOX_VCC_CRT_TYPE)) does not match!)
7959 $(warning WARNING! This may cause heap troubles in the GUI in places where something is)
7960 $(warning WARNING! allocated in the Qt DLLs freed in our code (or vice versa) because they)
7961 $(warning WARNING! will be using different allocators. See r156914 for more details.)
7962 $(warning WARNING! VBOX_WITH_DEBUG_VCC_CRT=1 in enabled debug CRT.)
7963 endif
7964
7965 ifeq ($(KBUILD_TARGET),darwin)
7966 VBOX_QT_MOD := QtCore QtGui QtWidgets QtPrintSupport QtHelp QtNetwork QtSql QtStateMachine
7967 else if1of ($(KBUILD_TARGET), linux freebsd netbsd openbsd solaris win)
7968 if1of ($(KBUILD_TARGET), linux freebsd netbsd openbsd solaris)
7969 VBOX_QT_MOD += Qt6Core Qt6Gui Qt6Widgets Qt6PrintSupport Qt6StateMachine
7970 VBOX_QT_MOD += Qt6DBus Qt6Xml Qt6XcbQpa Qt6Help Qt6Network Qt6Sql
7971 ifeq ($(KBUILD_TARGET),linux)
7972 VBOX_QT_MOD += Qt6WaylandClient
7973 endif
7974 VBOX_QT_PLUGINS = \
7975 plugins/platforms/libqxcb$(VBOX_QT_POSTFIX).so \
7976 plugins/platformthemes/libqgtk3$(VBOX_QT_POSTFIX).so \
7977 plugins/sqldrivers/libqsqlite$(VBOX_QT_POSTFIX).so
7978 ifdef VBOX_WITH_ORACLE_QT
7979 VBOX_QT_PLUGINS += \
7980 plugins/platformthemes/libqgtk2$(VBOX_QT_POSTFIX).so \
7981 plugins/styles/libqgtk2style$(VBOX_QT_POSTFIX).so
7982 endif
7983 ifeq ($(KBUILD_TARGET),linux)
7984 VBOX_QT_PLUGINS += \
7985 plugins/platforms/libqwayland-generic$(VBOX_QT_POSTFIX).so \
7986 plugins/wayland-shell-integration/libxdg-shell$(VBOX_QT_POSTFIX).so
7987 endif
7988 else ifeq ($(KBUILD_TARGET),win)
7989 VBOX_QT_MOD += Qt6Core Qt6Gui Qt6Widgets Qt6PrintSupport Qt6StateMachine Qt6Help Qt6Network Qt6Sql
7990 endif # win
7991 endif # linux freebsd netbsd openbsd solaris win
7992
7993 VBOX_QT_MOD_NAMES = $(foreach qtmod,$(VBOX_QT_MOD),$(qtmod)$(VBOX_QT_INFIX))
7994
7995 # Hack LD_LIBRARY_PATH for stuff in tools.
7996 ifdef VBOX_WITH_ORACLE_QT
7997 if1of ($(KBUILD_TARGET), linux solaris)
7998 export LD_LIBRARY_PATH := $(VBOX_PATH_QT_LIB):$(LD_LIBRARY_PATH)
7999 endif
8000 endif
8001
8002 # WORKAROUND:
8003 # Both files included automatically, 1st include is included from 2nd one,
8004 # but moc can't include it due to problem with parsing framework structure,
8005 # as a result QT_VERSION can't be calculated and it's not only used in our
8006 # GUI but by the moc itself to parse modern signal/slot definitions.
8007 # We were hardcoding QT_VERSION for TEMPLATE_VBoxQtGuiExe below for quite
8008 # a long, but this have to end. Instead we can pass both includes manually.
8009 TOOL_QT5_MOCFLAGS.darwin += --include qconfig.h --include qglobal.h
8010endif # defined(VBOX_WITH_QTGUI) || defined(VBOX_WITH_NLS)
8011
8012ifdef VBOX_WITH_QTGUI
8013 #
8014 # Template for building Qt GUI executables.
8015 #
8016 TEMPLATE_VBoxQtGuiExe = VBox Qt GUI Executable
8017 TEMPLATE_VBoxQtGuiExe_USES := qt6
8018 TEMPLATE_VBoxQtGuiExe_QTTOOL := QT6
8019 TEMPLATE_VBoxQtGuiExe_MOCTOOL := QT6
8020 TEMPLATE_VBoxQtGuiExe_UICTOOL := QT6
8021 TEMPLATE_VBoxQtGuiExe_RCCTOOL := QT6
8022 TEMPLATE_VBoxQtGuiExe_LRCTOOL := QT6
8023 TEMPLATE_VBoxQtGuiExe_SDKS := QT6
8024 TEMPLATE_VBoxQtGuiExe_QT_INFIX = $(VBOX_QT_INFIX)
8025 TEMPLATE_VBoxQtGuiExe_DEFS = IN_RING3 QT_NO_DEBUG QT_THREAD_SUPPORT QT_SHARED HAVE_CONFIG_H $(ARCH_BITS_DEFS)
8026 TEMPLATE_VBoxQtGuiExe_RCDEFS = $(TEMPLATE_VBoxR3Exe_RCDEFS)
8027
8028 ifeq ($(KBUILD_TARGET),win)
8029 # Note! Only use VBOX_VCC_CRT_TYPE when it matches VBOX_QT_DBG.
8030 TEMPLATE_VBoxQtGuiExe_TOOL = $(VBOX_VCC_TOOL)
8031 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8032 TEMPLATE_VBoxQtGuiExe_SDKS = WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)
8033 endif
8034 TEMPLATE_VBoxQtGuiExe_DEFS += \
8035 _WIN32_WINNT=0x0500 UNICODE _UNICODE \
8036 QT_DLL _CRT_SECURE_NO_DEPRECATE \
8037 $(QMAKE_PRL_DEFINES)
8038 TEMPLATE_VBoxQtGuiExe_CXXFLAGS = -nologo -Zm200 -MD$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),) \
8039 -Zi -EHsc $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS) $(VBOX_VCC_std)
8040 # -wd4481: nonstandard extension used: override specifier 'override'
8041 # -wd4625: 'QRubberBand' : copy constructor could not be generated because a base class copy constructor is inaccessible
8042 # -wd4626: 'QRubberBand' : assignment operator could not be generated because a base class assignment operator is inaccessible
8043 # -wd4640: qmetatype.h(2210): warning C4640: 'f' : construction of local static object is not thread-safe [too bad]
8044 # -wd4350: behavior change: 'int QStringList::indexOf(const QRegExp &,int) const' called instead of 'int QStringList::indexOf(QRegExp &,int) const'
8045 # -wd4121: UIActionPool.h(393) : warning C4121: 'UIActionPool::PointerToFunction' : alignment of a member was sensitive to packing
8046 # -wd4718: qmap.h(222) : warning C4718: 'QMapNode<enum DetailsElementType,bool>::destroySubTree' : recursive call has no side effects, deleting
8047 # -wd5204: pplwin.h(78): warning C5204: 'Concurrency::details::_DefaultPPLTaskScheduler': class has virtual functions
8048 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += $(VBOX_VCC_WARN_ALL) -wd4481 -wd4625 -wd4626 -wd4640 -wd4350 -wd4371 -wd4121 -wd4718 -wd5204 $(VBOX_VCC_WERR)
8049 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
8050 # -wd4619: qvectro.h(305 : warning C4619: #pragma warning : there is no warning number '4345'
8051 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4619
8052 endif
8053 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8054 # -wd4774: string(530): warning C4774: '_scprintf' : format string expected in argument 1 is not a string literal
8055 # -wd4456: UICommon.cpp(1471): warning C4456: declaration of '_container_' hides previous local declaration [nested foreach]
8056 # -wd4458: UISettingsDialogSpecific.cpp(416): warning C4458: declaration of 'data' hides class member
8057 # qwidget.h(730): note: see declaration of 'QWidget::data'
8058 # -wd4946: qmap.h(213): warning C4946: reinterpret_cast used between related classes: 'QMapNodeBase' and 'QMapNode<Key,T>'
8059 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4774 -wd4456 -wd4458 -wd4946
8060 endif
8061 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC141"
8062 # -wd4866: UIVirtualBoxManager.cpp(221) : warning C4866: compiler may not enforce left-to-right evaluation order for call to 'QStringList::operator<<'
8063 # Only with -std=c++17 and later.
8064 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4866
8065 endif
8066 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # With v16.11.9, not with v16.6.0 4242
8067 # -wd5219: qpoint.h(187): warning C5219: implicit conversion from 'const int' to 'float', possible loss of data
8068 # -wd5240: qcolor.h(235): warning C5240: 'nodiscard': attribute is ignored in this syntactic position
8069 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd5219 -wd5240
8070 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += /volatileMetadata- # Don't waste space on x86/amd64-on-arm emulation optimizations.
8071 endif
8072 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC143" # (with qt 6.5.3 - reevalue when upgrading qt)
8073 # -wd5246: qobjectdefs.h(203): warning C5246: '_Elems': the initialization of a subobject should be wrapped in braces
8074 # -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'
8075 # -wd5266: qhash.h(1083): warning C5266: 'const' qualifier on return type has no effect
8076 # -wd5267: qlist.h(50): warning C5267: definition of implicit copy constructor for 'QListSpecialMethods<T>' is deprecated because it has a user-provided destructor
8077 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd5246 -wd5249 -wd5266 -wd5267
8078 endif
8079 if1of ($(KBUILD_TARGET_ARCH), arm64) # (with qt 6.8.0)
8080 # -wd4668: qnumeric.h(88): warning C4668: 'Q_CC_GNU' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
8081 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -wd4668
8082 endif
8083
8084 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -Gy
8085 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
8086 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -Gw
8087 endif
8088 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
8089 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -Zc:inline
8090 endif
8091 ifdef VBOX_WITH_MSC_ANALYZE_THIS
8092 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += /analyze
8093 endif
8094
8095 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug = -RTCsu
8096 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug = -RTCsu
8097 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
8098 TEMPLATE_VBoxQtGuiExe_PCHFLAGS = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8099 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.debug = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug)
8100 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.dbgopt)
8101 TEMPLATE_VBoxQtGuiExe_LDFLAGS = -Ignore:4197 \
8102 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
8103 $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS) \
8104 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
8105 /STUB:$(PATH_ROOT)/src/VBox/HostDrivers/Support/win/winstub.com
8106 if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_WINDOWS_KERNEL_CODE_SIGNING_CERT)
8107 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -IntegrityCheck
8108 endif
8109 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
8110 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -EmitVolatileMetadata:NO
8111 endif
8112 TEMPLATE_VBoxQtGuiExe_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8113 TEMPLATE_VBoxQtGuiExe_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8114
8115 TEMPLATE_VBoxQtGuiExe_SDKS += $(VBOX_WINPSDK)
8116 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8117 TEMPLATE_VBoxQtGuiExe_LATE_LIBS = \
8118 $(VBOX_LIBS_QT) \
8119 $(LIB_RUNTIME) \
8120 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/vcruntime$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8121 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8122 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8123 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \
8124 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib
8125 ifeq ($(KBUILD_TYPE),asan)
8126 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8127 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/clang_rt.asan_dynamic-x86_64.lib \
8128 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib
8129 endif
8130 else
8131 TEMPLATE_VBoxQtGuiExe_LATE_LIBS = \
8132 $(VBOX_LIBS_QT) \
8133 $(LIB_RUNTIME) \
8134 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8135 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt$(if-expr "$(VBOX_QT_DBG)" == "$(VBOX_VCC_CRT_TYPE)",$(VBOX_VCC_CRT_TYPE),).lib \
8136 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \
8137 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib
8138 endif
8139 TEMPLATE_VBoxQtGuiExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
8140 TEMPLATE_VBoxQtGuiExe_ORDERDEPS = $(VBOX_SIGN_IMAGE_CMDS_ORDERDEPS)
8141
8142 else # the gcc guys:
8143 TEMPLATE_VBoxQtGuiExe_TOOL = $(VBOX_GCC_TOOL)
8144 if $(VBOX_GCC_VERSION_CC) < 30400
8145 TEMPLATE_VBoxQtGuiExe_DEFS += RT_WITHOUT_PRAGMA_ONCE
8146 endif
8147 TEMPLATE_VBoxQtGuiExe_DEFS.linux = _REENTRANT
8148 TEMPLATE_VBoxQtGuiExe_DEFS.solaris = _REENTRANT
8149
8150 ## @todo Use VBOX_GCC_PEDANTIC_CXX?
8151 TEMPLATE_VBoxQtGuiExe_CXXFLAGS = \
8152 -g $(VBOX_GCC_pipe) $(filter-out -Wno-unused $(VBOX_GCC_Wno-unused-parameter),$(VBOX_GCC_WARN)) -frtti -fno-exceptions \
8153 -Wno-long-long -fshort-wchar -fno-strict-aliasing \
8154 $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_Wno-multistatement-macros) $(VBOX_GCC_Wno-ignored-qualifiers) \
8155 $(VBOX_GCC_Wno-return-type-c-linkage) $(VBOX_GCC_std) $(VBOX_GCC_IPRT_FMT_CHECK) $(VBOX_GCC_SANITIZER_FLAGS)
8156 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8157 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += $(VBOX_GCC_WERR)
8158 endif
8159 ifn1of ($(USERNAME), dsen serkan) # Bunch of stuff deprecated after 5.6.*. These guys knows how to deal with it. :)
8160 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += $(VBOX_GCC_Wno-deprecated-declarations)
8161 endif
8162 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -std=gnu++17
8163 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86 = -m32
8164 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64 = -m64
8165 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.linux = -pthread
8166 TEMPLATE_VBoxQtGuiExe_PCHFLAGS = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8167 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.x86 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86)
8168 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.amd64 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64)
8169 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.linux = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.linux)
8170 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.debug = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.debug)
8171 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.dbgopt)
8172 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) -fno-exceptions $(VBOX_GCC_IPRT_FMT_CHECK)
8173 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS.x86 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86)
8174 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64)
8175 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS = \
8176 -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) \
8177 -frtti -fno-exceptions $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_IPRT_FMT_CHECK)
8178 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8179 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS += $(VBOX_GCC_WERR)
8180 endif
8181 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS += -std=gnu++17
8182 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.x86)
8183 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.amd64)
8184 TEMPLATE_VBoxQtGuiExe_LDFLAGS = $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS)
8185 TEMPLATE_VBoxQtGuiExe_LDFLAGS.x86 = -m32
8186 TEMPLATE_VBoxQtGuiExe_LDFLAGS.amd64 = -m64
8187 TEMPLATE_VBoxQtGuiExe_LATE_LIBS = \
8188 $(VBOX_LIBS_QT) \
8189 $(LIB_RUNTIME)
8190
8191 ifeq ($(KBUILD_TARGET),linux)
8192 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -Wl,-z,noexecstack,-z,relro $(VBOX_LD_as_needed)
8193 TEMPLATE_VBOXQTGUIEXE_LDFLAGS += -Wl,-rpath,$(PATH_SDK_QT6_LIB)
8194 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8195 $(VBOX_XCURSOR_LIBS) \
8196 Xext \
8197 X11
8198 TEMPLATE_VBoxQtGuiExe_LIBPATH += \
8199 $(VBOX_LIBPATH_X11)
8200 else ifeq ($(KBUILD_TARGET),darwin)
8201 TEMPLATE_VBoxQtGuiExe_SDKS.darwin += $(VBOX_DARWIN_DEF_SDK_SDKS)
8202 TEMPLATE_VBoxQtGuiExe_DEFS.darwin += $(VBOX_DARWIN_DEF_SDK_DEFS)
8203 TEMPLATE_VBoxQtGuiExe_CFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_CFLAGS)
8204 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
8205 TEMPLATE_VBoxQtGuiExe_PCHFLAGS.darwin += $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS.darwin)
8206 TEMPLATE_VBoxQtGuiExe_OBJCFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
8207 TEMPLATE_VBoxQtGuiExe_OBJCXXFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS)
8208 TEMPLATE_VBoxQtGuiExe_LDFLAGS.darwin += $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -bind_at_load -Wl,-headerpad_max_install_names
8209 TEMPLATE_VBoxQtGuiExe_LATE_LIBS +=
8210 TEMPLATE_VBoxQtGuiExe_LIBPATH +=
8211 TEMPLATE_VBoxQtGuiExe_POST_CMDS.darwin = $(VBOX_SIGN_IMAGE_CMDS)
8212 else
8213 TEMPLATE_VBoxQtGuiExe_INCS += \
8214 $(VBOX_XCURSOR_INCS)
8215 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8216 $(VBOX_XCURSOR_LATE_LIBS) \
8217 Xext \
8218 X11 \
8219 m \
8220 $(LIB_PTHREAD)
8221 TEMPLATE_VBoxQtGuiExe_LIBPATH += \
8222 $(VBOX_LIBPATH_X11)
8223 ifeq ($(KBUILD_TARGET),freebsd)
8224 TEMPLATE_VBoxQtGuiExe_INCS += \
8225 /usr/include \
8226 /usr/X11R6/include \
8227 /usr/local/include
8228 TEMPLATE_VBoxQtGuiExe_LIBPATH += \
8229 /usr/lib \
8230 /usr/X11R6/lib \
8231 /usr/local/lib
8232 endif
8233 ifeq ($(KBUILD_TARGET),solaris)
8234 TEMPLATE_VBoxQtGuiExe_LDFLAGS.solaris = -Wl,-z,ignore # Same as VBOX_LD_as_needed.
8235 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8236 rt socket nsl
8237 endif
8238 endif
8239 # Assume the Qt shared objects are in the same directory as the executable, on Solaris too.
8240 ifdef VBOX_WITH_RUNPATH
8241 TEMPLATE_VBoxQtGuiExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
8242 else ifdef VBOX_WITH_RELATIVE_RUNPATH
8243 TEMPLATE_VBoxQtGuiExe_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)'
8244 endif
8245
8246 endif
8247
8248 # Add COM/XPCOM stuff
8249 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8250 $(PATH_STAGE_LIB)/VBoxCOM$(if-expr "$(VBOX_QT_DBG)" != "$(VBOX_VCC_CRT_TYPE)" && $(KBUILD_TARGET) == win,-GUI,)$(VBOX_SUFF_LIB)
8251 ifdef VBOX_WITH_XPCOM
8252 ## @todo may be worth creating the VBOX_XPCOM SDK def, or just a SDK_VBOXXPCOM.
8253 TEMPLATE_VBoxQtGuiExe_DEFS += VBOX_WITH_XPCOM
8254 ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
8255 TEMPLATE_VBoxQtGuiExe_DEFS += VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
8256 endif
8257 TEMPLATE_VBoxQtGuiExe_INCS += \
8258 $(VBOX_XPCOM_INCS)
8259 TEMPLATE_VBoxQtGuiExe_LATE_LIBS += \
8260 $(LIB_XPCOM)
8261 TEMPLATE_VBoxQtGuiExe_INTERMEDIATES += \
8262 $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
8263 else # COM
8264 TEMPLATE_VBoxQtGuiExe_INCS += \
8265 $(VBOX_PATH_SDK)/bindings/mscom/include
8266 TEMPLATE_VBoxQtGuiExe_INTERMEDIATES += \
8267 $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
8268 endif # COM
8269
8270 ifn1of ($(KBUILD_TARGET), darwin os2 win)
8271 TEMPLATE_VBoxQtGuiExe_DEFS += PIC
8272 TEMPLATE_VBoxQtGuiExe_CFLAGS += -fPIC
8273 TEMPLATE_VBoxQtGuiExe_CXXFLAGS += -fPIC
8274 # Needed for GCC 9. Even system's Qt 5.12.4 (on Ubuntu 19.10) did not have this fixed yet.
8275 TEMPLATE_VBoxQtGuiExe_CXXFLAGS.linux = $(VBOX_GCC_Wno-deprecated-copy) $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8276 TEMPLATE_VBoxQtGuiExe_LDFLAGS += -fPIC
8277 endif # not darwin, os2 or win
8278
8279 ifeq ($(KBUILD_TARGET),darwin)
8280 TEMPLATE_VBoxQtGuiExe_POST_CMDS = $(QUIET)install_name_tool $(foreach qtmod, $(VBOX_QT_MOD_NAMES), \
8281 $(foreach prefix, @executable_path/../Frameworks/ $(VBOX_PATH_QT)/Frameworks/ $(PATH_SDK_QT6)/, \
8282 -change "$(prefix)$(qtmod).framework/Versions/A/$(qtmod)" \
8283 "$(if $(VBOX_WITH_HARDENING),/Applications/VirtualBox.app/Contents/Frameworks,@rpath)/$(qtmod).framework/Versions/A/$(qtmod)" ) ) "$(out)"
8284 endif
8285
8286 #
8287 # Variant of VBoxQtGuiExe for building VM processes that needs to be signed in
8288 # the minimal hardening configuration on windows.
8289 #
8290 TEMPLATE_VBoxQtGuiSignedExe = VBox Qt GUI VM Executable, signed on windows for using VBoxSup.sys.
8291 TEMPLATE_VBoxQtGuiSignedExe_EXTENDS = VBoxQtGuiExe
8292 if "$(KBUILD_TARGET)" == "win" && "$(VBOX_SIGNING_MODE)" == "test"
8293 TEMPLATE_VBoxQtGuiSignedExe_POST_CMDS = $(VBOX_UTF8_MANIFEST_CMDS)$(NLTAB)$(call VBOX_SIGN_IMAGE_FN,$(out),,2)
8294 endif
8295
8296 #
8297 # Template for building Qt GUI components.
8298 #
8299 TEMPLATE_VBoxQtGuiDll = VBox Qt GUI Components
8300 TEMPLATE_VBoxQtGuiDll_EXTENDS = VBoxQtGuiExe
8301 TEMPLATE_VBoxQtGuiDll_LATE_LIBS = $(filter-out $(QTMAIN),$(TEMPLATE_VBoxQtGuiExe_LATE_LIBS))
8302 ifeq ($(KBUILD_TARGET),darwin)
8303 TEMPLATE_VBoxQtGuiDll_LDFLAGS.darwin += $(filter-out -bind_at_load,$(TEMPLATE_VBoxQtGuiExe_LDFLAGS.darwin)) \
8304 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
8305 -compatibility_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
8306 endif
8307 ifn1of ($(KBUILD_TARGET), darwin os2 win)
8308 TEMPLATE_VBoxQtGuiDll_DEFS = PIC $(TEMPLATE_VBoxQtGuiExe_DEFS)
8309 TEMPLATE_VBoxQtGuiDll_CFLAGS = -fPIC $(TEMPLATE_VBoxQtGuiExe_CFLAGS)
8310 TEMPLATE_VBoxQtGuiDll_CXXFLAGS = -fPIC $(TEMPLATE_VBoxQtGuiExe_CXXFLAGS)
8311 TEMPLATE_VBoxQtGuiDll_PCHFLAGS = $(TEMPLATE_VBoxQtGuiDll_CXXFLAGS)
8312 TEMPLATE_VBoxQtGuiDll_LDFLAGS = -fPIC $(TEMPLATE_VBoxQtGuiExe_LDFLAGS)
8313 endif
8314endif # VBOX_WITH_QTGUI
8315
8316ifdef VBOX_WITH_NLS
8317 #
8318 # Template for translation compilation.
8319 # Made as simple program without installing itself.
8320 # To archive it, the dummy code without runtime is used,
8321 # i.e. only compiler and system standard libs are linked.
8322 #
8323 TEMPLATE_VBoxNLS = VBox NLS template for installing translation files
8324 TEMPLATE_VBoxNLS_EXTENDS = VBoxR3Static
8325 TEMPLATE_VBoxNLS_USES := qt6
8326 TEMPLATE_VBoxNLS_QTTOOL := QT6
8327 TEMPLATE_VBoxNLS_QT_INFIX = $(VBOX_QT_INFIX)
8328 TEMPLATE_VBoxNLS_INSTTYPE = none
8329 TEMPLATE_VBoxNLS_LRCFLAGS += -silent
8330 TEMPLATE_VBoxNLS_QT_TRANSLATIONS_INST = $(INST_BIN)nls/
8331 TEMPLATE_VBoxNLS_SOURCES = \
8332 $(PATH_ROOT)/src/VBox/Main/nls/dummy.c
8333 TEMPLATE_VBoxNLS_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_VBoxR3Static_SDKS.$(KBUILD_TARGET_ARCH)))
8334 ifdef VBOX_WITH_NOCRT_STATIC
8335 TEMPLATE_VBoxNLS_LATE_LIBS.$(KBUILD_TARGET_ARCH) = $(filter-out \
8336 $(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB), \
8337 $(TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH)))
8338 else
8339 TEMPLATE_VBoxNLS_LATE_LIBS.$(KBUILD_TARGET_ARCH) = $(filter-out \
8340 $(VBOX_LIB_RUNTIME_STATIC) \
8341 $(PATH_STAGE_LIB)/VBox-libxml2-static$(VBOX_SUFF_LIB), \
8342 $(TEMPLATE_VBoxR3Static_LATE_LIBS.$(KBUILD_TARGET_ARCH)))
8343 endif
8344endif # !VBOX_WITH_NLS
8345
8346
8347#
8348# Template for installing symbol files that we wish to ship.
8349#
8350TEMPLATE_VBoxDbgSyms = Symbol files for VBoxDbg and gurus.
8351TEMPLATE_VBoxDbgSyms_INST = $(INST_VBOXDBG_SYMS)
8352
8353
8354#
8355# Template for building build bldprogs.
8356# HACK ALERT! The BLD_TRG_* is a hack to allow building libraries as well.
8357#
8358TEMPLATE_VBoxBldProg = VBox Build Program
8359TEMPLATE_VBoxBldProg_BLD_TRG := $(KBUILD_HOST)
8360TEMPLATE_VBoxBldProg_BLD_TRG_ARCH := $(KBUILD_HOST_ARCH)
8361TEMPLATE_VBoxBldProg_BLD_TRG_CPU := $(KBUILD_HOST_CPU)
8362TEMPLATE_VBoxBldProg_DEFS := IN_RING3 LOG_DISABLED IN_BLD_PROG
8363TEMPLATE_VBoxBldProg_DEFS.win := _CRT_SECURE_NO_DEPRECATE
8364TEMPLATE_VBoxBldProg_ASTOOL.$(KBUILD_HOST).$(KBUILD_HOST_ARCH) := $(VBOX_ASTOOL.$(KBUILD_HOST).$(KBUILD_HOST_ARCH))
8365TEMPLATE_VBoxBldProg_ASFLAGS.$(KBUILD_HOST).$(KBUILD_HOST_ARCH) = $(VBOX_ASFLAGS.$(KBUILD_HOST).$(KBUILD_HOST_ARCH))
8366ifeq ($(KBUILD_HOST),win)
8367 TEMPLATE_VBoxBldProg_TOOL := $(VBOX_VCC_TOOL_STEM)$(toupper $(KBUILD_HOST_ARCH))
8368 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8369 TEMPLATE_VBoxBldProg_SDKS := ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC $(VBOX_WINPSDK)
8370 else
8371 TEMPLATE_VBoxBldProg_SDKS := ReorderCompilerIncs $(VBOX_WINPSDK)
8372 endif
8373 TEMPLATE_VBoxBldProg_CXXFLAGS := -Zi -Zl -GR- -EHsc -GF $(VBOX_VCC_WCHAR_T_VARIANT) $(VBOX_VCC_OPT) $(VBOX_VCC_FP) \
8374 -MT$(VBOX_VCC_CRT_TYPE) -Gy $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_std) $(VBOX_VCC_WARN_ALL) $(VBOX_VCC_WERR)
8375 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120"
8376 TEMPLATE_VBoxBldProg_CXXFLAGS += -Gw
8377 endif
8378 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140" # Reduces object size, speeding up linking and makes inline behaviour C++11 compliant.
8379 TEMPLATE_VBoxBldProg_CXXFLAGS += -Zc:inline
8380 endif
8381 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
8382 TEMPLATE_VBoxBldProg_CXXFLAGS += /volatileMetadata-
8383 endif
8384 ifdef VBOX_WITH_MSC_ANALYZE_THIS
8385 TEMPLATE_VBoxBldProg_CXXFLAGS += /analyze
8386 endif
8387 TEMPLATE_VBoxBldProg_CXXFLAGS.debug := -RTCsu
8388 TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt = $(NO_SUCH_VARIABLE)
8389 TEMPLATE_VBoxBldProg_CXXFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8390 TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8391 TEMPLATE_VBoxBldProg_CFLAGS = $(filter-out $(VBOX_VCC_std),$(TEMPLATE_VBoxBldProg_CXXFLAGS))
8392 TEMPLATE_VBoxBldProg_CFLAGS.debug = $(TEMPLATE_VBoxBldProg_CXXFLAGS.debug)
8393 TEMPLATE_VBoxBldProg_CFLAGS.dbgopt = $(TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt)
8394 TEMPLATE_VBoxBldProg_CFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8395 TEMPLATE_VBoxBldProg_CFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8396 TEMPLATE_VBoxBldProg_CFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8397 TEMPLATE_VBoxBldProg_PCHFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
8398 TEMPLATE_VBoxBldProg_PCHFLAGS.debug = $(TEMPLATE_VBoxBldProg_CXXFLAGS.debug)
8399 TEMPLATE_VBoxBldProg_PCHFLAGS.dbgopt = $(TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt)
8400 TEMPLATE_VBoxBldProg_PCHFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8401 TEMPLATE_VBoxBldProg_PCHFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8402 TEMPLATE_VBoxBldProg_PCHFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8403 TEMPLATE_VBoxBldProg_LDFLAGS = -Ignore:4197 \
8404 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug /Opt:Ref /Opt:Icf \
8405 $(VBOX_VCC_LD_GUARD_CF) \
8406 /Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
8407 /DISALLOWLIB:libc$(VBOX_VCC_CRT_TYPE_N).lib \
8408 /DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE_N).lib \
8409 /DISALLOWLIB:msvcrt.lib \
8410 /DISALLOWLIB:msvcrtd.lib \
8411 /DISALLOWLIB:msvcprt.lib \
8412 /DISALLOWLIB:msvcprtd.lib \
8413 /DISALLOWLIB:libvcruntime$(VBOX_VCC_CRT_TYPE_N).lib \
8414 /DISALLOWLIB:libucrt$(VBOX_VCC_CRT_TYPE_N).lib \
8415 /DISALLOWLIB:vcruntime.lib \
8416 /DISALLOWLIB:vcruntimed.lib \
8417 /DISALLOWLIB:ucrt.lib \
8418 /DISALLOWLIB:ucrtd.lib
8419 TEMPLATE_VBoxBldProg_LDFLAGS.win.amd64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8420 TEMPLATE_VBoxBldProg_LDFLAGS.win.arm64 = $(VBOX_VCC_LD_HIGH_ENTRYOPY_VA)
8421 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC142" # Don't waste space on x86/amd64-on-arm emulation optimizations.
8422 TEMPLATE_VBoxBldProg_LDFLAGS += -EmitVolatileMetadata:NO
8423 endif
8424 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8425 TEMPLATE_VBoxBldProg_LATE_LIBS = \
8426 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libvcruntime$(VBOX_VCC_CRT_TYPE).lib \
8427 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
8428 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib \
8429 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/oldnames.lib
8430 else
8431 TEMPLATE_VBoxBldProg_LATE_LIBS = \
8432 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/oldnames.lib \
8433 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
8434 $(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
8435 endif
8436
8437else
8438 # (gcc of some kind )
8439 TEMPLATE_VBoxBldProg_TOOL = GXX3
8440 if $(VBOX_GCC_VERSION_CC) < 30400
8441 TEMPLATE_VBoxBldProg_DEFS += RT_WITHOUT_PRAGMA_ONCE
8442 endif
8443 TEMPLATE_VBoxBldProg_CFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros)
8444 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8445 TEMPLATE_VBoxBldProg_CFLAGS += $(VBOX_GCC_WERR)
8446 endif
8447 TEMPLATE_VBoxBldProg_CFLAGS.x86 = -m32
8448 TEMPLATE_VBoxBldProg_CFLAGS.sparc32 = -m32
8449 TEMPLATE_VBoxBldProg_CFLAGS.amd64 = -m64
8450 TEMPLATE_VBoxBldProg_CFLAGS.sparc64 = -m64
8451 TEMPLATE_VBoxBldProg_CFLAGS.release = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
8452 TEMPLATE_VBoxBldProg_CFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8453 TEMPLATE_VBoxBldProg_CFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8454 TEMPLATE_VBoxBldProg_CXXFLAGS = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros) $(VBOX_GCC_std)
8455 ifdef VBOX_WITH_NO_GCC_WARNING_POLICY
8456 TEMPLATE_VBoxBldProg_CXXFLAGS += $(VBOX_GCC_WERR)
8457 endif
8458 TEMPLATE_VBoxBldProg_CXXFLAGS.x86 = -m32
8459 TEMPLATE_VBoxBldProg_CXXFLAGS.sparc32 = -m32
8460 TEMPLATE_VBoxBldProg_CXXFLAGS.amd64 = -m64
8461 TEMPLATE_VBoxBldProg_CXXFLAGS.sparc64 = -m64
8462 TEMPLATE_VBoxBldProg_CXXFLAGS.release = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
8463 TEMPLATE_VBoxBldProg_CXXFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8464 TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8465 TEMPLATE_VBoxBldProg_OBJCFLAGS = $(TEMPLATE_VBoxBldProg_CFLAGS)
8466 TEMPLATE_VBoxBldProg_OBJCFLAGS.x86 = $(TEMPLATE_VBoxBldProg_CFLAGS.x86)
8467 TEMPLATE_VBoxBldProg_OBJCFLAGS.amd64 = $(TEMPLATE_VBoxBldProg_CFLAGS.amd64)
8468 TEMPLATE_VBoxBldProg_OBJCFLAGS.release = $(TEMPLATE_VBoxBldProg_CFLAGS.release)
8469 TEMPLATE_VBoxBldProg_OBJCFLAGS.profile = $(TEMPLATE_VBoxBldProg_CFLAGS.profile)
8470 TEMPLATE_VBoxBldProg_OBJCFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CFLAGS.kprofile)
8471 TEMPLATE_VBoxBldProg_OBJCXXFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
8472 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.x86 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.x86)
8473 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.amd64 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.amd64)
8474 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8475 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8476 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8477 TEMPLATE_VBoxBldProg_PCHFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
8478 TEMPLATE_VBoxBldProg_PCHFLAGS.x86 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.x86)
8479 TEMPLATE_VBoxBldProg_PCHFLAGS.amd64 = $(TEMPLATE_VBoxBldProg_CXXFLAGS.amd64)
8480 TEMPLATE_VBoxBldProg_PCHFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
8481 TEMPLATE_VBoxBldProg_PCHFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
8482 TEMPLATE_VBoxBldProg_PCHFLAGS.kprofile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
8483 TEMPLATE_VBoxBldProg_LDFLAGS.x86 = -m32
8484 TEMPLATE_VBoxBldProg_LDFLAGS.sparc32 = -m32
8485 TEMPLATE_VBoxBldProg_LDFLAGS.amd64 = -m64
8486 TEMPLATE_VBoxBldProg_LDFLAGS.sparc64 = -m64
8487 ifeq ($(KBUILD_HOST),linux)
8488 TEMPLATE_VBoxBldProg_LATE_LIBS = pthread m rt dl
8489 else ifeq ($(KBUILD_HOST),os2)
8490 TEMPLATE_VBoxBldProg_TOOL = GXX3OMF
8491 TEMPLATE_VBoxBldProg_LATE_LIBS = socket iconv
8492 else ifeq ($(KBUILD_HOST),darwin)
8493 TEMPLATE_VBoxBldProg_TOOL = $(VBOX_GCC_TOOL)
8494 if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.7" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "7"
8495 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_DEFS)
8496 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_CFLAGS) -fno-common
8497 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS)
8498 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS)
8499 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8500 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8501 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS)
8502 else if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.6" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "6"
8503 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_DEFS)
8504 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_CFLAGS) -fno-common
8505 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS)
8506 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS)
8507 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8508 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8509 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS)
8510 else if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.5" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "5" || defined(VBOX_MACOS_10_5_WORKAROUND)
8511 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_DEFS)
8512 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_CFLAGS) -fno-common
8513 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS)
8514 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS)
8515 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8516 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8517 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_10_5_LDFLAGS)
8518 else
8519 TEMPLATE_VBoxBldProg_SDKS.darwin = $(VBOX_DARWIN_DEF_SDK_SDKS)
8520 TEMPLATE_VBoxBldProg_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_DEFS)
8521 TEMPLATE_VBoxBldProg_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
8522 TEMPLATE_VBoxBldProg_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
8523 TEMPLATE_VBoxBldProg_PCHFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
8524 TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
8525 TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
8526 TEMPLATE_VBoxBldProg_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
8527 endif
8528 TEMPLATE_VBoxBldProg_LATE_LIBS =
8529 else ifeq ($(KBUILD_HOST),haiku)
8530 TEMPLATE_VBoxBldProg_TOOL = GXX3
8531 TEMPLATE_VBoxBldProg_LATE_LIBS = network iconv
8532 TEMPLATE_VBoxBldProg_LIBPATH += \
8533 /boot/common/lib
8534 else if1of ($(KBUILD_HOST), freebsd openbsd)
8535 TEMPLATE_VBoxBldProg_TOOL = $(VBOX_GCC_TOOL)
8536 TEMPLATE_VBoxBldProg_LATE_LIBS = pthread
8537 TEMPLATE_VBoxBldProg_INCS += \
8538 /usr/include \
8539 /usr/X11R6/include \
8540 /usr/local/include
8541 TEMPLATE_VBoxBldProg_LIBPATH += \
8542 /usr/lib \
8543 /usr/X11R6/lib \
8544 /usr/local/lib
8545 else ifeq ($(KBUILD_HOST),netbsd)
8546 TEMPLATE_VBoxBldProg_TOOL = GXX3
8547 TEMPLATE_VBoxBldProg_LATE_LIBS = pthread
8548 TEMPLATE_VBoxBldProg_INCS += \
8549 /usr/include \
8550 /usr/X11R7/include
8551 TEMPLATE_VBoxBldProg_LIBPATH += \
8552 /usr/lib \
8553 /usr/X11R7/lib
8554 else ifeq ($(KBUILD_HOST),solaris)
8555 TEMPLATE_VBoxBldProg_TOOL = GXX3PLAIN
8556 TEMPLATE_VBoxBldProg_LATE_LIBS = rt
8557 else
8558 $(warning Warning: VBOX Build: Target $(KBUILD_HOST) is not officially supported!)
8559 endif
8560
8561endif # !win
8562
8563
8564#
8565# Advanced build programs using IPRT and stuff.
8566#
8567TEMPLATE_VBoxAdvBldProg = Advanced VBox Build Program
8568TEMPLATE_VBoxAdvBldProg_EXTENDS = VBoxBldProg
8569TEMPLATE_VBoxAdvBldProg_SDKS = $(TEMPLATE_VBoxBldProg_SDKS)
8570TEMPLATE_VBoxAdvBldProg_SDKS.win = $(TEMPLATE_VBoxBldProg_SDKS.win) VBoxNtDll
8571TEMPLATE_VBoxAdvBldProg_DEFS = $(TEMPLATE_VBoxBldProg_DEFS) IN_RT_R3 IN_ADV_BLD_PROG
8572ifeq ($(KBUILD_HOST),win)
8573 TEMPLATE_VBoxAdvBldProg_CFLAGS = $(TEMPLATE_VBoxBldProg_CFLAGS) $(VBOX_VCC_WERR)
8574 TEMPLATE_VBoxAdvBldProg_CXXFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS) $(VBOX_VCC_WERR)
8575 TEMPLATE_VBoxAdvBldProg_PCHFLAGS = $(TEMPLATE_VBoxAdvBldProg_CXXFLAGS)
8576endif
8577TEMPLATE_VBoxAdvBldProg_LDFLAGS.darwin.arm64 = \
8578 $(TEMPLATE_VBoxBldProg_LDFLAGS.darwin.arm64) -framework IOKit
8579TEMPLATE_VBoxAdvBldProg_LATE_LIBS = \
8580 $(PATH_STAGE_LIB)/RuntimeBldProg$(VBOX_HOSTSUFF_LIB) \
8581 $(TEMPLATE_VBoxBldProg_LATE_LIBS)
8582TEMPLATE_VBoxAdvBldProg_LATE_LIBS.darwin = \
8583 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8584 iconv \
8585 $(TEMPLATE_VBoxBldProg_LATE_LIBS.darwin)
8586TEMPLATE_VBoxAdvBldProg_LATE_LIBS.freebsd = \
8587 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8588 iconv \
8589 rt \
8590 $(TEMPLATE_VBoxBldProg_LATE_LIBS.freebsd)
8591TEMPLATE_VBoxAdvBldProg_LATE_LIBS.linux = \
8592 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8593 $(TEMPLATE_VBoxBldProg_LATE_LIBS.linux)
8594TEMPLATE_VBoxAdvBldProg_LATE_LIBS.solaris = \
8595 $(TEMPLATE_VBoxAdvBldProg_LATE_LIBS) \
8596 contract \
8597 kstat \
8598 rt \
8599 socket \
8600 nsl \
8601 $(TEMPLATE_VBoxBldProg_LATE_LIBS.solaris)
8602
8603
8604#
8605# Windows rc workaround for crosscompiling.
8606# (Some (old) Wine versions fails loading msvcrt.dll from the VCC bin directory.)
8607#
8608ifneq ($(KBUILD_HOST),win)
8609 TOOL_VCC80X86_RC := $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/rc.exe
8610 TOOL_VCC80AMD64_RC := $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/rc.exe
8611 TOOL_VCC70_RC := $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/rc.exe
8612 WIN32_MC = $(EXEC_X86_WIN32) $(KBUILD_DEVTOOLS)/win.x86/bin/mc.exe
8613else
8614 WIN32_MC = $(EXEC_X86_WIN32) $(firstword $(wildcard \
8615 $(PATH_SDK_$(VBOX_WINPSDK)_BIN)/MC.Exe \
8616 $(PATH_SDK_WINPSDK_BIN)/MC.Exe \
8617 $(PATH_SDK_WINPSDK)/Bin/MC.Exe \
8618 $(PATH_SDK_WIN32SDK_BIN)/MC.Exe \
8619 $(PATH_SDK_WIN64SDK_BIN)/MC.Exe \
8620 $(KBUILD_DEVTOOLS)/win.x86/bin/mc.exe \
8621 ) Sorry_Cannot_find_mc_in_the_PSDK)
8622endif
8623
8624
8625#
8626# Base template for building R3 programs for the guest additions.
8627# Do _note_ use directly!
8628#
8629## @todo bake it into VBoxGuestR3Exe.
8630TEMPLATE_VBoxGuestR3ExeBase = VBox Guest Program
8631ifeq ($(KBUILD_TARGET),win)
8632 TEMPLATE_VBoxGuestR3ExeBase_EXTENDS = VBoxR3StaticBase
8633 if "$(VBOX_VCC_TOOL_STEM)" >= "VCC140"
8634 ifdef VBOX_WITH_NOCRT_STATIC
8635 TEMPLATE_VBoxGuestR3ExeBase_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK_GST) VBoxNtDll
8636 else
8637 TEMPLATE_VBoxGuestR3ExeBase_SDKS = ReorderCompilerIncs WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC $(VBOX_WINPSDK_GST) VBoxNtDll
8638 endif
8639 else
8640 TEMPLATE_VBoxGuestR3ExeBase_SDKS = ReorderCompilerIncs $(VBOX_WINPSDK_GST) VBoxNtDll
8641 endif
8642 # Hack for running on NT3x, NT4, W2K and XP w/o SP:
8643 # 1. Change OS and subsystem version in the image.
8644 # 2. NT 3.1 requires the IAT to be writable. To avoid making all of .rdata
8645 # writable we use the undocumented -NoOptIData option to prevent .idata$*
8646 # from being merged into .rdata.
8647 # 3. NT 3.1 doesn't support merging initialized and uninitialized section
8648 # because it doesn't recognize Misc.VirtualSize. So, we set the uncached
8649 # flag (!K) on the .bss section make it incompatible with .data.
8650 # VBOX_PE_SET_VERSION will clear the !K flag. (Not needed in no-CRT mode,
8651 # as the init code zeros uninitialized data there when running on NT 3.1.)
8652 # Similarly, for XP64 and 64-bit W2K3 we need to make sure the subsystem version
8653 # in the binaries are set to 5.2. The Visual C++ 2019 linker defaults to 6.0.
8654 # HACK ALERT! Double expansion of $$(NLTAB).
8655 TEMPLATE_VBoxGuestR3ExeBase_USES.win = $(TEMPLATE_VBoxR3StaticBase_USES.win) vboximportchecker vboxsetpeversion
8656 TEMPLATE_VBoxGuestR3ExeBase_VBOX_IMPORT_CHECKER.win.x86 = nt31
8657 TEMPLATE_VBoxGuestR3ExeBase_VBOX_IMPORT_CHECKER.win.amd64 = xp64
8658 TEMPLATE_VBoxGuestR3ExeBase_VBOX_IMPORT_CHECKER.win.arm64 = w10-1709
8659 TEMPLATE_VBoxGuestR3ExeBase_VBOX_SET_PE_VERSION.win.x86 = default
8660 TEMPLATE_VBoxGuestR3ExeBase_VBOX_SET_PE_VERSION.win.amd64 = default
8661 TEMPLATE_VBoxGuestR3ExeBase_VBOX_SET_PE_VERSION.win.arm64 = default
8662 ifdef VBOX_WITH_NOCRT_STATIC
8663 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.win.x86 = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS.win.x86) -NoOptIData
8664 else
8665 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.win.x86 = -NoOptIData -Section:.bss,RW!K $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS.win.x86)
8666 endif
8667
8668 if defined(VBOX_WITH_MORE_NT4_COMPAT_BINARIES) && "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86"
8669 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.win.x86 = $(NO_SUCH_VARIABLE)# Ditch RuntimeR3VccTricks2
8670 endif
8671
8672else # the gcc guys
8673 TEMPLATE_VBoxGuestR3ExeBase_EXTENDS = VBoxR3Exe
8674 ifn1of ($(KBUILD_TARGET), darwin)
8675 TEMPLATE_VBoxGuestR3ExeBase_TOOL := $(subst GXX,GCC,$(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_TOOL))
8676 endif
8677 TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_CXXFLAGS) -fno-exceptions -fno-rtti
8678 # Do not inherit sanitizer flags from VBoxR3Exe in guest executables. Deal with them separately.
8679 TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS.debug = $(NO_SUCH_VARIABLE)
8680 TEMPLATE_VBoxGuestR3ExeBase_CFLAGS.debug = $(NO_SUCH_VARIABLE)
8681 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.linux = $(filter-out $(VBOX_GCC_ORIGIN_OPT),$(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS.linux))
8682 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.debug = $(NO_SUCH_VARIABLE)
8683 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)%,$(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LDFLAGS))
8684 ifn1of ($(KBUILD_TARGET), darwin os2) # ELF only. Present in gcc 3.2.3 & binutils 2.15, possibly earlier.
8685 ifdef VBOX_LD_gc_sections # Older solaris linker versions doesn't grok --gc-sections (e.g. add build box).
8686 TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS += -ffunction-sections -fdata-sections
8687 TEMPLATE_VBoxGuestR3ExeBase_CFLAGS += -ffunction-sections -fdata-sections
8688 TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS += $(VBOX_LD_gc_sections)
8689 endif
8690 endif
8691endif
8692TEMPLATE_VBoxGuestR3ExeBase_INST = $(INST_ADDITIONS)
8693TEMPLATE_VBoxGuestR3ExeBase_DEFS := \
8694 $(filter-out $(ARCH_BITS_DEFS) VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R3, $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_DEFS)) \
8695 IN_GUEST \
8696 IN_GUEST_R3 \
8697 IN_RT_R3 \
8698 IN_RT_STATIC \
8699 $(VBOX_GC_ARCH_BITS_DEFS) \
8700 RT_NEED_NEW_AND_DELETE
8701ifeq ($(KBUILD_TARGET),linux) # As few libs as possible on linux.
8702 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS = pthread rt m dl
8703else if1of ($(KBUILD_TARGET), darwin freebsd openbsd)
8704 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LATE_LIBS) iconv
8705else ifeq ($(KBUILD_TARGET),solaris)
8706 TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS = $(TEMPLATE_$(TEMPLATE_VBoxGuestR3ExeBase_EXTENDS)_LATE_LIBS) nsl
8707endif
8708
8709# Use older versions of APIs which were improved in versions of glibc later
8710# than what we are targetting, and do not use the stack protector, which
8711# needs glibc 2.4 or later.
8712TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS.linux = \
8713 -include $(PATH_ROOT)/include/iprt/linux/symvers.h \
8714 $(VBOX_GCC_fno-stack-protector)
8715TEMPLATE_VBoxGuestR3ExeBase_CFLAGS.linux = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS.linux)
8716# The GNU_HASH ELF tag is not supported by older systems.
8717TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.linux += $(VBOX_LD_hash_style_sysv)
8718
8719
8720#
8721# Template for building normal R3 programs for the guest additions, strict.
8722#
8723TEMPLATE_VBoxGuestR3Exe = VBox Guest Program w/ IPRT and VBGL.
8724TEMPLATE_VBoxGuestR3Exe_EXTENDS := VBoxGuestR3ExeBase
8725ifeq ($(KBUILD_TARGET),win)
8726 TEMPLATE_VBoxGuestR3Exe_CFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS) $(VBOX_VCC_WERR)
8727 TEMPLATE_VBoxGuestR3Exe_CXXFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS) $(VBOX_VCC_WERR)
8728 if1of ($(VBOX_VCC_TOOL_STEM), VCC120)
8729 # VBoxDrvInst.cpp(520) : warning C4313: 'wprintf' : '%d' in format string conflicts with argument 1 of type 'const TCHAR *' [false positive - buggy compiler?]
8730 TEMPLATE_VBoxGuestR3Exe_CXXFLAGS += -wd4313
8731 endif
8732 TEMPLATE_VBoxGuestR3Exe_LDFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS) $(VBOX_VCC_LD_WERR)
8733 ifndef VBOX_WITH_NOCRT_STATIC # Temporary kludge to deal with some link order issues.
8734 TEMPLATE_VBoxGuestR3Exe_LDFLAGS.win.x86 = $(TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS.win.x86) -Include:_vcc100_kernel32_fakes_asm
8735 endif
8736 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS.x86 = \
8737 $(VBOX_LIB_IPRT_GUEST_R3_X86) \
8738 $(VBOX_LIB_VBGL_R3_X86) \
8739 $(VBOX_LIB_IPRT_GUEST_R3_X86) \
8740 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.x86)
8741 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS.$(KBUILD_TARGET_ARCH) = \
8742 $(VBOX_LIB_IPRT_GUEST_R3) \
8743 $(VBOX_LIB_VBGL_R3) \
8744 $(VBOX_LIB_IPRT_GUEST_R3) \
8745 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.$(KBUILD_TARGET_ARCH))
8746else
8747 TEMPLATE_VBoxGuestR3Exe_CFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS) $(VBOX_GCC_WERR)
8748 TEMPLATE_VBoxGuestR3Exe_CXXFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS) $(VBOX_GCC_WERR)
8749 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS = \
8750 $(VBOX_LIB_IPRT_GUEST_R3) \
8751 $(VBOX_LIB_VBGL_R3) \
8752 $(VBOX_LIB_IPRT_GUEST_R3) \
8753 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS)
8754 ifeq ($(KBUILD_TARGET),solaris)
8755 TEMPLATE_VBoxGuestR3Exe_LATE_LIBS += contract
8756 endif
8757endif
8758
8759#
8760# Template for building R3 (dynamic) libraries for the guest additions, relaxed.
8761#
8762TEMPLATE_VBoxGuestR3DllNonPedantic := VBox Guest User Dynamic Libraries w/ IPRT and VBGL, non-pedantic.
8763TEMPLATE_VBoxGuestR3DllNonPedantic_EXTENDS := VBoxGuestR3ExeBase
8764## @todo add a INSTFUN that separates dlls and libs.
8765ifeq ($(KBUILD_TARGET),win)
8766 ifeq ($(KBUILD_TYPE),asan)
8767 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)))
8768 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)))
8769 endif
8770else ifn1of ($(KBUILD_TARGET), darwin os2 win)
8771 TEMPLATE_VBoxGuestR3DllNonPedantic_DEFS = $(TEMPLATE_VBoxGuestR3ExeBase_DEFS) PIC
8772 TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS) -fPIC
8773 TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS) -fPIC -fno-exceptions
8774 TEMPLATE_VBoxGuestR3DllNonPedantic_LDFLAGS = $(TEMPLATE_VBoxGuestR3ExeBase_LDFLAGS) -fPIC
8775endif
8776ifeq ($(KBUILD_TARGET),win)
8777 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS.x86 = \
8778 $(VBOX_LIB_IPRT_GUEST_R3_SHARED_X86) \
8779 $(VBOX_LIB_VBGL_R3_SHARED_X86) \
8780 $(VBOX_LIB_IPRT_GUEST_R3_SHARED_X86) \
8781 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.x86)
8782 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS.$(KBUILD_TARGET_ARCH) = \
8783 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8784 $(VBOX_LIB_VBGL_R3_SHARED) \
8785 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8786 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS.$(KBUILD_TARGET_ARCH))
8787else
8788 TEMPLATE_VBoxGuestR3DllNonPedantic_LATE_LIBS = \
8789 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8790 $(VBOX_LIB_VBGL_R3_SHARED) \
8791 $(VBOX_LIB_IPRT_GUEST_R3_SHARED) \
8792 $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS)
8793endif
8794
8795#
8796# Template for building normal R3 (dynamic) libraries for the guest additions, strict.
8797#
8798TEMPLATE_VBoxGuestR3Dll := VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8799TEMPLATE_VBoxGuestR3Dll_EXTENDS := VBoxGuestR3DllNonPedantic
8800ifeq ($(KBUILD_TARGET),win)
8801 TEMPLATE_VBoxGuestR3Dll_CFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS) $(VBOX_VCC_WERR)
8802 TEMPLATE_VBoxGuestR3Dll_CXXFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS) $(VBOX_VCC_WERR)
8803 TEMPLATE_VBoxGuestR3Dll_LDFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_LDFLAGS) $(VBOX_VCC_LD_WERR)
8804else
8805 TEMPLATE_VBoxGuestR3Dll_CFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS) $(VBOX_GCC_WERR)
8806 TEMPLATE_VBoxGuestR3Dll_CXXFLAGS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS) $(VBOX_GCC_WERR)
8807endif
8808
8809#
8810# Variant of VBoxGuestR3Dll that requires Windows 2000 or later for x86, and W2K3 for AMD64.
8811#
8812TEMPLATE_VBoxGuestR3DllMinW2K = VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8813TEMPLATE_VBoxGuestR3DllMinW2K_EXTENDS = VBoxGuestR3Dll
8814TEMPLATE_VBoxGuestR3DllMinW2K_VBOX_IMPORT_CHECKER.win.x86 = w2k
8815TEMPLATE_VBoxGuestR3DllMinW2K_VBOX_SET_PE_VERSION.win.x86 = w2k
8816ifeq ($(KBUILD_TARGET),win)
8817 ifdef VBOX_WITH_NOCRT_STATIC
8818 TEMPLATE_VBoxGuestR3DllMinW2K_LDFLAGS.win.x86 = $(filter-out -NoOptIData,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8819 else
8820 TEMPLATE_VBoxGuestR3DllMinW2K_LDFLAGS.win.x86 = $(filter-out -NoOptIData -Section:.bss$(COMMA)RW!K,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8821 endif
8822endif
8823
8824#
8825# Variant of VBoxGuestR3Dll that requires Windows Vista or later.
8826#
8827TEMPLATE_VBoxGuestR3DllMinVista = VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8828TEMPLATE_VBoxGuestR3DllMinVista_EXTENDS = VBoxGuestR3Dll
8829TEMPLATE_VBoxGuestR3DllMinVista_VBOX_IMPORT_CHECKER.win.x86 = vista
8830TEMPLATE_VBoxGuestR3DllMinVista_VBOX_IMPORT_CHECKER.win.amd64 = vista
8831TEMPLATE_VBoxGuestR3DllMinVista_VBOX_IMPORT_CHECKER.win.arm64 = w10-1709
8832TEMPLATE_VBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.x86 = vista
8833TEMPLATE_VBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.amd64 = vista
8834TEMPLATE_VBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.arm64 = w10
8835ifeq ($(KBUILD_TARGET),win)
8836 ifdef VBOX_WITH_NOCRT_STATIC
8837 TEMPLATE_VBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8838 else
8839 TEMPLATE_VBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData -Section:.bss$(COMMA)RW!K,$(TEMPLATE_VBoxGuestR3Dll_LDFLAGS.win.x86))
8840 endif
8841endif
8842
8843#
8844# Template for building normal R3 (dynamic) libraries for the guest additions with Visual C++ 2013 or later, strict.
8845#
8846TEMPLATE_NewerVccVBoxGuestR3Dll = VBoxGuestR3DllNonPedantic with the newer Visual C++ version (2013 or later).
8847TEMPLATE_NewerVccVBoxGuestR3Dll_EXTENDS = VBoxGuestR3DllNonPedantic
8848TEMPLATE_NewerVccVBoxGuestR3Dll_LATE_LIBS = $(TEMPLATE_VBoxGuestR3ExeBase_LATE_LIBS) # Not sure why this is here...
8849
8850#
8851# Variant of NewerVccVBoxGuestR3Dll that requires Windows Vista or later.
8852#
8853TEMPLATE_NewerVccVBoxGuestR3DllMinVista = NewerVccVBoxGuestR3Dll with the newer Visual C++ version (2013 or later).
8854TEMPLATE_NewerVccVBoxGuestR3DllMinVista_EXTENDS := NewerVccVBoxGuestR3Dll
8855TEMPLATE_NewerVccVBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.x86 := vista
8856TEMPLATE_NewerVccVBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.amd64 := vista
8857TEMPLATE_NewerVccVBoxGuestR3DllMinVista_VBOX_SET_PE_VERSION.win.arm64 := w10
8858ifeq ($(KBUILD_TARGET),win)
8859 ifdef VBOX_WITH_NOCRT_STATIC
8860 TEMPLATE_NewerVccVBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData,$(TEMPLATE_NewerVccVBoxGuestR3Dll_LDFLAGS.win.x86))
8861 else
8862 TEMPLATE_NewerVccVBoxGuestR3DllMinVista_LDFLAGS.win.x86 = $(filter-out -NoOptIData -Section:.bss$(COMMA)RW!K,$(TEMPLATE_NewerVccVBoxGuestR3Dll_LDFLAGS.win.x86))
8863 endif
8864endif
8865
8866#
8867# Template for building R3 (static) libraries for the guest additions, strict.
8868#
8869TEMPLATE_VBoxGuestR3Lib := VBox Guest User Dynamic Libraries w/ IPRT and VBGL.
8870TEMPLATE_VBoxGuestR3Lib_EXTENDS := VBoxGuestR3ExeBase
8871TEMPLATE_VBoxGuestR3Lib_EXTENDS_BY := appending
8872TEMPLATE_VBoxGuestR3Lib_INST = $(INST_ADDITIONS_LIB)
8873ifeq ($(KBUILD_TARGET),win)
8874 TEMPLATE_VBoxGuestR3Lib_CFLAGS += $(VBOX_VCC_WERR)
8875 TEMPLATE_VBoxGuestR3Lib_CXXFLAGS += $(VBOX_VCC_WERR)
8876 TEMPLATE_VBoxGuestR3Lib_LDFLAGS += $(VBOX_VCC_LD_WERR)
8877else
8878 TEMPLATE_VBoxGuestR3Lib_CFLAGS += $(VBOX_GCC_WERR)
8879 TEMPLATE_VBoxGuestR3Lib_CXXFLAGS += $(VBOX_GCC_WERR)
8880endif
8881
8882
8883#
8884# Guest version of VBoxR3StaticNoCrtExe.
8885#
8886TEMPLATE_VBoxGuestR3NoCrtExe := ...
8887TEMPLATE_VBoxGuestR3NoCrtExe_EXTENDS := VBoxGuestR3Exe
8888TEMPLATE_VBoxGuestR3NoCrtExe_SDKS = $(subst WINSDK10-UCRT$(VBOX_VCC_CRT_TYPE_UPPER)-STATIC,WINSDK10-UCRT-INCS, $(TEMPLATE_VBoxGuestR3Exe_SDKS))
8889TEMPLATE_VBoxGuestR3NoCrtExe_SDKS.$(KBUILD_TARGET_ARCH) = $(filter-out VBoxOpenSslStatic,$(TEMPLATE_VBoxGuestR3Exe_SDKS.$(KBUILD_TARGET_ARCH)))
8890TEMPLATE_VBoxGuestR3NoCrtExe_DEFS = $(TEMPLATE_VBoxGuestR3Exe_DEFS) \
8891 RT_NO_CRT \
8892 IN_RT_STATIC
8893ifndef VBOX_WITH_NOCRT_STATIC
8894 TEMPLATE_VBoxGuestR3NoCrtExe_DEFS.win = $(TEMPLATE_VBoxGuestR3Exe_DEFS.win) \
8895 RT_WITHOUT_NOCRT_WRAPPERS
8896endif
8897TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS = \
8898 $(PATH_STAGE_LIB)/RuntimeR3NoCrt$(VBOX_SUFF_LIB)
8899ifeq ($(KBUILD_TARGET),win)
8900 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.x86 = $(NO_SUCH_VARIABLE)
8901 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.amd64 = $(NO_SUCH_VARIABLE)
8902 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.win = $(NO_SUCH_VARIABLE)
8903 TEMPLATE_VBoxGuestR3NoCrtExe_LATE_LIBS.win.x86 = \
8904 $(PATH_TOOL_$(TEMPLATE_VBoxGuestR3NoCrtExe_TOOL.win.x86)_LIB)/chkstk.obj
8905 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS = $(NO_SUCH_VARIABLE) # These four aren't necessary, just being careful.
8906 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS.x86 = $(NO_SUCH_VARIABLE)
8907 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS.amd64 = $(NO_SUCH_VARIABLE)
8908 TEMPLATE_VBoxGuestR3NoCrtExe_LIBS.win = $(NO_SUCH_VARIABLE)
8909 TEMPLATE_VBoxGuestR3NoCrtExe_LDFLAGS = $(filter-out $(VBOX_VCC_LD_GUARD_CF) $(VBOX_VCC_SANITIZER_LDFLAGS), $(TEMPLATE_VBoxGuestR3Exe_LDFLAGS))
8910 TEMPLATE_VBoxGuestR3NoCrtExe_LDFLAGS.win.x86 = $(filter-out -Include%, $(TEMPLATE_VBoxGuestR3Exe_LDFLAGS.win.x86))
8911 TEMPLATE_VBoxGuestR3NoCrtExe_LDFLAGS.win = $(TEMPLATE_VBoxGuestR3Exe_LDFLAGS.win) /entry:CustomMainEntrypoint /subsystem:console
8912 TEMPLATE_VBoxGuestR3NoCrtExe_CFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3Exe_CFLAGS)) /GS- -EHs-
8913 TEMPLATE_VBoxGuestR3NoCrtExe_CXXFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3Exe_CXXFLAGS)) /GS- -EHs-
8914 TEMPLATE_VBoxGuestR3NoCrtExe_PCHFLAGS = $(filter-out -EH% -GS $(VBOX_VCC_CC_GUARD_CF) $(VBOX_VCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3Exe_PCHFLAGS)) /GS- -EHs-
8915 TEMPLATE_VBoxGuestR3NoCrtExe_CXXFLAGS.debug = $(filter-out /RTC% -RTC%, $(TEMPLATE_VBoxGuestR3Exe_CXXFLAGS.debug))
8916else
8917 TEMPLATE_VBoxGuestR3NoCrtExe_CXXFLAGS = $(TEMPLATE_VBoxGuestR3Exe_CXXFLAGS) -fno-exceptions
8918 TEMPLATE_VBoxGuestR3NoCrtExe_PCHFLAGS = $(TEMPLATE_VBoxGuestR3Exe_PCHFLAGS) -fno-exceptions
8919endif
8920
8921
8922#
8923# Template for XFree86 guest modules (relocatable module, i.e. sysmod).
8924# This mostly about zapping the VBoxR3Exe linker flags and libraries.
8925#
8926TEMPLATE_VBoxGuestR3XFree86Mod := VBox XFree86 Guest Module
8927TEMPLATE_VBoxGuestR3XFree86Mod_EXTENDS := VBoxGuestR3ExeBase
8928TEMPLATE_VBoxGuestR3XFree86Mod_SYSSUFF := .o
8929TEMPLATE_VBoxGuestR3XFree86Mod_DEFS = $(TEMPLATE_VBoxGuestR3ExeBase_DEFS) VBOX_GUESTR3XF86MOD RTMEM_NO_WRAP_TO_EF_APIS
8930TEMPLATE_VBoxGuestR3XFree86Mod_CFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3ExeBase_CFLAGS)) \
8931 -fno-pie -fno-merge-constants -std=c99 -ffreestanding
8932TEMPLATE_VBoxGuestR3XFree86Mod_CXXFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3ExeBase_CXXFLAGS)) \
8933 -fno-pie -fno-merge-constants -ffreestanding
8934TEMPLATE_VBoxGuestR3XFree86Mod_CFLAGS.linux = $(VBOX_GCC_fno-stack-protector) # Remove symvers.h
8935TEMPLATE_VBoxGuestR3XFree86Mod_CXXFLAGS.linux = $(VBOX_GCC_fno-stack-protector) # Remove symvers.h
8936TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8937# The GNU_HASH ELF tag is not supported by older glibc dynamic linkers.
8938TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.linux = $(subst -Wl$(COMMA),,$(VBOX_LD_hash_style_sysv))
8939TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8940TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS := -r
8941if1of ($(KBUILD_TARGET), dragonfly freebsd linux netbsd openbsd) # the gnu ld guys.
8942 TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.release := -S
8943 TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.x86 := -m elf_i386
8944 TEMPLATE_VBoxGuestR3XFree86Mod_LDFLAGS.amd64 := -m elf_x86_64
8945endif
8946TEMPLATE_VBoxGuestR3XFree86Mod_LATE_LIBS = $(VBOX_LIB_VBGL_R3_XFREE86)
8947TEMPLATE_VBoxGuestR3XFree86Mod_LATE_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8948TEMPLATE_VBoxGuestR3XFree86Mod_LATE_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8949TEMPLATE_VBoxGuestR3XFree86Mod_LIBS = $(NO_SUCH_VARIABLE) # These three aren't necessary, just being careful.
8950TEMPLATE_VBoxGuestR3XFree86Mod_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8951TEMPLATE_VBoxGuestR3XFree86Mod_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8952
8953
8954#
8955# Template for XFree86 guest libraries.
8956#
8957TEMPLATE_VBoxGuestR3XFree86Lib := VBox XFree86 Guest Library
8958TEMPLATE_VBoxGuestR3XFree86Lib_EXTENDS := VBoxGuestR3XFree86Mod
8959TEMPLATE_VBoxGuestR3XFree86Lib_INST = $(INST_ADDITIONS_LIB)
8960
8961
8962#
8963# Template for X.Org guest modules (shared libs).
8964# This mostly about zapping unnecessary LIBS from VBoxGuestR3DllNonPedantic and adding some flags.
8965#
8966TEMPLATE_VBoxGuestR3XOrgMod := VBox X.Org Guest Module
8967TEMPLATE_VBoxGuestR3XOrgMod_EXTENDS := VBoxGuestR3DllNonPedantic
8968TEMPLATE_VBoxGuestR3XOrgMod_DEFS = $(TEMPLATE_VBoxGuestR3DllNonPedantic_DEFS) VBOX_GUESTR3XORGMOD RTMEM_NO_WRAP_TO_EF_APIS
8969ifeq ($(KBUILD_TARGET_ARCH),amd64)
8970 TEMPLATE_VBoxGuestR3XOrgMod_DEFS += _XSERVER64
8971endif
8972TEMPLATE_VBoxGuestR3XOrgMod_CFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3DllNonPedantic_CFLAGS)) -std=c99
8973TEMPLATE_VBoxGuestR3XOrgMod_CXXFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS),$(TEMPLATE_VBoxGuestR3DllNonPedantic_CXXFLAGS))
8974if1of ($(KBUILD_TARGET), linux)
8975 TEMPLATE_VBoxGuestR3XOrgMod_CFLAGS += -Wno-conversion -Wno-unused-parameter
8976endif
8977TEMPLATE_VBoxGuestR3XOrgMod_LDFLAGS = $(filter-out $(VBOX_GCC_SANITIZER_FLAGS) $(VBOX_GCC_SANITIZER_LDFLAGS),$(TEMPLATE_VBoxGuestR3DllNonPedantic_LDFLAGS))
8978TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS = $(VBOX_LIB_VBGL_R3_XORG)
8979TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8980TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8981TEMPLATE_VBoxGuestR3XOrgMod_LATE_LIBS.freebsd = iconv
8982TEMPLATE_VBoxGuestR3XOrgMod_LIBS = $(NO_SUCH_VARIABLE) # These three aren't necessary, just being careful.
8983TEMPLATE_VBoxGuestR3XOrgMod_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
8984TEMPLATE_VBoxGuestR3XOrgMod_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
8985
8986
8987#
8988# Template for X.Org guest libraries.
8989#
8990TEMPLATE_VBoxGuestR3XOrgLib := VBox X.Org Guest Library
8991TEMPLATE_VBoxGuestR3XOrgLib_EXTENDS := VBoxGuestR3XOrgMod
8992TEMPLATE_VBoxGuestR3XOrgLib_INST = $(INST_ADDITIONS_LIB)
8993
8994
8995#
8996# Template for building R0 drivers for the guest additions.
8997#
8998TEMPLATE_VBoxGuestR0Drv = VBox Guest Driver
8999TEMPLATE_VBoxGuestR0Drv_EXTENDS = VBoxR0Drv
9000TEMPLATE_VBoxGuestR0Drv_INST = $(INST_ADDITIONS)
9001TEMPLATE_VBoxGuestR0Drv_SDKS.win.x86 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9002TEMPLATE_VBoxGuestR0Drv_SDKS.win.amd64 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9003TEMPLATE_VBoxGuestR0Drv_SDKS.win.arm32 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9004TEMPLATE_VBoxGuestR0Drv_SDKS.win.arm64 = ReorderCompilerIncs $(VBOX_WINDDK_GST) $(VBOX_WINPSDK_GST_INCS)
9005TEMPLATE_VBoxGuestR0Drv_DEFS = $(TEMPLATE_VBoxR0Drv_DEFS) IN_GUEST IN_GUEST_R0
9006TEMPLATE_VBoxGuestR0Drv_DEFS.linux = RT_NO_EXPORT_SYMBOL
9007ifeq ($(KBUILD_TARGET),solaris)
9008 TEMPLATE_VBoxGuestR0Drv_LDFLAGS = -r -dy
9009endif
9010ifn1of ($(KBUILD_TARGET), darwin os2 win)
9011 TEMPLATE_VBoxGuestR0Drv_CFLAGS = $(patsubst %/VBox/SUPDrvMangling.h,%/VBox/VBoxGuestMangling.h,$(TEMPLATE_VBoxR0Drv_CFLAGS))
9012 TEMPLATE_VBoxGuestR0Drv_CXXFLAGS = $(patsubst %/VBox/SUPDrvMangling.h,%/VBox/VBoxGuestMangling.h,$(TEMPLATE_VBoxR0Drv_CXXFLAGS))
9013 TEMPLATE_VBoxGuestR0Drv_ASDEFS = $(patsubst RT_MANGLER_PREFIX=%,RT_MANGLER_PREFIX=VBoxGuest_,$(TEMPLATE_VBoxR0Drv_ASDEFS))
9014endif
9015if "$(VBOX_VCC_TOOL_STEM)" >= "VCC120" # Do not use SSE so the binaries might works on NT4 and earlier.
9016 TEMPLATE_VBoxGuestR0Drv_CFLAGS.win.x86 = $(TEMPLATE_VBoxR0Drv_CFLAGS.win.x86) /arch:IA32
9017 TEMPLATE_VBoxGuestR0Drv_CXXFLAGS.win.x86 = $(TEMPLATE_VBoxR0Drv_CXXFLAGS.win.x86) /arch:IA32
9018endif
9019
9020
9021#
9022# Template for building R0 libraries for the guest additions.
9023#
9024TEMPLATE_VBoxGuestR0DrvLib = VBox Guest Driver Libraries
9025TEMPLATE_VBoxGuestR0DrvLib_EXTENDS = VBoxGuestR0Drv
9026TEMPLATE_VBoxGuestR0DrvLib_INSTTYPE = stage
9027TEMPLATE_VBoxGuestR0DrvLib_INSTTYPE.linux = stage
9028TEMPLATE_VBoxGuestR0DrvLib_INST = $(INST_ADDITIONS_LIB)
9029ifeq ($(KBUILD_TARGET),haiku)
9030 TEMPLATE_VBoxGuestR0DrvLib_LDFLAGS = -r -dy
9031endif
9032
9033
9034#
9035# Guest additions libraries (all static).
9036# The _SHARED variants are compiled as PIC and intended for linking into a .so/.dll/.dylib.
9037#
9038VBOX_LIB_IPRT_GUEST_R3 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3$(VBOX_SUFF_LIB)
9039VBOX_LIB_IPRT_GUEST_R3_SHARED = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3Shared$(VBOX_SUFF_LIB)
9040VBOX_LIB_IPRT_GUEST_R0 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR0$(VBOX_SUFF_LIB)
9041#ifeq ($(KBUILD_TARGET_ARCH),x86)
9042# VBOX_LIB_IPRT_GUEST_R0_NT4 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR0NT4$(VBOX_SUFF_LIB)
9043#else
9044VBOX_LIB_IPRT_GUEST_R0_NT4 = $(VBOX_LIB_IPRT_GUEST_R0)
9045#endif
9046VBOX_LIB_VBGL_R3 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3Lib$(VBOX_SUFF_LIB)
9047VBOX_LIB_VBGL_R3_XFREE86 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibXFree86$(VBOX_SUFF_LIB)
9048VBOX_LIB_VBGL_R3_XORG = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibXOrg$(VBOX_SUFF_LIB)
9049VBOX_LIB_VBGL_R3_SHARED = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibShared$(VBOX_SUFF_LIB)
9050VBOX_LIB_VBGL_R0BASE = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR0LibBase$(VBOX_SUFF_LIB)
9051VBOX_LIB_VBGL_R0 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR0Lib$(VBOX_SUFF_LIB)
9052ifeq ($(KBUILD_TARGET_ARCH),x86)
9053 VBOX_LIB_IPRT_GUEST_R3_X86 = $(VBOX_LIB_IPRT_GUEST_R3)
9054 VBOX_LIB_IPRT_GUEST_R3_SHARED_X86 = $(VBOX_LIB_IPRT_GUEST_R3_SHARED)
9055 VBOX_LIB_VBGL_R3_X86 = $(VBOX_LIB_VBGL_R3)
9056 VBOX_LIB_VBGL_R3_SHARED_X86 = $(VBOX_LIB_VBGL_R3_SHARED)
9057else
9058 VBOX_LIB_IPRT_GUEST_R3_X86 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3-x86$(VBOX_SUFF_LIB)
9059 VBOX_LIB_IPRT_GUEST_R3_SHARED_X86 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3Shared-x86$(VBOX_SUFF_LIB)
9060 VBOX_LIB_VBGL_R3_X86 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3Lib-x86$(VBOX_SUFF_LIB)
9061 VBOX_LIB_VBGL_R3_SHARED_X86 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibShared-x86$(VBOX_SUFF_LIB)
9062endif
9063
9064
9065#
9066# Check the publisher and version string.
9067#
9068# We are being very strict because the version string is visible in various
9069# APIs and logs and must be machine readable.
9070#
9071VBOX_VERSION_COMP_VALID_CHAR_SET = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz()[]{}+-.,
9072ifneq ($(VBOX_BUILD_PUBLISHER),)
9073 if !defined(VBOX_BUILD_TAG) && $(length $(VBOX_BUILD_PUBLISHER)) > 10
9074 $(error VBox: VBOX_BUILD_PUBLISHER must not be longer than 10 characters!)
9075 else if defined(VBOX_BUILD_TAG) && $(length $(VBOX_BUILD_PUBLISHER)) > 48
9076 $(error VBox: VBOX_BUILD_PUBLISHER must not be longer than 48 characters!)
9077 endif
9078 if "$(substr $(VBOX_BUILD_PUBLISHER), 1, 1)" != "_"
9079 $(error VBox: VBOX_BUILD_PUBLISHER must start with an underscore!)
9080 endif
9081 if "$(translate $(substr $(VBOX_BUILD_PUBLISHER),2),$(VBOX_VERSION_COMP_VALID_CHAR_SET),)" != ""
9082 $(error VBox: VBOX_BUILD_PUBLISHER='$(VBOX_BUILD_PUBLISHER)' contains bad characters! Valid set is:$(NLTAB)$(VBOX_VERSION_COMP_VALID_CHAR_SET))
9083 endif
9084endif
9085
9086if $(words $(VBOX_VERSION_STRING)) != 1
9087 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' contains spaces or is empty.)
9088endif
9089if "$(subst __,-,$(VBOX_VERSION_STRING))" != "$(VBOX_VERSION_STRING)"
9090 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' contains double underscores.)
9091endif
9092
9093VBOX_VER_TMP1 := $(subst _,$(SP),$(VBOX_VERSION_STRING))
9094
9095if $(words $(VBOX_VER_TMP1)) > 3
9096 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' contains too many parts (underscores), max 3!)
9097endif
9098if "$(translate $(word 1,$(VBOX_VER_TMP1)),0123456789,)" != ".."
9099 $(error VBox: The x.y.z part of VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' is malformed: '$(word 1,$(VBOX_VER_TMP1))')
9100endif
9101if "$(word 1,$(VBOX_VER_TMP1))" != "$(VBOX_VERSION_STRING_RAW)"
9102 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' does not start with VBOX_VERSION_STRING_RAW='$(VBOX_VERSION_STRING_RAW)')
9103endif
9104
9105if $(words $(VBOX_VER_TMP1)) == 3 || ($(words $(VBOX_VER_TMP1)) == 2 && "$(VBOX_BUILD_PUBLISHER)" == "")
9106 if "$(substr $(word 2,$(VBOX_VER_TMP1)),1,4)" == "BETA"
9107 VBOX_VER_TMP2 = 5
9108 else if "$(substr $(word 2,$(VBOX_VER_TMP1)),1,5)" == "ALPHA"
9109 VBOX_VER_TMP2 = 6
9110 else if "$(substr $(word 2,$(VBOX_VER_TMP1)),1,2)" == "RC"
9111 VBOX_VER_TMP2 = 3
9112 else
9113 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' uses an unknown build type: '$(word 2,$(VBOX_VER_TMP1))')
9114 endif
9115 if "$(translate $(substr $(word 2,$(VBOX_VER_TMP1)),$(VBOX_VER_TMP2)),0123456789)" != ""
9116 $(error VBox: VBOX_VERSION_STRING='$(VBOX_VERSION_STRING)' uses an unknown build type: '$(word 2,$(VBOX_VER_TMP1))')
9117 endif
9118endif
9119
9120VBOX_VER_TMP1 :=
9121VBOX_VER_TMP2 :=
9122
9123
9124#
9125# Two targets to coordinate version number changes properly. Note that the
9126# only way to get a really consistent build is to run 'kmk' in the top-level
9127# directory. If you don't run it there, you get a consistent sub-tree only.
9128#
9129VBOX_BAD_CHAR_SET = ,;:/\$(SP)$(TAB)$(HASH)=![]@%&''()*""<>?^{}|~
9130VBOX_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),,_)
9131VBOX_VERSION_HEADER = $(PATH_OUT)/version-generated.h
9132VBOX_VERSION_MK = $(PATH_OUT)/version-generated.mk
9133
9134$(VBOX_VERSION_STAMP): | $(PATH_ROOT)/Config.kmk
9135 $(call MSG_GENERATE,,$@)
9136 $(QUIET)$(MKDIR) -p $(@D)
9137 $(QUIET)$(RM) -f $(wildcard $(PATH_OUT)/version-stamp-*)
9138 $(QUIET)$(APPEND) $@ $(VBOX_VERSION_STRING)
9139
9140$(VBOX_VERSION_HEADER): $(VBOX_VERSION_STAMP)
9141 $(call MSG_GENERATE,,$@)
9142 $(QUIET)$(MKDIR) -p $(@D)
9143 $(QUIET)$(RM) -f $@ $@.tmp
9144 $(QUIET)$(APPEND) $@.tmp '#ifndef ___version_generated_h___'
9145 $(QUIET)$(APPEND) $@.tmp '#define ___version_generated_h___'
9146 $(QUIET)$(APPEND) $@.tmp ''
9147 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_MAJOR $(VBOX_VERSION_MAJOR)'
9148 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_MINOR $(VBOX_VERSION_MINOR)'
9149 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_BUILD $(VBOX_VERSION_BUILD)'
9150ifneq ($(VBOX_VERSION_PRERELEASE),)
9151 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_PRERELEASE "$(strip $(VBOX_VERSION_PRERELEASE))"'
9152endif
9153 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_STRING_RAW "$(VBOX_VERSION_STRING_RAW)"'
9154 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VERSION_STRING "$(VBOX_VERSION_STRING)"'
9155 $(QUIET)$(APPEND) $@.tmp '#define VBOX_API_VERSION_STRING "$(VBOX_API_VERSION)"'
9156 $(QUIET)$(APPEND) $@.tmp ''
9157ifdef VBOX_BUILD_SERVER_BUILD
9158 $(QUIET)$(APPEND) $@.tmp '#define VBOX_BUILD_SERVER_BUILD 1'
9159else
9160 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PRIVATE_BUILD_DESC "Private build by $(USERNAME)"'
9161endif
9162 $(QUIET)$(APPEND) $@.tmp ''
9163 $(QUIET)$(APPEND) $@.tmp '#endif'
9164 $(QUIET)$(MV) -f $@.tmp $@
9165
9166
9167VBOX_PACKAGE_HEADER = $(PATH_OUT)/package-generated.h
9168
9169$(VBOX_PACKAGE_HEADER):
9170 $(call MSG_GENERATE,,$@)
9171 $(QUIET)$(MKDIR) -p $(@D)
9172 $(QUIET)$(RM) -f $@ $@.tmp
9173 $(QUIET)$(APPEND) $@.tmp '#ifndef ___package_generated_h___'
9174 $(QUIET)$(APPEND) $@.tmp '#define ___package_generated_h___'
9175 $(QUIET)$(APPEND) $@.tmp ''
9176 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PACKAGE_STRING "$(VBOX_PACKAGE_STRING)"'
9177 $(QUIET)$(APPEND) $@.tmp ''
9178 $(QUIET)$(APPEND) $@.tmp '#endif'
9179 $(QUIET)$(MV) -f $@.tmp $@
9180
9181VBOX_PRODUCT_HEADER = $(PATH_OUT)/product-generated.h
9182
9183$(VBOX_PRODUCT_HEADER): $(VBOX_VERSION_STAMP)
9184 $(call MSG_GENERATE,,$@)
9185 $(QUIET)$(MKDIR) -p $(@D)
9186 $(QUIET)$(RM) -f $@ $@.tmp
9187 $(QUIET)$(APPEND) $@.tmp '#ifndef ___product_generated_h___'
9188 $(QUIET)$(APPEND) $@.tmp '#define ___product_generated_h___'
9189 $(QUIET)$(APPEND) $@.tmp ''
9190 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VENDOR "$(VBOX_VENDOR)"'
9191 $(QUIET)$(APPEND) $@.tmp '#define VBOX_VENDOR_SHORT "$(VBOX_VENDOR_SHORT)"'
9192 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PRODUCT "$(VBOX_PRODUCT)"'
9193 $(QUIET)$(APPEND) $@.tmp '#define VBOX_PUEL_PRODUCT "$(VBOX_PUEL_PRODUCT)"'
9194 $(QUIET)$(APPEND) $@.tmp '#define VBOX_BUILD_PUBLISHER "$(VBOX_BUILD_PUBLISHER)"'
9195 $(QUIET)$(APPEND) $@.tmp '#define VBOX_C_YEAR "$(VBOX_C_YEAR)"'
9196 $(QUIET)$(APPEND) $@.tmp ''
9197 $(QUIET)$(APPEND) $@.tmp '#endif'
9198 $(QUIET)$(MV) -f $@.tmp $@
9199
9200#
9201# Used for external makefiles which cannot include Config.kmk
9202#
9203$(VBOX_VERSION_MK): $(VBOX_VERSION_STAMP)
9204 $(call MSG_GENERATE,,$@)
9205 $(QUIET)$(RM) -f $@ $@.tmp
9206 $(QUIET)$(MKDIR) -p $(@D)
9207 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_MAJOR = $(VBOX_VERSION_MAJOR)'
9208 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_MINOR = $(VBOX_VERSION_MINOR)'
9209 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_BUILD = $(VBOX_VERSION_BUILD)'
9210 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_STRING = $(VBOX_VERSION_STRING)'
9211ifneq ($(VBOX_VERSION_PRERELEASE),)
9212 $(QUIET)$(APPEND) $@.tmp 'VBOX_VERSION_PRERELEASE = $(strip $(VBOX_VERSION_PRERELEASE))'
9213endif
9214 $(QUIET)$(APPEND) $@.tmp 'VBOX_VENDOR = $(VBOX_VENDOR)'
9215 $(QUIET)$(APPEND) $@.tmp 'VBOX_VENDOR_SHORT = $(VBOX_VENDOR_SHORT)'
9216 $(QUIET)$(APPEND) $@.tmp 'VBOX_PRODUCT = $(VBOX_PRODUCT)'
9217 $(QUIET)$(APPEND) $@.tmp 'VBOX_C_YEAR = $(VBOX_C_YEAR)'
9218ifdef VBOX_BUILD_SERVER_BUILD
9219 $(QUIET)$(APPEND) $@.tmp 'VBOX_BUILD_SERVER_BUILD = 1'
9220else
9221 $(QUIET)$(APPEND) $@.tmp 'VBOX_PRIVATE_BUILD_DESC = Private build by $(USERNAME)'
9222endif
9223 $(QUIET)$(MV) -f $@.tmp $@
9224
9225if !defined(VBOX_OSE) && !defined(VBOX_NOINC_LICENSE_VER_KMK)
9226 if1of ($(KBUILD_TARGET), freebsd linux netbsd openbsd solaris)
9227 # VBOX_LICENSE_VER is used in several Makefiles
9228 VBOX_LICENSE_VER_KMK = $(PATH_OUT)/license-version.kmk
9229 $(VBOX_LICENSE_VER_KMK): $(VBOX_BRAND_LICENSE_HTML)
9230 $(call MSG_GENERATE,,$(VBOX_LICENSE_VER_KMK))
9231 $(QUIET)$(MKDIR) -p $(@D)
9232 ifdef VBOX_BRAND_LICENSE_VER
9233 $(QUIET)$(RM) -f '$@'
9234 $(APPEND) '$@' 'VBOX_LICENSE_VER=$(VBOX_BRAND_LICENSE_VER)'
9235 else
9236 $(QUIET)$(SED) -e "s/.*License version \([0-9.]*\) *[,&].*/VBOX_LICENSE_VER=\1/;t;d" --output $@ $(VBOX_BRAND_LICENSE_HTML)
9237 endif
9238 -include $(VBOX_LICENSE_VER_KMK)
9239 ifdef VBOX_LICENSE_VER
9240 VBOX_LICENSE_FILES = \
9241 License-$(VBOX_LICENSE_VER).html \
9242 $(foreach f,$(VBOX_INSTALLER_ADD_LANGUAGES),License-$(VBOX_LICENSE_VER)-$(f).html)
9243 VBOX_LICENSE_BINS = $(addprefix $(PATH_STAGE_BIN)/,$(VBOX_LICENSE_FILES))
9244 endif
9245 endif
9246endif
9247
9248
9249ifeq ($(KBUILD_TARGET),darwin)
9250 $(VBOX_DARWIN_ENTITLEMENTS_FILE):
9251 $(call MSG_GENERATE,,$@)
9252 $(QUIET)$(MKDIR) -p $(@D)
9253 $(QUIET)$(RM) -f $@ $@.tmp
9254 $(QUIET)$(APPEND) $@.tmp '<?xml version="1.0" encoding="UTF-8"?>'
9255 $(QUIET)$(APPEND) $@.tmp '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">'
9256 $(QUIET)$(APPEND) $@.tmp '<plist version="1.0">'
9257 $(QUIET)$(APPEND) $@.tmp '<dict>'
9258 $(QUIET)$(APPEND) -n $@.tmp $(foreach entitlement,$(VBOX_DARWIN_ENTITLEMENTS_LIST_COMMON), ' <key>$(entitlement)</key><true/>')
9259 $(QUIET)$(APPEND) $@.tmp '</dict>'
9260 $(QUIET)$(APPEND) $@.tmp '</plist>'
9261 $(QUIET)$(MV) -f $@.tmp $@
9262
9263 $(VBOX_DARWIN_ENTITLEMENTS_FILE_VM):
9264 $(call MSG_GENERATE,,$@)
9265 $(QUIET)$(MKDIR) -p $(@D)
9266 $(QUIET)$(RM) -f $@ $@.tmp
9267 $(QUIET)$(APPEND) $@.tmp '<?xml version="1.0" encoding="UTF-8"?>'
9268 $(QUIET)$(APPEND) $@.tmp '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">'
9269 $(QUIET)$(APPEND) $@.tmp '<plist version="1.0">'
9270 $(QUIET)$(APPEND) $@.tmp '<dict>'
9271 $(QUIET)$(APPEND) -n $@.tmp $(foreach entitlement,$(VBOX_DARWIN_ENTITLEMENTS_LIST_VM), ' <key>$(entitlement)</key><true/>')
9272 $(QUIET)$(APPEND) $@.tmp '</dict>'
9273 $(QUIET)$(APPEND) $@.tmp '</plist>'
9274 $(QUIET)$(MV) -f $@.tmp $@
9275endif
9276
9277ifndef VBOX_NOINC_MISC
9278 # Force building of the version header file as the first thing anywhere in
9279 # the tree. This eliminates the need for manual dependencies on it.
9280 ## @todo there gotta be a better way of doing this.
9281 Makefile.kmk: | $(VBOX_VERSION_HEADER) $(VBOX_VERSION_MK) $(VBOX_PRODUCT_HEADER) $(VBOX_PACKAGE_HEADER)
9282 ifeq ($(KBUILD_TARGET),darwin)
9283 Makefile.kmk: | $(VBOX_DARWIN_ENTITLEMENTS_FILE) $(VBOX_DARWIN_ENTITLEMENTS_FILE_VM)
9284 endif
9285endif
9286
9287
9288#
9289# Subversion tree revision.
9290#
9291# The VBOX_SVN_REV contains our best guess. Use svn info on the root of the
9292# tree to determine this it if .svn/wc.db or .svn/entries is found (the former
9293# also up to two directory levels higher to allow for checkouts of the entire
9294# repository), otherwise fall back on maximum value of Config.kmk and
9295# Version.kmk revision.
9296#
9297# Makefile rules using this information shall list $(VBOX_SVN_REV_KMK) as a
9298# prerequisite.
9299#
9300SVN ?= svn$(HOSTSUFF_EXE)
9301VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk
9302ifndef VBOX_SVN_REV
9303 VBOX_SVN_REV_CONFIG_FALLBACK := $(patsubst %:,, $Rev: 107019 $ )
9304 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))
9305 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))
9306 ifeq ($(which $(SVN)),)
9307 VBOX_SVN_DEP :=
9308 endif
9309
9310 # Rule for generating a timestamp and updating the real thing on change.
9311 $(VBOX_SVN_REV_KMK).ts +| $(VBOX_SVN_REV_KMK): $(if $(VBOX_SVN_DEP), $(VBOX_SVN_DEP), $(PATH_ROOT)/Config.kmk)
9312 $(call MSG_GENERATE,,$(VBOX_SVN_REV_KMK))
9313 $(QUIET)$(RM) -f $@ $@.tmp
9314 $(QUIET)$(MKDIR) -p $(@D)
9315 ifneq ($(VBOX_SVN_DEP),)
9316 -$(REDIRECT) -E 'LC_ALL=C' -wo $@.tmp -- $(SVN) info $(PATH_ROOT)
9317 # Append fallback. Will be ignored if "svn info" provides meaningful data.
9318 $(QUIET)$(APPEND) $@.tmp 'Last Changed Rev: $(VBOX_SVN_REV_FALLBACK)'
9319 $(SED) -e '/^Last Changed Rev/!d' -e 's/Last Changed Rev\: */export VBOX_SVN_REV=/; t a; :a q' --output $@ $@.tmp
9320 $(QUIET)$(RM) -f $@.tmp
9321 else
9322 $(QUIET)$(APPEND) $@ 'export VBOX_SVN_REV=$(VBOX_SVN_REV_FALLBACK)'
9323 endif
9324 $(QUIET)$(CP) --changed -fv $@ $(VBOX_SVN_REV_KMK)
9325
9326 ifndef VBOX_NOINC_SVN_REV_KMK
9327 include $(VBOX_SVN_REV_KMK)
9328 endif
9329else
9330 # allow to overwrite VBOX_SVN_REV externally (mainly for building .debs/.rpms)
9331 $(VBOX_SVN_REV_KMK):
9332 $(call MSG_GENERATE,,$(VBOX_SVN_REV_KMK))
9333 $(QUIET)$(RM) -f $@
9334 $(QUIET)$(MKDIR) -p $(@D)
9335 $(QUIET)$(APPEND) $@ 'export VBOX_SVN_REV=$(VBOX_SVN_REV)'
9336 $(QUIET)echo '* $(VBOX_SVN_REV_KMK) was externally overwritten:'
9337 $(QUIET)$(CAT) $(VBOX_SVN_REV_KMK)
9338endif
9339
9340# only needed for VBoxGuest for Linux/FreeBSD guests
9341VBOX_SVN_REV_HEADER = $(PATH_OUT)/revision-generated.h
9342$(VBOX_SVN_REV_HEADER): $(VBOX_SVN_REV_KMK)
9343 $(call MSG_GENERATE,,$@)
9344 $(QUIET)$(RM) -f $@ $@.tmp
9345 $(QUIET)$(MKDIR) -p $(@D)
9346 $(QUIET)$(APPEND) $@.tmp '#define VBOX_SVN_REV $(VBOX_SVN_REV)'
9347 $(QUIET)$(MV) -f $@.tmp $@
9348
9349#
9350# Shared definitions of the XIDL file to use as a source for
9351# generating various other files (VBoxSVC, webservice, docs, front-ends, ...)
9352#
9353
9354# Real XIDL source file; from this we strip the <desc> elements to generate
9355# a second XIDL file, from which the COM/XPCOM IDL files are then generated:
9356VBOX_XIDL_FILE_SRC = $(PATH_ROOT)/src/VBox/Main/idl/VirtualBox.xidl
9357# second XIDL file to use as source for COM/XPCOM IDL (with stripped docs):
9358VBOX_XIDL_FILE = $(PATH_OUT)/obj/VirtualBox_stripped.xidl
9359
9360
9361#
9362# VBOX_SEP needs to be quoted when used on the shell command line.
9363#
9364if1of ($(KBUILD_TARGET), os2 win)
9365 VBOX_SEP = $(SEMICOLON)
9366else
9367 VBOX_SEP = $(COLON)
9368endif
9369
9370# Java compiler options, needs some version checking.
9371if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 110000
9372 VBOX_JAVA_WS_PATH ?= /usr/share/java
9373 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
9374else if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 10900
9375 VBOX_JAVA_WS_OPTS ?= --add-modules java.xml.ws
9376endif
9377if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 110000
9378 VBOX_JAVAC_OPTS = -encoding UTF-8 -source 9 -target 9 -Xlint:unchecked
9379else if defined(VBOX_JAVA_VERSION) && $(VBOX_JAVA_VERSION) >= 90000
9380 VBOX_JAVAC_OPTS = -encoding UTF-8 -source 6 -target 6 -Xlint:unchecked
9381else
9382 VBOX_JAVAC_OPTS = -encoding UTF-8 -source 1.5 -target 1.5 -Xlint:unchecked
9383endif
9384VBOX_JAVADOC_OPTS = -encoding UTF-8
9385
9386
9387#
9388# Legacy.
9389#
9390## @todo try remove this.
9391ifneq ($(LOCALCFG),)
9392 include $(LOCALCFG)
9393endif
9394
9395
9396#
9397# For efficiently build serveral build types / archs.
9398#
9399both-debug-release both-release-debug: \
9400 build-release-$(KBUILD_TARGET_ARCH) \
9401 build-debug-$(KBUILD_TARGET_ARCH)
9402both-x86-amd64 both-amd64-x86: \
9403 build-$(KBUILD_TYPE)-x86 \
9404 build-$(KBUILD_TYPE)-x86
9405both-types-archs both-archs-types: \
9406 build-debug-x86 \
9407 build-release-x86 \
9408 build-debug-amd64 \
9409 build-release-amd64
9410
9411build-release-x86:
9412 +$(MAKE) KBUILD_TYPE=release KBUILD_TARGET_ARCH=x86
9413
9414build-debug-x86:
9415 +$(MAKE) KBUILD_TYPE=debug KBUILD_TARGET_ARCH=x86
9416
9417build-release-amd64:
9418 +$(MAKE) KBUILD_TYPE=release KBUILD_TARGET_ARCH=amd64
9419
9420build-debug-amd64:
9421 +$(MAKE) KBUILD_TYPE=debug KBUILD_TARGET_ARCH=amd64
9422
9423build-release-arm64:
9424 +$(MAKE) KBUILD_TYPE=release KBUILD_TARGET_ARCH=arm64
9425
9426build-debug-arm64:
9427 +$(MAKE) KBUILD_TYPE=debug KBUILD_TARGET_ARCH=arm64
9428
9429
9430#
9431# Some extra goals.
9432#
9433.PHONY: up update st stat status
9434up update::
9435 $(SVN) up
9436
9437up2 update2::
9438 $(SVN) up --ignore-externals
9439
9440st stat status:
9441 $(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