#################################################
#
#  (C) 2010-2011 Serghei Amelian
#  serghei (DOT) amelian (AT) gmail.com
#
#  Improvements and feedback are welcome
#
#  This file is released under GPL >= 2
#
#################################################

macro( qt_message )
  message( STATUS "${ARGN}" )
endmacro( )


if( DEFINED USE_QT3 )
  set( QT_VERSION "3" )
elseif( DEFINED USE_QT4 )
  set( QT_VERSION "4" )
endif()


if( NOT DEFINED QT_VERSION )
  tde_message_fatal( "You must select a Qt version, like this:\n \n cmake -DQT_VERSION=3 [arguments...]\n or\n cmake -DUSE_QT3=ON [arguments...]" )
endif( )


if( NOT (QT_VERSION STREQUAL "3" OR QT_VERSION STREQUAL "4") )
  tde_message_fatal( "You have chosen an invalid version.\n QT_VERSION should be 3 or 4." )
else( )
  qt_message( "Checking for Qt${QT_VERSION}..." )
endif( )


# qt prefix directory
if( NOT DEFINED QT_PREFIX_DIR )
  if( NOT $ENV{QTDIR} STREQUAL "" AND QT_VERSION STREQUAL "3" )
    set( QT_PREFIX_DIR "$ENV{QTDIR}" )
    qt_message( "  QT_PREFIX_DIR is set to QTDIR" )
  else( )
    set( QT_PREFIX_DIR "/usr" )
  endif( )
endif( )
qt_message( "  QT_PREFIX_DIR : ${QT_PREFIX_DIR}" )


# qt headers
if( NOT DEFINED QT_INCLUDE_DIR )
  if( QT_PREFIX_DIR STREQUAL "/usr" )
    if( EXISTS "${QT_PREFIX_DIR}/include/tqt${QT_VERSION}" )
      set( QT_INCLUDE_DIR "${QT_PREFIX_DIR}/include/tqt${QT_VERSION}" )
    else( )
      set( QT_INCLUDE_DIR "${QT_PREFIX_DIR}/include/qt${QT_VERSION}" )
    endif( )
  else( )
    set( QT_INCLUDE_DIR "${QT_PREFIX_DIR}/include" )
  endif( )
endif( )
qt_message( "  QT_INCLUDE_DIR: ${QT_INCLUDE_DIR}" )

# detect native tqt
if( EXISTS "${QT_INCLUDE_DIR}/ntqglobal.h" )
  set( HAVE_REAL_TQT ON CACHE BOOL "Native TQt3 detected" )
  qt_message( "Native TQt3 detected" )
else( )
  qt_message( "Qt3 detected" )
endif( )

# qt library path
if( NOT DEFINED QT_LIBRARY_DIR )
  set( QT_LIBRARY_DIR "${QT_PREFIX_DIR}/lib${LIB_SUFFIX}" )
  if( QT_VERSION STREQUAL "4" )
    if( NOT EXISTS "${QT_LIBRARY_DIR}/libQtGui.so" )
      if( EXISTS "${QT_LIBRARY_DIR}/qt4/libQtGui.so" )
        set( QT_LIBRARY_DIR "${QT_PREFIX_DIR}/lib${LIB_SUFFIX}/qt4" )
      endif( )
    endif( )
  endif( )
endif( )
qt_message( "  QT_LIBRARY_DIR: ${QT_LIBRARY_DIR}" )


# qt library name
if( NOT DEFINED QT_LIBRARIES )
  if( QT_VERSION STREQUAL "3" )
    set( QT_LIBRARIES qt-mt )
  elseif( QT_VERSION STREQUAL "4" )
    set( QT_LIBRARIES QtCore QtGui )
  endif( )
endif( )


# qt tools
if( NOT DEFINED QT_BINARY_DIR )
  set( QT_BINARY_DIR "${QT_PREFIX_DIR}/bin" )
endif( )
qt_message( "  QT_BINARY_DIR : ${QT_BINARY_DIR}" )


# find moc
if( DEFINED MOC_EXECUTABLE )
  if( IS_DIRECTORY "${MOC_EXECUTABLE}" OR NOT EXISTS "${MOC_EXECUTABLE}" )
    tde_message_fatal( "moc was NOT found.\n MOC_EXECUTABLE may not be set correctly." )
  endif( )
else( )
  if( QT_VERSION STREQUAL "3" )
    find_program( MOC_EXECUTABLE NAMES tqmoc moc-qt3 moc HINTS "${QT_BINARY_DIR}" )
  elseif( QT_VERSION STREQUAL "4" )
    find_program( MOC_EXECUTABLE NAMES moc-qt4 moc HINTS "${QT_BINARY_DIR}" )
  endif( )
  if( NOT MOC_EXECUTABLE )
    tde_message_fatal( "moc was NOT found.\n Please check if your Qt${QT_VERSION} is correctly installed." )
  endif( )
endif( )

# attempt to run moc, to check which qt version is using
execute_process( COMMAND ${MOC_EXECUTABLE} -v ERROR_VARIABLE __output
  RESULT_VARIABLE __result ERROR_STRIP_TRAILING_WHITESPACE )

if( __result EQUAL 1 )
  string( REGEX MATCH "^.*Qt (.+)\\)$" __dummy  "${__output}" )
  set( __version  "${CMAKE_MATCH_1}" )
  if( NOT __version )
    tde_message_fatal( "Invalid response from moc:\n ${__output}" )
  endif( )
