cmake_minimum_required(VERSION 2.6)

#------------------------------------------------------------------------------
# w_scan was always installed to prefix '/usr',
# whereas cmake defaults to /usr/local.
# changing default here to be compatible.
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH
    "Install path prefix, prepended onto install directories." FORCE) 
endif ()

#------------------------------------------------------------------------------
# define symbols here.
SET(_GNU_SOURCE 1)
SET(PACKAGE w_scan)
SET(CMAKE_VERBOSE_MAKEFILE on )

#------------------------------------------------------------------------------
# Checks for header files (presence only.)
#    usage: CHECK_INCLUDE_FILES (<header> <RESULT_VARIABLE> )
#
INCLUDE (CheckIncludeFiles)
CHECK_INCLUDE_FILES(stdlib.h HAVE_STDLIB_H )
CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H )
CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H )
CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H )
CHECK_INCLUDE_FILES(fcntl.h HAVE_FCNTL_H )
CHECK_INCLUDE_FILES(memory.h HAVE_MEMORY_H )
CHECK_INCLUDE_FILES(string.h HAVE_STRING_H )
CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H )
CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H )
CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H )
CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H )
CHECK_INCLUDE_FILES("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS )
CHECK_INCLUDE_FILES(linux/dvb/frontend.h HAVE_LINUX_DVB_FRONTEND_H )
CHECK_INCLUDE_FILES(linux/dvb/version.h HAVE_LINUX_DVB_VERSION_H )

#------------------------------------------------------------------------------
# Throw error, if dvb headers not found.
#
if(NOT (HAVE_LINUX_DVB_VERSION_H AND HAVE_LINUX_DVB_FRONTEND_H))
   message(FATAL_ERROR "*******************************************************\n"
                       "*** ERROR: ${PACKAGE} requires linux DVB headers,\n"
                       "*** (usually /usr/include/linux/dvb).\n"
	               "*** EXITING!\n"
	               "*******************************************************")
endif(NOT (HAVE_LINUX_DVB_VERSION_H AND HAVE_LINUX_DVB_FRONTEND_H))

#------------------------------------------------------------------------------
# Checks for function prototypes in headers (but no link check)
#    usage: CHECK_PROTOTYPE_EXISTS(function headers variable)
#
INCLUDE (CheckPrototypeExists) 
CHECK_PROTOTYPE_EXISTS(malloc stdlib.h HAVE_MALLOC)
CHECK_PROTOTYPE_EXISTS(strtoul stdlib.h HAVE_STRTOUL) 
CHECK_PROTOTYPE_EXISTS(memset string.h HAVE_MEMSET)
CHECK_PROTOTYPE_EXISTS(strdup string.h HAVE_STRDUP)
CHECK_PROTOTYPE_EXISTS(strcasecmp strings.h HAVE_STRCASECMP)

#------------------------------------------------------------------------------
# Checks for dvb header usability
#    usage: CHECK_SYMBOL_EXISTS(symbol headers variable)
#
INCLUDE(CheckSymbolExists)
CHECK_SYMBOL_EXISTS(DTV_DVBT2_PLP_ID "linux/dvb/frontend.h" FRONTEND_H_HAS_SYS_DVBT2)

#------------------------------------------------------------------------------
# DTV_DVBT2_PLP_ID was introduced in frontend.h in DVB API 5.3; assume that all
# other needed symbols are there this case.
#
if(NOT FRONTEND_H_HAS_SYS_DVBT2)
   message(FATAL_ERROR "*******************************************************\n"
                       "*** ERROR: ${PACKAGE} requires linux DVB API v5.3 or higher.\n"
                       "*** Please update your linux dvb headers,\n"
                       "*** (usually /usr/include/linux/dvb).\n"
	               "*** EXITING!\n"
	               "*******************************************************")
endif(NOT FRONTEND_H_HAS_SYS_DVBT2)


#------------------------------------------------------------------------------
# Generate config.h from config.h.cmake
#    todo: autogenerate config.h.cmake from source like autoheader.
#
CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/config.h.cmake"
                "${PROJECT_SOURCE_DIR}/config.h" )


