# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindKDE3
--------

Find the KDE3 include and library dirs, KDE preprocessors and define a some macros



This module defines the following variables:

``KDE3_DEFINITIONS``
  compiler definitions required for compiling KDE software
``KDE3_INCLUDE_DIR``
  the KDE include directory
``KDE3_INCLUDE_DIRS``
  the KDE and the Qt include directory, for use with include_directories()
``KDE3_LIB_DIR``
  the directory where the KDE libraries are installed, for use with link_directories()
``QT_AND_KDECORE_LIBS``
  this contains both the Qt and the kdecore library
``KDE3_DCOPIDL_EXECUTABLE``
  the dcopidl executable
``KDE3_DCOPIDL2CPP_EXECUTABLE``
  the dcopidl2cpp executable
``KDE3_KCFGC_EXECUTABLE``
  the kconfig_compiler executable
``KDE3_FOUND``
  set to TRUE if all of the above has been found

The following user adjustable options are provided:

``KDE3_BUILD_TESTS``
  enable this to build KDE testcases

It also adds the following macros (from ``KDE3Macros.cmake``) ``SRCS_VAR`` is
always the variable which contains the list of source files for your
application or library.

KDE3_AUTOMOC(file1 ...  fileN)

::

    Call this if you want to have automatic moc file handling.
    This means if you include "foo.moc" in the source file foo.cpp
    a moc file for the header foo.h will be created automatically.
    You can set the property SKIP_AUTOMAKE using set_source_files_properties()
    to exclude some files in the list from being processed.



KDE3_ADD_MOC_FILES(SRCS_VAR file1 ...  fileN )

::

    If you don't use the KDE3_AUTOMOC() macro, for the files
    listed here moc files will be created (named "foo.moc.cpp")



KDE3_ADD_DCOP_SKELS(SRCS_VAR header1.h ...  headerN.h )

::

    Use this to generate DCOP skeletions from the listed headers.



KDE3_ADD_DCOP_STUBS(SRCS_VAR header1.h ...  headerN.h )

::

     Use this to generate DCOP stubs from the listed headers.



KDE3_ADD_UI_FILES(SRCS_VAR file1.ui ...  fileN.ui )

::

    Use this to add the Qt designer ui files to your application/library.



KDE3_ADD_KCFG_FILES(SRCS_VAR file1.kcfgc ...  fileN.kcfgc )

::

    Use this to add KDE kconfig compiler files to your application/library.



KDE3_INSTALL_LIBTOOL_FILE(target)

::

    This will create and install a simple libtool file for the given target.



KDE3_ADD_EXECUTABLE(name file1 ...  fileN )

::

    Currently identical to add_executable(), may provide some advanced
    features in the future.



KDE3_ADD_KPART(name [WITH_PREFIX] file1 ...  fileN )

::

    Create a KDE plugin (KPart, kioslave, etc.) from the given source files.
    If WITH_PREFIX is given, the resulting plugin will have the prefix "lib",
    otherwise it won't.
    It creates and installs an appropriate libtool la-file.



KDE3_ADD_KDEINIT_EXECUTABLE(name file1 ...  fileN )

::

    Create a KDE application in the form of a module loadable via kdeinit.
    A library named kdeinit_<name> will be created and a small executable
    which links to it.



The option KDE3_ENABLE_FINAL to enable all-in-one compilation is no
longer supported.



Author: Alexander Neundorf <neundorf@kde.org>
#]=======================================================================]

if(NOT UNIX AND KDE3_FIND_REQUIRED)
   message(FATAL_ERROR "Compiling KDE3 applications and libraries under Windows is not supported")
endif()

# If Qt4 has already been found, fail.
if(QT4_FOUND)
  if(KDE3_FIND_REQUIRED)
    message( FATAL_ERROR "KDE3/Qt3 and Qt4 cannot be used together in one project.")
  else()
    if(NOT KDE3_FIND_QUIETLY)
      message( STATUS    "KDE3/Qt3 and Qt4 cannot be used together in one project.")
    endif()
    return()
  endif()
endif()


set(QT_MT_REQUIRED TRUE)
#set(QT_MIN_VERSION "3.0.0")

