aboutsummaryrefslogtreecommitdiff
path: root/src/ext/NetFx/wixext/NetFxCompiler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/NetFx/wixext/NetFxCompiler.cs')
-rw-r--r--src/ext/NetFx/wixext/NetFxCompiler.cs190
1 files changed, 175 insertions, 15 deletions
diff --git a/src/ext/NetFx/wixext/NetFxCompiler.cs b/src/ext/NetFx/wixext/NetFxCompiler.cs
index 7a37cf90..c40bc77b 100644
--- a/src/ext/NetFx/wixext/NetFxCompiler.cs
+++ b/src/ext/NetFx/wixext/NetFxCompiler.cs
@@ -55,6 +55,12 @@ namespace WixToolset.Netfx
55 case "DotNetCoreSdkSearchRef": 55 case "DotNetCoreSdkSearchRef":
56 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); 56 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
57 break; 57 break;
58 case "DotNetCoreSdkFeatureBandSearch":
59 this.ParseDotNetCoreSdkFeatureBandSearchElement(intermediate, section, element);
60 break;
61 case "DotNetCoreSdkFeatureBandSearchRef":
62 this.ParseDotNetCoreSdkFeatureBandSearchRefElement(intermediate, section, element);
63 break;
58 case "DotNetCompatibilityCheck": 64 case "DotNetCompatibilityCheck":
59 this.ParseDotNetCompatibilityCheckElement(intermediate, section, element); 65 this.ParseDotNetCompatibilityCheckElement(intermediate, section, element);
60 break; 66 break;
@@ -81,6 +87,12 @@ namespace WixToolset.Netfx
81 case "DotNetCoreSdkSearchRef": 87 case "DotNetCoreSdkSearchRef":
82 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); 88 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
83 break; 89 break;
90 case "DotNetCoreSdkFeatureBandSearch":
91 this.ParseDotNetCoreSdkFeatureBandSearchElement(intermediate, section, element);
92 break;
93 case "DotNetCoreSdkFeatureBandSearchRef":
94 this.ParseDotNetCoreSdkFeatureBandSearchRefElement(intermediate, section, element);
95 break;
84 default: 96 default:
85 this.ParseHelper.UnexpectedElement(parentElement, element); 97 this.ParseHelper.UnexpectedElement(parentElement, element);
86 break; 98 break;
@@ -267,8 +279,8 @@ namespace WixToolset.Netfx
267 string variable = null; 279 string variable = null;
268 string condition = null; 280 string condition = null;
269 string after = null; 281 string after = null;
270 NetCoreSdkSearchPlatform? platform = null; 282 NetCoreSearchPlatform? platform = null;
271 string version = null; 283 var majorVersion = CompilerConstants.IntegerNotSet;
272 284
273 foreach (var attrib in element.Attributes()) 285 foreach (var attrib in element.Attributes())
274 { 286 {
@@ -293,22 +305,22 @@ namespace WixToolset.Netfx
293 switch (platformValue) 305 switch (platformValue)
294 { 306 {
295 case "arm64": 307 case "arm64":
296 platform = NetCoreSdkSearchPlatform.Arm64; 308 platform = NetCoreSearchPlatform.Arm64;
297 break; 309 break;
298 case "x64": 310 case "x64":
299 platform = NetCoreSdkSearchPlatform.X64; 311 platform = NetCoreSearchPlatform.X64;
300 break; 312 break;
301 case "x86": 313 case "x86":
302 platform = NetCoreSdkSearchPlatform.X86; 314 platform = NetCoreSearchPlatform.X86;
303 break; 315 break;
304 default: 316 default:
305 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86")); 317 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86"));
306 break; 318 break;
307 } 319 }
308 break; 320 break;
309 case "Version": 321 case "MajorVersion":
310 // .NET Core had a different deployment strategy before .NET Core 3.0 which would require different detection logic. 322 // .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); 323 majorVersion = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 3, Int32.MaxValue);
312 break; 324 break;
313 default: 325 default:
314 this.ParseHelper.UnexpectedAttribute(element, attrib); 326 this.ParseHelper.UnexpectedAttribute(element, attrib);
@@ -331,16 +343,13 @@ namespace WixToolset.Netfx
331 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform")); 343 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform"));
332 } 344 }
333 345
334 346 if (majorVersion == CompilerConstants.IntegerNotSet)
335 if (String.IsNullOrEmpty(version))
336 { 347 {
337 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version")); 348 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "MajorVersion"));
338 } 349 }
339 350 else if (majorVersion == 4)
340 var ver = Version.Parse(version);
341 if (ver.Major == 4)
342 { 351 {
343 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*")); 352 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "MajorVersion", "4", "3", "5+"));
344 } 353 }
345 354
346 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); 355 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
@@ -358,7 +367,7 @@ namespace WixToolset.Netfx
358 section.AddSymbol(new NetFxNetCoreSdkSearchSymbol(sourceLineNumbers, id) 367 section.AddSymbol(new NetFxNetCoreSdkSearchSymbol(sourceLineNumbers, id)
359 { 368 {
360 Platform = platform.Value, 369 Platform = platform.Value,
361 Version = version, 370 MajorVersion = majorVersion,
362 }); 371 });
363 } 372 }
364 } 373 }
@@ -391,6 +400,157 @@ namespace WixToolset.Netfx
391 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); 400 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
392 } 401 }
393 402
403 private void ParseDotNetCoreSdkFeatureBandSearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
404 {
405 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
406 Identifier id = null;
407 string variable = null;
408 string condition = null;
409 string after = null;
410 NetCoreSearchPlatform? platform = null;
411 string version = null;
412 var majorVersion = 0;
413 var minorVersion = 0;
414 var patchVersion = 0;
415
416 foreach (var attrib in element.Attributes())
417 {
418 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
419 {
420 switch (attrib.Name.LocalName)
421 {
422 case "Id":
423 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
424 break;
425 case "Variable":
426 variable = this.ParseHelper.GetAttributeBundleVariableNameValue(sourceLineNumbers, attrib);
427 break;
428 case "Condition":
429 condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
430 break;
431 case "After":
432 after = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
433 break;
434 case "Platform":
435 var platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
436 switch (platformValue)
437 {
438 case "arm64":
439 platform = NetCoreSearchPlatform.Arm64;
440 break;
441 case "x64":
442 platform = NetCoreSearchPlatform.X64;
443 break;
444 case "x86":
445 platform = NetCoreSearchPlatform.X86;
446 break;
447 default:
448 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86"));
449 break;
450 }
451 break;
452 case "Version":
453 version = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
454 break;
455 default:
456 this.ParseHelper.UnexpectedAttribute(element, attrib);
457 break;
458 }
459 }
460 else
461 {
462 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
463 }
464 }
465
466 if (id == null)
467 {
468 id = this.ParseHelper.CreateIdentifier("dncsfbs", variable, condition, after);
469 }
470
471 if (!platform.HasValue)
472 {
473 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform"));
474 }
475
476 if (String.IsNullOrEmpty(version))
477 {
478 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version"));
479 }
480 else
481 {
482 if (!Version.TryParse(version, out var featureBandVersion))
483 {
484 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "x.x.x00"));
485 }
486 else
487 {
488 majorVersion = featureBandVersion.Major;
489 minorVersion = featureBandVersion.Minor;
490 patchVersion = featureBandVersion.Build;
491
492 if ((patchVersion % 100) != 0 || featureBandVersion.Revision != -1)
493 {
494 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "x.x.x00"));
495 }
496
497 if (majorVersion == 4)
498 {
499 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*"));
500 }
501 }
502 }
503
504 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
505
506 var bundleExtensionId = this.ParseHelper.CreateIdentifierValueFromPlatform("Wix4NetfxBundleExtension", this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64);
507 if (bundleExtensionId == null)
508 {
509 this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), element.Name.LocalName));
510 }
511
512 if (!this.Messaging.EncounteredError)
513 {
514 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, bundleExtensionId);
515
516 section.AddSymbol(new NetFxNetCoreSdkFeatureBandSearchSymbol(sourceLineNumbers, id)
517 {
518 Platform = platform.Value,
519 MajorVersion = majorVersion,
520 MinorVersion = minorVersion,
521 PatchVersion = patchVersion,
522 });
523 }
524 }
525
526 private void ParseDotNetCoreSdkFeatureBandSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element)
527 {
528 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
529
530 foreach (var attrib in element.Attributes())
531 {
532 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
533 {
534 switch (attrib.Name.LocalName)
535 {
536 case "Id":
537 var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
538 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch, refId);
539 break;
540 default:
541 this.ParseHelper.UnexpectedAttribute(element, attrib);
542 break;
543 }
544 }
545 else
546 {
547 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
548 }
549 }
550
551 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
552 }
553
394 /// <summary> 554 /// <summary>
395 /// Parses a NativeImage element. 555 /// Parses a NativeImage element.
396 /// </summary> 556 /// </summary>