# - Find wxWindows installation
# This module finds if wxWindows is installed and determines where the
# include files and libraries are. It also determines what the name of
# the library is. This code sets the following variables:
#  
#  WXWINDOWS_FOUND     = system has WxWindows 
#  WXWINDOWS_LIBRARIES = path to the wxWindows libraries
#                        on Unix/Linux with additional 
#                        linker flags from 
#                        "wx-config --libs"
#  CMAKE_WXWINDOWS_CXX_FLAGS = Compiler flags for 
#                              wxWindows, essentially 
#                              "`wx-config --cxxflags`"
#  WXWINDOWS_INCLUDE_DIR   = where to find "wx/wx.h" etc
#  WXWINDOWS_LINK_DIRECTORIES = link directories
#  WXWINDOWS_DEFINITIONS      = extra defines
#  deprecated: 
#   * CMAKE_WX_CAN_COMPILE
#   * WXWINDOWS_LIBRARY
#   * CMAKE_WX_CXX_FLAGS
#   * WXWINDOWS_INCLUDE_PATH
#  
#  For convenience include Use_wxWindows.cmake in your project's
#  CMakeLists.txt using INCLUDE(Use_wxWindows). If you need OpenGL support
#  please SET(WXWINDOWS_USE_GL 1) in your CMakeLists.txt *before* you include
#  this file.  


# ------------------------------------------------------------------
# Author Jan Woetzel <http://www.mip.informatik.uni-kiel.de/~jw> (07/2003)
# ------------------------------------------------------------------
# 
# -changed variable names to conventions from cmakes readme.txt (Jan Woetzel
#  07/07/2003)
# -added definition WINVER for WIN32 (Jan Woetzel 07/07//2003)
# -added IF(CMAKE_WXWINDOWS_CONFIG_EXECUTABLE) found and changed
#  CMAKE_WX_CONFIG to CMAKE_WXWINDOWS_CONFIG_EXECUTABLE (Jan Woetzel
#  07/22/2003)
# -removed OPTION for CMAKE_WXWINDOWS_USE_GL. Force the developer to SET it.
# 
# status: 
# tested with:
#   -cmake 1.6.7, Linux (Suse 7.3), wxWindows 2.4.0, gcc 2.95
#   -cmake 1.6.7, Linux (Suse 8.2), wxWindows 2.4.0, gcc 3.3
#   -cmake 1.6.7, Linux (Suse 8.2), wxWindows 2.4.1-patch1,  gcc 3.3
#   -cmake 1.6.7, MS Windows XP home, wxWindows 2.4.1, MS Visual Studio .net 7
#    2002 (static build)
# 
# TODO: 
#  -OPTION for unicode builds 
#  -change WXWINDOWS_USE_GL to use FindOpenGL.cmake or let the user do it
#  -testing of DLL linking under MS WIN32
# 

IF(WIN32)
  SET(WIN32_STYLE_FIND 1)
ENDIF(WIN32)
IF(MINGW)
  SET(WIN32_STYLE_FIND 0)
  SET(UNIX_STYLE_FIND 1)
ENDIF(MINGW)
IF(UNIX)
  SET(UNIX_STYLE_FIND 1)
ENDIF(UNIX)


