diff options
author | Staffan Gustafsson <staffangu@outlook.com> | 2022-11-30 17:15:12 +0100 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2023-01-18 18:10:56 -0600 |
commit | 853887b4e84df1965794802b7683f3a9aca3e930 (patch) | |
tree | c2db272b63381c94186712c0029ed0e000ec3391 /src/ext/NetFx/wixext/NetFxCompiler.cs | |
parent | 9f368d76848e31d21ec3c193fa8c92849b1362a1 (diff) | |
download | wix-853887b4e84df1965794802b7683f3a9aca3e930.tar.gz wix-853887b4e84df1965794802b7683f3a9aca3e930.tar.bz2 wix-853887b4e84df1965794802b7683f3a9aca3e930.zip |
Adding support for DotNetCoreSdkSearch and DotNetCoreSdkCompatibilityCheck
Diffstat (limited to 'src/ext/NetFx/wixext/NetFxCompiler.cs')
-rw-r--r-- | src/ext/NetFx/wixext/NetFxCompiler.cs | 293 |
1 files changed, 240 insertions, 53 deletions
diff --git a/src/ext/NetFx/wixext/NetFxCompiler.cs b/src/ext/NetFx/wixext/NetFxCompiler.cs index 563cd19d..7a37cf90 100644 --- a/src/ext/NetFx/wixext/NetFxCompiler.cs +++ b/src/ext/NetFx/wixext/NetFxCompiler.cs | |||
@@ -49,6 +49,12 @@ namespace WixToolset.Netfx | |||
49 | case "DotNetCoreSearchRef": | 49 | case "DotNetCoreSearchRef": |
50 | this.ParseDotNetCoreSearchRefElement(intermediate, section, element); | 50 | this.ParseDotNetCoreSearchRefElement(intermediate, section, element); |
51 | break; | 51 | break; |
52 | case "DotNetCoreSdkSearch": | ||
53 | this.ParseDotNetCoreSdkSearchElement(intermediate, section, element); | ||
54 | break; | ||
55 | case "DotNetCoreSdkSearchRef": | ||
56 | this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); | ||
57 | break; | ||
52 | case "DotNetCompatibilityCheck": | 58 | case "DotNetCompatibilityCheck": |
53 | this.ParseDotNetCompatibilityCheckElement(intermediate, section, element); | 59 | this.ParseDotNetCompatibilityCheckElement(intermediate, section, element); |
54 | break; | 60 | break; |
@@ -69,6 +75,12 @@ namespace WixToolset.Netfx | |||
69 | case "DotNetCoreSearchRef": | 75 | case "DotNetCoreSearchRef": |
70 | this.ParseDotNetCoreSearchRefElement(intermediate, section, element); | 76 | this.ParseDotNetCoreSearchRefElement(intermediate, section, element); |
71 | break; | 77 | break; |
78 | case "DotNetCoreSdkSearch": | ||
79 | this.ParseDotNetCoreSdkSearchElement(intermediate, section, element); | ||
80 | break; | ||
81 | case "DotNetCoreSdkSearchRef": | ||
82 | this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); | ||
83 | break; | ||
72 | default: | 84 | default: |
73 | this.ParseHelper.UnexpectedElement(parentElement, element); | 85 | this.ParseHelper.UnexpectedElement(parentElement, element); |
74 | break; | 86 | break; |
@@ -248,6 +260,137 @@ namespace WixToolset.Netfx | |||
248 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | 260 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); |
249 | } | 261 | } |
250 | 262 | ||
263 | private void ParseDotNetCoreSdkSearchElement(Intermediate intermediate, IntermediateSection section, XElement element) | ||
264 | { | ||
265 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); | ||
266 | Identifier id = null; | ||
267 | string variable = null; | ||
268 | string condition = null; | ||
269 | string after = null; | ||
270 | NetCoreSdkSearchPlatform? platform = null; | ||
271 | string version = null; | ||
272 | |||
273 | foreach (var attrib in element.Attributes()) | ||
274 | { | ||
275 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) | ||
276 | { | ||
277 | switch (attrib.Name.LocalName) | ||
278 | { | ||
279 | case "Id": | ||
280 | id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); | ||
281 | break; | ||
282 | case "Variable": | ||
283 | variable = this.ParseHelper.GetAttributeBundleVariableNameValue(sourceLineNumbers, attrib); | ||
284 | break; | ||
285 | case "Condition": | ||
286 | condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
287 | break; | ||
288 | case "After": | ||
289 | after = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
290 | break; | ||
291 | case "Platform": | ||
292 | var platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
293 | switch (platformValue) | ||
294 | { | ||
295 | case "arm64": | ||
296 | platform = NetCoreSdkSearchPlatform.Arm64; | ||
297 | break; | ||
298 | case "x64": | ||
299 | platform = NetCoreSdkSearchPlatform.X64; | ||
300 | break; | ||
301 | case "x86": | ||
302 | platform = NetCoreSdkSearchPlatform.X86; | ||
303 | break; | ||
304 | default: | ||
305 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86")); | ||
306 | break; | ||
307 | } | ||
308 | break; | ||
309 | case "Version": | ||
310 | // .NET Core had a different deployment strategy before .NET Core 3.0 which would require different detection logic. | ||
311 | version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); | ||
312 | break; | ||
313 | default: | ||
314 | this.ParseHelper.UnexpectedAttribute(element, attrib); | ||
315 | break; | ||
316 | } | ||
317 | } | ||
318 | else | ||
319 | { | ||
320 | this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); | ||
321 | } | ||
322 | } | ||
323 | |||
324 | if (id == null) | ||
325 | { | ||
326 | id = this.ParseHelper.CreateIdentifier("dncss", variable, condition, after); | ||
327 | } | ||
328 | |||
329 | if (!platform.HasValue) | ||
330 | { | ||
331 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform")); | ||
332 | } | ||
333 | |||
334 | |||
335 | if (String.IsNullOrEmpty(version)) | ||
336 | { | ||
337 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version")); | ||
338 | } | ||
339 | |||
340 | var ver = Version.Parse(version); | ||
341 | if (ver.Major == 4) | ||
342 | { | ||
343 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*")); | ||
344 | } | ||
345 | |||
346 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | ||
347 | |||
348 | var bundleExtensionId = this.ParseHelper.CreateIdentifierValueFromPlatform("Wix4NetfxBundleExtension", this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64); | ||
349 | if (bundleExtensionId == null) | ||
350 | { | ||
351 | this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), element.Name.LocalName)); | ||
352 | } | ||
353 | |||
354 | if (!this.Messaging.EncounteredError) | ||
355 | { | ||
356 | this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, bundleExtensionId); | ||
357 | |||
358 | section.AddSymbol(new NetFxNetCoreSdkSearchSymbol(sourceLineNumbers, id) | ||
359 | { | ||
360 | Platform = platform.Value, | ||
361 | Version = version, | ||
362 | }); | ||
363 | } | ||
364 | } | ||
365 | |||
366 | private void ParseDotNetCoreSdkSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element) | ||
367 | { | ||
368 | var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); | ||
369 | |||
370 | foreach (var attrib in element.Attributes()) | ||
371 | { | ||
372 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) | ||
373 | { | ||
374 | switch (attrib.Name.LocalName) | ||
375 | { | ||
376 | case "Id": | ||
377 | var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); | ||
378 | this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, refId); | ||
379 | break; | ||
380 | default: | ||
381 | this.ParseHelper.UnexpectedAttribute(element, attrib); | ||
382 | break; | ||
383 | } | ||
384 | } | ||
385 | else | ||
386 | { | ||
387 | this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); | ||
388 | } | ||
389 | } | ||
390 | |||
391 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | ||
392 | } | ||
393 | |||
251 | /// <summary> | 394 | /// <summary> |
252 | /// Parses a NativeImage element. | 395 | /// Parses a NativeImage element. |
253 | /// </summary> | 396 | /// </summary> |
@@ -389,66 +532,19 @@ namespace WixToolset.Netfx | |||
389 | property = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); | 532 | property = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); |
390 | break; | 533 | break; |
391 | case "RuntimeType": | 534 | case "RuntimeType": |
392 | runtimeType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | 535 | runtimeType = this.ParseRuntimeType(element, sourceLineNumbers, attrib); |
393 | switch (runtimeType.ToLower()) | ||
394 | { | ||
395 | case "aspnet": | ||
396 | runtimeType = "Microsoft.AspNetCore.App"; | ||
397 | break; | ||
398 | case "desktop": | ||
399 | runtimeType = "Microsoft.WindowsDesktop.App"; | ||
400 | break; | ||
401 | case "core": | ||
402 | runtimeType = "Microsoft.NETCore.App"; | ||
403 | break; | ||
404 | default: | ||
405 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, runtimeType, "aspnet", "desktop", "core")); | ||
406 | break; | ||
407 | } | ||
408 | break; | 536 | break; |
409 | case "Platform": | 537 | case "Platform": |
410 | platform = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | 538 | platform = this.ParsePlatform(element, sourceLineNumbers, attrib); |
411 | switch (platform.ToLower()) | 539 | break; |
412 | { | 540 | case "FeatureBand": |
413 | case "x86": | 541 | platform = this.ParseFeatureBand(element, sourceLineNumbers, attrib); |
414 | case "x64": | ||
415 | case "arm64": | ||
416 | platform = platform.ToLower(); | ||
417 | break; | ||
418 | default: | ||
419 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, platform, "x86", "x64", "arm64")); | ||
420 | break; | ||
421 | } | ||
422 | break; | 542 | break; |
423 | case "Version": | 543 | case "Version": |
424 | version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); | 544 | version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); |
425 | break; | 545 | break; |
426 | case "RollForward": | 546 | case "RollForward": |
427 | rollForward = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | 547 | rollForward = this.ParseRollForward(element, sourceLineNumbers, attrib); |
428 | switch (rollForward.ToLowerInvariant()) | ||
429 | { | ||
430 | case "latestmajor": | ||
431 | rollForward = "LatestMajor"; | ||
432 | break; | ||
433 | case "major": | ||
434 | rollForward = "Major"; | ||
435 | break; | ||
436 | case "latestminor": | ||
437 | rollForward = "LatestMinor"; | ||
438 | break; | ||
439 | case "minor": | ||
440 | rollForward = "Minor"; | ||
441 | break; | ||
442 | case "latestpatch": | ||
443 | rollForward = "LatestPatch"; | ||
444 | break; | ||
445 | case "disable": | ||
446 | rollForward = "Disable"; | ||
447 | break; | ||
448 | default: | ||
449 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, rollForward, "latestmajor", "major", "latestminor", "minor", "latestpatch", "disable")); | ||
450 | break; | ||
451 | } | ||
452 | break; | 548 | break; |
453 | default: | 549 | default: |
454 | this.ParseHelper.UnexpectedAttribute(element, attrib); | 550 | this.ParseHelper.UnexpectedAttribute(element, attrib); |
@@ -503,6 +599,97 @@ namespace WixToolset.Netfx | |||
503 | } | 599 | } |
504 | } | 600 | } |
505 | 601 | ||
602 | private string ParseRollForward(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) | ||
603 | { | ||
604 | string rollForward; | ||
605 | rollForward = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
606 | switch (rollForward.ToLowerInvariant()) | ||
607 | { | ||
608 | case "latestmajor": | ||
609 | rollForward = "LatestMajor"; | ||
610 | break; | ||
611 | case "major": | ||
612 | rollForward = "Major"; | ||
613 | break; | ||
614 | case "latestminor": | ||
615 | rollForward = "LatestMinor"; | ||
616 | break; | ||
617 | case "minor": | ||
618 | rollForward = "Minor"; | ||
619 | break; | ||
620 | case "latestpatch": | ||
621 | rollForward = "LatestPatch"; | ||
622 | break; | ||
623 | case "disable": | ||
624 | rollForward = "Disable"; | ||
625 | break; | ||
626 | default: | ||
627 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, | ||
628 | attrib.Name.LocalName, rollForward, "latestmajor", "major", "latestminor", "minor", "latestpatch", "disable")); | ||
629 | break; | ||
630 | } | ||
631 | |||
632 | return rollForward; | ||
633 | } | ||
634 | |||
635 | private string ParsePlatform(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) | ||
636 | { | ||
637 | string platform; | ||
638 | platform = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
639 | switch (platform.ToLower()) | ||
640 | { | ||
641 | case "x86": | ||
642 | case "x64": | ||
643 | case "arm64": | ||
644 | platform = platform.ToLower(); | ||
645 | break; | ||
646 | default: | ||
647 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, | ||
648 | attrib.Name.LocalName, platform, "x86", "x64", "arm64")); | ||
649 | break; | ||
650 | } | ||
651 | |||
652 | return platform; | ||
653 | } | ||
654 | |||
655 | private string ParseFeatureBand(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) | ||
656 | { | ||
657 | string featureBand = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
658 | |||
659 | if (!Int32.TryParse(featureBand, out var intFeatureBand) || (100 > intFeatureBand) || (intFeatureBand > 999)) | ||
660 | { | ||
661 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, | ||
662 | attrib.Name.LocalName, featureBand, "An integer in the range [100 - 999]")); | ||
663 | |||
664 | } | ||
665 | |||
666 | return featureBand; | ||
667 | } | ||
668 | |||
669 | private string ParseRuntimeType(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) | ||
670 | { | ||
671 | var runtimeType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
672 | switch (runtimeType.ToLower()) | ||
673 | { | ||
674 | case "aspnet": | ||
675 | runtimeType = "Microsoft.AspNetCore.App"; | ||
676 | break; | ||
677 | case "desktop": | ||
678 | runtimeType = "Microsoft.WindowsDesktop.App"; | ||
679 | break; | ||
680 | case "core": | ||
681 | runtimeType = "Microsoft.NETCore.App"; | ||
682 | break; | ||
683 | default: | ||
684 | this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, | ||
685 | attrib.Name.LocalName, runtimeType, "aspnet", "desktop", "core")); | ||
686 | break; | ||
687 | } | ||
688 | |||
689 | return runtimeType; | ||
690 | } | ||
691 | |||
692 | |||
506 | /// <summary> | 693 | /// <summary> |
507 | /// Parses a DotNetCompatibilityCheckRef element. | 694 | /// Parses a DotNetCompatibilityCheckRef element. |
508 | /// </summary> | 695 | /// </summary> |