VirtualBox

source: vbox/trunk/Config.kmk@ 100749

Last change on this file since 100749 was 100722, checked in by vboxsync, 18 months ago

Config.kmk: An experiment for darwin.arm64 whether it is required to include the com.apple.security.hypervisor now (which should be included our release certificate), even for release builds which should be able to run with SIP enabled [revert as it doesn't work]

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