main
targets 958 lines 47.7 KB
Raw
1 <?xml version="1.0" encoding="utf-8"?>
2 <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
3
4 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
5 <PropertyGroup>
6 <WixTargetsImported>true</WixTargetsImported>
7 </PropertyGroup>
8
9 <Import Project="wix.props" Condition=" '$(WixPropsImported)' != 'true' " />
10
11 <ImportGroup>
12 <Import Project="$(MSBuildUserExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportBefore\*" Condition="'$(ImportUserLocationsByWildcardBeforeWixToolsetTargets)' != 'false' and Exists('$(MSBuildUserExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportBefore')" />
13 <Import Project="$(MSBuildExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportBefore\*" Condition="'$(ImportByWildcardBeforeWixToolsetTargets)' != 'false' and Exists('$(MSBuildExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportBefore')" />
14 </ImportGroup>
15
16 <!--
17 ***********************************************************************************************
18 ***********************************************************************************************
19 Extension Points
20 ***********************************************************************************************
21 ***********************************************************************************************
22 -->
23
24 <!-- Allow a user-customized targets files to be used as part of the build. -->
25 <Import Project="$(CustomBeforeWixTargets)" Condition=" '$(CustomBeforeWixTargets)' != '' and Exists('$(CustomBeforeWixTargets)')" />
26
27 <!-- These properties can be overridden to support non-default installations. -->
28 <PropertyGroup>
29 <WixBinDir Condition=" '$(WixBinDir)' == '' and '$(MSBuildRuntimeType)' == 'Core' ">$(MSBuildThisFileDirectory)net6.0\</WixBinDir>
30 <WixBinDir Condition=" '$(WixBinDir)' == '' ">$(MSBuildThisFileDirectory)net472\</WixBinDir>
31 <WixTasksPath Condition=" '$(WixTasksPath)' == '' ">$(WixBinDir)WixToolset.BuildTasks.dll</WixTasksPath>
32 </PropertyGroup>
33
34 <ItemGroup Condition=" '$(EnableDefaultItems)' == 'true' ">
35 <Compile Include="**/*.wxs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" Condition=" '$(EnableDefaultCompileItems)' == 'true' " />
36 <EmbeddedResource Include="**/*.wxl" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" Condition=" '$(EnableDefaultEmbeddedResourceItems)' == 'true' " />
37 </ItemGroup>
38
39 <ItemGroup>
40 <AvailableItemName Include="BindPath;BindVariable;WixLibrary;WixExtension" />
41 </ItemGroup>
42
43 <UsingTask TaskName="CreateItemAvoidingInference" AssemblyFile="$(WixTasksPath)" />
44 <UsingTask TaskName="UpdateProjectReferenceMetadata" AssemblyFile="$(WixTasksPath)" />
45 <UsingTask TaskName="CreateProjectReferenceDefineConstantsAndBindPaths" AssemblyFile="$(WixTasksPath)" />
46 <UsingTask TaskName="WixAssignCulture" AssemblyFile="$(WixTasksPath)" />
47 <UsingTask TaskName="ReadTracking" AssemblyFile="$(WixTasksPath)" />
48 <UsingTask TaskName="ResolveWixReferences" AssemblyFile="$(WixTasksPath)" />
49 <UsingTask TaskName="WixBuild" AssemblyFile="$(WixTasksPath)" />
50 <UsingTask TaskName="WindowsInstallerValidation" AssemblyFile="$(WixTasksPath)" />
51
52 <!--
53 ***********************************************************************************************
54 ***********************************************************************************************
55 Declarations for Microsoft.Common.targets
56 ***********************************************************************************************
57 ***********************************************************************************************
58 -->
59
60 <PropertyGroup>
61 <DefaultProjectTypeGuid Condition=" '$(DefaultProjectTypeGuid)' == '' ">{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}</DefaultProjectTypeGuid>
62 <DefaultLanguageSourceExtension>.wxs</DefaultLanguageSourceExtension>
63 <Language>wix</Language>
64 <TargetRuntime>wix</TargetRuntime>
65
66 <!-- Ensure BaseOutputPath for Microsoft.Common.targets -->
67 <BaseOutputPath Condition="'$(BaseOutputPath)' == ''">bin\</BaseOutputPath>
68 <BaseOutputPath Condition="!HasTrailingSlash('$(BaseOutputPath)')">$(BaseOutputPath)\</BaseOutputPath>
69
70 <!-- Use OutputName to set the AssemblyName for Microsoft.Common.targets -->
71 <OutputName Condition=" '$(OutputName)'=='' ">$(MSBuildProjectName)</OutputName>
72 <AssemblyName>$(OutputName)</AssemblyName>
73
74 <!-- Default OutputType to a known WiX Toolset type. -->
75 <OutputType Condition=" '$(OutputType)' == '' ">Package</OutputType>
76
77 <DebugType Condition=" '$(SuppressPdbOutput)' == 'true' ">none</DebugType>
78 <DebugType Condition=" '$(DebugType)' == '' ">full</DebugType>
79 </PropertyGroup>
80
81 <PropertyGroup>
82 <_VCLibCurrentVersion>14.0</_VCLibCurrentVersion>
83 </PropertyGroup>
84
85 <!--
86 IDE Macros available from both integrated builds and from command line builds.
87 The following properties are 'macros' that are available via IDE for pre and post build steps.
88 All of them should be added to WixBuildMacroCollection to ensure that they are shown in the UI.
89 -->
90 <PropertyGroup Condition=" '$(TargetExt)' == '' ">
91 <TargetExt Condition=" '$(OutputType)' == 'Package' ">.msi</TargetExt>
92 <TargetExt Condition=" '$(OutputType)' == 'Module' ">.msm</TargetExt>
93 <TargetExt Condition=" '$(OutputType)' == 'Patch' ">.msp</TargetExt>
94 <TargetExt Condition=" '$(OutputType)' == 'PatchCreation' ">.pcp</TargetExt>
95 <TargetExt Condition=" '$(OutputType)' == 'Library' ">.wixlib</TargetExt>
96 <TargetExt Condition=" '$(OutputType)' == 'Bundle' ">.exe</TargetExt>
97 <TargetExt Condition=" '$(OutputType)' == 'IntermediatePostLink' ">.wixipl</TargetExt>
98 </PropertyGroup>
99
100 <Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
101
102 <!--
103 This will override some targets that get defined in Microsoft.Common just like Microsoft.NET.DisableStandardFrameworkResolution.targets
104 so this needs to be imported after
105 -->
106 <Target Name="GetReferenceAssemblyPaths" />
107 <Target Name="GetFrameworkPaths" />
108 <PropertyGroup>
109 <_TargetFrameworkDirectories />
110 <FrameworkPathOverride />
111 <TargetFrameworkDirectory />
112 <NoStdLib>true</NoStdLib>
113 </PropertyGroup>
114 <!-- end Microsoft.NET.DisableStandardFrameworkResolution.targets -->
115
116 <PropertyGroup>
117 <!-- We don't target any frameworks, so clear what the Microsoft.Common.targets set -->
118 <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>
119 </PropertyGroup>
120
121 <ItemDefinitionGroup>
122 <!-- Customize project references to not attempt assembly reference resolution. -->
123 <ProjectReference>
124 <Private>false</Private>
125 <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
126 <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
127 <OutputItemType>_WixResolvedProjectReference</OutputItemType>
128 </ProjectReference>
129
130 <!-- By default do not copy none items to output. -->
131 <None>
132 <CopyToOutputDirectory>Never</CopyToOutputDirectory>
133 </None>
134 </ItemDefinitionGroup>
135
136 <PropertyGroup>
137 <!--
138 Only Package, Module and Bundle output types create .wixpdbs, so reset the flag indicating symbols will be produced outside of those output types.
139 -->
140 <_DebugSymbolsProduced Condition=" '$(OutputType)' != 'Package' and '$(OutputType)' != 'Module' and '$(OutputType)' != 'Patch' and '$(OutputType)' != 'Bundle' ">false</_DebugSymbolsProduced>
141 </PropertyGroup>
142
143 <PropertyGroup>
144 <!-- Default pdb output path to the intermediate output directory -->
145 <PdbOutputDir Condition=" '$(PdbOutputDir)'=='' ">$(TargetDir)</PdbOutputDir>
146 <TargetPdbDir Condition=" '$(PdbOutputDir)'!='' ">$([MSBuild]::NormalizeDirectory($(MSBuildProjectDirectory), $(PdbOutputDir)))</TargetPdbDir>
147 <TargetPdbFileName Condition=" '$(TargetPdbFileName)' == '' ">$(TargetName).wixpdb</TargetPdbFileName>
148 <TargetPdbPath Condition=" '$(TargetPdbPath)' == '' ">$(TargetPdbDir)$(TargetPdbFileName)</TargetPdbPath>
149 </PropertyGroup>
150
151 <PropertyGroup>
152 <BindTrackingFilePrefix Condition=" '$(BindTrackingFilePrefix)' == '' ">$(MSBuildProjectFile).BindTracking</BindTrackingFilePrefix>
153 <BindTrackingFileExtension Condition=" '$(BindTrackingFileExtension)' == '' ">.txt</BindTrackingFileExtension>
154 </PropertyGroup>
155
156 <!--
157 ***********************************************************************************************
158 ***********************************************************************************************
159 Property Declarations
160 ***********************************************************************************************
161 ***********************************************************************************************
162 -->
163
164 <!--
165 ***********************************************************************************************
166 ***********************************************************************************************
167 Default Property Declarations
168 ***********************************************************************************************
169 ***********************************************************************************************
170 -->
171
172 <!-- Default Compiler properties. -->
173 <PropertyGroup>
174 <InstallerPlatform Condition=" '$(InstallerPlatform)' == '' and ('$(Platform)' == '' or '$(Platform)' == 'Win32' or '$(Platform)' == 'AnyCPU' or '$(Platform)' == 'Any CPU') ">x86</InstallerPlatform>
175 <InstallerPlatform Condition=" '$(InstallerPlatform)' == '' ">$(Platform)</InstallerPlatform>
176 </PropertyGroup>
177
178 <!-- Convert legacy BindInputPaths and LinkerBindInputPaths (in the project or passed in via the command line) into the new BindPath items -->
179 <ItemGroup>
180 <BindInputPaths Include="$(BindInputPaths)" Condition=" '$(BindInputPaths)' != '' " />
181 <LinkerBindInputPaths Include="$(LinkerBindInputPaths)" Condition=" '$(LinkerBindInputPaths)' != '' " />
182 <BindPath Include="$(BindPath)" Condition=" '$(BindPath)' != '' " />
183 <BindPath Include="@(BindInputPaths);@(LinkerBindInputPaths)" />
184 <BindVariable Include="$(WixVariables)" Condition=" '$(WixVariables)' != '' " />
185 </ItemGroup>
186
187 <!--
188 ***********************************************************************************************
189 ***********************************************************************************************
190 Resolve References Section
191 ***********************************************************************************************
192 ***********************************************************************************************
193 -->
194
195 <!--
196 ================================================================================================
197 ResolveReferences - OVERRIDE DependsOn
198
199 ================================================================================================
200 -->
201 <PropertyGroup>
202 <ResolveReferencesDependsOn>
203 BeforeResolveReferences;
204 AssignProjectConfiguration;
205 _ValidateProjectAssetsFile;
206 ResolveProjectReferences;
207 FindInvalidProjectReferences;
208 ResolveNativeProjectReferences;
209 _ConvertResolvedProjectReferencesIntoWixConstructs;
210 ResolveWixLibraryReferences;
211 ResolveWixExtensionReferences;
212 _CreateProjectDefineConstants;
213 AfterResolveReferences
214 </ResolveReferencesDependsOn>
215 </PropertyGroup>
216
217 <!--
218 ================================================================================================
219 _ValidateProjectAssetsFile
220
221 Ensures that the project assets file exists which indicates restore was completed. Restore is
222 required if there are any PackageReferences in the project.
223
224 [IN]
225 @(PackageReference) - Package references, if any.
226 $(ProjectAssetsFile) - Project assets file that should be created during restore.
227 ================================================================================================
228 -->
229 <Target
230 Name="_ValidateProjectAssetsFile"
231 Condition=" '@(PackageReference)' != '' ">
232
233 <Error Text="The $(ProjectAssetsFile) file does not exist. Restore the project before trying to build again. Restore and build with &quot;MSBuild -Restore&quot; or &quot;dotnet build&quot;."
234 Condition="!Exists('$(ProjectAssetsFile)')" />
235
236 </Target>
237
238 <!--
239 ================================================================================================
240 _WixUpdateProjectReferenceMetadata
241
242 Updates project references so they build correctly when referenced by .wixproj.
243
244 [IN]
245 @(_MSBuildProjectReferenceExistent) - References to projects that exist.
246
247 [OUT]
248 @(_MSBuildProjectReferenceExistent) - Project references updated as necessary.
249 ================================================================================================
250 -->
251 <Target
252 Name="_WixUpdateProjectReferenceMetadata"
253 AfterTargets="_SplitProjectReferencesByFileExistence"
254 Condition=" '@(_MSBuildProjectReferenceExistent)' != '' ">
255
256 <UpdateProjectReferenceMetadata
257 ProjectReferences="@(_MSBuildProjectReferenceExistent)"
258 IntermediateFolder="$(IntermediateOutputPath)">
259 <Output TaskParameter="UpdatedProjectReferences" ItemName="_WixUpdatedProjectReferences" />
260 </UpdateProjectReferenceMetadata>
261
262 <ItemGroup>
263 <_MSBuildProjectReferenceExistent Remove='@(_WixUpdatedProjectReferences)' />
264 <_MSBuildProjectReferenceExistent Include='@(_WixUpdatedProjectReferences)' />
265 </ItemGroup>
266 </Target>
267
268 <!--
269 ================================================================================================
270 ResolveNativeProjectReferences
271
272 VC project references must build GetNativeTargetPath because neither GetTargetPath nor
273 the return of the default build target return the output for a native .vcxproj.
274
275 [IN]
276 @(_MSBuildProjectReferenceExistent) - References to projects that exist.
277
278 [OUT]
279 @(_WixResolvedProjectReference) - Target paths from .vcxproj outputs added.
280 ================================================================================================
281 -->
282 <Target
283 Name="ResolveNativeProjectReferences"
284 Condition=" '@(_MSBuildProjectReferenceExistent)' != '' ">
285
286 <MSBuild
287 Projects="@(_MSBuildProjectReferenceExistent)"
288 Targets="GetNativeTargetPath"
289 Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration);%(_MSBuildProjectReferenceExistent.SetPlatform)"
290 Condition=" '@(ProjectReferenceWithConfiguration)' != '' and '%(_MSBuildProjectReferenceExistent.Extension)' == '.vcxproj' ">
291
292 <Output TaskParameter="TargetOutputs" ItemName="_WixResolvedProjectReference" />
293 </MSBuild>
294 </Target>
295
296 <!--
297 ================================================================================================
298 _ConvertResolvedProjectReferencesIntoWixConstructs
299
300 Converts _WixResolvedProjectReference (which are the outputs of the ProjectReferences that
301 normally would be passed through ResolveAssemblyReferences then be passed to the C# compiler
302 as references) into the appropriate WiX constructs. For example, references to .wixlibs are
303 converted into WixLibrary items. In the end, _WixResolvedProjectReference is emptied to
304 prevent ResolveAssemblyReferences and other non-sensical targets (from a WiX point of view)
305 from doing work.
306
307 [IN]
308 @(_WixResolvedProjectReference) - Resolved project references.
309 $(VSProjectConfigurations) - map of project names to configurations, provided by VS when building in the IDE.
310
311 [OUT]
312 $(ProjectReferenceDefineConstants) - Define constants from project references.
313 @(BindPath) - Bind paths from project references.
314 @(WixLibrary) - Target paths from .vcxproj outputs added.
315 @(_WixReferencedProjectOutputs) - Copy of _WixResolvedProjectReference for use in up-to-date checks.
316 @(_WixResolvedProjectReference) - All resolved reference paths emptied.
317 ================================================================================================
318 -->
319 <PropertyGroup>
320 <_ConvertResolvedProjectReferencesIntoWixConstructs></_ConvertResolvedProjectReferencesIntoWixConstructs>
321 </PropertyGroup>
322 <Target
323 Name="_ConvertResolvedProjectReferencesIntoWixConstructs"
324 DependsOnTargets="$(_ConvertResolvedProjectReferencesIntoWixConstructs)"
325 Condition=" '@(_WixResolvedProjectReference)' != '' ">
326
327 <!-- Save all the project reference outputs before we start removing -->
328 <ItemGroup>
329 <_WixReferencedProjectOutputs Include="@(_WixResolvedProjectReference)" />
330 </ItemGroup>
331
332 <ItemGroup>
333 <WixLibrary Include="@(_WixResolvedProjectReference)" Condition=" '%(Extension)' == '.wixlib' " />
334 </ItemGroup>
335
336 <!-- Convert resolved project references into compiler defines and named and unamed bind paths -->
337 <CreateProjectReferenceDefineConstantsAndBindPaths
338 ResolvedProjectReferences="@(_WixResolvedProjectReference)"
339 ProjectConfigurations="$(VSProjectConfigurations)">
340 <Output TaskParameter="BindPaths" ItemName="BindPath" />
341 <Output TaskParameter="DefineConstants" PropertyName="ProjectReferenceDefineConstants" />
342 </CreateProjectReferenceDefineConstantsAndBindPaths>
343
344 <!--
345 Empty the resolved project references to prevent ResolveAssemblyReferences and other C# specific
346 behavior from kicking in
347 -->
348 <ItemGroup>
349 <_WixResolvedProjectReference Remove="@(_WixResolvedProjectReference)" />
350 </ItemGroup>
351 </Target>
352
353 <!--
354 ================================================================================================
355 ResolveWixLibraryReferences
356
357 Resolve the library references to full paths by searching using $(WixLibrarySearchPaths) and
358 including the outputs from any ProjectReferences that output .wixlib.
359
360 By default the WixLibrarySearchPaths property is set to find libraries in the following order:
361
362 (1) $(ReferencePaths) - the reference paths property.
363 (2) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
364 (3) Treat the reference's Include as if it were a real file name.
365
366 [IN]
367 @(WixLibrary) - the list of .wixlib files.
368 $(WixLibrarySearchPaths) - optional search paths used to find .wixlibs.
369
370 [OUT]
371 @(_ResolvedWixLibraryPaths) - Item group with full paths to libraries that were found.
372 @(_UnresolvedWixLibraryPaths) - Item group with full paths to libraries that were not found.
373 ================================================================================================
374 -->
375 <PropertyGroup>
376 <ResolveWixLibraryReferencesDependsOn></ResolveWixLibraryReferencesDependsOn>
377 </PropertyGroup>
378 <Target
379 Name="ResolveWixLibraryReferences"
380 DependsOnTargets="$(ResolveWixLibraryReferencesDependsOn)"
381 Condition=" '@(WixLibrary)' != ''">
382
383 <PropertyGroup>
384 <WixLibrarySearchPaths Condition=" '$(WixLibrarySearchPaths)' == '' ">$(ReferencePaths);{HintPathFromItem};{RawFileName}</WixLibrarySearchPaths>
385 </PropertyGroup>
386
387 <ResolveWixReferences
388 WixReferences="@(WixLibrary)"
389 SearchPaths="$(WixLibrarySearchPaths)"
390 SearchFilenameExtensions=".wixlib">
391 <Output TaskParameter="ResolvedWixReferences" ItemName="_ResolvedWixLibraryPaths" />
392 <Output TaskParameter="UnresolvedWixReferences" ItemName="_UnresolvedWixLibraryPaths" />
393 </ResolveWixReferences>
394 </Target>
395
396 <!--
397 ================================================================================================
398 ResolveWixExtensionReferences
399
400 Resolves WiX extension references to full paths.
401
402 By default the WixExtensionSearchPaths property is set to find extensions in the following order:
403
404 (1) $(ReferencePaths) - the reference paths property.
405 (2) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
406 (3) Treat the reference's Include as if it were a real file name.
407
408 [IN]
409 @(WixExtension) - WixExtension item group
410
411 [OUT]
412 @(_ResolvedWixExtensionPaths) - Item group with full paths to extensions
413 ================================================================================================
414 -->
415 <PropertyGroup>
416 <ResolveWixExtensionReferencesDependsOn></ResolveWixExtensionReferencesDependsOn>
417 </PropertyGroup>
418 <Target
419 Name="ResolveWixExtensionReferences"
420 DependsOnTargets="$(ResolveWixExtensionReferencesDependsOn)"
421 Condition=" '@(WixExtension)' != ''">
422
423 <PropertyGroup>
424 <WixExtensionSearchPaths Condition=" '$(WixExtensionSearchPaths)' == '' ">$(ReferencePaths);{HintPathFromItem};{RawFileName}</WixExtensionSearchPaths>
425 </PropertyGroup>
426
427 <ResolveWixReferences
428 WixReferences="@(WixExtension)"
429 SearchPaths="$(WixExtensionSearchPaths)"
430 SearchFilenameExtensions=".wixext.dll">
431 <Output TaskParameter="ResolvedWixReferences" ItemName="_ResolvedWixExtensionPaths" />
432 <Output TaskParameter="UnresolvedWixReferences" ItemName="_UnresolvedWixExtensionPaths" />
433 </ResolveWixReferences>
434 </Target>
435
436 <!--
437 ***********************************************************************************************
438 ***********************************************************************************************
439 PrepareResources Section
440 ***********************************************************************************************
441 ***********************************************************************************************
442 -->
443
444 <!--
445 ================================================================================================
446 AssignTargetPaths - OVERRIDE Target
447
448 Determines the final list of culture groups to build based on either the Cultures property or
449 those specified in .wxl files.
450
451 Culture groups specified in the Cultures property must be specified as a semi-colon
452 delimited list of groups, with comma-delimited cultures within a group.
453 For example:
454 <Cultures>en-US,en;en-GB,en</Cultures>
455 This will build 2 targets, outputing to en-US and en-GB sub-folders. Light will first look
456 for strings in the first culture (en-US or en-GB) then the second (en).
457
458 Cultures of .wxl files will be used when the Culture property is not set. The culture of a
459 .wxl file is determined by the Culture attribute in the WixLocalization element in the file
460
461 Sets the OutputFolder metadata on each culture group. In most cases this is the same as the
462 first culture in the culture group. When the Culture's property is unspecified and no .wxl
463 files are provided this is the same as the output directory. When the Culture's property
464 specifies a single culture group and no .wxl files are provided this is the same as the output
465 directory.
466
467 Updates the TargetPath and TargetPdbPath properties to be used in subsequent targets.
468
469 [IN]
470 @(EmbeddedResource) - The list of wxl files to use for localization.
471 $(Cultures) - The list of culture groups to build.
472
473 [OUT]
474 @(CultureGroup) - The list of culture group strings with OutputFolder metadata
475 $(TargetPath) - Property list of target link output MSIs/MSMs
476 $(TargetPdbPath) - Property list of target output pdbs
477 ================================================================================================
478 -->
479 <Target
480 Name="AssignTargetPaths"
481 Condition=" '$(OutputType)' == 'Package' or '$(OutputType)' == 'PatchCreation' or '$(OutputType)' == 'Module' ">
482
483 <WixAssignCulture Cultures="$(Cultures)" Files="@(EmbeddedResource)">
484 <Output TaskParameter="CultureGroups" ItemName="CultureGroup" />
485 </WixAssignCulture>
486
487 <!-- Expand the culture groups then put them back into the appropriate property -->
488 <ItemGroup>
489 <_CulturedTargetPath Include="$(TargetDir)%(CultureGroup.OutputFolder)$(TargetFileName)" />
490 <_CulturedTargetPdbPath Include="$(TargetPdbDir)%(CultureGroup.OutputFolder)$(TargetPdbFileName)" />
491 </ItemGroup>
492
493 <PropertyGroup>
494 <TargetPath>@(_CulturedTargetPath)</TargetPath>
495 <TargetPdbPath>@(_CulturedTargetPdbPath)</TargetPdbPath>
496
497 <!-- Update bind tracking filename prefix so cultures appended to the filename will be separated by a "-" -->
498 <BindTrackingFilePrefix>$(BindTrackingFilePrefix)-</BindTrackingFilePrefix>
499 </PropertyGroup>
500 </Target>
501
502 <!--
503 ================================================================================================
504 CreateManifestResourceNames
505
506 Converts the EmbeddedResource into _WixLocalizationFile to disable satellite assembly
507 generation in common targets.
508 ================================================================================================
509 -->
510 <Target
511 Name="CreateManifestResourceNames"
512 Condition=" '@(EmbeddedResource)' != '' ">
513
514 <ItemGroup>
515 <_WixLocalizationFile Include="@(EmbeddedResource)">
516 <Type>wxl</Type>
517 </_WixLocalizationFile>
518
519 <EmbeddedResource Remove="@(EmbeddedResource)" />
520 </ItemGroup>
521 </Target>
522
523 <!--
524 ================================================================================================
525 GetTargetPath - OVERRIDE DependsOn
526
527 This stand-alone target returns the name of the build package (i.e. MSI, MSM) that would be
528 produced if we built this project.
529 ================================================================================================
530 -->
531 <PropertyGroup>
532 <GetTargetPathDependsOn>$(GetTargetPathDependsOn);AssignTargetPaths</GetTargetPathDependsOn>
533 </PropertyGroup>
534
535 <!--
536 ***********************************************************************************************
537 ***********************************************************************************************
538 Compile Section
539 ***********************************************************************************************
540 ***********************************************************************************************
541 -->
542
543 <!--
544 ================================================================================================
545 CoreCompile
546
547 ================================================================================================
548 -->
549 <PropertyGroup>
550 <CompileDependsOn>
551 $(CompileDependsOn);
552 WindowsInstallerValidation
553 </CompileDependsOn>
554 <CoreCompileDependsOn>
555 AssignTargetPaths;
556 CreateManifestResourceNames;
557 ReadPreviousBindInputsAndBuiltOutputs;
558 _CreateProjectDefineConstants;
559 $(CoreCompileDependsOn)
560 </CoreCompileDependsOn>
561 </PropertyGroup>
562 <Target
563 Name="CoreCompile"
564 Inputs="$(MSBuildAllProjects);
565 @(Compile);
566 @(Content);
567 @(_WixLocalizationFile);
568 @(_WixReferencedProjectOutputs);
569 @(_ResolvedWixLibraryPaths);
570 @(_ResolvedWixExtensionPaths);
571 @(_BindInputs)"
572 Outputs="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension);@(_BindBuiltOutputs)"
573 DependsOnTargets="$(CoreCompileDependsOn)"
574 Condition=" '@(Compile)' != '' ">
575
576 <PropertyGroup>
577 <CabinetCachePath Condition=" '$(CabinetCachePath)'=='' and '$(ReuseCabinetCache)'=='true' ">$(IntermediateOutputPath)cabcache\</CabinetCachePath>
578 <_WixBuildCabinetCachePath Condition=" '$(CabinetCachePath)'!='' ">$([MSBuild]::NormalizeDirectory($(CabinetCachePath), %(CultureGroup.OutputFolder)))</_WixBuildCabinetCachePath>
579 </PropertyGroup>
580
581 <Warning Text="@(UnsupportedWixExtension->'%(Identity)') does not have support for WiX Toolset v$(WixToolsetVersion)."
582 Condition=" '@(UnsupportedWixExtension)' != '' "/>
583
584 <WixBuild
585 SourceFiles="@(Compile)"
586 LibraryFiles="@(_ResolvedWixLibraryPaths)"
587 LocalizationFiles="@(_WixLocalizationFile)"
588
589 Cultures="%(CultureGroup.Identity)"
590
591 Extensions="@(_ResolvedWixExtensionPaths)"
592
593 IntermediateDirectory="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)"
594
595 OutputFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetFileName)"
596 OutputType="$(OutputType)"
597 PdbFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetPdbFileName)"
598 PdbType="$(DebugType)"
599
600 AdditionalOptions="$(CompilerAdditionalOptions) $(LinkerAdditionalOptions)"
601 DefineConstants="$(DefineConstants);$(SolutionDefineConstants);$(ProjectDefineConstants);$(ProjectReferenceDefineConstants)"
602 IncludeSearchPaths="$(IncludeSearchPaths)"
603 InstallerPlatform="$(InstallerPlatform)"
604 NoLogo="true"
605 Pedantic="$(Pedantic)"
606
607 BindPaths="@(BindPath)"
608 BindVariables="@(BindVariable)"
609 BindFiles="$(BindFiles)"
610 BindTrackingFile="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)"
611
612 CabinetCachePath="$(_WixBuildCabinetCachePath)"
613 CabinetCreationThreadCount="$(CabinetCreationThreadCount)"
614 DefaultCompressionLevel="$(DefaultCompressionLevel)"
615
616 SuppressAllWarnings="$(SuppressAllWarnings)"
617 SuppressSpecificWarnings="$(SuppressSpecificWarnings)"
618 TreatWarningsAsErrors="$(TreatWarningsAsErrors)"
619 TreatSpecificWarningsAsErrors="$(TreatSpecificWarningsAsErrors)"
620 VerboseOutput="$(VerboseOutput)"
621
622 ToolExe="$(WixToolExe)"
623 ToolPath="$(WixToolDir)"
624 YieldDuringToolExecution="true">
625 <Output TaskParameter="ExitCode" PropertyName="_WixBuildExitCode" />
626 </WixBuild>
627
628 <ItemGroup>
629 <_WixBuildOutputFile Include="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetFileName)" />
630 </ItemGroup>
631 </Target>
632
633 <Target
634 Name="WindowsInstallerValidation"
635 DependsOnTargets="CoreCompile"
636 Condition=" '$(_WixBuildExitCode)' != '' and '$(SuppressValidation)' != 'true' and ('$(OutputType)' == 'Package' or '$(OutputType)' == 'Module') ">
637 <WindowsInstallerValidation
638 DatabaseFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetFileName)"
639 WixpdbFile="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetPdbFileName)"
640 IntermediateDirectory="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)"
641 Ices="$(Ices)"
642 SuppressIces="$(SuppressIces)"
643 CubeFiles="$(AdditionalCub)"
644
645 AdditionalOptions="$(ValidationAdditionalOptions)"
646
647 NoLogo="true"
648 SuppressAllWarnings="$(SuppressAllWarnings)"
649 SuppressSpecificWarnings="$(SuppressSpecificWarnings)"
650 TreatWarningsAsErrors="$(TreatWarningsAsErrors)"
651 TreatSpecificWarningsAsErrors="$(TreatSpecificWarningsAsErrors)"
652 VerboseOutput="$(VerboseOutput)"
653 YieldDuringToolExecution="true" />
654 </Target>
655
656 <!--
657 ================================================================================================
658 _CreateProjectDefineConstants
659
660 Adds properties as define constants passed into the compiler.
661 ================================================================================================
662 -->
663 <PropertyGroup>
664 <_CreateProjectDefineConstantsDependsOn></_CreateProjectDefineConstantsDependsOn>
665 </PropertyGroup>
666 <Target
667 Name="_CreateProjectDefineConstants"
668 DependsOnTargets="$(_CreateProjectDefineConstantsDependsOn)">
669
670 <PropertyGroup>
671 <ProjectDefineConstants>
672 Configuration=$(ConfigurationName);
673 OutDir=$(OutDir);
674 InstallerPlatform=$(InstallerPlatform);
675 Platform=$(PlatformName);
676 ProjectDir=$(ProjectDir);
677 ProjectExt=$(ProjectExt);
678 ProjectFileName=$(ProjectFileName);
679 ProjectName=$(ProjectName);
680 ProjectPath=$(ProjectPath);
681 TargetDir=$(TargetDir);
682 TargetExt=$(TargetExt);
683 TargetFileName=$(TargetFileName);
684 TargetName=$(TargetName);
685 TargetPath=$(TargetPath);
686 </ProjectDefineConstants>
687 </PropertyGroup>
688
689 <PropertyGroup>
690 <SolutionDefineConstants Condition=" '$(DevEnvDir)'!='*Undefined*' ">$(SolutionDefineConstants);DevEnvDir=$(DevEnvDir)</SolutionDefineConstants>
691 <SolutionDefineConstants Condition=" '$(SolutionDir)'!='*Undefined*' ">$(SolutionDefineConstants);SolutionDir=$(SolutionDir)</SolutionDefineConstants>
692 <SolutionDefineConstants Condition=" '$(SolutionExt)'!='*Undefined*' ">$(SolutionDefineConstants);SolutionExt=$(SolutionExt)</SolutionDefineConstants>
693 <SolutionDefineConstants Condition=" '$(SolutionFileName)'!='*Undefined*' ">$(SolutionDefineConstants);SolutionFileName=$(SolutionFileName)</SolutionDefineConstants>
694 <SolutionDefineConstants Condition=" '$(SolutionName)'!='*Undefined*' ">$(SolutionDefineConstants);SolutionName=$(SolutionName)</SolutionDefineConstants>
695 <SolutionDefineConstants Condition=" '$(SolutionPath)'!='*Undefined*' ">$(SolutionDefineConstants);SolutionPath=$(SolutionPath)</SolutionDefineConstants>
696 </PropertyGroup>
697 </Target>
698
699 <!--
700 ================================================================================================
701 ReadPreviousBindInputsAndBuiltOutputs
702
703 Reads a previous build's Bind contents and built outputs file into @(_BindInputs) and
704 @(_BindBuiltOutputs) respectively.
705
706 Note: Only the *built* outputs are used because using files copied to output folder
707 can cause perpetual incremental build.
708
709 Imagine the case where you have: Msi.wixproj -> Lib.wixproj -> Exe.csproj. The
710 Exe.csproj cannot be both an input to Lib.wixproj and an output of Msi.wixproj
711 (as an uncompressed file) because the Lib.wixproj will always newer than the
712 Exe.csproj.
713
714 [IN]
715
716 [OUT]
717 @(_BindInputs) - the content files required to bind (i.e. the Binary/@SourceFile and File/@Source files).
718 @(_BindBuiltOutputs) - the previously built .msi, .msm, .pcp, .exe .wixpdb, .cabs, etc.
719 Does not include content copied to output folder.
720 ================================================================================================
721 -->
722 <Target
723 Name="ReadPreviousBindInputsAndBuiltOutputs">
724
725 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
726 <Output TaskParameter="Inputs" ItemName="_BindInputs" />
727 <Output TaskParameter="BuiltOutputs" ItemName="_BindBuiltOutputs" />
728 </ReadTracking>
729 </Target>
730
731 <!--
732 ================================================================================================
733 UpdateFileWritesWithBindInformation
734
735 Reads the bind outputs file(s) output generated during WixBuild to correctly set the @(FileWrites)
736 item. Most targets have it easy because they can do a static mapping from inputs to the outputs.
737 However, the WixBuild target outputs are determined after a rather complex calculation we call
738 linking and binding!
739
740 This is an "after target" of CoreCompile to ensure it always runs, even if compiler was up to date. It
741 reads the outputs file generated during the CoreCompile target.
742
743 [IN]
744 Path to bind outputs file(s).
745
746 [OUT]
747 @(FileWrites) updated with outputs from bind.
748 ================================================================================================
749 -->
750 <Target
751 Name="UpdateFileWritesWithBindInformation"
752 AfterTargets="CoreCompile">
753
754 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
755 <Output TaskParameter="Outputs" ItemName="FileWrites" />
756 </ReadTracking>
757
758 <ItemGroup>
759 <FileWrites Include="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)" Condition=" Exists('$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)') " />
760 </ItemGroup>
761 </Target>
762
763 <!--
764 ***********************************************************************************************
765 ***********************************************************************************************
766 AllProjectOutputGroups Section
767 ***********************************************************************************************
768 ***********************************************************************************************
769 -->
770
771 <!--
772 ================================================================================================
773 AllProjectOutputGroups - OVERRIDE Target
774
775 The targets below drive output groups, which provide generic information about a
776 project's inputs (e.g., content files, compilation sources, etc.) and built outputs
777 (e.g., built EXE/MSI, wixpdb, content files, etc.)
778
779 Each target may produce two kinds of items: outputs and dependencies. Outputs are
780 items from the current project; dependencies are items that are brought into the
781 current project as a result of referencing other projects or components.
782
783 For both outputs and dependencies, the Include attribute
784 specifies the location of the output/dependency; it must be a full path. Any number
785 of additional attributes may be placed on an output/dependency item.
786 ================================================================================================
787 -->
788 <Target
789 Name="AllProjectOutputGroups"
790 DependsOnTargets="
791 BuiltProjectOutputGroup;
792 DebugSymbolsProjectOutputGroup;
793 SourceFilesProjectOutputGroup;
794 ContentFilesProjectOutputGroup" />
795
796 <!--
797 This is the key output for the BuiltProjectOutputGroup and is meant to be read directly from the IDE.
798 Reading an item is faster than invoking a target.
799 -->
800 <ItemGroup>
801 <BuiltProjectOutputGroupKeyOutput Include="$(TargetPath)">
802 <IsKeyOutput>true</IsKeyOutput>
803 <FinalOutputPath>$(TargetPath)</FinalOutputPath>
804 <TargetPath>$(TargetFileName)</TargetPath>
805 </BuiltProjectOutputGroupKeyOutput>
806 </ItemGroup>
807
808 <!--
809 ================================================================================================
810 BuiltProjectOutputGroup - OVERRIDE Target
811 ================================================================================================
812 -->
813 <PropertyGroup>
814 <BuiltProjectOutputGroupDependsOn>PrepareForBuild;AssignTargetPaths</BuiltProjectOutputGroupDependsOn>
815 </PropertyGroup>
816 <Target
817 Name="BuiltProjectOutputGroup"
818 Outputs="@(BuiltProjectOutputGroupOutput)"
819 DependsOnTargets="$(BuiltProjectOutputGroupDependsOn)">
820
821 <!-- Don't add BuiltProjectOutputGroupKeyOutput - to avoid duplicates, we only want to get the updated list of TargetPaths from the TargetPath property below -->
822
823 <!-- Try to read the outputs from the bind tracking text file since that's the output list straight from compiler. -->
824 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
825 <Output TaskParameter="Outputs" ItemName="_BuiltProjectOutputGroupOutputIntermediate" />
826 </ReadTracking>
827
828 <!-- If we didn't get anything from the bind outputs text file, default to the target path. -->
829 <ItemGroup Condition=" '@(_BuiltProjectOutputGroupOutputIntermediate)'=='' ">
830 <_BuiltProjectOutputGroupOutputIntermediate Include="$(TargetPath)" />
831 </ItemGroup>
832
833 <!-- Convert intermediate items into final items; this way we can get the full path for each item -->
834 <ItemGroup>
835 <BuiltProjectOutputGroupOutput Include="@(_BuiltProjectOutputGroupOutputIntermediate->'%(FullPath)')">
836 <!-- For compatibility with 2.0 -->
837 <OriginalItemSpec Condition="'%(_BuiltProjectOutputGroupOutputIntermediate.OriginalItemSpec)' == ''">%(_BuiltProjectOutputGroupOutputIntermediate.FullPath)</OriginalItemSpec>
838 </BuiltProjectOutputGroupOutput>
839 </ItemGroup>
840 </Target>
841
842 <!--
843 ================================================================================================
844 DebugSymbolsProjectOutputGroup - OVERRIDE Target
845
846 Populates the Debug Symbols project output group.
847 ================================================================================================
848 -->
849 <PropertyGroup>
850 <DebugSymbolsProjectOutputGroupDependsOn>AssignTargetPaths</DebugSymbolsProjectOutputGroupDependsOn>
851 </PropertyGroup>
852 <Target
853 Name="DebugSymbolsProjectOutputGroup"
854 Outputs="@(DebugSymbolsProjectOutputGroupOutput)"
855 DependsOnTargets="$(DebugSymbolsProjectOutputGroupDependsOn)">
856
857 <!-- Include build output pdb(s). Different than predefined itemgroup since AssignTargetPaths target may change -->
858 <ItemGroup>
859 <DebugSymbolsProjectOutputGroupOutput Include="$(TargetPdbPath)" Condition=" '$(DebugType)' != 'none' "/>
860 </ItemGroup>
861 </Target>
862
863 <!--
864 ***********************************************************************************************
865 ***********************************************************************************************
866 PrepareForRun Section
867 ***********************************************************************************************
868 ***********************************************************************************************
869 -->
870
871 <!--
872 ================================================================================================
873 CopyFilesToOutputDirectory - OVERRIDE Target
874
875 Copy all build outputs, satellites and other necessary files to the final directory.
876 ================================================================================================
877 -->
878 <Target
879 Name="CopyFilesToOutputDirectory">
880
881 <PropertyGroup>
882 <!-- By default we're using hard links to copy to the output directory, disabling this could slow the build significantly -->
883 <CreateHardLinksForCopyFilesToOutputDirectoryIfPossible Condition=" '$(CreateHardLinksForCopyFilesToOutputDirectoryIfPossible)' == '' ">true</CreateHardLinksForCopyFilesToOutputDirectoryIfPossible>
884 <CreateSymbolicLinksForCopyFilesToOutputDirectoryIfPossible Condition="'$(BuildingInsideVisualStudio)' == 'true' or '$(CreateSymbolicLinksForCopyFilesToOutputDirectoryIfPossible)' == ''">false</CreateSymbolicLinksForCopyFilesToOutputDirectoryIfPossible>
885 <ErrorIfLinkFailsForCopyFilesToOutputDirectory Condition="'$(BuildingInsideVisualStudio)' == 'true' or '$(ErrorIfLinkFailsForCopyFilesToOutputDirectory)' == ''">false</ErrorIfLinkFailsForCopyFilesToOutputDirectory>
886 </PropertyGroup>
887
888 <PropertyGroup>
889 <CopyBuildOutputToOutputDirectory Condition="'$(CopyBuildOutputToOutputDirectory)'==''">true</CopyBuildOutputToOutputDirectory>
890 <CopyOutputSymbolsToOutputDirectory Condition="'$(CopyOutputSymbolsToOutputDirectory)'==''">true</CopyOutputSymbolsToOutputDirectory>
891 <FullIntermediateOutputPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath)))</FullIntermediateOutputPath>
892 </PropertyGroup>
893
894 <!-- Add the target output to the list to be copied. -->
895 <ItemGroup>
896 <_FullPathToCopy Include="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetFileName)" />
897 </ItemGroup>
898
899 <!-- Add the bound content output files to the list to be copied. -->
900 <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
901 <Output TaskParameter="BuiltContentOutputs" ItemName="_FullPathToCopy" />
902 <Output TaskParameter="CopiedOutputs" ItemName="_FullPathToCopy" />
903 </ReadTracking>
904
905 <ItemGroup>
906 <_RelativePath Include="$([MSBuild]::MakeRelative(&quot;$(FullIntermediateOutputPath)&quot;, &quot;%(_FullPathToCopy.FullPath)&quot;))" />
907 </ItemGroup>
908
909 <Copy
910 SourceFiles="@(_RelativePath->'$(IntermediateOutputPath)%(Identity)')"
911 DestinationFiles="@(_RelativePath->'$(OutDir)%(Identity)')"
912 SkipUnchangedFiles="$(SkipCopyUnchangedFiles)"
913 OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
914 Retries="$(CopyRetryCount)"
915 RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
916 UseHardlinksIfPossible="$(CreateHardLinksForCopyFilesToOutputDirectoryIfPossible)"
917 UseSymboliclinksIfPossible="$(CreateSymbolicLinksForCopyFilesToOutputDirectoryIfPossible)"
918 ErrorIfLinkFails="$(ErrorIfLinkFailsForCopyFilesToOutputDirectory)"
919 Condition="'$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)' != 'true'">
920
921 <Output TaskParameter="DestinationFiles" ItemName="MainAssembly"/>
922 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
923 </Copy>
924
925 <Message Importance="High" Text="$(MSBuildProjectName) -&gt; $(TargetPath)" Condition="'$(CopyBuildOutputToOutputDirectory)' == 'true' and '$(SkipCopyBuildProduct)'!='true'" />
926
927 <!-- Copy the debug information file (.wixpdb), if any -->
928 <Copy
929 SourceFiles="$(IntermediateOutputPath)%(CultureGroup.OutputFolder)$(TargetPdbFileName)"
930 DestinationFiles="$(TargetPdbDir)%(CultureGroup.OutputFolder)$(TargetPdbFileName)"
931 SkipUnchangedFiles="$(SkipCopyUnchangedFiles)"
932 OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
933 Retries="$(CopyRetryCount)"
934 RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
935 UseHardlinksIfPossible="$(CreateHardLinksForCopyFilesToOutputDirectoryIfPossible)"
936 Condition="'$(_DebugSymbolsProduced)'=='true' and '$(SkipCopyingSymbolsToOutputDirectory)' != 'true' and '$(CopyOutputSymbolsToOutputDirectory)'=='true'">
937
938 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
939
940 </Copy>
941 </Target>
942
943 <Import Project="WixToolset.Signing.targets" Condition=" '$(WixSigningTargetsImported)' != 'true' " />
944
945 <!-- Extension point: Define CustomAfterWixTargets to a .targets file that you want to include after this file. -->
946 <Import Project="$(CustomAfterWixTargets)" Condition=" '$(CustomAfterWixTargets)' != '' and Exists('$(CustomAfterWixTargets)')" />
947
948 <PropertyGroup>
949 <DefaultItemExcludes Condition=" '$(BaseOutputPath)' != '' ">$(DefaultItemExcludes);$(BaseOutputPath)**</DefaultItemExcludes>
950 <DefaultItemExcludes Condition=" '$(BaseIntermediateOutputPath)' != '' ">$(DefaultItemExcludes);$(BaseIntermediateOutputPath)**</DefaultItemExcludes>
951 <DefaultExcludesInProjectFolder>$(DefaultItemExcludesInProjectFolder);**/.*/**</DefaultExcludesInProjectFolder>
952 </PropertyGroup>
953
954 <ImportGroup>
955 <Import Project="$(MSBuildUserExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportAfter\*" Condition="'$(ImportUserLocationsByWildcardAfterWixToolsetTargets)' != 'false' and Exists('$(MSBuildUserExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportAfter')" />
956 <Import Project="$(MSBuildExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportAfter\*" Condition="'$(ImportByWildcardAfterWixToolsetTargets)' != 'false' and Exists('$(MSBuildExtensionsPath)\WixToolset\$(WixToolsetMajorMinorVersion)\Imports\WixToolset.targets\ImportAfter')" />
957 </ImportGroup>
958 </Project>