Skip to content

Commit

Permalink
Upgrade to .NET 8
Browse files Browse the repository at this point in the history
Added a separate .NET 6 Windows build because .NET 8 is not available on Windows 7/8
  • Loading branch information
SourMesen committed May 24, 2024
1 parent a6ce34b commit 829c671
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 62 deletions.
31 changes: 14 additions & 17 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ name: Build Mesen
on: [push]

env:
# I'm not a fan of the telemetry as-is, but this also suppresses some lines in the build log.
DOTNET_CLI_TELEMETRY_OPTOUT: 1
# This removes even more spurious lines.
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1

jobs:
windows:
strategy:
matrix:
platform: [
{netversion: 6.x, targetframework: net6.0},
{netversion: 8.x, targetframework: net8.0}
]
fail-fast: false
runs-on: windows-latest

Expand All @@ -23,26 +26,26 @@ jobs:
- name: Install .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.x
dotnet-version: ${{ matrix.platform.netversion }}

- name: Setup MSBuild.exe
uses: microsoft/[email protected]
with:
msbuild-architecture: x64

- name: Execute unit tests
run: dotnet test -nologo
- name: Restore packages
run: dotnet restore /p:TargetFramework="${{ matrix.platform.targetframework }}"

- name: Build Mesen
run: msbuild -nologo -v:d -clp:ForceConsoleColor -m -p:Configuration=Release -p:Platform=x64 -t:Clean,UI
run: msbuild -nologo -v:d -clp:ForceConsoleColor -m -p:Configuration=Release -p:Platform=x64 -t:Clean,UI /p:TargetFramework="${{ matrix.platform.targetframework }}"

- name: Publish Mesen
run: dotnet publish -nologo -c Release /p:Platform="Any CPU" /p:OptimizeUi="true" Mesen.sln /p:PublishProfile=UI\Properties\PublishProfiles\Release.pubxml
run: dotnet publish -nologo --no-restore -c Release /p:Platform="Any CPU" /p:OptimizeUi="true" /p:TargetFramework="${{ matrix.platform.targetframework }}" Mesen.sln /p:PublishProfile=UI\Properties\PublishProfiles\Release.pubxml

- name: Upload Mesen
uses: actions/upload-artifact@v3
with:
name: Mesen (Windows)
name: Mesen (Windows - ${{ matrix.platform.targetframework }})
path: |
build/TmpReleaseBuild/Mesen.exe
Expand Down Expand Up @@ -73,16 +76,13 @@ jobs:
- name: Install .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.x
dotnet-version: 8.x

- name: Install dependencies
run: |
sudo apt-get update -qy
sudo apt-get install -qy libsdl2-dev # The compilers are already installed on GitHub's runners.
- name: Execute unit tests
run: dotnet test --nologo

# stderr is not detected as a TTY, so diagnostics are by default printed without colours;
# forcing colours makes the log a little nicer to read.
- name: Build Mesen
Expand All @@ -107,7 +107,7 @@ jobs:
- name: Install .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.x
dotnet-version: 8.x

- name: Install dependencies
run: |
Expand Down Expand Up @@ -144,15 +144,12 @@ jobs:
- name: Install .NET Core
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.x
dotnet-version: 8.x

- name: Install dependencies
run: |
brew install sdl2
- name: Execute unit tests
run: dotnet test --nologo

# stderr is not detected as a TTY, so diagnostics are by default printed without colours;
# forcing colours makes the log a little nicer to read.
- name: Build Mesen
Expand Down
42 changes: 11 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,54 +1,34 @@
# Mesen

Mesen is a multi-system emulator (NES, SNES, Game Boy, PC Engine, Master System/Game Gear) for Windows, Linux and macOS built in C++ and C#.
Mesen is a multi-system emulator (NES, SNES, Game Boy, Game Boy Advance, PC Engine, Master System/Game Gear) for Windows, Linux and macOS built in C++ and C#.

## Development Builds

