VirtualBox

source: vbox/trunk/Config.kmk@ 98859

Last change on this file since 98859 was 98790, checked in by vboxsync, 22 months ago

Guest Control: Enabled VBOX_WITH_GSTCTL_TOOLBOX_AS_CMDS by default. Newer Guest Additions (trunk only at the moment) will then report support for this, so that the host in turn can use the new code paths. Older Guest Additions in turn will be used as-is with the now-legacy toolbox support built into VBoxService. bugref:9783

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