From f184341c77124a4237057803a359aa7fb76d879a Mon Sep 17 00:00:00 2001 From: Mio Date: Wed, 21 Jan 2026 14:17:02 +1100 Subject: [PATCH] tuxguitar: build from source, add darwin support, update to 2.0.1 --- pkgs/by-name/tu/tuxguitar/fix-include.patch | 24 ++ pkgs/by-name/tu/tuxguitar/package.nix | 233 ++++++++++++++++---- 2 files changed, 218 insertions(+), 39 deletions(-) create mode 100644 pkgs/by-name/tu/tuxguitar/fix-include.patch diff --git a/pkgs/by-name/tu/tuxguitar/fix-include.patch b/pkgs/by-name/tu/tuxguitar/fix-include.patch new file mode 100644 index 000000000000..33d48cabde82 --- /dev/null +++ b/pkgs/by-name/tu/tuxguitar/fix-include.patch @@ -0,0 +1,24 @@ +diff -Naur tuxguitar/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2.h tuxguitar-patched/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2.h +--- tuxguitar/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2.h 2025-11-03 22:30:10.315511003 +1100 ++++ tuxguitar-patched/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2.h 2025-11-03 22:36:06.444389423 +1100 +@@ -1,7 +1,7 @@ + #ifndef _Included_LV2 + #define _Included_LV2 + +-#include ++#include + #include + #include + #include +diff -Naur tuxguitar/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2UI.h tuxguitar-patched/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2UI.h +--- tuxguitar/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2UI.h 2025-11-03 22:30:10.315511003 +1100 ++++ tuxguitar-patched/desktop/TuxGuitar-synth-lv2/src/main/cxx/LV2UI.h 2025-11-03 22:39:40.376479709 +1100 +@@ -1,7 +1,7 @@ + #ifndef _Included_LV2UI + #define _Included_LV2UI + +-#include ++#include + + void LV2UI_malloc(LV2UI **handle, LV2Feature *feature, LV2Instance *instance, LV2Lock* lock); + diff --git a/pkgs/by-name/tu/tuxguitar/package.nix b/pkgs/by-name/tu/tuxguitar/package.nix index 6fcf73980277..d7f70aed6e93 100644 --- a/pkgs/by-name/tu/tuxguitar/package.nix +++ b/pkgs/by-name/tu/tuxguitar/package.nix @@ -1,70 +1,223 @@ { lib, stdenv, - fetchurl, + fetchFromGitHub, + maven, swt, + jdk, jre, - makeWrapper, + makeBinaryWrapper, + pkg-config, alsa-lib, jack2, fluidsynth, libpulseaudio, lilv, + suil, + qt5, which, wrapGAppsHook3, nixosTests, + fetchpatch, }: -stdenv.mkDerivation (finalAttrs: { - version = "1.6.6"; +let + swtArtifactId = + "org.eclipse.swt." + (if stdenv.hostPlatform.isDarwin then "cocoa.macosx" else "gtk.linux"); + buildDir = + "desktop/build-scripts/tuxguitar-" + + (if stdenv.hostPlatform.isDarwin then "macosx-swt-cocoa" else "linux-swt"); + buildScript = "${buildDir}/pom.xml"; + mvnParams = lib.escapeShellArgs [ + "-f" + buildScript + "-P" + "native-modules" + "-Dmaven.test.skip=true" + ]; + ldLibVar = if stdenv.hostPlatform.isDarwin then "DYLD_LIBRARY_PATH" else "LD_LIBRARY_PATH"; + classpath = [ + "${swt}/jars/swt.jar" + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ + "$out/lib/tuxguitar.jar" + "$out/lib/itext.jar" + ]; + libraryPath = [ + "$out/lib" + fluidsynth + lilv + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ + swt + alsa-lib + jack2 + libpulseaudio + ]; + wrapperPaths = [ + jre + which + ]; + # FIXME: Makes hash stable across platforms and convert to a single hash. + mvnHashByPlatform = { + "x86_64-linux" = "sha256-7UDFGuOMERvY74mkneusJyuAHfF3U6b4qV4MPHGQYdM="; + "aarch64-linux" = "sha256-7UDFGuOMERvY74mkneusJyuAHfF3U6b4qV4MPHGQYdM="; + "aarch64-darwin" = "sha256-lfO2YH+yKZWzh3MeQ7baESGmmW7zPdTLs8CjZ/FtLu0="; + }; + wrapperArgs = [ + "\${gappsWrapperArgs[@]}" + "--prefix" + "PATH" + ":" + (lib.makeBinPath wrapperPaths) + "--prefix" + ldLibVar + ":" + (lib.makeLibraryPath libraryPath) + "--prefix" + "CLASSPATH" + ":" + (lib.concatStringsSep ":" classpath) + ]; + version = "2.0.1"; +in +maven.buildMavenPackage { pname = "tuxguitar"; + inherit version; - src = fetchurl { - url = "https://github.com/helge17/tuxguitar/releases/download/${finalAttrs.version}/tuxguitar-${finalAttrs.version}-linux-swt-amd64.tar.gz"; - hash = "sha256-kfPk+IIg5Q4Fc9HMS0kxxCarlbJjVKluIvz8KpDjJLM="; + src = fetchFromGitHub { + owner = "helge17"; + repo = "tuxguitar"; + tag = version; + hash = "sha256-USdYj8ebosXkiZpDqyN5J+g1kjyWm225iQlx/szXmLA="; }; + patches = [ + ./fix-include.patch + # Helps a little bit with https://github.com/helge17/tuxguitar/issues/961 + (fetchpatch { + name = "create-new-file"; + url = "https://github.com/helge17/tuxguitar/commit/3dc828a9b92e932952c2b33d8ee41db734f2fcc0.patch"; + hash = "sha256-umZlCSCTWqj3tgR+qFcPucEDv5vpaC6zHbDJg/W5KUI="; + }) + ]; + + buildOffline = true; + + mvnJdk = jdk; + + mvnHash = ( + mvnHashByPlatform.${stdenv.system} + or (lib.warn "Missing mvnHash for ${stdenv.system}, using lib.fakeHash" lib.fakeHash) + ); + + mvnParameters = mvnParams; + mvnDepsParameters = mvnParams; + + mvnFetchExtraArgs = { + dontWrapQtApps = true; + dontWrapGApps = true; + preBuild = '' + mkdir -p $out/.m2 + mvn install:install-file \ + -Dfile=${swt}/jars/swt.jar \ + -DgroupId=org.eclipse.swt \ + -DartifactId=${swtArtifactId} \ + -Dpackaging=jar \ + -Dversion=4.36 \ + -Dmaven.repo.local=$out/.m2 + ''; + postInstall = '' + rm -rf $out/.m2/repository/org/eclipse/swt + find $out -type f -name "maven-metadata-*.xml" -delete + ''; + }; + + afterDepsSetup = '' + mvn install:install-file \ + -Dfile=${swt}/jars/swt.jar \ + -DgroupId=org.eclipse.swt \ + -DartifactId=${swtArtifactId} \ + -Dpackaging=jar \ + -Dversion=4.36 \ + -Dmaven.repo.local=$mvnDeps/.m2 + ''; + nativeBuildInputs = [ - makeWrapper + makeBinaryWrapper + jdk + pkg-config + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ wrapGAppsHook3 ]; + buildInputs = [ + swt + fluidsynth + lilv + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ + alsa-lib + jack2 + libpulseaudio + suil + qt5.qtbase + ]; + + dontWrapQtApps = true; + dontWrapGApps = true; installPhase = '' + runHook preInstall + + cd ${buildDir} + '' + # macOS: The build creates tuxguitar-VERSION-macosx-swt-cocoa.app directly + # This directory name already ends with .app and IS the app bundle + + lib.optionalString stdenv.hostPlatform.isDarwin '' + mkdir -p $out/Applications + cp -r target/tuxguitar-9.99-SNAPSHOT-macosx-swt-cocoa.app $out/Applications/TuxGuitar.app + + # Fix the launch script to use the Nix JRE instead of bundled JRE + substituteInPlace $out/Applications/TuxGuitar.app/Contents/MacOS/tuxguitar.sh \ + --replace-fail 'JAVA="./jre/bin/java"' 'JAVA="${jre}/bin/java"' + + # Ensure the main executable has execute permissions + chmod +x $out/Applications/TuxGuitar.app/Contents/MacOS/tuxguitar.sh + + # Symlink doesn't work. We have to create a wrapper script instead mkdir -p $out/bin - cp -r dist lib share $out/ - cp tuxguitar.sh $out/bin/tuxguitar + makeWrapper "$out/Applications/TuxGuitar.app/Contents/MacOS/tuxguitar.sh" \ + "$out/bin/tuxguitar" + '' + # Linux: Install traditional layout + + lib.optionalString stdenv.hostPlatform.isLinux '' + TUXGUITAR_DIR=target/tuxguitar-9.99-SNAPSHOT-linux-swt + mkdir -p $out/{bin,lib} + cp -r $TUXGUITAR_DIR $out/lib/tuxguitar + ln -s $out/lib/tuxguitar/tuxguitar.sh $out/bin/tuxguitar - ln -s $out/dist $out/bin/dist - ln -s $out/lib $out/bin/lib - ln -s $out/share $out/bin/share + mkdir -p $out/share + ln -s $out/lib/tuxguitar/share/{applications,man,metainfo,mime,pixmaps} -t $out/share/ + + # See https://github.com/helge17/tuxguitar/issues/961 + mkdir -p $out/share/templates/.source + ln -s $out/lib/tuxguitar/share/templates/ $out/share/templates/.source/tuxguitar + cp /build/source/desktop/build-scripts/common-resources/common-linux/share/templates/tuxguitar.desktop $out/share/templates/ + '' + + '' + + runHook postInstall ''; - postFixup = '' - wrapProgram $out/bin/tuxguitar \ - "''${gappsWrapperArgs[@]}" \ - --prefix PATH : ${ - lib.makeBinPath [ - jre - which - ] - } \ - --prefix LD_LIBRARY_PATH : "$out/lib/:${ - lib.makeLibraryPath [ - swt - alsa-lib - jack2 - fluidsynth - libpulseaudio - lilv - ] - }" \ - --prefix CLASSPATH : "${swt}/jars/swt.jar:$out/lib/tuxguitar.jar:$out/lib/itext.jar" + postFixup = lib.optionalString stdenv.hostPlatform.isLinux '' + wrapProgram $out/bin/tuxguitar ${lib.concatStringsSep " " wrapperArgs} ''; - passthru.tests = { - nixos = nixosTests.tuxguitar; + passthru = { + tests.nixos = nixosTests.tuxguitar; }; meta = { @@ -74,10 +227,12 @@ stdenv.mkDerivation (finalAttrs: { in Java-SWT. It can open GuitarPro, PowerTab and TablEdit files. ''; homepage = "https://github.com/helge17/tuxguitar"; - sourceProvenance = with lib.sourceTypes; [ binaryBytecode ]; license = lib.licenses.lgpl21Plus; - maintainers = with lib.maintainers; [ ardumont ]; - platforms = [ "x86_64-linux" ]; + maintainers = with lib.maintainers; [ + ardumont + mio + ]; + platforms = builtins.attrNames mvnHashByPlatform; mainProgram = "tuxguitar"; }; -}) +}