[![Mesen](https://github.com/SourMesen/Mesen2/actions/workflows/build.yml/badge.svg)](https://github.com/SourMesen/Mesen2/actions/workflows/build.yml)

Latest development builds:

* [Windows](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20%28Windows%29.zip)
* [Windows 10 / 11 (.NET 8)](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20%28Windows%20-%20net8.0%29.zip)
* [Windows 7 / 8 (.NET 6)](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20%28Windows%20-%20net6.0%29.zip)
* [macOS - Intel](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20%28macOS%20-%20macos-12%29.zip)
* [macOS - Apple Silicon](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20%28macOS%20-%20macos-14%29.zip)
* [Linux](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20%28Linux%20-%20ubuntu-20.04%20-%20clang%29.zip)
* [Linux - AppImage](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20(Linux%20x64%20-%20AppImage).zip)

**macOS**: The macOS build still has a number of limitations (e.g no gamepad support).

**SteamOS**: Running Mesen through the Steam Deck's _Game Mode_ is possible with some caveats regarding rendering the UI.
<details>
<summary>SteamOS instructions and caveats</summary>
<br>
Due to Gamescope (SteamOS' compositor) not handling Avalonia UI's popups very well (a [solution](https://github.com/AvaloniaUI/Avalonia/pull/14366) is available but [has been reverted due to other issues](https://github.com/AvaloniaUI/Avalonia/pull/14573)), Mesen's menus for settings are not working through Gamescope unless running Mesen [through running KDE Plasma's Desktop through a script](https://www.reddit.com/r/SteamDeck/comments/zqgx9g/desktop_mode_within_gaming_mode_updated_for_new/).

Installation instructions:
* Download the **[Linux - AppImage](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20(Linux%20x64%20-%20AppImage).zip)** nightly build.
* **Mark the AppImage as executable.** (right click > Properties > Permissions > Is executable)
* Add the application as a non-Steam shortcut to be able to run it through Steam on both _Desktop Mode_ and _Game Mode_. (right click > Add to Steam)
* Customise the non-Steam shortcut through Steam to your desire. (in Steam: search the AppImage's filename, right click > Properties; from there you can change the icon, shortcut name and launch options)
* Create a folder called `Mesen.AppImage.Config` in the same directory where the AppImage is stored.
* Run it the first time. When asking where to store the settings, choose the `Store the data in my user profile` option. ![254295455-88c1942d-b81f-48ee-a3a3-74b9f3ecd9b7-1](https://github.com/kevin-wijnen/Mesen2/assets/58944808/9f4ff1e3-4df6-4441-958b-ce96599ef69d)
* Set up the controls as asked by Mesen.
#### Notes / limitations

**Due to Gamescope not rendering the UI menus, it is recommended to bind some keyboard shortcuts to L4/R4/L5/R5 (the Back Grip Buttons).** You can rebind controls in _Game Mode_ by clicking the Controller icon. You can save the layout by clicking the Cog icon (next to `Edit Layout`) > Export Layout > select `New Template` as the Export Type to use it across multiple shortcuts.
It is recommended to:
* Bind `Control Key + O Key` to open the file picker for opening a game file.
* Bind `Escape Key` to pause emulation.
* Bind `F11` to enter in or out of fullscreen.

**If sound does not work**, check if an audio device is chosen by Mesen. (in Mesen: Settings > Audio > General (Device))
**macOS**: The macOS build still has a number of limitations (e.g no gamepad support).

**To make game-specific shortcuts**: Repeat the non-Steam shortcut step on the Mesen AppImage. Customise the new shortcut with a Launch Option (in Steam: right click > Properties; Launch Options). To find possible Launch Options, check the Command-line options menu (in Mesen: Help > Command-line options). When you want to supply a game with the shortcut, put the entire file location of the game in double quotes ("game-filepath") as the first part of the launch options. Add additional options (`--fullscreen` for example) _after_ the file location.
</details>
**SteamOS**: See [SteamOS.md](SteamOS.md)

## Requirements

To run Mesen, the following prerequisites must be installed:

**Windows**: [.NET 6 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)
**Linux**: [.NET 6 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0), SDL2
**macOS**: [.NET 6 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0), SDL2
**Windows 10 / 11**: [.NET 8 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/8.0)
**Windows 7 / 8**: [.NET 6 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) (.NET 8 is not supported on Windows 7 / 8)
**Linux**: [.NET 8 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/8.0), SDL2
**macOS**: [.NET 8 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/8.0), SDL2

## Compiling

Expand All @@ -58,7 +38,7 @@ See [COMPILING.md](COMPILING.md)

Mesen is available under the GPL V3 license. Full text here: <http://www.gnu.org/licenses/gpl-3.0.en.html>

Copyright (C) 2023 Sour
Copyright (C) 2014-2024 Sour

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down
21 changes: 21 additions & 0 deletions SteamOS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Running Mesen through the Steam Deck's _Game Mode_ is possible with some caveats regarding rendering the UI.
Due to Gamescope (SteamOS' compositor) not handling Avalonia UI's popups very well (a [solution](https://github.com/AvaloniaUI/Avalonia/pull/14366) is available but [has been reverted due to other issues](https://github.com/AvaloniaUI/Avalonia/pull/14573)), Mesen's menus for settings are not working through Gamescope unless running Mesen [through running KDE Plasma's Desktop through a script](https://www.reddit.com/r/SteamDeck/comments/zqgx9g/desktop_mode_within_gaming_mode_updated_for_new/).

Installation instructions:
* Download the **[Linux - AppImage](https://nightly.link/SourMesen/Mesen2/workflows/build/master/Mesen%20(Linux%20x64%20-%20AppImage).zip)** nightly build.
* **Mark the AppImage as executable.** (right click > Properties > Permissions > Is executable)
* Add the application as a non-Steam shortcut to be able to run it through Steam on both _Desktop Mode_ and _Game Mode_. (right click > Add to Steam)
* Customise the non-Steam shortcut through Steam to your desire. (in Steam: search the AppImage's filename, right click > Properties; from there you can change the icon, shortcut name and launch options)
* Create a folder called `Mesen.AppImage.Config` in the same directory where the AppImage is stored.
* Run it the first time. When asking where to store the settings, choose the `Store the data in my user profile` option. ![254295455-88c1942d-b81f-48ee-a3a3-74b9f3ecd9b7-1](https://github.com/kevin-wijnen/Mesen2/assets/58944808/9f4ff1e3-4df6-4441-958b-ce96599ef69d)
* Set up the controls as asked by Mesen.

**Due to Gamescope not rendering the UI menus, it is recommended to bind some keyboard shortcuts to L4/R4/L5/R5 (the Back Grip Buttons).** You can rebind controls in _Game Mode_ by clicking the Controller icon. You can save the layout by clicking the Cog icon (next to `Edit Layout`) > Export Layout > select `New Template` as the Export Type to use it across multiple shortcuts.
It is recommended to:
* Bind `Control Key + O Key` to open the file picker for opening a game file.
* Bind `Escape Key` to pause emulation.
* Bind `F11` to enter in or out of fullscreen.

**If sound does not work**, check if an audio device is chosen by Mesen. (in Mesen: Settings > Audio > General (Device))

**To make game-specific shortcuts**: Repeat the non-Steam shortcut step on the Mesen AppImage. Customise the new shortcut with a Launch Option (in Steam: right click > Properties; Launch Options). To find possible Launch Options, check the Command-line options menu (in Mesen: Help > Command-line options). When you want to supply a game with the shortcut, put the entire file location of the game in double quotes ("game-filepath") as the first part of the launch options. Add additional options (`--fullscreen` for example) _after_ the file location.
1 change: 1 addition & 0 deletions UI/Localization/resources.en.xml
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,7 @@
<Control ID="lblLink">www.mesen.ca</Control>
<Control ID="lblVersion">Version:</Control>
<Control ID="lblBuildDate">Build Date:</Control>
<Control ID="lblRuntimeVersion">Runtime:</Control>

<Control ID="grpAcknowledgements">Acknowledgements</Control>
<Control ID="lblAcknowledgeList">Thank you to the following people/projects for their direct and indirect help in making Mesen possible:</Control>
Expand Down
2 changes: 1 addition & 1 deletion UI/UI.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<Nullable>enable</Nullable>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
Expand Down
27 changes: 14 additions & 13 deletions UI/Windows/AboutWindow.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@
<TextBlock Text="{l:Translate lblBuildDate}" Margin="0 0 5 0" />
<TextBlock Text="{CompiledBinding BuildDate, ElementName=root}" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="3">
<TextBlock Text="{l:Translate lblRuntimeVersion}" Margin="0 0 5 0" />
<TextBlock Text="{CompiledBinding RuntimeVersion, ElementName=root}" />
</StackPanel>
<TextBlock Name="lblCopyright" Margin="3" />
<StackPanel Orientation="Horizontal" Margin="3">
<TextBlock Text="{l:Translate lblWebsite}" Margin="0 0 5 0" />
Expand All @@ -83,8 +87,8 @@
</StackPanel>

<c:GroupBox Header="{l:Translate grpAcknowledgements}" Margin="5 5 5 0">
<ScrollViewer AllowAutoHide="True">
<StackPanel>
<DockPanel>
<StackPanel DockPanel.Dock="Top">
<TextBlock Text="{l:Translate lblAcknowledgeList}" Margin="0 5 0 5" TextWrapping="Wrap" />
<Border BorderBrush="Gray" BorderThickness="1">
<ListBox
Expand All @@ -93,20 +97,17 @@
ScrollViewer.AllowAutoHide="False"
/>
</Border>

<TextBlock Text="{l:Translate lblSpecialThanks}" Margin="0 5 0 5" TextWrapping="Wrap" />

<TextBlock Text="{l:Translate lblUsedSoftware}" Margin="0 15 0 5" />
<Border BorderBrush="Gray" BorderThickness="1">
<ListBox
ItemsSource="{CompiledBinding LibraryList, ElementName=root}"
Height="130"
Background="Transparent"
ScrollViewer.AllowAutoHide="False"
/>
</Border>
</StackPanel>
</ScrollViewer>

<Border BorderBrush="Gray" BorderThickness="1">
<ListBox
ItemsSource="{CompiledBinding LibraryList, ElementName=root}"
Background="Transparent"
/>
</Border>
</DockPanel>
</c:GroupBox>

</DockPanel>
Expand Down
2 changes: 2 additions & 0 deletions UI/Windows/AboutWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,15 @@ public AboutListEntry(string name, string author, string note, string url)

public string Version { get; }
public string BuildDate { get; }
public string RuntimeVersion { get; }
public List<AboutListEntry> LibraryList { get; }
public List<AboutListEntry> AcknowledgeList { get; }

public AboutWindow()
{
Version = EmuApi.GetMesenVersion().ToString();
BuildDate = EmuApi.GetMesenBuildDate();
RuntimeVersion = ".NET " + Environment.Version;

LibraryList = new List<AboutListEntry>() {
new("Avalonia", "", "MIT", "https://github.com/AvaloniaUI/Avalonia"),
Expand Down

0 comments on commit 829c671

Please sign in to comment.