* ultrastardx-beta: init at 1.3.5

* libbass, libbass_fx: init at 24

* ultrastar-creator: init at 2017-04-12

* buildSupport/plugins.nix: add diffPlugins

Helper function to compare expected plugin lists to the found plugins.

* ultrastar-manager: init at 2017-05-24

The plugins are built in their own derivations, speeding up (re-)compilation.
The `diffPlugins` function from `beets` is reused to test for changes in the
plugin list on updates.

* beets: switch to diffPlugins

The function is basically just extracted for better reusability.
This commit is contained in:
Profpatsch 2017-06-14 11:29:31 +02:00 committed by Joachim Schiele
parent f6fbbabcb7
commit 79dd4deda5
8 changed files with 315 additions and 10 deletions

View File

@ -0,0 +1,29 @@
{ stdenv }:
# helper functions for packaging programs with plugin systems
{
/* Takes a list of expected plugin names
* and compares it to the found plugins given in the file,
* one plugin per line.
* If the lists differ, the build fails with a nice message.
*
* This is helpful to ensure maintainers dont miss
* the addition or removal of a plugin.
*/
diffPlugins = expectedPlugins: foundPluginsFilePath: ''
# sort both lists first
plugins_expected=$(mktemp)
(${stdenv.lib.concatMapStrings (s: "echo \"${s}\";") expectedPlugins}) \
| sort -u > "$plugins_expected"
plugins_found=$(mktemp)
sort -u "${foundPluginsFilePath}" > "$plugins_found"
if ! mismatches="$(diff -y "$plugins_expected" "$plugins_found")"; then
echo "The the list of expected plugins (left side) doesn't match" \
"the list of plugins we found (right side):" >&2
echo "$mismatches" >&2
exit 1
fi
'';
}

View File

@ -0,0 +1,59 @@
{ stdenv, unzip, fetchurl, writeText }:
let
version = "24";
allBass = {
bass = {
h = "bass.h";
so = {
i686_linux = "libbass.so";
x86_64-linux = "x64/libbass.so";
};
urlpath = "bass${version}-linux.zip";
sha256 = "1a2z9isabkymz7qmkgklbjpj2wxkvv1cngfp9aj0c9178v97pjd7";
};
bass_fx = {
h = "C/bass_fx.h";
so = {
i686_linux = "libbass_fx.so";
x86_64-linux = "x64/libbass_fx.so";
};
urlpath = "z/0/bass_fx${version}-linux.zip";
sha256 = "0j1cbq88j3vnqf2bibcqnfhciz904w48ldgycyh9d8954hwyg22m";
};
};
dropBass = name: bass: stdenv.mkDerivation {
name = "lib${name}-${version}";
src = fetchurl {
url = "https://www.un4seen.com/files/${bass.urlpath}";
inherit (bass) sha256;
};
unpackCmd = ''
mkdir out
${unzip}/bin/unzip $curSrc -d out
'';
lpropagatedBuildInputs = [ unzip ];
dontBuild = true;
installPhase =
let so =
if bass.so ? ${stdenv.system} then bass.so.${stdenv.system}
else abort "${name} not packaged for ${stdenv.system} (yet).";
in ''
mkdir -p $out/{lib,include}
install -m644 -t $out/lib/ ${so}
install -m644 -t $out/include/ ${bass.h}
'';
meta = with stdenv.lib; {
description = "Shareware audio library";
homepage = https://www.un4seen.com/;
license = licenses.unfreeRedistributable;
};
};
in stdenv.lib.mapAttrs dropBass allBass

View File

@ -0,0 +1,49 @@
{ stdenv, autoreconfHook, fetchFromGitHub, pkgconfig
, lua, fpc, pcre, portaudio, freetype, libpng
, SDL2, SDL2_image, SDL2_gfx, SDL2_mixer, SDL2_net, SDL2_ttf
, ffmpeg, sqlite, zlib, libX11, mesa }:
let
sharedLibs = [
pcre portaudio freetype
SDL2 SDL2_image SDL2_gfx SDL2_mixer SDL2_net SDL2_ttf
sqlite lua zlib libX11 mesa ffmpeg
];
in stdenv.mkDerivation rec {
name = "ultrastardx-${version}";
version = "1.3.5-beta";
src = fetchFromGitHub {
owner = "UltraStar-Deluxe";
repo = "USDX";
rev = "v${version}";
sha256 = "0qp64qsj29a08cbv3i52jm1w2pcklw6ya5sniycs24zxggza5pkn";
};
buildInputs = [
pkgconfig autoreconfHook
fpc libpng
] ++ sharedLibs;
postPatch = ''
# autoconf substitutes strange things otherwise
substituteInPlace src/config.inc.in \
--subst-var-by libpcre_LIBNAME libpcre.so.1
'';
preBuild = with stdenv.lib;
let items = concatMapStringsSep " " (x: "-rpath ${getLib x}/lib") sharedLibs;
in ''
export NIX_LDFLAGS="$NIX_LDFLAGS ${items}"
'';
# dlopened libgcc requires the rpath not to be shrinked
dontPatchELF = true;
meta = with stdenv.lib; {
homepage = http://ultrastardx.sourceforge.net/;
description = "Free and open source karaoke game";
license = licenses.gpl2Plus;
maintainers = with maintainers; [ profpatsch ];
};
}

