2016-02-15 18:07:39 +00:00
|
|
|
|
using System;
|
2016-02-02 18:04:50 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
2016-04-02 04:52:08 +00:00
|
|
|
|
using System.Linq;
|
2016-02-02 18:04:50 +00:00
|
|
|
|
using System.Runtime.InteropServices;
|
2016-02-15 18:07:39 +00:00
|
|
|
|
using Microsoft.DotNet.Cli.Build.Framework;
|
|
|
|
|
using Microsoft.Extensions.PlatformAbstractions;
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
using static Microsoft.DotNet.Cli.Build.FS;
|
|
|
|
|
using static Microsoft.DotNet.Cli.Build.Framework.BuildHelpers;
|
2016-03-16 22:54:02 +00:00
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using System.Reflection.PortableExecutable;
|
2016-04-02 04:52:08 +00:00
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
using Newtonsoft.Json;
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
namespace Microsoft.DotNet.Cli.Build
|
|
|
|
|
{
|
|
|
|
|
public class CompileTargets
|
|
|
|
|
{
|
2016-04-08 06:47:47 +00:00
|
|
|
|
public static readonly string CoreCLRVersion = "1.0.2-rc2-24008";
|
2016-02-18 09:21:30 +00:00
|
|
|
|
public static readonly string AppDepSdkVersion = "1.0.6-prerelease-00003";
|
2016-02-27 00:00:54 +00:00
|
|
|
|
public static readonly bool IsWinx86 = CurrentPlatform.IsWindows && CurrentArchitecture.Isx86;
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
public static readonly string[] BinariesForCoreHost = new[]
|
|
|
|
|
{
|
2016-03-23 19:46:38 +00:00
|
|
|
|
"csc"
|
2016-02-02 18:04:50 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public static readonly string[] ProjectsToPublish = new[]
|
|
|
|
|
{
|
|
|
|
|
"dotnet"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public static readonly string[] FilesToClean = new[]
|
|
|
|
|
{
|
2016-03-23 19:46:38 +00:00
|
|
|
|
"vbc.exe"
|
2016-02-02 18:04:50 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
public const string SharedFrameworkName = "Microsoft.NETCore.App";
|
|
|
|
|
|
|
|
|
|
private static string CoreHostBaseName => $"corehost{Constants.ExeSuffix}";
|
|
|
|
|
private static string DotnetHostFxrBaseName => $"{Constants.DynamicLibPrefix}hostfxr{Constants.DynamicLibSuffix}";
|
|
|
|
|
private static string HostPolicyBaseName => $"{Constants.DynamicLibPrefix}hostpolicy{Constants.DynamicLibSuffix}";
|
|
|
|
|
|
2016-03-02 01:42:44 +00:00
|
|
|
|
// Updates the stage 2 with recent changes.
|
|
|
|
|
[Target(nameof(PrepareTargets.Init), nameof(CompileStage2))]
|
|
|
|
|
public static BuildTargetResult UpdateBuild(BuildTargetContext c)
|
|
|
|
|
{
|
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-07 00:45:38 +00:00
|
|
|
|
// Moving PrepareTargets.RestorePackages after PackagePkgProjects because managed code depends on the
|
|
|
|
|
// Microsoft.NETCore.App package that is created during PackagePkgProjects.
|
|
|
|
|
[Target(nameof(PrepareTargets.Init), nameof(PackagePkgProjects), nameof(PrepareTargets.RestorePackages), nameof(CompileStage1), nameof(CompileStage2))]
|
2016-02-02 18:04:50 +00:00
|
|
|
|
public static BuildTargetResult Compile(BuildTargetContext c)
|
|
|
|
|
{
|
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-31 00:59:16 +00:00
|
|
|
|
private static string HostVer = "1.0.1";
|
|
|
|
|
private static string HostPolicyVer = "1.0.1";
|
|
|
|
|
private static string HostFxrVer = "1.0.1";
|
|
|
|
|
|
2016-04-05 00:55:12 +00:00
|
|
|
|
[Target(nameof(PrepareTargets.Init))]
|
2016-02-02 18:04:50 +00:00
|
|
|
|
public static BuildTargetResult CompileCoreHost(BuildTargetContext c)
|
|
|
|
|
{
|
2016-03-31 00:59:16 +00:00
|
|
|
|
var buildVersion = c.BuildContext.Get<BuildVersion>("BuildVersion");
|
|
|
|
|
var versionTag = buildVersion.ReleaseSuffix;
|
|
|
|
|
var buildMajor = buildVersion.CommitCountString;
|
|
|
|
|
|
|
|
|
|
var hostPolicyFullVer = $"{HostPolicyVer}-{versionTag}-{buildMajor}";
|
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
// Generate build files
|
|
|
|
|
var cmakeOut = Path.Combine(Dirs.Corehost, "cmake");
|
|
|
|
|
|
|
|
|
|
Rmdir(cmakeOut);
|
|
|
|
|
Mkdirp(cmakeOut);
|
|
|
|
|
|
2016-02-15 18:07:39 +00:00
|
|
|
|
var configuration = c.BuildContext.Get<string>("Configuration");
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
// Run the build
|
2016-03-24 20:36:58 +00:00
|
|
|
|
string rid = GetRuntimeId();
|
2016-03-31 00:59:16 +00:00
|
|
|
|
string corehostSrcDir = Path.Combine(c.BuildContext.BuildDirectory, "src", "corehost");
|
2016-02-02 18:04:50 +00:00
|
|
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
|
|
|
{
|
|
|
|
|
// Why does Windows directly call cmake but Linux/Mac calls "build.sh" in the corehost dir?
|
|
|
|
|
// See the comment in "src/corehost/build.sh" for details. It doesn't work for some reason.
|
2016-02-24 02:04:49 +00:00
|
|
|
|
var visualStudio = IsWinx86 ? "Visual Studio 14 2015" : "Visual Studio 14 2015 Win64";
|
2016-02-27 00:00:54 +00:00
|
|
|
|
var archMacro = IsWinx86 ? "-DCLI_CMAKE_PLATFORM_ARCH_I386=1" : "-DCLI_CMAKE_PLATFORM_ARCH_AMD64=1";
|
2016-02-22 09:41:25 +00:00
|
|
|
|
var ridMacro = $"-DCLI_CMAKE_RUNTIME_ID:STRING={rid}";
|
2016-03-31 00:59:16 +00:00
|
|
|
|
var arch = IsWinx86 ? "x86" : "x64";
|
|
|
|
|
var baseSupportedRid = $"win7-{arch}";
|
|
|
|
|
var cmakeHostPolicyVer = $"-DCLI_CMAKE_HOST_POLICY_VER:STRING={hostPolicyFullVer}";
|
|
|
|
|
var cmakeBaseRid = $"-DCLI_CMAKE_PKG_RID:STRING={baseSupportedRid}";
|
2016-02-22 09:41:25 +00:00
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
ExecIn(cmakeOut, "cmake",
|
2016-03-31 00:59:16 +00:00
|
|
|
|
corehostSrcDir,
|
2016-02-27 00:00:54 +00:00
|
|
|
|
archMacro,
|
2016-02-22 09:41:25 +00:00
|
|
|
|
ridMacro,
|
2016-03-31 00:59:16 +00:00
|
|
|
|
cmakeHostPolicyVer,
|
|
|
|
|
cmakeBaseRid,
|
2016-02-02 18:04:50 +00:00
|
|
|
|
"-G",
|
2016-02-24 02:04:49 +00:00
|
|
|
|
visualStudio);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
var pf32 = RuntimeInformation.OSArchitecture == Architecture.X64 ?
|
|
|
|
|
Environment.GetEnvironmentVariable("ProgramFiles(x86)") :
|
|
|
|
|
Environment.GetEnvironmentVariable("ProgramFiles");
|
|
|
|
|
|
|
|
|
|
if (configuration.Equals("Release"))
|
|
|
|
|
{
|
|
|
|
|
// Cmake calls it "RelWithDebInfo" in the generated MSBuild
|
|
|
|
|
configuration = "RelWithDebInfo";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Exec(Path.Combine(pf32, "MSBuild", "14.0", "Bin", "MSBuild.exe"),
|
|
|
|
|
Path.Combine(cmakeOut, "ALL_BUILD.vcxproj"),
|
|
|
|
|
$"/p:Configuration={configuration}");
|
|
|
|
|
|
|
|
|
|
// Copy the output out
|
2016-03-31 00:59:16 +00:00
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", configuration, "dotnet.exe"), Path.Combine(Dirs.Corehost, "corehost.exe"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", configuration, "dotnet.pdb"), Path.Combine(Dirs.Corehost, "corehost.pdb"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", configuration, "dotnet.exe"), Path.Combine(Dirs.Corehost, "dotnet.exe"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", configuration, "dotnet.pdb"), Path.Combine(Dirs.Corehost, "dotnet.pdb"), overwrite: true);
|
2016-02-16 20:59:25 +00:00
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "dll", configuration, "hostpolicy.dll"), Path.Combine(Dirs.Corehost, "hostpolicy.dll"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "dll", configuration, "hostpolicy.pdb"), Path.Combine(Dirs.Corehost, "hostpolicy.pdb"), overwrite: true);
|
2016-02-22 09:41:25 +00:00
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "fxr", configuration, "hostfxr.dll"), Path.Combine(Dirs.Corehost, "hostfxr.dll"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "fxr", configuration, "hostfxr.pdb"), Path.Combine(Dirs.Corehost, "hostfxr.pdb"), overwrite: true);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2016-02-22 09:41:25 +00:00
|
|
|
|
ExecIn(cmakeOut, Path.Combine(c.BuildContext.BuildDirectory, "src", "corehost", "build.sh"),
|
|
|
|
|
"--arch",
|
2016-03-31 00:59:16 +00:00
|
|
|
|
"x64",
|
|
|
|
|
"--policyver",
|
|
|
|
|
hostPolicyFullVer,
|
2016-02-22 09:41:25 +00:00
|
|
|
|
"--rid",
|
|
|
|
|
rid);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
// Copy the output out
|
2016-03-31 00:59:16 +00:00
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "dotnet"), Path.Combine(Dirs.Corehost, "dotnet"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "dotnet"), Path.Combine(Dirs.Corehost, CoreHostBaseName), overwrite: true);
|
2016-03-17 17:07:03 +00:00
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "dll", HostPolicyBaseName), Path.Combine(Dirs.Corehost, HostPolicyBaseName), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(cmakeOut, "cli", "fxr", DotnetHostFxrBaseName), Path.Combine(Dirs.Corehost, DotnetHostFxrBaseName), overwrite: true);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
}
|
2016-03-31 00:59:16 +00:00
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
2016-03-31 00:59:16 +00:00
|
|
|
|
[Target(nameof(CompileCoreHost))]
|
2016-04-05 00:55:12 +00:00
|
|
|
|
public static BuildTargetResult PackagePkgProjects(BuildTargetContext c)
|
2016-03-31 00:59:16 +00:00
|
|
|
|
{
|
|
|
|
|
var buildVersion = c.BuildContext.Get<BuildVersion>("BuildVersion");
|
|
|
|
|
var versionTag = buildVersion.ReleaseSuffix;
|
|
|
|
|
var buildMajor = buildVersion.CommitCountString;
|
|
|
|
|
var arch = IsWinx86 ? "x86" : "x64";
|
|
|
|
|
|
|
|
|
|
var version = buildVersion.NuGetVersion;
|
|
|
|
|
var content = $@"{c.BuildContext["CommitHash"]}{Environment.NewLine}{version}{Environment.NewLine}";
|
2016-04-05 00:55:12 +00:00
|
|
|
|
var pkgDir = Path.Combine(c.BuildContext.BuildDirectory, "pkg");
|
|
|
|
|
File.WriteAllText(Path.Combine(pkgDir, "version.txt"), content);
|
2016-03-31 00:59:16 +00:00
|
|
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
|
|
|
{
|
2016-04-05 00:55:12 +00:00
|
|
|
|
Command.Create(Path.Combine(pkgDir, "pack.cmd"))
|
2016-03-31 00:59:16 +00:00
|
|
|
|
// Workaround to arg escaping adding backslashes for arguments to .cmd scripts.
|
|
|
|
|
.Environment("__WorkaroundCliCoreHostBuildArch", arch)
|
|
|
|
|
.Environment("__WorkaroundCliCoreHostBinDir", Dirs.Corehost)
|
|
|
|
|
.Environment("__WorkaroundCliCoreHostPolicyVer", HostPolicyVer)
|
|
|
|
|
.Environment("__WorkaroundCliCoreHostFxrVer", HostFxrVer)
|
|
|
|
|
.Environment("__WorkaroundCliCoreHostVer", HostVer)
|
|
|
|
|
.Environment("__WorkaroundCliCoreHostBuildMajor", buildMajor)
|
|
|
|
|
.Environment("__WorkaroundCliCoreHostVersionTag", versionTag)
|
|
|
|
|
.ForwardStdOut()
|
|
|
|
|
.ForwardStdErr()
|
|
|
|
|
.Execute()
|
|
|
|
|
.EnsureSuccessful();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2016-04-05 00:55:12 +00:00
|
|
|
|
Exec(Path.Combine(pkgDir, "pack.sh"),
|
2016-03-31 00:59:16 +00:00
|
|
|
|
"--arch",
|
|
|
|
|
"x64",
|
|
|
|
|
"--hostbindir",
|
|
|
|
|
Dirs.Corehost,
|
|
|
|
|
"--policyver",
|
|
|
|
|
HostPolicyVer,
|
|
|
|
|
"--fxrver",
|
|
|
|
|
HostFxrVer,
|
|
|
|
|
"--hostver",
|
|
|
|
|
HostVer,
|
|
|
|
|
"--build",
|
|
|
|
|
buildMajor,
|
|
|
|
|
"--vertag",
|
|
|
|
|
versionTag);
|
|
|
|
|
}
|
|
|
|
|
int runtimeCount = 0;
|
2016-04-05 00:55:12 +00:00
|
|
|
|
foreach (var file in Directory.GetFiles(Path.Combine(pkgDir, "bin", "packages"), "*.nupkg"))
|
2016-03-31 00:59:16 +00:00
|
|
|
|
{
|
|
|
|
|
var fileName = Path.GetFileName(file);
|
2016-04-05 00:55:12 +00:00
|
|
|
|
File.Copy(file, Path.Combine(Dirs.Corehost, fileName), true);
|
2016-03-31 00:59:16 +00:00
|
|
|
|
runtimeCount += (fileName.StartsWith("runtime.") ? 1 : 0);
|
2016-04-06 22:28:12 +00:00
|
|
|
|
|
|
|
|
|
Console.WriteLine($"Copying package {fileName} to artifacts directory {Dirs.Corehost}.");
|
2016-03-31 00:59:16 +00:00
|
|
|
|
}
|
|
|
|
|
if (runtimeCount < 3)
|
|
|
|
|
{
|
|
|
|
|
throw new BuildFailureException("Not all corehost nupkgs were successfully created");
|
|
|
|
|
}
|
2016-02-02 18:04:50 +00:00
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-24 20:36:58 +00:00
|
|
|
|
private static string GetRuntimeId()
|
|
|
|
|
{
|
|
|
|
|
string info = DotNetCli.Stage0.Exec("", "--info").CaptureStdOut().Execute().StdOut;
|
|
|
|
|
string rid = Array.Find<string>(info.Split(Environment.NewLine.ToCharArray()), (e) => e.Contains("RID:"))?.Replace("RID:", "").Trim();
|
|
|
|
|
|
|
|
|
|
// TODO: when Stage0 is updated with the new --info, remove this legacy check for --version
|
|
|
|
|
if (string.IsNullOrEmpty(rid))
|
|
|
|
|
{
|
|
|
|
|
string version = DotNetCli.Stage0.Exec("", "--version").CaptureStdOut().Execute().StdOut;
|
|
|
|
|
rid = Array.Find<string>(version.Split(Environment.NewLine.ToCharArray()), (e) => e.Contains("Runtime Id:")).Replace("Runtime Id:", "").Trim();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(rid))
|
|
|
|
|
{
|
|
|
|
|
throw new BuildFailureException("Could not find the Runtime ID from Stage0 --info or --version");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rid;
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
[Target]
|
|
|
|
|
public static BuildTargetResult CompileStage1(BuildTargetContext c)
|
|
|
|
|
{
|
|
|
|
|
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "src"));
|
|
|
|
|
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "test"));
|
2016-03-17 00:54:44 +00:00
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
if (Directory.Exists(Dirs.Stage1))
|
|
|
|
|
{
|
|
|
|
|
Utils.DeleteDirectory(Dirs.Stage1);
|
|
|
|
|
}
|
|
|
|
|
Directory.CreateDirectory(Dirs.Stage1);
|
|
|
|
|
|
|
|
|
|
CopySharedHost(Dirs.Stage1);
|
2016-03-17 00:54:44 +00:00
|
|
|
|
PublishSharedFramework(c, Dirs.Stage1, DotNetCli.Stage0);
|
2016-03-23 19:46:38 +00:00
|
|
|
|
var result = CompileCliSdk(c,
|
2016-02-02 18:04:50 +00:00
|
|
|
|
dotnet: DotNetCli.Stage0,
|
|
|
|
|
outputDir: Dirs.Stage1);
|
2016-03-23 19:46:38 +00:00
|
|
|
|
|
|
|
|
|
CleanOutputDir(Path.Combine(Dirs.Stage1, "sdk"));
|
2016-04-05 03:13:13 +00:00
|
|
|
|
FS.CopyRecursive(Dirs.Stage1, Dirs.Stage1Symbols);
|
|
|
|
|
|
|
|
|
|
RemovePdbsFromDir(Path.Combine(Dirs.Stage1, "sdk"));
|
2016-03-23 19:46:38 +00:00
|
|
|
|
|
|
|
|
|
return result;
|
2016-02-02 18:04:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Target]
|
|
|
|
|
public static BuildTargetResult CompileStage2(BuildTargetContext c)
|
|
|
|
|
{
|
2016-02-15 18:07:39 +00:00
|
|
|
|
var configuration = c.BuildContext.Get<string>("Configuration");
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "src"));
|
|
|
|
|
CleanBinObj(c, Path.Combine(c.BuildContext.BuildDirectory, "test"));
|
2016-03-17 00:54:44 +00:00
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
if (Directory.Exists(Dirs.Stage2))
|
|
|
|
|
{
|
|
|
|
|
Utils.DeleteDirectory(Dirs.Stage2);
|
|
|
|
|
}
|
|
|
|
|
Directory.CreateDirectory(Dirs.Stage2);
|
|
|
|
|
|
2016-03-17 00:54:44 +00:00
|
|
|
|
PublishSharedFramework(c, Dirs.Stage2, DotNetCli.Stage1);
|
2016-03-16 22:54:02 +00:00
|
|
|
|
CopySharedHost(Dirs.Stage2);
|
|
|
|
|
var result = CompileCliSdk(c,
|
2016-02-02 18:04:50 +00:00
|
|
|
|
dotnet: DotNetCli.Stage1,
|
|
|
|
|
outputDir: Dirs.Stage2);
|
2016-02-15 17:42:17 +00:00
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
if (!result.Success)
|
|
|
|
|
{
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
Extract dotnet-compile-fsc into a standalone command
Add basic Tests for dotnet-compile-fsc
Package Targets execute before TestTargets. Use Generated Nuget Packages in TestTargets. Generate Nuget packages on all platforms, and in C#
Fix bug in dotnet-restore, change fsharp new template, add support for native assets in DependencyContextCsvReader
copy fsc.exe to temp directory instead of package cache
fix rebase error
fix issue
fixes
fixes
fix
temporarily disable debian package e2e testing
fixes
bump fsc version
update fsc version
fix rebase errors
WIP update fsc tool
WIP, rebased and working again, need to solve issues with System.CommandLine
Working state for packaged, command, fsc.exe bugging out with dlopen(, 1): no suitable image found.
execute fsc like a unpublished standalone app
fixup after rebase
working? internet is out
working
cleanup
More cleanup, and run the debian package tests during the Test phase of the build.
update FSharp Test Projects NetStandard Library Version
Update Version Suffix when packing TestPackages. This will enable packing with the right dependency versions on Windows.
update dotnet-test version
Undo the reordering of the build
fix test package project pathsj
ignore net451 build failures for test packages which we need to build on non-windows
update dependency of desktop test app
add dotnetcli feed to nuget config for fsharp dotnet new
update deps after rebase
update dependency of dotnet-compile-fsc
pass args before commandPath when using muxer for tools
adjust testpackage cleaning not to clean packages which are also generated as part of the product from the nuget cache.
undo
Pass projectJson to pack instead of using WorkingDirectory
fix path separators using depsjsoncommandresolver on windows, fix building only specific frameworks for testpackages on non-windows.
PR Feedback
rebase
overwrite fsc runtimeconfig
2016-03-12 00:41:00 +00:00
|
|
|
|
if (CurrentPlatform.IsWindows)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
Extract dotnet-compile-fsc into a standalone command
Add basic Tests for dotnet-compile-fsc
Package Targets execute before TestTargets. Use Generated Nuget Packages in TestTargets. Generate Nuget packages on all platforms, and in C#
Fix bug in dotnet-restore, change fsharp new template, add support for native assets in DependencyContextCsvReader
copy fsc.exe to temp directory instead of package cache
fix rebase error
fix issue
fixes
fixes
fix
temporarily disable debian package e2e testing
fixes
bump fsc version
update fsc version
fix rebase errors
WIP update fsc tool
WIP, rebased and working again, need to solve issues with System.CommandLine
Working state for packaged, command, fsc.exe bugging out with dlopen(, 1): no suitable image found.
execute fsc like a unpublished standalone app
fixup after rebase
working? internet is out
working
cleanup
More cleanup, and run the debian package tests during the Test phase of the build.
update FSharp Test Projects NetStandard Library Version
Update Version Suffix when packing TestPackages. This will enable packing with the right dependency versions on Windows.
update dotnet-test version
Undo the reordering of the build
fix test package project pathsj
ignore net451 build failures for test packages which we need to build on non-windows
update dependency of desktop test app
add dotnetcli feed to nuget config for fsharp dotnet new
update deps after rebase
update dependency of dotnet-compile-fsc
pass args before commandPath when using muxer for tools
adjust testpackage cleaning not to clean packages which are also generated as part of the product from the nuget cache.
undo
Pass projectJson to pack instead of using WorkingDirectory
fix path separators using depsjsoncommandresolver on windows, fix building only specific frameworks for testpackages on non-windows.
PR Feedback
rebase
overwrite fsc runtimeconfig
2016-03-12 00:41:00 +00:00
|
|
|
|
// build projects for nuget packages
|
2016-02-02 18:04:50 +00:00
|
|
|
|
var packagingOutputDir = Path.Combine(Dirs.Stage2Compilation, "forPackaging");
|
|
|
|
|
Mkdirp(packagingOutputDir);
|
Extract dotnet-compile-fsc into a standalone command
Add basic Tests for dotnet-compile-fsc
Package Targets execute before TestTargets. Use Generated Nuget Packages in TestTargets. Generate Nuget packages on all platforms, and in C#
Fix bug in dotnet-restore, change fsharp new template, add support for native assets in DependencyContextCsvReader
copy fsc.exe to temp directory instead of package cache
fix rebase error
fix issue
fixes
fixes
fix
temporarily disable debian package e2e testing
fixes
bump fsc version
update fsc version
fix rebase errors
WIP update fsc tool
WIP, rebased and working again, need to solve issues with System.CommandLine
Working state for packaged, command, fsc.exe bugging out with dlopen(, 1): no suitable image found.
execute fsc like a unpublished standalone app
fixup after rebase
working? internet is out
working
cleanup
More cleanup, and run the debian package tests during the Test phase of the build.
update FSharp Test Projects NetStandard Library Version
Update Version Suffix when packing TestPackages. This will enable packing with the right dependency versions on Windows.
update dotnet-test version
Undo the reordering of the build
fix test package project pathsj
ignore net451 build failures for test packages which we need to build on non-windows
update dependency of desktop test app
add dotnetcli feed to nuget config for fsharp dotnet new
update deps after rebase
update dependency of dotnet-compile-fsc
pass args before commandPath when using muxer for tools
adjust testpackage cleaning not to clean packages which are also generated as part of the product from the nuget cache.
undo
Pass projectJson to pack instead of using WorkingDirectory
fix path separators using depsjsoncommandresolver on windows, fix building only specific frameworks for testpackages on non-windows.
PR Feedback
rebase
overwrite fsc runtimeconfig
2016-03-12 00:41:00 +00:00
|
|
|
|
foreach (var project in PackageTargets.ProjectsToPack)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
|
|
|
|
// Just build them, we'll pack later
|
Extract dotnet-compile-fsc into a standalone command
Add basic Tests for dotnet-compile-fsc
Package Targets execute before TestTargets. Use Generated Nuget Packages in TestTargets. Generate Nuget packages on all platforms, and in C#
Fix bug in dotnet-restore, change fsharp new template, add support for native assets in DependencyContextCsvReader
copy fsc.exe to temp directory instead of package cache
fix rebase error
fix issue
fixes
fixes
fix
temporarily disable debian package e2e testing
fixes
bump fsc version
update fsc version
fix rebase errors
WIP update fsc tool
WIP, rebased and working again, need to solve issues with System.CommandLine
Working state for packaged, command, fsc.exe bugging out with dlopen(, 1): no suitable image found.
execute fsc like a unpublished standalone app
fixup after rebase
working? internet is out
working
cleanup
More cleanup, and run the debian package tests during the Test phase of the build.
update FSharp Test Projects NetStandard Library Version
Update Version Suffix when packing TestPackages. This will enable packing with the right dependency versions on Windows.
update dotnet-test version
Undo the reordering of the build
fix test package project pathsj
ignore net451 build failures for test packages which we need to build on non-windows
update dependency of desktop test app
add dotnetcli feed to nuget config for fsharp dotnet new
update deps after rebase
update dependency of dotnet-compile-fsc
pass args before commandPath when using muxer for tools
adjust testpackage cleaning not to clean packages which are also generated as part of the product from the nuget cache.
undo
Pass projectJson to pack instead of using WorkingDirectory
fix path separators using depsjsoncommandresolver on windows, fix building only specific frameworks for testpackages on non-windows.
PR Feedback
rebase
overwrite fsc runtimeconfig
2016-03-12 00:41:00 +00:00
|
|
|
|
var packBuildResult = DotNetCli.Stage1.Build(
|
2016-02-02 18:04:50 +00:00
|
|
|
|
"--build-base-path",
|
|
|
|
|
packagingOutputDir,
|
|
|
|
|
"--configuration",
|
|
|
|
|
configuration,
|
|
|
|
|
Path.Combine(c.BuildContext.BuildDirectory, "src", project))
|
Extract dotnet-compile-fsc into a standalone command
Add basic Tests for dotnet-compile-fsc
Package Targets execute before TestTargets. Use Generated Nuget Packages in TestTargets. Generate Nuget packages on all platforms, and in C#
Fix bug in dotnet-restore, change fsharp new template, add support for native assets in DependencyContextCsvReader
copy fsc.exe to temp directory instead of package cache
fix rebase error
fix issue
fixes
fixes
fix
temporarily disable debian package e2e testing
fixes
bump fsc version
update fsc version
fix rebase errors
WIP update fsc tool
WIP, rebased and working again, need to solve issues with System.CommandLine
Working state for packaged, command, fsc.exe bugging out with dlopen(, 1): no suitable image found.
execute fsc like a unpublished standalone app
fixup after rebase
working? internet is out
working
cleanup
More cleanup, and run the debian package tests during the Test phase of the build.
update FSharp Test Projects NetStandard Library Version
Update Version Suffix when packing TestPackages. This will enable packing with the right dependency versions on Windows.
update dotnet-test version
Undo the reordering of the build
fix test package project pathsj
ignore net451 build failures for test packages which we need to build on non-windows
update dependency of desktop test app
add dotnetcli feed to nuget config for fsharp dotnet new
update deps after rebase
update dependency of dotnet-compile-fsc
pass args before commandPath when using muxer for tools
adjust testpackage cleaning not to clean packages which are also generated as part of the product from the nuget cache.
undo
Pass projectJson to pack instead of using WorkingDirectory
fix path separators using depsjsoncommandresolver on windows, fix building only specific frameworks for testpackages on non-windows.
PR Feedback
rebase
overwrite fsc runtimeconfig
2016-03-12 00:41:00 +00:00
|
|
|
|
.Execute();
|
|
|
|
|
|
|
|
|
|
packBuildResult.EnsureSuccessful();
|
2016-02-02 18:04:50 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-23 19:46:38 +00:00
|
|
|
|
CleanOutputDir(Path.Combine(Dirs.Stage2, "sdk"));
|
2016-04-05 03:13:13 +00:00
|
|
|
|
FS.CopyRecursive(Dirs.Stage2, Dirs.Stage2Symbols);
|
|
|
|
|
|
|
|
|
|
RemovePdbsFromDir(Path.Combine(Dirs.Stage2, "sdk"));
|
2016-03-23 19:46:38 +00:00
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-23 19:46:38 +00:00
|
|
|
|
private static void CleanOutputDir(string directory)
|
|
|
|
|
{
|
2016-04-05 03:13:13 +00:00
|
|
|
|
foreach (var file in FilesToClean)
|
|
|
|
|
{
|
|
|
|
|
FS.RmFilesInDirRecursive(directory, file);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void RemovePdbsFromDir(string directory)
|
|
|
|
|
{
|
2016-03-23 19:46:38 +00:00
|
|
|
|
FS.RmFilesInDirRecursive(directory, "*.pdb");
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
private static void CopySharedHost(string outputDir)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
2016-03-16 22:54:02 +00:00
|
|
|
|
// corehost will be renamed to dotnet at some point and then this can be removed.
|
|
|
|
|
File.Copy(
|
|
|
|
|
Path.Combine(Dirs.Corehost, CoreHostBaseName),
|
|
|
|
|
Path.Combine(outputDir, $"dotnet{Constants.ExeSuffix}"), true);
|
|
|
|
|
File.Copy(
|
|
|
|
|
Path.Combine(Dirs.Corehost, DotnetHostFxrBaseName),
|
|
|
|
|
Path.Combine(outputDir, DotnetHostFxrBaseName), true);
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-17 00:54:44 +00:00
|
|
|
|
public static void PublishSharedFramework(BuildTargetContext c, string outputDir, DotNetCli dotnetCli)
|
2016-03-16 22:54:02 +00:00
|
|
|
|
{
|
2016-04-07 00:45:38 +00:00
|
|
|
|
string SharedFrameworkTemplateSourceRoot = Path.Combine(Dirs.RepoRoot, "src", "sharedframework", "framework");
|
2016-03-17 00:54:44 +00:00
|
|
|
|
string SharedFrameworkNugetVersion = c.BuildContext.Get<string>("SharedFrameworkNugetVersion");
|
2016-03-16 22:54:02 +00:00
|
|
|
|
|
2016-04-07 00:45:38 +00:00
|
|
|
|
string sharedFrameworkRid;
|
|
|
|
|
if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Windows)
|
|
|
|
|
{
|
|
|
|
|
sharedFrameworkRid = $"win7-{PlatformServices.Default.Runtime.RuntimeArchitecture}";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sharedFrameworkRid = PlatformServices.Default.Runtime.GetRuntimeIdentifier();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string SharedFrameworkSourceRoot = GenerateSharedFrameworkProject(c, SharedFrameworkTemplateSourceRoot, sharedFrameworkRid);
|
|
|
|
|
|
|
|
|
|
dotnetCli.Restore("--verbosity", "verbose", "--disable-parallel", "--infer-runtimes", "--fallbacksource", Dirs.Corehost)
|
|
|
|
|
.WorkingDirectory(SharedFrameworkSourceRoot)
|
|
|
|
|
.Execute()
|
|
|
|
|
.EnsureSuccessful();
|
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
// We publish to a sub folder of the PublishRoot so tools like heat and zip can generate folder structures easier.
|
|
|
|
|
string SharedFrameworkNameAndVersionRoot = Path.Combine(outputDir, "shared", SharedFrameworkName, SharedFrameworkNugetVersion);
|
2016-03-24 16:36:05 +00:00
|
|
|
|
c.BuildContext["SharedFrameworkPath"] = SharedFrameworkNameAndVersionRoot;
|
2016-03-16 22:54:02 +00:00
|
|
|
|
|
|
|
|
|
if (Directory.Exists(SharedFrameworkNameAndVersionRoot))
|
|
|
|
|
{
|
|
|
|
|
Utils.DeleteDirectory(SharedFrameworkNameAndVersionRoot);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string publishFramework = "dnxcore50"; // Temporary, use "netcoreapp" when we update nuget.
|
|
|
|
|
|
|
|
|
|
dotnetCli.Publish(
|
|
|
|
|
"--output", SharedFrameworkNameAndVersionRoot,
|
2016-04-07 00:45:38 +00:00
|
|
|
|
"-r", sharedFrameworkRid,
|
2016-03-16 22:54:02 +00:00
|
|
|
|
"-f", publishFramework,
|
|
|
|
|
SharedFrameworkSourceRoot).Execute().EnsureSuccessful();
|
|
|
|
|
|
|
|
|
|
// Clean up artifacts that dotnet-publish generates which we don't need
|
2016-03-24 16:36:05 +00:00
|
|
|
|
DeleteMainPublishOutput(SharedFrameworkNameAndVersionRoot, "framework");
|
2016-03-16 22:54:02 +00:00
|
|
|
|
File.Delete(Path.Combine(SharedFrameworkNameAndVersionRoot, "framework.runtimeconfig.json"));
|
|
|
|
|
|
|
|
|
|
// Rename the .deps file
|
|
|
|
|
var destinationDeps = Path.Combine(SharedFrameworkNameAndVersionRoot, $"{SharedFrameworkName}.deps.json");
|
|
|
|
|
File.Move(Path.Combine(SharedFrameworkNameAndVersionRoot, "framework.deps.json"), destinationDeps);
|
2016-04-02 04:52:08 +00:00
|
|
|
|
ChangeEntryPointLibraryName(destinationDeps, null);
|
2016-03-16 22:54:02 +00:00
|
|
|
|
|
|
|
|
|
// Generate RID fallback graph
|
|
|
|
|
string runtimeGraphGeneratorRuntime = null;
|
|
|
|
|
switch (PlatformServices.Default.Runtime.OperatingSystemPlatform)
|
|
|
|
|
{
|
|
|
|
|
case Platform.Windows:
|
|
|
|
|
runtimeGraphGeneratorRuntime = "win";
|
|
|
|
|
break;
|
|
|
|
|
case Platform.Linux:
|
|
|
|
|
runtimeGraphGeneratorRuntime = "linux";
|
|
|
|
|
break;
|
|
|
|
|
case Platform.Darwin:
|
|
|
|
|
runtimeGraphGeneratorRuntime = "osx";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!string.IsNullOrEmpty(runtimeGraphGeneratorRuntime))
|
|
|
|
|
{
|
|
|
|
|
var runtimeGraphGeneratorName = "RuntimeGraphGenerator";
|
|
|
|
|
var runtimeGraphGeneratorProject = Path.Combine(Dirs.RepoRoot, "tools", runtimeGraphGeneratorName);
|
|
|
|
|
var runtimeGraphGeneratorOutput = Path.Combine(Dirs.Output, "tools", runtimeGraphGeneratorName);
|
|
|
|
|
|
|
|
|
|
dotnetCli.Publish(
|
|
|
|
|
"--output", runtimeGraphGeneratorOutput,
|
|
|
|
|
runtimeGraphGeneratorProject).Execute().EnsureSuccessful();
|
|
|
|
|
var runtimeGraphGeneratorExe = Path.Combine(runtimeGraphGeneratorOutput, $"{runtimeGraphGeneratorName}{Constants.ExeSuffix}");
|
|
|
|
|
|
|
|
|
|
Cmd(runtimeGraphGeneratorExe, "--project", SharedFrameworkSourceRoot, "--deps", destinationDeps, runtimeGraphGeneratorRuntime)
|
2016-03-22 22:46:14 +00:00
|
|
|
|
.Execute()
|
|
|
|
|
.EnsureSuccessful();
|
2016-03-16 22:54:02 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
c.Error($"Could not determine rid graph generation runtime for platform {PlatformServices.Default.Runtime.OperatingSystemPlatform}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// corehost will be renamed to dotnet at some point and then we will not need to rename it here.
|
|
|
|
|
File.Copy(
|
|
|
|
|
Path.Combine(Dirs.Corehost, CoreHostBaseName),
|
2016-03-25 18:29:33 +00:00
|
|
|
|
Path.Combine(SharedFrameworkNameAndVersionRoot, $"dotnet{Constants.ExeSuffix}"), true);
|
2016-03-24 16:36:05 +00:00
|
|
|
|
File.Copy(
|
|
|
|
|
Path.Combine(Dirs.Corehost, CoreHostBaseName),
|
|
|
|
|
Path.Combine(SharedFrameworkNameAndVersionRoot, CoreHostBaseName), true);
|
2016-03-16 22:54:02 +00:00
|
|
|
|
File.Copy(
|
|
|
|
|
Path.Combine(Dirs.Corehost, HostPolicyBaseName),
|
|
|
|
|
Path.Combine(SharedFrameworkNameAndVersionRoot, HostPolicyBaseName), true);
|
|
|
|
|
|
|
|
|
|
if (File.Exists(Path.Combine(SharedFrameworkNameAndVersionRoot, "mscorlib.ni.dll")))
|
|
|
|
|
{
|
|
|
|
|
// Publish already places the crossgen'd version of mscorlib into the output, so we can
|
|
|
|
|
// remove the IL version
|
|
|
|
|
File.Delete(Path.Combine(SharedFrameworkNameAndVersionRoot, "mscorlib.dll"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CrossgenSharedFx(c, SharedFrameworkNameAndVersionRoot);
|
2016-03-23 23:37:59 +00:00
|
|
|
|
|
|
|
|
|
// Generate .version file for sharedfx
|
|
|
|
|
var version = SharedFrameworkNugetVersion;
|
|
|
|
|
var content = $@"{c.BuildContext["CommitHash"]}{Environment.NewLine}{version}{Environment.NewLine}";
|
|
|
|
|
File.WriteAllText(Path.Combine(SharedFrameworkNameAndVersionRoot, ".version"), content);
|
2016-03-16 22:54:02 +00:00
|
|
|
|
}
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
2016-04-07 00:45:38 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Generates the real shared framework project that will get published.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sharedFrameworkTemplatePath">The "sharedFramework" source template folder.</param>
|
|
|
|
|
private static string GenerateSharedFrameworkProject(BuildTargetContext c, string sharedFrameworkTemplatePath, string rid)
|
|
|
|
|
{
|
|
|
|
|
string sharedFrameworkProjectPath = Path.Combine(Dirs.Intermediate, "sharedFramework", "framework");
|
|
|
|
|
Utils.DeleteDirectory(sharedFrameworkProjectPath);
|
|
|
|
|
CopyRecursive(sharedFrameworkTemplatePath, sharedFrameworkProjectPath, true);
|
|
|
|
|
|
|
|
|
|
string templateFile = Path.Combine(sharedFrameworkProjectPath, "project.json.template");
|
|
|
|
|
JObject sharedFrameworkProject = JsonUtils.ReadProject(templateFile);
|
|
|
|
|
sharedFrameworkProject["dependencies"]["Microsoft.NETCore.App"] = c.BuildContext.Get<BuildVersion>("BuildVersion").NetCoreAppVersion;
|
|
|
|
|
((JObject)sharedFrameworkProject["runtimes"]).RemoveAll();
|
|
|
|
|
sharedFrameworkProject["runtimes"][rid] = new JObject();
|
|
|
|
|
|
|
|
|
|
string projectJsonPath = Path.Combine(sharedFrameworkProjectPath, "project.json");
|
|
|
|
|
JsonUtils.WriteProject(sharedFrameworkProject, projectJsonPath);
|
|
|
|
|
|
|
|
|
|
Rm(templateFile);
|
|
|
|
|
|
|
|
|
|
return sharedFrameworkProjectPath;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
private static BuildTargetResult CompileCliSdk(BuildTargetContext c, DotNetCli dotnet, string outputDir)
|
|
|
|
|
{
|
2016-02-15 18:07:39 +00:00
|
|
|
|
var configuration = c.BuildContext.Get<string>("Configuration");
|
2016-03-16 22:54:02 +00:00
|
|
|
|
var buildVersion = c.BuildContext.Get<BuildVersion>("BuildVersion");
|
|
|
|
|
outputDir = Path.Combine(outputDir, "sdk", buildVersion.NuGetVersion);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
Rmdir(outputDir);
|
|
|
|
|
Mkdirp(outputDir);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
|
|
|
|
foreach (var project in ProjectsToPublish)
|
|
|
|
|
{
|
2016-02-18 09:09:23 +00:00
|
|
|
|
// TODO: Use the flag once we get a full build round tripped
|
|
|
|
|
// --version-suffix buildVesion.VersionSuffix
|
2016-02-02 18:04:50 +00:00
|
|
|
|
dotnet.Publish(
|
|
|
|
|
"--native-subdirectory",
|
|
|
|
|
"--output",
|
2016-03-16 22:54:02 +00:00
|
|
|
|
outputDir,
|
2016-02-02 18:04:50 +00:00
|
|
|
|
"--configuration",
|
|
|
|
|
configuration,
|
|
|
|
|
Path.Combine(c.BuildContext.BuildDirectory, "src", project))
|
2016-03-16 22:54:02 +00:00
|
|
|
|
.Environment("DOTNET_BUILD_VERSION", buildVersion.VersionSuffix)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
.Execute()
|
|
|
|
|
.EnsureSuccessful();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FixModeFlags(outputDir);
|
|
|
|
|
|
2016-03-24 16:36:05 +00:00
|
|
|
|
string compilersProject = Path.Combine(Dirs.RepoRoot, "src", "compilers");
|
|
|
|
|
dotnet.Publish(compilersProject,
|
|
|
|
|
"--output",
|
|
|
|
|
outputDir,
|
|
|
|
|
"--framework",
|
2016-04-02 04:52:08 +00:00
|
|
|
|
"netstandard1.5")
|
2016-03-24 16:36:05 +00:00
|
|
|
|
.Execute()
|
|
|
|
|
.EnsureSuccessful();
|
|
|
|
|
|
|
|
|
|
var compilersDeps = Path.Combine(outputDir, "compilers.deps.json");
|
|
|
|
|
var compilersRuntimeConfig = Path.Combine(outputDir, "compilers.runtimeconfig.json");
|
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
// Copy corehost
|
2016-03-16 22:54:02 +00:00
|
|
|
|
File.Copy(Path.Combine(Dirs.Corehost, $"corehost{Constants.ExeSuffix}"), Path.Combine(outputDir, $"corehost{Constants.ExeSuffix}"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(Dirs.Corehost, $"{Constants.DynamicLibPrefix}hostpolicy{Constants.DynamicLibSuffix}"), Path.Combine(outputDir, $"{Constants.DynamicLibPrefix}hostpolicy{Constants.DynamicLibSuffix}"), overwrite: true);
|
|
|
|
|
File.Copy(Path.Combine(Dirs.Corehost, $"{Constants.DynamicLibPrefix}hostfxr{Constants.DynamicLibSuffix}"), Path.Combine(outputDir, $"{Constants.DynamicLibPrefix}hostfxr{Constants.DynamicLibSuffix}"), overwrite: true);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
|
2016-03-24 16:36:05 +00:00
|
|
|
|
var binaryToCorehostifyOutDir = Path.Combine(outputDir, "runtimes", "any", "native");
|
2016-02-02 18:04:50 +00:00
|
|
|
|
// Corehostify binaries
|
2016-02-15 17:42:17 +00:00
|
|
|
|
foreach (var binaryToCorehostify in BinariesForCoreHost)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// Yes, it is .exe even on Linux. This is the managed exe we're working with
|
2016-03-24 16:36:05 +00:00
|
|
|
|
File.Copy(Path.Combine(binaryToCorehostifyOutDir, $"{binaryToCorehostify}.exe"), Path.Combine(outputDir, $"{binaryToCorehostify}.dll"));
|
|
|
|
|
File.Delete(Path.Combine(binaryToCorehostifyOutDir, $"{binaryToCorehostify}.exe"));
|
|
|
|
|
File.Copy(compilersDeps, Path.Combine(outputDir, binaryToCorehostify + ".deps.json"));
|
|
|
|
|
File.Copy(compilersRuntimeConfig, Path.Combine(outputDir, binaryToCorehostify + ".runtimeconfig.json"));
|
2016-04-02 04:52:08 +00:00
|
|
|
|
ChangeEntryPointLibraryName(Path.Combine(outputDir, binaryToCorehostify + ".deps.json"), binaryToCorehostify);
|
2016-02-02 18:04:50 +00:00
|
|
|
|
}
|
2016-02-15 17:42:17 +00:00
|
|
|
|
catch (Exception ex)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
|
|
|
|
return c.Failed($"Failed to corehostify '{binaryToCorehostify}': {ex.ToString()}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-24 16:36:05 +00:00
|
|
|
|
// cleanup compilers project output we don't need
|
|
|
|
|
DeleteMainPublishOutput(outputDir, "compilers");
|
|
|
|
|
File.Delete(compilersDeps);
|
|
|
|
|
File.Delete(compilersRuntimeConfig);
|
2016-02-19 02:03:26 +00:00
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
// Copy AppDeps
|
2016-03-29 04:43:43 +00:00
|
|
|
|
var result = CopyAppDeps(c, outputDir);
|
2016-02-15 17:42:17 +00:00
|
|
|
|
if (!result.Success)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Generate .version file
|
2016-03-24 00:13:58 +00:00
|
|
|
|
var version = buildVersion.NuGetVersion;
|
2016-02-13 01:16:28 +00:00
|
|
|
|
var content = $@"{c.BuildContext["CommitHash"]}{Environment.NewLine}{version}{Environment.NewLine}";
|
2016-02-02 18:04:50 +00:00
|
|
|
|
File.WriteAllText(Path.Combine(outputDir, ".version"), content);
|
|
|
|
|
|
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static BuildTargetResult CopyAppDeps(BuildTargetContext c, string outputDir)
|
|
|
|
|
{
|
|
|
|
|
var appDepOutputDir = Path.Combine(outputDir, "appdepsdk");
|
|
|
|
|
Rmdir(appDepOutputDir);
|
|
|
|
|
Mkdirp(appDepOutputDir);
|
|
|
|
|
|
|
|
|
|
// Find toolchain package
|
|
|
|
|
string packageId;
|
2016-02-24 02:04:49 +00:00
|
|
|
|
|
2016-03-02 21:20:45 +00:00
|
|
|
|
if (CurrentPlatform.IsWindows)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
2016-03-02 21:20:45 +00:00
|
|
|
|
if (CurrentArchitecture.Isx86)
|
2016-02-24 02:04:49 +00:00
|
|
|
|
{
|
|
|
|
|
// https://github.com/dotnet/cli/issues/1550
|
|
|
|
|
c.Warn("Native compilation is not yet working on Windows x86");
|
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-02 18:04:50 +00:00
|
|
|
|
packageId = "toolchain.win7-x64.Microsoft.DotNet.AppDep";
|
|
|
|
|
}
|
2016-03-02 21:20:45 +00:00
|
|
|
|
else if (CurrentPlatform.IsUbuntu)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
2016-03-02 21:20:45 +00:00
|
|
|
|
packageId = "toolchain.ubuntu.14.04-x64.Microsoft.DotNet.AppDep";
|
|
|
|
|
}
|
2016-03-03 18:38:58 +00:00
|
|
|
|
else if (CurrentPlatform.IsCentOS || CurrentPlatform.IsRHEL || CurrentPlatform.IsDebian)
|
2016-03-02 21:20:45 +00:00
|
|
|
|
{
|
|
|
|
|
c.Warn($"Native compilation is not yet working on {CurrentPlatform.Current}");
|
|
|
|
|
return c.Success();
|
2016-02-02 18:04:50 +00:00
|
|
|
|
}
|
2016-03-02 21:20:45 +00:00
|
|
|
|
else if (CurrentPlatform.IsOSX)
|
2016-02-02 18:04:50 +00:00
|
|
|
|
{
|
|
|
|
|
packageId = "toolchain.osx.10.10-x64.Microsoft.DotNet.AppDep";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return c.Failed("Unsupported OS Platform");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var appDepPath = Path.Combine(
|
|
|
|
|
Dirs.NuGetPackages,
|
|
|
|
|
packageId,
|
|
|
|
|
AppDepSdkVersion);
|
|
|
|
|
CopyRecursive(appDepPath, appDepOutputDir, overwrite: true);
|
|
|
|
|
|
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
public static BuildTargetResult CrossgenSharedFx(BuildTargetContext c, string pathToAssemblies)
|
|
|
|
|
{
|
|
|
|
|
// Check if we need to skip crossgen
|
2016-03-18 22:18:18 +00:00
|
|
|
|
if (string.Equals(Environment.GetEnvironmentVariable("DONT_CROSSGEN_SHAREDFRAMEWORK"), "1"))
|
2016-03-16 22:54:02 +00:00
|
|
|
|
{
|
2016-03-18 22:18:18 +00:00
|
|
|
|
c.Warn("Skipping crossgen for SharedFx because DONT_CROSSGEN_SHAREDFRAMEWORK is set to 1");
|
2016-03-16 22:54:02 +00:00
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
2016-03-17 00:54:44 +00:00
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
foreach (var file in Directory.GetFiles(pathToAssemblies))
|
|
|
|
|
{
|
|
|
|
|
string fileName = Path.GetFileName(file);
|
|
|
|
|
|
|
|
|
|
if (fileName == "mscorlib.dll" || fileName == "mscorlib.ni.dll" || !HasMetadata(file))
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string tempPathName = Path.ChangeExtension(file, "readytorun");
|
|
|
|
|
|
|
|
|
|
// This is not always correct. The version of crossgen we need to pick up is whatever one was restored as part
|
|
|
|
|
// of the Microsoft.NETCore.Runtime.CoreCLR package that is part of the shared library. For now, the version hardcoded
|
|
|
|
|
// in CompileTargets and the one in the shared library project.json match and are updated in lock step, but long term
|
|
|
|
|
// we need to be able to look at the project.lock.json file and figure out what version of Microsoft.NETCore.Runtime.CoreCLR
|
|
|
|
|
// was used, and then select that version.
|
|
|
|
|
ExecSilent(Crossgen.GetCrossgenPathForVersion(CompileTargets.CoreCLRVersion),
|
|
|
|
|
"-readytorun", "-in", file, "-out", tempPathName, "-platform_assemblies_paths", pathToAssemblies);
|
|
|
|
|
|
|
|
|
|
File.Delete(file);
|
|
|
|
|
File.Move(tempPathName, file);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c.Success();
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-02 04:52:08 +00:00
|
|
|
|
private static void ChangeEntryPointLibraryName(string depsFile, string newName)
|
|
|
|
|
{
|
|
|
|
|
JToken deps;
|
|
|
|
|
using (var file = File.OpenText(depsFile))
|
|
|
|
|
using (JsonTextReader reader = new JsonTextReader(file))
|
|
|
|
|
{
|
|
|
|
|
deps = JObject.ReadFrom(reader);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var target = deps["targets"][deps["runtimeTarget"]["name"].Value<string>()];
|
|
|
|
|
var library = target.Children<JProperty>().First();
|
|
|
|
|
var version = library.Name.Substring(library.Name.IndexOf('/') + 1);
|
|
|
|
|
if (newName == null)
|
|
|
|
|
{
|
|
|
|
|
library.Remove();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
library.Replace(new JProperty(newName + '/' + version, library.Value));
|
|
|
|
|
}
|
|
|
|
|
library = deps["libraries"].Children<JProperty>().First();
|
|
|
|
|
if (newName == null)
|
|
|
|
|
{
|
|
|
|
|
library.Remove();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
library.Replace(new JProperty(newName + '/' + version, library.Value));
|
|
|
|
|
}
|
|
|
|
|
using (var file = File.CreateText(depsFile))
|
|
|
|
|
using (var writer = new JsonTextWriter(file) { Formatting = Formatting.Indented})
|
|
|
|
|
{
|
|
|
|
|
deps.WriteTo(writer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-24 16:36:05 +00:00
|
|
|
|
private static void DeleteMainPublishOutput(string path, string name)
|
|
|
|
|
{
|
|
|
|
|
File.Delete(Path.Combine(path, $"{name}{Constants.ExeSuffix}"));
|
|
|
|
|
File.Delete(Path.Combine(path, $"{name}.dll"));
|
|
|
|
|
File.Delete(Path.Combine(path, $"{name}.pdb"));
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-16 22:54:02 +00:00
|
|
|
|
private static bool HasMetadata(string pathToFile)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var inStream = File.OpenRead(pathToFile))
|
|
|
|
|
{
|
|
|
|
|
using (var peReader = new PEReader(inStream))
|
|
|
|
|
{
|
|
|
|
|
return peReader.HasMetadata;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (BadImageFormatException) { }
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2016-02-02 18:04:50 +00:00
|
|
|
|
}
|
|
|
|
|
}
|