#################################################
#
#  (C) 2011 Timothy Pearson
#  kb9vqf (AT) pearsoncomputing.net
#
#  Improvements and feedback are welcome
#
#  This file is released under GPL >= 2
#
#################################################

##### check for gcc visibility support #########
# FIXME
# This should check for [T]Qt3 visibility support

if( WITH_GCC_VISIBILITY )
  if( NOT UNIX )
    tde_message_fatal(FATAL_ERROR "\ngcc visibility support was requested, but your system is not *NIX" )
  endif( NOT UNIX )
  set( __KDE_HAVE_GCC_VISIBILITY 1 )
  set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden")
  set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden")
endif( )


if( BUILD_TRANSLATIONS AND NOT DEFINED MSGFMT_EXECUTABLE )
  find_program( MSGFMT_EXECUTABLE msgfmt )
  if( NOT MSGFMT_EXECUTABLE )
    tde_message_fatal( "msgfmt program is required, but was not found on your system" )
  endif( )
endif( )

# Initialize some variables
SET(HAVE_XFT FALSE)
SET(HAVE_ALSA FALSE)
SET(HAVE_JACK FALSE)
SET(HAVE_DSSI FALSE)
SET(HAVE_LIBLO FALSE)
SET(HAVE_LIBLRDF FALSE)
SET(HAVE_LADSPA FALSE)
SET(HAVE_LIRC FALSE)
SET(HAVE_FFTW3F FALSE)

# Check for Xft
PKG_CHECK_MODULES(XFT xft>=2.1.0)
IF(XFT_FOUND)
    ADD_DEFINITIONS(-DHAVE_XFT)
    SET(HAVE_XFT TRUE)
    SET(XFT_LIBS ${XFT_LIBRARIES})
    #MESSAGE("XFT_LIBS: ${XFT_LIBS}")
    LIST(APPEND XFT_LIB_DIR ${XFT_LIBRARY_DIRS} ${XFT_LIBDIR})
    #MESSAGE("XFT_LIB_DIR: ${XFT_LIB_DIR}")
    LIST(APPEND XFT_INC_DIR ${XFT_INCLUDE_DIRS} ${XFT_INCLUDEDIR})
    #MESSAGE("XFT_INC_DIR: ${XFT_INC_DIR}")
ENDIF(XFT_FOUND)

