@joebigelow / wix-1 / commits / eff9d420

Introducing the WiX Standard Library

Completes 7914

Rob Mensching committed Dec 6, 2023 at 19:48 UTC eff9d4204880535f821827e5aece5068402358f6
18 files changed +292 -267
src/api/wix/WixToolset.Data/Intermediate.cs
+3 -1
@@ -215,9 +215,11 @@ namespace WixToolset.Data
215 /// Updates the intermediate level to the specified level.
216 /// </summary>
217 /// <param name="level">Intermediate level.</param>
218 - public void UpdateLevel(string level)
218 + public Intermediate UpdateLevel(string level)
219 {
220 this.Level = String.IsNullOrEmpty(this.Level) ? level : String.Concat(this.Level, ";", level);
221 +
222 + return this;
223 }
224
225 /// <summary>
src/api/wix/WixToolset.Data/IntermediateSection.cs
+3 -1
@@ -70,9 +70,11 @@ namespace WixToolset.Data
70 /// Assigns the section to a library.
71 /// </summary>
72 /// <param name="libraryId">Identifier of the library.</param>
73 - public void AssignToLibrary(string libraryId)
73 + public IntermediateSection AssignToLibrary(string libraryId)
74 {
75 this.LibraryId = libraryId;
76 +
77 + return this;
78 }
79
80 /// <summary>
src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs
+69 -46
@@ -11,7 +11,6 @@ namespace WixToolset.Data.WindowsInstaller
11 {
12 private static readonly Dictionary<string, WixActionSymbol> standardActionsById;
13 private static readonly HashSet<string> standardActionNames;
14 - private static readonly Dictionary<string, DirectorySymbol> standardDirectoriesById;
14
15 /// <summary>
16 /// References:
@@ -208,6 +207,41 @@ namespace WixToolset.Data.WindowsInstaller
207 "WindowsVolume",
208 };
209
210 + private static readonly Dictionary<string, string> standardDirectoryNamesById = new Dictionary<string, string>
211 + {
212 + ["TARGETDIR"] = "SourceDir",
213 + ["AdminToolsFolder"] = "Admin",
214 + ["AppDataFolder"] = "AppData",
215 + ["CommonAppDataFolder"] = "CommApp",
216 + ["CommonFilesFolder"] = "CFiles",
217 + ["CommonFiles64Folder"] = "CFiles64",
218 + ["CommonFiles6432Folder"] = ".",
219 + ["DesktopFolder"] = "Desktop",
220 + ["FavoritesFolder"] = "Favs",
221 + ["FontsFolder"] = "Fonts",
222 + ["LocalAppDataFolder"] = "LocalApp",
223 + ["MyPicturesFolder"] = "Pictures",
224 + ["NetHoodFolder"] = "NetHood",
225 + ["PersonalFolder"] = "Personal",
226 + ["PrintHoodFolder"] = "Printers",
227 + ["ProgramFilesFolder"] = "PFiles",
228 + ["ProgramFiles64Folder"] = "PFiles64",
229 + ["ProgramFiles6432Folder"] = ".",
230 + ["ProgramMenuFolder"] = "PMenu",
231 + ["RecentFolder"] = "Recent",
232 + ["SendToFolder"] = "SendTo",
233 + ["StartMenuFolder"] = "StrtMenu",
234 + ["StartupFolder"] = "StartUp",
235 + ["SystemFolder"] = "System",
236 + ["System16Folder"] = "System16",
237 + ["System64Folder"] = "System64",
238 + ["System6432Folder"] = ".",
239 + ["TempFolder"] = "Temp",
240 + ["TemplateFolder"] = "Template",
241 + ["WindowsFolder"] = "Windows",
242 + };
243 +
244 +
245 static WindowsInstallerStandard()
246 {
247 var standardActions = new[]
@@ -332,43 +366,8 @@ namespace WixToolset.Data.WindowsInstaller
366 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.InstallExecuteSequence },
367 };
368
335 - var standardDirectories = new[]
336 - {
337 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TARGETDIR")) { Name = "SourceDir" },
338 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "AdminToolsFolder")) { Name = "Admin" },
339 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "AppDataFolder")) { Name = "AppData" },
340 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonAppDataFolder")) { Name = "CommApp" },
341 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFilesFolder")) { Name = "CFiles" },
342 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFiles64Folder")) { Name = "CFiles64" },
343 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFiles6432Folder")) { Name = "." },
344 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "DesktopFolder")) { Name = "Desktop" },
345 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "FavoritesFolder")) { Name = "Favs" },
346 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "FontsFolder")) { Name = "Fonts" },
347 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "LocalAppDataFolder")) { Name = "LocalApp" },
348 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "MyPicturesFolder")) { Name = "Pictures" },
349 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "NetHoodFolder")) { Name = "NetHood" },
350 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "PersonalFolder")) { Name = "Personal" },
351 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "PrintHoodFolder")) { Name = "Printers" },
352 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFilesFolder")) { Name = "PFiles" },
353 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFiles64Folder")) { Name = "PFiles64" },
354 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFiles6432Folder")) { Name = "." },
355 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramMenuFolder")) { Name = "PMenu" },
356 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "RecentFolder")) { Name = "Recent" },
357 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "SendToFolder")) { Name = "SendTo" },
358 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "StartMenuFolder")) { Name = "StrtMenu" },
359 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "StartupFolder")) { Name = "StartUp" },
360 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "SystemFolder")) { Name = "System" },
361 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System16Folder")) { Name = "System16" },
362 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System64Folder")) { Name = "System64" },
363 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System6432Folder")) { Name = "." },
364 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TempFolder")) { Name = "Temp" },
365 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TemplateFolder")) { Name = "Template" },
366 - new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "WindowsFolder")) { Name = "Windows" },
367 - };
368 -
369 standardActionNames = new HashSet<string>(standardActions.Select(a => a.Action));
370 standardActionsById = standardActions.ToDictionary(a => a.Id.Id);
371 - standardDirectoriesById = standardDirectories.ToDictionary(d => d.Id.Id);
371 }
372
373 /// <summary>
@@ -376,17 +375,26 @@ namespace WixToolset.Data.WindowsInstaller
375 /// </summary>
376 /// <param name="actionName">Name of the action.</param>
377 /// <returns>true if the action is standard, false otherwise.</returns>
379 - public static bool IsStandardAction(string actionName) => standardActionNames.Contains(actionName);
378 + public static bool IsStandardAction(string actionName)
379 + {
380 + return standardActionNames.Contains(actionName);
381 + }
382
383 /// <summary>
384 /// Standard actions.
385 /// </summary>
384 - public static IReadOnlyCollection<WixActionSymbol> StandardActions() => standardActionsById.Values;
386 + public static IReadOnlyCollection<WixActionSymbol> StandardActions()
387 + {
388 + return standardActionsById.Values;
389 + }
390
391 /// <summary>
387 - /// Standard directories.
392 + /// Standard directory identifiers.
393 /// </summary>
389 - public static IReadOnlyCollection<DirectorySymbol> StandardDirectories() => standardDirectoriesById.Values;
394 + public static IReadOnlyCollection<string> StandardDirectoryIds()
395 + {
396 + return standardDirectoryNamesById.Keys;
397 + }
398
399 /// <summary>
400 /// Gets the platform specific directory id for a directory. Most directories are not platform
@@ -418,28 +426,43 @@ namespace WixToolset.Data.WindowsInstaller
426 /// </summary>
427 /// <param name="directoryId">Name of the directory.</param>
428 /// <returns>true if the directory is standard, false otherwise.</returns>
421 - public static bool IsStandardDirectory(string directoryId) => standardDirectoriesById.ContainsKey(directoryId);
429 + public static bool IsStandardDirectory(string directoryId)
430 + {
431 + return standardDirectoryNamesById.ContainsKey(directoryId);
432 + }
433
434 /// <summary>
435 /// Find out if a property is a standard property.
436 /// </summary>
437 /// <param name="propertyName">Name of the property.</param>
438 /// <returns>true if a property is standard, false otherwise.</returns>
428 - public static bool IsStandardProperty(string propertyName) => standardProperties.Contains(propertyName);
439 + public static bool IsStandardProperty(string propertyName)
440 + {
441 + return standardProperties.Contains(propertyName);
442 + }
443
444 /// <summary>
445 /// Try to get standard action by id.
446 /// </summary>
433 - public static bool TryGetStandardAction(string id, out WixActionSymbol standardAction) => standardActionsById.TryGetValue(id, out standardAction);
447 + public static bool TryGetStandardAction(string id, out WixActionSymbol standardAction)
448 + {
449 + return standardActionsById.TryGetValue(id, out standardAction);
450 + }
451
452 /// <summary>
453 /// Try to get standard action by sequence and action name.
454 /// </summary>
438 - public static bool TryGetStandardAction(string sequenceName, string actioname, out WixActionSymbol standardAction) => standardActionsById.TryGetValue(String.Concat(sequenceName, "/", actioname), out standardAction);
455 + public static bool TryGetStandardAction(string sequenceName, string actioname, out WixActionSymbol standardAction)
456 + {
457 + return standardActionsById.TryGetValue(String.Concat(sequenceName, "/", actioname), out standardAction);
458 + }
459
460 /// <summary>
441 - /// Try to get standard directory symbol by id.
461 + /// Try to get standard directory name by id.
462 /// </summary>
443 - public static bool TryGetStandardDirectory(string directoryId, out DirectorySymbol symbol) => standardDirectoriesById.TryGetValue(directoryId, out symbol);
463 + public static bool TryGetStandardDirectoryName(string directoryId, out string name)
464 + {
465 + return standardDirectoryNamesById.TryGetValue(directoryId, out name);
466 + }
467 }
468 }
src/api/wix/WixToolset.Data/WixStandardLibrary.cs new
+152
@@ -0,0 +1,152 @@
1 +// 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.
2 +
3 +namespace WixToolset.Data
4 +{
5 + using System;
6 + using System.Collections.Generic;
7 + using System.Linq;
8 + using WixToolset.Data.Bind;
9 + using WixToolset.Data.Symbols;
10 + using WixToolset.Data.WindowsInstaller;
11 +
12 + /// <summary>
13 + /// WiX Standard Library implementation.
14 + /// </summary>
15 + public static class WixStandardLibrary
16 + {
17 + private const string WixStandardLibraryId = "wixstd";
18 +
19 + /// <summary>
20 + /// Build the wixstd.wixlib Intermediate.
21 + /// </summary>
22 + /// <param name="platform">Target platform for the wixstd.wixlib</param>
23 + /// <returns>Intermediate containing the wixstd.wixlib.</returns>
24 + public static Intermediate Build(Platform platform)
25 + {
26 + var localizations = YieldLocalizations();
27 +
28 + var sections = YieldSections(platform);
29 +
30 + return new Intermediate(WixStandardLibraryId, IntermediateLevels.Combined, sections, localizations.ToDictionary(l => l.Culture, StringComparer.OrdinalIgnoreCase));
31 + }
32 +
33 + private static IEnumerable<Localization> YieldLocalizations()
34 + {
35 + var strings = new BindVariable[0];
36 +
37 + var localizedControls = new LocalizedControl[0];
38 +
39 + yield return new Localization(LocalizationLocation.Library, null, null, String.Empty, strings.ToDictionary(s => s.Id), localizedControls.ToDictionary(l => l.GetKey()));
40 + }
41 +
42 + private static IEnumerable<IntermediateSection> YieldSections(Platform platform)
43 + {
44 + var sourceLineNumber = new SourceLineNumber("wixstd.wixlib");
45 +
46 + // Actions.
47 + foreach (var actionSymbol in WindowsInstallerStandard.StandardActions())
48 + {
49 + var symbol = new WixActionSymbol(sourceLineNumber, new Identifier(actionSymbol.Id.Access, actionSymbol.Id.Id))
50 + {
51 + Action = actionSymbol.Action,
52 + SequenceTable = actionSymbol.SequenceTable,
53 + Sequence = actionSymbol.Sequence,
54 + Condition = actionSymbol.Condition,
55 + };
56 +
57 + var section = CreateSectionAroundSymbol(symbol);
58 +
59 + yield return section;
60 + }
61 +
62 + // Directories.
63 + foreach (var id in WindowsInstallerStandard.StandardDirectoryIds())
64 + {
65 + var symbol = new DirectorySymbol(sourceLineNumber, new Identifier(AccessModifier.Virtual, id))
66 + {
67 + ParentDirectoryRef = GetStandardDirectoryParent(id, platform),
68 + Name = WindowsInstallerStandard.TryGetStandardDirectoryName(id, out var name) ? name : throw new InvalidOperationException("Standard directories must have a default name")
69 + };
70 +
71 + var section = CreateSectionAroundSymbol(symbol);
72 +
73 + // Add a reference for the more complicated parent directory references.
74 + if (symbol.ParentDirectoryRef != null && symbol.ParentDirectoryRef != "TARGEDIR")
75 + {
76 + section.AddSymbol(new WixSimpleReferenceSymbol(sourceLineNumber)
77 + {
78 + Table = "Directory",
79 + PrimaryKeys = symbol.ParentDirectoryRef
80 + });
81 + }
82 +
83 + yield return section;
84 + }
85 +
86 + // Package References.
87 + {
88 + var section = CreateSection(WixStandardLibraryIdentifiers.WixStandardPackageReferences);
89 +
90 + section.AddSymbol(new WixFragmentSymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardLibraryIdentifiers.WixStandardPackageReferences)));
91 +
92 + section.AddSymbol(new WixSimpleReferenceSymbol(sourceLineNumber)
93 + {
94 + Table = SymbolDefinitions.Directory.Name,
95 + PrimaryKeys = "TARGETDIR"
96 + });
97 +
98 + yield return section;
99 + }
100 +
101 + // Module References.
102 + {
103 + var section = CreateSection(WixStandardLibraryIdentifiers.WixStandardModuleReferences);
104 +
105 + section.AddSymbol(new WixFragmentSymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardLibraryIdentifiers.WixStandardModuleReferences)));
106 +
107 + section.AddSymbol(new WixSimpleReferenceSymbol(sourceLineNumber)
108 + {
109 + Table = SymbolDefinitions.Directory.Name,
110 + PrimaryKeys = "TARGETDIR"
111 + });
112 +
113 + yield return section;
114 + }
115 + }
116 +
117 + private static IntermediateSection CreateSection(string sectionId)
118 + {
119 + return new IntermediateSection(sectionId, SectionType.Fragment, WixStandardLibraryId).AssignToLibrary(WixStandardLibraryId);
120 + }
121 +
122 + private static IntermediateSection CreateSectionAroundSymbol(IntermediateSymbol symbol)
123 + {
124 + var section = CreateSection(symbol.Id.Id);
125 +
126 + section.AddSymbol(symbol);
127 +
128 + return section;
129 + }
130 +
131 + private static string GetStandardDirectoryParent(string directoryId, Platform platform)
132 + {
133 + switch (directoryId)
134 + {
135 + case "TARGETDIR":
136 + return null;
137 +
138 + case "CommonFiles6432Folder":
139 + return platform == Platform.X86 ? "CommonFilesFolder" : "CommonFiles64Folder";
140 +
141 + case "ProgramFiles6432Folder":
142 + return platform == Platform.X86 ? "ProgramFilesFolder" : "ProgramFiles64Folder";
143 +
144 + case "System6432Folder":
145 + return platform == Platform.X86 ? "SystemFolder" : "System64Folder";
146 +
147 + default:
148 + return "TARGETDIR";
149 + }
150 + }
151 + }
152 +}
src/api/wix/WixToolset.Data/WixStandardLibraryIdentifiers.cs new
+20
@@ -0,0 +1,20 @@
1 +// 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.
2 +
3 +namespace WixToolset.Data
4 +{
5 + /// <summary>
6 + /// Well-known identifier names from the wixstd.wixlib.
7 + /// </summary>
8 + public static class WixStandardLibraryIdentifiers
9 + {
10 + /// <summary>
11 + /// WiX Standard references for packages.
12 + /// </summary>
13 + public static readonly string WixStandardPackageReferences = "WixStandardPackageReferences";
14 +
15 + /// <summary>
16 + /// WiX Standard references for modules.
17 + /// </summary>
18 + public static readonly string WixStandardModuleReferences = "WixStandardModuleReferences";
19 + }
20 +}
src/api/wix/WixToolset.Extensibility/Data/ILinkContext.cs
+10
@@ -47,6 +47,16 @@ namespace WixToolset.Extensibility.Data
47 /// </summary>
48 string OutputPath { get; set; }
49
50 + /// <summary>
51 + /// Gets or sets the platform for the output.
52 + /// </summary>
53 + Platform Platform { get; set; }
54 +
55 + /// <summary>
56 + /// Gets or sets whether to skip the standard wixlib.
57 + /// </summary>
58 + bool SkipStdWixlib { get; set; }
59 +
60 /// <summary>
61 /// Symbol definition creator used to load extension data.
62 /// </summary>
src/ext/UI/wixlib/WixUI_Minimal.wxs
-1
@@ -59,7 +59,6 @@ Patch dialog sequence:
59
60 <InstallUISequence>
61 <Show Dialog="override WelcomeDlg" Before="WelcomeEulaDlg" Condition="Installed AND PATCH" />
62 - <Show Dialog="override WelcomeEulaDlg" Before="ProgressDlg" Condition="NOT Installed" />
62 </InstallUISequence>
63
64 <Property Id="ARPNOMODIFY" Value="1" />
src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
+3 -3
@@ -550,11 +550,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
550 }
551 else
552 {
553 - foreach (var standardDirectory in WindowsInstallerStandard.StandardDirectories())
553 + foreach (var standardDirectoryId in WindowsInstallerStandard.StandardDirectoryIds())
554 {
555 - if (directoryId.StartsWith(standardDirectory.Id.Id, StringComparison.Ordinal))
555 + if (directoryId.StartsWith(standardDirectoryId, StringComparison.Ordinal))
556 {
557 - this.Messaging.Write(WarningMessages.StandardDirectoryConflictInMergeModule(symbol.SourceLineNumbers, directoryId, standardDirectory.Id.Id));
557 + this.Messaging.Write(WarningMessages.StandardDirectoryConflictInMergeModule(symbol.SourceLineNumbers, directoryId, standardDirectoryId));
558 }
559 }
560 }
src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+2 -2
@@ -2280,10 +2280,10 @@ namespace WixToolset.Core.WindowsInstaller.Decompile
2280 xDirectory = xDirectory.Parent;
2281 }
2282
2283 - if (xDirectory?.Name.LocalName == "StandardDirectory" && WindowsInstallerStandard.TryGetStandardDirectory(xDirectory.Attribute("Id").Value, out var standardDirectory))
2283 + if (xDirectory?.Name.LocalName == "StandardDirectory" && WindowsInstallerStandard.TryGetStandardDirectoryName(xDirectory.Attribute("Id").Value, out var standardDirectoryName))
2284 {
2285 sourcePath.Insert(0, Path.DirectorySeparatorChar);
2286 - sourcePath.Insert(0, standardDirectory.Name);
2286 + sourcePath.Insert(0, standardDirectoryName);
2287 }
2288
2289 return sourcePath.ToString();
src/wix/WixToolset.Core/CommandLine/BuildCommand.cs
+9
@@ -61,6 +61,7 @@ namespace WixToolset.Core.CommandLine
61 new CommandLineHelpSwitch("-loc", "Localization file to use in the build. By default, .wxl files are recognized as localization."),
62 new CommandLineHelpSwitch("-lib", "Library file to use in the build. By default, .wixlib files are recognized as libraries."),
63 new CommandLineHelpSwitch("-src", "Source file to use in the build. By default, .wxs files are recognized as source code."),
64 + new CommandLineHelpSwitch("-nostdlib", "Skip use of WiX standard wixlib."),
65 new CommandLineHelpSwitch("-out", "-o", "Path to output the build to."),
66 new CommandLineHelpSwitch("-outputtype", "Explicitly set the output type if it cannot be determined from the output."),
67 new CommandLineHelpSwitch("-pdb", "Optional path to output .wixpdb. Default will write .wixpdb beside output path."),
@@ -278,6 +279,8 @@ namespace WixToolset.Core.CommandLine
279 context.IntermediateFolder = this.IntermediateFolder;
280 context.Intermediates = intermediates.Concat(libraries).ToList();
281 context.OutputPath = this.OutputPath;
282 + context.Platform = this.Platform;
283 + context.SkipStdWixlib = this.commandLine.SkipStdWixlib;
284 context.SymbolDefinitionCreator = creator;
285 context.CancellationToken = cancellationToken;
286
@@ -530,6 +533,8 @@ namespace WixToolset.Core.CommandLine
533
534 public string TrackingFile { get; private set; }
535
536 + public bool SkipStdWixlib { get; set; }
537 +
538 public bool ResetAcls { get; set; }
539
540 public CommandLine(IServiceProvider serviceProvider, IMessaging messaging)
@@ -685,6 +690,10 @@ namespace WixToolset.Core.CommandLine
690 parser.GetNextArgumentAsFilePathOrError(arg, "source code", this.SourceFilePaths);
691 return true;
692
693 + case "nostdlib":
694 + this.SkipStdWixlib = true;
695 + return true;
696 +
697 case "o":
698 case "out":
699 this.OutputFile = parser.GetNextArgumentAsFilePathOrError(arg, "output file");
src/wix/WixToolset.Core/Compiler.cs
+1 -1
@@ -7129,7 +7129,7 @@ namespace WixToolset.Core
7129 }
7130 else if (!WindowsInstallerStandard.IsStandardDirectory(id))
7131 {
7132 - this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Id", id, String.Join(", \"", WindowsInstallerStandard.StandardDirectories().Select(d => d.Id.Id))));
7132 + this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Id", id, String.Join(", \"", WindowsInstallerStandard.StandardDirectoryIds())));
7133 }
7134
7135 foreach (var child in node.Elements())
src/wix/WixToolset.Core/Compiler_Module.cs
+2
@@ -285,6 +285,8 @@ namespace WixToolset.Core
285 }
286
287 this.ValidateAndAddCommonSummaryInformationSymbols(sourceLineNumbers, msiVersion, platform, this.activeLanguage);
288 +
289 + this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixFragment, WixStandardLibraryIdentifiers.WixStandardModuleReferences);
290 }
291 }
292 finally
src/wix/WixToolset.Core/Compiler_Package.cs
+2
@@ -423,6 +423,8 @@ namespace WixToolset.Core
423 SymbolPaths = symbols,
424 });
425 }
426 +
427 + this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixFragment, WixStandardLibraryIdentifiers.WixStandardPackageReferences);
428 }
429 }
430 finally
src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs deleted
-130
@@ -1,130 +0,0 @@
1 -// 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.
2 -
3 -namespace WixToolset.Core.Link
4 -{
5 - using System;
6 - using System.Collections.Generic;
7 - using System.Linq;
8 - using WixToolset.Data;
9 - using WixToolset.Data.Symbols;
10 - using WixToolset.Data.WindowsInstaller;
11 -
12 - /// <summary>
13 - /// Add referenced standard directory symbols, if not already present.
14 - /// </summary>
15 - internal class AddRequiredStandardDirectories
16 - {
17 - public AddRequiredStandardDirectories(IntermediateSection section, List<WixSimpleReferenceSymbol> references)
18 - {
19 - this.Section = section;
20 - this.References = references;
21 - }
22 -
23 - private IntermediateSection Section { get; }
24 -
25 - private List<WixSimpleReferenceSymbol> References { get; }
26 -
27 - public void Execute()
28 - {
29 - var platform = this.GetPlatformFromSection();
30 -
31 - var directories = this.Section.Symbols.OfType<DirectorySymbol>().ToList();
32 - var directoryIds = new SortedSet<string>(directories.Select(d => d.Id.Id));
33 -
34 - // Ensure any standard directory references symbols are added.
35 - foreach (var directoryReference in this.References.Where(r => r.Table == "Directory"))
36 - {
37 - this.EnsureStandardDirectoryAdded(directoryIds, directoryReference.PrimaryKeys, directoryReference.SourceLineNumbers, platform);
38 - }
39 -
40 - foreach (var directory in directories)
41 - {
42 - var parentDirectoryId = directory.ParentDirectoryRef;
43 -
44 - if (String.IsNullOrEmpty(parentDirectoryId))
45 - {
46 - parentDirectoryId = this.GetStandardDirectoryParent(directory.Id.Id, platform);
47 -
48 - directory.ParentDirectoryRef = parentDirectoryId;
49 -
50 - //if (directory.Id.Id != "TARGETDIR")
51 - //{
52 - // directory.ParentDirectoryRef = "TARGETDIR";
53 - //}
54 - }
55 -
56 - if (!String.IsNullOrEmpty(parentDirectoryId))
57 - {
58 - this.EnsureStandardDirectoryAdded(directoryIds, parentDirectoryId, directory.SourceLineNumbers, platform);
59 - }
60 - }
61 -
62 - if (!directoryIds.Contains("TARGETDIR") && WindowsInstallerStandard.TryGetStandardDirectory("TARGETDIR", out var targetDir))
63 - {
64 - directoryIds.Add(targetDir.Id.Id);
65 - this.Section.AddSymbol(targetDir);
66 - }
67 - }
68 -
69 - private void EnsureStandardDirectoryAdded(ISet<string> directoryIds, string directoryId, SourceLineNumber sourceLineNumbers, Platform platform)
70 - {
71 - if (!directoryIds.Contains(directoryId) && WindowsInstallerStandard.TryGetStandardDirectory(directoryId, out var standardDirectory))
72 - {
73 - var parentDirectoryId = this.GetStandardDirectoryParent(directoryId, platform);
74 -
75 - var directory = new DirectorySymbol(sourceLineNumbers, standardDirectory.Id)
76 - {
77 - Name = standardDirectory.Name,
78 - ParentDirectoryRef = parentDirectoryId,
79 - };
80 -
81 - directoryIds.Add(directory.Id.Id);
82 - this.Section.AddSymbol(directory);
83 -
84 - if (!String.IsNullOrEmpty(parentDirectoryId))
85 - {
86 - this.EnsureStandardDirectoryAdded(directoryIds, parentDirectoryId, sourceLineNumbers, platform);
87 - }
88 - }
89 - }
90 -
91 - private string GetStandardDirectoryParent(string directoryId, Platform platform)
92 - {
93 - switch (directoryId)
94 - {
95 - case "TARGETDIR":
96 - return null;
97 -
98 - case "CommonFiles6432Folder":
99 - case "ProgramFiles6432Folder":
100 - case "System6432Folder":
101 - return WindowsInstallerStandard.GetPlatformSpecificDirectoryId(directoryId, platform);
102 -
103 - default:
104 - return "TARGETDIR";
105 - }
106 - }
107 -
108 - private Platform GetPlatformFromSection()
109 - {
110 - var symbol = this.Section.Symbols.OfType<SummaryInformationSymbol>().First(p => p.PropertyId == SummaryInformationType.PlatformAndLanguage);
111 -
112 - var value = symbol.Value;
113 - var separatorIndex = value.IndexOf(';');
114 - var platformValue = separatorIndex > 0 ? value.Substring(0, separatorIndex) : value;
115 -
116 - switch (platformValue)
117 - {
118 - case "x64":
119 - return Platform.X64;
120 -
121 - case "Arm64":
122 - return Platform.ARM64;
123 -
124 - case "Intel":
125 - default:
126 - return Platform.X86;
127 - }
128 - }
129 - }
130 -}
src/wix/WixToolset.Core/LinkContext.cs
+4
@@ -30,6 +30,10 @@ namespace WixToolset.Core
30
31 public string OutputPath { get; set; }
32
33 + public Platform Platform { get; set; }
34 +
35 + public bool SkipStdWixlib { get; set; }
36 +
37 public ISymbolDefinitionCreator SymbolDefinitionCreator { get; set; }
38
39 public CancellationToken CancellationToken { get; set; }
src/wix/WixToolset.Core/Linker.cs
+8 -78
@@ -11,7 +11,6 @@ namespace WixToolset.Core
11 using WixToolset.Core.Link;
12 using WixToolset.Data;
13 using WixToolset.Data.Symbols;
14 - using WixToolset.Data.WindowsInstaller;
14 using WixToolset.Extensibility.Data;
15 using WixToolset.Extensibility.Services;
16
@@ -98,8 +97,13 @@ namespace WixToolset.Core
97 }
98 }
99
101 - // TODO: Replace this with "std.wixlib"
102 - this.LoadStandardSymbols(sections);
100 + // Load the standard wixlib.
101 + if (!this.Context.SkipStdWixlib)
102 + {
103 + var stdlib = WixStandardLibrary.Build(this.Context.Platform);
104 +
105 + sections.AddRange(stdlib.Sections);
106 + }
107
108 var multipleFeatureComponents = new Hashtable();
109
@@ -122,9 +126,6 @@ namespace WixToolset.Core
126 }
127 }
128
125 - ////// Add the missing standard action and directory symbols.
126 - ////this.LoadStandardSymbols(find.SymbolsByName);
127 -
129 // Resolve the symbol references to find the set of sections we care about for linking.
130 // Of course, we start with the entry section (that's how it got its name after all).
131 var resolve = new ResolveReferencesCommand(this.Messaging, find.EntrySection, find.SymbolsByName);
@@ -187,7 +188,6 @@ namespace WixToolset.Core
188 // Create a new section to hold the linked content. Start with the entry section's
189 // metadata.
190 var resolvedSection = new IntermediateSection(find.EntrySection.Id, find.EntrySection.Type);
190 - var references = new List<WixSimpleReferenceSymbol>();
191 var identicalDirectoryIds = new HashSet<string>(StringComparer.Ordinal);
192
193 foreach (var section in sections)
@@ -263,13 +263,9 @@ namespace WixToolset.Core
263 }
264 break;
265
266 - case SymbolDefinitionType.WixComplexReference:
267 - copySymbol = false;
268 - break;
269 -
266 case SymbolDefinitionType.WixSimpleReference:
267 + case SymbolDefinitionType.WixComplexReference:
268 copySymbol = false;
272 - references.Add(symbol as WixSimpleReferenceSymbol);
269 break;
270
271 case SymbolDefinitionType.WixVariable:
@@ -310,12 +306,6 @@ namespace WixToolset.Core
306 var command = new FlattenAndProcessBundleTablesCommand(resolvedSection, this.Messaging);
307 command.Execute();
308 }
313 - else if (resolvedSection.Type == SectionType.Package || resolvedSection.Type == SectionType.Module)
314 - {
315 - // Packages and modules get standard directories add.
316 - var command = new AddRequiredStandardDirectories(resolvedSection, references);
317 - command.Execute();
318 - }
309
310 if (this.Messaging.EncounteredError)
311 {
@@ -364,66 +354,6 @@ namespace WixToolset.Core
354 }
355 }
356
367 - /// <summary>
368 - /// Load the standard action and directory symbols.
369 - /// </summary>
370 - /// <param name="symbolsByName">Collection of symbols.</param>
371 - //private void LoadStandardSymbols(IDictionary<string, SymbolWithSection> symbolsByName)
372 - //{
373 - // foreach (var actionSymbol in WindowsInstallerStandard.StandardActions())
374 - // {
375 - // var symbolWithSection = new SymbolWithSection(null, actionSymbol);
376 - // var fullName = symbolWithSection.GetFullName();
377 -
378 - // // If the action's symbol has not already been defined (i.e. overriden by the user), add it now.
379 - // if (!symbolsByName.ContainsKey(fullName))
380 - // {
381 - // symbolsByName.Add(fullName, symbolWithSection);
382 - // }
383 - // }
384 -
385 - // foreach (var directorySymbol in WindowsInstallerStandard.StandardDirectories())
386 - // {
387 - // var symbolWithSection = new SymbolWithSection(null, directorySymbol);
388 - // var fullName = symbolWithSection.GetFullName();
389 -
390 - // // If the directory's symbol has not already been defined (i.e. overriden by the user), add it now.
391 - // if (!symbolsByName.ContainsKey(fullName))
392 - // {
393 - // symbolsByName.Add(fullName, symbolWithSection);
394 - // }
395 - // }
396 - //}
397 -
398 - private void LoadStandardSymbols(List<IntermediateSection> sections)
399 - {
400 - foreach (var actionSymbol in WindowsInstallerStandard.StandardActions())
401 - {
402 - var section = new IntermediateSection(actionSymbol.Id.Id, SectionType.Fragment);
403 - section.AddSymbol(new WixActionSymbol(null, new Identifier(actionSymbol.Id.Access, actionSymbol.Id.Id))
404 - {
405 - Action = actionSymbol.Action,
406 - SequenceTable = actionSymbol.SequenceTable,
407 - Sequence = actionSymbol.Sequence,
408 - Condition = actionSymbol.Condition,
409 - });
410 -
411 - sections.Add(section);
412 - }
413 -
414 - foreach (var directorySymbol in WindowsInstallerStandard.StandardDirectories())
415 - {
416 - var section = new IntermediateSection(directorySymbol.Id.Id, SectionType.Fragment);
417 - section.AddSymbol(new DirectorySymbol(null, new Identifier(directorySymbol.Id.Access, directorySymbol.Id.Id))
418 - {
419 - Name = directorySymbol.Name
420 - });
421 -
422 - sections.Add(section);
423 - }
424 - }
425 -
426 -
357 /// <summary>
358 /// Process the complex references.
359 /// </summary>
src/wix/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs
+1
@@ -35,6 +35,7 @@ namespace WixToolsetTest.CoreIntegration
35 context.IntermediateFolder = Path.GetTempPath();
36 context.Intermediates = new[] { intermediate1, intermediate2 };
37 context.OutputPath = Path.Combine(context.IntermediateFolder, "test.msi");
38 + context.Platform = Platform.X64;
39 context.SymbolDefinitionCreator = creator;
40
41 var linker = serviceProvider.GetService<ILinker>();
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs
+3 -4
@@ -1,4 +1,4 @@
1 -<?define Foo = "Foo" ?>
1 +<?define Foo = "Foo" ?>
2 <?define Foo = "Foo" ?>
3
4 <?define Bar = "Bar" ?>
@@ -12,7 +12,6 @@
12
13 <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
14 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="no" InstallerVersion="200" Scope="perMachine">
15 -
15
16 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
17
@@ -22,8 +21,8 @@
21 </Package>
22
23 <Fragment>
25 - <Directory Id="TARGETDIR" Name="SourceDir">
26 - <Directory Id="ProgramFilesFolder">
24 + <Directory Id="override TARGETDIR" Name="SourceDir">
25 + <Directory Id="override ProgramFilesFolder">
26 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
27 </Directory>
28 </Directory>