LibHac/build/Build.cs

708 lines
22 KiB
C#
Raw Normal View History

2018-11-22 04:57:18 +01:00
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
2018-11-22 04:57:18 +01:00
using ICSharpCode.SharpZipLib.Zip;
2021-01-02 01:01:36 +01:00
using ICSharpCode.SharpZipLib.Zip.Compression;
using LibHacBuild.CodeGen.Stage1;
2018-11-22 04:57:18 +01:00
using Nuke.Common;
using Nuke.Common.CI.AppVeyor;
2018-11-22 04:57:18 +01:00
using Nuke.Common.Git;
2019-05-31 03:20:01 +02:00
using Nuke.Common.IO;
2018-11-22 04:57:18 +01:00
using Nuke.Common.ProjectModel;
using Nuke.Common.Tooling;
2018-11-22 04:57:18 +01:00
using Nuke.Common.Tools.DotNet;
using Nuke.Common.Tools.GitVersion;
using Nuke.Common.Tools.SignTool;
2018-11-22 04:57:18 +01:00
using static Nuke.Common.IO.FileSystemTasks;
using static Nuke.Common.IO.PathConstruction;
using static Nuke.Common.Tools.DotNet.DotNetTasks;
2021-11-14 20:08:57 +01:00
namespace LibHacBuild;
partial class Build : NukeBuild
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
public static int Main() => Execute<Build>(x => x.Standard);
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
[Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")]
public readonly string Configuration = IsLocalBuild ? "Debug" : "Release";
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
[Parameter("Don't enable any size-reducing settings on native builds.")]
public readonly bool Untrimmed;
2021-11-14 20:08:57 +01:00
[Parameter("Disable reflection in native builds.")]
public readonly bool NoReflection;
2021-11-14 20:08:57 +01:00
[Solution("LibHac.sln")] readonly Solution _solution;
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
AbsolutePath SourceDirectory => RootDirectory / "src";
AbsolutePath TestsDirectory => RootDirectory / "tests";
AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts";
AbsolutePath SignedArtifactsDirectory => ArtifactsDirectory / "signed";
AbsolutePath TempDirectory => RootDirectory / ".tmp";
AbsolutePath CliCoreDir => TempDirectory / "hactoolnet_net5.0";
AbsolutePath CliNativeDir => TempDirectory / $"hactoolnet_{HostOsName}";
AbsolutePath CliNativeExe => CliNativeDir / $"hactoolnet{NativeProgramExtension}";
AbsolutePath CliCoreZip => ArtifactsDirectory / $"hactoolnet-{VersionString}-netcore.zip";
AbsolutePath CliNativeZip => ArtifactsDirectory / $"hactoolnet-{VersionString}-{HostOsName}.zip";
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
Project LibHacProject => _solution.GetProject("LibHac").NotNull();
Project LibHacTestProject => _solution.GetProject("LibHac.Tests").NotNull();
Project HactoolnetProject => _solution.GetProject("hactoolnet").NotNull();
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
Project CodeGenProject => _solution.GetProject("_buildCodeGen").NotNull();
2021-11-14 20:08:57 +01:00
private bool HasGitDir { get; set; }
2021-11-14 20:08:57 +01:00
private string NativeRuntime { get; set; }
private string HostOsName { get; set; }
private string NativeProgramExtension { get; set; }
2021-11-14 20:08:57 +01:00
string VersionString { get; set; }
Dictionary<string, object> VersionProps { get; set; } = new Dictionary<string, object>();
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
const string CertFileName = "cert.pfx";
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
public Build()
{
if (EnvironmentInfo.IsWin)
{
2021-11-14 20:08:57 +01:00
NativeRuntime = "win-x64";
NativeProgramExtension = ".exe";
HostOsName = "win";
}
else if (EnvironmentInfo.IsLinux)
{
NativeRuntime = "linux-x64";
NativeProgramExtension = "";
HostOsName = "linux";
}
else if (EnvironmentInfo.IsOsx)
{
NativeRuntime = "osx-x64";
NativeProgramExtension = "";
HostOsName = "macos";
}
}
Target SetVersion => _ => _
.Executes(() =>
{
GitRepository gitRepository = null;
GitVersion gitVersion = null;
try
{
2021-11-14 20:08:57 +01:00
gitRepository = (GitRepository)new GitRepositoryAttribute().GetValue(null, null);
gitVersion = GitVersionTasks.GitVersion(s => s
.SetFramework("net5.0")
.DisableProcessLogOutput())
.Result;
}
2021-11-14 20:08:57 +01:00
catch (Exception e)
{
2021-11-14 20:08:57 +01:00
if (!e.Message.Contains("not a git repository", StringComparison.OrdinalIgnoreCase))
{
Logger.Error(e);
}
}
2021-11-14 20:08:57 +01:00
if (gitRepository == null || gitVersion == null)
{
2021-11-14 20:08:57 +01:00
Logger.Normal("Unable to read Git version.");
2021-11-14 20:08:57 +01:00
VersionString = GetCsprojVersion();
Logger.Normal($"Using version from .csproj: {VersionString}");
2021-11-14 20:08:57 +01:00
return;
}
2021-11-14 20:08:57 +01:00
HasGitDir = true;
2021-11-14 20:08:57 +01:00
VersionString = $"{gitVersion.MajorMinorPatch}";
if (!string.IsNullOrWhiteSpace(gitVersion.PreReleaseTag))
{
VersionString += $"-{gitVersion.PreReleaseTag}+{gitVersion.Sha.Substring(0, 8)}";
}
2021-11-14 20:08:57 +01:00
string suffix = gitVersion.PreReleaseTag;
2021-11-14 20:08:57 +01:00
if (!string.IsNullOrWhiteSpace(suffix))
{
if (!gitRepository.IsOnMasterBranch())
{
2021-11-14 20:08:57 +01:00
suffix = $"-{suffix}";
}
2021-11-14 20:08:57 +01:00
suffix += $"+{gitVersion.Sha.Substring(0, 8)}";
}
if (Host == HostType.AppVeyor)
{
// Workaround GitVersion issue by getting PR info manually https://github.com/GitTools/GitVersion/issues/1927
string prNumber = Environment.GetEnvironmentVariable("APPVEYOR_PULL_REQUEST_NUMBER");
string branchName = Environment.GetEnvironmentVariable("APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH");
2019-02-17 03:31:35 +01:00
2021-11-14 20:08:57 +01:00
if (int.TryParse(prNumber, out int prInt) && branchName != null)
2019-02-17 03:31:35 +01:00
{
2021-11-14 20:08:57 +01:00
string prString = $"PullRequest{prInt:D4}";
2019-02-17 03:31:35 +01:00
2021-11-14 20:08:57 +01:00
VersionString = VersionString.Replace(branchName, prString);
suffix = suffix.Replace(branchName, prString);
}
2021-11-14 20:08:57 +01:00
SetAppVeyorVersion(VersionString);
}
2021-11-14 20:08:57 +01:00
VersionProps = new Dictionary<string, object>
{
["VersionPrefix"] = gitVersion.AssemblySemVer,
["VersionSuffix"] = suffix
};
2021-11-14 20:08:57 +01:00
Logger.Normal($"Building version {VersionString}");
});
2021-11-14 20:08:57 +01:00
Target Clean => _ => _
.Executes(() =>
{
List<string> toDelete = GlobDirectories(SourceDirectory, "**/bin", "**/obj")
.Concat(GlobDirectories(TestsDirectory, "**/bin", "**/obj")).ToList();
2019-02-17 03:31:35 +01:00
2021-11-14 20:08:57 +01:00
foreach (string dir in toDelete)
{
DeleteDirectory(dir);
}
2021-11-14 20:08:57 +01:00
EnsureCleanDirectory(ArtifactsDirectory);
EnsureCleanDirectory(CliCoreDir);
EnsureCleanDirectory(CliNativeDir);
});
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
Target Restore => _ => _
.DependsOn(Clean)
.Executes(() =>
{
DotNetRestoreSettings settings = new DotNetRestoreSettings()
.SetProjectFile(_solution);
2019-05-31 03:20:01 +02:00
2021-11-14 20:08:57 +01:00
DotNetRestore(s => settings);
});
2019-05-31 03:20:01 +02:00
2021-11-14 20:08:57 +01:00
Target Codegen => _ => _
.Executes(() =>
{
ResultCodeGen.Run();
RunCodegenStage2();
});
2021-11-14 20:08:57 +01:00
Target Compile => _ => _
.DependsOn(Restore, SetVersion, Codegen)
.Executes(() =>
{
DotNetBuildSettings buildSettings = new DotNetBuildSettings()
.SetProjectFile(_solution)
.EnableNoRestore()
.SetConfiguration(Configuration)
.SetProperties(VersionProps)
.SetProperty("BuildType", "Release")
.SetProperty("HasGitDir", HasGitDir);
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
DotNetBuild(s => buildSettings);
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
DotNetPublishSettings publishSettings = new DotNetPublishSettings()
.EnableNoRestore()
.SetConfiguration(Configuration);
2020-02-24 22:45:51 +01:00
2021-11-14 20:08:57 +01:00
DotNetPublish(s => publishSettings
.SetProject(HactoolnetProject)
.SetFramework("net5.0")
.SetOutput(CliCoreDir)
.SetNoBuild(true)
.SetProperties(VersionProps));
2018-11-22 04:57:18 +01:00
// Hack around OS newline differences
if (EnvironmentInfo.IsUnix)
{
2021-11-14 20:08:57 +01:00
foreach (string filename in Directory.EnumerateFiles(CliCoreDir, "*.json"))
{
2021-11-14 20:08:57 +01:00
ReplaceLineEndings(filename);
}
2021-11-14 20:08:57 +01:00
}
});
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
Target Pack => _ => _
.DependsOn(Compile)
.Executes(() =>
{
DotNetPackSettings settings = new DotNetPackSettings()
.SetProject(LibHacProject)
.EnableNoBuild()
.SetConfiguration(Configuration)
.EnableIncludeSymbols()
.SetSymbolPackageFormat(DotNetSymbolPackageFormat.snupkg)
.SetOutputDirectory(ArtifactsDirectory)
.SetProperties(VersionProps);
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
DotNetPack(s => settings);
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
foreach (string filename in Directory.EnumerateFiles(ArtifactsDirectory, "*.*nupkg"))
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
RepackNugetPackage(filename);
}
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
if (Host != HostType.AppVeyor) return;
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
foreach (string filename in Directory.EnumerateFiles(ArtifactsDirectory, "*.*nupkg"))
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
PushArtifact(filename);
}
});
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
Target Test => _ => _
.DependsOn(Compile)
.Executes(() =>
{
DotNetTestSettings settings = new DotNetTestSettings()
.SetProjectFile(LibHacTestProject)
.EnableNoBuild()
.SetConfiguration(Configuration);
2020-01-17 08:01:25 +01:00
2021-11-14 20:08:57 +01:00
if (EnvironmentInfo.IsUnix) settings = settings.SetProperty("TargetFramework", "net5.0");
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
DotNetTest(s => settings);
});
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
Target Zip => _ => _
.DependsOn(Pack)
.After(Native)
.Executes(() =>
{
string[] namesCore = Directory.EnumerateFiles(CliCoreDir, "*.json")
.Concat(Directory.EnumerateFiles(CliCoreDir, "*.dll"))
.ToArray();
2021-11-14 20:08:57 +01:00
EnsureExistingDirectory(ArtifactsDirectory);
2021-11-14 20:08:57 +01:00
ZipFiles(CliCoreZip, namesCore);
Logger.Normal($"Created {CliCoreZip}");
2021-11-14 20:08:57 +01:00
if (Host == HostType.AppVeyor)
2019-06-07 00:15:43 +02:00
{
2021-11-14 20:08:57 +01:00
PushArtifact(CliCoreZip);
}
});
2019-06-07 00:15:43 +02:00
2021-11-14 20:08:57 +01:00
Target Publish => _ => _
.DependsOn(Test, Pack)
.OnlyWhenStatic(() => AppVeyor.Instance != null && AppVeyor.Instance.PullRequestTitle == null)
.Executes(() =>
{
AbsolutePath nupkgFile = ArtifactsDirectory.GlobFiles("*.nupkg").Single();
2021-11-14 20:08:57 +01:00
string apiKey = EnvironmentInfo.GetVariable<string>("myget_api_key");
DotNetNuGetPushSettings settings = new DotNetNuGetPushSettings()
.SetApiKey(apiKey)
.SetSource("https://www.myget.org/F/libhac/api/v3/index.json");
2019-06-07 00:15:43 +02:00
2021-11-14 20:08:57 +01:00
DotNetNuGetPush(settings.SetTargetPath(nupkgFile));
});
2019-06-07 00:15:43 +02:00
2021-11-14 20:08:57 +01:00
Target Sign => _ => _
.DependsOn(Test, Zip)
.OnlyWhenStatic(() => File.Exists(CertFileName))
.OnlyWhenStatic(() => EnvironmentInfo.IsWin)
.Executes(() =>
{
string pwd = ReadPassword();
2019-06-07 00:15:43 +02:00
2021-11-14 20:08:57 +01:00
if (pwd == string.Empty)
{
Logger.Normal("Skipping sign task");
return;
}
SignAndReZip(pwd);
});
Target Native => _ => _
.DependsOn(SetVersion)
.After(Compile)
.Executes(BuildNative);
// ReSharper disable once UnusedMember.Local
Target AppVeyorBuild => _ => _
.DependsOn(Zip, Native, Publish)
.Unlisted()
.Executes(PrintResults);
2019-06-07 00:15:43 +02:00
2021-11-14 20:08:57 +01:00
Target Standard => _ => _
.DependsOn(Test, Zip)
.Executes(PrintResults);
2021-11-14 20:08:57 +01:00
// ReSharper disable once UnusedMember.Local
Target Full => _ => _
.DependsOn(Sign, Native)
.Executes(PrintResults);
public void PrintResults()
{
Logger.Normal("SHA-1:");
using (var sha = SHA1.Create())
{
2021-11-14 20:08:57 +01:00
foreach (string filename in Directory.EnumerateFiles(ArtifactsDirectory))
{
2021-11-14 20:08:57 +01:00
using (var stream = new FileStream(filename, FileMode.Open))
{
2021-11-14 20:08:57 +01:00
string hash = BitConverter.ToString(sha.ComputeHash(stream)).Replace("-", "");
Logger.Normal($"{hash} - {Path.GetFileName(filename)}");
}
}
}
2021-11-14 20:08:57 +01:00
}
public void BuildNative()
{
string buildType = Untrimmed ? "native-untrimmed" : "native";
2021-11-14 20:08:57 +01:00
if (NoReflection)
{
2021-11-14 20:08:57 +01:00
buildType = "native-noreflection";
}
2019-06-07 00:15:43 +02:00
2021-11-14 20:08:57 +01:00
DotNetPublishSettings publishSettings = new DotNetPublishSettings()
.SetConfiguration(Configuration)
.SetProject(HactoolnetProject)
.SetRuntime(NativeRuntime)
.SetOutput(CliNativeDir)
.SetProperties(VersionProps)
.AddProperty("BuildType", buildType);
2021-11-14 20:08:57 +01:00
DotNetPublish(publishSettings);
2021-11-14 20:08:57 +01:00
if (EnvironmentInfo.IsUnix && !Untrimmed)
{
File.Copy(CliNativeExe, CliNativeExe + "_unstripped", true);
ProcessTasks.StartProcess("strip", CliNativeExe).AssertZeroExitCode();
}
2019-06-07 00:15:43 +02:00
2021-11-14 20:08:57 +01:00
EnsureExistingDirectory(ArtifactsDirectory);
2021-11-14 20:08:57 +01:00
ZipFile(CliNativeZip, CliNativeExe, $"hactoolnet{NativeProgramExtension}");
Logger.Normal($"Created {CliNativeZip}");
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
if (Host == HostType.AppVeyor)
{
PushArtifact(CliNativeZip);
}
}
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
public static void ZipFiles(string outFile, IEnumerable<string> files)
{
using (var s = new ZipOutputStream(File.Create(outFile)))
{
s.SetLevel(9);
foreach (string file in files)
{
2021-11-14 20:08:57 +01:00
var entry = new ZipEntry(Path.GetFileName(file));
entry.DateTime = DateTime.UnixEpoch;
using (FileStream fs = File.OpenRead(file))
{
entry.Size = fs.Length;
s.PutNextEntry(entry);
fs.CopyTo(s);
}
}
}
2021-11-14 20:08:57 +01:00
}
2021-11-14 20:08:57 +01:00
public static void ZipFile(string outFile, string file, string nameInsideZip)
{
using (var s = new ZipOutputStream(File.Create(outFile)))
{
2021-11-14 20:08:57 +01:00
s.SetLevel(9);
2021-11-14 20:08:57 +01:00
var entry = new ZipEntry(nameInsideZip);
entry.DateTime = DateTime.UnixEpoch;
2021-11-14 20:08:57 +01:00
using (FileStream fs = File.OpenRead(file))
{
entry.Size = fs.Length;
s.PutNextEntry(entry);
fs.CopyTo(s);
2018-11-22 04:57:18 +01:00
}
}
2021-11-14 20:08:57 +01:00
}
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
public static void ZipDirectory(string outFile, string directory)
{
using (var s = new ZipOutputStream(File.Create(outFile)))
{
2021-11-14 20:08:57 +01:00
s.SetLevel(9);
foreach (string filePath in Directory.EnumerateFiles(directory, "*", SearchOption.AllDirectories))
{
2021-11-14 20:08:57 +01:00
string relativePath = Path.GetRelativePath(directory, filePath);
2021-11-14 20:08:57 +01:00
var entry = new ZipEntry(relativePath);
entry.DateTime = DateTime.UnixEpoch;
2021-11-14 20:08:57 +01:00
using (FileStream fs = File.OpenRead(filePath))
{
entry.Size = fs.Length;
s.PutNextEntry(entry);
fs.CopyTo(s);
}
}
}
2021-11-14 20:08:57 +01:00
}
2021-11-14 20:08:57 +01:00
public static void ZipDirectory(string outFile, string directory, IEnumerable<string> files)
{
using (var s = new ZipOutputStream(File.Create(outFile)))
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
s.SetLevel(9);
2021-11-14 20:08:57 +01:00
foreach (string filePath in files)
{
string absolutePath = Path.Combine(directory, filePath);
2021-11-14 20:08:57 +01:00
var entry = new ZipEntry(filePath);
entry.DateTime = DateTime.UnixEpoch;
2021-11-14 20:08:57 +01:00
using (FileStream fs = File.OpenRead(absolutePath))
{
entry.Size = fs.Length;
s.PutNextEntry(entry);
fs.CopyTo(s);
2018-11-22 04:57:18 +01:00
}
}
}
2021-11-14 20:08:57 +01:00
}
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
public static void UnzipFiles(string zipFile, string outDir)
{
using (var s = new ZipInputStream(File.OpenRead(zipFile)))
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
ZipEntry entry;
while ((entry = s.GetNextEntry()) != null)
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
string outPath = Path.Combine(outDir, entry.Name);
2021-11-14 20:08:57 +01:00
string directoryName = Path.GetDirectoryName(outPath);
string fileName = Path.GetFileName(outPath);
2021-11-14 20:08:57 +01:00
if (!string.IsNullOrWhiteSpace(directoryName))
{
Directory.CreateDirectory(directoryName);
2018-11-22 04:57:18 +01:00
}
2021-11-14 20:08:57 +01:00
if (!string.IsNullOrWhiteSpace(fileName))
{
2021-11-14 20:08:57 +01:00
using (FileStream outFile = File.Create(outPath))
{
2021-11-14 20:08:57 +01:00
s.CopyTo(outFile);
}
}
}
2018-11-22 04:57:18 +01:00
}
2021-11-14 20:08:57 +01:00
}
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
public static byte[] DeflateBytes(byte[] data)
{
var s = new Deflater(9, true);
s.SetInput(data);
s.Finish();
byte[] buffer = new byte[data.Length];
s.Deflate(buffer);
2021-01-02 01:01:36 +01:00
2021-11-14 20:08:57 +01:00
Debug.Assert(s.IsFinished);
2021-01-02 01:01:36 +01:00
2021-11-14 20:08:57 +01:00
byte[] compressed = new byte[s.TotalOut];
Array.Copy(buffer, compressed, compressed.Length);
return compressed;
}
2021-01-02 01:01:36 +01:00
2021-11-14 20:08:57 +01:00
public static void PushArtifact(string path)
{
if (!File.Exists(path))
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
Logger.Warn($"Unable to add artifact {path}");
}
2021-11-14 20:08:57 +01:00
var psi = new ProcessStartInfo
{
FileName = "appveyor",
Arguments = $"PushArtifact \"{path}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
var proc = new Process
{
StartInfo = psi
};
2021-11-14 20:08:57 +01:00
proc.Start();
2021-11-14 20:08:57 +01:00
proc.WaitForExit();
2021-11-14 20:08:57 +01:00
Logger.Normal($"Added AppVeyor artifact {path}");
}
2021-11-14 20:08:57 +01:00
public static void SetAppVeyorVersion(string version)
{
var psi = new ProcessStartInfo
2018-11-22 04:57:18 +01:00
{
2021-11-14 20:08:57 +01:00
FileName = "appveyor",
Arguments = $"UpdateBuild -Version \"{version}\"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
var proc = new Process
{
StartInfo = psi
};
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
proc.Start();
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
proc.WaitForExit();
}
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
public static void ReplaceLineEndings(string filename)
{
string text = File.ReadAllText(filename);
File.WriteAllText(filename, Regex.Replace(text, @"\r\n|\n\r|\n|\r", "\r\n"));
}
2018-11-22 04:57:18 +01:00
2021-11-14 20:08:57 +01:00
public static void SignAssemblies(string password, params string[] fileNames)
{
SignToolSettings settings = new SignToolSettings()
.SetFileDigestAlgorithm("SHA256")
.SetFile(CertFileName)
.SetFiles(fileNames)
.SetPassword(password)
.SetTimestampServerDigestAlgorithm("SHA256")
.SetRfc3161TimestampServerUrl("http://timestamp.digicert.com");
SignToolTasks.SignTool(settings);
}
2021-11-14 20:08:57 +01:00
public void SignAndReZip(string password)
{
AbsolutePath nupkgFile = ArtifactsDirectory.GlobFiles("*.nupkg").Single();
AbsolutePath snupkgFile = ArtifactsDirectory.GlobFiles("*.snupkg").Single();
AbsolutePath nupkgDir = TempDirectory / ("sign_" + Path.GetFileName(nupkgFile));
AbsolutePath coreFxDir = TempDirectory / ("sign_" + Path.GetFileName(CliCoreZip));
AbsolutePath nativeZipDir = TempDirectory / ("sign_" + Path.GetFileName(CliNativeZip));
2021-11-14 20:08:57 +01:00
bool signNative = FileExists(CliNativeExe);
2021-11-14 20:08:57 +01:00
try
{
2021-11-14 20:08:57 +01:00
UnzipFiles(CliCoreZip, coreFxDir);
List<string> pkgFileList = UnzipPackage(nupkgFile, nupkgDir);
2021-11-14 20:08:57 +01:00
var toSign = new List<AbsolutePath>();
toSign.AddRange(nupkgDir.GlobFiles("**/LibHac.dll"));
toSign.Add(coreFxDir / "hactoolnet.dll");
2021-11-14 20:08:57 +01:00
if (signNative)
{
2021-11-14 20:08:57 +01:00
UnzipFiles(CliNativeZip, nativeZipDir);
toSign.Add(nativeZipDir / "hactoolnet.exe");
}
2021-11-14 20:08:57 +01:00
Directory.CreateDirectory(SignedArtifactsDirectory);
2021-11-14 20:08:57 +01:00
SignAssemblies(password, toSign.Select(x => x.ToString()).ToArray());
2021-11-14 20:08:57 +01:00
// Avoid having multiple signed versions of the same file
File.Copy(nupkgDir / "lib" / "net5.0" / "LibHac.dll", coreFxDir / "LibHac.dll", true);
2021-11-14 20:08:57 +01:00
ZipDirectory(SignedArtifactsDirectory / Path.GetFileName(nupkgFile), nupkgDir, pkgFileList);
ZipDirectory(SignedArtifactsDirectory / Path.GetFileName(CliCoreZip), coreFxDir);
2021-11-14 20:08:57 +01:00
if (signNative)
{
ZipDirectory(SignedArtifactsDirectory / Path.GetFileName(CliNativeZip), nativeZipDir);
}
2021-11-14 20:08:57 +01:00
File.Copy(snupkgFile, SignedArtifactsDirectory / Path.GetFileName(snupkgFile));
2021-11-14 20:08:57 +01:00
SignNupkg(SignedArtifactsDirectory / Path.GetFileName(nupkgFile), password);
SignNupkg(SignedArtifactsDirectory / Path.GetFileName(snupkgFile), password);
}
catch (Exception)
{
Directory.Delete(SignedArtifactsDirectory, true);
throw;
}
finally
{
Directory.Delete(nupkgDir, true);
Directory.Delete(coreFxDir, true);
}
}
2021-11-14 20:08:57 +01:00
public static string ReadPassword()
{
var pwd = new StringBuilder();
ConsoleKeyInfo key;
2021-11-14 20:08:57 +01:00
Console.Write("Enter certificate password (Empty password to skip): ");
do
{
key = Console.ReadKey(true);
// Ignore any key out of range.
if (((int)key.Key) >= '!' && ((int)key.Key <= '~'))
{
2021-11-14 20:08:57 +01:00
// Append the character to the password.
pwd.Append(key.KeyChar);
Console.Write("*");
}
2021-11-14 20:08:57 +01:00
// Exit if Enter key is pressed.
} while (key.Key != ConsoleKey.Enter);
2021-11-14 20:08:57 +01:00
Console.WriteLine();
2021-11-14 20:08:57 +01:00
return pwd.ToString();
}
2021-11-14 20:08:57 +01:00
public string GetCsprojVersion()
{
return XmlTasks.XmlPeekSingle(LibHacProject.Path, "/Project/PropertyGroup/VersionPrefix", null);
}
2021-11-14 20:08:57 +01:00
public void RunCodegenStage2()
{
Logger.Normal("\nBuilding stage 2 codegen project.");
2021-11-14 20:08:57 +01:00
DotNetRunSettings settings = new DotNetRunSettings()
.SetProjectFile(CodeGenProject.Path);
// .SetLogOutput(false);
2021-11-14 20:08:57 +01:00
try
{
2021-11-14 20:08:57 +01:00
DotNetRun(settings);
Logger.Normal();
}
2021-11-14 20:08:57 +01:00
catch (ProcessException)
{
2021-11-14 20:08:57 +01:00
Logger.Error("\nError running stage 2 codegen. Skipping...\n");
}
2018-11-22 04:57:18 +01:00
}
}