else( )
  tde_message_fatal( "Unable to run moc!\n Qt${VERSION} are correctly installed?\n LD_LIBRARY_PATH are correctly set?" )
endif( )

qt_message( "  MOC_EXECUTABLE: ${MOC_EXECUTABLE} (using Qt ${CMAKE_MATCH_1})" )

if( QT_VERSION STREQUAL "3" AND NOT "${CMAKE_MATCH_1}" VERSION_LESS "4" )
  tde_message_fatal( "Strange, you want Qt3, but your moc using Qt4." )
elseif( QT_VERSION STREQUAL "4" AND "${CMAKE_MATCH_1}" VERSION_LESS "4" )
  tde_message_fatal( "Strange, you want Qt4, but your moc using Qt3." )
endif( )


# find uic (only for Qt3)
if( QT_VERSION STREQUAL "3" )
  if( DEFINED UIC_EXECUTABLE )
    if( IS_DIRECTORY "${UIC_EXECUTABLE}" OR NOT EXISTS "${UIC_EXECUTABLE}" )
      tde_message_fatal( "uic was NOT found.\n MOC_EXECUTABLE may not be set correctly" )
    endif( )
  else( )
    find_program( UIC_EXECUTABLE NAMES tquic uic-qt3 uic HINTS "${QT_BINARY_DIR}" )
    if( NOT UIC_EXECUTABLE )
      tde_message_fatal( "uic was NOT found.\n Please check if your Qt${QT_VERSION} is correctly installed." )
    endif( )
  endif( )
  qt_message( "  UIC_EXECUTABLE: ${UIC_EXECUTABLE}" )
endif( )


# definitions
if( QT_VERSION STREQUAL "3" )
  set( QT_DEFINITIONS "-DQT_NO_ASCII_CAST -DQT_CLEAN_NAMESPACE -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION -DQT_THREAD_SUPPORT -D_REENTRANT" )
elseif( QT_VERSION STREQUAL "4" )
  set( QT_DEFINITIONS "-DQT_NO_ASCII_CAST -DQT_CLEAN_NAMESPACE -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION -DQT_THREAD_SUPPORT -D_REENTRANT" )
endif( )


tde_save( CMAKE_REQUIRED_INCLUDES CMAKE_REQUIRED_LIBRARIES )
set( CMAKE_REQUIRED_INCLUDES ${QT_INCLUDE_DIR} )
set( CMAKE_REQUIRED_LIBRARIES -L${QT_LIBRARY_DIR} ${QT_LIBRARIES} )

# check if Qt3 is usable
if( QT_VERSION STREQUAL "3" )
  check_cxx_source_compiles("
    #include <qapplication.h>
    int main(int argc, char **argv) { QApplication app(argc, argv); return 0; } "
    HAVE_USABLE_QT${QT_VERSION} )
    if( NOT HAVE_USABLE_QT${QT_VERSION} )
      # Unset the Qt detection variable
      unset( HAVE_USABLE_QT${QT_VERSION} CACHE )
      # Reset libraries
      set( QT_LIBRARIES tqt-mt )
      set( CMAKE_REQUIRED_LIBRARIES -L${QT_LIBRARY_DIR} ${QT_LIBRARIES} )
      qt_message( "Looking for native TQt3..." )
      check_cxx_source_compiles("
        #include <ntqapplication.h>
        int main(int argc, char **argv) { TQApplication app(argc, argv); return 0; } "
        HAVE_USABLE_QT${QT_VERSION} )
    endif( )
# check if Qt4 is usable
elseif( QT_VERSION STREQUAL "4" )
  check_cxx_source_compiles("
    #include <QtGui/QApplication>
    int main(int argc, char **argv) { QApplication app(argc, argv); return 0; } "
    HAVE_USABLE_QT${QT_VERSION} )
endif( )
if( NOT HAVE_USABLE_QT${QT_VERSION} )
  tde_message_fatal( "Unable to build a simple Qt${QT_VERSION} test." )
endif( )

# check if Qt3 is patched for compatibility with TQt
if( QT_VERSION STREQUAL "3" )
  check_cxx_source_compiles("
    #include <qobjectlist.h>
    #include <qobject.h>
    int main(int, char**) { QObject::objectTreesListObject(); return 0; } "
    HAVE_PATCHED_QT3 )
    if( NOT HAVE_PATCHED_QT3 )
      # Unset the Qt detection variable
      unset( HAVE_PATCHED_QT3 CACHE )
      # Reset libraries
      set( QT_LIBRARIES tqt-mt )
      set( CMAKE_REQUIRED_LIBRARIES -L${QT_LIBRARY_DIR} ${QT_LIBRARIES} )
      qt_message( "Looking for patched native TQt3..." )
      check_cxx_source_compiles("
        #include <ntqobjectlist.h>
        #include <ntqobject.h>
        int main(int, char**) { TQObject::objectTreesListObject(); return 0; } "
        HAVE_PATCHED_QT3 )
    endif( )
  if( NOT HAVE_PATCHED_QT3 )
    tde_message_fatal( "Your Qt3 is not patched for compatibility with tqtinterface." )
  endif( )
endif( )

tde_restore( CMAKE_REQUIRED_INCLUDES CMAKE_REQUIRED_LIBRARIES )