VirtualBox

source: vbox/trunk/Config.kmk@ 96451

Last change on this file since 96451 was 96433, checked in by vboxsync, 22 months ago

Config.kmk: Disabled VBOX_WITH_CRT_PACKING by default so that we don't ship the MS Visual Studio Redistributable anymore. The Windows host installer then will check if that redistributable is present and fail otherwise. Needs altering of some (all?) of the testcases which install VBox on Windows hosts (via '--win-install-mscrt', see r153261). bugref:10284

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

© 2023 Oracle
ContactPrivacy policyTerms of Use