IF(WANT_SOUND)

    # Check for ALSA 1.0
    PKG_CHECK_MODULES(ALSA REQUIRED alsa>=1.0)
    IF(ALSA_FOUND)
        SET(HAVE_ALSA TRUE)
        ADD_DEFINITIONS(-DHAVE_ALSA)
        SET(ALSA_LIBS ${ALSA_LIBRARIES})
        #MESSAGE("ALSA_LIBS: ${ALSA_LIBS}")
        LIST(APPEND ALSA_LIB_DIR ${ALSA_LIBRARY_DIRS} ${ALSA_LIBDIR} )
        #MESSAGE("ALSA_LIB_DIR: ${ALSA_LIB_DIR}")
        LIST(APPEND ALSA_INC_DIR ${ALSA_INCLUDE_DIRS} ${ALSA_INCLUDEDIR})
        #MESSAGE("ALSA_INC_DIR: ${ALSA_INC_DIR}")
    ELSE(ALSA_FOUND)
        MESSAGE(FATAL_ERROR "Please install the required package. Aborting")
    ENDIF(ALSA_FOUND)

    IF(WANT_JACK)
        PKG_CHECK_MODULES(JACK jack>=0.77)
        IF(JACK_FOUND)
            ADD_DEFINITIONS(-DHAVE_LIBJACK)
            SET(HAVE_JACK TRUE)
            SET(JACK_LIBS ${JACK_LIBRARIES})
            #MESSAGE("JACK_LIBS: ${JACK_LIBS}")
            LIST(APPEND JACK_LIB_DIR ${JACK_LIBDIR} ${JACK_LIBRARY_DIRS})
            #MESSAGE("JACK_LIB_DIR: ${JACK_LIB_DIR}")
            LIST(APPEND JACK_INC_DIR ${JACK_INCLUDEDIR} ${JACK_INCLUDE_DIRS})
            #MESSAGE("JACK_INC_DIR: ${JACK_INC_DIR}")
        ENDIF(JACK_FOUND)
    ENDIF(WANT_JACK)

    IF(WANT_DSSI)
        PKG_CHECK_MODULES(DSSI dssi>=0.4)
        IF(DSSI_FOUND)
            ADD_DEFINITIONS(-DHAVE_DSSI)
            SET(HAVE_DSSI TRUE)
            LIST(APPEND DSSI_INC_DIR ${DSSI_INCLUDE_DIRS} ${DSSI_INCLUDEDIR})
            #MESSAGE("DSSI_INC_DIR: ${DSSI_INC_DIR}")
        ENDIF(DSSI_FOUND)
    ENDIF(WANT_DSSI)

    PKG_CHECK_MODULES(LIBLO liblo>=0.7)
    IF(LIBLO_FOUND)
        ADD_DEFINITIONS(-DHAVE_LIBLO)
        SET(HAVE_LIBLO TRUE)
        SET(LIBLO_LIBS ${LIBLO_LIBRARIES})
        #MESSAGE("LIBLO_LIBS: ${LIBLO_LIBS}")
        LIST(APPEND LIBLO_LIB_DIR ${LIBLO_LIBDIR} ${LIBLO_LIBRARY_DIRS})
        #MESSAGE("LIBLO_LIB_DIR: ${LIBLO_LIB_DIR}")
        LIST(APPEND LIBLO_INC_DIR ${LIBLO_INCLUDEDIR} ${LIBLO_INCLUDE_DIRS})
        #MESSAGE("LIBLO_INC_DIR: ${LIBLO_INC_DIR}")
    ENDIF(LIBLO_FOUND)

    PKG_CHECK_MODULES(LRDF lrdf>=0.3)
    IF(LRDF_FOUND)
        SET(HAVE_LIBLRDF TRUE)
        ADD_DEFINITIONS(-DHAVE_LIBLRDF)
        SET(LRDF_LIBS ${LRDF_LIBRARIES})
        #MESSAGE("LRDF_LIBS: ${LRDF_LIBS}")
        LIST(APPEND LRDF_LIB_DIR ${LRDF_LIBDIR} ${LRDF_LIBRARY_DIRS})
        #MESSAGE("LRDF_LIB_DIR: ${LRDF_LIB_DIR}")
        LIST(APPEND LRDF_INC_DIR ${LRDF_INCLUDEDIR} ${LRDF_INCLUDE_DIRS})
        #MESSAGE("LRDF_INC_DIR: ${LRDF_INC_DIR}")
    ENDIF(LRDF_FOUND)

    ##################################################################
    # - Try to find LADSPA header
    # Once done this will define:
    #
    #  LADSPA_FOUND - system has LADSPA
    #  LADSPA_INCLUDE_DIR - LADSPA header path
    IF(LADSPA_INCLUDE_DIR)
       SET(LADSPA_FIND_QUIETLY TRUE)
    ENDIF(LADSPA_INCLUDE_DIR)
    FIND_PATH(LADSPA_INCLUDE_DIR "ladspa.h"
       /usr/include
       /usr/local/include
    )
    IF(LADSPA_INCLUDE_DIR)
       SET(LADSPA_FOUND TRUE)
    ELSE(LADSPA_INCLUDE_DIR)
       SET(LADSPA_FOUND FALSE)
       SET(LADSPA_INCLUDE_DIR "")
    ENDIF(LADSPA_INCLUDE_DIR)
    IF(LADSPA_FOUND)
        IF(NOT LADSPA_FIND_QUIETLY)
            MESSAGE(STATUS "Found LADSPA: ${LADSPA_INCLUDE_DIR}")
        ENDIF(NOT LADSPA_FIND_QUIETLY)
    ELSE(LADSPA_FOUND)
        IF(LADSPA_FIND_REQUIRED)
            MESSAGE(FATAL_ERROR "Could not find LADSPA")
        ENDIF(LADSPA_FIND_REQUIRED)
    ENDIF(LADSPA_FOUND)
    MARK_AS_ADVANCED(LADSPA_INCLUDE_DIR)
    ##################################################################

    IF(LADSPA_FOUND)
        SET(HAVE_LADSPA TRUE)
        ADD_DEFINITIONS(-DHAVE_LADSPA)
        SET(LADSPA_INC_DIR ${LADSPA_INCLUDE_DIR})
    ENDIF(LADSPA_FOUND)

ENDIF(WANT_SOUND)

