VirtualBox

source: vbox/trunk/Config.kmk@ 95639

Last change on this file since 95639 was 95622, checked in by vboxsync, 2 years ago

/Config.kmk,Installer/solaris,xpcom18a4/{Config.kmk,Makefile.kmk},tools/Makefile.kmk:
Remove the "legacy" Solaris 10 libraries (libstdc++.so.6, libxcb.so.1,
libgcc_s.so.1, libX11-xcb.so.1, libGL.so.1, libX11.so.4) added in r107933
and all vestiges of their presence in Makefiles and installation
scripts. These libraries were bundled in order to run VirtualBox on
Solaris 10 hosts since they are part of optional package clusters like
SUNWCuser which might not be installed so were packaged with VirtualBox
in a /legacy/ subdirectory under /opt/VirtualBox. Solaris 10 is no
longer supported as a host so these unused bits can go now.

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

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