#this line includes FindQt.cmake, which searches the Qt library and headers
if(KDE3_FIND_REQUIRED)
  set(_REQ_STRING_KDE3 "REQUIRED")
endif()

find_package(Qt3 ${_REQ_STRING_KDE3})
find_package(X11 ${_REQ_STRING_KDE3})


#now try to find some kde stuff
find_program(KDECONFIG_EXECUTABLE NAMES kde-config
  HINTS
   $ENV{KDEDIR}/bin
   PATHS
  /opt/kde3/bin
  /opt/kde/bin
  )

set(KDE3PREFIX)
if(KDECONFIG_EXECUTABLE)
   execute_process(COMMAND ${KDECONFIG_EXECUTABLE} --version
                   OUTPUT_VARIABLE kde_config_version )

   string(REGEX MATCH "KDE: .\\." kde_version "${kde_config_version}")
   if ("${kde_version}" MATCHES "KDE: 3\\.")
      execute_process(COMMAND ${KDECONFIG_EXECUTABLE} --prefix
                        OUTPUT_VARIABLE kdedir )
      string(REPLACE "\n" "" KDE3PREFIX "${kdedir}")

    endif ()
endif()



# at first the KDE include directory
# kpassdlg.h comes from kdeui and doesn't exist in KDE4 anymore
find_path(KDE3_INCLUDE_DIR kpassdlg.h
  HINTS
  $ENV{KDEDIR}/include
  ${KDE3PREFIX}/include
  PATHS
  /opt/kde3/include
  /opt/kde/include
  PATH_SUFFIXES include/kde
  )

#now the KDE library directory
find_library(KDE3_KDECORE_LIBRARY NAMES kdecore
  HINTS
  $ENV{KDEDIR}/lib
  ${KDE3PREFIX}/lib
  PATHS
  /opt/kde3/lib
  /opt/kde/lib
)

set(QT_AND_KDECORE_LIBS ${QT_LIBRARIES} ${KDE3_KDECORE_LIBRARY})

get_filename_component(KDE3_LIB_DIR ${KDE3_KDECORE_LIBRARY} PATH )

if(NOT KDE3_LIBTOOL_DIR)
   if(KDE3_KDECORE_LIBRARY MATCHES lib64)
     set(KDE3_LIBTOOL_DIR /lib64/kde3)
   elseif(KDE3_KDECORE_LIBRARY MATCHES libx32)
     set(KDE3_LIBTOOL_DIR /libx32/kde3)
   else()
     set(KDE3_LIBTOOL_DIR /lib/kde3)
   endif()
endif()

#now search for the dcop utilities
find_program(KDE3_DCOPIDL_EXECUTABLE NAMES dcopidl
  HINTS
  $ENV{KDEDIR}/bin
  ${KDE3PREFIX}/bin
  PATHS
  /opt/kde3/bin
  /opt/kde/bin
  )

find_program(KDE3_DCOPIDL2CPP_EXECUTABLE NAMES dcopidl2cpp
  HINTS
  $ENV{KDEDIR}/bin
  ${KDE3PREFIX}/bin
  PATHS
  /opt/kde3/bin
  /opt/kde/bin
  )

find_program(KDE3_KCFGC_EXECUTABLE NAMES kconfig_compiler
  HINTS
  $ENV{KDEDIR}/bin
  ${KDE3PREFIX}/bin
  PATHS
  /opt/kde3/bin
  /opt/kde/bin
  )


#SET KDE3_FOUND
if (KDE3_INCLUDE_DIR AND KDE3_LIB_DIR AND KDE3_DCOPIDL_EXECUTABLE AND KDE3_DCOPIDL2CPP_EXECUTABLE AND KDE3_KCFGC_EXECUTABLE)
   set(KDE3_FOUND TRUE)
else ()
   set(KDE3_FOUND FALSE)
endif ()

# add some KDE specific stuff
set(KDE3_DEFINITIONS -DQT_CLEAN_NAMESPACE -D_GNU_SOURCE)