#------------------------------------------------------------------------------
# Lookup source and header files in source and doc dir
#
FILE(GLOB w_scan_headers *.h)
FILE(GLOB w_scan_csource *.c)
FILE(GLOB w_scan_doc_README doc/README*)
FILE(GLOB w_scan_doc_conf doc/*.conf)

ADD_EXECUTABLE(w_scan ${w_scan_csource})
ADD_DEFINITIONS(-g -O2 -Wall -Wextra -Wno-comment -Wswitch-default -Wno-unused-parameter -fsigned-char)

install	(
	TARGETS w_scan
	RUNTIME DESTINATION bin
	)

install (
	FILES AUTHORS ChangeLog COPYING README ${w_scan_doc_README} ${w_scan_doc_conf}
	DESTINATION share/doc/w_scan
	)

install (
	FILES doc/w_scan.1
	DESTINATION man/man1
	)

#------------------------------------------------------------------------------
# the 'version' target.
# WARNING: THIS TARGET IS INTENDED TO BE RUN ON THE DEVELOPERS MACHINES ONLY.
#          DO *NOT* RUN THIS MAKE TARGET ON YOUR MACHINE.
#
MACRO(GET_CURRENT_DATE RESULT)
    IF(UNIX)
        EXECUTE_PROCESS(COMMAND "date" "+%Y%m%d" OUTPUT_VARIABLE ${RESULT})
        string(REGEX REPLACE "\n" "" ${RESULT} ${${RESULT}})
    ELSE (UNIX)
        MESSAGE(SEND_ERROR "*** ERROR: GET_CURRENT_DATE is not implemented for non-posix platform.")
        SET(${RESULT} 000000)
    ENDIF (UNIX)
ENDMACRO(GET_CURRENT_DATE)
GET_CURRENT_DATE(DATE)

MACRO(CREATE_VERSION_H _header)
   FILE(WRITE  ${_header} "/* AUTOMATICALLY GENERATED - DO NOT EDIT MANUALLY */\n")
   FILE(APPEND ${_header} "#ifndef W_SCAN_VERSION_H\n")
   FILE(APPEND ${_header} "#define W_SCAN_VERSION_H\n")
   FILE(APPEND ${_header} "uint version=${DATE};\n")
   FILE(APPEND ${_header} "#endif\n")
ENDMACRO(CREATE_VERSION_H)
CREATE_VERSION_H(${CMAKE_BINARY_DIR}/version.h.tmp)

ADD_CUSTOM_TARGET(version
  COMMAND rm "${PROJECT_SOURCE_DIR}/version.h" VERBATIM
  COMMAND cp "${CMAKE_BINARY_DIR}/version.h.tmp" "${PROJECT_SOURCE_DIR}/version.h" VERBATIM
  )

#------------------------------------------------------------------------------
# the 'dist' target.
# WARNING: THIS TARGET IS INTENDED TO BE RUN ON THE DEVELOPERS MACHINES ONLY.
#          DO *NOT* RUN THIS MAKE TARGET ON YOUR MACHINE.
#
SET(_autotools aclocal.m4 *.in configure depcomp install-sh Makefile.* missing NEWS)
SET(_cmake *.cmake CMakeLists.txt)
SET(_extra AUTHORS ChangeLog COPYING INSTALL README)
SET(_src *.c *.h)

ADD_CUSTOM_TARGET(dist
  COMMAND rm -f ${PROJECT_SOURCE_DIR}/w_scan
  COMMAND cp -f ${CMAKE_BINARY_DIR}/w_scan ${PROJECT_SOURCE_DIR}/w_scan
  COMMAND chmod 755 ${PROJECT_SOURCE_DIR}/doc
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/doc/*
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/ChangeLog
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/README
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/CMakeLists.txt
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/*.c
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/*.h
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/*.in
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/*.cmake
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/*.am
  COMMAND chmod 644 ${PROJECT_SOURCE_DIR}/*.add
  COMMAND chmod 755 ${PROJECT_SOURCE_DIR}/configure
  COMMAND cd ${PROJECT_SOURCE_DIR} && tar cfj w_scan-${DATE}.tar.bz2 ${_src} ${_autotools} ${_cmake} ${_extra} doc w_scan
)
# increase automagically version if packaging && rebuild to enshure that w_scan is up-to-date in package
ADD_DEPENDENCIES(dist version all)