View File

@ -1,4 +1,4 @@
{ stdenv, fetchFromGitHub, writeScript, glibcLocales { stdenv, fetchFromGitHub, writeScript, glibcLocales, diffPlugins
, pythonPackages, imagemagick, gobjectIntrospection, gst_all_1 , pythonPackages, imagemagick, gobjectIntrospection, gst_all_1
, enableAcousticbrainz ? true , enableAcousticbrainz ? true
@ -158,20 +158,13 @@ in pythonPackages.buildPythonApplication rec {
doCheck = true; doCheck = true;
preCheck = '' preCheck = ''
(${concatMapStrings (s: "echo \"${s}\";") allPlugins}) \
| sort -u > plugins_defined
find beetsplug -mindepth 1 \ find beetsplug -mindepth 1 \
\! -path 'beetsplug/__init__.py' -a \ \! -path 'beetsplug/__init__.py' -a \
\( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \ \( -name '*.py' -o -path 'beetsplug/*/__init__.py' \) -print \
| sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \ | sed -n -re 's|^beetsplug/([^/.]+).*|\1|p' \
| sort -u > plugins_available | sort -u > plugins_available
if ! mismatches="$(diff -y plugins_defined plugins_available)"; then ${diffPlugins allPlugins "plugins_available"}
echo "The the list of defined plugins (left side) doesn't match" \
"the list of available plugins (right side):" >&2
echo "$mismatches" >&2
exit 1
fi
''; '';
checkPhase = '' checkPhase = ''

View File

@ -0,0 +1,41 @@
{ stdenv, fetchFromGitHub
, qmakeHook, qtbase, makeQtWrapper
, pkgconfig, taglib, libbass, libbass_fx }:
stdenv.mkDerivation rec {
name = "ultrastar-creator-${version}";
version = "2017-04-12";
src = fetchFromGitHub {
owner = "UltraStar-Deluxe";
repo = "UltraStar-Creator";
rev = "ac519a003f8283bfbe5e2d8e9cdff3a3faf97001";
sha256 = "00idr8a178gvmylq722n13bli59kpxlsy5d8hlplqn7fih48mnzi";
};
postPatch = with stdenv.lib; ''
# we dont want prebuild binaries checked into version control!
rm -rf lib include
sed -e "s|DESTDIR =.*$|DESTDIR = $out/bin|" \
-e 's|-L".*unix"||' \
-e "/QMAKE_POST_LINK/d" \
-e "s|../include/bass|${getLib libbass}/include|g" \
-e "s|../include/bass_fx|${getLib libbass_fx}/include|g" \
-e "s|../include/taglib|${getLib taglib}/include|g" \
-i src/UltraStar-Creator.pro
'';
preConfigure = ''
cd src
'';
nativeBuildInputs = [ qmakeHook makeQtWrapper pkgconfig ];
buildInputs = [ qtbase taglib libbass libbass_fx ];
meta = with stdenv.lib; {
description = "Ultrastar karaoke song creation tool";
homepage = https://github.com/UltraStar-Deluxe/UltraStar-Creator;
license = licenses.gpl2;
maintainers = with maintainers; [ profpatsch ];
};
}

View File

@ -0,0 +1,121 @@
{ stdenv, fetchFromGitHub, pkgconfig, symlinkJoin, qmakeHook, diffPlugins
, qtbase, qtmultimedia, makeQtWrapper
, taglib, libmediainfo, libzen, libbass }:
let
version = "2017-05-24";
rev = "eed5dc41c849ab29b2dee37d97852fffdb45e390";
sha256 = "1ymdgaffazndg9vhh47qqjr5873ld7j066hycp670r08bm519ysg";
buildInputs = [ qtbase qtmultimedia taglib libmediainfo libzen libbass ];
plugins = [
"albumartex"
"amazon"
"audiotag"
"cleanup"
"freecovers"
"lyric"
"preparatory"
"rename"
];
patchedSrc =
let src = fetchFromGitHub {
owner = "UltraStar-Deluxe";
repo = "UltraStar-Manager";
inherit rev sha256;
};
in stdenv.mkDerivation {
name = "${src.name}-patched";
inherit src;
phases = [ "unpackPhase" "patchPhase" ];
patchPhase = with stdenv.lib; ''
# we dont want prebuild binaries checked into version control!
rm -rf lib include
# fix up main project file
sed -e 's|-L.*unix.*lbass.*$|-lbass|' \
-e "/QMAKE_POST_LINK/d" \
-e "s|../include/bass|${getLib libbass}/include|g" \
-e "s|../include/taglib|${getLib taglib}/include|g" \
-e "s|../include/mediainfo|${getLib libmediainfo}/include|g" \
-i src/UltraStar-Manager.pro
# if more plugins start depending on ../../../include,
# it should be abstracted out for all .pro files
sed -e "s|../../../include/taglib|${getLib taglib}/include/taglib|g" \
-i src/plugins/audiotag/audiotag.pro
mkdir $out
mv * $out
'';
};
patchApplicationPath = file: path: ''
sed -e "s|QCore.*applicationDirPath()|QString(\"${path}\")|" -i "${file}"
'';
buildPlugin = name: stdenv.mkDerivation {
name = "ultrastar-manager-${name}-plugin-${version}";
src = patchedSrc;
buildInputs = [ qmakeHook ] ++ buildInputs;
postPatch = ''
sed -e "s|DESTDIR = .*$|DESTDIR = $out|" \
-i src/plugins/${name}/${name}.pro
# plugins use the applications binary folder (wtf)
for f in $(grep -lr "QCoreApplication::applicationDirPath" src/plugins); do
${patchApplicationPath "$f" "\$out"}
done
'';
preConfigure = ''
cd src/plugins/${name}
'';
};
builtPlugins =
symlinkJoin {
name = "ultrastar-manager-plugins-${version}";
paths = map buildPlugin plugins;
};
in stdenv.mkDerivation {
name = "ultrastar-manager-${version}";
src = patchedSrc;
postPatch = ''
sed -e "s|DESTDIR =.*$|DESTDIR = $out/bin|" \
-i src/UltraStar-Manager.pro
# patch plugin manager to point to the collected plugin folder
${patchApplicationPath "src/plugins/QUPluginManager.cpp" builtPlugins}
'';
buildPhase = ''
find -path './src/plugins/*' -prune -type d -print0 \
| xargs -0 -i'{}' basename '{}' \
| sed -e '/shared/d' \
> found_plugins
${diffPlugins plugins "found_plugins"}
cd src && qmake && make
'';
# is not installPhase so that qt post hooks can run
preInstall = ''
make install
'';
nativeBuildInputs = [ makeQtWrapper pkgconfig ];
inherit buildInputs;
meta = with stdenv.lib; {
description = "Ultrastar karaoke song manager";
homepage = https://github.com/UltraStar-Deluxe/UltraStar-Manager;
license = licenses.gpl2;
maintainers = with maintainers; [ profpatsch ];
};
}

View File

@ -98,6 +98,8 @@ with pkgs;
inherit (haskellPackages) dhall-nix; inherit (haskellPackages) dhall-nix;
}; };
diffPlugins = (callPackage ../build-support/plugins.nix {}).diffPlugins;
dockerTools = callPackage ../build-support/docker { }; dockerTools = callPackage ../build-support/docker { };
docker_compose = pythonPackages.docker_compose; docker_compose = pythonPackages.docker_compose;
@ -8325,6 +8327,9 @@ with pkgs;
inherit (ocamlPackages_4_02) bap ocaml findlib ctypes; inherit (ocamlPackages_4_02) bap ocaml findlib ctypes;
}; };
libbass = (callPackage ../development/libraries/audio/libbass { }).bass;
libbass_fx = (callPackage ../development/libraries/audio/libbass { }).bass_fx;
libbluedevil = callPackage ../development/libraries/libbluedevil { }; libbluedevil = callPackage ../development/libraries/libbluedevil { };
libbdplus = callPackage ../development/libraries/libbdplus { }; libbdplus = callPackage ../development/libraries/libbdplus { };
@ -17327,7 +17332,15 @@ with pkgs;
ultimatestunts = callPackage ../games/ultimatestunts { }; ultimatestunts = callPackage ../games/ultimatestunts { };
ultrastardx = callPackage ../games/ultrastardx { ultrastar-creator = libsForQt5.callPackage ../tools/misc/ultrastar-creator { };
ultrastar-manager = libsForQt5.callPackage ../tools/misc/ultrastar-manager { };
ultrastardx = callPackage ../games/ultrastardx/1.1.nix {
ffmpeg = ffmpeg_0;
lua = lua5;
};
ultrastardx-beta = callPackage ../games/ultrastardx/1.3-beta.nix {
ffmpeg = ffmpeg_0; ffmpeg = ffmpeg_0;
lua = lua5; lua = lua5;
}; };