From 20e88748f4322e7aa1608ceaf2a4bd2403bdf8a2 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 16 Jan 2026 18:06:50 +0100 Subject: [PATCH 1/3] [msbuild] Add a XamarinTask.SdkDevPath property and deduplicate a lot of code in child classes. --- .../MSBStrings.resx | 4 ++++ .../Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs | 3 --- msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs | 3 --- .../Tasks/CompileNativeCode.cs | 3 --- .../Tasks/CompileSceneKitAssets.cs | 3 --- .../Tasks/CoreMLCompiler.cs | 5 ----- .../Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs | 3 --- .../Tasks/DetectSdkLocation.cs | 7 ++++--- .../Tasks/GetMlaunchArguments.cs | 3 --- .../Tasks/InstallNameTool.cs | 3 --- .../Tasks/LinkNativeCode.cs | 3 --- .../Tasks/MergeAppBundles.cs | 3 --- msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs | 3 --- .../Xamarin.MacDev.Tasks/Tasks/MetalLib.cs | 3 --- .../Tasks/OptimizeImage.cs | 3 --- msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs | 3 --- .../Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs | 20 ++++++++++++++++++- .../Tasks/XcodeBuildTask.cs | 3 --- .../Tasks/XcodeCompilerToolTask.cs | 14 ++----------- .../Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs | 3 --- 20 files changed, 29 insertions(+), 66 deletions(-) diff --git a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx index cae2cb561191..73f4ff1ab063 100644 --- a/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx +++ b/msbuild/Xamarin.Localization.MSBuild/MSBStrings.resx @@ -1619,4 +1619,8 @@ Unable to copy the inputs to this task to the remote build server for unknown reasons. The build log may have more information. + + + The task '{0}' requires the property '{1}' to be set. Please file an issue at https://github.com/dotnet/macios/issues/new/choose. + diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs index 3adaa8afd0d9..f85bed2c4545 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs @@ -36,9 +36,6 @@ public class AOTCompile : XamarinParallelTask, ITaskCallback, ICancelableTask { [Required] public string OutputDirectory { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - #region Output [Output] public ITaskItem []? AssemblyFiles { get; set; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs index 366f00d9ada1..0645ab4edf0b 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs @@ -27,9 +27,6 @@ public abstract class ALToolTaskBase : XamarinTask, ICancelableTask { [Required] public string FilePath { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - protected abstract string ALToolAction { get; } public override bool Execute () diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs index ea95c3530e4a..d7e1bf8c2dde 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs @@ -25,9 +25,6 @@ public class CompileNativeCode : XamarinTask, ICancelableTask, ITaskCallback { [Required] public string MinimumOSVersion { get; set; } = ""; - [Required] - public string SdkDevPath { get; set; } = ""; - [Required] public string SdkRoot { get; set; } = ""; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs index 3f50e6199dee..a3d4584d0927 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs @@ -37,9 +37,6 @@ public class CompileSceneKitAssets : XamarinTask, ICancelableTask, IHasProjectDi [Required] public ITaskItem [] SceneKitAssets { get; set; } = Array.Empty (); - [Required] - public string SdkDevPath { get; set; } = ""; - [Required] public string SdkPlatform { get; set; } = ""; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs index f30f62555eb7..aa2009157e86 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs @@ -30,11 +30,6 @@ public class CoreMLCompiler : XamarinTask, ICancelableTask, IHasProjectDir, IHas [Required] public string ResourcePrefix { get; set; } = ""; - string sdkDevPath = ""; - public string SdkDevPath { - get { return string.IsNullOrEmpty (sdkDevPath) ? "/" : sdkDevPath; } - set { sdkDevPath = value; } - } #endregion #region Outputs diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs index 58011d2fbc90..4710e2400ea0 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs @@ -21,9 +21,6 @@ public class DSymUtil : XamarinTask, ITaskCallback { [Required] public ITaskItem [] Executable { get; set; } = Array.Empty (); - [Required] - public string SdkDevPath { get; set; } = string.Empty; - #endregion #region Outputs diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/DetectSdkLocation.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/DetectSdkLocation.cs index 084c0cc3ecd3..024ab9ef58ac 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/DetectSdkLocation.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/DetectSdkLocation.cs @@ -30,9 +30,10 @@ public string SdkRoot { } = ""; [Output] - public string SdkDevPath { - get; set; - } = ""; + public new string SdkDevPath { + get => base.SdkDevPath; + set => base.SdkDevPath = value; + } [Output] public string SdkPlatform { diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs index 0c0f8efc00f6..65dd94a153bc 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs @@ -27,9 +27,6 @@ public class GetMlaunchArguments : XamarinTask, ICancelableTask { public string AppManifestPath { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - public ITaskItem [] AdditionalArguments { get; set; } = Array.Empty (); public string DeviceName { get; set; } = string.Empty; public ITaskItem [] EnvironmentVariables { get; set; } = Array.Empty (); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs index 8430835aefee..8e5b0358b2aa 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs @@ -15,9 +15,6 @@ public class InstallNameTool : XamarinTask, ITaskCallback { [Required] public ITaskItem [] DynamicLibrary { get; set; } = []; - [Required] - public string SdkDevPath { get; set; } = ""; - // This isn't consumed from the targets files, but it's needed for VSX to create corresponding // files on Windows. [Output] diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs index ad7f93d0114c..523ddba9e40f 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs @@ -21,9 +21,6 @@ public class LinkNativeCode : XamarinTask, ITaskCallback { // A path to entitlements to be embedded into the executable public string EntitlementsInExecutable { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - [Required] public bool SdkIsSimulator { get; set; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs index 5f8fcf89c516..2c324522947b 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs @@ -46,9 +46,6 @@ public partial class MergeAppBundles : XamarinTask { [Required] public string OutputAppBundle { get; set; } = ""; - [Required] - public string SdkDevPath { get; set; } = ""; - #endregion enum FileType { diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs index 8e5c4b298ebe..0329254e0617 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/Metal.cs @@ -32,9 +32,6 @@ public class Metal : XamarinTask, IHasProjectDir, IHasResourcePrefix { [Required] public string ResourcePrefix { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - [Required] public string SdkVersion { get; set; } = string.Empty; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs index 804c846c14fe..88b7da3db0ed 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/MetalLib.cs @@ -25,9 +25,6 @@ public class MetalLib : XamarinTask, ITaskCallback { [Required] public string OutputLibrary { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - [Required] public string SdkRoot { get; set; } = string.Empty; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs index 6fef2efe045f..942359580d4a 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs @@ -29,9 +29,6 @@ public class OptimizeImage : XamarinParallelTask, ICancelableTask { public string PngCrushPath { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - #endregion static List GenerateCommandLineCommands (string inputImage, string outputImage) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs index 5f8e9617c1a8..83469c43f8f8 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs @@ -39,9 +39,6 @@ public class ScnTool : XamarinParallelTask, IHasProjectDir, IHasResourcePrefix { [Required] public string SdkVersion { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - #endregion #region Outputs diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs index 1bbb84be1afc..e8ad815715c1 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs @@ -23,11 +23,29 @@ public abstract class XamarinTask : Task, IHasSessionId, ICustomLogger { public string TargetFrameworkMoniker { get; set; } = string.Empty; + protected string? sdkDevPath; + public string SdkDevPath { + get { +#if NET + if (string.IsNullOrEmpty (sdkDevPath)) { +#else + if (string.IsNullOrEmpty (sdkDevPath) || sdkDevPath is null) { +#endif + Log.LogError (MSBStrings.E7169, /* The task '{0}' requires the property '{1}' to be set. Please file an issue at https://github.com/dotnet/macios/issues/new/choose. */ GetType ().Name, "SdkDevPath"); + return ""; + } + return sdkDevPath; + } + set { + sdkDevPath = value; + } + } + void VerifyTargetFrameworkMoniker () { if (!string.IsNullOrEmpty (TargetFrameworkMoniker)) return; - Log.LogError ($"The task {GetType ().Name} requires TargetFrameworkMoniker to be set."); + Log.LogError (MSBStrings.E7169, /* The task '{0}' requires the property '{1}' to be set. Please file an issue at https://github.com/dotnet/macios/issues/new/choose. */ GetType ().Name, "TargetFrameworkMoniker"); } public string Product { diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs index 79a2ffb7b36d..04c28426e8ae 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs @@ -4,9 +4,6 @@ namespace Xamarin.MacDev.Tasks { public abstract class XcodeBuildTask : XamarinTask { - // Task input parameters - public string SdkDevPath { get; set; } = string.Empty; - public string WorkingDirectory { get; set; } = string.Empty; public string OutputPath { get; set; } = string.Empty; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs index 1be61b08f5fd..c2cc734db12d 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs @@ -41,16 +41,6 @@ public abstract class XcodeCompilerToolTask : XamarinTask, IHasProjectDir, IHasR [Required] public string SdkPlatform { get; set; } = string.Empty; - string? sdkDevPath; - public string SdkDevPath { -#if NET - get { return string.IsNullOrEmpty (sdkDevPath) ? "/" : sdkDevPath; } -#else - get { return (sdkDevPath is null || string.IsNullOrEmpty (sdkDevPath)) ? "/" : sdkDevPath; } -#endif - set { sdkDevPath = value; } - } - [Required] public string SdkVersion { get; set; } = string.Empty; @@ -180,8 +170,8 @@ protected int Compile (ITaskItem [] items, string output, ITaskItem manifest) var environment = new Dictionary (); var args = new List (); - if (!string.IsNullOrEmpty (SdkDevPath)) - environment.Add ("DEVELOPER_DIR", SdkDevPath); + if (!string.IsNullOrEmpty (sdkDevPath)) + environment.Add ("DEVELOPER_DIR", sdkDevPath); // workaround for ibtool[d] bug / asserts if Intel version is loaded string tool; diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs index ee357deeaa0a..607963be64c8 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs @@ -27,9 +27,6 @@ public abstract class XcodeToolTaskBase : XamarinTask, IHasProjectDir, IHasResou [Required] public string ResourcePrefix { get; set; } = string.Empty; - [Required] - public string SdkDevPath { get; set; } = string.Empty; - public string ToolExe { get { return toolExe ?? ToolName; } set { toolExe = value; } From 188aae8d303cbaa909c96006fd1d33f04c1d4acc Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 19 Jan 2026 17:48:53 +0100 Subject: [PATCH 2/3] Do this a bit differently. --- .../Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs | 2 +- msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs | 2 +- .../Tasks/CompileNativeCode.cs | 2 +- .../Tasks/CompileSceneKitAssets.cs | 2 +- .../Tasks/CoreMLCompiler.cs | 2 +- .../Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs | 2 +- .../Tasks/GetMlaunchArguments.cs | 4 ++-- .../Tasks/InstallNameTool.cs | 2 +- .../Tasks/LinkNativeCode.cs | 4 ++-- .../Tasks/MergeAppBundles.cs | 2 +- .../Tasks/OptimizeImage.cs | 2 +- msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs | 2 +- .../Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs | 24 +++++++------------ .../Tasks/XcodeBuildTask.cs | 2 +- .../Tasks/XcodeCompilerToolTask.cs | 8 +++---- .../Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs | 6 ++--- 16 files changed, 31 insertions(+), 37 deletions(-) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs index f85bed2c4545..3a546dfbb4fb 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/AOTCompile.cs @@ -338,7 +338,7 @@ public override bool Execute () environment [item.ItemSpec] = item.GetMetadata ("Value"); ForEach (listOfArguments, (arg) => { - ExecuteAsync (AOTCompilerPath, arg.Arguments, environment: environment, sdkDevPath: SdkDevPath, showErrorIfFailure: false /* we show our own error below */) + ExecuteAsync (AOTCompilerPath, arg.Arguments, environment: environment, sdkDevPath: GetSdkDevPath (), showErrorIfFailure: false /* we show our own error below */) .ContinueWith ((v) => { if (v.Result.ExitCode != 0) Log.LogError (MSBStrings.E7118 /* Failed to AOT compile {0}, the AOT compiler exited with code {1} */, Path.GetFileName (arg.Input), v.Result.ExitCode); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs index 0645ab4edf0b..1ba536e83233 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/AlTool.cs @@ -41,7 +41,7 @@ public override bool Execute () return false; cancellationTokenSource = new CancellationTokenSource (); - var rv = ExecuteAsync (Log, executable, args, sdkDevPath: SdkDevPath, cancellationToken: cancellationTokenSource.Token).Result; + var rv = ExecuteAsync (Log, executable, args, sdkDevPath: GetSdkDevPath (), cancellationToken: cancellationTokenSource.Token).Result; LogErrorsFromOutput (rv.Output.MergedOutput); return !Log.HasLoggedErrors; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs index d7e1bf8c2dde..a8a4d5489b02 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs @@ -139,7 +139,7 @@ public override bool Execute () arguments.Add ("-c"); arguments.Add (src); - processes [i] = ExecuteAsync ("xcrun", arguments, sdkDevPath: SdkDevPath); + processes [i] = ExecuteAsync ("xcrun", arguments, sdkDevPath: GetSdkDevPath ()); } System.Threading.Tasks.Task.WaitAll (processes); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs index a3d4584d0927..ab24ad7035d1 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileSceneKitAssets.cs @@ -84,7 +84,7 @@ Task CopySceneKitAssets (string scnassets, string output, string intermediate) var executable = GetExecutable (args, ToolName, CopySceneKitAssetsPath); - return ExecuteAsync (executable, args, sdkDevPath: SdkDevPath, environment: environment, showErrorIfFailure: true); + return ExecuteAsync (executable, args, sdkDevPath: GetSdkDevPath (), environment: environment, showErrorIfFailure: true); } static bool TryGetScnAssetsPath (string file, out string scnassets) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs index aa2009157e86..864747e9ea67 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CoreMLCompiler.cs @@ -55,7 +55,7 @@ int Compile (ITaskItem item, string outputDir, string log, string partialPlist) args.Add (partialPlist); var executable = GetExecutable (args, ToolName, CoreMlcPath); - var rv = ExecuteAsync (executable, args, sdkDevPath).Result; + var rv = ExecuteAsync (executable, args, GetSdkDevPath ()).Result; var exitCode = rv.ExitCode; var output = rv.Output.StandardOutput; File.WriteAllText (log, output); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs index 4710e2400ea0..ff6da8a221fc 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/DSymUtil.cs @@ -62,7 +62,7 @@ void ExecuteDSymUtil (ITaskItem item, List contentFiles) args.Add (dSymDir); args.Add (Path.GetFullPath (item.ItemSpec)); - ExecuteAsync ("xcrun", args, sdkDevPath: SdkDevPath).Wait (); + ExecuteAsync ("xcrun", args, sdkDevPath: GetSdkDevPath ()).Wait (); var contentsDir = Path.Combine (dSymDir, "Contents"); if (Directory.Exists (contentsDir)) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs index 65dd94a153bc..5f088bec35f2 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetMlaunchArguments.cs @@ -109,7 +109,7 @@ public IPhoneDeviceType DeviceType { var tmpfile = Path.GetTempFileName (); try { var output = new StringBuilder (); - var result = ExecuteAsync (MlaunchPath, new string [] { "--listsim", tmpfile }, SdkDevPath).Result; + var result = ExecuteAsync (MlaunchPath, new string [] { "--listsim", tmpfile }, GetSdkDevPath ()).Result; if (result.ExitCode != 0) return string.Empty; simulator_list = File.ReadAllText (tmpfile); @@ -127,7 +127,7 @@ public IPhoneDeviceType DeviceType { var tmpfile = Path.GetTempFileName (); try { var output = new StringBuilder (); - var result = ExecuteAsync (MlaunchPath, new string [] { $"--listdev:{tmpfile}", "--output-format:xml", "--use-amdevice:false" }, SdkDevPath).Result; + var result = ExecuteAsync (MlaunchPath, new string [] { $"--listdev:{tmpfile}", "--output-format:xml", "--use-amdevice:false" }, GetSdkDevPath ()).Result; if (result.ExitCode != 0) return string.Empty; device_list = File.ReadAllText (tmpfile); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs index 8e5b0358b2aa..444be72981de 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/InstallNameTool.cs @@ -47,7 +47,7 @@ public override bool Execute () arguments.Add (input.GetMetadata ("DynamicLibraryId")); arguments.Add (temporaryTarget); - processes [i] = ExecuteAsync ("xcrun", arguments, sdkDevPath: SdkDevPath).ContinueWith ((v) => { + processes [i] = ExecuteAsync ("xcrun", arguments, sdkDevPath: GetSdkDevPath ()).ContinueWith ((v) => { if (v.IsFaulted) throw v.Exception; if (v.Status == TaskStatus.RanToCompletion) { diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs index 523ddba9e40f..02a7eaf4823f 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/LinkNativeCode.cs @@ -210,7 +210,7 @@ bool ExecuteUnsafe () arguments.Add (flag.ItemSpec); } - var rv = ExecuteAsync ("xcrun", arguments, sdkDevPath: SdkDevPath, showErrorIfFailure: false).Result; + var rv = ExecuteAsync ("xcrun", arguments, sdkDevPath: GetSdkDevPath (), showErrorIfFailure: false).Result; if (rv.ExitCode != 0) { var stderr = rv.Output.MergedOutput; #if NET @@ -281,7 +281,7 @@ string ConvertEntitlementsToDerEntitlements (string entitlements) "-o", derEntitlements, "--raw", }; - ExecuteAsync ("xcrun", arguments, sdkDevPath: SdkDevPath).Wait (); + ExecuteAsync ("xcrun", arguments, sdkDevPath: GetSdkDevPath ()).Wait (); return derEntitlements; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs index 2c324522947b..ffdc7818a440 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/MergeAppBundles.cs @@ -438,7 +438,7 @@ void MergeMachOFiles (string output, IList input) arguments.Add ("-output"); arguments.Add (output); arguments.AddRange (sourceFiles); - ExecuteAsync ("lipo", arguments, sdkDevPath: SdkDevPath).Wait (); + ExecuteAsync ("lipo", arguments, sdkDevPath: GetSdkDevPath ()).Wait (); } FileType GetFileType (string path) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs index 942359580d4a..b39456725f3d 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/OptimizeImage.cs @@ -89,7 +89,7 @@ public override bool Execute () ForEach (listOfArguments, (arg) => { var args = arg.Arguments; var executable = GetExecutable (args, "pngcrush", PngCrushPath); - ExecuteAsync (Log, executable, args, sdkDevPath: SdkDevPath, showErrorIfFailure: false /* we show our own error below */, cancellationToken: cancellationTokenSource.Token) + ExecuteAsync (Log, executable, args, sdkDevPath: GetSdkDevPath (), showErrorIfFailure: false /* we show our own error below */, cancellationToken: cancellationTokenSource.Token) .ContinueWith ((v) => { Execution execution = v.Result; if (execution.ExitCode != 0) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs index 83469c43f8f8..f0b58104cb04 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ScnTool.cs @@ -88,7 +88,7 @@ public override bool Execute () } ForEach (listOfArguments, (arg) => { - ExecuteAsync ("xcrun", arg.Arguments, sdkDevPath: SdkDevPath).Wait (); + ExecuteAsync ("xcrun", arg.Arguments, sdkDevPath: GetSdkDevPath ()).Wait (); }); BundleResources = bundleResources.ToArray (); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs index e8ad815715c1..a95732ea6cf6 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs @@ -23,22 +23,16 @@ public abstract class XamarinTask : Task, IHasSessionId, ICustomLogger { public string TargetFrameworkMoniker { get; set; } = string.Empty; - protected string? sdkDevPath; - public string SdkDevPath { - get { -#if NET - if (string.IsNullOrEmpty (sdkDevPath)) { -#else - if (string.IsNullOrEmpty (sdkDevPath) || sdkDevPath is null) { -#endif - Log.LogError (MSBStrings.E7169, /* The task '{0}' requires the property '{1}' to be set. Please file an issue at https://github.com/dotnet/macios/issues/new/choose. */ GetType ().Name, "SdkDevPath"); - return ""; - } - return sdkDevPath; - } - set { - sdkDevPath = value; + public string SdkDevPath { get; set; } = string.Empty; + + public string GetSdkDevPath () + { + if (string.IsNullOrEmpty (SdkDevPath)) { + Log.LogError (MSBStrings.E7169, /* The task '{0}' requires the property '{1}' to be set. Please file an issue at https://github.com/dotnet/macios/issues/new/choose. */ GetType ().Name, "SdkDevPath"); + return ""; } + + return SdkDevPath; } void VerifyTargetFrameworkMoniker () diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs index 04c28426e8ae..0bf3cb03aae4 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeBuildTask.cs @@ -22,7 +22,7 @@ public override bool Execute () } args.AddRange (GenerateCommandLineCommands ()); - ExecuteAsync ("xcrun", args, sdkDevPath: SdkDevPath, workingDirectory: WorkingDirectory).Wait (); + ExecuteAsync ("xcrun", args, sdkDevPath: GetSdkDevPath (), workingDirectory: WorkingDirectory).Wait (); return !Log.HasLoggedErrors; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs index c2cc734db12d..69d788e17765 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeCompilerToolTask.cs @@ -92,7 +92,7 @@ protected abstract string DefaultBinDir { } protected string DeveloperRootBinDir { - get { return Path.Combine (SdkDevPath, "usr", "bin"); } + get { return Path.Combine (GetSdkDevPath (), "usr", "bin"); } } protected abstract string ToolName { get; } @@ -170,8 +170,8 @@ protected int Compile (ITaskItem [] items, string output, ITaskItem manifest) var environment = new Dictionary (); var args = new List (); - if (!string.IsNullOrEmpty (sdkDevPath)) - environment.Add ("DEVELOPER_DIR", sdkDevPath); + if (!string.IsNullOrEmpty (SdkDevPath)) + environment.Add ("DEVELOPER_DIR", SdkDevPath); // workaround for ibtool[d] bug / asserts if Intel version is loaded string tool; @@ -209,7 +209,7 @@ protected int Compile (ITaskItem [] items, string output, ITaskItem manifest) if (Log.HasLoggedErrors) return 1; - var rv = ExecuteAsync (tool, args, sdkDevPath, environment: environment).Result; + var rv = ExecuteAsync (tool, args, SdkDevPath, environment: environment).Result; var exitCode = rv.ExitCode; var messages = rv.Output.StandardOutput; File.WriteAllText (manifest.ItemSpec, messages); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs index 607963be64c8..3eacbd135257 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XcodeTool.cs @@ -48,15 +48,15 @@ protected abstract string DefaultBinDir { } protected string DeveloperRootBinDir { - get { return Path.Combine (SdkDevPath, "usr", "bin"); } + get { return Path.Combine (GetSdkDevPath (), "usr", "bin"); } } protected string DevicePlatformBinDir { - get { return Path.Combine (SdkDevPath, "Platforms", "iPhoneOS.platform", "Developer", "usr", "bin"); } + get { return Path.Combine (GetSdkDevPath (), "Platforms", "iPhoneOS.platform", "Developer", "usr", "bin"); } } protected string SimulatorPlatformBinDir { - get { return Path.Combine (SdkDevPath, "Platforms", "iPhoneSimulator.platform", "Developer", "usr", "bin"); } + get { return Path.Combine (GetSdkDevPath (), "Platforms", "iPhoneSimulator.platform", "Developer", "usr", "bin"); } } protected abstract string ToolName { get; } From 2955eba4be3aab4dc82029bca8daa20aada24c1e Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 20 Jan 2026 09:25:12 +0100 Subject: [PATCH 3/3] Fix test. --- .../TaskTests/MergeAppBundleTaskTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MergeAppBundleTaskTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MergeAppBundleTaskTest.cs index 16a79e70fb84..b5d2723c775d 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MergeAppBundleTaskTest.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/MergeAppBundleTaskTest.cs @@ -60,6 +60,7 @@ MergeAppBundles CreateTask (string outputBundle, params string [] inputBundles) var task = CreateTask (); task.InputAppBundles = inputItems.ToArray (); task.OutputAppBundle = outputBundle; + task.SdkDevPath = Configuration.xcode_root; return task; } @@ -98,7 +99,7 @@ public void TestLipoExecutable () var outputBundle = Path.Combine (Cache.CreateTemporaryDirectory (), "Merged.app"); var task = CreateTask (outputBundle, bundles); - Assert.IsTrue (task.Execute (), "Task execution"); + ExecuteTask (task); // The bundle should only contain a single file. Assert.AreEqual (1, Directory.GetFileSystemEntries (outputBundle).Length, "Files in bundle");