VirtualBox

source: vbox/trunk/Config.kmk@ 96647

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

/Config.kmk: Adjusted the SetACP(UTF-8) manifest so it'll work on xp RTM as well and enabled it for x86 targets again. The issue was that it required processorArchitecture to be set, an attribute currently documented as optional. bugref:10261

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