noisicaa/noisicaa.nix

154 lines
5.5 KiB
Nix

# @begin:license
#
# Copyright (c) 2015-2021, Ben Niemann <pink@odahoda.de>
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# @end:license
{ withTests ? false
}:
let
nixpkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/d14d83a3691121642be1b0579cf3408a83c558d7.tar.gz") {};
lib = nixpkgs.lib;
stdenv = nixpkgs.stdenv;
fetchFromGitHub = nixpkgs.fetchFromGitHub;
# mach-nix: Create highly reproducible python environments
# https://github.com/DavHau/mach-nix
mach-nix = import (builtins.fetchGit {
url = "https://github.com/DavHau/mach-nix/";
ref = "refs/tags/3.3.0";
}) {
# https://github.com/DavHau/pypi-deps-db as of 2021-10-28
pypiDataRev = "b1b4dcb59dafdf07069afe2c35b80b17bd98e15f";
pypiDataSha256 = "sha256:06vg3ifs8lmz2ch6jvxjc0jlqh213z1kf76y36gbv7qvdzm57rck";
};
python = mach-nix.mkPython {
python = "python38";
# pyside2 is a pain to work with when installed by mach-nix (gets rebuilt from source, needs
# overrides to include work with qtquickcontrols, ...). Let's filter it (and possibly other
# packages) out and install them directly from nixpkgs (see PYTHONPATH below).
requirements = let
req-runtime = lib.strings.splitString "\n" (builtins.readFile ./etc/requirements.txt);
req-dev = lib.strings.splitString "\n" (builtins.readFile ./etc/requirements-dev.txt);
req-all = req-runtime ++ (lib.lists.optionals withTests req-dev);
blacklist = [ "pyside2" ];
is_blacklisted = l: builtins.any (pkg: !isNull (builtins.match (pkg + "=.*") l)) blacklist;
req-filtered = builtins.filter (l: !is_blacklisted l) req-all;
requirements = builtins.concatStringsSep "\n" req-filtered;
in requirements;
_."ruamel.yaml".propagatedBuildInputs.mod = pySelf: oldAttrs: oldVal: oldVal ++ [ pySelf."ruamel_yaml_clib" ];
packagesExtra = [
(mach-nix.buildPythonPackage ./3rdparty/flatpy)
];
};
# gitignoreSource: Nix functions for filtering local git sources
# https://github.com/hercules-ci/gitignore.nix
gitignoreSrc = fetchFromGitHub {
owner = "hercules-ci";
repo = "gitignore.nix";
rev = "9e80c4d83026fa6548bc53b1a6fab8549a6991f6"; # 2021-10-16
sha256 = "sha256:04n9chlpbifgc5pa3zx6ff3rji9am6msrbn1z3x1iinjz2xjfp4p";
};
inherit (import gitignoreSrc { inherit lib; }) gitignoreSource;
# FlatBuffers: Memory Efficient Serialization Library
# https://github.com/google/flatbuffers
flatbuffers = stdenv.mkDerivation rec {
pname = "flatbuffers";
version = "2.0.0-git";
src = fetchFromGitHub {
owner = "google";
repo = "flatbuffers";
# The latest version which populates 'declaration_file'.
rev = "c871df7702c46df7bfb1783aebbf49d054f9282e";
sha256 = "sha256:1a7cj068vap1m3sq9wvzyjjj0vgnk7bxm18mfwvvadl68yh9ij1f";
};
nativeBuildInputs = [ nixpkgs.cmake ];
cmakeFlags = [ "-DFLATBUFFERS_BUILD_TESTS=OFF" ];
doCheck = false;
};
qt5 = nixpkgs.libsForQt515;
in stdenv.mkDerivation {
pname = "noisicaa";
version = lib.strings.fileContents ./VERSION;
src = gitignoreSource ./.;
nativeBuildInputs = [
nixpkgs.makeWrapper
python
nixpkgs.wafHook
nixpkgs.pkg-config
flatbuffers
nixpkgs.librsvg
nixpkgs.libjack2
nixpkgs.ffmpeg.dev
nixpkgs.fmt
qt5.qmake
qt5.qtbase
qt5.qtquickcontrols2.dev
qt5.qttools.dev
nixpkgs.faust
] ++ lib.lists.optional withTests [
nixpkgs.gtest.dev
nixpkgs.lcov
nixpkgs.qtcreator
nixpkgs.jack2
];
dontWrapQtApps = true;
wafConfigureFlags = "--release " + (if withTests then "--with-tests" else "--without-tests");
postInstall = ''
patchShebangs $out/bin/noisicaa
substituteInPlace $out/bin/noisicaa --replace python3 ${python}/bin/python
wrapProgram $out/bin/noisicaa \
--prefix LD_LIBRARY_PATH : $out/lib/noisicaa/ \
--set PYTHONPATH $out/lib/noisicaa/:$PYTHONPATH \
--set QT_QPA_PLATFORM_PLUGIN_PATH $QT_QPA_PLATFORM_PLUGIN_PATH \
--set QT_PLUGIN_PATH $QT_PLUGIN_PATH \
--set QML2_IMPORT_PATH $QML2_IMPORT_PATH \
--set QT5_LIBDIR $QT5_LIBDIR
'';
PYTHONPATH=builtins.concatStringsSep ":" [
"${nixpkgs.python38.pkgs.pyside2}/lib/python3.8/site-packages"
"${nixpkgs.python38.pkgs.shiboken2}/lib/python3.8/site-packages"
];
# https://discourse.nixos.org/t/how-can-i-build-a-python-package-that-uses-qt/7657
QT_QPA_PLATFORM_PLUGIN_PATH = "${qt5.qtbase.bin}/lib/qt-${qt5.qtbase.version}/plugins";
QT_PLUGIN_PATH = "${qt5.qtsvg.bin}/lib/qt-${qt5.qtsvg.version}/plugins";
QML2_IMPORT_PATH = builtins.concatStringsSep ":" [
"${qt5.qtdeclarative.bin}/lib/qt-${qt5.qtdeclarative.version}/qml"
"${qt5.qtquickcontrols}/lib/qt-${qt5.qtquickcontrols.version}/qml"
"${qt5.qtquickcontrols2.bin}/lib/qt-${qt5.qtquickcontrols2.version}/qml"
"${qt5.qtgraphicaleffects}/lib/qt-${qt5.qtgraphicaleffects.version}/qml"
];
QT5_LIBDIR = "${qt5.qtbase.out}/lib/";
}