IF(WIN32_STYLE_FIND)
  
  # ###################################
  #
  # Windows specific:
  #
  # candidates for root/base directory of wxwindows
  # should have subdirs include and lib containing include/wx/wx.h
  # fix the root dir to avoid mixing of headers/libs from different
  # versions/builds:
  
  SET (WXWINDOWS_POSSIBLE_ROOT_PATHS
    $ENV{WXWIN}
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\wxWindows_is1;Inno Setup: App Path]" )
  
  FIND_PATH(WXWINDOWS_ROOT_DIR  include/wx/wx.h 
    ${WXWINDOWS_POSSIBLE_ROOT_PATHS} )
  
  # MESSAGE("DBG found WXWINDOWS_ROOT_DIR: ${WXWINDOWS_ROOT_DIR}")
  
  # find libs for combination of static/shared with release/debug
  SET (WXWINDOWS_POSSIBLE_LIB_PATHS
    "${WXWINDOWS_ROOT_DIR}/lib" )
  
  FIND_LIBRARY(WXWINDOWS_STATIC_LIBRARY
    NAMES wx wxmsw
    PATHS ${WXWINDOWS_POSSIBLE_LIB_PATHS}
    DOC "wxWindows static release build library" )
  
  FIND_LIBRARY(WXWINDOWS_STATIC_DEBUG_LIBRARY
    NAMES wxd wxmswd
    PATHS ${WXWINDOWS_POSSIBLE_LIB_PATHS} 
    DOC "wxWindows static debug build library" )
  
  FIND_LIBRARY(WXWINDOWS_SHARED_LIBRARY
    NAMES wxmsw24 wxmsw241 wxmsw240 wx23_2 wx22_9 
    PATHS ${WXWINDOWS_POSSIBLE_LIB_PATHS} 
    DOC "wxWindows shared release build library" )
  
  FIND_LIBRARY(WXWINDOWS_SHARED_DEBUG_LIBRARY
    NAMES wxmsw24d wxmsw241d wxmsw240d wx23_2d wx22_9d 
    PATHS ${WXWINDOWS_POSSIBLE_LIB_PATHS} 
    DOC "wxWindows shared debug build library " )
  
  
  # if there is at least one shared lib available
  # let user choose wether to use shared or static wxwindows libs 
  IF(WXWINDOWS_SHARED_LIBRARY OR WXWINDOWS_SHARED_DEBUG_LIBRARY)
    # default value OFF because wxWindows MSVS default build is static
    OPTION(WXWINDOWS_USE_SHARED_LIBS
      "Use shared versions (dll) of wxWindows libraries?" OFF)
    MARK_AS_ADVANCED(WXWINDOWS_USE_SHARED_LIBS)
  ENDIF(WXWINDOWS_SHARED_LIBRARY OR WXWINDOWS_SHARED_DEBUG_LIBRARY)
  
  
  # add system libraries wxwindows depends on
  SET(CMAKE_WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
    comctl32
    rpcrt4
    wsock32
    #  presumably ctl3d32 is not neccesary (Jan Woetzel 07/2003)
    #   ctl3d32
    #    debug ${WXWINDOWS_ROOT_DIR}/lib/zlibd.lib  optimized ${WXWINDOWS_ROOT_DIR}/lib/zlibd.lib
    #    debug ${WXWINDOWS_ROOT_DIR}/lib/regexd.lib optimized ${WXWINDOWS_ROOT_DIR}/lib/regexd.lib 
    #    debug ${WXWINDOWS_ROOT_DIR}/lib/pngd.lib   optimized ${WXWINDOWS_ROOT_DIR}/lib/pngd.lib
    #    debug ${WXWINDOWS_ROOT_DIR}/lib/jpegd.lib  optimized ${WXWINDOWS_ROOT_DIR}/lib/jpegd.lib
    #    debug ${WXWINDOWS_ROOT_DIR}/lib/tiffd.lib  optimized ${WXWINDOWS_ROOT_DIR}/lib/tiff.lib
    )
  
  # JW removed option and force the develper th SET it. 
  # OPTION(WXWINDOWS_USE_GL "use wxWindows with GL support (use additional
  # opengl, glu libs)?" OFF)
  
  # opengl/glu: (TODO/FIXME: better use FindOpenGL.cmake here 
  IF (WXWINDOWS_USE_GL)
    SET(CMAKE_WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
      opengl32
      glu32
      )
  ENDIF (WXWINDOWS_USE_GL)
  
  
  #
  # select between use of  shared or static wxWindows lib then set libs to use
  # for debug and optimized build.  so the user can switch between debug and
  # release build e.g. within MS Visual Studio without running cmake with a
  # different build directory again.
  # 
  # then add the build specific include dir for wx/setup.h
  # 
  
  IF(WXWINDOWS_USE_SHARED_LIBS)
    #MESSAGE("DBG wxWindows use shared lib selected.")
    
    # shared: both wx (debug and release) found?
    IF(WXWINDOWS_SHARED_DEBUG_LIBRARY AND WXWINDOWS_SHARED_LIBRARY)
      #MESSAGE("DBG wx shared: debug and optimized found.")
      SET(WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
        debug     ${WXWINDOWS_SHARED_DEBUG_LIBRARY}
        optimized ${WXWINDOWS_SHARED_LIBRARY} )
      FIND_PATH(WXWINDOWS_INCLUDE_DIR_SETUPH  wx/setup.h
        ${WXWINDOWS_ROOT_DIR}/lib/mswdlld
        ${WXWINDOWS_ROOT_DIR}/lib/mswdll )
    ENDIF(WXWINDOWS_SHARED_DEBUG_LIBRARY AND WXWINDOWS_SHARED_LIBRARY)
    
    # shared: only debug wx lib found?
    IF(WXWINDOWS_SHARED_DEBUG_LIBRARY)
      IF(NOT WXWINDOWS_SHARED_LIBRARY)
        #MESSAGE("DBG wx shared: debug (but no optimized) found.")
        SET(WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
          ${WXWINDOWS_SHARED_DEBUG_LIBRARY} )
        FIND_PATH(WXWINDOWS_INCLUDE_DIR_SETUPH  wx/setup.h
          ${WXWINDOWS_ROOT_DIR}/lib/mswdlld )
      ENDIF(NOT WXWINDOWS_SHARED_LIBRARY)
    ENDIF(WXWINDOWS_SHARED_DEBUG_LIBRARY)
    
    # shared: only release wx lib found?
    IF(NOT WXWINDOWS_SHARED_DEBUG_LIBRARY)
      IF(WXWINDOWS_SHARED_LIBRARY)
        #MESSAGE("DBG wx shared: optimized (but no debug) found.")
        SET(WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
          ${WXWINDOWS_SHARED_DEBUG_LIBRARY} )
        FIND_PATH(WXWINDOWS_INCLUDE_DIR_SETUPH  wx/setup.h
          ${WXWINDOWS_ROOT_DIR}/lib/mswdll )
      ENDIF(WXWINDOWS_SHARED_LIBRARY)    
    ENDIF(NOT WXWINDOWS_SHARED_DEBUG_LIBRARY)
    
    # shared: none found?
    IF(NOT WXWINDOWS_SHARED_DEBUG_LIBRARY)
      IF(NOT WXWINDOWS_SHARED_LIBRARY)
        MESSAGE(SEND_ERROR 
          "No shared wxWindows lib found, but WXWINDOWS_USE_SHARED_LIBS=${WXWINDOWS_USE_SHARED_LIBS}.")
      ENDIF(NOT WXWINDOWS_SHARED_LIBRARY)
    ENDIF(NOT WXWINDOWS_SHARED_DEBUG_LIBRARY)


  ELSE(WXWINDOWS_USE_SHARED_LIBS)
    #MESSAGE("DBG wxWindows static lib selected.")

    # static: both wx (debug and release) found?
    IF(WXWINDOWS_STATIC_DEBUG_LIBRARY AND WXWINDOWS_STATIC_LIBRARY)
      #MESSAGE("DBG wx static: debug and optimized found.")
      SET(WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
        debug     ${WXWINDOWS_STATIC_DEBUG_LIBRARY}
        optimized ${WXWINDOWS_STATIC_LIBRARY} )
      FIND_PATH(WXWINDOWS_INCLUDE_DIR_SETUPH  wx/setup.h
        ${WXWINDOWS_ROOT_DIR}/lib/mswd
        ${WXWINDOWS_ROOT_DIR}/lib/msw )
    ENDIF(WXWINDOWS_STATIC_DEBUG_LIBRARY AND WXWINDOWS_STATIC_LIBRARY)
    
    # static: only debug wx lib found?
    IF(WXWINDOWS_STATIC_DEBUG_LIBRARY)
      IF(NOT WXWINDOWS_STATIC_LIBRARY)
        #MESSAGE("DBG wx static: debug (but no optimized) found.")
        SET(WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
          ${WXWINDOWS_STATIC_DEBUG_LIBRARY} )
        FIND_PATH(WXWINDOWS_INCLUDE_DIR_SETUPH  wx/setup.h
          ${WXWINDOWS_ROOT_DIR}/lib/mswd )
      ENDIF(NOT WXWINDOWS_STATIC_LIBRARY)
    ENDIF(WXWINDOWS_STATIC_DEBUG_LIBRARY)
    
    # static: only release wx lib found?
    IF(NOT WXWINDOWS_STATIC_DEBUG_LIBRARY)
      IF(WXWINDOWS_STATIC_LIBRARY)
        #MESSAGE("DBG wx static: optimized (but no debug) found.")
        SET(WXWINDOWS_LIBRARIES ${CMAKE_WXWINDOWS_LIBRARIES}
          ${WXWINDOWS_STATIC_DEBUG_LIBRARY} )
        FIND_PATH(WXWINDOWS_INCLUDE_DIR_SETUPH  wx/setup.h
          ${WXWINDOWS_ROOT_DIR}/lib/msw )
      ENDIF(WXWINDOWS_STATIC_LIBRARY)
    ENDIF(NOT WXWINDOWS_STATIC_DEBUG_LIBRARY)
    
    # static: none found?
    IF(NOT WXWINDOWS_STATIC_DEBUG_LIBRARY)
      IF(NOT WXWINDOWS_STATIC_LIBRARY)
        MESSAGE(SEND_ERROR 
          "No static wxWindows lib found, but WXWINDOWS_USE_SHARED_LIBS=${WXWINDOWS_USE_SHARED_LIBS}.")
      ENDIF(NOT WXWINDOWS_STATIC_LIBRARY)
    ENDIF(NOT WXWINDOWS_STATIC_DEBUG_LIBRARY)
    
  ENDIF(WXWINDOWS_USE_SHARED_LIBS)  
  
  
  # not neccessary in wxWindows 2.4.1 
  # but it may fix a previous bug, see
  # http://lists.wxwindows.org/cgi-bin/ezmlm-cgi?8:mss:37574:200305:mpdioeneabobmgjenoap
  OPTION(WXWINDOWS_SET_DEFINITIONS "Set additional defines for wxWindows" OFF)
  MARK_AS_ADVANCED(WXWINDOWS_SET_DEFINITIONS)
  IF (WXWINDOWS_SET_DEFINITIONS) 
    SET(WXWINDOWS_DEFINITIONS "-DWINVER=0x400")
  ELSE (WXWINDOWS_SET_DEFINITIONS) 
    # clear:
    SET(WXWINDOWS_DEFINITIONS "")
  ENDIF (WXWINDOWS_SET_DEFINITIONS) 
  
  
  # Find the include directories for wxwindows
  # the first, build specific for wx/setup.h was determined before.
  # add inc dir for general for "wx/wx.h" 
  SET (WXWINDOWS_POSSIBLE_INCLUDE_PATHS
    "${WXWINDOWS_ROOT_DIR}/include"
    )
  FIND_PATH(WXWINDOWS_INCLUDE_DIR  wx/wx.h 
    ${WXWINDOWS_POSSIBLE_INCLUDE_PATHS}
    )  
  # append the build specific include dir for wx/setup.h:
  IF (WXWINDOWS_INCLUDE_DIR_SETUPH)
    SET(WXWINDOWS_INCLUDE_DIR ${WXWINDOWS_INCLUDE_DIR} ${WXWINDOWS_INCLUDE_DIR_SETUPH} )
  ENDIF (WXWINDOWS_INCLUDE_DIR_SETUPH)
  
  MARK_AS_ADVANCED(
    WXWINDOWS_ROOT_DIR
    WXWINDOWS_INCLUDE_DIR
    WXWINDOWS_INCLUDE_DIR_SETUPH
    WXWINDOWS_STATIC_LIBRARY
    WXWINDOWS_STATIC_DEBUG_LIBRARY
    WXWINDOWS_SHARED_LIBRARY
    WXWINDOWS_SHARED_DEBUG_LIBRARY
    )
  
  