PKG_CHECK_MODULES(FFTW3F REQUIRED fftw3f>=3.0.0)
IF(FFTW3F_FOUND)
    ADD_DEFINITIONS(-DHAVE_FFTW3F)
    SET(HAVE_FFTW3F TRUE)
    SET(FFTW3F_LIBS ${FFTW3F_LIBRARIES})
    #MESSAGE("FFTW3F_LIBS: ${FFTW3F_LIBS}")
    LIST(APPEND FFTW3F_LIB_DIR ${FFTW3F_LIBDIR} ${FFTW3F_LIBRARY_DIRS})
    #MESSAGE("FFTW3F_LIB_DIR: ${FFTW3F_LIB_DIR}")
    LIST(APPEND FFTW3F_INC_DIR ${FFTW3F_INCLUDEDIR} ${FFTW3F_INCLUDE_DIRS})
    #MESSAGE("FFTW3F_INC_DIR: ${FFTW3F_INC_DIR}")
ELSE(FFTW3F_FOUND)
    MESSAGE(FATAL_ERROR "Please install the required package. Aborting")
ENDIF(FFTW3F_FOUND)

IF(WANT_LIRC)
    FIND_PACKAGE(LIRC QUIET)
    IF(LIRC_FOUND)
        SET(HAVE_LIRC TRUE)
        ADD_DEFINITIONS(-DHAVE_LIRC)
        MESSAGE(STATUS "Found LIRC (${LIRC_LIBRARY})")
        SET(LIRC_LIBS ${LIRC_LIBRARY})
        SET(LIRC_INC_DIR ${LIRC_INCLUDE_DIR})
        SET(LIRC_LIB_DIR ${LIRC_LIBRARY_DIR})
        #MESSAGE("LIRC_LIBS: ${LIRC_LIBS}")
        #MESSAGE("LIRC_LIB_DIR: ${LIRC_LIB_DIR}")
        #MESSAGE("LIRC_INC_DIR: ${LIRC_INC_DIR}")
    ENDIF(LIRC_FOUND)
ENDIF(WANT_LIRC)

# Check GCC for PCH support
SET(USE_PCH FALSE)
IF(WANT_PCH)
    FIND_PACKAGE(PCHSupport)
    IF(PCHSupport_FOUND)
        SET(USE_PCH TRUE)
        ADD_DEFINITIONS(-DUSE_PCH)
        MESSAGE(STATUS "Enabling precompiled headers for GCC ${gcc_compiler_version}")
    ENDIF(PCHSupport_FOUND)
ENDIF(WANT_PCH)

# Check PTHREAD_MUTEX_RECURSIVE
INCLUDE(CheckCSourceCompiles)
CHECK_C_SOURCE_COMPILES(
    "#include <pthread.h>
     int main(int argc, char **argv) {
         pthread_mutexattr_t attr;
         pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
         return 0;
     }" PTHREAD_HAS_MUTEX_RECURSIVE)
IF(PTHREAD_HAS_MUTEX_RECURSIVE)
    ADD_DEFINITIONS(-DHAVE_PTHREAD_MUTEX_RECURSIVE)
ENDIF(PTHREAD_HAS_MUTEX_RECURSIVE)
# End of PTHREAD_MUTEX_RECURSIVE Test

SET(CMAKE_CXX_FLAGS_RELEASE         "-O2 -w -fexceptions -DNDEBUG -include tqt.h")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO  "-O2 -g -Wall -fexceptions -DDEBUG -include tqt.h")
SET(CMAKE_CXX_FLAGS_DEBUG           "-O0 -g3 -Wall -fexceptions -DDEBUG -include tqt.h")

MESSAGE(STATUS "Rosegarden ${VERSION} will be built for install into ${CMAKE_INSTALL_PREFIX}")

IF(WANT_DEBUG)
    IF(WANT_FULLDBG)
        MESSAGE(STATUS "Configured to compile including full debug information in the executables")
        SET(CMAKE_BUILD_TYPE Debug CACHE STRING
            "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
    ELSE(WANT_FULLDBG)
        MESSAGE(STATUS "Configured to compile including debug information in the executables")
        SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
            "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
    ENDIF(WANT_FULLDBG)
ELSE(WANT_DEBUG)
    MESSAGE(STATUS "Configured to compile for release without debug information")
    SET(CMAKE_BUILD_TYPE Release CACHE STRING
        "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
ENDIF(WANT_DEBUG)
MARK_AS_ADVANCED(CMAKE_BUILD_TYPE)

check_type_size( "int" SIZEOF_INT BUILTIN_TYPES_ONLY )
check_type_size( "long" SIZEOF_LONG BUILTIN_TYPES_ONLY )

check_include_file( stdint.h HAVE_STDINT_H )
check_include_file( systems.h HAVE_SYSTEMS_H )
check_include_file( linux/inotify.h HAVE_INOTIFY )

check_function_exists( statvfs HAVE_STATVFS )

# common required stuff
find_package( TQt )
find_package( TDE )
