{ stdenv, fetchurl, bison, flex, db4, perl, kernel, iproute }:

# tcc can even compile kernel modules for speed reason.
# that would be a nice use case to test!

# something is still wrong. The output can't be pasred sometimes
# Eg it contains continue/pass,drop/pass, drop/drop. I've replaced
# them by ok, drop, drop using sed. I'm not sure wether this is the correct way
# Man pages are missing as well. So use the link at the bottom

let version = "10b"; in

stdenv.mkDerivation {

  name = "tcng-${version}";

  src = fetchurl {
    url = mirror://debian/pool/main/t/tcng/tcng_10b.orig.tar.gz;
    sha256 = "1xjs0yn90rfa8ibxybg3gab1xzcjg60njymq2bd1b0a9i0arx7ji";
  };

  iproute2Src = iproute.src;

  patches =
    [ (fetchurl {
        url = mirror://debian/pool/main/t/tcng/tcng_10b-2.diff.gz;
        sha256 = "17i4s2ffif0k4b78gfhkp08lvvharbfvyhwbd0vkwgpria0b9zrd";
      })
    ];
  
  # one mailinglist post says you should just add your kernel version to the list.. (?)
  patchPhase = ''
    unset patchPhase
    patchPhase
    unpackFile $iproute2Src
    IPROUTESRC=$(echo iproute*)
    for script in $(find . -type f); do sed -e 's@#![ ]*/bin/bash@#! /bin/sh@' -i $script; done
    find . -type f | xargs sed -i 's@/usr/bin/perl@${perl}/bin/perl@g'
    find . -type f | xargs sed -i 's@/lib/cpp@cpp@g'
  '';

  # gentoo ebulid says tcsim doesn't compile with 2.6 headers..
  # DATADIR can still be overridden by env TOPDIR=...
  # Don't know whats it for except including the default .tc files
  configurePhase=''
    cat >> config << EOF
    YACC="yacc"
    DATA_DIR="$out/lib/tcng"
    EOF
    ./configure \
    --kernel ${kernel}/lib/modules/2.6.28.6-default/build \
    --iproute2 $IPROUTESRC \
    --install-directory $out \
    --no-manual \
    --with-tcsim
  '';

  # hacky, how to enable building tcc the correct way?
  # adding shared and tcc to SUBDIRS and run make again isn't nice but works
  buildPhase = ''
    sed -i 's@^\(SUBDIRS.*\)@\1 shared tcc@' Makefile 
    make
  '';

  # manually copy tcc and include files.. see comment above
  installPhase = ''
    ensureDir $out{,/sbin,/lib/tcng/include}
    make DESTDIR=$out install
    cp tcc/tcc $out/sbin
    cp tcc/*.tc $out/lib/tcng/include
  '';

  buildInputs = [ bison flex db4 perl ];

  meta = { 
    description = "tcng - Traffic Control Next Generation";
    homepage = "http://tcng.sourceforge.net/";
    license = "GPLv2";
  };
}