aboutsummaryrefslogtreecommitdiff
path: root/src/ext/NetFx/wixext/NetFxCompiler.cs
diff options
context:
space:
mode:
authorStaffan Gustafsson <staffangu@outlook.com>2022-11-30 17:15:12 +0100
committerSean Hall <r.sean.hall@gmail.com>2023-01-18 18:10:56 -0600
commit853887b4e84df1965794802b7683f3a9aca3e930 (patch)
treec2db272b63381c94186712c0029ed0e000ec3391 /src/ext/NetFx/wixext/NetFxCompiler.cs
parent9f368d76848e31d21ec3c193fa8c92849b1362a1 (diff)
downloadwix-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.cs293
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>