VirtualBox

source: vbox/trunk/Config.kmk@ 95721

Last change on this file since 95721 was 95702, checked in by vboxsync, 2 years ago

Add/3D,/Config.kmk: There is another user of the BISON and FLEX tools, so configuring variables them in a sub-makefile/config-file won't work reliably. Also, the flex/bison-not-found.exe isn't right as several developers has the tools in the PATH and this isdetected by DynamicConfig.kmk. Moved the config variables to the root Config.kmk and baked them into the DynamicConfig.kmk detection. bugref:9845

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