diff --git a/.github/actions/scripts/dotnet_publish b/.github/actions/scripts/dotnet_publish
new file mode 100755
index 0000000000..4ddc95fa05
--- /dev/null
+++ b/.github/actions/scripts/dotnet_publish
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+# ensure the artifacts directory is created
+mkdir -p $GITHUB_WORKSPACE/artifacts
+
+dotnet publish "Ryujinx/Ryujinx.csproj" -c "${BUILD_TYPE}" -r "${TARGET_OS}-${TARGET_ARCH}" /p:Version=$BUILD_VERSION
+
+pushd "$GITHUB_WORKSPACE/Ryujinx/bin/$BUILD_TYPE/netcoreapp3.0/$TARGET_OS-$TARGET_ARCH/publish/"
+zip -9 -r $GITHUB_WORKSPACE/artifacts/ryujinx-$RELEASE_POSTFIX$BUILD_VERSION-$TARGET_OS\_$TARGET_ARCH.zip .
+popd
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 86419b577b..1c8f5c685e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -16,7 +16,8 @@ jobs:
environment: ['Debug', 'Release', 'Profile Debug', 'Profile Release']
name: ${{ matrix.environment }} build (Dotnet ${{ matrix.dotnet }}, OS ${{ matrix.os }})
steps:
- - uses: actions/checkout@v2
+ - name: Checkout
+ uses: actions/checkout@v2
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000000..92541b6fb2
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,76 @@
+name: "Release job"
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Setup dotnet
+ uses: actions/setup-dotnet@v1
+ with:
+ dotnet-version: '3.1.100'
+ - name: Determine Build version
+ id: buildVersion
+ run: dotnet run --project "Ryujinx.Actions"
+ env:
+ INPUT_OPERATION: 'get-build-version'
+ INPUT_RELEASE_REPOSITORY: 'Ryujinx/binaries'
+ - name: "Print Build version"
+ run: "echo ${{ steps.buildVersion.outputs.release-version }}"
+ - name: Publish Windows for x64
+ run: ./.github/actions/scripts/dotnet_publish
+ env:
+ BUILD_TYPE: Release
+ TARGET_OS: win
+ TARGET_ARCH: x64
+ BUILD_VERSION: ${{ steps.buildVersion.outputs.release-version }}
+ - name: Publish Windows for x64 (Profiled)
+ run: ./.github/actions/scripts/dotnet_publish
+ env:
+ BUILD_TYPE: Profile Release
+ TARGET_OS: win
+ TARGET_ARCH: x64
+ RELEASE_POSTFIX: profiled-
+ BUILD_VERSION: ${{ steps.buildVersion.outputs.release-version }}
+ - name: Publish Linux for x64
+ run: ./.github/actions/scripts/dotnet_publish
+ env:
+ BUILD_TYPE: Release
+ TARGET_OS: linux
+ TARGET_ARCH: x64
+ BUILD_VERSION: ${{ steps.buildVersion.outputs.release-version }}
+ - name: Publish Linux for x64 (Profiled)
+ run: ./.github/actions/scripts/dotnet_publish
+ env:
+ BUILD_TYPE: Profile Release
+ TARGET_OS: linux
+ TARGET_ARCH: x64
+ RELEASE_POSTFIX: profiled-
+ BUILD_VERSION: ${{ steps.buildVersion.outputs.release-version }}
+ - name: Publish OSX for x64
+ run: ./.github/actions/scripts/dotnet_publish
+ env:
+ BUILD_TYPE: Release
+ TARGET_OS: osx
+ TARGET_ARCH: x64
+ BUILD_VERSION: ${{ steps.buildVersion.outputs.release-version }}
+ - name: Publish OSX for x64 (Profiled)
+ run: ./.github/actions/scripts/dotnet_publish
+ env:
+ BUILD_TYPE: Profile Release
+ TARGET_OS: osx
+ TARGET_ARCH: x64
+ RELEASE_POSTFIX: profiled-
+ BUILD_VERSION: ${{ steps.buildVersion.outputs.release-version }}
+ - name: Publish to GitHub Release
+ run: dotnet run --project "Ryujinx.Actions"
+ env:
+ INPUT_OPERATION: 'publish-release'
+ INPUT_RELEASE_REPOSITORY: 'Ryujinx/binaries'
+ INPUT_RELEASE_VERSION: ${{ steps.buildVersion.outputs.release-version }}
+ INPUT_RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
diff --git a/.gitignore b/.gitignore
index c0af260973..c5ab768370 100644
--- a/.gitignore
+++ b/.gitignore
@@ -164,3 +164,5 @@ launchSettings.json
# NetCore Publishing Profiles
PublishProfiles/
+
+artifacts/
\ No newline at end of file
diff --git a/ARMeilleure/ARMeilleure.csproj b/ARMeilleure/ARMeilleure.csproj
index 9567838ecc..9724ad6b9f 100644
--- a/ARMeilleure/ARMeilleure.csproj
+++ b/ARMeilleure/ARMeilleure.csproj
@@ -3,25 +3,13 @@
netcoreapp3.0
win-x64;osx-x64;linux-x64
-
-
-
- true
-
-
-
true
- true
true
-
- true
-
-
diff --git a/Ryujinx.Actions/Actions/Core.cs b/Ryujinx.Actions/Actions/Core.cs
new file mode 100644
index 0000000000..c18fc4efe8
--- /dev/null
+++ b/Ryujinx.Actions/Actions/Core.cs
@@ -0,0 +1,148 @@
+using System;
+using System.Collections.Generic;
+
+namespace Ryujinx.Actions
+{
+ public class Core
+ {
+ private const string COMMAND_PREFIX = "::";
+
+ private static string EscapeBase(string data)
+ {
+ return data.Replace("%", "%25")
+ .Replace("\r", "%0D")
+ .Replace("\n", "%0A");
+ }
+
+ private static string EscapeMessage(string message)
+ {
+ return EscapeBase(message).Replace(":", "%3A").Replace(",", "%2C");
+ }
+
+ private static string ComputeString(string command, IDictionary properties, string message)
+ {
+ string result = $"{COMMAND_PREFIX}{command}";
+
+ if (properties != null && properties.Count > 0)
+ {
+ result += " ";
+
+ bool isFirstProperty = true;
+
+ foreach (KeyValuePair property in properties)
+ {
+ if (!isFirstProperty)
+ {
+ result += ",";
+ isFirstProperty = false;
+ }
+
+ result += $"{property.Key}={EscapeBase(property.Value)}";
+ }
+ }
+
+ result += $"{COMMAND_PREFIX}{EscapeMessage(message)}";
+
+ return result;
+ }
+
+ public static void Issue(string command, IDictionary properties = null, string message = "")
+ {
+ Console.Out.WriteLine(ComputeString(command, properties, message));
+ }
+
+ public static void ExportVariable(string name, string value)
+ {
+ Environment.SetEnvironmentVariable(name, value);
+
+ Dictionary properties = new Dictionary();
+ properties.Add("name", name);
+
+ Issue("set-env", properties, value);
+ }
+
+ public static void SetSecret(string secret)
+ {
+ Issue("add-mask", message: secret);
+ }
+
+ public static void AddPath(string path)
+ {
+ Issue("add-path", message: path);
+
+ string systemPath = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine);
+
+ Environment.SetEnvironmentVariable("Path", $"{path};{systemPath}");
+ }
+
+ public static string GetInput(string name)
+ {
+ string result = Environment.GetEnvironmentVariable($"INPUT_{name.Replace(" ", "_")}".ToUpper());
+
+ if (result != null)
+ {
+ return result.Trim();
+ }
+
+ return null;
+ }
+
+ public static void SetOutput(string name, string value)
+ {
+ Dictionary properties = new Dictionary();
+ properties.Add("name", name);
+
+ Issue("set-output", properties, value);
+ }
+
+ public static void SetFailed(string message)
+ {
+ Environment.ExitCode = 1;
+
+ Error(message);
+ }
+
+ public static void Debug(string message)
+ {
+ Issue("debug", message: message);
+ }
+
+ public static void Error(string message)
+ {
+ Issue("error", message: message);
+ }
+
+ public static void Warning(string message)
+ {
+ Issue("warning", message: message);
+ }
+
+ public static void Info(string message)
+ {
+ Console.Out.WriteLine(message);
+ }
+
+ public static void StartGroup(string name)
+ {
+ Issue("group", message: name);
+ }
+
+ public static void EndGroup()
+ {
+ Issue("endgroup");
+ }
+
+ public static void SaveState(string name, string value)
+ {
+ Dictionary properties = new Dictionary();
+ properties.Add("name", name);
+
+ Issue("save-state", properties, value);
+ }
+
+ public static string GetState(string name)
+ {
+ return Environment.GetEnvironmentVariable($"STATE_{name}");
+ }
+ }
+}
diff --git a/Ryujinx.Actions/Architecture.cs b/Ryujinx.Actions/Architecture.cs
new file mode 100644
index 0000000000..51800db90c
--- /dev/null
+++ b/Ryujinx.Actions/Architecture.cs
@@ -0,0 +1,9 @@
+namespace Ryujinx.Actions
+{
+ public enum Architecture
+ {
+ Unknown,
+ X64,
+ AArch64
+ }
+}
diff --git a/Ryujinx.Actions/ArtifactInformation.cs b/Ryujinx.Actions/ArtifactInformation.cs
new file mode 100644
index 0000000000..f2de9bd4ea
--- /dev/null
+++ b/Ryujinx.Actions/ArtifactInformation.cs
@@ -0,0 +1,111 @@
+using System.IO;
+using System.Security.Cryptography;
+
+namespace Ryujinx.Actions
+{
+ public class ArtifactInformation
+ {
+ public OperatingSystem Os { get; private set; }
+ public Architecture Arch { get; private set; }
+ public BuildType BuildType { get; private set; }
+ public string Url { get; set; }
+ public string FileHash { get; private set; }
+ public string FileName { get; private set; }
+
+ private static OperatingSystem GetOperatingSystemFromNamingPart(string part)
+ {
+ switch (part)
+ {
+ case "win":
+ return OperatingSystem.Windows;
+ case "osx":
+ return OperatingSystem.MacOSX;
+ case "linux":
+ return OperatingSystem.Linux;
+ case "android":
+ return OperatingSystem.Android;
+ case "ios":
+ return OperatingSystem.IOS;
+ default:
+ return OperatingSystem.Unknown;
+ }
+ }
+
+ private static Architecture GetArchitectureFromNamingPart(string part)
+ {
+ switch (part)
+ {
+ case "x64":
+ return Architecture.X64;
+ case "aarch64":
+ return Architecture.AArch64;
+ default:
+ return Architecture.Unknown;
+ }
+ }
+
+ public static ArtifactInformation FromFileName(string fileName)
+ {
+ string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
+ string[] fileNameParts = fileNameWithoutExtension.Split("-");
+
+ if (fileNameParts.Length != 3 && fileNameParts.Length != 4)
+ {
+ return null;
+ }
+
+ ArtifactInformation artifactInformation = new ArtifactInformation();
+
+ artifactInformation.BuildType = BuildType.Release;
+
+ bool isProfile = fileNameParts.Length == 4;
+
+ if (isProfile)
+ {
+ artifactInformation.BuildType = BuildType.ProfileRelease;
+ }
+
+ string targetConfiguration = isProfile ? fileNameParts[3] : fileNameParts[2];
+ string[] targetConfigurationParts = targetConfiguration.Split("_");
+
+ if (targetConfigurationParts.Length != 2)
+ {
+ return null;
+ }
+
+ artifactInformation.Os = GetOperatingSystemFromNamingPart(targetConfigurationParts[0]);
+ artifactInformation.Arch = GetArchitectureFromNamingPart(targetConfigurationParts[1]);
+
+ return artifactInformation;
+ }
+
+ public static ArtifactInformation FromFile(string path)
+ {
+ ArtifactInformation artifactInformation = FromFileName(path);
+
+ if (artifactInformation == null)
+ {
+ return null;
+ }
+
+ string fileHashString = "";
+
+ using (SHA256 hasher = SHA256.Create())
+ {
+ using (FileStream fileStream = File.OpenRead(path))
+ {
+ byte[] fileHash = hasher.ComputeHash(fileStream);
+ foreach (byte x in fileHash)
+ {
+ fileHashString += string.Format("{0:x2}", x);
+ }
+ }
+ }
+
+ artifactInformation.FileName = Path.GetFileName(path);
+ artifactInformation.FileHash = fileHashString;
+
+ return artifactInformation;
+ }
+ }
+}
diff --git a/Ryujinx.Actions/BuildType.cs b/Ryujinx.Actions/BuildType.cs
new file mode 100644
index 0000000000..bd87be08d5
--- /dev/null
+++ b/Ryujinx.Actions/BuildType.cs
@@ -0,0 +1,10 @@
+namespace Ryujinx.Actions
+{
+ public enum BuildType
+ {
+ Debug,
+ Release,
+ ProfileDebug,
+ ProfileRelease
+ }
+}
\ No newline at end of file
diff --git a/Ryujinx.Actions/OperatingSystem.cs b/Ryujinx.Actions/OperatingSystem.cs
new file mode 100644
index 0000000000..f23906796c
--- /dev/null
+++ b/Ryujinx.Actions/OperatingSystem.cs
@@ -0,0 +1,12 @@
+namespace Ryujinx.Actions
+{
+ public enum OperatingSystem
+ {
+ Unknown,
+ Windows,
+ MacOSX,
+ Linux,
+ Android,
+ IOS
+ }
+}
diff --git a/Ryujinx.Actions/Program.cs b/Ryujinx.Actions/Program.cs
new file mode 100644
index 0000000000..1b23333698
--- /dev/null
+++ b/Ryujinx.Actions/Program.cs
@@ -0,0 +1,203 @@
+using Octokit;
+using System;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Threading.Tasks;
+
+namespace Ryujinx.Actions
+{
+ class Program
+ {
+ private const string GITHUB_USER_CONTENT_BASE_URL = "https://raw.githubusercontent.com/";
+ private const string GITHUB_COMMIT_BASE_URL = "https://github.com/Ryujinx/Ryujinx/commit/";
+
+ private const string TARGET_JSON_NAME = "latest.json";
+
+ static void Main(string[] args)
+ {
+ string operation = Core.GetInput("operation");
+
+ if (operation == null)
+ {
+ Core.SetFailed("operation must be specified!");
+ }
+ else
+ {
+ string releaseRepository;
+
+ switch (operation)
+ {
+ case "get-build-version":
+ releaseRepository = Core.GetInput("release_repository");
+
+ string releaseInformationUrl = GITHUB_USER_CONTENT_BASE_URL + releaseRepository + "/master/" + TARGET_JSON_NAME;
+
+ WebClient webClient = new WebClient();
+
+ string latestVersion = webClient.DownloadString(releaseInformationUrl);
+
+ ReleaseInformation releaseInformation = JsonSerializer.Deserialize(latestVersion, CreateJsonOptions());
+
+ releaseInformation.Version.IncrementPatch();
+
+ Core.SetOutput("release-version", releaseInformation.Version.ToString());
+ break;
+ case "publish-release":
+ string githubWorkspace = Environment.GetEnvironmentVariable("GITHUB_WORKSPACE");
+ string artifactDirectory = Core.GetInput("artifacts_directory");
+ string releaseToken = Core.GetInput("release_token");
+
+ releaseRepository = Core.GetInput("release_repository");
+
+ // Mark the token as secret
+ Core.SetSecret(releaseToken);
+
+ if (artifactDirectory == null)
+ {
+ artifactDirectory = "artifacts";
+ }
+
+ string artifactFullPath = Path.Join(githubWorkspace, artifactDirectory);
+ string releaseVersion = Core.GetInput("release_version");
+
+ PublishRelease(artifactFullPath, VersionCore.FromString(releaseVersion), releaseRepository, releaseToken).Wait();
+ break;
+ default:
+ Core.SetFailed($"Unknown operation {operation} must be specified!");
+ break;
+ }
+ }
+ }
+
+ private static GitHubClient CreateGitHubClientInstance(string releaseToken)
+ {
+ GitHubClient client = new GitHubClient(new ProductHeaderValue("Ryujinx.Actions", "1.0.0"));
+
+ client.Credentials = new Credentials(releaseToken);
+
+ return client;
+ }
+
+ private static JsonSerializerOptions CreateJsonOptions()
+ {
+ JsonSerializerOptions serializeOptions = new JsonSerializerOptions
+ {
+ IgnoreNullValues = true,
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
+ WriteIndented = true
+ };
+
+ serializeOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));
+ serializeOptions.Converters.Add(new VersionCore.Converter());
+
+ return serializeOptions;
+ }
+
+ private static Task UploadAsset(GitHubClient client, Release release, Stream stream, string fileName, string contentType)
+ {
+ Core.Info($"Uploading {fileName}");
+
+ ReleaseAssetUpload assetUpload = new ReleaseAssetUpload()
+ {
+ FileName = fileName,
+ ContentType = contentType,
+ RawData = stream,
+ Timeout = TimeSpan.FromMinutes(30)
+ };
+
+ return client.Repository.Release.UploadAsset(release, assetUpload);
+ }
+
+ private static async Task UploadArtifact(GitHubClient client, Release release, string artifactDirectory, ArtifactInformation artifactInformation)
+ {
+ using (FileStream fileStream = File.OpenRead(Path.Combine(artifactDirectory, artifactInformation.FileName)))
+ {
+ await UploadAsset(client, release, fileStream, artifactInformation.FileName, "application/zip");
+ }
+ }
+
+ private static async Task PublishRelease(string artifactDirectory, VersionCore releaseVersion, string releaseRepository, string releaseToken)
+ {
+ if (releaseVersion == null)
+ {
+ Core.SetFailed("Invalid release_version!");
+ return;
+ }
+
+ if (releaseToken == null)
+ {
+ Core.SetFailed("Invalid release_token!");
+ return;
+ }
+
+ if (releaseRepository == null)
+ {
+ Core.SetFailed("Invalid release_repository!");
+ return;
+ }
+
+ string commitSha = Environment.GetEnvironmentVariable("GITHUB_SHA");
+
+ if (commitSha == null)
+ {
+ Core.SetFailed("GITHUB_SHA environment variable not found!");
+ return;
+ }
+
+ string[] releaseRepositoryParts = releaseRepository.Split("/");
+
+ if (releaseRepositoryParts.Length != 2)
+ {
+ Core.SetFailed("Invalid release_repository!");
+ return;
+ }
+
+ string releaseRepositoryOwner = releaseRepositoryParts[0];
+ string releaseRepositoryName = releaseRepositoryParts[1];
+
+ ReleaseInformation releaseInformation = new ReleaseInformation(releaseVersion);
+
+ foreach (string file in Directory.GetFiles(artifactDirectory, $"ryujinx*-{releaseVersion}-*.zip"))
+ {
+ ArtifactInformation artifactInformation = ArtifactInformation.FromFile(file);
+
+ releaseInformation.Artifacts.Add(artifactInformation);
+ }
+
+ GitHubClient client = CreateGitHubClientInstance(releaseToken);
+
+ // Create a new release
+ NewRelease newRelease = new NewRelease($"build-{commitSha}");
+ newRelease.Name = releaseVersion.ToString();
+ newRelease.Body = $"Triggered by {GITHUB_COMMIT_BASE_URL}{commitSha}.";
+ newRelease.Draft = true;
+ newRelease.Prerelease = false;
+
+ Release release = await client.Repository.Release.Create(releaseRepositoryOwner, releaseRepositoryName, newRelease);
+ ReleaseUpdate updateRelease = release.ToUpdate();
+
+ // Upload artifacts
+ foreach (ArtifactInformation information in releaseInformation.Artifacts)
+ {
+ await UploadArtifact(client, release, artifactDirectory, information);
+ }
+
+ string releaseInformationJson = JsonSerializer.Serialize(releaseInformation, CreateJsonOptions());
+
+ // Upload release information
+ using (MemoryStream releaseInformationStream = new MemoryStream(Encoding.UTF8.GetBytes(releaseInformationJson)))
+ {
+ await UploadAsset(client, release, releaseInformationStream, "release_information.json", "application/json");
+ }
+
+ updateRelease.Draft = false;
+
+ release = await client.Repository.Release.Edit(releaseRepositoryOwner, releaseRepositoryName, release.Id, updateRelease);
+
+ Core.Info($"Successfully published release {releaseVersion} to {release.HtmlUrl}");
+ }
+ }
+}
diff --git a/Ryujinx.Actions/ReleaseInformation.cs b/Ryujinx.Actions/ReleaseInformation.cs
new file mode 100644
index 0000000000..7668f2b323
--- /dev/null
+++ b/Ryujinx.Actions/ReleaseInformation.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Ryujinx.Actions
+{
+ public class ReleaseInformation
+ {
+ public VersionCore Version { get; set; }
+ public List Artifacts { get; set; }
+
+ private ReleaseInformation()
+ {
+
+ }
+
+ public ReleaseInformation(VersionCore version)
+ {
+ Version = version;
+ Artifacts = new List();
+ }
+ }
+}
diff --git a/Ryujinx.Actions/Ryujinx.Actions.csproj b/Ryujinx.Actions/Ryujinx.Actions.csproj
new file mode 100644
index 0000000000..d07f00979c
--- /dev/null
+++ b/Ryujinx.Actions/Ryujinx.Actions.csproj
@@ -0,0 +1,13 @@
+
+
+
+ netcoreapp3.0
+ win-x64;osx-x64;linux-x64
+ Exe
+
+
+
+
+
+
+
diff --git a/Ryujinx.Actions/VersionCore.cs b/Ryujinx.Actions/VersionCore.cs
new file mode 100644
index 0000000000..18be931619
--- /dev/null
+++ b/Ryujinx.Actions/VersionCore.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Globalization;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Text.RegularExpressions;
+
+namespace Ryujinx.Actions
+{
+ public class VersionCore
+ {
+ private static readonly Regex REGEX = new Regex(@"^(?\d+)" +
+ @"(?>\.(?\d+))?" +
+ @"(?>\.(?\d+))?$",
+ RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.ExplicitCapture);
+
+ public uint Major { get; private set; }
+ public uint Minor { get; private set; }
+ public uint Patch { get; private set; }
+
+ public VersionCore(uint major, uint minor, uint patch)
+ {
+ Major = major;
+ Minor = minor;
+ Patch = patch;
+ }
+
+ public void IncrementPatch()
+ {
+ Patch++;
+ }
+
+ public override string ToString()
+ {
+ return $"{Major}.{Minor}.{Patch}";
+ }
+
+ public static VersionCore FromString(string version)
+ {
+ Match match = REGEX.Match(version);
+
+ if (!match.Success)
+ {
+ return null;
+ }
+
+ uint major = uint.Parse(match.Groups["major"].Value, CultureInfo.InvariantCulture);
+ uint minor = uint.Parse(match.Groups["minor"].Value, CultureInfo.InvariantCulture);
+ uint patch = uint.Parse(match.Groups["patch"].Value, CultureInfo.InvariantCulture);
+
+ return new VersionCore(major, minor, patch);
+ }
+
+ public class Converter : JsonConverter
+ {
+ public override VersionCore Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ return FromString(reader.GetString());
+ }
+
+ public override void Write(Utf8JsonWriter writer, VersionCore value, JsonSerializerOptions options)
+ {
+ writer.WriteStringValue(value.ToString());
+ }
+ }
+ }
+}
diff --git a/Ryujinx.Audio/Ryujinx.Audio.csproj b/Ryujinx.Audio/Ryujinx.Audio.csproj
index 80940c770e..b4cbf7e439 100644
--- a/Ryujinx.Audio/Ryujinx.Audio.csproj
+++ b/Ryujinx.Audio/Ryujinx.Audio.csproj
@@ -4,24 +4,14 @@
netcoreapp3.0
win-x64;osx-x64;linux-x64
Debug;Release;Profile Debug;Profile Release
-
-
-
true
- true
TRACE;USE_DEBUGGING
- false
-
-
-
- true
- true
TRACE;USE_DEBUGGING
true
diff --git a/Ryujinx.Common/Ryujinx.Common.csproj b/Ryujinx.Common/Ryujinx.Common.csproj
index 1b7cf8afbf..c969927b25 100644
--- a/Ryujinx.Common/Ryujinx.Common.csproj
+++ b/Ryujinx.Common/Ryujinx.Common.csproj
@@ -4,24 +4,14 @@
netcoreapp3.0
win-x64;osx-x64;linux-x64
Debug;Release;Profile Debug;Profile Release
-
-
-
true
- true
TRACE;USE_DEBUGGING
- false
-
-
-
- true
- true
TRACE;USE_DEBUGGING
true
diff --git a/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj b/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj
index a55c4d1ceb..564acc1162 100644
--- a/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj
+++ b/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj
@@ -11,14 +11,6 @@
netcoreapp3.0
win-x64;osx-x64;linux-x64
-
-
-
true
-
-
- true
-
-
diff --git a/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj b/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj
index 63289e53d4..ad6b1d99eb 100644
--- a/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj
+++ b/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj
@@ -3,13 +3,6 @@
netcoreapp3.0
win-x64;osx-x64;linux-x64
-
-
-
- true
-
-
-
true
diff --git a/Ryujinx.HLE/Ryujinx.HLE.csproj b/Ryujinx.HLE/Ryujinx.HLE.csproj
index e9540ab876..b0f060e5d3 100644
--- a/Ryujinx.HLE/Ryujinx.HLE.csproj
+++ b/Ryujinx.HLE/Ryujinx.HLE.csproj
@@ -4,24 +4,14 @@
netcoreapp3.0
win-x64;osx-x64;linux-x64
Debug;Release;Profile Debug;Profile Release
-
-
-
true
- true
TRACE;USE_DEBUGGING
- false
-
-
-
- true
- true
TRACE;USE_DEBUGGING
true
diff --git a/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj b/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj
index f99f504a75..85701ac821 100644
--- a/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj
+++ b/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj
@@ -18,7 +18,6 @@
TRACE;USE_DEBUGGING
- false
diff --git a/Ryujinx.sln b/Ryujinx.sln
index 40a086e5f2..38b0d1bcec 100644
--- a/Ryujinx.sln
+++ b/Ryujinx.sln
@@ -31,9 +31,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Texture",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Shader", "Ryujinx.Graphics.Shader\Ryujinx.Graphics.Shader.csproj", "{03B955CD-AD84-4B93-AAA7-BF17923BBAA5}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Graphics.Nvdec", "Ryujinx.Graphics.Nvdec\Ryujinx.Graphics.Nvdec.csproj", "{85A0FA56-DC01-4A42-8808-70DAC76BD66D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec", "Ryujinx.Graphics.Nvdec\Ryujinx.Graphics.Nvdec.csproj", "{85A0FA56-DC01-4A42-8808-70DAC76BD66D}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Debugger", "Ryujinx.Debugger\Ryujinx.Debugger.csproj", "{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Debugger", "Ryujinx.Debugger\Ryujinx.Debugger.csproj", "{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Actions", "Ryujinx.Actions\Ryujinx.Actions.csproj", "{B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -163,14 +165,6 @@ Global
{85A0FA56-DC01-4A42-8808-70DAC76BD66D}.Profile Release|Any CPU.Build.0 = Release|Any CPU
{85A0FA56-DC01-4A42-8808-70DAC76BD66D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85A0FA56-DC01-4A42-8808-70DAC76BD66D}.Release|Any CPU.Build.0 = Release|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Profile Debug|Any CPU.ActiveCfg = Profile Debug|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Profile Debug|Any CPU.Build.0 = Profile Debug|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Profile Release|Any CPU.ActiveCfg = Profile Release|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Profile Release|Any CPU.Build.0 = Profile Release|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2E02B7F3-245E-43B1-AE5B-44167A0FDA20}.Release|Any CPU.Build.0 = Release|Any CPU
{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}.Profile Debug|Any CPU.ActiveCfg = Profile Debug|Any CPU
@@ -179,6 +173,14 @@ Global
{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}.Profile Release|Any CPU.Build.0 = Profile Release|Any CPU
{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{79E4EE34-9C5F-4BE6-8529-A49D32B5B0CC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Profile Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Profile Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Profile Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Profile Release|Any CPU.Build.0 = Release|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B4BB6784-3F94-4EEB-AFA1-3D497D2DC0AB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Ryujinx/Ryujinx.csproj b/Ryujinx/Ryujinx.csproj
index 25eb8ff477..5a5a07776f 100644
--- a/Ryujinx/Ryujinx.csproj
+++ b/Ryujinx/Ryujinx.csproj
@@ -6,7 +6,7 @@
Exe
true
Debug;Release;Profile Debug;Profile Release
- 1.0.0-dirty
+ 1.1.0-dirty
@@ -16,7 +16,6 @@
TRACE;USE_DEBUGGING
- false
diff --git a/appveyor.yml b/appveyor.yml
index 4fcf50503e..0cf00a01ce 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,7 +1,4 @@
-version: 1.0.{build}
-branches:
- only:
- - master
+version: 1.0.0
image: Visual Studio 2019
environment:
matrix:
@@ -12,6 +9,17 @@ environment:
config_name: '-profiled-'
build_script:
- ps: >-
+ # Ensure that we are in a PR
+ if (-not (Test-Path env:APPVEYOR_PULL_REQUEST_NUMBER)) {
+ throw "This should only be trigger on pull request build!"
+ }
+
+ # change version to contain the PR
+ $version = "$version-pr$env:APPVEYOR_PULL_REQUEST_NUMBER"
+
+ # update AppVeyor build
+ Update-AppveyorBuild -Version $version
+
dotnet --version
dotnet publish -c $env:config -r win-x64 /p:Version=$env:APPVEYOR_BUILD_VERSION