VirtualBox

source: vbox/trunk/Config.kmk@ 96175

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

Recording: Implemented support for Vorbis codec (provided by libvorbis, not enabled by default yet). This also makes all the codec handling more abstract by using a simple codec wrapper, to keep other places free from codec-specific as much as possible. Initial implementation works and output files are being recognized by media players, but there still are some timing bugs to resolve, as well as optimizing the performance. bugref:10275

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