Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ public class CompileNativeCode : XamarinTask, ICancelableTask, ITaskCallback {
public string DotNetRoot { get; set; } = "";
#endregion

#region Outputs
Comment thread
rolfbjarne marked this conversation as resolved.
[Output]
public ITaskItem [] CompiledOutputFiles { get; set; } = Array.Empty<ITaskItem> ();
#endregion

public override bool Execute ()
{
if (ShouldExecuteRemotely ()) {
Expand Down Expand Up @@ -70,10 +75,10 @@ public override bool Execute ()
var compileInfo = sortedCompileInfo.Select (v => v.Item).ToArray ();

var processes = new Task<Execution> [compileInfo.Length];
var outputFiles = new string [compileInfo.Length];

for (var i = 0; i < compileInfo.Length; i++) {
var info = compileInfo [i];
var src = Path.GetFullPath (info.ItemSpec);
var arguments = new List<string> ();

arguments.Add ("clang");
Expand Down Expand Up @@ -124,9 +129,12 @@ public override bool Execute ()
arguments.AddRange (parsed_args);


var src = info.ItemSpec;
var outputFile = info.GetMetadata ("OutputFile");
if (string.IsNullOrEmpty (outputFile))
outputFile = Path.ChangeExtension (src, ".o");
outputFiles [i] = outputFile; // We keep the relative path for remote builds
src = Path.GetFullPath (src);
outputFile = Path.GetFullPath (outputFile);
arguments.Add ("-o");
arguments.Add (outputFile);
Expand All @@ -139,6 +147,11 @@ public override bool Execute ()

System.Threading.Tasks.Task.WaitAll (processes);

// Collect all output files (regardless of compilation success)
CompiledOutputFiles = outputFiles
.Select (file => new TaskItem (file))
.ToArray ();

return !Log.HasLoggedErrors;
}

Expand Down
78 changes: 62 additions & 16 deletions msbuild/Xamarin.MacDev.Tasks/Tasks/ILLink.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Tasks;
using Microsoft.Build.Utilities;
Expand All @@ -10,17 +11,23 @@
#nullable enable

namespace Xamarin.MacDev.Tasks {
public class ILLink : global::ILLink.Tasks.ILLink {
public class ILLink : global::ILLink.Tasks.ILLink, ITaskCallback {
public string SessionId { get; set; } = string.Empty;

public ITaskItem [] DebugSymbols { get; set; } = Array.Empty<ITaskItem> ();

[Required]
public string LinkerItemsDirectory { get; set; } = string.Empty;

[Required]
public string LinkerCacheDirectory { get; set; } = string.Empty;

[Output]
public ITaskItem [] LinkerOutputItems { get; set; } = Array.Empty<ITaskItem> ();

[Output]
public ITaskItem [] LinkerCacheItems { get; set; } = Array.Empty<ITaskItem> ();

[Output]
public ITaskItem [] LinkedItems { get; set; } = Array.Empty<ITaskItem> ();

Expand All @@ -29,26 +36,17 @@ public override bool Execute ()
if (this.ShouldExecuteRemotely (SessionId))
return new TaskRunner (SessionId, BuildEngine4).RunAsync (this).Result;

// Capture execution start time for Mac-side detection
var executionStartTime = DateTime.UtcNow;
var result = base.Execute ();

var linkerItems = new List<ITaskItem> ();
var linkedItems = new List<ITaskItem> ();

if (result) {
// Adds all the files in the linker-items dir
foreach (var item in Directory.EnumerateFiles (LinkerItemsDirectory)) {
linkerItems.Add (new TaskItem (item));
}

// Adds all the files in the linked output dir
foreach (var item in Directory.EnumerateFiles (OutputDirectory.ItemSpec)) {
linkedItems.Add (new TaskItem (item));
}
// Collect all files and tag those modified during this execution
LinkerOutputItems = GetAllFilesWithMetadata (LinkerItemsDirectory, executionStartTime);
LinkedItems = GetAllFilesWithMetadata (OutputDirectory.ItemSpec, executionStartTime);
LinkerCacheItems = GetAllFilesWithMetadata (LinkerCacheDirectory, executionStartTime);
}

LinkerOutputItems = linkerItems.ToArray ();
LinkedItems = linkedItems.ToArray ();

return result;
}

Expand All @@ -59,5 +57,53 @@ public override void Cancel ()
else
base.Cancel ();
}

ITaskItem [] GetAllFilesWithMetadata (string directory, DateTime executionStartTime)
{
if (string.IsNullOrEmpty (directory) || !Directory.Exists (directory))
return Array.Empty<ITaskItem> ();

return Directory.EnumerateFiles (directory, "*", SearchOption.AllDirectories)
.Select (file => {
var fileInfo = new FileInfo (file);
var item = new TaskItem (file);

// Check if file was created or modified during this execution
var wasModified = fileInfo.CreationTimeUtc >= executionStartTime ||
fileInfo.LastWriteTimeUtc >= executionStartTime;

// Tag files that were modified during this execution
item.SetMetadata ("Modified", wasModified.ToString ());

return item;
})
.ToArray ();
}

// ITaskCallback implementation
public bool ShouldCopyToBuildServer (ITaskItem item) => true;

public bool ShouldCreateOutputFile (ITaskItem item)
{
var modifiedMetadata = item.GetMetadata ("Modified");
var wasModified = bool.TryParse (modifiedMetadata, out var modified) && modified;

// Create output file if it was modified during this execution
if (wasModified) {
Log.LogMessage (MessageImportance.Low, "Output file '{0}' was modified during execution", item.ItemSpec);
return true;
}

// Create output file if it doesn't exist on Windows. We assume if it exists on the Mac we also need it on Windows.
if (!File.Exists (item.ItemSpec)) {
Log.LogMessage (MessageImportance.Low, "Output file '{0}' does not exist", item.ItemSpec);
return true;
}

Comment thread
emaf marked this conversation as resolved.
Log.LogMessage (MessageImportance.Low, "Output file '{0}' exists and was not modified", item.ItemSpec);
return false;
}

public IEnumerable<ITaskItem> GetAdditionalItemsToBeCopied () => Array.Empty<ITaskItem> ();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -419,11 +419,10 @@ Copyright (C) 2011-2013 Xamarin. All rights reserved.
ToolPath="$(_DotNetHostDirectory)"
ILLinkPath="$(_RemoteILLinkPath)"
LinkerItemsDirectory="$(_LinkerItemsDirectory)"
LinkerCacheDirectory="$(_LinkerCacheDirectory)"
DebugSymbols="@(_ILLinkDebugSymbols)"
ContinueOnError="ErrorAndContinue">
<Output TaskParameter="ExitCode" PropertyName="_ILLinkExitCode" />
<Output TaskParameter="LinkedItems" ItemName="_XamarinLinkedItems" />
<Output TaskParameter="LinkerOutputItems" ItemName="_XamarinLinkerItems" />
</Xamarin.MacDev.Tasks.ILLink>

<PropertyGroup>
Expand Down