ELSE(WIN32_STYLE_FIND)
  IF (UNIX_STYLE_FIND) 
    # ###################################
    # 
    # UNIX/Linux specific:
    # 
    # use backquoted wx-config to query and set flags and libs:
    # 06/2003 Jan Woetzel
    # 
    
    OPTION(WXWINDOWS_USE_SHARED_LIBS "Use shared versions (.so) of wxWindows libraries" ON)
    MARK_AS_ADVANCED(WXWINDOWS_USE_SHARED_LIBS)

    # JW removed option and force the develper th SET it. 
    # OPTION(WXWINDOWS_USE_GL "use wxWindows with GL support (use additional
    # --gl-libs for wx-config)?" OFF)
    
    # wx-config should be in your path anyhow, usually no need to set WXWIN or
    # search in ../wx or ../../wx
    FIND_PROGRAM(CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE wx-config
      $ENV{WXWIN}
      ../wx/bin
      ../../wx/bin )
    
    # check wether wx-config was found:
    IF(CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE)    

      # use shared/static wx lib?
      # remember: always link shared to use systems GL etc. libs (no static
      # linking, just link *against* static .a libs)
      IF(WXWINDOWS_USE_SHARED_LIBS)
        SET(WX_CONFIG_ARGS_LIBS "--libs")
      ELSE(WXWINDOWS_USE_SHARED_LIBS)
        SET(WX_CONFIG_ARGS_LIBS "--static --libs")
      ENDIF(WXWINDOWS_USE_SHARED_LIBS)
      
      # do we need additionial wx GL stuff like GLCanvas ?
      IF(WXWINDOWS_USE_GL)
        SET(WX_CONFIG_ARGS_LIBS "${WX_CONFIG_ARGS_LIBS} --gl-libs" )
      ENDIF(WXWINDOWS_USE_GL)
      #MESSAGE("DBG: WX_CONFIG_ARGS_LIBS=${WX_CONFIG_ARGS_LIBS}===")
      
      # set CXXFLAGS to be fed into CMAKE_CXX_FLAGS by the user:
      SET(CMAKE_WXWINDOWS_CXX_FLAGS "`${CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE} --cxxflags`")
      #MESSAGE("DBG: for compilation:
      #CMAKE_WXWINDOWS_CXX_FLAGS=${CMAKE_WXWINDOWS_CXX_FLAGS}===")

      # keep the back-quoted string for clarity
      SET(WXWINDOWS_LIBRARIES "`${CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE} ${WX_CONFIG_ARGS_LIBS}`")
      #MESSAGE("DBG2: for linking:
      #WXWINDOWS_LIBRARIES=${WXWINDOWS_LIBRARIES}===")
      
      # evaluate wx-config output to separate linker flags and linkdirs for
      # rpath:
      EXEC_PROGRAM(${CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE}
        ARGS ${WX_CONFIG_ARGS_LIBS}
        OUTPUT_VARIABLE WX_CONFIG_LIBS )
      
      # extract linkdirs (-L) for rpath
      # use regular expression to match wildcard equivalent "-L*<endchar>"
      # with <endchar> is a space or a semicolon
      STRING(REGEX MATCHALL "[-][L]([^ ;])+" WXWINDOWS_LINK_DIRECTORIES_WITH_PREFIX "${WX_CONFIG_LIBS}" )
      #MESSAGE("DBG  WXWINDOWS_LINK_DIRECTORIES_WITH_PREFIX=${WXWINDOWS_LINK_DIRECTORIES_WITH_PREFIX}")
      
      # remove prefix -L because we need the pure directory for LINK_DIRECTORIES
      # replace -L by ; because the separator seems to be lost otherwise (bug or
      # feature?)
      IF(WXWINDOWS_LINK_DIRECTORIES_WITH_PREFIX)
        STRING(REGEX REPLACE "[-][L]" ";" WXWINDOWS_LINK_DIRECTORIES ${WXWINDOWS_LINK_DIRECTORIES_WITH_PREFIX} )
        #MESSAGE("DBG  WXWINDOWS_LINK_DIRECTORIES=${WXWINDOWS_LINK_DIRECTORIES}")
      ENDIF(WXWINDOWS_LINK_DIRECTORIES_WITH_PREFIX)

      
      # replace space separated string by semicolon separated vector to make it
      # work with LINK_DIRECTORIES
      SEPARATE_ARGUMENTS(WXWINDOWS_LINK_DIRECTORIES)
      
      MARK_AS_ADVANCED(
        CMAKE_WXWINDOWS_CXX_FLAGS
        WXWINDOWS_INCLUDE_DIR
        WXWINDOWS_LIBRARIES
        CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE
        )
      
      
      # we really need wx-config...
    ELSE(CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE)    
      MESSAGE(SEND_ERROR "Cannot find wx-config anywhere on the system. Please put the file into your path or specify it in CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE.")
      MARK_AS_ADVANCED(CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE)
    ENDIF(CMAKE_WXWINDOWS_WXCONFIG_EXECUTABLE)

    
    
  ELSE(UNIX_STYLE_FIND)
    MESSAGE(SEND_ERROR "FindwxWindows.cmake:  Platform unknown/unsupported by FindwxWindows.cmake. It's neither WIN32 nor UNIX")
  ENDIF(UNIX_STYLE_FIND)
ENDIF(WIN32_STYLE_FIND)


IF(WXWINDOWS_LIBRARIES)
  IF(WXWINDOWS_INCLUDE_DIR OR CMAKE_WXWINDOWS_CXX_FLAGS)
    
    # found all we need.
    SET(WXWINDOWS_FOUND 1)
    
    # set deprecated variables for backward compatibility: 
    SET(CMAKE_WX_CAN_COMPILE   ${WXWINDOWS_FOUND})
    SET(WXWINDOWS_LIBRARY      ${WXWINDOWS_LIBRARIES})
    SET(WXWINDOWS_INCLUDE_PATH ${WXWINDOWS_INCLUDE_DIR})
    SET(CMAKE_WX_CXX_FLAGS     ${CMAKE_WXWINDOWS_CXX_FLAGS})
    
  ENDIF(WXWINDOWS_INCLUDE_DIR OR CMAKE_WXWINDOWS_CXX_FLAGS)
ENDIF(WXWINDOWS_LIBRARIES)
