{ fetchurl, stdenv, unzip, pkgconfig, makeWrapper, libsndfile, libmicrohttpd, vim }:

stdenv.mkDerivation rec {

  version = "0.9.67";
  name = "faust-compiler-${version}";
  src = fetchurl {
    url = "http://downloads.sourceforge.net/project/faudiostream/faust-${version}.zip";
    sha256 = "068vl9536zn0j4pknwfcchzi90rx5pk64wbcbd67z32w0csx8xm1";
  };

  buildInputs = [ unzip pkgconfig makeWrapper libsndfile libmicrohttpd vim];


  makeFlags="PREFIX = $(out)";
  FPATH="$out"; # <- where to search

  patchPhase = ''
    sed -i 's@?= $(shell uname -s)@:= Linux@g'  architecture/osclib/oscpack/Makefile
    sed -i 's@faust/misc.h@../../architecture/faust/misc.h@g' tools/sound2faust/sound2faust.cpp
    sed -i 's@faust/gui/@../../architecture/faust/gui/@g' architecture/faust/misc.h
    '';

  buildPhase = ''
    make -C compiler -f Makefile.unix
    make -C architecture/osclib
	g++ -O3 tools/sound2faust/sound2faust.cpp `pkg-config --cflags --static --libs sndfile` -o tools/sound2faust/sound2faust
    make httpd

  '';

  installPhase = ''

    echo install faust itself
    mkdir -p $out/bin/
    mkdir -p $out/include/
	mkdir -p $out/include/faust/
	mkdir -p $out/include/faust/osc/
    install compiler/faust $out/bin/

    echo install architecture and faust library files
    mkdir -p $out/lib/faust
    cp architecture/*.lib $out/lib/faust/
    cp architecture/*.cpp $out/lib/faust/

    echo install math documentation files
	cp architecture/mathdoctexts-*.txt $out/lib/faust/
	cp architecture/latexheader.tex $out/lib/faust/

    echo install additional binary libraries: osc, http
	([ -e architecture/httpdlib/libHTTPDFaust.a ] && cp architecture/httpdlib/libHTTPDFaust.a $out/lib/faust/) || echo libHTTPDFaust not available	
	cp architecture/osclib/*.a $out/lib/faust/
	cp -r architecture/httpdlib/html/js $out/lib/faust/js
	([ -e architecture/httpdlib/src/hexa/stylesheet ] && cp architecture/httpdlib/src/hexa/stylesheet $out/lib/faust/js/stylesheet.js) || echo stylesheet not available
	([ -e architecture/httpdlib/src/hexa/jsscripts ] && cp architecture/httpdlib/src/hexa/jsscripts $out/lib/faust/js/jsscripts.js) || echo jsscripts not available

    echo install includes files for architectures
	cp -r architecture/faust $out/include/

    echo install additional includes files for binary libraries:  osc, http
	cp architecture/osclib/faust/faust/OSCControler.h $out/include/faust/gui/
	cp architecture/osclib/faust/faust/osc/*.h $out/include/faust/osc/
	cp architecture/httpdlib/src/include/*.h $out/include/faust/gui/


    echo patch header and cpp files
    find $out/include/ -name "*.h" -type f | xargs sed "s@#include \"faust/@#include \"$out/include/faust/@g" -i
    find $out/lib/faust/ -name "*.cpp" -type f | xargs sed "s@#include \"faust/@#include \"$out/include/faust/@g" -i
    sed -i "s@../../architecture/faust/gui/@$out/include/faust/gui/@g"  $out/include/faust/misc.h

    wrapProgram $out/bin/faust \
    --set FAUSTLIB $out/lib/faust \
    --set FAUST_LIB_PATH  $out/lib/faust \
    --set FAUSTINC $out/include/
  '';

  meta = with stdenv.lib; {
    description = "A functional programming language for realtime audio signal processing";
    longDescription = ''
      FAUST (Functional Audio Stream) is a functional programming
      language specifically designed for real-time signal processing
      and synthesis. FAUST targets high-performance signal processing
      applications and audio plug-ins for a variety of platforms and
      standards.
      The Faust compiler translates DSP specifications into very
      efficient C++ code. Thanks to the notion of architecture,
      FAUST programs can be easily deployed on a large variety of
      audio platforms and plugin formats (jack, alsa, ladspa, maxmsp,
      puredata, csound, supercollider, pure, vst, coreaudio) without
      any change to the FAUST code.
      This package has just the compiler. Install faust for the full
      set of faust2somethingElse tools.
    '';
    homepage = http://faust.grame.fr/;
    downloadPage = http://sourceforge.net/projects/faudiostream/files/;
    license = licenses.gpl2;
    platforms = platforms.linux;
    maintainers = [ maintainers.magnetophon ];
  };
}