# set compiler flags only if KDE3 has actually been found
if(KDE3_FOUND)
   set(_KDE3_USE_FLAGS FALSE)
   if(CMAKE_COMPILER_IS_GNUCXX)
      set(_KDE3_USE_FLAGS TRUE) # use flags for gnu compiler
      execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
                      OUTPUT_VARIABLE out)
      # gnu gcc 2.96 does not work with flags
      # I guess 2.95 also doesn't then
      if("${out}" MATCHES "2.9[56]")
         set(_KDE3_USE_FLAGS FALSE)
      endif()
   endif()

   #only on linux, but NOT e.g. on FreeBSD:
   if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND _KDE3_USE_FLAGS)
      set (KDE3_DEFINITIONS ${KDE3_DEFINITIONS} -D_XOPEN_SOURCE=500 -D_BSD_SOURCE)
      set ( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -Wno-long-long -ansi -Wundef -Wcast-align -Wconversion -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common")
      set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -ansi -Wundef -Wcast-align -Wconversion -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -fno-exceptions -fno-check-new -fno-common")
   endif()

   # works on FreeBSD, NOT tested on NetBSD and OpenBSD
   if (CMAKE_SYSTEM_NAME MATCHES BSD AND _KDE3_USE_FLAGS)
      set ( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -Wno-long-long -ansi -Wundef -Wcast-align -Wconversion -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-common")
      set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wnon-virtual-dtor -Wno-long-long -Wundef -Wcast-align -Wconversion -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -Wformat-security -Wmissing-format-attribute -fno-exceptions -fno-check-new -fno-common")
   endif ()

   # if no special buildtype is selected, add -O2 as default optimization
   if (NOT CMAKE_BUILD_TYPE AND _KDE3_USE_FLAGS)
      set ( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -O2")
      set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
   endif ()

#set(CMAKE_SHARED_LINKER_FLAGS "-avoid-version -module -Wl,--no-undefined -Wl,--allow-shlib-undefined")
#set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fatal-warnings -avoid-version -Wl,--no-undefined -lc")
#set(CMAKE_MODULE_LINKER_FLAGS "-Wl,--fatal-warnings -avoid-version -Wl,--no-undefined -lc")
endif()


# KDE3Macros.cmake contains all the KDE specific macros
include(${CMAKE_CURRENT_LIST_DIR}/KDE3Macros.cmake)


macro (KDE3_PRINT_RESULTS)
   if(KDE3_INCLUDE_DIR)
      message(STATUS "Found KDE3 include dir: ${KDE3_INCLUDE_DIR}")
   else()
      message(STATUS "Didn't find KDE3 headers")
   endif()

   if(KDE3_LIB_DIR)
      message(STATUS "Found KDE3 library dir: ${KDE3_LIB_DIR}")
   else()
      message(STATUS "Didn't find KDE3 core library")
   endif()

   if(KDE3_DCOPIDL_EXECUTABLE)
      message(STATUS "Found KDE3 dcopidl preprocessor: ${KDE3_DCOPIDL_EXECUTABLE}")
   else()
      message(STATUS "Didn't find the KDE3 dcopidl preprocessor")
   endif()

   if(KDE3_DCOPIDL2CPP_EXECUTABLE)
      message(STATUS "Found KDE3 dcopidl2cpp preprocessor: ${KDE3_DCOPIDL2CPP_EXECUTABLE}")
   else()
      message(STATUS "Didn't find the KDE3 dcopidl2cpp preprocessor")
   endif()

   if(KDE3_KCFGC_EXECUTABLE)
      message(STATUS "Found KDE3 kconfig_compiler preprocessor: ${KDE3_KCFGC_EXECUTABLE}")
   else()
      message(STATUS "Didn't find the KDE3 kconfig_compiler preprocessor")
   endif()

endmacro ()


if (KDE3_FIND_REQUIRED AND NOT KDE3_FOUND)
   #bail out if something wasn't found
   KDE3_PRINT_RESULTS()
   message(FATAL_ERROR "Could NOT find everything required for compiling KDE 3 programs")

endif ()


if (NOT KDE3_FIND_QUIETLY)
   KDE3_PRINT_RESULTS()
endif ()

#add the found Qt and KDE include directories to the current include path
set(KDE3_INCLUDE_DIRS ${QT_INCLUDE_DIR} ${KDE3_INCLUDE_DIR})
