VirtualBox

source: vbox/trunk/src/VBox/Installer/win/Makefile.kmk@ 53981

Last change on this file since 53981 was 53981, checked in by vboxsync, 10 years ago

Adding the VBoxDTrace wrapper binary to the installers. Fixing extpack build break. Simplified VBOX_WITH_DTRACE* test in the makefiles.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 37.8 KB
Line 
1# $Id: Makefile.kmk 53981 2015-01-27 18:58:32Z vboxsync $
2## @file
3# Makefile for the Windows installer.
4#
5
6#
7# Copyright (C) 2006-2014 Oracle Corporation
8#
9# This file is part of VirtualBox Open Source Edition (OSE), as
10# available from http://www.virtualbox.org. This file is free software;
11# you can redistribute it and/or modify it under the terms of the GNU
12# General Public License (GPL) as published by the Free Software
13# Foundation, in version 2 as it comes in the "COPYING" file of the
14# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16#
17
18SUB_DEPTH = ../../../..
19include $(KBUILD_PATH)/subheader.kmk
20
21ifneq ($(KBUILD_HOST),win)
22 $(error "The Windows installer can only be built on Windows!")
23endif
24
25
26#
27# Include Sub-Makefiles.
28#
29include $(PATH_SUB_CURRENT)/InstallHelper/Makefile.kmk
30
31ifdef VBOX_WITH_BUNDLED_INSTALLER
32 ifeq ($(KBUILD_TARGET_ARCH),x86)
33 include $(PATH_SUB_CURRENT)/BundleMachine/Makefile.kmk
34 endif
35endif
36
37ifeq ($(KBUILD_TARGET_ARCH),x86)
38 include $(PATH_SUB_CURRENT)/Stub/Makefile.kmk
39 include $(PATH_SUB_CURRENT)/StubBld/Makefile.kmk
40 ifdef VBOX_BRAND_WIN_AS_MENU
41 include $(PATH_SUB_CURRENT)/AutoStartMenu/Makefile.kmk
42 endif
43endif
44
45include $(PATH_SUB_CURRENT)/Resources/Makefile.kmk
46
47
48#
49# Globals and targets.
50# Note: en_US *must* come first for the dependency file generation.
51#
52ifndef VBOX_INSTALLER_LANGUAGES
53 VBOX_INSTALLER_LANGUAGES = en_US de_DE fr_FR it_IT zh_TW
54 VBOX_INSTALLER_LANGUAGES += $(VBOX_INSTALLER_ADD_LANGUAGES)
55endif
56
57#
58# List of merge modules to use.
59#
60VBOX_INSTALLER_MERGE_MODULES = App USB NetAdp NetFlt Python
61ifeq ($(KBUILD_TARGET_ARCH),amd64)
62 VBOX_INSTALLER_MERGE_MODULES += COM32On64
63endif
64
65# We only ship the merge modules in locale en_US for the moment.
66ifdef VBOX_WITH_MSM_INSTALL
67 VBOX_INSTALLER_LANGUAGES := en_US
68 VBOX_INSTALLER_MERGE_LANGUAGES = $(VBOX_INSTALLER_LANGUAGES)
69endif
70
71#
72# We don't have the license text in another language than English yet,
73# so just define the branding targets to use the English one for now.
74# The installer generation assumes that there is a translation for each
75# of VBOX_INSTALLER_LANGUAGES.
76#
77$(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
78 $(eval VBOX_BRAND_$(lang)_LICENSE_RTF := $(VBOX_BRAND_LICENSE_RTF)))
79
80# Set the codepage for all languages to 1252, covers most cases.
81$(foreach lang,$(sort $(VBOX_INSTALLER_LANGUAGES) $(VBOX_LICENSE_ADD_LANGUAGES) $(VBOX_MANUAL_ADD_LANGUAGES)), \
82 $(eval VBOX_BRAND_$(lang)_LANGUAGE_CODEPAGE := 1252))
83
84# Some languages need another codepage than 1252. Override them here.
85VBOX_BRAND_zh_TW_LANGUAGE_CODEPAGE := 950
86
87# Standard language names (in the native language), to be extended as we go.
88# VBOX_BRAND_$(lang)_LANG_NAME must be defined for each language which occurs
89# in either # VBOX_LICENSE_ADD_LANGUAGES or VBOX_MANUAL_ADD_LANGUAGES.
90VBOX_BRAND_fr_FR_LANG_NAME := Français
91
92VBOX_PATH_WIN_INST_SRC := $(PATH_SUB_CURRENT)
93VBOX_WIN_INST_OUT_DIR := $(PATH_TARGET)/Installer/win
94
95#
96# If we want to build a combined package, we separate all common stuff
97# (that is all 100% identical content between 32-/64-bit builds)
98# into an own .cab file to save space. This .cab file then gets included
99# and used by the 32-/64-bit installers.
100#
101ifdef VBOX_WITH_COMBINED_PACKAGE
102 VBOX_INSTALLER_COMMON_DISKID := 2
103else
104 VBOX_INSTALLER_COMMON_DISKID := 1
105endif
106
107## @todo VBOX_ prefixes!
108PACKAGE_BASE := VirtualBox-$(VBOX_VERSION_STRING)
109PACKAGE_NAME_LANG := $(PACKAGE_BASE)-r$(VBOX_SVN_REV)
110PACKAGE_NAME_FINAL := $(PATH_STAGE_BIN)/$(PACKAGE_NAME_LANG).msi
111
112ifdef VBOX_WITH_COMBINED_PACKAGE
113 PATH_MULTIARCH_TEMP := $(PATH_OUT_BASE)/win.x86/$(KBUILD_TYPE)/obj/Installer
114 PATH_MULTIARCH_GUEST_ADDITIONS_ISO := $(PATH_OUT_BASE)/win.amd64/$(KBUILD_TYPE)/bin/additions
115 PACKAGE_NAME_MULTIARCH := $(PACKAGE_NAME_LANG)-MultiArch
116 PACKAGE_NAME_MULTIARCH.x86 := $(PACKAGE_NAME_MULTIARCH)_x86.msi
117 PACKAGE_NAME_MULTIARCH.amd64 := $(PACKAGE_NAME_MULTIARCH)_amd64.msi
118 PACKAGE_NAME_FINAL := $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.$(KBUILD_TARGET_ARCH))
119 PACKAGE_NAME_MULTIARCH_FINAL := $(PACKAGE_NAME_MULTIARCH).exe
120 # Always take the common.cab from the amd64 build, as it
121 # might contain certain files for x86 compatibility such
122 # as our 32-on-64-bit COM stuff.
123 PACKAGE_NAME_MULTIARCH_COMMONCAB := $(PATH_OUT_BASE)/win.amd64/$(KBUILD_TYPE)/obj/Installer/win/common.cab
124
125 BLDDIRS += $(PATH_MULTIARCH_TEMP)
126 PACKING += $(PACKAGE_NAME_FINAL)
127 ifeq ($(KBUILD_TARGET_ARCH),x86)
128 PACKING += $(PATH_STAGE_BIN)/$(PACKAGE_NAME_MULTIARCH_FINAL)
129 endif
130else
131 PACKING += $(PACKAGE_NAME_FINAL)
132endif
133BLDDIRS += \
134 $(VBOX_WIN_INST_OUT_DIR) \
135 $(VBOX_WIN_INST_OUT_DIR)/NLS/
136
137OTHER_CLEAN += \
138 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox.wixobj \
139 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox.wixobj.dep \
140 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib.wxi \
141 $(if $(VBOX_WITH_QTGUI),$(VBOX_WIN_INST_OUT_DIR)/VBoxGuiNLS.wxi) \
142 $(VBOX_WIN_INST_OUT_DIR)/VBoxKey.wxi \
143 $(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
144 $(VBOX_WIN_INST_OUT_DIR)/NLS/Language_$(lang).wxl \
145 $(VBOX_WIN_INST_OUT_DIR)/NLS/License_$(lang).wxl \
146 $(VBOX_WIN_INST_OUT_DIR)/NLS/$(lang).mst \
147 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_$(lang).wixobj \
148 $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_$(lang).msi) \
149 $(VBOX_WIN_INST_OUT_DIR)/Files_Doc.wxi \
150 $(VBOX_WIN_INST_OUT_DIR)/Files_License.wxi \
151 $(VBOX_WIN_INST_OUT_DIR)/Files_Main.wxi \
152 $(VBOX_WIN_INST_OUT_DIR)/Shortcuts_StartMenu.wxi
153
154ifdef VBOX_WITH_COMBINED_PACKAGE
155 ifeq ($(KBUILD_TARGET_ARCH),x86)
156 OTHER_CLEAN += \
157 $(PATH_STAGE_BIN)/$(PACKAGE_NAME_MULTIARCH_FINAL) \
158 $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.x86) \
159 $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.am64) \
160 $(PACKAGE_NAME_MULTIARCH_COMMONCAB)
161 else
162 # Nothing to do here yet.
163 endif
164else
165 OTHER_CLEAN += \
166 $(PACKAGE_NAME_FINAL)
167endif
168
169ifdef VBOX_WITH_MSM_INSTALL
170 OTHER_CLEAN += \
171 $(foreach module,$(VBOX_INSTALLER_MERGE_MODULES), \
172 $(foreach lang,$(VBOX_INSTALLER_MERGE_LANGUAGES), \
173 $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module).msm.dep \
174 $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).msm \
175 $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).wixobj \
176 $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).wixpdb))
177endif
178
179ifdef VBOX_WITH_BUNDLED_INSTALLER
180 ifeq ($(KBUILD_TARGET),darwin)
181 VBOX_TMP_DIR ?= /VBox
182 ZIP = /usr/bin/zip
183 else
184 VBOX_TMP_DIR ?= c:\Temp
185 ZIP = zip
186 endif
187
188 ifndef VBOX_PATH_PACK_TMP
189 VBOX_PATH_PACK_TMP := $(VBOX_WIN_INST_OUT_DIR)
190 endif
191
192 VBOX_PATH_PACK_BUNDLE_TMP = $(PATH_STAGE_BIN)/VBoxWinBundleInstaller
193 VBOX_PATH_PACK_BUNDLE_ZIP = $(PATH_STAGE_BIN)/VBoxWinBundleInstaller-$(KBUILD_TARGET_ARCH).zip
194
195 VBOX_BRAND_WIN_INST_NAME.x86 = $(PACKAGE_BASE)-Win_x86$(VBOX_BRAND_WIN_INST_EXT).msi
196 VBOX_BRAND_WIN_INST_NAME.amd64 = $(PACKAGE_BASE)-Win_amd64$(VBOX_BRAND_WIN_INST_EXT).msi
197
198 PACKING.win += $(VBOX_PATH_PACK_BUNDLE_ZIP)
199endif
200
201#
202# Suppress/skip the following ICE (Internal Consistency Evaluators):
203# - ICE64: Checks that new directories in the user profile are removed correctly in roaming scenarios.
204# -> We don't want to remove system folders (like "Microsoft/Internet Explorer/Quick Launch").
205# - ICE69: Checks if file references are within the same component.
206# -> We reference to files within different components, but these components are installed using
207# the same feature, so that's fine.
208#
209VBOX_MSI_ICE_IGNORE := \
210 -ice:64 \
211 -ice:69
212
213#
214# Create intermediate XML file for languages (needed for .MSI linking).
215#
216# Note: The double escaping of $(dir $@) in the prereq/dep list is because we first have
217# to escape the expansion of the $(eval ) argument and then the definition of the
218# rule. The statement is finally expanded during second dependency expansion, which
219# takes place after all makefiles has been loaded and with the @ variable defined.
220#
221define def_vbox_lang_xml
222$(VBOX_WIN_INST_OUT_DIR)/NLS/Language_$(lang).wxl: $(VBOX_PATH_WIN_INST_SRC)/NLS/$(lang).wxl | $$$$(dir $$$$@)
223 $$(call MSG_GENERATE,,$$@,$$<)
224 $(QUIET)$(INSTALL) -m 0644 $$< $$@
225endef
226
227$(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
228 $(eval $(def_vbox_lang_xml)))
229
230#
231# Create intermediate XML file for licenses (needed for .MSI linking).
232# These files are created from the original .RTF files in the /docs directory.
233#
234# Note: The redirect command below will open $$@ as stdout in append+text mode
235# and then exec cat, thus appending the license file to the result file.
236#
237# Note: The license_file variable has to be created before def_vbox_license_xml
238# is expanded by the 2nd eval because we rely on the that expansion
239# replacing all $(license_file) (and $(lang)) references before evaluation.
240#
241# Note: The REDIRECT + ECHO_EXT is because WiX gets upset if there a newline
242# between the tag and the RTF license text.
243#
244define def_vbox_license_xml
245$(VBOX_WIN_INST_OUT_DIR)/NLS/License_$(lang).wxl: $(license_file) $(MAKEFILE_CURRENT) | $$$$(dir $$$$@)
246 $$(call MSG_GENERATE,,$$@,$$<)
247 $(APPEND) -t $$@ '<?xml version="1.0" encoding="utf-8"?>'
248 $(APPEND) $$@ '<WixLocalization xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage="$(VBOX_BRAND_$(lang)_LANGUAGE_CODEPAGE)" Culture="$(lang)">'
249
250 $(REDIRECT) -a+to $$@ -- $(ECHO_EXT) -n '<String Id="LicenseText">'
251 $(REDIRECT) -a+to $$@ -- $(SED) -e "s|<|\&lt;|g" -e "s|>|\&gt;|g" $(license_file)
252 $(APPEND) $$@ '</String>'
253
254 $(APPEND) $$@ '<String Id="LicenseFile">$(license_file)</String>'
255 $(APPEND) $$@ '<String Id="LicenseInstallFileLong">License_$(lang).rtf</String>'
256 $(APPEND) $$@ '<String Id="LicenseInstallFileShort">L_$(lang).rtf</String>'
257
258 $(APPEND) $$@ '</WixLocalization>'
259endef
260
261$(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
262 $(eval local license_file := $(VBOX_BRAND_$(subst en_US_,,$(lang)_)LICENSE_RTF)) \
263 $(eval $(def_vbox_license_xml)))
264
265#
266# Create one intermediate WXI (Windows Installer Include) file for all installers (needed for .MSI compiling).
267# This file includes all language-specific files (PDFs, CHMs, ...) to install.
268#
269# Note: When using the -n switch, append will append a new line after each
270# argument. The -t switch makes it truncate the file.
271#
272$(VBOX_WIN_INST_OUT_DIR)/Files_Main.wxi: $(MAKEFILE_CURRENT) | $$(dir $$@)
273 $(call MSG_GENERATE,,$@,$<)
274 $(APPEND) -t $@ '<?xml version="1.0" ?>'
275 $(APPEND) $@ '<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">'
276ifdef VBOX_WITH_DOCS_PACKING
277 $(APPEND) $@ ' <File Id="file_VirtualBox.chm" Name="VirtualBox.chm" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$(PATH_STAGE_BIN)/VirtualBox.chm"></File>'
278 $(APPEND) -n $@ $(foreach lang,$(VBOX_MANUAL_ADD_LANGUAGES), \
279 ' <File Id="file_VirtualBox_$(lang).chm" Name="VirtualBox_$(lang).chm" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$(PATH_STAGE_BIN)/VirtualBox_$(lang).chm"></File>')
280endif
281 $(APPEND) $@ '</Include>'
282
283$(VBOX_WIN_INST_OUT_DIR)/Files_Doc.wxi: $(MAKEFILE_CURRENT) | $$(dir $$@)
284 $(call MSG_GENERATE,,$@,$<)
285 $(APPEND) -t $@ '<?xml version="1.0" ?>'
286 $(APPEND) $@ '<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">'
287ifdef VBOX_WITH_DOCS_PACKING
288 $(APPEND) $@ ' <File Id="file_UserManual.pdf" Name="UserManual.pdf" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$(PATH_STAGE_BIN)/UserManual.pdf">'
289 $(APPEND) $@ ' </File>'
290 $(APPEND) -n $@ $(foreach lang,$(VBOX_MANUAL_ADD_LANGUAGES), \
291 ' <File Id="file_UserManual_$(lang).pdf" Name="UserManual_$(lang).pdf" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$(PATH_STAGE_BIN)/UserManual_$(lang).pdf">' \
292 ' </File>')
293endif
294 $(APPEND) $@ '</Include>'
295
296$(VBOX_WIN_INST_OUT_DIR)/Files_License.wxi: $(MAKEFILE_CURRENT) | $$(dir $$@)
297 $(call MSG_GENERATE,,$@,$<)
298 $(APPEND) -t $@ '<?xml version="1.0" ?>'
299 $(APPEND) $@ '<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">'
300 $(APPEND) $@ ' <File Id="file_License_en_US.rtf" Name="License_en_US.rtf" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$(VBOX_BRAND_LICENSE_RTF)">' \
301 ' </File>'
302 $(APPEND) -n $@ $(foreach lang,$(VBOX_LICENSE_ADD_LANGUAGES), \
303 ' <File Id="file_License_$(lang).rtf" Name="License_$(lang).rtf" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$(VBOX_BRAND_$(lang)_LICENSE_RTF)">' \
304 ' </File>')
305 $(APPEND) $@ '</Include>'
306
307$(VBOX_WIN_INST_OUT_DIR)/Shortcuts_StartMenu.wxi: $(MAKEFILE_CURRENT) | $$(dir $$@)
308 $(call MSG_GENERATE,,$@,$<)
309 $(APPEND) -t $@ '<?xml version="1.0" ?>'
310 $(APPEND) $@ '<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">'
311 #
312 # Documentation (PDF/CHM)
313 #
314ifdef VBOX_WITH_DOCS_PACKING
315 $(APPEND) $@ ' <Shortcut Id="sc_StartMenu_ManualCHM_en_US" Directory="dir_StartMenuVBox" Name="!(loc.StartMenu_UserManual) (CHM, English)" Description="!(loc.StartMenu_UserManual)"' \
316 ' Target="[INSTALLDIR]\VirtualBox.chm" WorkingDirectory="dir_Documents" Advertise="no"/>'
317 $(APPEND) -n $@ $(foreach lang,$(VBOX_MANUAL_ADD_LANGUAGES), \
318 ' <Shortcut Id="sc_StartMenu_ManualCHM_$(lang)" Directory="dir_StartMenuVBox" Name="!(loc.StartMenu_UserManual) (CHM, $(VBOX_BRAND_$(lang)_LANG_NAME))"' \
319 ' Description="!(loc.StartMenu_UserManual) ($(VBOX_BRAND_$(lang)_LANG_NAME))" Target="[INSTALLDIR]\VirtualBox_$(lang).chm" WorkingDirectory="dir_Documents"/>')
320endif
321 $(APPEND) $@ ' <Shortcut Id="sc_StartMenu_ManualPDF_en_US" Directory="dir_StartMenuVBox" Name="!(loc.StartMenu_UserManual) (PDF, English)" Description="!(loc.StartMenu_UserManual)"' \
322 ' Target="[INSTALLDIR]\doc\UserManual.pdf" WorkingDirectory="dir_Documents" Advertise="no"/>'
323 $(APPEND) -n $@ $(foreach lang,$(VBOX_MANUAL_ADD_LANGUAGES), \
324 ' <Shortcut Id="sc_StartMenu_ManualPDF_$(lang)" Directory="dir_StartMenuVBox" Name="!(loc.StartMenu_UserManual) (PDF, $(VBOX_BRAND_$(lang)_LANG_NAME))"' \
325 ' Description="!(loc.StartMenu_UserManual) ($(VBOX_BRAND_$(lang)_LANG_NAME))" Target="[INSTALLDIR]\doc\UserManual_$(lang).pdf" WorkingDirectory="dir_Documents"/>')
326 #
327 # License(s) (RTF)
328 #
329 $(APPEND) $@ ' <Shortcut Id="sc_StartMenu_License_en_US" Directory="dir_StartMenuVBox" Name="!(loc.StartMenu_License) (English)" Description="!(loc.StartMenu_License)"' \
330 ' Target="[INSTALLDIR]License_en_US.rtf" WorkingDirectory="INSTALLDIR" Advertise="no"/>'
331 $(APPEND) -n $@ $(foreach lang,$(VBOX_LICENSE_ADD_LANGUAGES), \
332 ' <Shortcut Id="sc_StartMenu_License_$(lang)" Directory="dir_StartMenuVBox" Name="!(loc.StartMenu_License) ($(VBOX_BRAND_$(lang)_LANG_NAME))"' \
333 ' Description="!(loc.StartMenu_License) ($(VBOX_BRAND_$(lang)_LANG_NAME))" Target="License_$(lang).rtf" WorkingDirectory="INSTALLDIR"/>')
334 $(APPEND) $@ '</Include>'
335
336#
337# .MSI link (all languages).
338#
339# Note: This will clean up any previous .msi to prevent dep build boxes from
340# filling up with old files.
341#
342# Note: Disable parallel jobs here because of shared common.cab access issues.
343#
344define def_vbox_link_msi
345.NOTPARALLEL: $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_$(lang).msi
346$(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_$(lang).msi: \
347 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_$(lang).wixobj \
348 $(VBOX_WIN_INST_OUT_DIR)/NLS/Language_$(lang).wxl \
349 $(VBOX_WIN_INST_OUT_DIR)/NLS/License_$(lang).wxl \
350 $(PATH_STAGE_BIN)/VBoxInstallHelper.dll \
351 $(VBOX_SVN_REV_KMK) \
352 $(MAKEFILE_CURRENT) \
353 | $$$$(dir $$$$@)
354 $$(call MSG_L1,Linking installer $$@)
355 $(QUIET)$(RM) -f $$(wildcard $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_BASE)-r*_$(lang).msi)
356 $(VBOX_PATH_WIX)/light.exe -v -nologo \
357 -loc $(VBOX_WIN_INST_OUT_DIR)/NLS/Language_$(lang).wxl \
358 -loc $(VBOX_WIN_INST_OUT_DIR)/NLS/License_$(lang).wxl \
359 -ext $(VBOX_PATH_WIX)/WixUIExtension.dll \
360 -ext $(VBOX_PATH_WIX)/WixDifxAppExtension.dll \
361 $(VBOX_MSI_ICE_IGNORE) \
362 -out $$@ \
363 $$< \
364 $(if-expr "$(KBUILD_TARGET_ARCH)" == "x86", \
365 $(VBOX_PATH_WIX)/difxapp_x86.wixlib, \
366 $(VBOX_PATH_WIX)/difxapp_x64.wixlib)
367 $(RM) -f $(VBOX_WIN_INST_OUT_DIR)/NLS/$(lang).mst
368 $(call VBOX_SIGN_FILE_FN,$$@,$(VBOX_PRODUCT) $(VBOX_VERSION_STRING)r$(VBOX_SVN_REV) ($(KBUILD_TARGET_ARCH)))
369endef
370
371$(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
372 $(eval $(def_vbox_link_msi)))
373
374#
375# Merge module linking (all languages).
376#
377# Note: This will clean up any previous .msm to prevent dep build boxes from
378# filling up with old files.
379#
380define def_vbox_link_msm
381$(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).msm: \
382 $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).wixobj \
383 $(VBOX_WIN_INST_OUT_DIR)/NLS/Language_$(lang).wxl \
384 $(VBOX_WIN_INST_OUT_DIR)/NLS/License_$(lang).wxl \
385 $(PATH_STAGE_BIN)/VBoxInstallHelper.dll \
386 $(VBOX_SVN_REV_KMK) \
387 $(MAKEFILE_CURRENT) \
388 | $$$$(dir $$$$@)
389 $$(call MSG_L1,Linking installer $$@)
390 $(QUIET)$(RM) -f $$(wildcard $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_BASE)-r*_$(lang).msi)
391 $(VBOX_PATH_WIX)/light.exe -v -nologo \
392 -loc $(VBOX_WIN_INST_OUT_DIR)/NLS/Language_$(lang).wxl \
393 -loc $(VBOX_WIN_INST_OUT_DIR)/NLS/License_$(lang).wxl \
394 -ext $(VBOX_PATH_WIX)/WixDifxAppExtension.dll \
395 $(VBOX_MSI_ICE_IGNORE) \
396 -out $$@ \
397 $$< \
398 $(if-expr "$(KBUILD_TARGET_ARCH)" == "x86", \
399 $(VBOX_PATH_WIX)/difxapp_x86.wixlib, \
400 $(VBOX_PATH_WIX)/difxapp_x64.wixlib)
401 $(RM) -f $(VBOX_WIN_INST_OUT_DIR)/NLS/$(lang).mst
402 $(call VBOX_SIGN_FILE_FN,$$@,$(VBOX_PRODUCT) $(VBOX_VERSION_STRING)r$(VBOX_SVN_REV) ($(KBUILD_TARGET_ARCH)))
403endef
404
405$(if $(VBOX_WITH_MSM_INSTALL), \
406 $(foreach module,$(VBOX_INSTALLER_MERGE_MODULES), \
407 $(foreach lang,$(VBOX_INSTALLER_MERGE_LANGUAGES), \
408 $(eval $(def_vbox_link_msm)))),)
409
410#
411# Load and adjust the MSI compile step dependencies.
412#
413-include $(VBOX_WIN_INST_OUT_DIR)/VirtualBox.wixobj.dep
414
415# Filter out some files depending on build type and compiler.
416ifeq ($(KBUILD_TYPE),release)
417 VBOX_MSI_DEPENDENCIES := $(filer-out $(PATH_OUT)/bin/VBoxDbg3.dll, $(VBOX_MSI_DEPENDENCIES))
418endif
419ifndef VBOX_SIGNING_MODE
420 VBOX_MSI_DEPENDENCIES := $(filer-out %.cat, $(VBOX_MSI_DEPENDENCIES))
421endif
422ifdef VBOX_USE_VCC110
423 VBOX_MSI_DEPENDENCIES := $(filter-out \
424 $(PATH_OUT)/bin/msvcr100.dll \
425 $(PATH_OUT)/bin/msvcp100.dll \
426 , $(VBOX_MSI_DEPENDENCIES))
427else # VCC100
428 VBOX_MSI_DEPENDENCIES := $(filter-out \
429 $(PATH_OUT)/bin/msvcr110.dll \
430 $(PATH_OUT)/bin/msvcp110.dll \
431 , $(VBOX_MSI_DEPENDENCIES))
432endif
433# TODO: Add filtering out more dependencies here!
434ifndef VBOX_WITH_QTGUI
435 VBOX_MSI_DEPENDENCIES := $(filter-out \
436 $(PATH_OUT)/bin/VirtualBox.exe \
437 $(PATH_OUT)/bin/VBoxTestOGL.exe \
438 $(PATH_OUT)/bin/QtCoreVBox4.dll \
439 $(PATH_OUT)/bin/QtGuiVBox4.dll \
440 $(PATH_OUT)/bin/QtNetworkVBox4.dll \
441 $(PATH_OUT)/bin/QtOpenGLVBox4.dll \
442 $(PATH_OUT)/bin/accessible/qtaccessiblewidgets4.dll \
443 , $(VBOX_MSI_DEPENDENCIES))
444endif
445ifndef VBOX_WITH_PYTHON
446 VBOX_MSI_DEPENDENCIES := $(filer-out $ \
447 $(PATH_OUT)/bin/sdk/installer/vboxapisetup.py \
448 $(PATH_OUT)/bin/sdk/installer/vboxapi/__init__.py \
449 $(PATH_OUT)/bin/sdk/installer/vboxapi/VirtualBox_constants.py \
450 , $(VBOX_MSI_DEPENDENCIES))
451endif
452ifndef VBOX_WITH_CROGL
453 VBOX_MSI_DEPENDENCIES := $(filer-out $ \
454 $(PATH_OUT)/bin/VBoxOGLhostcrutil.dll \
455 $(PATH_OUT)/bin/VBoxOGLhosterrorspu.dll \
456 $(PATH_OUT)/bin/VBoxOGLrenderspu.dll \
457 $(PATH_OUT)/bin/VBoxSharedCrOpenGL.dll \
458 , $(VBOX_MSI_DEPENDENCIES))
459endif
460ifndef VBOX_WITH_SECURELABEL
461 VBOX_MSI_DEPENDENCIES := $(filer-out $(PATH_OUT)/bin/SDL_ttf.dll, $(VBOX_MSI_DEPENDENCIES))
462endif
463ifndef VBOX_WITH_WEBSERVICES
464 VBOX_MSI_DEPENDENCIES := $(filer-out $(PATH_OUT)/bin/vboxwebsrv.exe, $(VBOX_MSI_DEPENDENCIES))
465endif
466
467ifneq ($(KBUILD_TARGET_ARCH),amd64)
468 VBOX_MSI_DEPENDENCIES := $(filter-out \
469 $(PATH_OUT)/bin/VBoxREM2.rel \
470 , $(VBOX_MSI_DEPENDENCIES))
471else
472 VBOX_MSI_DEPENDENCIES := $(filter-out \
473 $(PATH_OUT)/bin/VBoxREM32.dll \
474 $(PATH_OUT)/bin/VBoxREM64.dll \
475 , $(VBOX_MSI_DEPENDENCIES))
476endif
477ifdef VBOX_WITH_EXTPACK_PUEL
478 VBOX_MSI_DEPENDENCIES := $(filter-out $(PATH_OUT)/bin/VBoxVRDP$(VBOX_SUFF_DLL), $(VBOX_MSI_DEPENDENCIES))
479endif
480
481# Add dependencies that makes sure necessary bits gets built since
482# VBOX_MSI_DEPENDENCIES will be zero the first time around.
483# For combined packages we always use the .ISO from the amd64 build.
484VBOX_MSI_DEPENDENCIES := $(filter-out %/VBoxGuestAdditions.iso, $(VBOX_MSI_DEPENDENCIES))
485ifdef VBOX_WITH_COMBINED_PACKAGE
486 VBOX_MSI_DEPENDENCIES += \
487 $(if $(VBOX_WITH_ADDITIONS_PACKING),$(PATH_MULTIARCH_GUEST_ADDITIONS_ISO)/VBoxGuestAdditions.iso)
488else
489 VBOX_MSI_DEPENDENCIES += \
490 $(if $(VBOX_WITH_ADDITIONS_PACKING),$(VBOX_PATH_ADDITIONS_ISO)/VBoxGuestAdditions.iso)
491endif
492
493#
494# MSI compile.
495#
496define def_vbox_compile_wixobj
497$(VBOX_WIN_INST_OUT_DIR)/VirtualBox_$(lang).wixobj: \
498 $(PATH_SUB_CURRENT)/VirtualBox.wxs \
499 $(PATH_SUB_CURRENT)/UserInterface.wxi \
500 $(if $(VBOX_WITH_MSM_INSTALL), \
501 $(foreach module,$(VBOX_INSTALLER_MERGE_MODULES), \
502 $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).msm), \
503 $(VBOX_WIN_INST_OUT_DIR)/Shortcuts_StartMenu.wxi \
504 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib.wxi \
505 $(if $(VBOX_WITH_32_ON_64_MAIN_API),$(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib_x86.wxi,) \
506 $(VBOX_WIN_INST_OUT_DIR)/VBoxKey.wxi \
507 $(if $(VBOX_WITH_QTGUI),$(VBOX_WIN_INST_OUT_DIR)/VBoxGuiNLS.wxi) \
508 $(VBOX_MSI_DEPENDENCIES)) \
509 $(VBOX_VERSION_STAMP) \
510 | $$$$(dir $$$$@)
511 $(QUIET)$(RM) -f $@
512 $(REDIRECT) \
513 -E 'PATH_OUT=$(subst /,\\,$(PATH_OUT))' \
514 -E 'PATH_TARGET=$(subst /,\\,$(VBOX_WIN_INST_OUT_DIR))' \
515 -E 'PATH_ROOT=$(subst /,\\,$(PATH_ROOT))' \
516 -E 'PATH_MULTIARCH_GUEST_ADDITIONS_ISO=$(subst /,\\,$(PATH_MULTIARCH_GUEST_ADDITIONS_ISO))' \
517 -E 'VBOX_PATH_WIN_INST_SRC=$(subst /,\\,$(VBOX_PATH_WIN_INST_SRC))' \
518 -E 'VBOX_BRAND_WIN_INST_DLGJPG=$(subst /,\\,$(VBOX_BRAND_WIN_INST_DLGJPG))' \
519 -E 'VBOX_ADD_LANGUAGES=$(VBOX_INSTALLER_ADD_LANGUAGES)' \
520 -E 'VBOX_BRAND_LICENSE_RTF=$(subst /,\\,$(VBOX_BRAND_LICENSE_RTF))' \
521 $(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
522 -E 'VBOX_BRAND_$(lang)_LICENSE_RTF=$(subst /,\\,$(VBOX_BRAND_$(subst en_US_,,$(lang)_)LICENSE_RTF))') \
523 -E 'VBOX_BUILD_NR_FOR_INST=$(VBOX_VERSION_BUILD)' \
524 -E 'VBOX_VENDOR=$(VBOX_VENDOR)' \
525 -E 'VBOX_VENDOR_SHORT=$(VBOX_VENDOR_SHORT)' \
526 -E 'VBOX_PRODUCT=$(VBOX_PRODUCT)' \
527 -E 'VBOX_C_YEAR=$(VBOX_C_YEAR)' \
528 -E 'VBOX_VERSION_STRING=$(VBOX_VERSION_STRING)' \
529 -E 'VBOX_VERSION_STRING_RAW=$(VBOX_VERSION_STRING_RAW)' \
530 -E 'VBOX_VERSION_MAJOR_INST=$(VBOX_VERSION_MAJOR)' \
531 -E 'VBOX_VERSION_MINOR_INST=$(VBOX_VERSION_MINOR)' \
532 -E 'VBOX_SIGNING_MODE=$(strip $(if $(VBOX_SIGNING_MODE),$(VBOX_SIGNING_MODE),none))' \
533 -E 'VBOX_GUI_USE_QGL=$(if $(VBOX_GUI_USE_QGL),yes,no)' \
534 $(if $(VBOX_WITH_MSM_INSTALL), \
535 $(foreach module,$(VBOX_INSTALLER_MERGE_MODULES), \
536 -E 'VBOX_WIN_INST_MERGE_$(toupper $(module))=$(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).msm'),) \
537 -E 'VBOX_WITH_32_ON_64_MAIN_API=$(if $(VBOX_WITH_32_ON_64_MAIN_API),yes,no)' \
538 -E 'VBOX_WITH_ADDITIONS_PACKING=$(if $(VBOX_WITH_ADDITIONS_PACKING),yes,no)' \
539 -E 'VBOX_WITH_COMBINED_PACKAGE=$(if $(VBOX_WITH_COMBINED_PACKAGE),yes,no)' \
540 -E 'VBOX_WITH_CROGL=$(if $(VBOX_WITH_CROGL),yes,no)' \
541 -E 'VBOX_WITH_DEBUGGER_GUI=$(if-expr defined(VBOX_WITH_DEBUGGER_GUI) && defined(VBOX_WITH_QTGUI),yes,no)' \
542 -E 'VBOX_WITH_DOCS_PACKING=$(if $(VBOX_WITH_DOCS_PACKING),yes,no)' \
543 -E 'VBOX_WITH_EFIFW_PACKING=$(if $(VBOX_WITH_EFIFW_PACKING),yes,no)' \
544 -E 'VBOX_WITH_EXTPACK=$(if $(VBOX_WITH_EXTPACK),yes,no)' \
545 -E 'VBOX_WITH_GUEST_CONTROL=$(if $(VBOX_WITH_GUEST_CONTROL),yes,no)' \
546 -E 'VBOX_WITH_GUEST_PROPS=$(if $(VBOX_WITH_GUEST_PROPS),yes,no)' \
547 -E 'VBOX_WITH_HARDENING=$(if $(VBOX_WITH_HARDENING),yes,no)' \
548 -E 'VBOX_WITH_DRAG_AND_DROP=$(if $(VBOX_WITH_DRAG_AND_DROP),yes,no)' \
549 -E 'VBOX_WITH_NETFLT=$(if $(VBOX_WITH_NETFLT),yes,no)' \
550 -E 'VBOX_WITH_PYTHON=$(if $(VBOX_WITH_PYTHON),yes,no)' \
551 -E 'VBOX_WITH_QTGUI=$(if $(VBOX_WITH_QTGUI),yes,no)' \
552 -E 'VBOX_WITH_VIDEOHWACCEL=$(if $(VBOX_WITH_VIDEOHWACCEL),yes,no)' \
553 -E 'VBOX_WITH_VRDP=$(if-expr defined(VBOX_WITH_VRDP) && !defined(VBOX_WITH_EXTPACK_PUEL),yes,no)' \
554 -E 'VBOX_WITH_WEBSERVICES=$(if $(VBOX_WITH_WEBSERVICES),yes,no)' \
555 -E 'VBOX_WITH_SECURELABEL=$(if $(VBOX_WITH_SECURELABEL),yes,no)' \
556 -E 'VBOX_WITH_MSM_INSTALL=$(if $(VBOX_WITH_MSM_INSTALL),yes,no)' \
557 -E 'VBOX_WITH_SERIALNUMBER_INSTALL=$(if $(VBOX_WITH_SERIALNUMBER_INSTALL),yes,no)' \
558 -E 'VBOX_WITH_LICENSE_DISPLAY=$(if $(VBOX_WITH_LICENSE_DISPLAY),yes,no)' \
559 -E 'VBOX_WINDOWS_ICON_FILE=$(subst /,\\,$(VBOX_WINDOWS_ICON_FILE))' \
560 -E 'BUILD_TYPE=$(KBUILD_TYPE)' \
561 -E 'BUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH)' \
562 -E 'VBOX_VCC_TOOL_STEM=$(VBOX_VCC_TOOL_STEM)' \
563 -- \
564 $(VBOX_PATH_WIX)/candle.exe $(filter-out $(VBOX_VERSION_STAMP),$$<) \
565 -ext $(VBOX_PATH_WIX)/WixUIExtension.dll \
566 -ext $(VBOX_PATH_WIX)/WixDifxAppExtension.dll \
567 -out $$@
568ifeq ($(lang),en_US)
569#
570# Generate dependency file, we share this between all the languages.
571#
572 $(APPEND) -t $(VBOX_WIN_INST_OUT_DIR)/VirtualBox.wixobj.dep 'VBOX_MSI_DEPENDENCIES = \'
573 $(SED) -f $(VBOX_PATH_WIN_INST_SRC)/dep.sed \
574 --append $(VBOX_WIN_INST_OUT_DIR)/VirtualBox.wixobj.dep \
575 $(foreach module,$(VBOX_INSTALLER_MERGE_MODULES), \
576 $(VBOX_PATH_WIN_INST_SRC)/VBoxMerge$(module).wxi) \
577 $(VBOX_PATH_WIN_INST_SRC)/VirtualBox.wxs \
578 $(VBOX_PATH_WIN_INST_SRC)/UserInterface.wxi \
579 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib.wxi \
580 $(if $(VBOX_WITH_32_ON_64_MAIN_API),$(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib_x86.wxi,)
581 $(APPEND) $(VBOX_WIN_INST_OUT_DIR)/VirtualBox.wixobj.dep ''
582endif
583endef
584
585$(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
586 $(eval $(def_vbox_compile_wixobj)))
587
588#
589# MSM (merge module) compile.
590#
591define def_vbox_compile_msm
592$(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).wixobj: \
593 $(PATH_SUB_CURRENT)/VBoxMerge$(module).wxs \
594 $(PATH_SUB_CURRENT)/VBoxMerge$(module).wxi \
595 $(PATH_SUB_CURRENT)/VBoxMerge$(module)CA.wxi \
596 $(PATH_SUB_CURRENT)/VBoxMerge$(module)Seq.wxi \
597 $(PATH_SUB_CURRENT)/UserInterface.wxi \
598 $(VBOX_WIN_INST_OUT_DIR)/Shortcuts_StartMenu.wxi \
599 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib.wxi \
600 $(if $(VBOX_WITH_32_ON_64_MAIN_API),$(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib_x86.wxi,) \
601 $(VBOX_WIN_INST_OUT_DIR)/VBoxKey.wxi \
602 $(if $(VBOX_WITH_QTGUI),$(VBOX_WIN_INST_OUT_DIR)/VBoxGuiNLS.wxi) \
603 $(VBOX_MSI_DEPENDENCIES) \
604 $(VBOX_VERSION_STAMP) \
605 | $$$$(dir $$$$@)
606 $(QUIET)$(RM) -f $@
607 $(REDIRECT) \
608 -E 'PATH_OUT=$(subst /,\\,$(PATH_OUT))' \
609 -E 'PATH_TARGET=$(subst /,\\,$(VBOX_WIN_INST_OUT_DIR))' \
610 -E 'PATH_ROOT=$(subst /,\\,$(PATH_ROOT))' \
611 -E 'PATH_MULTIARCH_GUEST_ADDITIONS_ISO=$(subst /,\\,$(PATH_MULTIARCH_GUEST_ADDITIONS_ISO))' \
612 -E 'VBOX_PATH_WIN_INST_SRC=$(subst /,\\,$(VBOX_PATH_WIN_INST_SRC))' \
613 -E 'VBOX_BRAND_WIN_INST_DLGJPG=$(subst /,\\,$(VBOX_BRAND_WIN_INST_DLGJPG))' \
614 -E 'VBOX_ADD_LANGUAGES=$(VBOX_INSTALLER_ADD_LANGUAGES)' \
615 -E 'VBOX_BRAND_LICENSE_RTF=$(subst /,\\,$(VBOX_BRAND_LICENSE_RTF))' \
616 $(foreach lang,$(VBOX_INSTALLER_LANGUAGES), \
617 -E 'VBOX_BRAND_$(lang)_LICENSE_RTF=$(subst /,\\,$(VBOX_BRAND_$(subst en_US_,,$(lang)_)LICENSE_RTF))') \
618 -E 'VBOX_BUILD_NR_FOR_INST=$(VBOX_VERSION_BUILD)' \
619 -E 'VBOX_VENDOR=$(VBOX_VENDOR)' \
620 -E 'VBOX_VENDOR_SHORT=$(VBOX_VENDOR_SHORT)' \
621 -E 'VBOX_PRODUCT=$(VBOX_PRODUCT)' \
622 -E 'VBOX_C_YEAR=$(VBOX_C_YEAR)' \
623 -E 'VBOX_VERSION_STRING=$(VBOX_VERSION_STRING)' \
624 -E 'VBOX_VERSION_STRING_RAW=$(VBOX_VERSION_STRING_RAW)' \
625 -E 'VBOX_VERSION_MAJOR_INST=$(VBOX_VERSION_MAJOR)' \
626 -E 'VBOX_VERSION_MINOR_INST=$(VBOX_VERSION_MINOR)' \
627 -E 'VBOX_SIGNING_MODE=$(strip $(if $(VBOX_SIGNING_MODE),$(VBOX_SIGNING_MODE),none))' \
628 -E 'VBOX_GUI_USE_QGL=$(if $(VBOX_GUI_USE_QGL),yes,no)' \
629 -E 'VBOX_WITH_32_ON_64_MAIN_API=$(if $(VBOX_WITH_32_ON_64_MAIN_API),yes,no)' \
630 -E 'VBOX_WITH_ADDITIONS_PACKING=$(if $(VBOX_WITH_ADDITIONS_PACKING),yes,no)' \
631 -E 'VBOX_WITH_COMBINED_PACKAGE=$(if $(VBOX_WITH_COMBINED_PACKAGE),yes,no)' \
632 -E 'VBOX_WITH_CROGL=$(if $(VBOX_WITH_CROGL),yes,no)' \
633 -E 'VBOX_WITH_DEBUGGER_GUI=$(if-expr defined(VBOX_WITH_DEBUGGER_GUI) && defined(VBOX_WITH_QTGUI),yes,no)' \
634 -E 'VBOX_WITH_DOCS_PACKING=$(if $(VBOX_WITH_DOCS_PACKING),yes,no)' \
635 -E 'VBOX_WITH_DTRACE=$(if $(VBOX_WITH_DTRACE),yes,no)' \
636 -E 'VBOX_WITH_EFIFW_PACKING=$(if $(VBOX_WITH_EFIFW_PACKING),yes,no)' \
637 -E 'VBOX_WITH_EXTPACK=$(if $(VBOX_WITH_EXTPACK),yes,no)' \
638 -E 'VBOX_WITH_GUEST_CONTROL=$(if $(VBOX_WITH_GUEST_CONTROL),yes,no)' \
639 -E 'VBOX_WITH_GUEST_PROPS=$(if $(VBOX_WITH_GUEST_PROPS),yes,no)' \
640 -E 'VBOX_WITH_HARDENING=$(if $(VBOX_WITH_HARDENING),yes,no)' \
641 -E 'VBOX_WITH_DRAG_AND_DROP=$(if $(VBOX_WITH_DRAG_AND_DROP),yes,no)' \
642 -E 'VBOX_WITH_NETFLT=$(if $(VBOX_WITH_NETFLT),yes,no)' \
643 -E 'VBOX_WITH_PYTHON=$(if $(VBOX_WITH_PYTHON),yes,no)' \
644 -E 'VBOX_WITH_QTGUI=$(if $(VBOX_WITH_QTGUI),yes,no)' \
645 -E 'VBOX_WITH_VIDEOHWACCEL=$(if $(VBOX_WITH_VIDEOHWACCEL),yes,no)' \
646 -E 'VBOX_WITH_VRDP=$(if-expr defined(VBOX_WITH_VRDP) && !defined(VBOX_WITH_EXTPACK_PUEL),yes,no)' \
647 -E 'VBOX_WITH_WEBSERVICES=$(if $(VBOX_WITH_WEBSERVICES),yes,no)' \
648 -E 'VBOX_WITH_MSM_INSTALL=$(if $(VBOX_WITH_MSM_INSTALL),yes,no)' \
649 -E 'VBOX_WITH_SECURELABEL=$(if $(VBOX_WITH_SECURELABEL),yes,no)' \
650 -E 'VBOX_WITH_SERIALNUMBER_INSTALL=$(if $(VBOX_WITH_SERIALNUMBER_INSTALL),yes,no)' \
651 -E 'VBOX_WITH_LICENSE_DISPLAY=$(if $(VBOX_WITH_LICENSE_DISPLAY),yes,no)' \
652 -E 'VBOX_WINDOWS_ICON_FILE=$(subst /,\\,$(VBOX_WINDOWS_ICON_FILE))' \
653 -E 'BUILD_TYPE=$(KBUILD_TYPE)' \
654 -E 'BUILD_TARGET_ARCH=$(KBUILD_TARGET_ARCH)' \
655 -E 'VBOX_VCC_TOOL_STEM=$(VBOX_VCC_TOOL_STEM)' \
656 -- \
657 $(VBOX_PATH_WIX)/candle.exe $(filter-out $(VBOX_VERSION_STAMP),$$<) \
658 -ext $(VBOX_PATH_WIX)/WixUIExtension.dll \
659 -ext $(VBOX_PATH_WIX)/WixDifxAppExtension.dll \
660 -out $$@
661ifeq ($(lang),en_US)
662#
663# Generate dependency file, we share this between all the languages.
664#
665 $(APPEND) -t $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module).msm.dep 'VBOX_MSI_DEPENDENCIES = \'
666 $(SED) -f $(VBOX_PATH_WIN_INST_SRC)/dep.sed \
667 --append $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module).msm.dep \
668 $(VBOX_PATH_WIN_INST_SRC)/VBoxMerge$(module).wxi \
669 $(VBOX_PATH_WIN_INST_SRC)/UserInterface.wxi \
670 $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib.wxi \
671 $(if $(VBOX_WITH_32_ON_64_MAIN_API),$(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib_x86.wxi,)
672 $(APPEND) $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module).msm.dep ''
673endif
674endef
675
676$(foreach module,$(VBOX_INSTALLER_MERGE_MODULES), \
677 $(foreach lang,$(VBOX_INSTALLER_MERGE_LANGUAGES), \
678 $(eval $(def_vbox_compile_msm))))
679
680#
681# VirtualBox Type Library definition.
682#
683$(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib.wxi: \
684 $(PATH_SUB_CURRENT)/VirtualBox_TypeLib.xsl \
685 $(VBOX_XIDL_FILE) \
686 | $$(dir $$@)
687 $(VBOX_XSLTPROC) -o $@ $< $(VBOX_XIDL_FILE)
688
689$(VBOX_WIN_INST_OUT_DIR)/VirtualBox_TypeLib_x86.wxi: \
690 $(PATH_SUB_CURRENT)/VirtualBox_TypeLib.xsl \
691 $(VBOX_XIDL_FILE) \
692 | $$(dir $$@)
693 $(VBOX_XSLTPROC) --stringparam "a_sTarget" "VBoxClient-x86" -o [email protected] $< $(VBOX_XIDL_FILE)
694 $(SED) -e 's/VBoxC/VBoxClient_x86/g' --output $@ [email protected]
695 $(RM) -f [email protected]
696
697#
698# Construct the list of GUI translations.
699# ('-t' -- truncate file; '-n' -- new line between arguments)
700#
701include $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk
702$(VBOX_WIN_INST_OUT_DIR)/VBoxGuiNLS.wxi: $(PATH_ROOT)/src/VBox/Frontends/VirtualBox/nls/ApprovedLanguages.kmk $(MAKEFILE_CURRENT) | $$(dir $$@)
703 $(APPEND) -t $@ '<?xml version="1.0" ?>'
704 $(APPEND) $@ '<Include>'
705 $(APPEND) -n $@ $(foreach lang,$(VBOX_APPROVED_GUI_LANGUAGES), \
706 ' <File Id="nlsqt${lang}" Name="qt_${lang}.qm" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$$(env.PATH_OUT)\bin\nls\qt_${lang}.qm" />' \
707 ' <File Id="nlsgui${lang}" Name="VirtualBox_${lang}.qm" DiskId="$(VBOX_INSTALLER_COMMON_DISKID)" Vital="yes" Source="$$(env.PATH_OUT)\bin\nls\VirtualBox_${lang}.qm" />')
708 $(APPEND) $@ '</Include>'
709
710#
711# Edit the version stored in the registry.
712#
713$(VBOX_WIN_INST_OUT_DIR)/VBoxKey.wxi: $(PATH_SUB_CURRENT)/VBoxKey.wxi $(VBOX_VERSION_STAMP) | $$(dir $$@)
714 $(SED) -e 's/%VER%/$(VBOX_VERSION_STRING_RAW)/' \
715 -e 's/%VER_EXT%/$(VBOX_VERSION_STRING)/' \
716 --output $@ $<
717
718#
719# Build the multi-language version of the .MSI installer (final installer).
720# This is done by creating binary .MST diffs of all the language-specific installers
721# and then merging the diffs into the existing .MSI using tools from the MS Installer SDK.
722#
723# .MSI link (all languages).
724#
725# Note: Prereqs of the special .NOTPARALLEL target will be executed with parallel
726# make jobs temporarily disabled. This is a hack to work around what seems
727# to be a problem with the sharing mode set by one or more of the three
728# programs / scripts involved in this step.
729#
730define def_vbox_create_mst
731.NOTPARALLEL: $(VBOX_WIN_INST_OUT_DIR)/NLS/$(lang).mst
732$(VBOX_WIN_INST_OUT_DIR)/NLS/$(lang).mst: \
733 $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_en_US.msi \
734 $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_$(lang).msi \
735 | $$$$(dir $$$$@)
736 $(call MSG_L1,Integrating language ($(lang)))
737 $(REDIRECT) -C $$(@D) -- $(VBOX_PATH_MSITRAN) -g $$< $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_$(lang).msi $(lang).mst
738 $(REDIRECT) -C $$(@D) -- $(VBOX_PATH_MSIDB) -d $$< -r $(lang).mst
739 $(REDIRECT) -C $$(@D) -- wscript.exe $(VBOX_PATH_WISUBSTG) $$< $(lang).mst $(lang_id)
740endef
741
742$(foreach lang,$(VBOX_INSTALLER_ADD_LANGUAGES), \
743 $(eval local lang_id := $(VBOX_BRAND_$(lang)_LANG_ID)) \
744 $(eval $(def_vbox_create_mst)))
745
746#
747# Create all xxx_<Lang>.msi installers and prepare the final xxx_MultiLang.msi installer.
748#
749## @todo this rule must not modify $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_en_US.msi but a copy of it. def_vbox_compile_wixobj is
750# where en_US.msi is created, it shouldn't be changed after that (if possible). Also, document the path length issue.
751VBOX_INS_PROD_ARCH.amd64 = x64
752VBOX_INS_PROD_ARCH.x86 = Intel
753VBOX_INS_PROD_ARCH := $(VBOX_INS_PROD_ARCH.$(KBUILD_TARGET_ARCH))
754$(if $(VBOX_INS_PROD_ARCH),,$(error VBOX_INS_PROD_ARCH is empty!))
755VBOX_INS_PROD_LANG := 7="$(VBOX_INS_PROD_ARCH);1033
756$(foreach lang, $(VBOX_INSTALLER_ADD_LANGUAGES), $(eval VBOX_INS_PROD_LANG := $(VBOX_INS_PROD_LANG)$(COMMA)$(VBOX_BRAND_$(lang)_LANG_ID)))
757VBOX_INS_PROD_LANG := $(VBOX_INS_PROD_LANG)"
758
759$(PACKAGE_NAME_FINAL): \
760 $(VBOX_WIN_INST_OUT_DIR)/Files_Main.wxi \
761 $(VBOX_WIN_INST_OUT_DIR)/Files_Doc.wxi \
762 $(VBOX_WIN_INST_OUT_DIR)/Files_License.wxi \
763 $(VBOX_WIN_INST_OUT_DIR)/Shortcuts_StartMenu.wxi \
764 $(foreach lang,$(VBOX_INSTALLER_LANGUAGES), $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_$(lang).msi) \
765 $(foreach lang,$(VBOX_INSTALLER_ADD_LANGUAGES), $(VBOX_WIN_INST_OUT_DIR)/NLS/$(lang).mst) \
766 $(VBOX_SVN_REV_KMK) \
767 | $$(dir $$@)
768 $(QUIET)$(RM) -f $(wildcard $(PATH_STAGE_BIN)/$(PACKAGE_BASE)-r*.msi)
769 $(REDIRECT) -C $(@D) -- \
770 wscript.exe $(VBOX_PATH_WISUMINFO) $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_en_US.msi $(VBOX_INS_PROD_LANG)
771 $(CP) -f $(VBOX_WIN_INST_OUT_DIR)/$(PACKAGE_NAME_LANG)_en_US.msi $@
772 $(call VBOX_SIGN_FILE_FN,$@,$(VBOX_PRODUCT) $(VBOX_VERSION_STRING)r$(VBOX_SVN_REV))
773
774
775if defined(VBOX_WITH_COMBINED_PACKAGE) && "$(KBUILD_TARGET_ARCH)" == "x86"
776#
777# Make the multi-architecture installer by calling our stub builder
778# with both platform installers (x86 and amd64) + common cab. The common
779# cab only is needed when we don't use merge modules. We only
780# need to do this once; so do it on x86 only.
781#
782$(PATH_STAGE_BIN)/$(PACKAGE_NAME_MULTIARCH_FINAL): \
783 $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.x86) \
784 $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.amd64) \
785 $(PATH_STAGE_BIN)/VBoxStub.exe \
786 $$(VBoxStubBld_1_TARGET)
787 $(call MSG_L1,Building Windows combined package)
788 $(if $(VBOX_WITH_MSM_INSTALL),,$(call VBOX_SIGN_FILE_FN,$(PACKAGE_NAME_MULTIARCH_COMMONCAB)))
789 $(REDIRECT) -C $(@D) -- \
790 $(VBoxStubBld_1_TARGET) -out $@ \
791 -target-x86 $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.x86) \
792 -target-amd64 $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.amd64) \
793 $(if $(VBOX_WITH_MSM_INSTALL),,-target-all $(PACKAGE_NAME_MULTIARCH_COMMONCAB)) \
794 -stub $(PATH_STAGE_BIN)/VBoxStub.exe
795 $(VBOX_VCC_EDITBIN) /IntegrityCheck:NO $@
796 $(call VBOX_SIGN_FILE_FN,$@)
797endif
798
799
800#
801# Make the bundle installer (for retail ISOs) (zip-file).
802#
803$(VBOX_PATH_PACK_BUNDLE_ZIP): \
804 $(PACKAGE_NAME_FINAL) \
805 $(if-expr "$(KBUILD_TARGET_ARCH)" == "x86", \
806 $(PATH_STAGE_BIN)/VBoxBundleMachine.exe \
807 $(if $(VBOX_BRAND_WIN_AS_MENU), $(PATH_STAGE_BIN)/AutoStartMenu.exe) \
808 $(if $(VBOX_WITH_COMBINED_PACKAGE), $(PATH_STAGE_BIN)/$(PACKAGE_NAME_MULTIARCH_FINAL)),)
809 $(RM) -Rf -- $(VBOX_PATH_PACK_BUNDLE_TMP)/
810 $(MKDIR) -p $(VBOX_PATH_PACK_BUNDLE_TMP)/
811ifndef VBOX_WITH_COMBINED_PACKAGE
812 $(CP) $(PACKAGE_NAME_FINAL) $(VBOX_PATH_PACK_BUNDLE_TMP)/$(VBOX_BRAND_WIN_INST_NAME.$(KBUILD_TARGET_ARCH))
813endif
814ifeq ($(KBUILD_TARGET_ARCH),x86)
815 ifdef VBOX_WITH_COMBINED_PACKAGE
816 $(CP) $(PATH_STAGE_BIN)/$(PACKAGE_NAME_MULTIARCH_FINAL) $(VBOX_PATH_PACK_BUNDLE_TMP)/$(PACKAGE_NAME_MULTIARCH_FINAL)
817 endif
818 $(CP) $(PATH_STAGE_BIN)/VBoxBundleMachine.exe $(VBOX_PATH_PACK_BUNDLE_TMP)/
819 $(CP) $(PATH_STAGE_BIN)/AutoStartMenu.exe $(VBOX_PATH_PACK_BUNDLE_TMP)/
820 ifdef VBOX_BRAND_WIN_AS_MENU
821 $(MKDIR) -p $(VBOX_PATH_PACK_BUNDLE_TMP)/Menu/Graphics/
822 $(CP) $(VBOX_BRAND_WIN_AS_CONTENT) $(VBOX_PATH_PACK_BUNDLE_TMP)/
823 $(CP) $(VBOX_BRAND_WIN_AS_MENU_CONTENT) $(VBOX_PATH_PACK_BUNDLE_TMP)/Menu/
824 $(CP) $(VBOX_BRAND_WIN_AS_MENU_CONTENT_GFX) $(VBOX_PATH_PACK_BUNDLE_TMP)/Menu/Graphics/
825 ifdef VBOX_WITH_COMBINED_PACKAGE
826 $(SED) -e 's/VBOXEXE/$(PACKAGE_NAME_MULTIARCH_FINAL)/g' \
827 --output $(VBOX_PATH_PACK_BUNDLE_TMP)/Menu/index.html \
828 $(VBOX_BRAND_WIN_AS_MENU)/index_combined.html
829 else
830 $(SED) -e 's/VBOX32EXE/$(VBOX_BRAND_WIN_INST_NAME.x86)/g' \
831 -e 's/VBOX64EXE/$(VBOX_BRAND_WIN_INST_NAME.amd64)/g' \
832 --output $(VBOX_PATH_PACK_BUNDLE_TMP)/Menu/index.html \
833 $(VBOX_BRAND_WIN_AS_MENU)/index.html
834 endif
835 endif
836endif
837ifeq ($(KBUILD_TARGET_ARCH),amd64)
838 ifndef VBOX_WITH_COMBINED_PACKAGE
839 # Only needed if *not* combined package -- otherwise the 64-bit build
840 # has nothing to do here since the one and only amd64 .MSI file is already
841 # included in the x86 combined package.
842 $(REDIRECT) -C $(VBOX_PATH_PACK_BUNDLE_TMP) -- $(ZIP) -9r $@ .
843 endif
844else
845 # Do a bundle .zip in every case on x86. On a combined package this also
846 # will include the amd64 installer we left out in the block above (see comment).
847 $(REDIRECT) -C $(VBOX_PATH_PACK_BUNDLE_TMP) -- $(ZIP) -9r $@ .
848endif
849
850include $(FILE_KBUILD_SUB_FOOTER)
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette