VirtualBox

source: vbox/trunk/Config.kmk@ 12321

Last change on this file since 12321 was 12294, checked in by vboxsync, 16 years ago

conditional compilation of guest SMP related stuff (disabled by default),
also memory above 4G included to that to give additional testing to the code

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 132.7 KB
Line 
1# $Id: Config.kmk 12294 2008-09-09 13:47:17Z vboxsync $
2## @file
3# The global build configuration file for VBox.
4#
5# This file gets included by all makefiles through the
6# include $(KBUILD_PATH)/header.kmk statement.
7#
8
9#
10# Copyright (C) 2006-2007 Sun Microsystems, Inc.
11#
12# This file is part of VirtualBox Open Source Edition (OSE), as
13# available from http://www.virtualbox.org. This file is free software;
14# you can redistribute it and/or modify it under the terms of the GNU
15# General Public License as published by the Free Software Foundation,
16# in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
17# distribution. VirtualBox OSE is distributed in the hope that it will
18# be useful, but WITHOUT ANY WARRANTY of any kind.
19#
20
21# Marker.
22VBOX_ROOT_CONFIG_KMK_INCLUDED = 1
23
24#
25# kBuild stuff
26#
27
28# Experimental
29.SECONDTARGETEXPANSION:
30
31# Enable automatic installation of what's built.
32KBUILD_DO_AUTO_INSTALL := 1
33PASSES := $(filter-out PACKING,$(PASSES)) PACKING # temporary hack
34# Modify the order of the INSTALLS and OTHERS passes.
35DEFAULT_PASSES := BLDPROGS LIBRARIES DLLS BINARIES INSTALLS OTHERS
36# Modify the build types.
37## @todo checked and dbgopt
38KBUILD_BLD_TYPES = release profile debug kprofile
39
40# Install paths.
41PATH_INS = $(PATH_OUT)
42ifeq ($(KBUILD_TARGET),darwin)
43 INST_DIST = dist/
44 INST_SDK = $(INST_DIST)sdk/
45
46 # the bundles
47 INST_VIRTUALBOX = $(INST_DIST)VirtualBox.app/
48 INST_VBOXDRV = $(INST_DIST)VBoxDrv.kext/
49 INST_VBOXNETFLT = $(INST_DIST)VBoxNetFlt.kext/
50 INST_VBOXNETTAP = $(INST_DIST)VBoxNetTap.kext/
51 INST_VBOXUSB = $(INST_DIST)VBoxUSB.kext/
52
53 # put everything in the VirtualBox app bundle.
54 INST_BIN = $(INST_VIRTUALBOX)Contents/MacOS/
55 INST_DLL = $(INST_BIN)
56 INST_SYS = $(INST_BIN)
57 INST_TESTCASE = $(INST_BIN)testcase/
58 INST_ADDITIONS = $(INST_BIN)additions/
59
60 # other paths
61 INST_TESTSUITE = testsuite/
62 INST_LIB = lib/
63 INST_ADDITIONS_LIB = $(PATH_LIB)/additions/
64
65else
66
67 INST_BIN = bin/
68 INST_DIST = $(INST_BIN)
69 INST_DLL = $(INST_BIN)
70 INST_SDK = $(INST_BIN)sdk/
71 INST_DLL = $(INST_BIN)
72 INST_SYS = $(INST_BIN)
73 INST_TESTCASE = $(INST_BIN)testcase/
74 INST_ADDITIONS = $(INST_BIN)additions/
75
76 INST_TESTSUITE = testsuite/
77 INST_LIB = lib/
78 INST_ADDITIONS_LIB = $(INST_LIB)additions/
79endif
80
81PATH_BIN = $(patsubst %/,%,$(PATH_INS)/$(INST_BIN))
82PATH_DLL = $(patsubst %/,%,$(PATH_INS)/$(INST_DLL))
83PATH_SYS = $(patsubst %/,%,$(PATH_INS)/$(INST_SYS))
84PATH_LIB = $(patsubst %/,%,$(PATH_INS)/$(INST_LIB))
85PATH_DOC = $(PATH_OUT)/doc
86VBOX_PATH_SDK = $(patsubst %/,%,$(PATH_INS)/$(INST_SDK))
87VBOX_PATH_DIST = $(patsubst %/,%,$(PATH_INS)/$(INST_DIST))
88VBOX_PATH_TESTSUITE = $(patsubst %/,%,$(PATH_INS)/$(INST_TESTSUITE))
89VBOX_PATH_ADDITIONS = $(patsubst %/,%,$(PATH_INS)/$(INST_ADDITIONS))
90VBOX_PATH_ADDITIONS_LIB = $(patsubst %/,%,$(PATH_INS)/$(INST_ADDITIONS_LIB))
91
92
93# Delete targets on failure.
94.DELETE_ON_ERROR:
95
96# Notify about important kBuild updates.
97ifneq ($(call int-ge,$(KMK_REVISION),1753),1)
98 $(error You must update kBuild! KMK_REVISION=$(KMK_REVISION) KBUILD_PATH=$(KBUILD_PATH))
99endif
100
101#
102# Define USERNAME early on.
103#
104ifndef USERNAME
105 ifdef USER
106 USERNAME = $(USER)
107 else
108 $(warning Warning: You must have USERNAME or USER in your environment.)
109 endif
110endif
111
112#
113# The VirtualBox version.
114#
115
116# Major version.
117VBOX_VERSION_MAJOR = 2
118# Minor version.
119VBOX_VERSION_MINOR = 0
120# This is the current build number. It should be increased every time we publish a
121# new build. The define is available in every source file. Only even build numbers
122# will be published, odd numbers are set during development.
123VBOX_VERSION_BUILD = 1
124# Full version string (may include more than just x.y.z, but no spaces or other problematic chars).
125VBOX_VERSION_STRING = $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
126# Force the additions.sh script to get an exact additions build when we're doing the release.
127ifeq ($(int-mod $(VBOX_VERSION_BUILD),2),0)
128 export VBOX_ADDITIONS_SH_MODE = release
129endif
130
131
132#
133# The VirtualBox package type.
134#
135ifeq ($(KBUILD_TARGET),win)
136 VBOX_PACKAGE_OS = WINDOWS
137else ifeq ($(KBUILD_TARGET),linux)
138 VBOX_PACKAGE_OS = LINUX
139else ifeq ($(KBUILD_TARGET),darwin)
140 VBOX_PACKAGE_OS = DARWIN
141else ifeq ($(KBUILD_TARGET),solaris)
142 VBOX_PACKAGE_OS = SOLARIS
143else if1of ($(KBUILD_TARGET), dragonfly freebsd netbsd openbsd)
144 VBOX_PACKAGE_OS = BSD
145else
146 $(error Cannot determine VBOX_PACKAGE_OS)
147endif
148ifeq ($(KBUILD_TARGET_ARCH),x86)
149 VBOX_PACKAGE_ARCH = 32BITS
150else
151 VBOX_PACKAGE_ARCH = 64BITS
152endif
153# distribution, mostly for Linux/Solaris where we support different distributions
154# this strip will be overridden by the Linux packaging scripts
155VBOX_PACKAGE_DIST ?= GENERIC
156# Full string
157VBOX_PACKAGE_STRING = $(VBOX_PACKAGE_OS)_$(VBOX_PACKAGE_ARCH)_$(VBOX_PACKAGE_DIST)
158
159
160#
161# The VirtualBox Configuration Defaults.
162#
163# We try to document all the build configuration options here, thing which
164# aren't enabled by default is left commented out just to show that they
165# exist and which value they should have (usually 1, but anyway).
166#
167
168# This indicates that additions (of some kind or another) is being _built_.
169# VBOX_WITHOUT_ADDITIONS overrides it.
170#if1of ($(KBUILD_TARGET), freebsd linux os2 solaris win)
171if1of ($(KBUILD_TARGET), linux solaris win)
172 VBOX_WITH_ADDITIONS = 1
173endif
174# Build the optional ring-0 part of the additions for syntax checking.
175# (Except when cross-building on linux since we're using /usr/src/...)
176ifn1of ($(KBUILD_TARGET).$(KBUILD_HOST_ARCH).$(KBUILD_TARGET_ARCH), linux.x86.amd64 linux.amd64.x86)
177 VBOX_WITH_ADDITION_DRIVERS = 1
178endif
179# Build X11 additions. Can be disabled separately.
180if1of ($(KBUILD_TARGET), dragonfly freebsd linux netbsd openbsd solaris)
181 VBOX_WITH_X11_ADDITIONS = 1
182endif
183# Enable the building of shared folders in the windows additions.
184VBOX_WITH_WIN32_ADDITIONS_SHAREDFOLDERS = 1
185# Take the binaries of the OS/2 Additions.
186VBOX_WITH_OS2_ADDITIONS_BIN = 1
187# Use additions from the build server.
188#VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER = 1
189# Don't bother with additions, overrides VBOX_WITH_ADDITIONS.
190# This is not used by makefiles, only Config.kmk, see below.
191#VBOX_WITHOUT_ADDITIONS = 1
192# Only build the additions (for the additions build server).
193#VBOX_ONLY_ADDITIONS = 1
194ifdef VBOX_ADDITIONS_ONLY # typical mistake.
195 $(error It is VBOX_ONLY_ADDITIONS=1 not VBOX_ADDITIONS_ONLY!)
196endif
197
198# When build SDK-only, no need for additions
199ifdef VBOX_ONLY_SDK
200 VBOX_WITHOUT_ADDITIONS=1
201endif
202
203# Don't create the additions ISO.
204# (Used by the additions build server, don't invert it.)
205#VBOX_WITHOUT_ADDITIONS_ISO = 1
206
207# the documentation
208VBOX_WITH_DOCS = 1
209# Use documentation from the build server.
210#VBOX_WITH_DOCS_FROM_BUILD_SERVER = 1
211# Don't bother with documentation, overrides VBOX_WITH_DOCS.
212# This is not used by makefiles, only Config.kmk, see below.
213#VBOX_WITHOUT_DOCS = 1
214# Only build the documentation (for the documentation build server).
215#VBOX_ONLY_DOCS = 1
216ifdef VBOX_DOCS_ONLY # typical mistake.
217 $(error It is VBOX_ONLY_DOCS=1 not VBOX_DOCS_ONLY!)
218endif
219
220# build the installer
221VBOX_WITH_INSTALLER = 1
222# enable VRDP server
223VBOX_WITH_VRDP = 1
224# build VRDP authentication modules
225VBOX_WITH_VRDP_AUTHMOD = 1
226# build enhanced version of rdesktop
227VBOX_WITH_VRDP_RDESKTOP = 1
228if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.x86 l4.x86 l4.amd64)
229# build the support driver & library with IDT patching.
230VBOX_WITH_IDT_PATCHING = 1
231endif
232# Activate this to force the VM to pre-allocate the guest RAM before startup
233VBOX_WITH_PREALLOC_RAM_BY_DEFAULT =
234# The kernel driver/module and related runtime libraries.
235VBOX_WITH_VBOXDRV = 1
236# build with secure label support
237ifeq ($(filter win.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),) # too much work with freetype and all that.
238VBOX_WITH_SECURELABEL = 1
239endif
240
241# The main api.
242VBOX_WITH_MAIN = 1
243# The webservices api.
244VBOX_WITH_WEBSERVICES = 1
245# The SDL based GUI.
246VBOX_WITH_VBOXSDL = 1
247# The basic frontend (w/o Main).
248VBOX_WITH_VBOXBFE = 1
249# The Qt GUI.
250VBOX_WITH_QTGUI = 1
251# The Qt 4 GUI.
252VBOX_WITH_QT4GUI = 1
253# The headless frontend.
254VBOX_WITH_HEADLESS = 1
255## the Direct Framebuffer GUI
256#VBOX_WITH_VBOXFB = 1
257# Enable the debugger.
258ifneq ($(KBUILD_TYPE),release)
259 VBOX_WITH_DEBUGGER = 1
260 # Enable the debugger GUI.
261 VBOX_WITH_DEBUGGER_GUI = 1
262endif
263# build the Host Guest Communication Manager component
264VBOX_WITH_HGCM = 1
265# Enable the USB feature.
266VBOX_WITH_USB = 1
267# Enable the USB 2.0 controller
268VBOX_WITH_EHCI = 1
269# Enable the ISCSI feature.
270VBOX_WITH_ISCSI = 1
271# Enable the E1000 feature
272VBOX_WITH_E1000 = 1
273# Enable ALSA support for Linux
274VBOX_WITH_ALSA = 1
275# Enable Pulse support for Linux
276VBOX_WITH_PULSE = 1
277# Disable WINMM support for Windows (not implemented)
278VBOX_WITH_WINMM =
279# Disable VMI BIOS (not yet ready)
280VBOX_WITH_VMI =
281# Enable the kchmviewer
282VBOX_WITH_KCHMVIEWER = 1
283# Build the testsuite.
284VBOX_WITH_TESTSUITE = 1
285# Build the testcases.
286VBOX_WITH_TESTCASES = 1
287# Set this to not use COM or XPCOM in places where it can be avoided.
288#VBOX_WITHOUT_COM = 1
289# Set this to prefix all C symbols in XPCOM, to avoid dynamic linking problems
290# caused by our XPCOM library polluting the symbol namespace for system libs.
291# @todo disabled this for now, as it causes problem with old external xpcom components.
292if1of ($(KBUILD_TARGET), linux solaris)
293 VBOX_WITH_XPCOM_NAMESPACE_CLEANUP = 1
294endif
295# Set this to skip installing the redistributable compiler runtime.
296#VBOX_WITHOUT_COMPILER_REDIST = 1
297# Enabled internal networking.
298VBOX_WITH_INTERNAL_NETWORKING = 1
299# Enables the ffmpeg module for recording test runs.
300# Enable this for non-Linux builds later.
301ifeq ($(KBUILD_TARGET),linux)
302# VBOX_WITH_FFMPEG = 1
303endif
304# Enable OpenGL service
305VBOX_WITH_OGL = 1
306# Enable shared folders
307VBOX_WITH_SHARED_FOLDERS = 1
308# Enable shared clipboard
309VBOX_WITH_SHARED_CLIPBOARD = 1
310# Enable the Intel PXE ROM (replaces Etherboot).
311VBOX_WITH_INTEL_PXE = 1
312# Strip binaries of release and profile builds
313VBOX_DO_STRIP = $(if $(filter release profile,$(KBUILD_TYPE)),1,)
314# Strip R0/GC modules (current requirement for our loader)
315VBOX_DO_STRIP_MODULES = 1
316# Use kStuff for MACH-O and LX binary loading.
317if1of ($(KBUILD_TARGET),darwin os2)
318IPRT_WITH_KSTUFF = 1
319endif
320# Enable Crossbow support for Solaris.
321VBOX_WITH_CROSSBOW = 1
322# Enable setuid wrapper for Solaris.
323#VBOX_WITH_SUID_WRAPPER = 1
324# Enable the PDM Lock and let I/O threads call into the PICs.
325VBOX_WITH_PDM_LOCK = 1
326# Enable Seamless mode
327VBOX_X11_SEAMLESS_GUEST = 1
328# Enable the virtual SATA/AHCI controller
329VBOX_WITH_AHCI = 1
330# Enable the new async completion manager
331VBOX_WITH_PDM_ASYNC_COMPLETION = 1
332# Temporary switch for enabling / disabling the new USB code on Darwin.
333VBOX_WITH_NEW_USB_CODE_ON_DARWIN=1
334# Use the new VBI module on Solaris.
335VBOX_WITH_SOLARIS_VBI = 1
336# Enable 64 bits guest pointers.
337if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), linux.amd64 solaris.amd64 win.amd64)
338VBOX_WITH_64_BITS_GUESTS = 1
339else
340# VBOX_WITH_64_BITS_GUESTS = 1
341endif
342# Enable SMP support in guests
343VBOX_WITH_SMP_GUESTS = 0
344# Enable the host/guest information service (aka guest properties).
345VBOX_WITH_GUEST_PROPS = 1
346# Enable performance API.
347VBOX_WITH_RESOURCE_USAGE_API = 1
348# Enables all the doxgen bits.
349VBOX_WITH_ALL_DOXYGEN_TARGETS = 1
350# Enables the Python<->XPCOM and later Python<->COM bindings.
351# (Current not enabled by default because all the build servers has
352# different Python versions installed and would start burning.)
353if1of ($(KBUILD_TARGET), solaris)
354 VBOX_WITH_PYTHON = 1
355endif
356# Enables hardening.
357# Most developers will want to disable this in their LocalConfig.kmk.
358ifn1of ($(KBUILD_TARGET), win)
359 VBOX_WITH_HARDENING = 1
360endif
361# Where the application files are (going to be) installed.
362#VBOX_PATH_APP_PRIVATE = /usr/lib/virtualbox
363ifdef VBOX_WITH_HARDENING
364 if1of ($(KBUILD_TARGET), solaris)
365 VBOX_PATH_APP_PRIVATE = /opt/VirtualBox
366 else ifeq ($(KBUILD_TARGET),darwin)
367 VBOX_PATH_APP_PRIVATE = /Applications/VirtualBox.app/Contents/MacOS
368 endif
369endif
370# Where the architecture specific application files are (going to be) installed.
371#VBOX_PATH_APP_PRIVATE_ARCH = /usr/lib/virtualbox
372ifdef VBOX_WITH_HARDENING
373 if1of ($(KBUILD_TARGET), darwin solaris)
374 VBOX_PATH_APP_PRIVATE_ARCH = $(VBOX_PATH_APP_PRIVATE)
375 endif
376endif
377# Where the shared libraries are (going to be) installed.
378#VBOX_PATH_SHARED_LIBS = /usr/lib
379ifdef VBOX_WITH_HARDENING
380 if1of ($(KBUILD_TARGET), darwin solaris)
381 VBOX_PATH_SHARED_LIBS = $(VBOX_PATH_APP_PRIVATE)
382 endif
383endif
384# Where the documentation is (going to be) installed.
385#VBOX_PATH_APP_DOCS = /usr/share/doc/virtualbox
386ifdef VBOX_WITH_HARDENING
387 if1of ($(KBUILD_TARGET), darwin solaris)
388 VBOX_PATH_APP_DOCS = $(VBOX_PATH_APP_PRIVATE)
389 endif
390endif
391# The DT_RPATH/DT_RUNPATH to embed into the binaries (ELF).
392# (This one is used for all binaries, there is no need to adjust this
393# depending on the location of the object.)
394#VBOX_WITH_RUNPATH = /usr/lib/virtualbox
395ifdef VBOX_WITH_HARDENING
396 if1of ($(KBUILD_TARGET), solaris)
397 VBOX_WITH_RUNPATH = $(VBOX_PATH_APP_PRIVATE)
398 endif
399endif
400# Enable use of the $ORIGIN DT_RPATH/DT_RUNPATH feature (ELF).
401# Because of the setuid usage on all ELF platforms when hardening the build
402# things gets a bit complicated since the $ORIGIN+setuid policy differs.
403#VBOX_WITH_ORIGIN=1
404ifdef VBOX_WITH_HARDENING
405 if1of ($(KBUILD_TARGET), linux)
406 VBOX_WITH_ORIGIN = 1
407 endif
408else if1of ($(KBUILD_TARGET), linux solaris)
409 VBOX_WITH_ORIGIN = 1
410endif
411# Enable the system wide support service/daemon.
412# Work in progress, but required for hardening on Windows.
413#VBOX_WITH_SUPSVC = 1
414ifdef VBOX_WITH_HARDENING
415 if1of ($(KBUILD_TARGET), win)
416 VBOX_WITH_SUPSVC = 1
417 endif
418endif
419# Use VBoxNetFlt for host interface networking.
420if1of ($(KBUILD_TARGET), darwin solaris)
421 VBOX_WITH_NETFLT = 1
422endif
423
424
425#
426# Skip stuff.
427#
428
429# VBOX_QUICK can be used by core developers to speed to the build
430ifdef VBOX_QUICK
431 # undefine variables by assigning blank.
432 VBOX_WITH_TESTSUITE=
433 VBOX_WITH_TESTCASES=
434 VBOX_WITH_MAIN =
435 VBOX_WITH_VBOXSDL =
436 VBOX_WITH_VBOXBFE =
437 VBOX_WITH_QTGUI =
438 VBOX_WITH_QT4GUI =
439 VBOX_WITH_DEBUGGER_GUI =
440 VBOX_WITH_DOCS =
441endif # VBOX_QUICK
442
443ifeq ($(KBUILD_TARGET),darwin)
444 # Don't bother with SDL ttf for now.
445 VBOX_WITH_SECURELABEL=
446 # We'll use the native html/help viewer.
447 VBOX_WITH_KCHMVIEWER=
448 # Later:
449 VBOX_WITH_VRDP_AUTHMOD=
450 VBOX_WITH_VRDP_RDESKTOP=
451 VBOX_WITH_PDM_ASYNC_COMPLETION=
452endif
453
454ifeq ($(KBUILD_TARGET),freebsd)
455 VBOX_WITH_INSTALLER=
456 VBOX_WITH_SECURELABEL=
457 VBOX_WITH_VRDP_AUTHMOD=
458 VBOX_WITH_VRDP_RDESKTOP=
459 VBOX_WITH_TESTSUITE=
460 VBOX_WITH_USB=
461 VBOX_WITH_EHCI=
462 VBOX_WITH_DOCS=
463 VBOX_WITH_KCHMVIEWER=
464endif
465
466ifeq ($(KBUILD_TARGET),l4)
467 VBOX_WITH_VBOXDRV=
468 VBOX_WITH_ADDITION_DRIVERS=
469 VBOX_WITH_VRDP=
470 VBOX_WITH_HEADLESS=
471 VBOX_WITH_VBOXSDL=
472 VBOX_WITH_QTGUI=
473 VBOX_WITH_QT4GUI=
474 VBOX_WITH_MAIN=
475 VBOX_WITH_DOCS=
476 VBOX_WITH_ISCSI=
477 VBOX_WITH_INTERNAL_NETWORKING=
478 VBOX_WITH_PDM_ASYNC_COMPLETION=
479 VBOX_WITH_KCHMVIEWER=
480 VBOX_WITH_HARDENING=
481endif
482
483ifeq ($(KBUILD_TARGET),os2)
484 VBOX_WITH_INSTALLER=
485 VBOX_WITH_SECURELABEL=
486 VBOX_WITH_VRDP_AUTHMOD=
487 VBOX_WITH_VRDP_RDESKTOP=
488 VBOX_WITH_TESTSUITE=
489 VBOX_WITH_QT4GUI=
490 VBOX_WITH_USB=
491 VBOX_WITH_EHCI=
492 VBOX_WITH_DOCS=
493 VBOX_WITH_PDM_ASYNC_COMPLETION=
494 VBOX_WITH_KCHMVIEWER=
495 VBOX_WITH_HARDENING=
496endif
497
498ifeq ($(KBUILD_TARGET),solaris)
499 VBOX_WITH_SECURELABEL=
500 VBOX_WITH_USB=
501 VBOX_WITH_OGL=
502endif
503
504ifeq ($(KBUILD_TARGET),win)
505 VBOX_WITH_VRDP_RDESKTOP=
506 VBOX_WITH_KCHMVIEWER=
507endif
508
509
510#
511# Include automatic and local config file to override the above settings
512# and to provide defaults for the settings below this point.
513#
514AUTOCFG := $(wildcard $(PATH_ROOT)/AutoConfig.kmk)
515ifeq ($(AUTOCFG),)
516 # deprecated name. to be removed.
517 AUTOCFG := $(wildcard $(PATH_ROOT)/Config.kmkconf)
518 ifneq ($(AUTOCFG),)
519 $(warning Config.kmkconf has been renamed. Please re-run configure.)
520 endif
521endif
522ifneq ($(AUTOCFG),)
523 include $(AUTOCFG)
524endif
525
526LOCALCFG := $(wildcard $(PATH_ROOT)/LocalConfig.kmk)
527ifeq ($(LOCALCFG),)
528 # deprecated name. to be removed.
529 LOCALCFG := $(wildcard $(PATH_ROOT)/Config.kmklocal)
530 ifneq ($(LOCALCFG),)
531 $(warning Please rename your Config.kmklocal to LocalConfig.kmk.)
532 endif
533endif
534ifneq ($(LOCALCFG),)
535 include $(LOCALCFG)
536endif
537
538
539#
540# Disable components that are not open sourced.
541#
542ifdef VBOX_OSE
543 VBOX_WITH_WEBSERVICES=
544 VBOX_WITH_VRDP=
545 VBOX_WITH_USB=
546 VBOX_WITH_EHCI=
547 VBOX_WITH_ISCSI=
548 VBOX_WITH_E1000=
549 VBOX_WITH_VMI=
550 ifn1of ($(KBUILD_TARGET), darwin solaris)
551 VBOX_WITH_NETFLT=
552 endif
553 VBOX_WITH_DEBUGGER_GUI=
554 VBOX_WITH_WIN32_ADDITIONS_SHAREDFOLDERS=
555 VBOX_WITHOUT_ADDITIONS_ISO=1
556 VBOX_WITH_OS2_ADDITIONS_BIN=
557 VBOX_WITH_SECURELABEL=
558 VBOX_WITH_KCHMVIEWER=
559 VBOX_WITH_DOCS=
560 VBOX_WITH_TESTSUITE=
561 VBOX_WITH_INTEL_PXE=
562 VBOX_WITH_FFMPEG=
563 ifeq ($(KBUILD_TARGET),darwin)
564 # Qt/Mac v3.3.x requires patching to work for us.
565 VBOX_WITH_QTGUI=
566 endif
567 ifn1of ($(KBUILD_TARGET), linux solaris)
568 # Only the Linux, Solaris installers are public
569 VBOX_WITH_INSTALLER=
570 endif
571 VBOX_WITH_AHCI=
572 VBOX_WITH_PDM_ASYNC_COMPLETION=
573endif
574
575#
576# VBOX_WITHOUT_HARDENING is for developers (put in LocalConfig.kmk).
577# Note that this is a bit rough since hardening governs more than one
578# variable...
579#
580ifdef VBOX_WITHOUT_HARDENING
581 VBOX_WITH_HARDENING=
582 VBOX_PATH_APP_PRIVATE=
583 VBOX_PATH_APP_PRIVATE_ARCH=
584 VBOX_PATH_SHARED_LIBS=
585 VBOX_PATH_APP_DOCS=
586 VBOX_WITH_RUNPATH=
587 if1of ($(KBUILD_TARGET), linux solaris)
588 VBOX_WITH_ORIGIN=1
589 endif
590endif
591
592#
593# Sanitize the additions build config variables.
594#
595ifdef VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER
596 VBOX_WITHOUT_ADDITIONS := 1
597 ifdef VBOX_ONLY_ADDITIONS
598 $(error VBOX_ONLY_ADDITIONS + VBOX_WITH_ADDITIONS_FROM_BUILD_SERVER does not add up!)
599 endif
600endif
601
602ifdef VBOX_ONLY_ADDITIONS
603 ifdef VBOX_WITHOUT_ADDITIONS
604 $(error VBOX_ONLY_ADDITIONS + VBOX_WITHOUT_ADDITIONS does not add up!)
605 endif
606endif
607
608ifdef VBOX_WITHOUT_ADDITIONS
609 # Zap anything that could be contradicting this.
610 VBOX_WITH_ADDITIONS :=
611endif
612
613#
614# Sanitize the documentation build config variables.
615#
616ifdef VBOX_WITH_DOCS_FROM_BUILD_SERVER
617 VBOX_WITHOUT_DOCS := 1
618 ifdef VBOX_ONLY_DOCS
619 $(error VBOX_ONLY_DOCS + VBOX_WITH_DOCS_FROM_BUILD_SERVER does not add up!)
620 endif
621endif
622
623ifdef VBOX_ONLY_DOCS
624 ifdef VBOX_WITHOUT_DOCS
625 $(error VBOX_ONLY_DOCS + VBOX_WITHOUT_DOCS does not add up!)
626 endif
627endif
628
629ifdef VBOX_WITHOUT_DOCS
630 # Zap anything that could be contradicting this.
631 VBOX_WITH_DOCS :=
632endif
633
634#
635# Disable components for headless
636#
637ifdef VBOX_HEADLESS
638 VBOX_WITH_QTGUI=
639 VBOX_WITH_QT4GUI=
640 VBOX_WITH_VBOXSDL=
641 VBOX_WITH_VBOXBFE=
642 VBOX_WITH_OGL=
643 VBOX_WITH_KCHMVIEWER=
644endif
645
646#
647# Undefined VBOX_WITH_MAIN implies exclusion of a few more items.
648#
649ifndef VBOX_WITH_MAIN
650 VBOX_WITH_VRDP=
651 VBOX_WITH_VBOXSDL=
652 VBOX_WITH_QTGUI=
653 VBOX_WITH_QT4GUI=
654 VBOX_WITH_DEBUGGER_GUI=
655 VBOX_WITH_HEADLESS=
656endif
657
658ifndef VBOX_WITH_QT4GUI
659 VBOX_WITH_KCHMVIEWER=
660endif
661
662#
663# Check for incompatible combinations.
664#
665ifdef VBOX_WITH_RUNPATH
666 ifdef VBOX_WITH_ORIGIN
667 $(error VBOX_WITH_RUNPATH and VBOX_WITH_ORIGIN are mutually exclusive (lazy bird))
668 endif
669endif
670
671#
672# Mark OSE builds clearly, helps figuring out limitations more easily.
673#
674ifdef VBOX_OSE
675VBOX_VERSION_STRING = $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)_OSE
676endif
677
678
679#
680# Image and object format config.
681#
682if1of ($(KBUILD_TARGET), linux l4 freebsd netbsd openbsd solaris)
683 VBOX_LDR_FMT = elf
684endif
685ifeq ($(KBUILD_TARGET),darwin)
686 VBOX_LDR_FMT = macho
687endif
688ifeq ($(KBUILD_TARGET),os2)
689 VBOX_LDR_FMT = lx
690 VBOX_LDR_FMT32 = lx
691 VBOX_LDR_FMT64 = elf
692 DONT_USE_YASM = 1 # yasm doesn't implement omf yet.
693endif
694ifeq ($(KBUILD_TARGET),win)
695 VBOX_LDR_FMT = pe
696endif
697VBOX_LDR_FMT32 ?= $(VBOX_LDR_FMT)
698VBOX_LDR_FMT64 ?= $(VBOX_LDR_FMT)
699
700#
701# Assembler setup.
702#
703# This is a bit complicated since we have to support two different assmblers
704# (yasm/nasm) and possibly two different formats (32-bit/64-bit).
705#
706ifeq ($(VBOX_LDR_FMT),elf)
707 ifeq ($(KBUILD_TARGET_ARCH),x86)
708VBOX_ASFLAGS_FMT = -f elf32 -DASM_FORMAT_ELF
709 else
710VBOX_ASFLAGS_FMT = -f elf64 -DASM_FORMAT_ELF
711 endif
712 VBOX_ASFLAGS_DBFINFO = -g dwarf2
713endif
714ifeq ($(VBOX_LDR_FMT),lx)
715 VBOX_ASFLAGS_FMT = -f obj -DASM_FORMAT_OMF
716 VBOX_ASFLAGS_DBFINFO = -g stabs
717endif
718ifeq ($(VBOX_LDR_FMT),macho)
719 VBOX_ASFLAGS_FMT = -f macho -DASM_FORMAT_MACHO
720 VBOX_ASFLAGS_DBFINFO = -g dwarf2
721endif
722ifeq ($(VBOX_LDR_FMT),pe)
723 ifeq ($(KBUILD_TARGET_ARCH),x86)
724VBOX_ASFLAGS_FMT = -f win32 -DASM_FORMAT_PE
725 else
726VBOX_ASFLAGS_FMT = -f win64 -DASM_FORMAT_PE
727 endif
728VBOX_ASFLAGS_DBFINFO = -g cv8
729endif
730ifndef VBOX_ASFLAGS_FMT
731 $(error VBOX_ASFLAGS_FMT is not defined. VBOX_LDR_FMT=$(VBOX_LDR_FMT))
732endif
733
734ifeq ($(VBOX_LDR_FMT32),elf)
735 VBOX_ASFLAGS_FMT32 = -f elf32 -DASM_FORMAT_ELF
736 VBOX_ASFLAGS_DBFINFO32 = -g dwarf2
737endif
738ifeq ($(VBOX_LDR_FMT32),lx)
739 VBOX_ASFLAGS_FMT32 = -f obj -DASM_FORMAT_OMF
740 VBOX_ASFLAGS_DBFINFO32 = -g stabs
741endif
742ifeq ($(VBOX_LDR_FMT32),macho)
743 VBOX_ASFLAGS_FMT32 = -f macho -DASM_FORMAT_MACHO
744 VBOX_ASFLAGS_DBFINFO32 = -g dwarf2
745endif
746ifeq ($(VBOX_LDR_FMT32),pe)
747 VBOX_ASFLAGS_FMT32 = -f win32 -DASM_FORMAT_PE
748 VBOX_ASFLAGS_DBFINFO32 = -g cv8
749endif
750ifndef VBOX_ASFLAGS_FMT32
751 $(error VBOX_ASFLAGS_FMT32 is not defined. VBOX_LDR_FMT32=$(VBOX_LDR_FMT32))
752endif
753
754ifeq ($(VBOX_LDR_FMT64),elf)
755 VBOX_ASFLAGS_FMT64 = -f elf64 -DASM_FORMAT_ELF
756 VBOX_ASFLAGS_DBFINFO64 = -g dwarf2
757endif
758ifeq ($(VBOX_LDR_FMT64),macho)
759 VBOX_ASFLAGS_FMT64 = -f macho64 -DASM_FORMAT_MACHO
760 VBOX_ASFLAGS_DBFINFO64 = -g dwarf2
761endif
762ifeq ($(VBOX_LDR_FMT64),pe)
763 VBOX_ASFLAGS_FMT64 = -f win64 -DASM_FORMAT_PE
764 VBOX_ASFLAGS_DBFINFO64 = -g cv8
765endif
766ifndef VBOX_ASFLAGS_FMT64
767 $(error VBOX_ASFLAGS_FMT64 is not defined. VBOX_LDR_FMT64=$(VBOX_LDR_FMT64))
768endif
769
770ifndef DONT_USE_YASM
771 VBOX_ASTOOL = YASM
772 VBOX_LDR_FMT_2_YASM_DBGINFO.elf = -g dwarf2
773 VBOX_LDR_FMT_2_YASM_DBGINFO.lx = -g stabs
774 VBOX_LDR_FMT_2_YASM_DBGINFO.macho =
775 VBOX_LDR_FMT_2_YASM_DBGINFO.pe = -g cv8
776 VBOX_ASFLAGS = $(VBOX_ASFLAGS_FMT) -D__YASM__ -Worphan-labels $(VBOX_LDR_FMT_2_YASM_DBGINFO.$(VBOX_LDR_FMT))
777 VBOX_ASFLAGS32 = $(VBOX_ASFLAGS_FMT32) -D__YASM__ -Worphan-labels $(VBOX_LDR_FMT_2_YASM_DBGINFO.$(VBOX_LDR_FMT32))
778 VBOX_ASFLAGS64 = $(VBOX_ASFLAGS_FMT64) -D__YASM__ -Worphan-labels $(VBOX_LDR_FMT_2_YASM_DBGINFO.$(VBOX_LDR_FMT64))
779else
780 VBOX_ASTOOL = NASM
781 VBOX_ASFLAGS = $(subst elf32,elf,$(VBOX_ASFLAGS_FMT)) -D__NASM__ -w+orphan-labels -g
782 VBOX_ASFLAGS32 = $(subst elf32,elf,$(VBOX_ASFLAGS_FMT32)) -D__NASM__ -w+orphan-labels -g
783 VBOX_ASFLAGS64 = $(VBOX_ASFLAGS_FMT64) -D__NASM__ -w+orphan-labels -g
784endif
785
786#
787# Windows only has mingw handy. On *nix we have to deal with cross compiling
788# 32-bit targets on 64-bit platforms, meaning we'll be using gcc32/g++32.
789# In the latter case we'll also have to disable all the all the R0 driver related stuff.
790#
791ifndef VBOX_GCC_TOOL
792 ifeq ($(KBUILD_TARGET),win)
793 VBOX_GCC_TOOL := MINGW32
794 TOOL_MINGW32_CFLAGS := $(UNDEFINED) # override -g
795 else ifeq ($(KBUILD_TARGET),os2)
796 VBOX_GCC_TOOL := GXX3OMF
797 else ifeq ($(KBUILD_TARGET),darwin)
798 VBOX_GCC_TOOL := GXX4MACHO
799 else ifeq ($(KBUILD_TARGET),solaris)
800 VBOX_GCC_TOOL := GXX3PLAIN
801 VBOX_GCC32_TOOL := GXX3PLAIN
802 else
803 VBOX_GCC_TOOL := GXX3
804 ifeq ($(KBUILD_TARGET_ARCH).$(KBUILD_HOST_ARCH),x86.amd64) ## @todo mixing target/host here!
805 VBOX_GCC_TOOL := GXX32
806 VBOX_WITH_VBOXDRV=
807 else ifeq ($(KBUILD_TARGET_ARCH).$(KBUILD_HOST_ARCH),amd64.x86)
808 VBOX_GCC_TOOL := GXX64
809 VBOX_WITH_VBOXDRV=
810 endif
811 endif
812endif
813ifndef VBOX_GCC32_TOOL
814 ifeq ($(KBUILD_TARGET_ARCH),x86)
815 VBOX_GCC32_TOOL := $(VBOX_GCC_TOOL)
816 else ifeq ($(KBUILD_TARGET),win)
817 VBOX_GCC32_TOOL := MINGW32
818 else
819 VBOX_GCC32_TOOL := GXX32
820 endif
821endif
822
823#
824# Decide which Visual C++ compiler version we're using by default.
825#
826ifndef VBOX_VCC_TOOL
827 ifeq ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH),win.amd64)
828 VBOX_USE_VCC80 ?= 1 # Enforce VCC80 when targetting AMD64.
829 endif
830 ifdef VBOX_USE_VCC80
831 ifeq ($(KBUILD_TARGET_ARCH),x86)
832 VBOX_VCC_TOOL := VCC80X86
833 else
834 VBOX_VCC_TOOL := VCC80AMD64
835 endif
836 else
837 VBOX_VCC_TOOL := VCC70
838 endif
839endif
840
841#
842# The kBuild tools and SDKs are using PATH_DEVTOOLS, PATH_DEVTOOLS_BLD
843# and PATH_DEVTOOLS_TRG to find things if we give them specific locations.
844#
845PATH_DEVTOOLS ?= $(PATH_ROOT)/tools
846PATH_DEVTOOLS := $(abspath $(PATH_DEVTOOLS))
847PATH_DEVTOOLS_BLD ?= $(PATH_DEVTOOLS)/$(KBUILD_HOST).$(KBUILD_HOST_ARCH)
848PATH_DEVTOOLS_TRG ?= $(PATH_DEVTOOLS)/$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)
849
850## @todo Remove the default tool crap here!
851TOOL = $(VBOX_GCC_TOOL)
852ifdef VBOX_USE_VCC80
853 TOOL.win.x86 = VCC80X86
854 TOOL.win.amd64 = VCC80AMD64
855else
856 TOOL.win = VCC70
857endif
858ASTOOL = $(VBOX_ASTOOL)
859
860#
861# L4-specific settings.
862#
863ifdef L4_DIR
864 ifeq ($(KBUILD_TARGET),l4)
865 L4_API ?= l4v2
866 L4_ARCH ?= $(KBUILD_TARGET_ARCH)
867 ifeq ($(L4_ARCH),x86)
868 L4_CPU ?= 586
869 L4LINUX26_INCDIR := $(L4LINUX26_DIR)/include \
870 $(L4LINUX26_DIR)/include/asm-l4/i386-arch
871 else ifeq ($(L4_ARCH),amd64)
872 L4_CPU ?= k8
873 L4LINUX26_INCDIR := $(L4LINUX26_DIR)/include
874 # no red zone for L4 because of IPC bindings
875 CFLAGS.l4 = -mno-red-zone
876 CXXFLAGS.l4 = -mno-red-zone
877 else
878 $(error L4_ARCH=$(L4_ARCH))
879 endif
880 L4_OBJ := $(L4_DIR)/build-$(L4_ARCH)-$(L4_CPU)-$(L4_API)
881 # support splitted Linux kernels (make O=<build directory>)
882 kernelsrc := $(shell $(SED_EXT) -ne 's+^KERNELSRC.*= *\(.*\)+\1+p' $(L4LINUX26_DIR)/Makefile)
883 ifneq ($(kernelsrc),)
884 kernelpath := $(realpath $(kernelsrc))
885 L4LINUX26_INCDIR += $(L4LINUX26_DIR)/include2 $(kernelpath)/include
886 endif
887 L4_INCDIR := \
888 $(L4_OBJ)/include/uclibc++ \
889 $(L4_OBJ)/include/$(L4_ARCH)/uclibc \
890 $(L4_OBJ)/include/uclibc \
891 $(L4LINUX26_INCDIR) \
892 $(L4_OBJ)/include/$(L4_ARCH)/$(L4_API) \
893 $(L4_OBJ)/include/$(L4_API) \
894 $(L4_OBJ)/include/$(L4_ARCH) \
895 $(L4_OBJ)/include \
896 $(L4_DIR)/tool/dice/include
897 L4_LIBDIR := \
898 $(L4_DIR)/build-$(L4_ARCH)-$(L4_CPU)-$(L4_API)/lib/$(L4_ARCH)_$(L4_CPU)/$(L4_API)
899 endif # KBUILD_TARGET == l4
900endif # L4_DIR
901
902# Produce debugging information that the Fiasco kernel debugger can read.
903ifeq ($(KBUILD_TARGET).$(KBUILD_TYPE),l4.debug)
904 DEBUG_L4 = -gstabs+
905endif
906
907#
908# Setup the global defines and includes.
909#
910# Note! The __SOMETHING__ #defines are deprecated as they violate the C/C++ specs.
911#
912INCS += $(PATH_ROOT)/include $(PATH_OUT)
913DEFS += VBOX
914DEFS.debug := DEBUG DEBUG_$(subst $(subst _, ,_),_,$(USERNAME)) DEBUG_USERNAME=$(subst $(subst _, ,_),_,$(USERNAME))
915DEFS.profile = VBOX_WITH_STATISTICS
916DEFS.x86 = RT_ARCH_X86 __X86__
917DEFS.amd64 = RT_ARCH_AMD64 __AMD64__
918DEFS.darwin = RT_OS_DARWIN __DARWIN__
919DEFS.darwin.x86 = VBOX_WITH_HYBIRD_32BIT_KERNEL
920DEFS.freebsd = RT_OS_FREEBSD __FREEBSD__
921DEFS.l4 = RT_OS_L4 __L4__ __L4ENV__ L4API_l4v2 ARCH_$(KBUILD_TARGET_ARCH) __NO_CTYPE _FILE_OFFSET_BITS=64
922DEFS.linux = RT_OS_LINUX _FILE_OFFSET_BITS=64
923DEFS.netbsd = RT_OS_NETBSD
924DEFS.openbsd = RT_OS_OPENBSD
925DEFS.os2 = RT_OS_OS2 __OS2__
926DEFS.solaris = RT_OS_SOLARIS _FILE_OFFSET_BITS=64
927DEFS.win = RT_OS_WINDOWS __WIN__
928DEFS.win.x86 = __WIN32__
929DEFS.win.amd64 = __WIN64__
930# optional defines (use environment or make commandline)
931ifdef VBOX_WITH_DEBUGGER
932 DEFS += VBOX_WITH_DEBUGGER
933endif
934ifdef VBOX_WITH_DEBUGGER_GUI
935 DEFS += VBOX_WITH_DEBUGGER_GUI
936endif
937ifdef VBOX_WITH_STATISTICS
938 DEFS += VBOX_WITH_STATISTICS
939endif
940ifdef VBOX_STRICT
941 DEFS += VBOX_STRICT
942endif
943ifdef LOG_ENABLED
944 DEFS += LOG_ENABLED
945endif
946ifdef VBOX_OSE
947 DEFS += VBOX_OSE
948endif
949ifdef VBOX_WITH_NEW_PHYS_CODE
950 DEFS += VBOX_WITH_NEW_PHYS_CODE
951endif
952ifdef VBOX_WITH_64_BITS_GUESTS
953 DEFS += VBOX_WITH_64_BITS_GUESTS
954endif
955ifdef VBOX_WITH_SMP_GUESTS
956 DEFS += VBOX_WITH_SMP_GUESTS
957endif
958ifdef VBOX_WITH_HARDENING
959 DEFS += VBOX_WITH_HARDENING
960endif
961ifdef VBOX_PATH_APP_PRIVATE
962 DEFS += RTPATH_APP_PRIVATE=\"$(VBOX_PATH_APP_PRIVATE)\"
963endif
964ifdef VBOX_PATH_APP_PRIVATE_ARCH
965 DEFS += RTPATH_APP_PRIVATE_ARCH=\"$(VBOX_PATH_APP_PRIVATE_ARCH)\"
966endif
967ifdef VBOX_PATH_SHARED_LIBS
968 DEFS += RTPATH_SHARED_LIBS=\"$(VBOX_PATH_SHARED_LIBS)\"
969endif
970ifdef VBOX_PATH_APP_DOCS
971 DEFS += RTPATH_APP_DOCS=\"$(VBOX_PATH_APP_DOCS)\"
972endif
973## @todo eliminate these guys.
974ifdef VBOX_WITH_INTERNAL_NETWORKING
975DEFS += VBOX_WITH_INTERNAL_NETWORKING
976endif
977
978
979#
980# Compiler optimization flags.
981#
982ifeq ($(KBUILD_TYPE),debug)
983 VBOX_GCC_FP ?= -fno-omit-frame-pointer
984 VBOX_GCC_OPT ?= -O0
985 VBOX_VCC_FP ?= -Oy-
986 VBOX_VCC_OPT ?=
987 VBOX_GCC_GC_FP ?= -fno-omit-frame-pointer
988 VBOX_GCC_GC_OPT ?= -O0
989 VBOX_VCC_GC_FP ?= -Oy-
990 VBOX_VCC_GC_OPT ?=
991else
992 # We should use -fomit-frame-pointer for GCC / -Oy for VCC.
993 # -funwind-tables provides support for backtraces in gdb then.
994 VBOX_GCC_FP ?= -fno-omit-frame-pointer
995 VBOX_GCC_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
996 VBOX_VCC_FP ?= -Oy-
997 ifdef VBOX_USE_VCC80
998 VBOX_VCC_OPT ?= -O2 -GS-
999 else
1000 VBOX_VCC_OPT ?= -Ogitb2
1001 endif
1002 VBOX_GCC_GC_FP ?= -fno-omit-frame-pointer
1003 VBOX_GCC_GC_OPT ?= -O2 $(VBOX_GCC_mtune-generic)
1004 VBOX_VCC_GC_FP ?= -Oy-
1005 ifdef VBOX_USE_VCC80
1006 VBOX_VCC_GC_OPT ?= -O2
1007 else
1008 VBOX_VCC_GC_OPT ?= -Ogitb2
1009 endif
1010endif
1011
1012#
1013# ARCH_BITS_DEFS.
1014#
1015ifeq ($(KBUILD_TARGET_ARCH),amd64)
1016 ARCH_BITS_DEFS := HC_ARCH_BITS=64
1017else ifeq ($(KBUILD_TARGET_ARCH),x86)
1018 ARCH_BITS_DEFS := HC_ARCH_BITS=32
1019else
1020 error KBUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH)
1021endif
1022
1023ifdef VBOX_WITH_64_BITS_GUESTS
1024 VBOX_GC_ARCH_BITS_DEFS := GC_ARCH_BITS=64
1025else
1026 VBOX_GC_ARCH_BITS_DEFS := GC_ARCH_BITS=32
1027endif
1028ARCH_BITS_DEFS += $(VBOX_GC_ARCH_BITS_DEFS)
1029
1030#
1031# Add the output dir(s) to the dynamic loader search path.
1032#
1033if1of ($(KBUILD_TARGET), linux l4 freebsd netbsd openbsd solaris)
1034 export LD_LIBRARY_PATH:=$(PATH_BIN):$(PATH_LIB):$(LD_LIBRARY_PATH)
1035endif
1036ifeq ($(KBUILD_TARGET),os2)
1037 #fixme! export BEGINLIBPATH:=$(PATH_BIN);$(PATH_LIB);$(BEGINLIBPATH)
1038endif
1039ifeq ($(KBUILD_TARGET),win)
1040 export PATH:=$(PATH_BIN);$(PATH_LIB);$(PATH)
1041endif
1042
1043#
1044# Common libraries and tools.
1045#
1046ifeq ($(KBUILD_TARGET),darwin)
1047 LIB_RUNTIME = $(PATH_BIN)/VBoxRT.dylib
1048 LIB_RUNTIME_EF = #$(PATH_LIB)/RuntimeEFCPP.a
1049 LIB_KPROFILE = $(PATH_BIN)/kPrf2.dylib
1050 LIB_VMM = $(PATH_BIN)/VBoxVMM.dylib
1051 LIB_VMMGC = $(PATH_BIN)/VMMGC.gc
1052 LIB_REM = $(PATH_LIB)/VBoxREMImp.dylib
1053 LIB_XPCOM = $(PATH_BIN)/VBoxXPCOM.dylib
1054 LIB_DDU = $(PATH_BIN)/VBoxDDU.dylib
1055 LIB_SETTINGS = $(PATH_BIN)/VBoxSettings.dylib
1056endif
1057ifeq ($(KBUILD_TARGET),l4)
1058 LIB_RUNTIME = $(PATH_BIN)/VBoxRT.s.so
1059 LIB_RUNTIME_EF = #$(PATH_LIB)/RuntimeEFCPP.a
1060 LIB_KPROFILE = $(PATH_BIN)/kPrf2.s.so
1061 LIB_VMM = $(PATH_BIN)/VBoxVMM.s.so
1062 LIB_VMMGC = $(PATH_BIN)/VMMGC.gc
1063 LIB_REM = $(PATH_BIN)/VBoxREMImp.s.so
1064 LIB_XPCOM = $(PATH_BIN)/VBoxXPCOM.s.so
1065 LIB_DDU = $(PATH_BIN)/VBoxDDU.s.so
1066 LIB_SETTINGS = $(PATH_BIN)/VBoxSettings.s.so
1067endif
1068if1of ($(KBUILD_TARGET), linux freebsd netbsd openbsd solaris)
1069 LIB_RUNTIME = $(PATH_BIN)/VBoxRT.so
1070 LIB_RUNTIME_EF = $(PATH_LIB)/RuntimeEFCPP.a
1071 LIB_KPROFILE = $(PATH_BIN)/kPrf2.so
1072 LIB_VMM = $(PATH_BIN)/VBoxVMM.so
1073 LIB_VMMGC = $(PATH_BIN)/VMMGC.gc
1074 LIB_REM = $(PATH_BIN)/VBoxREMImp.so
1075 LIB_XPCOM = $(PATH_BIN)/VBoxXPCOM.so
1076 LIB_DDU = $(PATH_BIN)/VBoxDDU.so
1077 LIB_SETTINGS = $(PATH_BIN)/VBoxSettings.so
1078endif
1079ifeq ($(KBUILD_TARGET),os2)
1080 LIB_RUNTIME = $(PATH_BIN)/VBoxRT.dll
1081 LIB_RUNTIME_EF = #$(PATH_LIB)/RuntimeEFCPP.a
1082 LIB_KPROFILE = $(PATH_BIN)/kPrf2.dll
1083 LIB_VMM = $(PATH_BIN)/VBoxVMM.dll
1084 LIB_VMMGC = $(PATH_LIB)/VMMGCImp.lib
1085 LIB_REM = $(PATH_LIB)/VBoxREMImp.lib
1086 LIB_XPCOM = $(PATH_BIN)/VBoxXCOM.dll
1087 LIB_DDU = $(PATH_BIN)/VBoxDDU.dll
1088 LIB_SETTINGS = $(PATH_BIN)/VBoxSett.dll
1089 OBJ_SYS0 = $(PATH_OBJ)/src/VBox/Runtime/RuntimeR0/os2/sys0.obj
1090endif
1091ifeq ($(KBUILD_TARGET),win)
1092 LIB_RUNTIME = $(PATH_LIB)/VBoxRT.lib
1093 LIB_RUNTIME_EF = #$(PATH_LIB)/RuntimeEFCPP.lib
1094 LIB_KPROFILE = $(PATH_LIB)/kPrf2.lib
1095 LIB_VMM = $(PATH_LIB)/VBoxVMM.lib
1096 LIB_VMMGC = $(PATH_OBJ)/VMMGC/VMMGC.lib
1097 LIB_REM = $(PATH_LIB)/VBoxREMImp.lib
1098 LIB_XPCOM = $(PATH_BIN)/VBoxXPCOM.dll
1099 LIB_DDU = $(PATH_LIB)/VBoxDDU.lib
1100 LIB_SETTINGS = $(PATH_LIB)/VBoxSettings.lib
1101endif
1102VBOX_LIB_SUPHARDENED = $(PATH_LIB)/SUPR3HardenedStatic$(VBOX_SUFF_LIB)
1103
1104# The kprofile build automagically links with kProfile.
1105ifeq ($(KBUILD_TYPE),kprofile)
1106 LIB_RUNTIME += $(LIB_KPROFILE)
1107endif
1108
1109## Enable C++ electric fence heap. (Warning: will easily run out of virtual memory / kernel stuff on Linux/Windows.)
1110#LIB_RUNTIME += $(LIB_RUNTIME_EF) $(LIB_RUNTIME)
1111
1112# Overridable libraries (unix).
1113LIB_PTHREAD ?= pthread
1114
1115# Xcursor (consider an SDK for this).
1116# (LIB_XCURSOR is legacy, remove in a month or two.)
1117ifndef VBOX_XCURSOR_LIBS
1118 VBOX_XCURSOR_LIBS := $(LIB_XCURSOR)
1119endif
1120ifeq ($(VBOX_XCURSOR_LIBS),)
1121 ifeq ($(KBUILD_TARGET),solaris)
1122 VBOX_XCURSOR_LIBS := $(lastword $(wildcard $(PATH_DEVTOOLS_TRG)/libXcursor/*/lib/libXcursor.a))
1123 ifneq ($(VBOX_XCURSOR_LIBS),)
1124 VBOX_XCURSOR_INCS := $(patsubst %/lib/libXcursor.a,%/include, $(VBOX_XCURSOR_LIBS))
1125 VBOX_XCURSOR_LIBS += X11 Xrender Xfixes
1126 endif
1127 endif
1128 ifeq ($(VBOX_XCURSOR_LIBS),)
1129 VBOX_XCURSOR_LIBS := Xcursor
1130 endif
1131endif
1132
1133
1134# Intel ASL compiler for ACPI
1135VBOX_IASLCMD ?= $(firstword $(wildcard $(PATH_DEVTOOLS_BLD)/bin/iasl$(HOSTSUFF_EXE)) iasl$(HOSTSUFF_EXE))
1136
1137# Bruce's C compile is a C-compiler for BIOS-related 8086 code
1138VBOX_BCC ?= $(PATH_DEVTOOLS_BLD)/bin/bcc$(HOSTSUFF_EXE) -B $(PATH_DEVTOOLS_BLD)/bin/
1139
1140# Assembler for BIOS-related 8086 code
1141VBOX_AS86 ?= $(PATH_DEVTOOLS_BLD)/bin/as86$(HOSTSUFF_EXE)
1142
1143# libxslt XSLT processor. (see PATH_TOOL_YASM for explanation why it's temporarily located in bin.)
1144ifeq ($(KBUILD_HOST),win)
1145# VBOX_XSLTPROC ?= $(PATH_DEVTOOLS)/win.x86/libxslt/10114/xsltproc.exe
1146 VBOX_XSLTPROC ?= $(PATH_DEVTOOLS)/win.x86/bin/xsltproc.exe
1147else ifeq ($(KBUILD_HOST),os2)
1148 VBOX_XSLTPROC ?= BEGINLIBPATH="$(PATH_DEVTOOLS_BLD)/bin;$$BEGINLIBPATH" $(PATH_DEVTOOLS_BLD)/bin/xsltproc.exe
1149else
1150 VBOX_XSLTPROC ?= xsltproc$(HOSTSUFF_EXE)
1151endif
1152
1153# bin2c (convert binary files into C arrays)
1154VBOX_BIN2C ?= $(PATH_OBJ)/bin2c/bin2c$(HOSTSUFF_EXE)
1155
1156# mkisofs
1157ifeq ($(KBUILD_HOST),win)
1158 VBOX_MKISOFS ?= $(PATH_DEVTOOLS_BLD)/bin/mkisofs.exe
1159else
1160 VBOX_MKISOFS ?= mkisofs
1161endif
1162
1163# Makeself for the linux installers.
1164VBOX_MAKESELF ?= $(PATH_DEVTOOLS)/common/makeself/v2.1.4_1/makeself.sh
1165
1166# Microsoft HTML Help Workshop.
1167VBOX_PATH_HTML_HELP_WORKSHOP ?= $(PATH_DEVTOOLS)/win.x86/HTML_Help_Workshop/v1.3/
1168
1169# Path to the null soft installer.
1170VBOX_PATH_NSIS ?= $(PATH_DEVTOOLS)/win.x86/nsis/v2.33-log-nsscm-r1
1171
1172# Path to AutoIt3.
1173VBOX_PATH_AUTOIT3 ?= $(PATH_DEVTOOLS)/win.x86/autoit/v3.2.10.0
1174
1175# Windows install tools...
1176VBOX_PATH_WIX ?= $(PATH_DEVTOOLS)/win.x86/wix/v2.0.4611.0
1177VBOX_PATH_DIFX ?= $(PATH_DEVTOOLS)/win.$(KBUILD_TARGET_ARCH)/DIFx/v2.1
1178
1179# We need to export YASM for OSE, but since it was converted to .zip we need to
1180# allow for the location used by the zip to be properly cleaned up first.
1181if1of ($(KBUILD_HOST).$(KBUILD_HOST_ARCH), win.x86 linux.x86 solaris.x86)
1182 PATH_TOOL_YASM ?= $(PATH_DEVTOOLS_BLD)/bin
1183endif
1184
1185# XPCOM setup for all but win32.
1186ifneq ($(KBUILD_TARGET),win)
1187 VBOX_WITH_XPCOM = 1
1188 # if updating, also update xpidl_INST var in src/libs/xpcom18a4/Makefile.kmk
1189 VBOX_XPIDL ?= $(PATH_BIN)/xpidl$(HOSTSUFF_EXE)
1190 VBOX_PATH_XPCOM_IDL ?= $(VBOX_PATH_SDK)/bindings/xpcom/idl
1191 VBOX_XPCOM_INCS ?= \
1192 $(VBOX_PATH_SDK)/bindings/xpcom/include \
1193 $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \
1194 $(VBOX_PATH_SDK)/bindings/xpcom/include/string \
1195 $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \
1196 $(VBOX_PATH_SDK)/bindings/xpcom/include/nsprpub \
1197 $(VBOX_PATH_SDK)/bindings/xpcom/include/ipcd
1198 ifneq ($(KBUILD_TARGET),os2)
1199 # libIDL-config (for xpcom18a4)
1200 ifeq ($(origin VBOX_LIBIDL_CONFIG),undefined)
1201 export VBOX_LIBIDL_CONFIG := $(firstword $(shell which libIDL-config-2 libIDL-config 2> /dev/null))
1202 endif
1203 endif
1204endif
1205
1206ifeq ($(KBUILD_TARGET),os2)
1207 # search DLLs in the EXE directory first
1208 VBOX_XPIDL := BEGINLIBPATH="$(dir $(VBOX_XPIDL));$$BEGINLIBPATH" $(VBOX_XPIDL)
1209endif
1210#$(error $(VBOX_XPIDL))
1211
1212# The X11 LIBPATH. (The amd64 hack is for RHEL4.)
1213ifeq ($(KBUILD_TARGET_ARCH),amd64)
1214 VBOX_LIBPATH_X11 ?= /usr/X11R6/lib64 /usr/X11R6/lib
1215else
1216 VBOX_LIBPATH_X11 ?= /usr/X11R6/lib
1217endif
1218
1219# 32bit X11 LIBPATH for building 32bit guest additions
1220VBOX_LIBPATH32_X11 ?= /usr/X11R6/lib32 /usr/X11R6/lib
1221
1222#
1223# Macros dealing with the darwin version we're targeting.
1224#
1225ifeq ($(KBUILD_TARGET),darwin)
1226 VBOX_DEF_MACOSX_VERSION_MIN ?= 10.4
1227 ifeq ($(VBOX_DEF_MACOSX_VERSION_MIN),10.4)
1228 ifeq ($(origin VBOX_DARWIN_CLASSIC_LINKER),undefined)
1229 VBOX_DARWIN_CLASSIC_LINKER := $(shell ld -v 2>&1 )
1230 ifneq ($(filter ld64%, $(subst :, , $(VBOX_DARWIN_CLASSIC_LINKER))),)
1231 export VBOX_DARWIN_CLASSIC_LINKER := -Wl,-classic_linker
1232 else
1233 export VBOX_DARWIN_CLASSIC_LINKER :=
1234 endif
1235 endif
1236 VBOX_PATH_MACOSX_SDK ?= /Developer/SDKs/MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN)u.sdk
1237 else
1238 VBOX_PATH_MACOSX_SDK ?= /Developer/SDKs/MacOSX$(VBOX_DEF_MACOSX_VERSION_MIN).sdk
1239 endif
1240 VBOX_DARWIN_DEF_SDK_DEFS := MAC_OS_X_VERSION_MIN_REQUIRED=$(subst .,,$(VBOX_DEF_MACOSX_VERSION_MIN))0 \
1241 MAC_OS_X_VERSION_MAX_ALLOWED=$(subst .,,$(VBOX_DEF_MACOSX_VERSION_MIN))0
1242 VBOX_DARWIN_DEF_SDK_CFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot $(VBOX_PATH_MACOSX_SDK)
1243 VBOX_DARWIN_DEF_SDK_CXXFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot $(VBOX_PATH_MACOSX_SDK)
1244 VBOX_DARWIN_DEF_SDK_OBJCFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -isysroot $(VBOX_PATH_MACOSX_SDK)
1245 VBOX_DARWIN_DEF_SDK_LDFLAGS := -mmacosx-version-min=$(VBOX_DEF_MACOSX_VERSION_MIN) -Wl,-syslibroot,$(VBOX_PATH_MACOSX_SDK) $(VBOX_DARWIN_CLASSIC_LINKER)
1246endif # target=darwin
1247
1248#
1249# Macro switching between @executable_path and /Applications/VirtualBox.app
1250# depending on whether the build is hardened or not (dylib install_name)
1251#
1252ifndef VBOX_DYLD_EXECUTABLE_PATH
1253 ifdef VBOX_WITH_HARDENING
1254 VBOX_DYLD_EXECUTABLE_PATH = $(VBOX_PATH_APP_PRIVATE_ARCH)
1255 else
1256 VBOX_DYLD_EXECUTABLE_PATH = @executable_path
1257 endif
1258endif
1259
1260#
1261# The X11 headers.
1262#
1263VBOX_PATH_X11_ROOT = $(PATH_ROOT)/src/VBox/Additions/x11/x11include
1264VBOX_PATH_X11_XFREE_4_2 = $(VBOX_PATH_X11_ROOT)/4.2
1265VBOX_PATH_X11_XFREE_4_3 = $(VBOX_PATH_X11_ROOT)/4.3
1266VBOX_PATH_X11_XORG_7_0 = $(VBOX_PATH_X11_ROOT)/7.0
1267VBOX_PATH_X11_XORG_7_1 = $(VBOX_PATH_X11_ROOT)/7.1
1268VBOX_PATH_X11_XORG_1_3 = $(VBOX_PATH_X11_ROOT)/1.3
1269VBOX_PATH_X11_XORG_1_4 = $(VBOX_PATH_X11_ROOT)/1.4
1270VBOX_PATH_X11_XORG_1_5 = $(VBOX_PATH_X11_ROOT)/1.5
1271
1272#
1273# Various other variables.
1274#
1275
1276# Two helper variables for the VBOX_WITH_ORIGIN stuff:
1277# VBOX_ORIGIN - Indirect expansion trick.
1278# VBOX_GCC_RPATH_OPT - Different GCC/LD combinations needs different options.
1279VBOX_ORIGIN = $$ORIGIN
1280ifeq ($(KBUILD_TARGET),solaris)
1281 VBOX_GCC_RPATH_OPT = -R
1282else
1283 VBOX_GCC_RPATH_OPT = -Wl,-rpath,
1284endif
1285
1286# The icons to use.
1287ifdef VBOX_OSE
1288 VBOX_WINDOWS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_win.ico
1289 VBOX_NSIS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox_win.ico
1290 VBOX_MACOSX_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/images/OSE/VirtualBox.icns
1291else
1292 ifeq ($(KBUILD_HOST),win)
1293 VBOX_WINDOWS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/VirtualBox-vista.ico
1294 VBOX_NSIS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/VirtualBox-nsis.ico
1295 TOOL_VCC80X86_RC := $(PATH_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
1296 TOOL_VCC80AMD64_RC := $(PATH_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
1297 TOOL_VCC70_RC := $(PATH_DEVTOOLS)/win.x86/ddk/6000/bin/x86/rc.exe
1298 else
1299 VBOX_WINDOWS_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/VirtualBox-winxp.ico
1300 endif
1301 VBOX_MACOSX_ICON_FILE ?= $(PATH_ROOT)/src/VBox/Artwork/VirtualBox.icns
1302endif
1303
1304
1305#
1306# GCC stuff properties.
1307# Most of this is resolved on first kmk invocation and cached in PATH_OUT.
1308#
1309# Note! That a harmless warning is printed if the file doesn't exist.
1310# Note! Changes in GCC are not detected automatically (yet).
1311#
1312include $(KBUILD_PATH)/tools/$(VBOX_GCC_TOOL).kmk
1313ifneq ($(VBOX_GCC_TOOL),$(VBOX_GCC32_TOOL))
1314 include $(KBUILD_PATH)/tools/$(VBOX_GCC32_TOOL).kmk
1315endif
1316
1317# These tests never worked on Windows because of /dev/null, so, there
1318# can be no harm in just dropping them until cygwin is mp safe.
1319ifeq ($(KBUILD_HOST),win)
1320VBOX_GCC_CHECK_CC = $(2)
1321VBOX_GCC_CHECK_CXX = $(2)
1322VBOX_GCC_CHECK_LD = $(2)
1323VBOX_GCC32_CHECK_CXX = $(2)
1324else
1325VBOX_GCC_CHECK_CC = $(shell \
1326 if $(TOOL_$(VBOX_GCC_TOOL)_CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; \
1327 then echo "$(1)"; \
1328 else echo "$(2)"; fi; )
1329
1330VBOX_GCC_CHECK_CXX = $(shell \
1331 if $(TOOL_$(VBOX_GCC_TOOL)_CXX) $(1) -S -o /dev/null -xc++ /dev/null > /dev/null 2>&1; \
1332 then echo "$(1)"; \
1333 else echo "$(2)"; fi; )
1334
1335VBOX_GCC_CHECK_LD = $(shell \
1336 if $(TOOL_$(VBOX_GCC_TOOL)_LD) -Wl,$(1) -nostdlib -o /dev/null -xc /dev/null > /dev/null 2>&1 ;\
1337 then echo "-Wl,$(1)"; \
1338 else echo "$(2)"; fi; )
1339
1340VBOX_GCC32_CHECK_CXX = $(shell \
1341 if $(TOOL_$(VBOX_GCC32_TOOL)_CXX) $(1) -S -o /dev/null -xc++ /dev/null > /dev/null 2>&1; \
1342 then echo "$(1)"; \
1343 else echo "$(2)"; fi; )
1344endif
1345
1346ifeq ($(KBUILD_HOST),win)
1347# This isn't important (yet) on windows, so cook the result until
1348# cygwin is feeling better.
1349VBOX_GCC_VERSION := $(int-add $(int-mul 10000, 3), $(int-mul 100, 3), 3)
1350else
1351# This is kind of bad, the returned string needs to be re-evaluated before use.
1352# The reason for this hack is that the windows kmk_ash cannot deal with $((1+1)).
1353# Some versions of gcc (e.g. openSUSE11) return only major.minor on `gcc -dumpversion`.
1354VBOX_GCC_VERSION = $(shell \
1355 $(1) -dumpversion | $(SED_EXT) 's|\([0-9]\)\.\([0-9]\)\.\{0,1\}\([0-9]\{0,1\}\)|$$(int-add $$(int-mul 10000, \1), $$(int-mul 100, \2), $$(firstword \3 0))|' )
1356endif
1357
1358# No $(QUIET) here as it's interesting to see what goes into the file.
1359$(PATH_OUT)/GCCConfig.kmk: $(PATH_ROOT)/Config.kmk $(LOCALCFG) $(AUTOCFG)
1360 $(call MSG_GENERATE,,$@,)
1361 $(QUIET)$(RM) -f '$@'
1362 $(QUIET)$(MKDIR) -p $(@D)
1363
1364# HC compiler switch detection.
1365 $(APPEND) '$@' 'VBOX_GCC_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CC))'
1366 $(APPEND) '$@' 'VBOX_GCC_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC_TOOL)_CXX))'
1367 $(APPEND) '$@' 'VBOX_GCC_LIBGCC ?= $(shell $(TOOL_$(VBOX_GCC_TOOL)_CC) -print-libgcc-file-name)'
1368 $(APPEND) '$@' 'VBOX_GCC_Wno-pointer-sign ?= $(call VBOX_GCC_CHECK_CC,-Wno-pointer-sign,)'
1369 $(APPEND) '$@' 'VBOX_GCC_Wno-variadic-macros ?= $(call VBOX_GCC_CHECK_CXX,-Wno-variadic-macros,)'
1370 $(APPEND) '$@' 'VBOX_GCC_Wno-invalid-offsetof ?= $(call VBOX_GCC_CHECK_CXX,-Wno-invalid-offsetof,)'
1371 $(APPEND) '$@' 'VBOX_GCC_Wno-extra ?= $(call VBOX_GCC_CHECK_CXX,-Wno-extra)'
1372 $(APPEND) '$@' 'VBOX_GCC_fno-stack-protector ?= $(call VBOX_GCC_CHECK_CC,-fno-stack-protector,)'
1373# Produce code optimized for the most common IA32/AMD64/EM64T processors. Introduced with gcc version 4.2.
1374 $(APPEND) '$@' 'VBOX_GCC_mtune-generic ?= $(call VBOX_GCC_CHECK_CC,-mtune=generic,)'
1375 $(APPEND) '$@' 'VBOX_LD_as_needed ?= $(call VBOX_GCC_CHECK_LD,--as-needed,)'
1376ifneq ($(KBUILD_TARGET),l4)
1377# Set default attribute for ELF and MACH-O symbols to ``hidden'' to reduce the number
1378# of relocation entries and PLT indirections in shared libraries. Don't allow for gcc version < 4.
1379 $(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CC),)'
1380 $(APPEND) '$@' ' ifneq ($$(int-ge $$(VBOX_GCC_VERSION_CC),40000),)'
1381 $(APPEND) '$@' ' VBOX_GCC_fvisibility-hidden ?= $(call VBOX_GCC_CHECK_CC,-fvisibility=hidden -DVBOX_HAVE_VISIBILITY_HIDDEN -DRT_USE_VISIBILITY_DEFAULT,)'
1382 $(APPEND) '$@' ' endif'
1383 $(APPEND) '$@' 'endif'
1384endif
1385ifneq ($(KBUILD_TARGET),l4)
1386# Set default attribute for inline functions to ``hidden'' to reduce the number
1387# of relocation entries and PLT indirections in shared libraries. Don't allow for gcc version < 4.
1388 $(APPEND) '$@' 'ifneq ($$(VBOX_GCC_VERSION_CXX),)'
1389 $(APPEND) '$@' ' ifneq ($$(int-ge $$(VBOX_GCC_VERSION_CXX),40000),)'
1390 $(APPEND) '$@' ' VBOX_GCC_fvisibility-inlines-hidden ?= $(call VBOX_GCC_CHECK_CXX,-fvisibility-inlines-hidden,)'
1391 $(APPEND) '$@' ' endif'
1392 $(APPEND) '$@' 'endif'
1393endif
1394# Find the compiler includes for IPRT no-crt.
1395# Note that `$(dir $(gcc -print-libgcc-file-name))/include does not work for a 64-bit cross build on a 32-bit build host.
1396ifeq ($(KBUILD_HOST),win)
1397# With the cygwin issues and gcc on windows returning a useless path, just skip this on windows.
1398 $(APPEND) '$@' 'VBOX_PATH_GCC_INCS ?= '
1399else
1400 $(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'
1401endif
1402# 32-bit (GC) compiler switch detection.
1403 $(APPEND) '$@' 'VBOX_GCC32_VERSION_CC ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC32_TOOL)_CC))'
1404 $(APPEND) '$@' 'VBOX_GCC32_VERSION_CXX ?= $(call VBOX_GCC_VERSION,$(TOOL_$(VBOX_GCC32_TOOL)_CXX))'
1405 $(APPEND) '$@' 'VBOX_GCC32_LIBGCC ?= $(shell $(TOOL_$(VBOX_GCC32_TOOL)_CC) -print-libgcc-file-name)'
1406 $(APPEND) '$@' 'VBOX_GCC32_Wno-variadic-macros ?= $(call VBOX_GCC32_CHECK_CXX,-Wno-variadic-macros,)'
1407
1408include $(PATH_OUT)/GCCConfig.kmk
1409
1410
1411#
1412# Code Signing.
1413#
1414ifdef VBOX_SIGNING_MODE
1415 ifeq ($(KBUILD_HOST),win)
1416 # VBOX_PATH_SELFSIGN points to the Vista WDK bin/SelfSign directory.
1417 ifndef VBOX_PATH_SELFSIGN
1418 VBOX_PATH_SELFSIGN := $(lastword $(sort $(wildcard $(PATH_DEVTOOLS)/win.x86/selfsign/*)))
1419 ifeq ($(VBOX_PATH_SELFSIGN),)
1420 VBOX_PATH_SELFSIGN := $(PATH_DEVTOOLS)/win.x86/selfsign/r1
1421 endif
1422 endif
1423 VBOX_SIGNTOOL ?= $(VBOX_PATH_SELFSIGN)/SignTool.exe
1424 VBOX_INF2CAT ?= $(VBOX_PATH_SELFSIGN)/Inf2Cat.exe
1425
1426 # There are three signing modes; 'test', 'development' and 'release'.
1427 ifeq ($(strip $(VBOX_SIGNING_MODE)),test)
1428 VBOX_CERTIFICATE_SUBJECT_NAME ?= MyTestCertificate
1429 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
1430 else if1of ($(VBOX_SIGNING_MODE),release development)
1431 VBOX_CERTIFICATE_SUBJECT_NAME ?= Sun Microsystems, Inc.
1432 VBOX_CERTIFICATE_SUBJECT_NAME_ARGS ?= /n "$(VBOX_CERTIFICATE_SUBJECT_NAME)"
1433 VBOX_CROSS_CERTIFICATE_FILE ?= $(VBOX_PATH_SELFSIGN)/MSCV-VSClass3.cer
1434 VBOX_CROSS_CERTIFICATE_FILE_ARGS ?= /ac "$(VBOX_CROSS_CERTIFICATE_FILE)"
1435 VBOX_TSA_URL ?= http://timestamp.verisign.com/scripts/timestamp.dll
1436 VBOX_TSA_URL_ARGS ?= /t "$(VBOX_TSA_URL)"
1437 else
1438 $(error Unknown VBOX_SIGNING_MODE: $(VBOX_SIGNING_MODE))
1439 endif
1440 VBOX_CERTIFICATE_STORE ?= my
1441 VBOX_CERTIFICATE_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_STORE)"
1442
1443 ## Commands for signing a driver image after link.
1444 VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_FILE_FN,$(out)))
1445 ## Sign a file.
1446 # @param 1 The file to sign.
1447 VBOX_SIGN_FILE_FN ?= $(VBOX_SIGNTOOL) sign \
1448 $(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
1449 $(VBOX_CERTIFICATE_STORE_ARGS) \
1450 $(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
1451 $(VBOX_TSA_URL_ARGS) \
1452 $(1)
1453 ## Create a security catalog file.
1454 # @param 1 The directory containing the stuff to sign.
1455 # @param 2 The expected .cat name. (Inf2Cat lowercases it)
1456 # @param 3 The list of OSes, separated by ';'.
1457 VBOX_MAKE_CAT_HLP_FN ?= \
1458 $(RM) -f $(2)\
1459 $(NL)$(TAB)$(VBOX_INF2CAT) /driver:$(strip $(1)) /os:$(strip $(subst ;,$(COMMA),$(3))) /verbose \
1460 $(NL)$(TAB)$(MV) $(2) $(2) \
1461 $(NL)$(TAB)$(call VBOX_SIGN_FILE_FN,$(2))
1462 VBOX_MAKE_CAT64_FN ?= $(call VBOX_MAKE_CAT_HLP_FN,$(1),$(2),XP_X64;Server2003_X64;Vista_X64)
1463 VBOX_MAKE_CAT32_FN ?= $(call VBOX_MAKE_CAT_HLP_FN,$(1),$(2),2000;XP_X86;Server2003_X86;Vista_X86)
1464 ifeq ($(KBUILD_TARGET_ARCH),x86)
1465 VBOX_MAKE_CAT_FN ?= $(call VBOX_MAKE_CAT32_FN,$(1),$(2))
1466 else
1467 VBOX_MAKE_CAT_FN ?= $(call VBOX_MAKE_CAT64_FN,$(1),$(2))
1468 endif
1469
1470 # Go nuts, sign everything.
1471 ifeq ($(strip $(VBOX_SIGNING_MODE)),release)
1472 ## Commands for signing an executable or a dll image after link.
1473 VBOX_SIGN_IMAGE_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_FILE_FN,$(out)))
1474 ## Enable signing of the additions.
1475 VBOX_SIGN_ADDITIONS ?= 1
1476 endif
1477 else
1478 # Not windows build platform, ignore.
1479 VBOX_SIGNING_MODE :=
1480 endif
1481endif
1482
1483#
1484# Windows .inf editing.
1485#
1486ifeq ($(KBUILD_TARGET_ARCH),x86)
1487 VBOX_EDIT_INF_FN = $(call VBOX_EDIT_INF32_FN,$(1),$(2))
1488else
1489 VBOX_EDIT_INF_FN = $(call VBOX_EDIT_INF64_FN,$(1),$(2))
1490endif
1491## Edit an inf file an x86 target.
1492# @param 1 The inf file to edit.
1493# @param 2 The output file.
1494VBOX_EDIT_INF32_FN = $(SED) $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d') \
1495 -e 's/^;x86 *//' \
1496 -e '/^;amd64 /d' \
1497 -e 's/^;edit-DriverVer.*/DriverVer = $(date-utc %m\/%d\/%Y),$(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)/' \
1498 --output $(2) \
1499 $(1)
1500## Edit an inf file an x86 target.
1501# @param 1 The inf file to edit.
1502# @param 2 The output file.
1503VBOX_EDIT_INF64_FN = $(SED) \
1504 $(if $(VBOX_SIGNING_MODE),-e 's/^;cat *//', -e '/^;cat /d')\
1505 -e 's/^;amd64 *//' \
1506 -e '/^;x86 /d' \
1507 -e 's/^;edit-DriverVer.*/DriverVer = $(date-utc %m\/%d\/%Y),$(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)/' \
1508 --output $(2) \
1509 $(1)
1510
1511#
1512# Default prefixes and suffixes.
1513#
1514VBOX_PREF_LIB =
1515if1of ($(KBUILD_TARGET),win os2)
1516VBOX_SUFF_LIB = .lib
1517else
1518VBOX_SUFF_LIB = .a
1519endif
1520VBOX_SUFF_DLL = $(SUFF_DLL)
1521ifeq ($(KBUILD_TARGET),os2) # GXX3OMF produces out .o at the moment.
1522VBOX_SUFF_OBJ = .o
1523else
1524VBOX_SUFF_OBJ = $(SUFF_OBJ)
1525endif
1526VBOXW32GUEST_SUFF_LIB = .lib
1527VBOXLNX32GUEST_SUFF_LIB = .a
1528
1529#
1530# SDKs for external libraries.
1531#
1532SDK_VBOX_LIBXML2 = .
1533#if1of ($(KBUILD_TARGET),win os2 solaris)
1534 SDK_VBOX_LIBXML2_INCS ?= $(PATH_ROOT)/src/libs/libxml2-2.6.30/include
1535 SDK_VBOX_LIBXML2_LIBS ?= $(PATH_LIB)/VBox-libxml2$(VBOX_SUFF_LIB)
1536 SDK_VBOX_LIBXML2_DEFS ?= LIBXML_STATIC
1537 SDK_VBOX_LIBXML2_DEFS.win += WIN32 _WINDOWS _MBCS
1538#else if1of ($(KBUILD_TARGET),linux)
1539# SDK_VBOX_LIBXML2_INCS ?=
1540# SDK_VBOX_LIBXML2_LIBS ?=
1541# SDK_VBOX_LIBXML2_CFLAGS ?= $(shell pkg-config libxml-2.0 --cflags)
1542# SDK_VBOX_LIBXML2_CXXFLAGS ?= $(SDK_VBOX_LIBXML2_CFLAGS)
1543# SDK_VBOX_LIBXML2_LDFLAGS ?= $(shell pkg-config libxml-2.0 --libs)
1544#else
1545# SDK_VBOX_LIBXML2_INCS ?=
1546# SDK_VBOX_LIBXML2_LIBS ?= xml2
1547#endif
1548
1549SDK_VBOX_LIBXSLT = .
1550#if1of ($(KBUILD_TARGET),win os2 solaris)
1551 SDK_VBOX_LIBXSLT_INCS ?= $(PATH_ROOT)/src/libs/libxslt-1.1.22
1552 SDK_VBOX_LIBXSLT_LIBS ?= $(PATH_LIB)/VBox-libxslt$(VBOX_SUFF_LIB)
1553 SDK_VBOX_LIBXSLT_DEFS ?=
1554 SDK_VBOX_LIBXSLT_DEFS.win += WIN32 _WINDOWS _MBCS _REENTRANT
1555#else if1of ($(KBUILD_TARGET),linux)
1556# SDK_VBOX_LIBXSLT_INCS ?=
1557# SDK_VBOX_LIBXSLT_LIBS ?=
1558# SDK_VBOX_LIBXSLT_CFLAGS ?= $(shell pkg-config libxslt-1.0 --cflags)
1559# SDK_VBOX_LIBXSLT_CXXFLAGS ?= $(SDK_VBOX_LIBXSLT_CFLAGS)
1560# SDK_VBOX_LIBXSLT_LDFLAGS ?= $(shell pkg-config libxslt-1.0 --libs)
1561#else
1562# SDK_VBOX_LIBXSLT_INCS ?=
1563# SDK_VBOX_LIBXSLT_LIBS ?= xslt
1564#endif
1565
1566SDK_VBOX_LIBPNG = .
1567SDK_VBOX_LIBPNG_INCS ?= $(PATH_ROOT)/src/libs/libpng-1.2.8
1568SDK_VBOX_LIBPNG_LIBS ?= $(PATH_LIB)/VBox-libpng$(VBOX_SUFF_LIB)
1569
1570SDK_VBOX_ZLIB = .
1571if1of ($(KBUILD_TARGET), win os2)
1572 SDK_VBOX_ZLIB_INCS ?= $(PATH_ROOT)/src/libs/zlib-1.2.1
1573 SDK_VBOX_ZLIB_LIBS ?= $(PATH_LIB)/VBox-zlib$(VBOX_SUFF_LIB)
1574else
1575 SDK_VBOX_ZLIB_INCS ?=
1576 SDK_VBOX_ZLIB_LIBS ?= z
1577endif
1578
1579SDK_VBOX_OPENSSL = .
1580SDK_VBOX_OPENSSL_DEFAULT_INCS := $(PATH_OUT)/obj/crypto-headers/include
1581SDK_VBOX_OPENSSL_INCS ?= $(SDK_VBOX_OPENSSL_DEFAULT_INCS)
1582SDK_VBOX_OPENSSL_LIBS ?= $(PATH_LIB)/VBox-libcrypto$(VBOX_SUFF_LIB)
1583# Build entire openssl library, not just the minimal subset.
1584if1of ($(KBUILD_TARGET), linux solaris)
1585 VBOX_OPENSSL_ALL=1
1586endif
1587
1588SDK_VBOX_FFMPEG = .
1589if1of ($(KBUILD_TARGET), win os2 darwin)
1590 SDK_VBOX_FFMPEG_INCS ?= \
1591 $(PATH_ROOT)/src/libs/ffmpeg-20060710/libavutil \
1592 $(PATH_ROOT)/src/libs/ffmpeg-20060710/libavcodec \
1593 $(PATH_ROOT)/src/libs/ffmpeg-20060710/libavformat
1594 ifeq ($(KBUILD_TARGET),win)
1595 ## @todo Michael! Where is $(PATH_LIB)/VBoxFFmpegImp$(VBOX_SUFF_LIB) supposed to come from?
1596 #SDK_VBOX_FFMPEG_LIBS ?= $(PATH_LIB)/VBoxFFmpeg.a
1597 SDK_VBOX_FFMPEG_LIBS ?= $(PATH_LIB)/VBoxFFmpegImp.lib
1598 else
1599 SDK_VBOX_FFMPEG_LIBS ?= $(PATH_BIN)/VBoxFFmpeg$(SUFF_DLL)
1600 endif
1601else
1602 SDK_VBOX_FFMPEG_INCS ?= /usr/include/ffmpeg /usr/include/libpng
1603 SDK_VBOX_FFMPEG_LIBS ?= avutil avcodec avformat
1604endif
1605
1606#
1607# Special SDK for the problematic NTDLL.LIB.
1608#
1609SDK_VBOX_NTDLL = Requires W2K3DDK
1610SDK_VBOX_NTDLL_LIBS ?= $(PATH_SDK_W2K3DDK_LIB)/ntdll.lib
1611
1612
1613#
1614# Qt build tools and libraries.
1615# For *NIX we require it to be present on the system.
1616#
1617## @todo convert this into SDK and integrate the Qt stuff into kBuild.
1618ifeq ($(KBUILD_TARGET),win)
1619 VBOX_PATH_QT ?= $(lastword $(sort $(wildcard $(PATH_DEVTOOLS_TRG)/qt/v3.*)))
1620 VBOX_DLL_QT ?= $(firstword $(wildcard $(VBOX_PATH_QT)/bin/VBoxQt3*.dll) \
1621 $(wildcard $(VBOX_PATH_QT)/bin/qtmt3*.dll) \
1622 $(wildcard $(VBOX_PATH_QT)/bin/qt-mt3*.dll) \
1623 $(wildcard $(VBOX_PATH_QT)/lib/qt-mt3*.dll))
1624 ifneq ($(wildcard $(VBOX_PATH_QT)/bin/accessible/VBoxQtWidgets100.dll),)
1625 VBOX_QT_BINARIES += \
1626 $(VBOX_PATH_QT)/bin/accessible/VBoxQtWidgets100.dll=>accessible/VBoxQtWidgets100.dll
1627 endif
1628 LIB_QT ?= $(firstword $(wildcard $(VBOX_PATH_QT)/lib/VBoxQt3*.lib) \
1629 $(wildcard $(VBOX_PATH_QT)/lib/qt-mt3*.lib) \
1630 $(wildcard $(VBOX_PATH_QT)/lib/dynamic/qt-mt3*.lib))
1631 LIB_QT_PRL ?= $(firstword $(wildcard $(VBOX_PATH_QT)/lib/VBoxQt.prl) \
1632 $(wildcard $(VBOX_PATH_QT)/lib/qt-mt.prl) \
1633 $(wildcard $(VBOX_PATH_QT)/lib/dynamic/qt-mt.prl))
1634 LIB_QTMAIN ?= $(firstword $(wildcard $(VBOX_PATH_QT)/lib/qtmain.lib) \
1635 $(wildcard $(VBOX_PATH_QT)/lib/dynamic/qtmain.lib))
1636 QTDIR ?= $(lastword $(sort $(wildcard $(PATH_DEVTOOLS_BLD)/qt/v3.*)))
1637else ifeq ($(KBUILD_TARGET),os2)
1638 QTDIR ?= $(PATH_DEVTOOLS_TRG)/qt/v3.3.1
1639 VBOX_PATH_QT ?= $(QTDIR)
1640 VBOX_DLL_QT ?= $(lastword $(sort $(wildcard $(VBOX_PATH_QT)/bin/*qt*.dll)))
1641 LIB_QT ?= $(lastword $(sort $(wildcard $(VBOX_PATH_QT)/lib/*qt*.lib)))
1642 LIB_QT_PRL ?= $(lastword $(sort $(wildcard $(VBOX_PATH_QT)/lib/*qt*.prl)))
1643 QTDIR := $(VBOX_PATH_QT)
1644else ifeq ($(KBUILD_TARGET),darwin)
1645 ifndef VBOX_PATH_QT
1646 VBOX_PATH_QT := $(lastword $(sort $(wildcard $(PATH_DEVTOOLS_TRG)/qt/v3.*)))
1647 VBOX_PATH_QT ?= $(PATH_DEVTOOLS_TRG)/qt/v3.3.8-r1
1648 endif
1649 VBOX_MUST_INSTALL_LIB_QT ?= 1
1650 LIB_QT ?= $(VBOX_PATH_QT)/lib/libqt-mt.3.dylib
1651 LIB_QTMAIN ?= $(NO_SUCH_VARIABLE)
1652 ifndef QTDIR
1653 QTDIR := $(sort $(wildcard $(PATH_DEVTOOLS_BLD)/v*))
1654 QTDIR := $(call lastword,$(QTDIR))
1655 endif
1656else
1657 ifndef QTDIR
1658 ifndef VBOX_PATH_QT
1659 # If QTDIR and VBOX_WITH_QTGUI aren't defined, we'll first
1660 # look in the tools tree and then on the system. If in the
1661 # tools, we'll have to install it.
1662 # Results are exported to avoid having to do this for every make file.
1663 VBOX_PATH_QT := $(lastword $(sort $(wildcard $(PATH_DEVTOOLS_TRG)/qt/v3.*)))
1664 ifneq ($(VBOX_PATH_QT),)
1665 export VBOX_PATH_QT
1666 export VBOX_MUST_INSTALL_LIB_QT := 1
1667 export LIB_QT := $(VBOX_PATH_QT)/lib/libqt-mt.so.3
1668 export LD_LIBRARY_PATH := $(VBOX_PATH_QT)/lib:$(LD_LIBRARY_PATH)
1669 else
1670 QTDIR := $(wildcard /usr/share/qt3)
1671 ifeq ($(QTDIR),)
1672 QTDIR := $(patsubst %/bin/moc,%,$(firstword $(wildcard /usr/bin/moc /usr/local/bin/moc /usr/X11R6/bin/moc)))
1673 endif
1674 ifneq ($(QTDIR),)
1675 export QTDIR
1676 endif
1677 endif
1678 else
1679 QTDIR := $(VBOX_PATH_QT)
1680 export QTDIR
1681 endif
1682 endif
1683endif
1684ifndef VBOX_PATH_QT
1685 VBOX_PATH_QT ?= $(QTDIR)
1686 LIB_QT ?= qt-mt
1687endif
1688ifeq ($(KBUILD_HOST),$(KBUILD_TARGET))
1689 VBOX_PATH_QT_HOST ?= $(VBOX_PATH_QT)
1690else
1691 VBOX_PATH_QT_HOST ?= $(QTDIR)
1692endif
1693VBOX_UIC ?= $(VBOX_PATH_QT_HOST)/bin/uic$(HOSTSUFF_EXE)
1694VBOX_MOC ?= $(VBOX_PATH_QT_HOST)/bin/moc$(HOSTSUFF_EXE)
1695VBOX_LUPDATE ?= $(VBOX_PATH_QT_HOST)/bin/lupdate$(HOSTSUFF_EXE)
1696VBOX_LRELEASE ?= $(VBOX_PATH_QT_HOST)/bin/lrelease$(HOSTSUFF_EXE)
1697
1698ifeq ($(KBUILD_TARGET),os2)
1699 # search DLLs in the EXE directory first (unless VBOX_DLL_QT is set)
1700 VBOX_DLL_QT_PATH := $(dir $(VBOX_DLL_QT))
1701 VBOX_DLL_QT_PATH := $(if $(VBOX_DLL_QT_PATH),$(VBOX_DLL_QT_PATH);,)
1702 VBOX_UIC := BEGINLIBPATH="$(VBOX_DLL_QT_PATH)$(dir $(VBOX_UIC));$$BEGINLIBPATH" $(VBOX_UIC)
1703 VBOX_MOC := BEGINLIBPATH="$(VBOX_DLL_QT_PATH)$(dir $(VBOX_MOC));$$BEGINLIBPATH" $(VBOX_MOC)
1704 VBOX_LUPDATE := BEGINLIBPATH="$(VBOX_DLL_QT_PATH)$(dir $(VBOX_LUPDATE));$$BEGINLIBPATH" $(VBOX_LUPDATE)
1705 VBOX_LRELEASE := BEGINLIBPATH="$(VBOX_DLL_QT_PATH)$(dir $(VBOX_LRELEASE));$$BEGINLIBPATH" $(VBOX_LRELEASE)
1706endif
1707
1708#
1709# The linux kernel headers(/sources).
1710#
1711if1of ($(KBUILD_TARGET), linux)
1712 ifeq ($(origin VBOX_LINUX_SRC),undefined)
1713 ifneq ($(wildcard /lib/modules/$(shell uname -r)/build/include/linux/autoconf.h),)
1714 export VBOX_LINUX_SRC := /lib/modules/$(shell uname -r)/build
1715 else
1716 export VBOX_LINUX_SRC := /usr/src/linux
1717 endif
1718 endif
1719 ifneq ($(VBOX_LINUX_SRC),)
1720 ifeq ($(origin VBOX_LINUX_INCS),undefined)
1721 export VBOX_LINUX_INCS := $(VBOX_LINUX_SRC)/include
1722 # support splitted Linux kernels (make O=<build directory>)
1723 # XXX hack alert!
1724 kernelsrc := $(shell $(SED_EXT) -ne 's+^KERNELSRC.*= *\(.*\)+\1+p' $(VBOX_LINUX_SRC)/Makefile)
1725 ifneq ($(kernelsrc),)
1726 kernelpath := $(realpath $(VBOX_LINUX_SRC)/$(kernelsrc))
1727 else
1728 # Linux >= 2.6.25
1729 kernelpath := $(shell $(SED_EXT) -ne 's+^MAKEARGS *:= *-C *\(.*\)+\1+p' $(VBOX_LINUX_SRC)/Makefile)
1730 endif
1731 ifneq ($(kernelpath),)
1732 VBOX_LINUX_INCS += $(VBOX_LINUX_SRC)/include2 $(kernelpath)/include
1733 else
1734 kernelpath := $(VBOX_LINUX_SRC)
1735 endif
1736 VBOX_LINUX_INCS += $(kernelpath)/include/asm-i386/mach-default \
1737 $(kernelpath)/include/asm-x86/mach-default
1738 endif
1739 endif
1740endif
1741
1742#
1743# Determine Solaris version.
1744#
1745ifeq ($(KBUILD_TARGET),solaris)
1746 ifeq ($(origin VBOX_SOLARIS_VERSION),undefined)
1747 $(eval export VBOX_SOLARIS_VERSION := $(shell uname -r | $(SED_EXT) 's|\([0-9]*\)\.\([0-9]*\)|$$(int-add $$(int-mul 100, \1), \2)|' ))
1748 endif
1749 ifeq ($(VBOX_SOLARIS_VERSION),510)
1750 DEFS.solaris += RT_OS_SOLARIS_10
1751 # Solaris 10 does not include crossbow.
1752 VBOX_WITH_CROSSBOW =
1753 VBOX_SOLARIS_10 = 1
1754 endif
1755endif
1756
1757
1758#
1759# Template for building GC things.
1760#
1761TEMPLATE_VBOXGC = VBox GC
1762TEMPLATE_VBOXGC_ASTOOL = $(VBOX_ASTOOL)
1763TEMPLATE_VBOXGC_ASFLAGS = $(VBOX_ASFLAGS32)
1764TEMPLATE_VBOXGC_DEFS = IN_GC $(ARCH_BITS_DEFS)
1765TEMPLATE_VBOXGC_SYSSUFF = .gc
1766TEMPLATE_VBOXGC_BLD_TRG_ARCH = x86
1767
1768ifeq ($(VBOX_LDR_FMT32),pe)
1769ifdef VBOX_USE_VCC80
1770 TEMPLATE_VBOXGC_TOOL = VCC80X86
1771 TEMPLATE_VBOXGC_CXXFLAGS = -Zi -Zl -GR- -GS- -EHs-c- -GF- -W3 -wd4244 -wd4996 -Zc:wchar_t- -Gs8192 $(VBOX_VCC_GC_OPT) $(VBOX_VCC_GC_FP)
1772else
1773 TEMPLATE_VBOXGC_TOOL = VCC70
1774 TEMPLATE_VBOXGC_CXXFLAGS = -Zi -Zl -GR- -GX- -GF- -W3 -wd4244 $(VBOX_VCC_GC_OPT) $(VBOX_VCC_GC_FP)
1775endif
1776TEMPLATE_VBOXGC_CFLAGS = $(TEMPLATE_VBOXGC_CXXFLAGS)
1777TEMPLATE_VBOXGC_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Lines -MapInfo:Exports -NoD
1778ifdef VBOX_USE_VCC80
1779 include $(KBUILD_PATH)/sdks/W2K3DDKX86.kmk
1780 TEMPLATE_VBOXGC_LIBS = \
1781 $(PATH_SDK_W2K3DDKX86_LIB)/int64.lib
1782else
1783 TEMPLATE_VBOXGC_LIBS = \
1784 $(PATH_TOOL_VCC70_LIB)/libcmt.lib # for 64-bit int
1785endif
1786endif
1787
1788ifeq ($(VBOX_LDR_FMT32),elf)
1789TEMPLATE_VBOXGC_TOOL = $(VBOX_GCC32_TOOL)
1790TEMPLATE_VBOXGC_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC32_Wno-variadic-macros) -pipe -fno-exceptions -fno-rtti $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden)
1791TEMPLATE_VBOXGC_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC32_Wno-variadic-macros) -pipe -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_fvisibility-hidden)
1792ifeq ($(KBUILD_TARGET),solaris)
1793 TEMPLATE_VBOXGC_LDFLAGS = -r
1794else
1795 TEMPLATE_VBOXGC_LDFLAGS = -nostdlib -Bsymbolic
1796 # temporarily, must fix the loader.
1797 TEMPLATE_VBOXGC_LDFLAGS += $(if $(VBOX_DO_STRIP_MODULES),-S,)
1798 TEMPLATE_VBOXGC_LDFLAGS.release = $(if $(VBOX_DO_STRIP_MODULES),-S,)
1799endif
1800ifn1of ($(KBUILD_TARGET), solaris freebsd)
1801 TEMPLATE_VBOXGC_LIBS = \
1802 $(VBOX_GCC32_LIBGCC) # instricts
1803endif
1804endif
1805
1806ifeq ($(VBOX_LDR_FMT32),macho)
1807TEMPLATE_VBOXGC_TOOL = GXX4MACHO
1808TEMPLATE_VBOXGC_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
1809TEMPLATE_VBOXGC_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC32_Wno-variadic-macros) -pipe -fno-common -msoft-float -static -fno-exceptions -fno-rtti $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing
1810TEMPLATE_VBOXGC_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC32_Wno-variadic-macros) -pipe -fno-common -msoft-float -static -Wno-trigraphs -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing
1811TEMPLATE_VBOXGC_LDFLAGS = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -nostdlib
1812#TEMPLATE_VBOXGC_LDFLAGS.release = -Wl,-S ???
1813endif
1814
1815ifeq ($(VBOX_LDR_FMT32),lx)
1816TEMPLATE_VBOXGC_TOOL = GXX3OMF
1817TEMPLATE_VBOXGC_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC32_Wno-variadic-macros) -pipe -fno-exceptions -fno-rtti $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing
1818TEMPLATE_VBOXGC_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC32_Wno-variadic-macros) -pipe -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_GC_OPT) $(VBOX_GCC_GC_FP) -fno-strict-aliasing
1819TEMPLATE_VBOXGC_LDFLAGS = -Zdll -nostdlib
1820TEMPLATE_VBOXGC_LIBS = \
1821 $(VBOX_GCC32_LIBGCC) \
1822 $(OBJ_SYS0) \
1823 end
1824endif
1825
1826
1827#
1828# Template for building a GC ring-3 testcase (tstVMStructGC, tstDevStructGC).
1829#
1830TEMPLATE_VBOXGCEXE = VBox GC as ring-3 testcase
1831TEMPLATE_VBOXGCEXE_EXTENDS = VBOXGC
1832
1833ifeq ($(VBOX_LDR_FMT32),pe)
1834 TEMPLATE_VBOXGCEXE_LDFLAGS = -Incremental:NO -MapInfo:Exports -NoD -Debug
1835 TEMPLATE_VBOXGCEXE_SDKS = WIN32SDK
1836 ifdef VBOX_USE_VCC80
1837 TEMPLATE_VBOXGCEXE_LIBS = \
1838 $(PATH_TOOL_VCC80X86_LIB)/libcmt.lib \
1839 $(PATH_TOOL_VCC80X86_LIB)/oldnames.lib
1840 else
1841 TEMPLATE_VBOXGCEXE_LIBS = \
1842 $(PATH_TOOL_VCC70_LIB)/libcmt.lib \
1843 $(PATH_TOOL_VCC70_LIB)/oldnames.lib
1844 endif
1845endif
1846
1847ifeq ($(VBOX_LDR_FMT32),elf)
1848 TEMPLATE_VBOXGCEXE_LDFLAGS = -g
1849 TEMPLATE_VBOXGCEXE_LDFLAGS.release = -g
1850endif
1851
1852ifeq ($(VBOX_LDR_FMT32),macho)
1853 TEMPLATE_VBOXGCEXE_CFLAGS = $(filter-out -static,$(TEMPLATE_VBOXGC_CFLAGS))
1854 TEMPLATE_VBOXGCEXE_CXXFLAGS = $(filter-out -static,$(TEMPLATE_VBOXGC_CXXFLAGS))
1855 TEMPLATE_VBOXGCEXE_LDFLAGS = -g
1856endif
1857
1858ifeq ($(VBOX_LDR_FMT32),lx)
1859 TEMPLATE_VBOXGCEXE_LDFLAGS = -g
1860 TEMPLATE_VBOXGCEXE_LIBS = $(NO_SUCH_VARIABLE)
1861endif
1862
1863
1864#
1865# Template for building R0 things.
1866#
1867TEMPLATE_VBOXR0 = VBox Ring 0
1868TEMPLATE_VBOXR0_ASTOOL = $(VBOX_ASTOOL)
1869TEMPLATE_VBOXR0_ASFLAGS = $(VBOX_ASFLAGS)
1870TEMPLATE_VBOXR0_DEFS = IN_RING0 $(ARCH_BITS_DEFS)
1871
1872ifeq ($(VBOX_LDR_FMT),pe)
1873TEMPLATE_VBOXR0_TOOL = $(VBOX_VCC_TOOL)
1874ifdef VBOX_USE_VCC80
1875 TEMPLATE_VBOXR0_CXXFLAGS = -Zi -Zl -GR- -GS- -EHs-c- -GF- -W3 -wd4244 -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
1876else
1877 TEMPLATE_VBOXR0_CXXFLAGS = -Zi -Zl -GR- -GX- -GF- -W3 -wd4244 $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
1878endif
1879TEMPLATE_VBOXR0_CFLAGS = $(TEMPLATE_VBOXR0_CXXFLAGS)
1880TEMPLATE_VBOXR0_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD
1881ifdef VBOX_USE_VCC80
1882 TEMPLATE_VBOXR0_LIBS.x86 = \
1883 $(PATH_SDK_W2K3DDKX86_LIB)/int64.lib
1884else
1885 TEMPLATE_VBOXR0_LIBS.x86 = \
1886 $(PATH_TOOL_VCC70_LIB)/libcmt.lib # for 64-bit int
1887endif
1888endif # pe
1889
1890ifeq ($(VBOX_LDR_FMT),elf)
1891TEMPLATE_VBOXR0_TOOL = $(VBOX_GCC_TOOL)
1892TEMPLATE_VBOXR0_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_fvisibility-hidden)
1893TEMPLATE_VBOXR0_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -fno-rtti -fno-exceptions $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden)
1894TEMPLATE_VBOXR0_CFLAGS.amd64 = -m64 -mno-red-zone -mcmodel=kernel -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fno-asynchronous-unwind-tables -ffreestanding
1895TEMPLATE_VBOXR0_CXXFLAGS.amd64 = -m64 -mno-red-zone -mcmodel=kernel -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fno-asynchronous-unwind-tables
1896ifeq ($(KBUILD_TARGET),solaris)
1897 TEMPLATE_VBOXR0_LDFLAGS = -r
1898else
1899 TEMPLATE_VBOXR0_LDFLAGS = -nostdlib -Bsymbolic
1900 # temporarily, must fix the loader.
1901 TEMPLATE_VBOXR0_LDFLAGS += $(if $(VBOX_DO_STRIP_MODULES),-S,)
1902 TEMPLATE_VBOXR0_LDFLAGS.release = $(if $(VBOX_DO_STRIP_MODULES),-S,)
1903endif
1904ifn1of ($(KBUILD_TARGET),solaris freebsd)
1905 TEMPLATE_VBOXR0_LIBS = \
1906 $(VBOX_GCC_LIBGCC) # instricts
1907endif
1908endif
1909
1910ifeq ($(VBOX_LDR_FMT),macho)
1911TEMPLATE_VBOXR0_TOOL = GXX4MACHO
1912TEMPLATE_VBOXR0_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
1913TEMPLATE_VBOXR0_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -fno-common -msoft-float -static -fno-rtti -fno-exceptions $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing
1914TEMPLATE_VBOXR0_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -fno-common -msoft-float -static -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing
1915TEMPLATE_VBOXR0_LDFLAGS = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -nostdlib
1916#TEMPLATE_VBOXR0_LDFLAGS.release = -Wl,-S ???
1917endif
1918
1919ifeq ($(VBOX_LDR_FMT),lx)
1920TEMPLATE_VBOXR0_TOOL = GXX3OMF
1921TEMPLATE_VBOXR0_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -Wmissing-prototypes -Wstrict-prototypes $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing
1922TEMPLATE_VBOXR0_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -fno-rtti -fno-exceptions $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing
1923TEMPLATE_VBOXR0_LDFLAGS = -Zdll -nostdlib
1924TEMPLATE_VBOXR0_LIBS = \
1925 $(VBOX_GCC_LIBGCC) \
1926 $(OBJ_SYS0) \
1927 end
1928endif
1929
1930
1931#
1932# Template for building SUPDRV R0 things.
1933#
1934TEMPLATE_VBOXR0DRV = VBox SUPDRV Ring 0
1935TEMPLATE_VBOXR0DRV_ASTOOL = $(VBOX_ASTOOL)
1936TEMPLATE_VBOXR0DRV_ASFLAGS = $(VBOX_ASFLAGS)
1937TEMPLATE_VBOXR0DRV_DEFS = IN_RING0 IN_RT_R0 $(ARCH_BITS_DEFS)
1938
1939ifeq ($(KBUILD_TARGET),win)
1940 TEMPLATE_VBOXR0DRV_TOOL = $(VBOX_VCC_TOOL)
1941 TEMPLATE_VBOXR0DRV_RCDEFS = \
1942 VBOX_VERSION_MAJOR=\"$(VBOX_VERSION_MAJOR)\" \
1943 VBOX_VERSION_MINOR=\"$(VBOX_VERSION_MINOR)\" \
1944 VBOX_VERSION_BUILD=\"$(VBOX_VERSION_BUILD)\" \
1945 VBOX_SVN_REV=\"$(VBOX_SVN_REV)\" \
1946 VBOX_VERSION_MAJOR_NR=$(VBOX_VERSION_MAJOR) \
1947 VBOX_VERSION_MINOR_NR=$(VBOX_VERSION_MINOR) \
1948 VBOX_VERSION_BUILD_NR=$(VBOX_VERSION_BUILD) \
1949 VBOX_SVN_REV_NR=$(VBOX_SVN_REV)
1950 TEMPLATE_VBOXR0DRV_DEFS.x86 = _X86_
1951 TEMPLATE_VBOXR0DRV_DEFS.amd64 = _AMD64_
1952 ifdef VBOX_USE_VCC80
1953 TEMPLATE_VBOXR0DRV_CXXFLAGS = -Zi -Zl -GR- -GS- -EHs-c- -GF- -Gz -W3 -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
1954 else
1955 TEMPLATE_VBOXR0DRV_CXXFLAGS = -Zi -Zl -GR- -GX- -GF- -Gz -W3 $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
1956 endif
1957 TEMPLATE_VBOXR0DRV_CFLAGS = $(TEMPLATE_VBOXR0DRV_CXXFLAGS)
1958 TEMPLATE_VBOXR0DRV_LDFLAGS = -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD -Debug
1959 TEMPLATE_VBOXR0DRV_POST_CMDS = $(VBOX_SIGN_DRIVER_CMDS)
1960endif
1961
1962ifeq ($(KBUILD_TARGET),linux)
1963TEMPLATE_VBOXR0DRV_TOOL = $(VBOX_GCC_TOOL)
1964TEMPLATE_VBOXR0DRV_DEFS = __KERNEL__ MODULE IN_RING0 IN_RT_R0
1965TEMPLATE_VBOXR0DRV_INCS = $(VBOX_LINUX_INCS)
1966TEMPLATE_VBOXR0DRV_CFLAGS = -nostdinc -iwithprefix include \
1967 -Wall -Wstrict-prototypes -Wno-trigraphs $(VBOX_GCC_Wno-pointer-sign) \
1968 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing -fno-common
1969TEMPLATE_VBOXR0DRV_CFLAGS.x86 = -mpreferred-stack-boundary=2 -msoft-float
1970TEMPLATE_VBOXR0DRV_CFLAGS.amd64 = -m64 -mno-red-zone -mcmodel=kernel -mno-sse -mno-mmx -mno-sse2 -mno-3dnow \
1971 -fno-reorder-blocks -ffreestanding -fno-asynchronous-unwind-tables -funit-at-a-time \
1972 -Wno-sign-compare -Wdeclaration-after-statement
1973TEMPLATE_VBOXR0DRV_CXXFLAGS = $(filter-out -Wstrict-prototypes -Wno-pointer-sign -ffreestanding -Wdeclaration-after-statement,$(TEMPLATE_VBOXR0DRV_CFLAGS) $(TEMPLATE_VBOXR0DRV_CFLAGS.$(KBUILD_TARGET_ARCH))) -fno-exceptions -fno-rtti
1974 ifndef VBOX_LINUX_VERSION_2_4
1975# 2.6
1976TEMPLATE_VBOXR0DRV_SYSSUFF = .ko
1977TEMPLATE_VBOXR0DRV_LDFLAGS.x86 = -m elf_i386 -r
1978TEMPLATE_VBOXR0DRV_LDFLAGS.amd64 = -m elf_x86_64 -r
1979 else
1980# 2.4
1981TEMPLATE_VBOXR0DRV_SYSSUFF = .o
1982TEMPLATE_VBOXR0DRV_LDFLAGS = -r -s
1983 endif
1984endif
1985
1986ifeq ($(KBUILD_TARGET),os2)
1987TEMPLATE_VBOXR0DRV_TOOL = GXX3OMF
1988TEMPLATE_VBOXR0DRV_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing -fno-rtti -fno-exceptions
1989TEMPLATE_VBOXR0DRV_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing
1990TEMPLATE_VBOXR0DRV_LIBS = $(VBOX_GCC_LIBGCC)
1991# wlink thinks physdevice doesn't need fixups and should have a stack - stupid!
1992TEMPLATE_VBOXR0DRV_LDFLAGS = -Zlinker Option -Zlinker internalrelocs, -Zlinker togglerelocs
1993endif
1994
1995ifeq ($(KBUILD_TARGET),darwin)
1996TEMPLATE_VBOXR0DRV_TOOL = GXX4MACHO
1997TEMPLATE_VBOXR0DRV_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS) KERNEL KERNEL_PRIVATE DRIVER_PRIVATE APPLE NeXT RT_USE_VISIBILITY_HIDDEN
1998# I didn't really know why we have to state explicitly the position of the
1999# sdk headers. Maybe it has something to do with the fact that the kernel.framework
2000# isn't a real framework according to http://developer.apple.com/qa/qa2001/qa1096.html.
2001TEMPLATE_VBOXR0DRV_INCS += $(VBOX_PATH_MACOSX_SDK)/System/Library/Frameworks/Kernel.framework/Headers
2002TEMPLATE_VBOXR0DRV_CXXFLAGS = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS) \
2003 -g -Wall -Wno-long-long -Wno-trigraphs -pipe -fno-common -nostdinc -fno-builtin -finline \
2004 -fno-keep-inline-functions -force_cpusubtype_ALL -fno-exceptions -msoft-float -static \
2005 -fapple-kext -fno-rtti -fcheck-new
2006TEMPLATE_VBOXR0DRV_CXXFLAGS.release = $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing -fasm-blocks
2007TEMPLATE_VBOXR0DRV_CXXFLAGS.profile = $(TEMPLATE_VBOXR0DRV_CXXFLAGS.release)
2008TEMPLATE_VBOXR0DRV_CXXFLAGS.kprofile = $(TEMPLATE_VBOXR0DRV_CXXFLAGS.release)
2009TEMPLATE_VBOXR0DRV_CFLAGS = $(VBOX_DARWIN_DEF_SDK_CFLAGS) \
2010 -g -Wall -Wno-long-long -Wno-trigraphs -pipe -fno-common -nostdinc -fno-builtin -finline \
2011 -fno-keep-inline-functions -force_cpusubtype_ALL -fno-exceptions -msoft-float -static \
2012 -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
2013TEMPLATE_VBOXR0DRV_CFLAGS.release = $(TEMPLATE_VBOXR0DRV_CXXFLAGS.release)
2014TEMPLATE_VBOXR0DRV_CFLAGS.profile = $(TEMPLATE_VBOXR0DRV_CXXFLAGS.profile)
2015TEMPLATE_VBOXR0DRV_CFLAGS.kprofile = $(TEMPLATE_VBOXR0DRV_CXXFLAGS.kprofile)
2016TEMPLATE_VBOXR0DRV_LDFLAGS = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -static -nostdlib -r -Wl,-Y,1455 -keep_private_extern
2017TEMPLATE_VBOXR0DRV_LIBS = kmodc++ kmod cc_kext cpp_kext $(VBOX_GCC_LIBGCC)
2018endif
2019
2020ifeq ($(KBUILD_TARGET),solaris)
2021## The Solaris /usr/platform/i86pc/include and /usr/include directories.
2022VBOX_SOLARIS_SYS_INCS ?= /usr/platform/i86pc/include /usr/include
2023
2024TEMPLATE_VBOXR0DRV_TOOL = $(VBOX_GCC_TOOL)
2025TEMPLATE_VBOXR0DRV_DEFS = _KERNEL _STRICT_STDC IN_RING0 IN_RT_R0
2026TEMPLATE_VBOXR0DRV_INCS = $(VBOX_SOLARIS_SYS_INCS)
2027TEMPLATE_VBOXR0DRV_LDFLAGS = -r -dy
2028ifdef VBOX_WITH_SOLARIS_VBI
2029 TEMPLATE_VBOXR0DRV_LDFLAGS += -N misc/vbi
2030endif
2031TEMPLATE_VBOXR0DRV_LDFLAGS.amd64 = -64
2032# Exclude -Wall because of solaris headers' pragma ident warnings that gcc refuses to supress.
2033TEMPLATE_VBOXR0DRV_CFLAGS = -Wno-trigraphs -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
2034 -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs \
2035 -O2 -ffreestanding -nodefaultlibs -fno-strict-aliasing -fno-common -std=c99
2036TEMPLATE_VBOXR0DRV_CFLAGS.x86 = -m32 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
2037TEMPLATE_VBOXR0DRV_CFLAGS.amd64 = -m64 -mno-sse -mno-mmx -mno-sse2 -mno-3dnow $(if $(VBOX_SOLARIS_10),,-msave-args) -mno-red-zone -mcmodel=kernel \
2038 -fno-reorder-blocks -fno-asynchronous-unwind-tables -funit-at-a-time
2039TEMPLATE_VBOXR0DRV_CXXFLAGS = -Wno-trigraphs -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
2040 -O2 -nodefaultlibs -fno-strict-aliasing -fno-common -fno-exceptions -fno-rtti
2041TEMPLATE_VBOXR0DRV_CXXFLAGS.x86 = $(TEMPLATE_VBOXR0DRV_CFLAGS.x86)
2042TEMPLATE_VBOXR0DRV_CXXFLAGS.amd64 = $(TEMPLATE_VBOXR0DRV_CFLAGS.amd64)
2043endif # Solaris
2044
2045ifeq ($(KBUILD_TARGET),freebsd)
2046# x86 FreeBSD:
2047# cc -O2 -fno-strict-aliasing -pipe -Werror -D_KERNEL -DKLD_MODULE \
2048# -nostdinc -I- -I. -I@ -I@/contrib/altq -I@/../include -I/usr/include \
2049# -finline-limit=8000 -fno-common -mno-align-long-strings -mpreferred-stack-boundary=2 \
2050# -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -ffreestanding -Wall -Wredundant-decls -Wnested-externs \
2051# -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -fformat-extensions \
2052# -std=c99 -c ../my.c
2053# ld -d -warn-common -r -d -o my.kld my.o
2054# :> export_syms
2055# awk -f /usr/src/sys/modules/my/../../conf/kmod_syms.awk my.kld export_syms | xargs -J% objcopy % my.kld
2056# ld -Bsharable -d warn-commnon -o my.ko my.kld
2057#
2058# Note: @ -> /usr/src/sys and machine -> /usr/src/sys/i386/include
2059
2060## The location of the FreeBSD kernel source.
2061VBOX_FREEBSD_SRC ?= /usr/src/sys
2062## The FreeBSD /usr/include.
2063VBOX_FREEBSD_SYS_INCS ?= /usr/include
2064
2065TEMPLATE_VBOXR0DRV_TOOL = $(VBOX_GCC_TOOL)
2066TEMPLATE_VBOXR0DRV_LDTOOL = FREEBSDKMODLD
2067TEMPLATE_VBOXR0DRV_DEFS = _KERNEL KLD_MODULE IN_RING0 IN_RT_R0
2068TEMPLATE_VBOXR0DRV_INCS = \
2069 $(VBOX_FREEBSD_SRC) \
2070 $(VBOX_FREEBSD_SRC)/contrib/altq \
2071 $(VBOX_FREEBSD_SRC)/../include \
2072 $(VBOX_FREEBSD_SYS_INCS)
2073# omitting: -Wcast-qual, -Wredundant-decls
2074TEMPLATE_VBOXR0DRV_CFLAGS = \
2075 -Wall -Wno-trigraphs -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
2076 -Wstrict-prototypes -Wmissing-prototypes -Wstrict-prototypes -Wnested-externs \
2077 -O2 -fformat-extensions -ffreestanding -fno-strict-aliasing -fno-common -finline-limit=8000 \
2078 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_OPT) $(VBOX_GCC_FP) \
2079 -nostdinc -std=c99
2080TEMPLATE_VBOXR0DRV_CFLAGS.x86 = -m32 -mno-align-long-strings -mpreferred-stack-boundary=2 -mno-mmx -mno-3dnow -mno-sse -mno-sse2
2081TEMPLATE_VBOXR0DRV_CFLAGS.amd64 = -m64 "Port me to amd64 FreeBSD"
2082TEMPLATE_VBOXR0DRV_CXXFLAGS = -fno-exceptions -fno-rtti \
2083 -Wall -Wno-trigraphs -Wpointer-arith -Winline $(VBOX_GCC_Wno-pointer-sign) \
2084 -O2 -fno-format-extensions -fno-strict-aliasing -fno-common -finline-limit=8000 \
2085 $(VBOX_GCC_fno-stack-protector) $(VBOX_GCC_OPT) $(VBOX_GCC_FP) \
2086 -nostdinc
2087TEMPLATE_VBOXR0DRV_SYSSUFF = .ko
2088TEMPLATE_VBOXR0DRV_LDFLAGS = -d --warn-common
2089TEMPLATE_VBOXR0DRV_LDFLAGS.x86 = -m elf_i386_fbsd
2090TEMPLATE_VBOXR0DRV_LDFLAGS.amd64 = -m elf_x86_64 "Port me to amd64 FreeBSD"
2091
2092TOOL_FREEBSDKMODLD = FreeBSD kernel module linker.
2093# See kBuild/tools/GCC3.kmk for docs.
2094TOOL_FREEBSDKMODLD_LINK_SYSMOD_OUTPUT = $(outbase).kld
2095TOOL_FREEBSDKMODLD_LINK_SYSMOD_OUTPUT_MAYBE = $(outbase).map
2096TOOL_FREEBSDKMODLD_LINK_SYSMOD_DEPEND = $(foreach lib,$(libs),$(if $(findstring $(lib),$(subst /,x,$(lib))),, $(lib)))
2097TOOL_FREEBSDKMODLD_LINK_SYSMOD_DEPORD =
2098define TOOL_FREEBSDKMODLD_LINK_SYSMOD_CMDS
2099 @# Link intermediate .kld (a relocatable object).
2100 ld $(flags) -r -o $(outbase).kld $(objs) \
2101 $(foreach p,$(libpath), -L$(p))\
2102 $(foreach lib,$(libs), $(if $(findstring $(lib),$(subst /,x,$(lib))), -l$(patsubst lib%,%,$(basename $(lib))), $(lib)))
2103 @# Strip non-exported symbols private and localize the exported ones.
2104 awk -f $(VBOX_FREEBSD_SRC)/conf/kmod_syms.awk $(outbase).kld $(if $(othersrc), $(othersrc),/dev/null) \
2105 | xargs -J% objcopy % $(outbase).kld
2106 @# Link the final .ko (a shared object).
2107 ld $(flags) -Bshareable -o $(out) $(outbase).kld
2108endef
2109
2110endif # FreeBSD
2111
2112ifdef VBOX_WITH_VBOXDRV
2113 ifndef TEMPLATE_VBOXR0DRV_TOOL
2114 $(warning Warning: VBox Build: Target $(KBUILD_HOST) is not officially supported!)
2115 endif
2116endif
2117
2118
2119
2120#
2121# Template for building R3 executables and static libraries which are linked into executables.
2122# Note! This is the base template for a whole lot of other ones, so be careful when changing it.
2123#
2124TEMPLATE_VBOXR3EXE = VBox Ring 3 Exe
2125TEMPLATE_VBOXR3EXE_ASTOOL = $(VBOX_ASTOOL)
2126TEMPLATE_VBOXR3EXE_ASFLAGS = $(VBOX_ASFLAGS)
2127TEMPLATE_VBOXR3EXE_DEFS = IN_RING3 $(ARCH_BITS_DEFS)
2128TEMPLATE_VBOXR3EXE_LIBS.kprofile = $(LIB_KPROFILE)
2129ifeq ($(KBUILD_TARGET),win)
2130 TEMPLATE_VBOXR3EXE_TOOL = $(VBOX_VCC_TOOL)
2131 TEMPLATE_VBOXR3EXE_RCDEFS = \
2132 VBOX_VERSION_MAJOR=\"$(VBOX_VERSION_MAJOR)\" \
2133 VBOX_VERSION_MINOR=\"$(VBOX_VERSION_MINOR)\" \
2134 VBOX_VERSION_BUILD=\"$(VBOX_VERSION_BUILD)\" \
2135 VBOX_SVN_REV=\"$(VBOX_SVN_REV)\" \
2136 VBOX_VERSION_MAJOR_NR=$(VBOX_VERSION_MAJOR) \
2137 VBOX_VERSION_MINOR_NR=$(VBOX_VERSION_MINOR) \
2138 VBOX_VERSION_BUILD_NR=$(VBOX_VERSION_BUILD) \
2139 VBOX_SVN_REV_NR=$(VBOX_SVN_REV)
2140 TEMPLATE_VBOXR3EXE_SDKS = WINPSDK
2141 ifdef VBOX_USE_VCC80
2142 TEMPLATE_VBOXR3EXE_CXXFLAGS = -Zi -Zl -GR- -EHs-c- -GF- -MD -W3 -wd4065 -wd4244 -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
2143 TEMPLATE_VBOXR3EXE_CXXFLAGS.debug = -RTCsu
2144 else
2145 TEMPLATE_VBOXR3EXE_CXXFLAGS = -Zi -Zl -GR- -GX- -GF- -MD -W3 -wd4065 -wd4244 $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
2146 TEMPLATE_VBOXR3EXE_CXXFLAGS.debug = -GZ
2147 endif
2148 TEMPLATE_VBOXR3EXE_CXXFLAGS.kprofile = -Gh -GH
2149 TEMPLATE_VBOXR3EXE_CFLAGS = $(TEMPLATE_VBOXR3EXE_CXXFLAGS)
2150 TEMPLATE_VBOXR3EXE_CFLAGS.debug = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.debug)
2151 TEMPLATE_VBOXR3EXE_CFLAGS.kprofile = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.kprofile)
2152 TEMPLATE_VBOXR3EXE_LDFLAGS = \
2153 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG \
2154 /DISALLOWLIB:libc.lib \
2155 /DISALLOWLIB:libcd.lib \
2156 /DISALLOWLIB:libcmt.lib \
2157 /DISALLOWLIB:libcmtd.lib \
2158 /DISALLOWLIB:msvcrtd.lib
2159 TEMPLATE_VBOXR3EXE_LIBS = \
2160 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt.lib \
2161 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt.lib \
2162 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib
2163 TEMPLATE_VBOXR3EXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
2164
2165else # the gcc guys
2166TEMPLATE_VBOXR3EXE_TOOL = $(VBOX_GCC_TOOL)
2167TEMPLATE_VBOXR3EXE_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden)
2168TEMPLATE_VBOXR3EXE_CXXFLAGS.x86 = -m32
2169TEMPLATE_VBOXR3EXE_CXXFLAGS.amd64 = -m64
2170# L4 currently can't handle exception handling.
2171TEMPLATE_VBOXR3EXE_CXXFLAGS.l4 = -fno-exceptions -nostdinc \
2172 $(addprefix -I,$(VBOX_PATH_GCC_INCS) $(L4_INCDIR) $(FILE_TOOL_GPP3_INCDIR)) \
2173 $(DEBUG_L4)
2174TEMPLATE_VBOXR3EXE_CXXFLAGS.kprofile = -finstrument-functions
2175TEMPLATE_VBOXR3EXE_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden)
2176TEMPLATE_VBOXR3EXE_CFLAGS.x86 = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.x86)
2177TEMPLATE_VBOXR3EXE_CFLAGS.amd64 = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.amd64)
2178TEMPLATE_VBOXR3EXE_CFLAGS.debug = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.debug)
2179TEMPLATE_VBOXR3EXE_CFLAGS.kprofile = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.kprofile)
2180TEMPLATE_VBOXR3EXE_CFLAGS.l4 = -nostdinc \
2181 $(addprefix -I,$(VBOX_PATH_GCC_INCS) $(L4_INCDIR)) $(DEBUG_L4)
2182TEMPLATE_VBOXR3EXE_DEFS.l4 = L4_THREAD_SAFE
2183TEMPLATE_VBOXR3EXE_LDFLAGS.x86 = -m32
2184TEMPLATE_VBOXR3EXE_LDFLAGS.amd64 = -m64
2185TEMPLATE_VBOXR3EXE_LDFLAGS.l4 = \
2186 $(L4_LIBDIR)/../crt0.o \
2187 -T$(L4_LIBDIR)/../main_dyn.ld -nostdlib \
2188 -Wl,--export-dynamic,--dynamic-linker=libld-l4.s.so \
2189 -Wl,--rpath-link,$(L4_LIBDIR)
2190TEMPLATE_VBOXR3EXE_LDFLAGS.linux = -Wl,-z,noexecstack $(VBOX_LD_as_needed)
2191 ifeq ($(KBUILD_TARGET),linux)
2192TEMPLATE_VBOXR3EXE_LIBS = pthread m rt dl
2193 else ifeq ($(KBUILD_TARGET),l4)
2194TEMPLATE_VBOXR3EXE_LIBS = \
2195 $(L4_LIBDIR)/libvboxserver.s.so \
2196 $(L4_LIBDIR)/libuc++.0.s.so \
2197 supc++ gcc_eh gcc \
2198 $(L4_LIBDIR)/libdl.s.so \
2199 $(L4_LIBDIR)/libuc.0.s.so
2200 else ifeq ($(KBUILD_TARGET),os2)
2201TEMPLATE_VBOXR3EXE_TOOL = GXX3OMF
2202TEMPLATE_VBOXR3EXE_LIBS = socket iconv
2203 else ifeq ($(KBUILD_TARGET),darwin)
2204TEMPLATE_VBOXR3EXE_TOOL = GXX4MACHO
2205TEMPLATE_VBOXR3EXE_LIBS =
2206TEMPLATE_VBOXR3EXE_DEFS.darwin = $(VBOX_DARWIN_DEF_SDK_DEFS)
2207TEMPLATE_VBOXR3EXE_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
2208TEMPLATE_VBOXR3EXE_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
2209TEMPLATE_VBOXR3EXE_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
2210TEMPLATE_VBOXR3EXE_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -read_only_relocs suppress
2211 else if1of ($(KBUILD_TARGET),freebsd netbsd openbsd)
2212TEMPLATE_VBOXR3EXE_TOOL = GXX3
2213TEMPLATE_VBOXR3EXE_LIBS = pthread
2214TEMPLATE_VBOXR3EXE_INCS += \
2215 /usr/include \
2216 /usr/X11R6/include \
2217 /usr/local/include
2218 else ifeq ($(KBUILD_TARGET),solaris)
2219TEMPLATE_VBOXR3EXE_TOOL = GXX3PLAIN
2220TEMPLATE_VBOXR3EXE_DEFS += LIBICONV_PLUG _REENTRANT # Avoid the GNU libiconv, for now at least.
2221TEMPLATE_VBOXR3EXE_LIBS = rt socket
2222 else
2223$(warning Warning: VBOX Build: Target $(KBUILD_TARGET) is not officially supported!)
2224TEMPLATE_VBOXR3EXE_CXXFLAGS.profile = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.release)
2225TEMPLATE_VBOXR3EXE_CXXFLAGS.kprofile = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.krelease)
2226 endif
2227 ifdef VBOX_WITH_RUNPATH
2228 TEMPLATE_VBOXR3EXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
2229 else ifdef VBOX_WITH_ORIGIN
2230 TEMPLATE_VBOXR3EXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)'
2231 TEMPLATE_VBOXR3EXE_LDFLAGS.linux += -Wl,-z,origin
2232 endif
2233endif
2234
2235#
2236# Template for building R3 shared objects / DLLs.
2237# This is mostly identical to the VBOXR3EXE template. (Avoid PIC if possible!)
2238#
2239TEMPLATE_VBOXR3 = VBox Ring 3 SO/DLLs
2240TEMPLATE_VBOXR3_EXTENDS = VBOXR3EXE
2241TEMPLATE_VBOXR3_LDFLAGS.l4 = $(L4_LIBDIR)/../crt0.s.o -T$(L4_LIBDIR)/../main_rel.ld -nostdlib
2242TEMPLATE_VBOXR3_DEFS.l4 = $(TEMPLATE_VBOXR3EXE_DEFS.l4) __PIC__
2243TEMPLATE_VBOXR3_DEFS.darwin = $(TEMPLATE_VBOXR3EXE_DEFS.darwin) PIC
2244TEMPLATE_VBOXR3_LDFLAGS.darwin = $(TEMPLATE_VBOXR3EXE_LDFLAGS.darwin) -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
2245ifeq ($(filter-out solaris.x86 %.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),)
2246 ifn1of ($(KBUILD_TARGET), darwin win)
2247 TEMPLATE_VBOXR3_DEFS = $(TEMPLATE_VBOXR3EXE_DEFS) PIC
2248 TEMPLATE_VBOXR3_CFLAGS = $(TEMPLATE_VBOXR3EXE_CFLAGS) -fPIC
2249 TEMPLATE_VBOXR3_CXXFLAGS = $(TEMPLATE_VBOXR3EXE_CXXFLAGS) -fPIC
2250 TEMPLATE_VBOXR3_LDFLAGS = $(TEMPLATE_VBOXR3EXE_LDFLAGS) -fPIC
2251 endif
2252endif
2253
2254#
2255# Template for building static R3 executables and any static
2256# libraries they link with.
2257#
2258TEMPLATE_VBOXR3STATIC = VBox Static Ring 3 EXE
2259TEMPLATE_VBOXR3STATIC_EXTENDS = VBOXR3EXE
2260ifeq ($(KBUILD_TARGET),win)
2261 TEMPLATE_VBOXR3STATIC_CFLAGS = $(filter-out -MD, $(TEMPLATE_VBOXR3EXE_CFLAGS)) -MT
2262 TEMPLATE_VBOXR3STATIC_CXXFLAGS = $(filter-out -MD, $(TEMPLATE_VBOXR3EXE_CFLAGS)) -MT
2263 TEMPLATE_VBOXR3STATIC_LDFLAGS = $(filter-out /DISALLOWLIB:libcmt.lib, $(TEMPLATE_VBOXR3EXE_LDFLAGS)) \
2264 /DISALLOWLIB:msvcrt.lib \
2265 /DISALLOWLIB:msvcprt.lib
2266 TEMPLATE_VBOXR3STATIC_LIBS = \
2267 $(PATH_TOOL_$(TEMPLATE_VBOXR3STATIC_TOOL)_LIB)/oldnames.lib \
2268 $(PATH_TOOL_$(TEMPLATE_VBOXR3STATIC_TOOL)_LIB)/libcmt.lib \
2269 $(PATH_TOOL_$(TEMPLATE_VBOXR3STATIC_TOOL)_LIB)/libcpmt.lib
2270else # the gcc guys (untested!)
2271 TEMPLATE_VBOXR3STATIC_CFLAGS = $(TEMPLATE_VBOXR3EXE_CFLAGS) -static
2272 TEMPLATE_VBOXR3STATIC_CXXFLAGS = $(TEMPLATE_VBOXR3EXE_CXXFLAGS) -static
2273 TEMPLATE_VBOXR3STATIC_OBJCFLAGS= $(TEMPLATE_VBOXR3EXE_OBJCFLAGS) -static
2274 TEMPLATE_VBOXR3STATIC_LDFLAGS = $(TEMPLATE_VBOXR3EXE_LDFLAGS) -static
2275endif
2276
2277#
2278# Template for building hardened Ring-3 executables.
2279#
2280TEMPLATE_VBOXR3HARDENEDEXE = Hardened VBox Ring-3 EXE
2281TEMPLATE_VBOXR3HARDENEDEXE_EXTENDS = VBOXR3EXE
2282TEMPLATE_VBOXR3HARDENEDEXE_LIBS = $(VBOX_LIB_SUPHARDENED) $(TEMPLATE_VBOXR3EXE_LIBS)
2283TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS.darwin = $(TEMPLATE_VBOXR3EXE_LDFLAGS.darwin) -framework IOKit
2284
2285#
2286# Template for building hardened Ring-3 libraries.
2287#
2288TEMPLATE_VBOXR3HARDENEDLIB = Hardened VBox Ring-3 LIB
2289TEMPLATE_VBOXR3HARDENEDLIB_EXTENDS = VBOXR3HARDENEDEXE
2290TEMPLATE_VBOXR3HARDENEDLIB_LIBS = $(NO_SUCH_VARIABLE)
2291
2292
2293#
2294# Ring-3 testcase, running automatically during the build.
2295# This is the VBOXR3EXE template only with a different install dir.
2296#
2297TEMPLATE_VBOXR3AUTOTST = VBox Ring 3 Testcase Exe
2298TEMPLATE_VBOXR3AUTOTST_EXTENDS = VBOXR3EXE
2299TEMPLATE_VBOXR3AUTOTST_INST = $(INST_TESTCASE)
2300TEMPLATE_VBOXR3AUTOTST_LIBS = $(TEMPLATE_VBOXR3EXE_LIBS)
2301TEMPLATE_VBOXR3AUTOTST_LIBS.l4 = $(LIB_RUNTIME) $(TEMPLATE_VBOXR3EXE_LIBS.l4)
2302ifeq ($(KBUILD_TARGET),win)
2303 ifdef VBOX_SIGNING_MODE
2304 TEMPLATE_VBOXR3AUTOTST_POST_CMDS =
2305 endif
2306endif
2307
2308#
2309# Ring-3 testcase.
2310# This is the VBOXR3EXE template only with a different install dir.
2311#
2312TEMPLATE_VBOXR3TSTEXE = VBox Ring 3 Testcase Exe
2313TEMPLATE_VBOXR3TSTEXE_EXTENDS = VBOXR3EXE
2314TEMPLATE_VBOXR3TSTEXE_INST = $(INST_TESTCASE)
2315TEMPLATE_VBOXR3TSTEXE_LIBS = $(LIB_RUNTIME) $(TEMPLATE_VBOXR3EXE_LIBS)
2316ifdef VBOX_WITH_RUNPATH
2317 TEMPLATE_VBOXR3TSTEXE_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBOXR3EXE_LDFLAGS)
2318else ifdef VBOX_WITH_ORIGIN
2319 TEMPLATE_VBOXR3TSTEXE_LDFLAGS = '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)/..' $(TEMPLATE_VBOXR3EXE_LDFLAGS)
2320endif
2321ifeq ($(KBUILD_TARGET),win)
2322 ifdef VBOX_SIGNING_MODE
2323 TEMPLATE_VBOXR3TSTEXE_POST_CMDS =
2324 endif
2325endif
2326
2327#
2328# Template for the CppUnit kind of testcases.
2329#
2330TEMPLATE_VBOXCPPUNITEXE = VBox CppUnit Testcase Exe
2331TEMPLATE_VBOXCPPUNITEXE_EXTENDS = VBOXR3TSTEXE
2332## @todo make a CPPUNIT SDK and add cppunit tools packages for windows, mac, solaris and OS/2.
2333#TEMPLATE_VBOXCPPUNITEXE_SDKS = CPPUNIT -
2334TEMPLATE_VBOXCPPUNITEXE_LIBS = \
2335 $(TEMPLATE_VBOXR3TSTEXE_LIBS) \
2336 cppunit
2337
2338#
2339# Template for building bad C/C++ style R3 executables (no -pedantic).
2340#
2341TEMPLATE_VBOXR3NPEXE = VBox Ring 3 Non-pedantic
2342TEMPLATE_VBOXR3NPEXE_EXTENDS = VBOXR3EXE
2343ifneq ($(KBUILD_TARGET),win) # (only gcc)
2344 TEMPLATE_VBOXR3NPEXE_TOOL = $(VBOX_GCC_TOOL)
2345 TEMPLATE_VBOXR3NPEXE_CXXFLAGS = $(filter-out -pedantic,$(TEMPLATE_VBOXR3EXE_CXXFLAGS))
2346 TEMPLATE_VBOXR3NPEXE_CFLAGS = $(filter-out -pedantic -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations,$(TEMPLATE_VBOXR3EXE_CFLAGS))
2347endif
2348
2349
2350#
2351# Template for building bad C/C++ style R3 shared libraries / Dlls (no -pedantic).
2352# This is mostly identical to the VBOXR3NPEXE template.
2353#
2354TEMPLATE_VBOXR3NP= VBox Ring 3 Non-pedantic
2355TEMPLATE_VBOXR3NP_EXTENDS = VBOXR3NPEXE
2356TEMPLATE_VBOXR3NP_LDFLAGS.l4 = \
2357 $(L4_LIBDIR)/../crt0.s.o \
2358 -T$(L4_LIBDIR)/../main_rel.ld \
2359 -nostdlib
2360TEMPLATE_VBOXR3NP_DEFS.l4 = $(TEMPLATE_VBOXR3NPEXE_DEFS.l4) __PIC__
2361ifeq ($(filter-out solaris.x86 %.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),)
2362 ifneq ($(KBUILD_TARGET),win)
2363 TEMPLATE_VBOXR3NP_DEFS = $(TEMPLATE_VBOXR3NPEXE_DEFS) PIC
2364 TEMPLATE_VBOXR3NP_CFLAGS = $(TEMPLATE_VBOXR3NPEXE_CFLAGS) -fPIC
2365 TEMPLATE_VBOXR3NP_CXXFLAGS = $(TEMPLATE_VBOXR3NPEXE_CXXFLAGS) -fPIC
2366 TEMPLATE_VBOXR3NP_LDFLAGS = $(TEMPLATE_VBOXR3NPEXE_LDFLAGS) -fPIC
2367 endif
2368endif
2369
2370
2371#
2372# Template for building libraries, shared libraries / modules
2373# which only depends on IPRT for crt.
2374#
2375TEMPLATE_VBOXNOCRTGCC = VBox no-crt GCC libraries and modules, yasm/nasm.
2376TEMPLATE_VBOXNOCRTGCC_DEFS = IN_RING3 IPRT_NO_CRT $(ARCH_BITS_DEFS)
2377TEMPLATE_VBOXNOCRTGCC_ASDEFS = ASM_CALL64_GCC
2378TEMPLATE_VBOXNOCRTGCC_CFLAGS = -nostdinc -fno-strict-aliasing -fno-math-errno -Wall
2379TEMPLATE_VBOXNOCRTGCC_CFLAGS.x86 = -m32
2380TEMPLATE_VBOXNOCRTGCC_CFLAGS.amd64 = -m64 -mcmodel=medium -fno-common
2381TEMPLATE_VBOXNOCRTGCC_CFLAGS.release = -O2 -fno-strict-aliasing
2382TEMPLATE_VBOXNOCRTGCC_CFLAGS.profile = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.release)
2383TEMPLATE_VBOXNOCRTGCC_CFLAGS.kprofile = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.release)
2384ifdef VBOX_TARGET_MAC_OS_X_VERSION_10_5 ## @todo this probably works for 10.4 too, check.
2385 TEMPLATE_VBOXNOCRTGCC_CFLAGS.darwin = -static
2386else
2387 TEMPLATE_VBOXNOCRTGCC_CFLAGS.darwin = -mdynamic-no-pic
2388endif
2389TEMPLATE_VBOXNOCRTGCC_CXXFLAGS = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS)
2390TEMPLATE_VBOXNOCRTGCC_CXXFLAGS.$(KBUILD_TARGET) = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.$(KBUILD_TARGET))
2391TEMPLATE_VBOXNOCRTGCC_CXXFLAGS.$(KBUILD_TARGET_ARCH) = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.$(KBUILD_TARGET_ARCH))
2392TEMPLATE_VBOXNOCRTGCC_INCS = $(PATH_ROOT)/include/iprt/nocrt
2393
2394ifeq ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH),win.amd64)
2395 # cross compile to 64-bit ELF (linux).
2396 TEMPLATE_VBOXNOCRTGCC_TOOL = XGCCAMD64LINUX
2397 TEMPLATE_VBOXNOCRTGCC_ASTOOL = YASM
2398 TEMPLATE_VBOXNOCRTGCC_ASFLAGS = -f elf64 -DASM_FORMAT_ELF -D__YASM__ -w+orphan-labels -g dwarf2
2399 TEMPLATE_VBOXNOCRTGCC_LIBS = $(PATH_DEVTOOLS)/win.x86/x86_64-unknown-linux-gnu/20060701-r2/lib/gcc/x86_64-unknown-linux-gnu/3.4.6/libgcc.a
2400 TEMPLATE_VBOXNOCRTGCC_LDFLAGS = -nostdlib
2401
2402else ifeq ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH),win.x86)
2403 # Use the default GCC (MinGW) with the Microsoft linker.
2404 # (Drop all '-g' options as we're unable to strip the debug info.)
2405 TEMPLATE_VBOXNOCRTGCC_TOOL = $(VBOX_GCC_TOOL)
2406 TEMPLATE_VBOXNOCRTGCC_ASTOOL = $(VBOX_ASTOOL)
2407 TEMPLATE_VBOXNOCRTGCC_ASFLAGS = $(VBOX_ASFLAGS)
2408 TEMPLATE_VBOXNOCRTGCC_LDTOOL = $(VBOX_VCC_TOOL)
2409 TEMPLATE_VBOXNOCRTGCC_LDFLAGS = -Incremental:NO -MapInfo:Exports -NoD
2410 TEMPLATE_VBOXNOCRTGCC_LIBS = $(VBOX_GCC_LIBGCC)
2411 TEMPLATE_VBOXNOCRTGCC_CFLAGS := $(filter-out -g,$(TEMPLATE_VBOXNOCRTGCC_CFLAGS)) -s
2412
2413else
2414 # Use the default GCC.
2415 # The use of --exclude-libs ALL is to avoid confusing the linux ld.so.
2416 TEMPLATE_VBOXNOCRTGCC_TOOL = $(VBOX_GCC_TOOL)
2417 TEMPLATE_VBOXNOCRTGCC_ASTOOL = $(VBOX_ASTOOL)
2418 TEMPLATE_VBOXNOCRTGCC_ASFLAGS = $(VBOX_ASFLAGS)
2419 TEMPLATE_VBOXNOCRTGCC_CFLAGS += $(VBOX_GCC_fno-stack-protector)
2420 TEMPLATE_VBOXNOCRTGCC_CXXFLAGS += $(VBOX_GCC_fno-stack-protector)
2421 ifeq ($(KBUILD_TARGET_ARCH),amd64)
2422 # in 64-bit mode we'll build a sys-module (VBoxREM2).
2423 if1of ($(KBUILD_TARGET),darwin solaris)
2424 TEMPLATE_VBOXNOCRTGCC_LDFLAGS.solaris= -64 -r
2425 else
2426 TEMPLATE_VBOXNOCRTGCC_LDFLAGS = -nostdlib
2427 endif
2428 else # x86:
2429 TEMPLATE_VBOXNOCRTGCC_LDFLAGS = -nostdlib
2430 ifn1of ($(KBUILD_TARGET), os2 darwin solaris)
2431 TEMPLATE_VBOXNOCRTGCC_LDFLAGS += -Wl,--no-undefined
2432 endif
2433 endif # x86
2434 TEMPLATE_VBOXNOCRTGCC_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
2435 TEMPLATE_VBOXNOCRTGCC_LIBS = # FIXME - has unwind mess.
2436endif
2437
2438
2439#
2440# Same as VBOXNOCRTGCC only it uses GAS as the assembler instead of yasm/nasm.
2441#
2442TEMPLATE_VBOXNOCRTGAS = VBox no-crt GCC libraries and modules, gas.
2443TEMPLATE_VBOXNOCRTGAS_EXTENDS = VBOXNOCRTGCC
2444TEMPLATE_VBOXNOCRTGAS_ASTOOL = $(TEMPLATE_VBOXNOCRTGCC_TOOL)
2445ifeq ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH),win.x86)
2446 TEMPLATE_VBOXNOCRTGAS_ASFLAGS = -s
2447else
2448 TEMPLATE_VBOXNOCRTGAS_ASFLAGS = -g
2449endif
2450TEMPLATE_VBOXNOCRTGAS_ASFLAGS.x86 = -m32
2451TEMPLATE_VBOXNOCRTGAS_ASFLAGS.amd64 = -m64
2452
2453
2454#
2455# Template for building executables that are part of the VBox Main component
2456# (COM/XPCOM interface to VirtualBox).
2457#
2458TEMPLATE_VBOXMAINEXE = VBox Main Executable
2459TEMPLATE_VBOXMAINEXE_ASTOOL = $(VBOX_ASTOOL)
2460TEMPLATE_VBOXMAINEXE_ASFLAGS = $(VBOX_ASFLAGS)
2461TEMPLATE_VBOXMAINEXE_DEFS = IN_RING3 UNICODE NDEBUG=1
2462TEMPLATE_VBOXMAINEXE_DEFS.win = _UNICODE
2463TEMPLATE_VBOXMAINEXE_RCDEFS = $(TEMPLATE_VBOXR3EXE_RCDEFS)
2464TEMPLATE_VBOXMAINEXE_LIBS.kprofile = $(LIB_KPROFILE)
2465
2466ifeq ($(KBUILD_TARGET),win)
2467 TEMPLATE_VBOXMAINEXE_SDKS = WINPSDK W2K3DDK
2468 ifdef VBOX_USE_VCC80
2469 TEMPLATE_VBOXMAINEXE_TOOL = $(VBOX_VCC_TOOL)
2470 TEMPLATE_VBOXMAINEXE_CXXFLAGS = -Zi -Zl -GR -GF- -MD -EHsc -W3 -wd4065 -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
2471 TEMPLATE_VBOXMAINEXE_CXXFLAGS.debug = -RTCsu
2472 else
2473 TEMPLATE_VBOXMAINEXE_TOOL = VCC70
2474 TEMPLATE_VBOXMAINEXE_CXXFLAGS = -Zi -Zl -GR -GX- -GF- -MD -EHsc -W3 -wd4065 $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
2475 TEMPLATE_VBOXMAINEXE_CXXFLAGS.debug = -GZ
2476 endif
2477 TEMPLATE_VBOXMAINEXE_CXXFLAGS.kprofile = -Gh -GH
2478 TEMPLATE_VBOXMAINEXE_CFLAGS = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS)
2479 TEMPLATE_VBOXMAINEXE_CFLAGS.debug = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.debug)
2480 TEMPLATE_VBOXMAINEXE_CFLAGS.kprofile = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.kprofile)
2481 TEMPLATE_VBOXMAINEXE_INCS += \
2482 $(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_INC)
2483 TEMPLATE_VBOXMAINEXE_LDFLAGS = \
2484 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG\
2485 /DISALLOWLIB:libc.lib \
2486 /DISALLOWLIB:libcd.lib \
2487 /DISALLOWLIB:msvcrt.lib \
2488 /DISALLOWLIB:msvcrtd.lib \
2489 /DISALLOWLIB:libcmtd.lib \
2490 /DISALLOWLIB:libcmt.lib
2491 TEMPLATE_VBOXMAINEXE_LIBS = \
2492 $(LIB_RUNTIME) \
2493 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt.lib \
2494 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt.lib \
2495 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \
2496 $(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_LIB)/atls.lib
2497 TEMPLATE_VBOXMAINEXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
2498
2499else # the GCC guys:
2500
2501TEMPLATE_VBOXMAINEXE_TOOL = $(VBOX_GCC_TOOL)
2502TEMPLATE_VBOXMAINEXE_CXXFLAGS = -g -Wall -Wno-long-long -Wno-trigraphs -pipe -Wno-non-virtual-dtor -fshort-wchar -fpermissive -fexceptions -frtti $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-inlines-hidden) $(VBOX_GCC_fvisibility-hidden)
2503TEMPLATE_VBOXMAINEXE_CXXFLAGS.x86 = -m32
2504TEMPLATE_VBOXMAINEXE_CXXFLAGS.amd64 = -m64
2505TEMPLATE_VBOXMAINEXE_CXXFLAGS.kprofile = -finstrument-functions
2506TEMPLATE_VBOXMAINEXE_CFLAGS = -g -Wall -Wno-long-long -Wno-trigraphs -pipe -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations $(VBOX_GCC_OPT) $(VBOX_GCC_FP) -fno-strict-aliasing $(VBOX_GCC_fvisibility-hidden)
2507TEMPLATE_VBOXMAINEXE_CFLAGS.x86 = -m32
2508TEMPLATE_VBOXMAINEXE_CFLAGS.amd64 = -m64
2509TEMPLATE_VBOXMAINEXE_CFLAGS.kprofile = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.kprofile)
2510TEMPLATE_VBOXMAINEXE_LDFLAGS.x86 = -m32
2511TEMPLATE_VBOXMAINEXE_LDFLAGS.amd64 = -m64
2512 ifeq ($(KBUILD_TARGET),linux)
2513TEMPLATE_VBOXMAINEXE_LIBS = pthread m rt $(LIB_RUNTIME)
2514TEMPLATE_VBOXMAINEXE_LDFLAGS.linux = $(VBOX_LD_as_needed)
2515 else ifeq ($(KBUILD_TARGET),l4)
2516TEMPLATE_VBOXMAINEXE_LIBS = $(LIB_RUNTIME)
2517# no libs as yet in l4 target - must be added later
2518 else ifeq ($(KBUILD_TARGET),os2)
2519TEMPLATE_VBOXMAINEXE_TOOL = GXX3OMF
2520TEMPLATE_VBOXMAINEXE_LIBS = $(LIB_RUNTIME)
2521 else ifeq ($(KBUILD_TARGET),darwin)
2522TEMPLATE_VBOXMAINEXE_TOOL = GXX4MACHO
2523TEMPLATE_VBOXMAINEXE_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
2524TEMPLATE_VBOXMAINEXE_CFLAGS += $(VBOX_DARWIN_DEF_SDK_CFLAGS)
2525TEMPLATE_VBOXMAINEXE_CXXFLAGS += $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
2526TEMPLATE_VBOXMAINEXE_OBJCFLAGS += $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
2527TEMPLATE_VBOXMAINEXE_LDFLAGS.darwin += -bind_at_load
2528TEMPLATE_VBOXMAINEXE_LDFLAGS += $(VBOX_DARWIN_DEF_SDK_LDFLAGS) -framework Carbon
2529TEMPLATE_VBOXMAINEXE_LIBS = $(LIB_RUNTIME)
2530 else if1of ($(KBUILD_TARGET), freebsd netbsd openbsd)
2531TEMPLATE_VBOXMAINEXE_TOOL = GXX3
2532TEMPLATE_VBOXMAINEXE_LIBS = $(LIB_RUNTIME)
2533 else ifeq ($(KBUILD_TARGET),solaris)
2534TEMPLATE_VBOXMAINEXE_TOOL = GXX3PLAIN
2535TEMPLATE_VBOXMAINEXE_DEFS += _REENTRANT
2536TEMPLATE_VBOXMAINEXE_LIBS = $(LIB_RUNTIME) rt
2537 else
2538$(warning Warning: VBOX Build: Target $(KBUILD_TARGET) is not officially supported!)
2539TEMPLATE_VBOXMAINEXE_LIBS =
2540 endif
2541 ifdef VBOX_WITH_RUNPATH
2542TEMPLATE_VBOXMAINEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
2543 else ifdef VBOX_WITH_ORIGIN
2544TEMPLATE_VBOXMAINEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)'
2545TEMPLATE_VBOXMAINEXE_LDFLAGS.linux += -Wl,-z,origin
2546 endif
2547
2548endif # !win
2549
2550# Add COM/XPCOM stuff
2551TEMPLATE_VBOXMAINEXE_LIBS += \
2552 $(PATH_LIB)/VBoxCOM$(VBOX_SUFF_LIB)
2553ifdef VBOX_WITH_XPCOM
2554 ## @todo may be worth creating the VBOX_XPCOM SDK def
2555 TEMPLATE_VBOXMAINEXE_DEFS += VBOX_WITH_XPCOM
2556 ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
2557 TEMPLATE_VBOXMAINEXE_DEFS += VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
2558 endif
2559 TEMPLATE_VBOXMAINEXE_INCS += \
2560 $(VBOX_XPCOM_INCS)
2561 TEMPLATE_VBOXMAINEXE_LIBS += \
2562 $(LIB_XPCOM)
2563 TEMPLATE_VBOXMAINEXE_INTERMEDIATES += \
2564 $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
2565
2566else # COM
2567 TEMPLATE_VBOXMAINEXE_INCS += \
2568 $(VBOX_PATH_SDK)/bindings/mscom/include
2569 TEMPLATE_VBOXMAINEXE_INTERMEDIATES += \
2570 $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
2571endif # COM
2572
2573#
2574# Template for building the Main DLL modules (such as in-process COM/XPCOM
2575# components for Main).
2576#
2577# This differs from VBOXMAINEXE only in PIC handling and similar DLL stuff.
2578#
2579TEMPLATE_VBOXMAINDLL = VBox Main Component (shared library)
2580TEMPLATE_VBOXMAINDLL_EXTENDS = VBOXMAINEXE
2581ifeq ($(filter-out solaris.x86 %.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),)
2582 ifn1of ($(KBUILD_TARGET), darwin win)
2583 TEMPLATE_VBOXMAINDLL_DEFS = PIC $(TEMPLATE_VBOXMAINEXE_DEFS)
2584 TEMPLATE_VBOXMAINDLL_CFLAGS = -fPIC $(TEMPLATE_VBOXMAINEXE_CFLAGS)
2585 TEMPLATE_VBOXMAINDLL_CXXFLAGS = -fPIC $(TEMPLATE_VBOXMAINEXE_CXXFLAGS)
2586 TEMPLATE_VBOXMAINDLL_LDFLAGS = -fPIC $(TEMPLATE_VBOXMAINEXE_LDFLAGS)
2587 endif
2588endif
2589TEMPLATE_VBOXMAINDLL_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBOXMAINEXE_LDFLAGS.darwin)) \
2590 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
2591
2592#
2593# Template identical to VBOXMAINDLL except for where the stuff is
2594# installed when using XPCOM (components/).
2595#
2596# Note! In the hardened build this gets a bit ugly since $ORIGIN/..
2597# doesn't work. So, we use $ORIGIN there and let the installers
2598# handle the symlinking.
2599#
2600# (No difference when building against COM on Windows.)
2601#
2602TEMPLATE_VBOXMAINCOMP = VBox Main COM/XPCOM Component (shared library)
2603TEMPLATE_VBOXMAINCOMP_EXTENDS = VBOXMAINEXE
2604ifn1of ($(KBUILD_TARGET), win) ## WARNING! Linux used to be excluded too, so this may cause trouble.
2605 TEMPLATE_VBOXMAINCOMP_INST = $(INST_BIN)components/
2606endif
2607ifeq ($(filter-out solaris.x86 %.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),)
2608 ifneq ($(KBUILD_TARGET),win)
2609 TEMPLATE_VBOXMAINCOMP_DEFS = PIC $(TEMPLATE_VBOXMAINEXE_DEFS)
2610 TEMPLATE_VBOXMAINCOMP_CFLAGS = -fPIC $(TEMPLATE_VBOXMAINEXE_CFLAGS)
2611 TEMPLATE_VBOXMAINCOMP_CXXFLAGS = -fPIC $(TEMPLATE_VBOXMAINEXE_CXXFLAGS)
2612 ifdef VBOX_WITH_ORIGIN
2613 ifndef VBOX_WITH_HARDENING
2614 TEMPLATE_VBOXMAINCOMP_LDFLAGS = -fPIC $(filter-out '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)',$(TEMPLATE_VBOXMAINEXE_LDFLAGS)) '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)/..'
2615 endif
2616 endif
2617 ifndef TEMPLATE_VBOXMAINCOMP_LDFLAGS
2618 TEMPLATE_VBOXMAINCOMP_LDFLAGS = -fPIC $(TEMPLATE_VBOXMAINEXE_LDFLAGS)
2619 endif
2620 endif
2621endif
2622ifdef VBOX_WITH_ORIGIN
2623 ifndef TEMPLATE_VBOXMAINCOMP_LDFLAGS
2624 ifndef VBOX_WITH_HARDENING
2625 TEMPLATE_VBOXMAINCOMP_LDFLAGS = $(filter-out '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)',$(TEMPLATE_VBOXMAINEXE_LDFLAGS)) '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)/..'
2626 endif
2627 endif
2628endif
2629TEMPLATE_VBOXMAINCOMP_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBOXMAINEXE_LDFLAGS.darwin)) \
2630 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
2631
2632#
2633# Template for building the Main static libraries.
2634#
2635# This differs from VBOXMAINDLL only that it zeroes out the _LIBS definition.
2636#
2637TEMPLATE_VBOXMAINLIB = VBox Main Component (static library)
2638TEMPLATE_VBOXMAINLIB_EXTENDS = VBOXMAINDLL
2639TEMPLATE_VBOXMAINLIB_LIBS =
2640
2641#
2642# Template for building executables that use the VBox Main component.
2643#
2644TEMPLATE_VBOXMAINCLIENTEXE = VBox Main Client (executable)
2645TEMPLATE_VBOXMAINCLIENTEXE_EXTENDS = VBOXMAINEXE
2646ifeq ($(KBUILD_TARGET),win)
2647 TEMPLATE_VBOXMAINCLIENTEXE_LIBS.win = $(TEMPLATE_VBOXMAINEXE_LIBS.win) \
2648 $(PATH_SDK_WINPSDK_LIB)/User32.Lib \
2649 $(PATH_SDK_WINPSDK_LIB)/Shell32.Lib \
2650 $(PATH_SDK_WINPSDK_LIB)/ShLwApi.Lib \
2651 $(PATH_SDK_WINPSDK_LIB)/Ole32.Lib \
2652 $(PATH_SDK_WINPSDK_LIB)/OleAut32.Lib \
2653 $(PATH_SDK_WINPSDK_LIB)/Uuid.Lib
2654else
2655 TEMPLATE_VBOXMAINCLIENTEXE_DEFS = $(TEMPLATE_VBOXMAINEXE_DEFS) \
2656 NDEBUG TRIMMED
2657 TEMPLATE_VBOXMAINCLIENTEXE_CXXFLAGS.linux = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.linux) \
2658 -pthread
2659endif
2660
2661#
2662# Template for building shared libraries / DLLs that use the VBox Main component.
2663#
2664# This differs from VBOXMAINCLIENTEXE only in PIC handling and similar DLL stuff.
2665#
2666TEMPLATE_VBOXMAINCLIENTDLL = VBox MAIN Client (shared library)
2667TEMPLATE_VBOXMAINCLIENTDLL_EXTENDS = VBOXMAINCLIENTEXE
2668ifeq ($(filter-out solaris.x86 %.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),)
2669 ifneq ($(KBUILD_TARGET),win)
2670 TEMPLATE_VBOXMAINCLIENTDLL_DEFS = PIC $(TEMPLATE_VBOXMAINCLIENTEXE_DEFS)
2671 TEMPLATE_VBOXMAINCLIENTDLL_CFLAGS = -fPIC $(TEMPLATE_VBOXMAINCLIENTEXE_CFLAGS)
2672 TEMPLATE_VBOXMAINCLIENTDLL_CXXFLAGS = -fPIC $(TEMPLATE_VBOXMAINCLIENTEXE_CXXFLAGS)
2673 TEMPLATE_VBOXMAINCLIENTDLL_LDFLAGS = -fPIC $(TEMPLATE_VBOXMAINCLIENTEXE_LDFLAGS)
2674 endif
2675endif
2676TEMPLATE_VBOXMAINCLIENTDLL_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBOXMAINCLIENTEXE_LDFLAGS.darwin))
2677
2678
2679#
2680# Template for building Qt GUI executables.
2681#
2682TEMPLATE_VBOXQTGUIEXE = VBox Qt GUI Executable
2683TEMPLATE_VBOXQTGUIEXE_DEFS = IN_RING3 QT_NO_DEBUG QT_THREAD_SUPPORT $(ARCH_BITS_DEFS)
2684TEMPLATE_VBOXQTGUIEXE_INCS = \
2685 $(VBOX_PATH_QT)/include
2686
2687ifeq ($(KBUILD_TARGET),win)
2688 # drag in library configuration (we need QMAKE_PRL_DEFINES)
2689 ifneq ($(LIB_QT_PRL),)
2690 include $(LIB_QT_PRL)
2691 endif
2692 TEMPLATE_VBOXQTGUIEXE_TOOL = $(VBOX_VCC_TOOL)
2693 TEMPLATE_VBOXQTGUIEXE_QT_PREFIX = VBox
2694 TEMPLATE_VBOXQTGUIEXE_DEFS += \
2695 _WIN32_WINNT=0x0500 UNICODE _UNICODE \
2696 QT_DLL _CRT_SECURE_NO_DEPRECATE \
2697 $(QMAKE_PRL_DEFINES)
2698 ## @todo VCC70 flags?
2699 ifdef VBOX_USE_VCC80
2700 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS = \
2701 -nologo -Zm200 -W3 -MD -Zi -EHsc -Zc:wchar_t-
2702 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS.debug = -RTCsu
2703 else
2704 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS = \
2705 -nologo -Zm200 -W3 -MD -Zi -GX
2706 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS.debug = -GZ
2707 endif
2708 TEMPLATE_VBOXQTGUIEXE_INCS += \
2709 $(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_INC)
2710 TEMPLATE_VBOXQTGUIEXE_LDFLAGS = \
2711 /NOD /NOLOGO /INCREMENTAL:NO /MAPINFO:EXPORTS /DEBUG \
2712 /DELAYLOAD:oleaut32.dll
2713 TEMPLATE_VBOXQTGUIEXE_SDKS = WINPSDK
2714 TEMPLATE_VBOXQTGUIEXE_LIBS = \
2715 $(LIB_QT) \
2716 $(LIB_QTMAIN) \
2717 $(LIB_RUNTIME) \
2718 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt.lib \
2719 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt.lib \
2720 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \
2721 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib \
2722 $(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_LIB)/atls.lib
2723 TEMPLATE_VBOXQTGUIEXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
2724
2725else # the gcc guys:
2726 TEMPLATE_VBOXQTGUIEXE_TOOL = $(VBOX_GCC_TOOL)
2727 TEMPLATE_VBOXQTGUIEXE_DEFS.linux = _REENTRANT
2728 TEMPLATE_VBOXQTGUIEXE_DEFS.solaris = _REENTRANT
2729
2730 TEMPLATE_VBOXQTGUIEXE_INCS += \
2731 $(LIB_SDL_INC)
2732 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS = \
2733 -pipe -Wall -W -frtti -fno-exceptions -Wno-non-virtual-dtor \
2734 -Wno-long-long -fshort-wchar -fno-strict-aliasing \
2735 $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden)
2736 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS.x86 = -m32
2737 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS.amd64 = -m64
2738 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS.linux = -pthread
2739 TEMPLATE_VBOXQTGUIEXE_LDFLAGS.x86 = -m32
2740 TEMPLATE_VBOXQTGUIEXE_LDFLAGS.amd64 = -m64
2741 TEMPLATE_VBOXQTGUIEXE_LIBS += \
2742 $(LIB_SDL) \
2743 $(LIB_RUNTIME) \
2744 $(LIB_REM) \
2745 $(LIB_VMM)
2746
2747 ifeq ($(KBUILD_TARGET),linux)
2748 TEMPLATE_VBOXQTGUIEXE_LDFLAGS += $(VBOX_LD_as_needed)
2749 else ifeq ($(KBUILD_TARGET),darwin)
2750 TEMPLATE_VBOXQTGUIEXE_DEFS += $(VBOX_DARWIN_DEF_SDK_DEFS)
2751 TEMPLATE_VBOXQTGUIEXE_CFLAGS += $(VBOX_DARWIN_DEF_SDK_CFLAGS)
2752 TEMPLATE_VBOXQTGUIEXE_CXXFLAGS += $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
2753 TEMPLATE_VBOXQTGUIEXE_OBJCFLAGS += $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
2754 TEMPLATE_VBOXQTGUIEXE_LDFLAGS.darwin += -bind_at_load
2755 TEMPLATE_VBOXQTGUIEXE_LIBS +=
2756 TEMPLATE_VBOXQTGUIEXE_LIBPATH +=
2757 else ifeq ($(KBUILD_TARGET),os2)
2758 # drag in library configuration (we need QMAKE_PRL_DEFINES)
2759 ifneq ($(LIB_QT_PRL),)
2760 include $(LIB_QT_PRL)
2761 endif
2762 TEMPLATE_VBOXQTGUIEXE_DEFS += $(QMAKE_PRL_DEFINES)
2763 TEMPLATE_VBOXQTGUIEXE_LIBS +=
2764 TEMPLATE_VBOXQTGUIEXE_LIBPATH +=
2765 else
2766 TEMPLATE_VBOXQTGUIEXE_INCS += \
2767 $(VBOX_XCURSOR_INCS)
2768 TEMPLATE_VBOXQTGUIEXE_LIBS += \
2769 $(VBOX_XCURSOR_LIBS) \
2770 Xext \
2771 X11 \
2772 m \
2773 $(LIB_PTHREAD)
2774 TEMPLATE_VBOXQTGUIEXE_LIBPATH += \
2775 $(VBOX_LIBPATH_X11)
2776 ifeq ($(KBUILD_TARGET),freebsd)
2777 TEMPLATE_VBOXQTGUIEXE_INCS += \
2778 /usr/include \
2779 /usr/X11R6/include \
2780 /usr/local/include
2781 endif
2782 ifeq ($(KBUILD_TARGET),solaris)
2783 TEMPLATE_VBOXQTGUIEXE_LIBS += \
2784 rt socket nsl
2785 endif
2786 endif
2787 ifdef VBOX_WITH_RUNPATH
2788 ifeq ($(KBUILD_TARGET),solaris)
2789 TEMPLATE_VBOXQTGUIEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH):$(VBOX_WITH_RUNPATH)/qtgcc/lib'
2790 else
2791 TEMPLATE_VBOXQTGUIEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
2792 endif
2793 else ifdef VBOX_WITH_ORIGIN
2794 ifeq ($(KBUILD_TARGET),solaris)
2795 TEMPLATE_VBOXQTGUIEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN):$$(VBOX_ORIGIN)/qtgcc/lib'
2796 else
2797 TEMPLATE_VBOXQTGUIEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)'
2798 endif
2799 endif
2800
2801endif # !win
2802
2803# Add COM/XPCOM stuff
2804TEMPLATE_VBOXQTGUIEXE_LIBS += \
2805 $(PATH_LIB)/VBoxCOM$(VBOX_SUFF_LIB)
2806ifdef VBOX_WITH_XPCOM
2807 ## @todo may be worth creating the VBOX_XPCOM SDK def
2808 TEMPLATE_VBOXQTGUIEXE_DEFS += VBOX_WITH_XPCOM
2809 ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
2810 TEMPLATE_VBOXQTGUIEXE_DEFS += VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
2811 endif
2812 TEMPLATE_VBOXQTGUIEXE_INCS += \
2813 $(VBOX_XPCOM_INCS)
2814 TEMPLATE_VBOXQTGUIEXE_LIBS += \
2815 $(LIB_XPCOM)
2816 TEMPLATE_VBOXQTGUIEXE_INTERMEDIATES += \
2817 $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
2818else
2819 TEMPLATE_VBOXQTGUIEXE_INCS += \
2820 $(VBOX_PATH_SDK)/bindings/mscom/include
2821 TEMPLATE_VBOXQTGUIEXE_INTERMEDIATES += \
2822 $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
2823endif
2824
2825#
2826# Template for building Qt GUI components.
2827#
2828TEMPLATE_VBOXQTGUI = VBox Qt GUI Components
2829TEMPLATE_VBOXQTGUI_EXTENDS = VBOXQTGUIEXE
2830TEMPLATE_VBOXQTGUI_LIBS = $(filter-out $(QTMAIN),$(TEMPLATE_VBOXQTGUIEXE_LIBS))
2831ifeq ($(KBUILD_TARGET),darwin)
2832 TEMPLATE_VBOXQTGUI_LDFLAGS.darwin = $(filter-out -bind_at_load,$(TEMPLATE_VBOXQTGUIEXE_LDFLAGS.darwin)) \
2833 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
2834endif
2835ifeq ($(filter-out solaris.x86 %.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),)
2836 ifneq ($(KBUILD_TARGET),win)
2837 TEMPLATE_VBOXQTGUI_DEFS = PIC $(TEMPLATE_VBOXQTGUIEXE_DEFS)
2838 TEMPLATE_VBOXQTGUI_CFLAGS = -fPIC $(TEMPLATE_VBOXQTGUIEXE_CFLAGS)
2839 TEMPLATE_VBOXQTGUI_CXXFLAGS = -fPIC $(TEMPLATE_VBOXQTGUIEXE_CXXFLAGS)
2840 TEMPLATE_VBOXQTGUI_LDFLAGS = -fPIC $(TEMPLATE_VBOXQTGUIEXE_LDFLAGS)
2841 endif
2842endif
2843
2844
2845#
2846# Qt 4
2847# Qt 4
2848# Qt 4
2849#
2850
2851# Guess VBOX_WITH_QT4_SUN
2852ifndef VBOX_WITH_QT4_SUN
2853 ifndef VBOX_OSE
2854 if1of ($(KBUILD_TARGET), darwin solaris win)
2855 VBOX_WITH_QT4_SUN := 1
2856 endif
2857 endif
2858endif
2859
2860#
2861# Handmade configuration of qt4 - very annoying, this needs to
2862# be cleaned up properly later some time (not important now).
2863#
2864ifeq ($(VBOX_PATH_QT4),)
2865 ifeq ($(KBUILD_TARGET),darwin)
2866 VBOX_PATH_QT4 := $(lastword $(sort $(wildcard $(PATH_DEVTOOLS_TRG)/qt/v4*)))
2867 ifeq ($(VBOX_PATH_QT4),)
2868 ifneq ($(wildcard /Library/Frameworks/QtCore.framework),)
2869 # Using the global installation (for OSE).
2870 VBOX_PATH_QT4 ?= /usr
2871 VBOX_PATH_QT4_FRAMEWORKS ?= /Library/Frameworks
2872 endif
2873 endif
2874 else if1of ($(KBUILD_TARGET),win)
2875 VBOX_PATH_QT4 ?= $(lastword $(sort $(wildcard $(PATH_DEVTOOLS_TRG)/qt/v4*)))
2876 else if1of ($(KBUILD_TARGET),solaris)
2877 VBOX_PATH_QT4 ?= $(lastword $(sort $(wildcard $(PATH_DEVTOOLS_TRG)/qt/v4*)))
2878 ifneq ($(VBOX_PATH_QT4),)
2879 VBOX_WITH_QT4_SUN = 1
2880 endif
2881 endif
2882endif
2883ifeq ($(VBOX_PATH_QT4),)
2884 if1of ($(USERNAME), bird)
2885 # gentoo (64-bit)
2886 VBOX_PATH_QT4 ?= /usr
2887 VBOX_PATH_QT4_LIB ?= /usr/lib/qt4
2888 endif
2889endif
2890VBOX_PATH_QT4 ?= /usr
2891VBOX_PATH_QT4_LIB ?= $(VBOX_PATH_QT4)/lib
2892
2893# Hack LD_LIBRARY_PATH for stuff in tools.
2894ifdef VBOX_WITH_QT4_SUN
2895 if1of ($(KBUILD_TARGET), linux)
2896 export LD_LIBRARY_PATH := $(VBOX_PATH_QT4_LIB):$(LD_LIBRARY_PATH)
2897 endif
2898endif
2899
2900
2901#
2902# Template for building Qt GUI executables.
2903#
2904TEMPLATE_VBOXQT4GUIEXE = VBox Qt4 GUI Executable
2905TEMPLATE_VBOXQT4GUIEXE_USES = qt4
2906TEMPLATE_VBOXQT4GUIEXE_QTTOOL = QT4
2907TEMPLATE_VBOXQT4GUIEXE_MOCTOOL = QT4
2908TEMPLATE_VBOXQT4GUIEXE_UICTOOL = QT4
2909TEMPLATE_VBOXQT4GUIEXE_RCCTOOL = QT4
2910TEMPLATE_VBOXQT4GUIEXE_LRCTOOL = QT4
2911TEMPLATE_VBOXQT4GUIEXE_SDKS = QT4
2912ifdef VBOX_WITH_QT4_SUN
2913 ifneq ($(KBUILD_TARGET),darwin) ## @todo The next darwin build should also make use the prefix just to make things more uniform.
2914 TEMPLATE_VBOXQT4GUIEXE_QT_PREFIX = VBox
2915 endif
2916endif
2917TEMPLATE_VBOXQT4GUIEXE_DEFS = IN_RING3 QT_NO_DEBUG QT_THREAD_SUPPORT QT_SHARED HAVE_CONFIG_H $(ARCH_BITS_DEFS)
2918
2919ifeq ($(KBUILD_TARGET),win)
2920 TEMPLATE_VBOXQT4GUIEXE_TOOL = $(VBOX_VCC_TOOL)
2921 TEMPLATE_VBOXQT4GUIEXE_DEFS += \
2922 _WIN32_WINNT=0x0500 UNICODE _UNICODE \
2923 QT_DLL _CRT_SECURE_NO_DEPRECATE \
2924 $(QMAKE_PRL_DEFINES)
2925 ## @todo VCC70 flags?
2926 ifdef VBOX_USE_VCC80
2927 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS = \
2928 -nologo -Zm200 -W3 -MD -Zi -EHsc -Zc:wchar_t-
2929 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS.debug = -RTCsu
2930 else
2931 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS = \
2932 -nologo -Zm200 -W3 -MD -Zi -GX
2933 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS.debug = -GZ
2934 endif
2935 TEMPLATE_VBOXQT4GUIEXE_INCS += \
2936 $(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_INC)
2937 TEMPLATE_VBOXQT4GUIEXE_LDFLAGS = \
2938 /NOD /NOLOGO /INCREMENTAL:NO /MAPINFO:EXPORTS /DEBUG \
2939 /DELAYLOAD:oleaut32.dll
2940 TEMPLATE_VBOXQT4GUIEXE_SDKS += WINPSDK
2941 TEMPLATE_VBOXQT4GUIEXE_LIBS = \
2942 $(VBOX_LIBS_QT4) \
2943 $(LIB_RUNTIME) \
2944 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt.lib \
2945 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcrt.lib \
2946 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/oldnames.lib \
2947 $(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib \
2948 $(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_LIB)/atls.lib
2949 TEMPLATE_VBOXQT4GUIEXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
2950
2951else # the gcc guys:
2952 TEMPLATE_VBOXQT4GUIEXE_TOOL = $(VBOX_GCC_TOOL)
2953 TEMPLATE_VBOXQT4GUIEXE_DEFS.linux = _REENTRANT
2954
2955 TEMPLATE_VBOXQT4GUIEXE_DEFS.solaris = _REENTRANT
2956
2957 TEMPLATE_VBOXQT4GUIEXE_INCS += \
2958 $(LIB_SDL_INC)
2959 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS = \
2960 -g -pipe -Wall -W -frtti -fno-exceptions -Wno-non-virtual-dtor \
2961 -Wno-long-long -fshort-wchar -fno-strict-aliasing \
2962 $(VBOX_GCC_fvisibility-hidden) $(VBOX_GCC_fvisibility-inlines-hidden)
2963 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS.x86 = -m32
2964 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS.amd64 = -m64
2965 TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS.linux = -pthread
2966 TEMPLATE_VBOXQT4GUIEXE_LDFLAGS.x86 = -m32
2967 TEMPLATE_VBOXQT4GUIEXE_LDFLAGS.amd64 = -m64
2968 TEMPLATE_VBOXQT4GUIEXE_LIBS = \
2969 $(VBOX_LIBS_QT4) \
2970 $(LIB_SDL) \
2971 $(LIB_RUNTIME) \
2972 $(LIB_REM) \
2973 $(LIB_VMM)
2974
2975 ifeq ($(KBUILD_TARGET),linux)
2976 TEMPLATE_VBOXQT4GUIEXE_LDFLAGS += $(VBOX_LD_as_needed)
2977 TEMPLATE_VBOXQT4GUIEXE_LIBS += \
2978 $(VBOX_XCURSOR_LIBS) \
2979 Xext
2980 TEMPLATE_VBOXQT4GUIEXE_LIBPATH += \
2981 $(VBOX_LIBPATH_X11)
2982 else ifeq ($(KBUILD_TARGET),darwin)
2983 TEMPLATE_VBOXQT4GUIEXE_LDFLAGS.darwin += -bind_at_load
2984 TEMPLATE_VBOXQT4GUIEXE_LIBS +=
2985 TEMPLATE_VBOXQT4GUIEXE_LIBPATH +=
2986 else
2987 TEMPLATE_VBOXQT4GUIEXE_INCS += \
2988 $(VBOX_XCURSOR_INCS)
2989 TEMPLATE_VBOXQT4GUIEXE_LIBS += \
2990 $(VBOX_XCURSOR_LIBS) \
2991 Xext \
2992 X11 \
2993 m \
2994 $(LIB_PTHREAD)
2995 TEMPLATE_VBOXQT4GUIEXE_LIBPATH += \
2996 $(VBOX_LIBPATH_X11)
2997 ifeq ($(KBUILD_TARGET),freebsd)
2998 TEMPLATE_VBOXQT4GUIEXE_INCS += \
2999 /usr/include \
3000 /usr/X11R6/include \
3001 /usr/local/include
3002 endif
3003 ifeq ($(KBUILD_TARGET),solaris)
3004 TEMPLATE_VBOXQT4GUIEXE_LIBS += \
3005 rt socket nsl
3006 endif
3007 endif
3008 # Assume the Qt shared objects are in the same directory as the executable, on Solaris too.
3009 ifdef VBOX_WITH_RUNPATH
3010 TEMPLATE_VBOXQT4GUIEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
3011 else ifdef VBOX_WITH_ORIGIN
3012 TEMPLATE_VBOXQT4GUIEXE_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$$(VBOX_ORIGIN)'
3013 endif
3014
3015endif
3016
3017# Add COM/XPCOM stuff
3018TEMPLATE_VBOXQT4GUIEXE_LIBS += \
3019 $(PATH_LIB)/VBoxCOM$(VBOX_SUFF_LIB)
3020ifdef VBOX_WITH_XPCOM
3021 ## @todo may be worth creating the VBOX_XPCOM SDK def, or just a SDK_VBOXXPCOM.
3022 TEMPLATE_VBOXQT4GUIEXE_DEFS += VBOX_WITH_XPCOM
3023 ifdef VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
3024 TEMPLATE_VBOXQT4GUIEXE_DEFS += VBOX_WITH_XPCOM_NAMESPACE_CLEANUP
3025 endif
3026 TEMPLATE_VBOXQT4GUIEXE_INCS += \
3027 $(VBOX_XPCOM_INCS)
3028 TEMPLATE_VBOXQT4GUIEXE_LIBS += \
3029 $(LIB_XPCOM)
3030 TEMPLATE_VBOXQT4GUIEXE_INTERMEDIATES += \
3031 $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h
3032else # COM
3033 TEMPLATE_VBOXQT4GUIEXE_INCS += \
3034 $(VBOX_PATH_SDK)/bindings/mscom/include
3035 TEMPLATE_VBOXQT4GUIEXE_INTERMEDIATES += \
3036 $(VBOX_PATH_SDK)/bindings/mscom/include/VirtualBox.h
3037endif # COM
3038
3039
3040#
3041# Template for building Qt4 GUI components.
3042#
3043TEMPLATE_VBOXQT4GUI = VBox Qt4 GUI Components
3044TEMPLATE_VBOXQT4GUI_EXTENDS = VBOXQT4GUIEXE
3045TEMPLATE_VBOXQT4GUI_LIBS = $(filter-out $(QTMAIN),$(TEMPLATE_VBOXQT4GUIEXE_LIBS))
3046ifeq ($(KBUILD_TARGET),darwin)
3047 TEMPLATE_VBOXQT4GUI_LDFLAGS.darwin += $(filter-out -bind_at_load,$(TEMPLATE_VBOXQT4GUIEXE_LDFLAGS.darwin)) \
3048 -current_version $(VBOX_VERSION_MAJOR).$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
3049endif
3050ifeq ($(filter-out solaris.x86 %.amd64,$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)),)
3051 ifneq ($(KBUILD_TARGET),win)
3052 TEMPLATE_VBOXQT4GUI_DEFS = PIC $(TEMPLATE_VBOXQT4GUIEXE_DEFS)
3053 TEMPLATE_VBOXQT4GUI_CFLAGS = -fPIC $(TEMPLATE_VBOXQT4GUIEXE_CFLAGS)
3054 TEMPLATE_VBOXQT4GUI_CXXFLAGS = -fPIC $(TEMPLATE_VBOXQT4GUIEXE_CXXFLAGS)
3055 TEMPLATE_VBOXQT4GUI_LDFLAGS = -fPIC $(TEMPLATE_VBOXQT4GUIEXE_LDFLAGS)
3056 endif
3057endif
3058
3059
3060
3061#
3062# Template for building build bldprogs.
3063#
3064TEMPLATE_VBOXBLDPROG = VBox Build Program
3065TEMPLATE_VBOXBLDPROG_DEFS = IN_RING3
3066ifeq ($(KBUILD_HOST),win)
3067 ifeq ($(KBUILD_HOST_ARCH),x86)
3068 ifdef VBOX_USE_VCC80
3069 TEMPLATE_VBOXBLDPROG_TOOL = VCC80X86
3070 else
3071 TEMPLATE_VBOXBLDPROG_TOOL = VCC70
3072 endif
3073 TEMPLATE_VBOXBLDPROG_SDKS = WIN32SDK
3074 else
3075 TEMPLATE_VBOXBLDPROG_TOOL = VCC80AMD64
3076 TEMPLATE_VBOXBLDPROG_SDKS = WIN64SDK
3077 endif
3078 ifneq ($(TEMPLATE_VBOXBLDPROG_TOOL),VCC70)
3079 TEMPLATE_VBOXBLDPROG_CXXFLAGS = -Zi -Zl -GR- -EHs-c- -GF- -MT -W3 -wd4996 -Zc:wchar_t-
3080 TEMPLATE_VBOXBLDPROG_CXXFLAGS.debug = -RTCsu
3081 TEMPLATE_VBOXBLDPROG_CXXFLAGS.release = -O2 -Oy- -GS-
3082 else
3083 TEMPLATE_VBOXBLDPROG_CXXFLAGS = -Zi -Zl -GR- -GX- -GF- -MT -W3
3084 TEMPLATE_VBOXBLDPROG_CXXFLAGS.debug = -GZ
3085 TEMPLATE_VBOXBLDPROG_CXXFLAGS.release = -Ogitb2 -Oy-
3086 endif
3087 TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
3088 TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
3089 TEMPLATE_VBOXBLDPROG_CFLAGS = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS)
3090 TEMPLATE_VBOXBLDPROG_CFLAGS.debug = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.debug)
3091 TEMPLATE_VBOXBLDPROG_CFLAGS.release = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
3092 TEMPLATE_VBOXBLDPROG_CFLAGS.profile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile)
3093 TEMPLATE_VBOXBLDPROG_CFLAGS.kprofile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile)
3094 TEMPLATE_VBOXBLDPROG_LDFLAGS = \
3095 /NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG \
3096 /DISALLOWLIB:libcd.lib \
3097 /DISALLOWLIB:libcmtd.lib \
3098 /DISALLOWLIB:msvcrt.lib \
3099 /DISALLOWLIB:msvcrtd.lib \
3100 /DISALLOWLIB:msvcprt.lib \
3101 /DISALLOWLIB:msvcprtd.lib
3102 TEMPLATE_VBOXBLDPROG_LIBS = \
3103 $(PATH_TOOL_$(TEMPLATE_VBOXBLDPROG_TOOL)_LIB)/oldnames.lib \
3104 $(PATH_TOOL_$(TEMPLATE_VBOXBLDPROG_TOOL)_LIB)/libcmt.lib \
3105 $(PATH_TOOL_$(TEMPLATE_VBOXBLDPROG_TOOL)_LIB)/libcpmt.lib
3106
3107else
3108# (gcc of some kind )
3109TEMPLATE_VBOXBLDPROG_TOOL = GXX3
3110TEMPLATE_VBOXBLDPROG_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs $(VBOX_GCC_Wno-variadic-macros) -pipe -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
3111TEMPLATE_VBOXBLDPROG_CFLAGS.x86 = -m32
3112TEMPLATE_VBOXBLDPROG_CFLAGS.amd64 = -m64
3113TEMPLATE_VBOXBLDPROG_CFLAGS.release = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
3114TEMPLATE_VBOXBLDPROG_CFLAGS.profile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile)
3115TEMPLATE_VBOXBLDPROG_CFLAGS.kprofile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile)
3116TEMPLATE_VBOXBLDPROG_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs -pipe
3117TEMPLATE_VBOXBLDPROG_CXXFLAGS.x86 = -m32
3118TEMPLATE_VBOXBLDPROG_CXXFLAGS.amd64 = -m64
3119TEMPLATE_VBOXBLDPROG_CXXFLAGS.release = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
3120TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
3121TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
3122TEMPLATE_VBOXBLDPROG_LDFLAGS.x86 = -m32
3123TEMPLATE_VBOXBLDPROG_LDFLAGS.amd64 = -m64
3124 ifeq ($(KBUILD_HOST),linux)
3125TEMPLATE_VBOXBLDPROG_LIBS = pthread m rt dl
3126 else ifeq ($(KBUILD_HOST),os2)
3127TEMPLATE_VBOXBLDPROG_TOOL = GXX3OMF
3128TEMPLATE_VBOXBLDPROG_LIBS = socket iconv
3129 else ifeq ($(KBUILD_HOST),darwin)
3130TEMPLATE_VBOXBLDPROG_TOOL = GXX4MACHO
3131TEMPLATE_VBOXBLDPROG_CFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
3132TEMPLATE_VBOXBLDPROG_CXXFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
3133TEMPLATE_VBOXBLDPROG_OBJCFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS)
3134TEMPLATE_VBOXBLDPROG_LDFLAGS.darwin = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
3135TEMPLATE_VBOXBLDPROG_LIBS =
3136 else if1of ($(KBUILD_HOST), freebsd netbsd openbsd)
3137TEMPLATE_VBOXBLDPROG_TOOL = GXX3
3138TEMPLATE_VBOXBLDPROG_LIBS =
3139 else ifeq ($(KBUILD_HOST),solaris)
3140TEMPLATE_VBOXBLDPROG_TOOL = GXX3PLAIN
3141TEMPLATE_VBOXBLDPROG_LIBS = rt
3142 else
3143$(warning Warning: VBOX Build: Target $(KBUILD_HOST) is not officially supported!)
3144 endif
3145
3146endif # !win
3147
3148
3149#
3150# Windows rc workaround for crosscompiling.
3151# (Some (old) Wine versions fails loading msvcrt.dll from the VCC bin directory.)
3152#
3153ifneq ($(KBUILD_HOST),win)
3154 TOOL_VCC80X86_RC := $(EXEC_X86_WIN32) $(PATH_DEVTOOLS)/win.x86/bin/rc.exe
3155 TOOL_VCC80AMD64_RC := $(EXEC_X86_WIN32) $(PATH_DEVTOOLS)/win.x86/bin/rc.exe
3156 TOOL_VCC70_RC := $(EXEC_X86_WIN32) $(PATH_DEVTOOLS)/win.x86/bin/rc.exe
3157 WIN32_MC = $(EXEC_X86_WIN32) $(PATH_DEVTOOLS)/win.x86/bin/mc.exe
3158else
3159 WIN32_MC = $(EXEC_X86_WIN32) $(firstword $(wildcard \
3160 $(PATH_SDK_WINPSDK_BIN)/MC.Exe\
3161 $(PATH_SDK_WINPSDK)/Bin/MC.Exe\
3162 $(PATH_SDK_WIN32SDK_BIN)/MC.Exe\
3163 $(PATH_SDK_WIN64SDK_BIN)/MC.Exe\
3164 $(PATH_DEVTOOLS)/win.x86/bin/mc.exe\
3165 ) Sorry_Cannot_find_mc_in_the_PSDK)
3166endif
3167
3168
3169#
3170# Template for building Linux host tools (only for KBUILD_TARGET=l4).
3171#
3172TEMPLATE_VBOXLNXHOSTR3EXE = Template for building linux host programs when targeting L4.
3173TEMPLATE_VBOXLNXHOSTR3EXE_INST = $(INST_BIN)
3174TEMPLATE_VBOXLNXHOSTR3EXE_BLD_TRG = linux
3175TEMPLATE_VBOXLNXHOSTR3EXE_TOOL = $(VBOX_GCC_TOOL)
3176TEMPLATE_VBOXLNXHOSTR3EXE_ASTOOL = YASM
3177TEMPLATE_VBOXLNXHOSTR3EXE_DLLSUFF = .so
3178TEMPLATE_VBOXLNXHOSTR3EXE_ASFLAGS = $(VBOX_ASFLAGS)
3179TEMPLATE_VBOXLNXHOSTR3EXE_DEFS = IN_RING3 $(ARCH_BITS_DEFS)
3180TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs -pipe $(VBOX_GCC_fno-stack-protector)
3181TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.debug = -fno-inline
3182TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.release = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
3183TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.profile = $(TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.release)
3184TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.kprofile = $(TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.release)
3185TEMPLATE_VBOXLNXHOSTR3EXE_CFLAGS.release = $(TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.release)
3186TEMPLATE_VBOXLNXHOSTR3EXE_CFLAGS.debug = $(TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.debug)
3187TEMPLATE_VBOXLNXHOSTR3EXE_CFLAGS.profile = $(TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.profile)
3188TEMPLATE_VBOXLNXHOSTR3EXE_CFLAGS.kprofile = $(TEMPLATE_VBOXLNXHOSTR3EXE_CXXFLAGS.kprofile)
3189TEMPLATE_VBOXLNXHOSTR3EXE_CFLAGS = -g -Wall -pedantic -Wno-long-long -Wno-trigraphs -pipe -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations $(VBOX_GCC_fno-stack-protector)
3190TEMPLATE_VBOXLNXHOSTR3EXE_LIBS = pthread m rt dl
3191
3192TEMPLATE_VBOXLNXHOSTR3LIB = Template for linux host libraries.
3193TEMPLATE_VBOXLNXHOSTR3LIB_EXTENDS = VBOXLNXHOSTR3EXE
3194TEMPLATE_VBOXLNXHOSTR3LIB_INST = $(INST_LIB)
3195
3196
3197#
3198# Template for building R3 programs for the guest additions.
3199# Note: Make sure you don't break VBOXGUESTR3CPPEXE when changing this.
3200#
3201TEMPLATE_VBOXGUESTR3EXE = VBox Guest Program
3202ifeq ($(KBUILD_TARGET),win)
3203 TEMPLATE_VBOXGUESTR3EXE_EXTENDS = VBOXR3EXE
3204 TEMPLATE_VBOXGUESTR3EXE_CFLAGS = $(filter-out -MD, $(TEMPLATE_VBOXR3EXE_CFLAGS)) -MT
3205 TEMPLATE_VBOXGUESTR3EXE_CXXFLAGS = $(filter-out -MD, $(TEMPLATE_VBOXR3EXE_CFLAGS)) -MT
3206 TEMPLATE_VBOXGUESTR3EXE_LDFLAGS = $(filter-out /DISALLOWLIB:libcmt.lib, $(TEMPLATE_VBOXR3EXE_LDFLAGS)) \
3207 /DISALLOWLIB:msvcrt.lib \
3208 /DISALLOWLIB:msvcprt.lib
3209 TEMPLATE_VBOXGUESTR3EXE_LIBS = \
3210 $(PATH_TOOL_$(TEMPLATE_VBOXGUESTR3EXE_TOOL)_LIB)/oldnames.lib \
3211 $(PATH_TOOL_$(TEMPLATE_VBOXGUESTR3EXE_TOOL)_LIB)/libcmt.lib \
3212 $(PATH_TOOL_$(TEMPLATE_VBOXGUESTR3EXE_TOOL)_LIB)/libcpmt.lib
3213else # the gcc guys
3214 TEMPLATE_VBOXGUESTR3EXE_EXTENDS = VBOXR3EXE
3215 TEMPLATE_VBOXGUESTR3EXE_TOOL := $(subst GXX,GCC,$(TEMPLATE_VBOXR3EXE_TOOL))
3216 TEMPLATE_VBOXGUESTR3EXE_CXXFLAGS = $(TEMPLATE_VBOXR3EXE_CXXFLAGS) -fno-exceptions
3217endif
3218TEMPLATE_VBOXGUESTR3EXE_INST = $(INST_ADDITIONS)
3219TEMPLATE_VBOXGUESTR3EXE_DEFS := $(TEMPLATE_VBOXR3EXE_DEFS) IN_GUEST IN_GUEST_R3 IN_RT_R3
3220ifeq ($(KBUILD_TARGET),linux) # As few libs as possible on linux.
3221 TEMPLATE_VBOXGUESTR3EXE_LIBS = pthread rt m
3222endif
3223
3224#
3225# Template for building R3 (dynamic) libraries for the guest additions.
3226#
3227TEMPLATE_VBOXGUESTR3DLL = VBox Guest User Dynamic Libraries
3228TEMPLATE_VBOXGUESTR3DLL_EXTENDS = VBOXGUESTR3EXE
3229## @todo add a INSTFUN that separates dlls and libs.
3230ifn1of ($(KBUILD_TARGET), os2 win)
3231 TEMPLATE_VBOXGUESTR3DLL_DEFS = $(TEMPLATE_VBOXGUESTR3EXE_DEFS) PIC
3232 TEMPLATE_VBOXGUESTR3DLL_CFLAGS = $(TEMPLATE_VBOXGUESTR3EXE_CFLAGS) -fPIC
3233 TEMPLATE_VBOXGUESTR3DLL_CXXFLAGS = $(TEMPLATE_VBOXGUESTR3EXE_CXXFLAGS) -fPIC -fno-exceptions
3234 TEMPLATE_VBOXGUESTR3DLL_LDFLAGS = $(TEMPLATE_VBOXGUESTR3EXE_LDFLAGS) -fPIC
3235endif
3236
3237#
3238# Template for building R3 (static) libraries for the guest additions.
3239#
3240TEMPLATE_VBOXGUESTR3LIB = VBox Guest User Libraries
3241TEMPLATE_VBOXGUESTR3LIB_EXTENDS = VBOXGUESTR3EXE
3242TEMPLATE_VBOXGUESTR3LIB_INST = $(INST_ADDITIONS_LIB)
3243if1of ($(KBUILD_TARGET), solaris) ## @todo r=bird: Fix the *R3Mini template to VBOXGUESTR3DLL and remove this hack.
3244 TEMPLATE_VBOXGUESTR3LIB_DEFS = $(TEMPLATE_VBOXGUESTR3EXE_DEFS) PIC
3245 TEMPLATE_VBOXGUESTR3LIB_CFLAGS = $(TEMPLATE_VBOXGUESTR3EXE_CFLAGS) -fPIC
3246 TEMPLATE_VBOXGUESTR3LIB_CXXFLAGS = $(TEMPLATE_VBOXGUESTR3EXE_CXXFLAGS) -fPIC -fno-exceptions
3247endif
3248
3249
3250#
3251# Template for XFree86 guest modules (relocatable module, i.e. sysmod).
3252# This mostly about zapping the VBOXR3EXE linker flags and libraries.
3253#
3254TEMPLATE_VBOXGUESTR3XF86MOD = VBox Guest Program with C++ library dependencies
3255TEMPLATE_VBOXGUESTR3XF86MOD_EXTENDS = VBOXGUESTR3EXE
3256TEMPLATE_VBOXGUESTR3XF86MOD_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
3257TEMPLATE_VBOXGUESTR3XF86MOD_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
3258TEMPLATE_VBOXGUESTR3XF86MOD_LDFLAGS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
3259TEMPLATE_VBOXGUESTR3XF86MOD_LDFLAGS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
3260TEMPLATE_VBOXGUESTR3XF86MOD_LDFLAGS = -r
3261if1of ($(KBUILD_TARGET), dragonfly freebsd linux netbsd openbsd) # the gnu ld guys.
3262 TEMPLATE_VBOXGUESTR3XF86MOD_LDFLAGS.release = -S
3263 TEMPLATE_VBOXGUESTR3XF86MOD_LDFLAGS.x86 = -m elf_i386
3264 TEMPLATE_VBOXGUESTR3XF86MOD_LDFLAGS.amd64 = -m elf_x86_64
3265endif
3266TEMPLATE_VBOXGUESTR3XF86MOD_CFLAGS = $(TEMPLATE_VBOXGUESTR3EXE_CFLAGS) -fno-merge-constants -std=c99
3267TEMPLATE_VBOXGUESTR3XF86MOD_CXXFLAGS= $(TEMPLATE_VBOXGUESTR3EXE_CXXFLAGS) -fno-merge-constants
3268TEMPLATE_VBOXGUESTR3XF86MOD_SYSSUFF = .o
3269TEMPLATE_VBOXGUESTR3XF86MOD_LIBS = \
3270 $(VBOX_LIB_VBGL_R3_XFREE86)
3271TEMPLATE_VBOXGUESTR3XF86MOD_DEFS = $(TEMPLATE_VBOXGUESTR3DLL_DEFS) LOG_TO_BACKDOOR
3272
3273
3274#
3275# Template for X.org guest modules (shared libs).
3276# This mostly about zapping unnecessary LIBS from VBOXGUESTR3DLL and adding some flags.
3277#
3278TEMPLATE_VBOXGUESTR3XORGMOD = VBox Guest Program with C++ library dependencies
3279TEMPLATE_VBOXGUESTR3XORGMOD_EXTENDS = VBOXGUESTR3DLL
3280TEMPLATE_VBOXGUESTR3XORGMOD_LIBS.$(KBUILD_TYPE) = $(NO_SUCH_VARIABLE)
3281TEMPLATE_VBOXGUESTR3XORGMOD_LIBS.$(KBUILD_TARGET) = $(NO_SUCH_VARIABLE)
3282TEMPLATE_VBOXGUESTR3XORGMOD_CFLAGS = $(TEMPLATE_VBOXGUESTR3DLL_CFLAGS) -std=c99
3283TEMPLATE_VBOXGUESTR3XORGMOD_DEFS = $(TEMPLATE_VBOXGUESTR3DLL_DEFS) LOG_TO_BACKDOOR
3284ifeq ($(KBUILD_TARGET_ARCH),amd64)
3285 TEMPLATE_VBOXGUESTR3XORGMOD_DEFS += _XSERVER64
3286endif
3287if1of ($(KBUILD_TARGET), linux)
3288 TEMPLATE_VBOXGUESTR3XORGMOD_LDFLAGS = $(TEMPLATE_VBOXGUESTR3DLL_LDFLAGS) -s
3289endif
3290TEMPLATE_VBOXGUESTR3XORGMOD_LIBS = \
3291 $(VBOX_LIB_VBGL_R3_SHARED) \
3292 $(VBOX_LIB_IPRT_GUEST_R3_MINI) \
3293 $(VBOX_LIB_VBGL_R3_SHARED)
3294
3295
3296#
3297# Template for guest stuff that makes use of the C++ library and features.
3298# (This is mostly about undoing what was done to C++ for VBOXGUESTR3EXE.)
3299#
3300TEMPLATE_VBOXGUESTR3CPPEXE = VBox Guest Program with C++ library dependencies
3301TEMPLATE_VBOXGUESTR3CPPEXE_EXTENDS = VBOXGUESTR3EXE
3302ifeq ($(KBUILD_TARGET),win)
3303 # later if necessary
3304else
3305 TEMPLATE_VBOXGUESTR3CPPEXE_TOOL = $(TEMPLATE_VBOXR3EXE_TOOL)
3306 TEMPLATE_VBOXGUESTR3CPPEXE_CXXFLAGS = $(TEMPLATE_VBOXR3EXE_CXXFLAGS)
3307endif
3308
3309
3310#
3311# Template for building R0 drivers for the guest additions.
3312#
3313TEMPLATE_VBOXGUESTR0 = VBox Guest Driver
3314TEMPLATE_VBOXGUESTR0_EXTENDS = VBOXR0DRV
3315TEMPLATE_VBOXGUESTR0_INST = $(INST_ADDITIONS)
3316TEMPLATE_VBOXGUESTR0_SDKS.win.x86 = WIN32SDK W2K3DDK
3317TEMPLATE_VBOXGUESTR0_SDKS.win.amd64 = W2K3DDK WINPSDKINCS
3318TEMPLATE_VBOXGUESTR0_LIBS.win.x86 = \
3319 $(PATH_SDK_W2K3DDK_LIB)/int64.lib
3320TEMPLATE_VBOXGUESTR0_DEFS = $(TEMPLATE_VBOXR0DRV_DEFS) IN_GUEST IN_GUEST_R0
3321ifeq ($(KBUILD_TARGET),solaris) # No VBI for the guest additions yet.
3322 TEMPLATE_VBOXGUESTR0_LDFLAGS = -r -dy
3323# ifdef VBOX_WITH_SOLARIS_VBI
3324# TEMPLATE_VBOXGUESTR0DRV_LDFLAGS += -N misc/vbi
3325# endif
3326endif
3327
3328#
3329# Template for building R0 libraries for the guest additions.
3330#
3331TEMPLATE_VBOXGUESTR0LIB = VBox Guest Driver Libraries
3332TEMPLATE_VBOXGUESTR0LIB_EXTENDS = VBOXGUESTR0
3333TEMPLATE_VBOXGUESTR0LIB_INST = $(INST_ADDITIONS_LIB)
3334
3335
3336#
3337# Guest additions libraries (all static).
3338# The _MINI and _SHARED are both compiled as PIC and intended for linking into a .so/.dll/.dylib.
3339#
3340VBOX_LIB_IPRT_GUEST_R3 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3$(VBOX_SUFF_LIB)
3341VBOX_LIB_IPRT_GUEST_R3_MINI = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR3Mini$(VBOX_SUFF_LIB)
3342VBOX_LIB_IPRT_GUEST_R0 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR0$(VBOX_SUFF_LIB)
3343ifeq ($(KBUILD_TARGET_ARCH),x86)
3344 VBOX_LIB_IPRT_GUEST_R0_NT4 = $(VBOX_PATH_ADDITIONS_LIB)/RuntimeGuestR0NT4$(VBOX_SUFF_LIB)
3345else
3346 VBOX_LIB_IPRT_GUEST_R0_NT4 = $(VBOX_LIB_IPRT_GUEST_R0)
3347endif
3348VBOX_LIB_VBGL_R3 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3Lib$(VBOX_SUFF_LIB)
3349VBOX_LIB_VBGL_R3_XFREE86 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibXFree86$(VBOX_SUFF_LIB)
3350VBOX_LIB_VBGL_R3_SHARED = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR3LibShared$(VBOX_SUFF_LIB)
3351VBOX_LIB_VBGL_R0BASE = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR0LibBase$(VBOX_SUFF_LIB)
3352VBOX_LIB_VBGL_R0 = $(VBOX_PATH_ADDITIONS_LIB)/VBoxGuestR0Lib$(VBOX_SUFF_LIB)
3353
3354
3355
3356#
3357# Two targets to coordinate version number changes properly. Note that the
3358# only way to get a really consistent build is to run 'kmk' in the top-level
3359# directory. If you don't run it there, you get a consistent sub-tree only.
3360#
3361VBOX_VERSION_STAMP = $(PATH_OUT)/version-stamp-$(VBOX_VERSION_STRING)
3362VBOX_VERSION_HEADER = $(PATH_OUT)/version-generated.h
3363VBOX_VERSION_MK = $(PATH_OUT)/version-generated.mk
3364
3365$(VBOX_VERSION_STAMP): | $(PATH_ROOT)/Config.kmk
3366 $(call MSG_GENERATE,,$@)
3367 $(QUIET)$(MKDIR) -p $(@D)
3368 $(QUIET)$(RM) -f $(wildcard $(PATH_OUT)/version-stamp-*)
3369 $(QUIET)$(APPEND) $@ $(VBOX_VERSION_STRING)
3370
3371$(VBOX_VERSION_HEADER): $(VBOX_VERSION_STAMP)
3372 $(call MSG_GENERATE,,$@)
3373 $(QUIET)$(MKDIR) -p $(@D)
3374 $(QUIET)$(RM) -f $@ [email protected]
3375 $(QUIET)$(APPEND) [email protected] '#ifndef ___version_generated_h___'
3376 $(QUIET)$(APPEND) [email protected] '#define ___version_generated_h___'
3377 $(QUIET)$(APPEND) [email protected] ''
3378 $(QUIET)$(APPEND) [email protected] '#define VBOX_VERSION_MAJOR $(VBOX_VERSION_MAJOR)'
3379 $(QUIET)$(APPEND) [email protected] '#define VBOX_VERSION_MINOR $(VBOX_VERSION_MINOR)'
3380 $(QUIET)$(APPEND) [email protected] '#define VBOX_VERSION_BUILD $(VBOX_VERSION_BUILD)'
3381 $(QUIET)$(APPEND) [email protected] '#define VBOX_VERSION_STRING "$(VBOX_VERSION_STRING)"'
3382 $(QUIET)$(APPEND) [email protected] ''
3383 $(QUIET)$(APPEND) [email protected] '#endif'
3384 $(QUIET)$(MV) -f [email protected] $@
3385
3386
3387VBOX_PACKAGE_HEADER = $(PATH_OUT)/package-generated.h
3388
3389$(VBOX_PACKAGE_HEADER):
3390 $(call MSG_GENERATE,,$@)
3391 $(QUIET)$(MKDIR) -p $(@D)
3392 $(QUIET)$(RM) -f $@ [email protected]
3393 $(QUIET)$(APPEND) [email protected] '#ifndef ___package_generated_h___'
3394 $(QUIET)$(APPEND) [email protected] '#define ___package_generated_h___'
3395 $(QUIET)$(APPEND) [email protected] ''
3396 $(QUIET)$(APPEND) [email protected] '#define VBOX_PACKAGE_STRING "$(VBOX_PACKAGE_STRING)"'
3397 $(QUIET)$(APPEND) [email protected] ''
3398 $(QUIET)$(APPEND) [email protected] '#endif'
3399 $(QUIET)$(MV) -f [email protected] $@
3400
3401#
3402# Used for external makefiles which cannot include Config.kmk
3403#
3404$(VBOX_VERSION_MK): $(VBOX_VERSION_STAMP)
3405 $(call MSG_GENERATE,,$@)
3406 $(QUIET)$(RM) -f $@ [email protected]
3407 $(QUIET)$(MKDIR) -p $(@D)
3408 $(QUIET)$(APPEND) [email protected] 'VBOX_VERSION_MAJOR = $(VBOX_VERSION_MAJOR)'
3409 $(QUIET)$(APPEND) [email protected] 'VBOX_VERSION_MINOR = $(VBOX_VERSION_MINOR)'
3410 $(QUIET)$(APPEND) [email protected] 'VBOX_VERSION_BUILD = $(VBOX_VERSION_BUILD)'
3411 $(QUIET)$(APPEND) [email protected] 'VBOX_VERSION_STRING = $(VBOX_VERSION_STRING)'
3412 $(QUIET)$(MV) -f [email protected] $@
3413
3414ifndef VBOX_OSE
3415if1of ($(KBUILD_TARGET),freebsd linux netbsd openbsd solaris)
3416# VBOX_LICENSE_VER is used in several Makefiles
3417VBOX_LICENSE_SRC := $(PATH_ROOT)/doc/License.html
3418VBOX_LICENSE_VER_KMK = $(PATH_OUT)/license-version.kmk
3419$(VBOX_LICENSE_VER_KMK): $(VBOX_LICENSE_SRC)
3420 $(call MSG_GENERATE,,$(VBOX_LICENSE_VER_KMK))
3421 $(QUIET)$(MKDIR) -p $(@D)
3422 $(QUIET)$(SED) -e "s/.*License version \([0-9.]*\),.*/VBOX_LICENSE_VER=\1/;t;d" --output $@ $(VBOX_LICENSE_SRC)
3423-include $(VBOX_LICENSE_VER_KMK)
3424VBOX_LICENSE_BIN = $(PATH_BIN)/License-$(VBOX_LICENSE_VER).html
3425endif
3426endif
3427
3428
3429# Force building of the version header file as the first thing anywhere in
3430# the tree. This eliminates the need for manual dependencies on it.
3431## @todo there gotta be a better way of doing this.
3432Makefile.kmk: | $(VBOX_VERSION_HEADER) $(VBOX_VERSION_MK) $(VBOX_PACKAGE_HEADER)
3433Makefile: | $(VBOX_VERSION_HEADER) $(VBOX_VERSION_MK) $(VBOX_PACKAGE_HEADER)
3434makefile: | $(VBOX_VERSION_HEADER) $(VBOX_VERSION_MK) $(VBOX_PACKAGE_HEADER)
3435
3436
3437#
3438# Subversion tree revision.
3439#
3440# The VBOX_SVN_REV contains our best guess. Use svn info on the
3441# root of the treeto determin this it if .svn/entries is found,
3442# otherwise fall back on the Config.kmk revision.
3443#
3444SVN ?= svn$(HOSTSUFF_EXE)
3445VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk
3446ifndef VBOX_SVN_REV
3447 VBOX_SVN_REV_FALLBACK := $(patsubst %:,, $Rev: 12294 $ )
3448 VBOX_SVN_DEP := $(wildcard $(PATH_ROOT)/.svn/entries)
3449 ifeq ($(which $(SVN)),)
3450 VBOX_SVN_DEP :=
3451 endif
3452
3453# Rule for generating a timestamp and updating the real thing on change.
3454$(VBOX_SVN_REV_KMK).ts +| $(VBOX_SVN_REV_KMK): $(if $(VBOX_SVN_DEP), $(VBOX_SVN_DEP), $(PATH_ROOT)/Config.kmk)
3455 $(call MSG_GENERATE,,$(VBOX_SVN_REV_KMK))
3456 $(QUIET)$(RM) -f $@ [email protected]
3457 $(QUIET)$(MKDIR) -p $(@D)
3458 ifneq ($(VBOX_SVN_DEP),)
3459 $(REDIRECT) -E 'LC_ALL=C' -wo [email protected] -- $(SVN) info $(PATH_ROOT)
3460 ifeq ($(int-mod $(VBOX_VERSION_BUILD), 2),0)
3461 $(SED) -e '/^Last Changed Rev/!d' -e 's/Last Changed Rev\: */export VBOX_SVN_REV=/' --output $@ [email protected]
3462 else
3463 $(SED) -e '/^Revision/!d' -e 's/Revision\: */export VBOX_SVN_REV=/' --output $@ [email protected]
3464 endif
3465 $(QUIET)$(RM) -f [email protected]
3466 else
3467 $(QUIET)$(APPEND) $@ 'export VBOX_SVN_REV=$(VBOX_SVN_REV_FALLBACK)'
3468 endif
3469 $(QUIET)$(CP) --changed -fv $@ $(VBOX_SVN_REV_KMK)
3470
3471 include $(VBOX_SVN_REV_KMK)
3472else
3473# allow to overwrite VBOX_SVN_REV externally (mainly for building .debs/.rpms)
3474$(VBOX_SVN_REV_KMK):
3475 $(call MSG_GENERATE,,$(VBOX_SVN_REV_KMK))
3476 $(QUIET)$(RM) -f $@
3477 $(QUIET)$(MKDIR) -p $(@D)
3478 $(QUIET)$(APPEND) $@ 'export VBOX_SVN_REV=$(VBOX_SVN_REV)'
3479 $(QUIET)echo '* $(VBOX_SVN_REV_KMK) was externally overwritten:'
3480 $(QUIET)$(CAT) $(VBOX_SVN_REV_KMK)
3481endif
3482
3483
3484#
3485# Legacy.
3486#
3487ifneq ($(LOCALCFG),)
3488 include $(LOCALCFG)
3489endif
3490
3491
3492#
3493# Some extra goals.
3494#
3495.PHONY: up update st stat status
3496up update::
3497 $(SVN) up
3498
3499up2 update2::
3500 $(SVN) up --ignore-externals
3501
3502st stat status:
3503 $(SVN) status
3504
3505quick:
3506 $(MAKE) VBOX_QUICK=1
3507
3508
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