gyroflow: support aarch64-darwin

This commit is contained in:
BatteredBunny
2026-08-02 16:41:08 +03:00
parent 2fe4eb1f61
commit b2b5ce8aca

View File

@@ -1,5 +1,6 @@
{
lib,
stdenv,
rustPlatform,
fetchFromGitHub,
makeDesktopItem,
@@ -10,10 +11,14 @@
qt6,
alsa-lib,
bash,
bzip2,
ffmpeg_7,
libicns,
libxml2,
mdk-sdk,
ocl-icd,
opencv,
zlib,
}:
let
lens-profiles = fetchFromGitHub {
@@ -38,28 +43,45 @@ rustPlatform.buildRustPackage rec {
nativeBuildInputs = [
clang
copyDesktopItems
patchelf
pkg-config
rustPlatform.bindgenHook
qt6.wrapQtAppsHook
]
++ lib.optionals stdenv.hostPlatform.isLinux [
copyDesktopItems
patchelf
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
libicns
];
buildInputs = [
alsa-lib
bash
ffmpeg_7
mdk-sdk
ocl-icd
opencv
qt6.qtbase
qt6.qtdeclarative
qt6.qtsvg
]
++ lib.optionals stdenv.hostPlatform.isLinux [
alsa-lib
ocl-icd
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
bzip2
libxml2
zlib
];
postPatch = ''
substituteInPlace build.rs \
--replace-fail 'println!("cargo:rustc-link-lib=static:+whole-archive=z")' ""
''
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace build.rs \
--replace-fail 'println!("cargo:rustc-link-lib=static:+whole-archive=x264");' "" \
--replace-fail 'println!("cargo:rustc-link-lib=static=x265");' ""
'';
# qml-video-rs and gyroflow assume that all Qt headers are installed
@@ -70,15 +92,29 @@ rustPlatform.buildRustPackage rec {
# https://github.com/gyroflow/gyroflow/blob/v1.5.4/build.rs#L163-L186
# Additionally gyroflow needs QtQuickControls2:
# https://github.com/gyroflow/gyroflow/blob/v1.5.4/build.rs#L173
env.NIX_CFLAGS_COMPILE = toString [
"-I${qt6.qtdeclarative}/include/QtQuick"
"-I${qt6.qtdeclarative}/include/QtQuick/${qt6.qtdeclarative.version}"
"-I${qt6.qtdeclarative}/include/QtQuick/${qt6.qtdeclarative.version}/QtQuick"
"-I${qt6.qtdeclarative}/include/QtQml"
"-I${qt6.qtdeclarative}/include/QtQml/${qt6.qtdeclarative.version}"
"-I${qt6.qtdeclarative}/include/QtQml/${qt6.qtdeclarative.version}/QtQml"
"-I${qt6.qtdeclarative}/include/QtQuickControls2"
];
env.NIX_CFLAGS_COMPILE = toString (
if stdenv.hostPlatform.isDarwin then
[
"-F${qt6.qtdeclarative}/lib"
"-I${qt6.qtdeclarative}/lib/QtQuick.framework/Headers"
"-I${qt6.qtdeclarative}/lib/QtQuick.framework/Headers/${qt6.qtdeclarative.version}"
"-I${qt6.qtdeclarative}/lib/QtQuick.framework/Headers/${qt6.qtdeclarative.version}/QtQuick"
"-I${qt6.qtdeclarative}/lib/QtQml.framework/Headers"
"-I${qt6.qtdeclarative}/lib/QtQml.framework/Headers/${qt6.qtdeclarative.version}"
"-I${qt6.qtdeclarative}/lib/QtQml.framework/Headers/${qt6.qtdeclarative.version}/QtQml"
"-I${qt6.qtdeclarative}/lib/QtQuickControls2.framework/Headers"
]
else
[
"-I${qt6.qtdeclarative}/include/QtQuick"
"-I${qt6.qtdeclarative}/include/QtQuick/${qt6.qtdeclarative.version}"
"-I${qt6.qtdeclarative}/include/QtQuick/${qt6.qtdeclarative.version}/QtQuick"
"-I${qt6.qtdeclarative}/include/QtQml"
"-I${qt6.qtdeclarative}/include/QtQml/${qt6.qtdeclarative.version}"
"-I${qt6.qtdeclarative}/include/QtQml/${qt6.qtdeclarative.version}/QtQml"
"-I${qt6.qtdeclarative}/include/QtQuickControls2"
]
);
# FFMPEG_DIR is used by ffmpeg-sys-next/build.rs and
# gyroflow/build.rs. ffmpeg-sys-next fails to build if this dir
@@ -102,23 +138,69 @@ rustPlatform.buildRustPackage rec {
doCheck = false; # No tests.
postInstall = ''
mkdir -p $out/opt/Gyroflow
cp -r resources $out/opt/Gyroflow/
ln -s ${lens-profiles} $out/opt/Gyroflow/resources/camera_presets
# mdk-sdk license key is hardcoded to 'gyroflow' process name, wrapQt changes it,
# which breaks the license check and throws a QR code
dontWrapQtApps = true;
rm -rf $out/lib
patchelf $out/bin/gyroflow --add-rpath ${mdk-sdk}/lib
postInstall =
if stdenv.hostPlatform.isDarwin then
''
contents=$out/Applications/Gyroflow.app/Contents
mv $out/bin/gyroflow $out/opt/Gyroflow/
ln -s ../opt/Gyroflow/gyroflow $out/bin/
mkdir -p $out/Applications
cp -r _deployment/mac/Gyroflow.app $out/Applications/
find $out/Applications/Gyroflow.app -name .empty -delete
install -D ${./gyroflow-open.sh} $out/bin/gyroflow-open
install -Dm644 ${./gyroflow-mime.xml} $out/share/mime/packages/gyroflow.xml
install -Dm644 resources/icon.svg $out/share/icons/hicolor/scalable/apps/gyroflow.svg
'';
# Qt is located through wrapQtAppsHook, so drop upstream's qt.conf,
# which points plugin and QML lookups back inside the bundle.
rm $contents/Resources/qt.conf
desktopItems = [
substituteInPlace $contents/Info.plist \
--replace-fail \
'<key>CFBundleExecutable</key> <string>gyroflow</string>' \
'<key>CFBundleExecutable</key> <string>gyroflow-launcher</string>'
png2icns $contents/Resources/AppIcon.icns resources/icon_1024_mac.png
ln -s ${lens-profiles} $contents/Resources/camera_presets
install_name_tool -add_rpath ${mdk-sdk}/lib $out/bin/gyroflow
mv $out/bin/gyroflow $contents/MacOS/gyroflow
rmdir $out/bin
rm -rf $out/lib
''
else
''
mkdir -p $out/opt/Gyroflow
cp -r resources $out/opt/Gyroflow/
ln -s ${lens-profiles} $out/opt/Gyroflow/resources/camera_presets
rm -rf $out/lib
patchelf $out/bin/gyroflow --add-rpath ${mdk-sdk}/lib
mv $out/bin/gyroflow $out/opt/Gyroflow/
install -D ${./gyroflow-open.sh} $out/bin/gyroflow-open
install -Dm644 ${./gyroflow-mime.xml} $out/share/mime/packages/gyroflow.xml
install -Dm644 resources/icon.svg $out/share/icons/hicolor/scalable/apps/gyroflow.svg
'';
postFixup =
if stdenv.hostPlatform.isDarwin then
''
macos=$out/Applications/Gyroflow.app/Contents/MacOS
makeQtWrapper $macos/gyroflow $macos/gyroflow-launcher
mkdir -p $out/bin
ln -s ../Applications/Gyroflow.app/Contents/MacOS/gyroflow-launcher $out/bin/gyroflow
''
else
''
makeQtWrapper $out/opt/Gyroflow/gyroflow $out/bin/gyroflow
'';
desktopItems = lib.optionals stdenv.hostPlatform.isLinux [
(makeDesktopItem {
name = "gyroflow";
desktopName = "Gyroflow";
@@ -148,6 +230,9 @@ rustPlatform.buildRustPackage rec {
cc0
];
maintainers = [ ];
platforms = [ "x86_64-linux" ];
platforms = [
"aarch64-darwin"
"x86_64-linux"
];
};
}