#!/bin/bash
#
# Tvheadend configure script
#
# Copyright (c) 2012 Adam Sutton <dev@adamsutton.me.uk>
#

# ###########################################################################
# Setup
# ###########################################################################

ROOTDIR=$(cd "$(dirname "$0")"; pwd)

#
# Options
#

OPTIONS=(
  "cwc:yes"
  "v4l:no"
  "linuxdvb:yes"
  "iptv:yes"
  "tsfile:yes"
  "dvbscan:yes"
  "timeshift:yes"
  "trace:yes"
  "imagecache:auto"
  "avahi:auto"
  "zlib:auto"
  "libav:auto"
  "inotify:auto"
  "bundle:no"
  "dvbcsa:no"
  "epoll:yes"
  "kqueue:no"
)

#
# Begin
#

. "$ROOTDIR/support/configure.inc"
parse_args $*

# ###########################################################################
# Checks
# ###########################################################################

echo "Checking support/features"

#
# Compiler
#
check_cc || die 'No C compiler found'
check_cc_header execinfo
check_cc_option mmx
check_cc_option sse2

check_cc_snippet getloadavg '#include <stdlib.h> 
void test() { getloadavg(NULL,0); }'

check_cc_snippet atomic64 '#include <stdint.h>
uint64_t test(uint64_t *ptr){
return __sync_fetch_and_add(ptr, 1);
}'

check_cc_snippet lockowner '
#include <sys/syscall.h>
#include <unistd.h>
#include <pthread.h>
#define TEST test
int ok = 1;
void *lockowner ( void *p)
{
  pthread_mutex_t lock;
  pthread_mutex_init(&lock, NULL);
  pthread_mutex_lock(&lock);
  if (lock.__data.__owner == syscall(SYS_gettid))
    ok = 0;
  return NULL;
}
int test ( void )
{
  pthread_t tid;
  pthread_create(&tid, NULL, lockowner, NULL);
  pthread_join(tid, NULL);
  return ok;
}' -lpthread

#
# Python
#
check_py || echo 'WARN: no python binary found'
check_py_import gzip

#
# Binaries
#
check_bin bzip2 || echo 'WARN: no bzip2 binary found'

#
# SSL
#
if [ ${PLATFORM} = "freebsd" ]; then
  # FreeBSD has libssl in base
  enable ssl
elif check_pkg openssl || check_pkg libssl; then
  enable ssl
else
  die "SSL development support not found"
fi

#
# DVB API
#
check_cc_header 'linux/dvb/version' dvbapi
if enabled_or_auto linuxdvb; then
  if enabled dvbapi; then
    enable linuxdvb
  elif enabled linuxdvb; then
    die "Linux DVB API not found (use --disable-linuxdvb)"
  fi
fi

#
# Gzip
#
if enabled_or_auto zlib; then
  if check_pkg zlib; then
    enable zlib
  elif enabled zlib; then
    die "Zlib development support not found (use --disable-zlib)"
  fi
fi

#
# Bundling
#
if enabled bundle; then
  if enabled zlib && ! enabled py_gzip; then
    die "Python gzip module not found (use --disable-zlib or --disable-bundle)"
  fi
fi

#
# Avahi
#
if enabled_or_auto avahi; then
  if check_pkg avahi-client; then
    enable avahi
  elif enabled avahi; then
    die "Avahi development support not found (use --disable-avahi)"
  fi
fi

#
# libav
#
if enabled_or_auto libav; then
  has_libav=true

  if $has_libav && ! check_pkg libavcodec "<=55.0.0"; then
    has_libav=false
  fi

  if $has_libav && ! check_pkg libavcodec ">=52.96.0"; then
    has_libav=false
  fi

  if $has_libav && ! check_pkg libavutil ">=50.43.0"; then
    has_libav=false
  fi

  if $has_libav && ! check_pkg libavformat "<=55.0.0"; then
    has_libav=false
  fi

  if $has_libav && ! check_pkg libavformat ">=53.10.0"; then
    has_libav=false
  fi

  if $has_libav && ! check_pkg libswscale ">=0.13.0"; then
    has_libav=false
  fi

  if $has_libav; then
    enable libav
  elif enabled libav; then
    die "libav development support not found (use --disable-libav)"
  fi
fi

#
# Inotify
#
if enabled_or_auto inotify; then
  if check_cc_header "sys/inotify" inotify_h; then
    enable inotify
  elif enabled inotify; then
    die "Inotify support not found (use --disable-inotify)"
  fi
fi

#
# libdvbcsa
#
if enabled cwc && enabled dvbcsa; then
  (check_cc_header "dvbcsa/dvbcsa" dvbcsa_h &&\
   check_cc_lib    dvbcsa dvbcsa_l) ||\
  die "Failed to find dvbcsa support (use --disable-dvbcsa)"
  LDFLAGS="$LDFLAGS -ldvbcsa"
fi

#
# Icon caching
#
if enabled_or_auto imagecache; then
  if check_pkg libcurl; then
    enable imagecache
  elif enabled imagecache; then
    die "Libcurl support not found (use --disable-imagecache)"
  fi  
fi

#
# DVB scan
#
if enabled linuxdvb && enabled dvbscan; then
  printf "${TAB}" "fetching dvb-scan files ..."
  "${ROOTDIR}/support/getmuxlist"
  if [ $? -ne 0 ]; then
    echo "fail"
    die "Failed to fetch dvb-scan data (use --disable-dvbscan)"
  fi
  echo "ok"
fi

#
# epoll
#
if [ ${PLATFORM} != "linux" ]; then
  disable epoll
fi

#
# kqueue
#
if [ ${PLATFORM} = "freebsd" ]; then
  enable kqueue
fi

#
# MPEGTS/PS support
#
disable mpegts
disable mpegps
if enabled linuxdvb || enabled iptv || enabled tsfile; then
  enable mpegts
fi

if enabled v4l; then
  enable mpegps
fi

# ###########################################################################
# Write config
# ###########################################################################

# Write config
write_config
cat >> "${CONFIG_H}" <<EOF
#define TVHEADEND_DATADIR "$(eval echo ${datadir})/tvheadend"
EOF

# Output config
print_config
echo "Final Binary:"
echo "  $BUILDDIR/tvheadend"
echo ""
echo "Tvheadend Data Directory:"
echo "  $(eval echo ${datadir}/tvheadend)"
echo ""
