VirtualBox

source: vbox/trunk/Config.kmk@ 102493

Last change on this file since 102493 was 102415, checked in by vboxsync, 8 months ago

/Config.kmk: Use the -Zc:inline option with Visual C++ 2015 and later. This makes inline C++11 conformant, and more importantly seems to remove unreferenced copies of inline functions from the object file. The linker will remove these, but better if we don't bloat the object file with them in the first place. bugref:10348

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