From f1a9635564e8a32bf15ef281ec9b0b1051ef5a91 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Sun, 25 May 2025 19:44:08 +0100 Subject: [PATCH 1/4] Linux Arm Support Lets try Linux Arm Support --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ae41a96..e46fde8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,7 +9,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [windows-latest, ubuntu-latest, macos-latest] + os: [windows-latest, ubuntu-latest, macos-latest, ubuntu-22.04-arm] fail-fast: false steps: - name: Expose GitHub Runtime From 5a0bb12b35ea73904248a9ffafe02884731edb58 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Sun, 25 May 2025 20:42:22 +0100 Subject: [PATCH 2/4] Add arm64 linux config --- ffmpeg.linux-arm64.config | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 ffmpeg.linux-arm64.config diff --git a/ffmpeg.linux-arm64.config b/ffmpeg.linux-arm64.config new file mode 100644 index 0000000..05e90e6 --- /dev/null +++ b/ffmpeg.linux-arm64.config @@ -0,0 +1,10 @@ +######################################################################################################################## +### Toolchain Options +######################################################################################################################## +--arch=aarch64 +--target-os=linux + +######################################################################################################################## +### Optimization Options +######################################################################################################################## +--enable-neon From 93b6ce723f57a82e2fb4be9bba49cff6c9bd9511 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Sun, 25 May 2025 20:48:13 +0100 Subject: [PATCH 3/4] Detect arm linux --- build/BuildLinuxTask.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build/BuildLinuxTask.cs b/build/BuildLinuxTask.cs index 1d1808f..3243151 100644 --- a/build/BuildLinuxTask.cs +++ b/build/BuildLinuxTask.cs @@ -9,11 +9,12 @@ public sealed class BuildLinuxTask : FrostingTask public override void Run(BuildContext context) { + Architecture arch = RuntimeInformation.OSArchitecture; // Absolute path to the artifact directory is needed for flags since they don't allow relative path var artifactDir = context.MakeAbsolute(new DirectoryPath(context.ArtifactsDir)); - var dependencyDir = context.MakeAbsolute(new DirectoryPath($"{context.ArtifactsDir}/../dependencies-linux-x64")); + var dependencyDir = context.MakeAbsolute(new DirectoryPath($"{context.ArtifactsDir}/../dependencies-linux-{(arch == Architecture.Arm64 ? "arm64" : "x64")}")); var prefixFlag = $"--prefix=\"{dependencyDir}\""; - var hostFlag = "--host=\"x86_64-linux-gnu\""; + var hostFlag = arch == Architecture.Arm64 ? "--host=\"aarch64-linux-gnu\"" : "--host=\"x86_64-linux-gnu\""; var binDirFlag = $"--bindir=\"{artifactDir}\""; var envVariables = new Dictionary @@ -83,7 +84,8 @@ private static string GetFFMpegConfigureFlags(BuildContext context) { var ignoreCommentsAndNewLines = (string line) => !string.IsNullOrWhiteSpace(line) && !line.StartsWith('#'); var configureFlags = context.FileReadLines("ffmpeg.config").Where(ignoreCommentsAndNewLines); - var osConfigureFlags = context.FileReadLines($"ffmpeg.linux-x64.config").Where(ignoreCommentsAndNewLines); + var osConfigFile = arch == Architecture.Arm64 ? "ffmpeg.linux-arm64.config" : "ffmpeg.linux-x64.config"; + var osConfigureFlags = context.FileReadLines(osConfigFile).Where(ignoreCommentsAndNewLines); return string.Join(' ', configureFlags) + " " + string.Join(' ', osConfigureFlags); } } From 95edbdf724144e131660e6760e9daa8b49e9c2d1 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Sun, 25 May 2025 20:55:22 +0100 Subject: [PATCH 4/4] Detect Linux arm --- build/Build.csproj | 1 + build/BuildLinuxTask.cs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build/Build.csproj b/build/Build.csproj index 646f1ad..0f56c9a 100644 --- a/build/Build.csproj +++ b/build/Build.csproj @@ -22,6 +22,7 @@ + diff --git a/build/BuildLinuxTask.cs b/build/BuildLinuxTask.cs index 3243151..d1eedde 100644 --- a/build/BuildLinuxTask.cs +++ b/build/BuildLinuxTask.cs @@ -9,7 +9,7 @@ public sealed class BuildLinuxTask : FrostingTask public override void Run(BuildContext context) { - Architecture arch = RuntimeInformation.OSArchitecture; + var arch = RuntimeInformation.OSArchitecture; // Absolute path to the artifact directory is needed for flags since they don't allow relative path var artifactDir = context.MakeAbsolute(new DirectoryPath(context.ArtifactsDir)); var dependencyDir = context.MakeAbsolute(new DirectoryPath($"{context.ArtifactsDir}/../dependencies-linux-{(arch == Architecture.Arm64 ? "arm64" : "x64")}")); @@ -84,7 +84,7 @@ private static string GetFFMpegConfigureFlags(BuildContext context) { var ignoreCommentsAndNewLines = (string line) => !string.IsNullOrWhiteSpace(line) && !line.StartsWith('#'); var configureFlags = context.FileReadLines("ffmpeg.config").Where(ignoreCommentsAndNewLines); - var osConfigFile = arch == Architecture.Arm64 ? "ffmpeg.linux-arm64.config" : "ffmpeg.linux-x64.config"; + var osConfigFile = RuntimeInformation.OSArchitecture == Architecture.Arm64 ? "ffmpeg.linux-arm64.config" : "ffmpeg.linux-x64.config"; var osConfigureFlags = context.FileReadLines(osConfigFile).Where(ignoreCommentsAndNewLines); return string.Join(' ', configureFlags) + " " + string.Join(' ', osConfigureFlags); }