VirtualBox

source: vbox/trunk/Config.kmk@ 89364

Last change on this file since 89364 was 89362, checked in by vboxsync, 3 years ago

/Config.kmk, tools/Makefile.kmk: Replace workaround for making new Xcode (the assumption is hardcoded into clang) work with SDK 10.13. The checks of entitlements and code signatures done by amfid depend on the correct SDK version to be recorded in binaries, otherwise they are rejected as incorrectly signed (when there is nothing wrong with the signature). clang takes it from SDKSettings.json which was added with SDK 10.14 but the same information is for a long time in SDKSettings.plist which can be converted.

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