VirtualBox

source: vbox/trunk/Config.kmk@ 105184

Last change on this file since 105184 was 105160, checked in by vboxsync, 7 months ago

*.kmk,bldprogs/VBoxPeSetVersion: Created a unit for setting the PE version so it can more easily be controlled per target. This is helpful with the two GINA targets in the additions, since using NT 3.51 instead of NT 3.1 as minimum avoids trouble with some AV heuristics.

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

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