summaryrefslogtreecommitdiffstats
path: root/shell.nix
blob: 0389f0b9ff53c9b8bdbb08ce9be5f95ec4ff4906 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
{ nixroot  ? (import <nixpkgs> {})
, defaultLv2Plugins ? false
, lv2Plugins ? []
, releaseMode ? false
}:
let inherit (nixroot) stdenv pkgs lib
    chromaprint fftw flac libid3tag libmad libopus libshout libsndfile lilv
    libusb1 libvorbis libebur128 pkgconfig portaudio portmidi protobuf qt5 glib
    rubberband sqlite taglib soundtouch vamp opusfile hidapi upower ccache git
    libGLU x11 lame lv2 makeWrapper
    clang-tools
    cmake
    fetchurl
    ffmpeg
    gdb
    libmodplug
    mp4v2
    nix-gitignore
    python3
    wavpack
    pcre
    libsecret;

  libdjinterop = stdenv.mkDerivation rec {
    name    = "libdjinterop";
    version = "0.14.3";

    src = pkgs.fetchFromGitHub {
      owner  = "xsco";
      repo   = "libdjinterop";
      rev    = version;
      sha256 = "0f3l30vaawd4kv3kci6ik92adi03w2fycx66v8zibcknj384jl91";
    };

    nativeBuildInputs = with pkgs; [
      meson
      ninja
      pkgconfig
    ];

    buildInputs = with pkgs; [ zlib boost sqlite ];
    outputs     = [ "out" "dev" ];
  };

  qtkeychain = pkgs.qtkeychain.override {
    withQt5 = true;
    qtbase = qt5.qtbase;
    qttools = qt5.qttools;
  };

  git-clang-format = stdenv.mkDerivation {
    name = "git-clang-format";
    version = "2019-06-21";
    src = fetchurl {
      url = "https://raw.githubusercontent.com/llvm-mirror/clang/2bb8e0fe002e8ffaa9ce5fa58034453c94c7e208/tools/clang-format/git-clang-format";
      sha256 = "1kby36i80js6rwi11v3ny4bqsi6i44b9yzs23pdcn9wswffx1nlf";
      executable = true;
    };
    nativeBuildInputs = [
      makeWrapper
    ];
    buildInputs = [
      clang-tools
      python3
    ];
    unpackPhase = ":";
    installPhase = ''
      mkdir -p $out/opt $out/bin
      cp $src $out/opt/git-clang-format
      makeWrapper $out/opt/git-clang-format $out/bin/git-clang-format \
        --add-flags --binary \
        --add-flags ${clang-tools}/bin/clang-format
    '';
  };

  shell-configure = nixroot.writeShellScriptBin "configure" ''
    mkdir -p cbuild
    cd cbuild
    cmake .. "$@"
  '';

  shell-build = nixroot.writeShellScriptBin "build" ''
    if [ ! -d "cbuild" ]; then
      >&2 echo "First you have to run configure."
      exit 1
    fi
    cd cbuild
    cmake --build . --parallel $NIX_BUILD_CORES "$@"
  '';

  shell-run = nixroot.writeShellScriptBin "run" ''
    if [ ! -f "cbuild/mixxx" ]; then
      >&2 echo "First you have to run build."
      exit 1
    fi
    cd cbuild
    ./mixxx --resourcePath res/ "$@"
  '';

  shell-debug = nixroot.writeShellScriptBin "debug" ''
    if [ ! -f "cbuild/mixxx" ]; then
      >&2 echo "First you have to run build."
      exit 1
    fi
    cd cbuild
    gdb --args ./mixxx --resourcePath res/ "$@"
  '';

  allLv2Plugins = lv2Plugins ++ (if defaultLv2Plugins then [
    nixroot.x42-plugins nixroot.zam-plugins nixroot.rkrlv2 nixroot.mod-distortion
    nixroot.infamousPlugins nixroot.artyFX
  ] else []);

in stdenv.mkDerivation rec {
  name = "mixxx-${version}";
  # Reading the version from git output is very hard to do without wasting lots of diskspace and
  # runtime. Reading version file is easy.
  version = lib.strings.removeSuffix "\"\n" (
              lib.strings.removePrefix "#define MIXXX_VERSION \"" (
                builtins.readFile ./src/_version.h ));

  shellHook =  ''
    echo -e "Mixxx development shell. Available commands:\n"
    echo " configure - configures cmake (only has to run once)"
    echo " build - compiles Mixxx"
    echo " run - runs Mixxx with development settings"
    echo " debug - runs Mixxx inside gdb"
      '';

  src = if releaseMode then (nix-gitignore.gitignoreSource ''
    /cbuild
    /.envrc
    /result
    /shell.nix
  '' ./.) else null;

  nativeBuildInputs = [
    cmake
  ] ++ (if !releaseMode then [
    ccache
    gdb
    git-clang-format
    shell-configure shell-build shell-run shell-debug
  ] else []);

  buildInputs = [
    chromaprint fftw flac libid3tag libmad libopus libshout libsndfile
    libusb1 libvorbis libebur128 pkgconfig portaudio portmidi protobuf qt5.full
    rubberband sqlite taglib soundtouch vamp.vampSDK opusfile upower hidapi
    git glib x11 libGLU lilv lame lv2 makeWrapper qt5.qtbase
    ffmpeg
    libmodplug
    mp4v2
    wavpack
    pcre
    libsecret
    qtkeychain
    libdjinterop
  ] ++ allLv2Plugins;

  meta = with nixroot.stdenv.lib; {
    homepage = https://mixxx.org;
    description = "Digital DJ mixing software";
    license = licenses.gpl2Plus;
    maintainers = nixroot.pkgs.mixxx.meta.maintainers;
    platforms = platforms.linux;
  };
}