#!/usr/bin/env /Library/Frameworks/Mono.framework/Commands/csharp -s // arguments are: using System.IO; using System.Xml; var args = Args; var expectedArgumentCount = 9; if (args.Length != expectedArgumentCount) { Console.WriteLine ($"Need {expectedArgumentCount} arguments, got {args.Length}"); Environment.Exit (1); return; } var argumentIndex = 0; var platform = args [argumentIndex++]; var version = args [argumentIndex++]; var net8Version = args [argumentIndex++]; var runtimeIdentifiers = args [argumentIndex++].Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var outputPath = args [argumentIndex++]; var windowsPlatforms = args [argumentIndex++].Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var hasWindows = Array.IndexOf (windowsPlatforms, platform) >= 0; var currentApiVersion = args [argumentIndex++]; var supportedApiVersions = args [argumentIndex++].Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries); var versionsPropsPath = args [argumentIndex++]; var platformLowerCase = platform.ToLowerInvariant (); var allApiVersions = new List (supportedApiVersions); allApiVersions = allApiVersions.Select (v => v.Replace ('-', '_')).ToList (); var versionsPropsTable = File.ReadAllLines (versionsPropsPath). Where (v => v.Count (f => f == '>') > 1). Select (v => { var split = v.Trim ().Split (new char [] { '<', '>', '/'}, StringSplitOptions.RemoveEmptyEntries); var name = split [0]; var value = split [1]; return new Tuple (name, value); }). ToDictionary (v => v.Item1, v => v.Item2, StringComparer.OrdinalIgnoreCase); var failed = false; using (TextWriter writer = new StreamWriter (outputPath)) { writer.WriteLine ($"{{"); writer.WriteLine ($" \"version\": \"{version}\","); writer.WriteLine ($" \"workloads\": {{"); writer.WriteLine ($" \"{platformLowerCase}\": {{"); writer.WriteLine ($" \"description\": \".NET SDK Workload for building {platform} applications.\","); writer.WriteLine ($" \"packs\": ["); foreach (var tfm in allApiVersions) { writer.WriteLine ($" \"Microsoft.{platform}.Sdk.{(tfm == "net8.0" ? "net8" : tfm)}\","); } if (hasWindows) { foreach (var tfm in allApiVersions) { writer.WriteLine ($" \"Microsoft.{platform}.Windows.Sdk.Aliased.{(tfm == "net8.0" ? "net8" : tfm)}\","); } } writer.WriteLine ($" \"Microsoft.{platform}.Ref.{currentApiVersion}\","); foreach (var rid in runtimeIdentifiers) { writer.WriteLine ($" \"Microsoft.{platform}.Runtime.{rid}.{currentApiVersion}\","); } writer.WriteLine ($" \"Microsoft.{platform}.Templates.net9\""); writer.WriteLine ($" ],"); writer.WriteLine ($" \"extends\": ["); if (platform == "macOS") { writer.WriteLine ($" \"microsoft-net-runtime-mono-tooling\","); writer.WriteLine ($" \"microsoft-net-runtime-mono-tooling-net8\","); } else { writer.WriteLine ($" \"microsoft-net-runtime-{platformLowerCase}\","); writer.WriteLine ($" \"microsoft-net-runtime-{platformLowerCase}-net8\","); } writer.WriteLine ($" ]"); writer.WriteLine ($" }},"); writer.WriteLine ($" }},"); writer.WriteLine ($" \"packs\": {{"); foreach (var tfmVersion in allApiVersions) { string apiVersion; var tfm = tfmVersion; if (tfm == currentApiVersion) { apiVersion = version; } else if (tfm == "net8.0") { apiVersion = net8Version; } else { var propsPackageName = $"Microsoft{platform}Sdk" + tfm.Replace ("-", "").Replace (".", "") + "PackageVersion"; if (!versionsPropsTable.TryGetValue (propsPackageName, out apiVersion)) { Console.Error.WriteLine ($"❌ Unable to find a package version for {platform}/{tfm} in {versionsPropsPath}. Package name: {propsPackageName}"); apiVersion = "?"; failed = true; } } writer.WriteLine ($" \"Microsoft.{platform}.Sdk.{(tfm == "net8.0" ? "net8" : tfm)}\": {{"); writer.WriteLine ($" \"kind\": \"sdk\","); writer.WriteLine ($" \"version\": \"{apiVersion}\","); if (tfm == "net8.0") { writer.WriteLine ($" \"alias-to\": {{"); writer.WriteLine ($" \"any\": \"Microsoft.{platform}.Sdk\""); writer.WriteLine ($" }}"); } writer.WriteLine ($" }},"); if (hasWindows) { writer.WriteLine ($" \"Microsoft.{platform}.Windows.Sdk.Aliased.{(tfm == "net8.0" ? "net8" : tfm)}\": {{"); writer.WriteLine ($" \"kind\": \"sdk\","); writer.WriteLine ($" \"version\": \"{apiVersion}\","); writer.WriteLine ($" \"alias-to\": {{"); if (tfm == "net8.0") { writer.WriteLine ($" \"win-x64\": \"Microsoft.{platform}.Windows.Sdk\","); writer.WriteLine ($" \"win-x86\": \"Microsoft.{platform}.Windows.Sdk\","); writer.WriteLine ($" \"win-arm64\": \"Microsoft.{platform}.Windows.Sdk\","); } else { writer.WriteLine ($" \"win-x64\": \"Microsoft.{platform}.Windows.Sdk.{tfm}\","); writer.WriteLine ($" \"win-x86\": \"Microsoft.{platform}.Windows.Sdk.{tfm}\","); writer.WriteLine ($" \"win-arm64\": \"Microsoft.{platform}.Windows.Sdk.{tfm}\","); } writer.WriteLine ($" }}"); writer.WriteLine ($" }},"); } } writer.WriteLine ($" \"Microsoft.{platform}.Ref.{currentApiVersion}\": {{"); writer.WriteLine ($" \"kind\": \"framework\","); writer.WriteLine ($" \"version\": \"{version}\""); writer.WriteLine ($" }},"); foreach (var rid in runtimeIdentifiers) { writer.WriteLine ($" \"Microsoft.{platform}.Runtime.{rid}.{currentApiVersion}\": {{"); writer.WriteLine ($" \"kind\": \"framework\","); writer.WriteLine ($" \"version\": \"{version}\""); writer.WriteLine ($" }},"); } writer.WriteLine ($" \"Microsoft.{platform}.Templates.net9\": {{"); writer.WriteLine ($" \"kind\": \"template\","); writer.WriteLine ($" \"version\": \"{version}\","); writer.WriteLine ($" \"alias-to\": {{"); writer.WriteLine ($" \"any\": \"Microsoft.{platform}.Templates\","); writer.WriteLine ($" }}"); writer.WriteLine ($" }}"); writer.WriteLine ($" }}"); writer.WriteLine ($"}}"); } if (failed) Environment.Exit (1); Environment.Exit (0);