FindwxWidgets.cmake 36.4 KB
Newer Older
1 2 3 4 5 6
#.rst:
# FindwxWidgets
# -------------
#
# Find a wxWidgets (a.k.a., wxWindows) installation.
#
7
# This module finds if wxWidgets is installed and selects a default
8 9 10
# configuration to use.  wxWidgets is a modular library.  To specify the
# modules that you will use, you need to name them as components to the
# package:
11
#
12
# find_package(wxWidgets COMPONENTS core base ...)
13
#
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
# There are two search branches: a windows style and a unix style.  For
# windows, the following variables are searched for and set to defaults
# in case of multiple choices.  Change them if the defaults are not
# desired (i.e., these are the only variables you should change to
# select a configuration):
#
# ::
#
#   wxWidgets_ROOT_DIR      - Base wxWidgets directory
#                             (e.g., C:/wxWidgets-2.6.3).
#   wxWidgets_LIB_DIR       - Path to wxWidgets libraries
#                             (e.g., C:/wxWidgets-2.6.3/lib/vc_lib).
#   wxWidgets_CONFIGURATION - Configuration to use
#                             (e.g., msw, mswd, mswu, mswunivud, etc.)
#   wxWidgets_EXCLUDE_COMMON_LIBRARIES
#                           - Set to TRUE to exclude linking of
#                             commonly required libs (e.g., png tiff
#                             jpeg zlib regex expat).
#
#
#
# For unix style it uses the wx-config utility.  You can select between
36 37 38
# debug/release, unicode/ansi, universal/non-universal, and
# static/shared in the QtDialog or ccmake interfaces by turning ON/OFF
# the following variables:
39
#
40 41 42 43 44 45 46 47
# ::
#
#   wxWidgets_USE_DEBUG
#   wxWidgets_USE_UNICODE
#   wxWidgets_USE_UNIVERSAL
#   wxWidgets_USE_STATIC
#
#
48 49
#
# There is also a wxWidgets_CONFIG_OPTIONS variable for all other
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
# options that need to be passed to the wx-config utility.  For example,
# to use the base toolkit found in the /usr/local path, set the variable
# (before calling the FIND_PACKAGE command) as such:
#
# ::
#
#   set(wxWidgets_CONFIG_OPTIONS --toolkit=base --prefix=/usr)
#
#
#
# The following are set after the configuration is done for both windows
# and unix style:
#
# ::
#
#   wxWidgets_FOUND            - Set to TRUE if wxWidgets was found.
#   wxWidgets_INCLUDE_DIRS     - Include directories for WIN32
#                                i.e., where to find "wx/wx.h" and
#                                "wx/setup.h"; possibly empty for unices.
#   wxWidgets_LIBRARIES        - Path to the wxWidgets libraries.
#   wxWidgets_LIBRARY_DIRS     - compile time link dirs, useful for
#                                rpath on UNIX. Typically an empty string
#                                in WIN32 environment.
#   wxWidgets_DEFINITIONS      - Contains defines required to compile/link
#                                against WX, e.g. WXUSINGDLL
#   wxWidgets_DEFINITIONS_DEBUG- Contains defines required to compile/link
#                                against WX debug builds, e.g. __WXDEBUG__
#   wxWidgets_CXX_FLAGS        - Include dirs and compiler flags for
#                                unices, empty on WIN32. Essentially
#                                "`wx-config --cxxflags`".
#   wxWidgets_USE_FILE         - Convenience include file.
#
#
83 84
#
# Sample usage:
85 86 87 88 89 90 91 92 93 94 95 96
#
# ::
#
#    # Note that for MinGW users the order of libs is important!
#    find_package(wxWidgets COMPONENTS net gl core base)
#    if(wxWidgets_FOUND)
#      include(${wxWidgets_USE_FILE})
#      # and for each of your dependent executable/library targets:
#      target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})
#    endif()
#
#
97
#
98
# If wxWidgets is required (i.e., not an optional part):
99 100 101 102 103 104 105
#
# ::
#
#    find_package(wxWidgets REQUIRED net gl core base)
#    include(${wxWidgets_USE_FILE})
#    # and for each of your dependent executable/library targets:
#    target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})
106

107 108 109 110 111 112 113 114 115 116 117
#=============================================================================
# Copyright 2004-2009 Kitware, Inc.
# Copyright 2007-2009 Miguel A. Figueroa-Villanueva <miguelf at ieee dot org>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
118
# (To distribute this file outside of CMake, substitute the full
119 120
#  License text for the above reference.)

121
#
122
# FIXME: check this and provide a correct sample usage...
123
#        Remember to connect back to the upper text.
124
# Sample usage with monolithic wx build:
125
#
126
#   find_package(wxWidgets COMPONENTS mono)
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
#   ...

# NOTES
#
# This module has been tested on the WIN32 platform with wxWidgets
# 2.6.2, 2.6.3, and 2.5.3. However, it has been designed to
# easily extend support to all possible builds, e.g., static/shared,
# debug/release, unicode, universal, multilib/monolithic, etc..
#
# If you want to use the module and your build type is not supported
# out-of-the-box, please contact me to exchange information on how
# your system is setup and I'll try to add support for it.
#
# AUTHOR
#
# Miguel A. Figueroa-Villanueva (miguelf at ieee dot org).
# Jan Woetzel (jw at mip.informatik.uni-kiel.de).
#
# Based on previous works of:
# Jan Woetzel (FindwxWindows.cmake),
# Jorgen Bodde and Jerry Fath (FindwxWin.cmake).

# TODO/ideas
#
# (1) Option/Setting to use all available wx libs
# In contrast to expert developer who lists the
# minimal set of required libs in wxWidgets_USE_LIBS
# there is the newbie user:
#   - who just wants to link against WX with more 'magic'
#   - doesn't know the internal structure of WX or how it was built,
#     in particular if it is monolithic or not
#   - want to link against all available WX libs
# Basically, the intent here is to mimic what wx-config would do by
# default (i.e., `wx-config --libs`).
#
# Possible solution:
#   Add a reserved keyword "std" that initializes to what wx-config
# would default to. If the user has not set the wxWidgets_USE_LIBS,
# default to "std" instead of "base core" as it is now. To implement
# "std" will basically boil down to a FOR_EACH lib-FOUND, but maybe
# checking whether a minimal set was found.


170 171
# FIXME: This and all the DBG_MSG calls should be removed after the
# module stabilizes.
172
#
173 174
# Helper macro to control the debugging output globally. There are
# two versions for controlling how verbose your output should be.
175 176
macro(DBG_MSG _MSG)
#  message(STATUS
177
#    "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}")
178
endmacro()
179 180
macro(DBG_MSG_V _MSG)
#  message(STATUS
181
#    "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}")
182
endmacro()
183 184

# Clear return values in case the module is loaded more than once.
185 186 187 188 189
set(wxWidgets_FOUND FALSE)
set(wxWidgets_INCLUDE_DIRS "")
set(wxWidgets_LIBRARIES    "")
set(wxWidgets_LIBRARY_DIRS "")
set(wxWidgets_CXX_FLAGS    "")
190

191 192 193 194 195 196 197 198
# Using SYSTEM with INCLUDE_DIRECTORIES in conjunction with wxWidgets on
# the Mac produces compiler errors. Set wxWidgets_INCLUDE_DIRS_NO_SYSTEM
# to prevent UsewxWidgets.cmake from using SYSTEM.
#
# See cmake mailing list discussions for more info:
#   http://www.cmake.org/pipermail/cmake/2008-April/021115.html
#   http://www.cmake.org/pipermail/cmake/2008-April/021146.html
#
199 200 201
if(APPLE OR CMAKE_CXX_PLATFORM_ID MATCHES "OpenBSD")
  set(wxWidgets_INCLUDE_DIRS_NO_SYSTEM 1)
endif()
202

203
# DEPRECATED: This is a patch to support the DEPRECATED use of
204 205 206 207 208
# wxWidgets_USE_LIBS.
#
# If wxWidgets_USE_LIBS is set:
# - if using <components>, then override wxWidgets_USE_LIBS
# - else set wxWidgets_FIND_COMPONENTS to wxWidgets_USE_LIBS
209 210
if(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS)
  set(wxWidgets_FIND_COMPONENTS ${wxWidgets_USE_LIBS})
211
endif()
212 213 214 215 216 217 218
DBG_MSG("wxWidgets_FIND_COMPONENTS : ${wxWidgets_FIND_COMPONENTS}")

# Add the convenience use file if available.
#
# Get dir of this file which may reside in:
# - CMAKE_MAKE_ROOT/Modules on CMake installation
# - CMAKE_MODULE_PATH if user prefers his own specialized version
219 220
set(wxWidgets_USE_FILE "")
get_filename_component(
221 222 223
  wxWidgets_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
# Prefer an existing customized version, but the user might override
# the FindwxWidgets module and not the UsewxWidgets one.
224 225
if(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
  set(wxWidgets_USE_FILE
226
    "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
227
else()
228
  set(wxWidgets_USE_FILE UsewxWidgets)
229
endif()
230 231 232

#=====================================================================
#=====================================================================
233 234
if(WIN32 AND NOT CYGWIN AND NOT MSYS)
  set(wxWidgets_FIND_STYLE "win32")
235
else()
236 237
  if(UNIX OR MSYS)
    set(wxWidgets_FIND_STYLE "unix")
238 239
  endif()
endif()
240

241
#=====================================================================
242
# WIN32_FIND_STYLE
243
#=====================================================================
244
if(wxWidgets_FIND_STYLE STREQUAL "win32")
245
  # Useful common wx libs needed by almost all components.
246
  set(wxWidgets_COMMON_LIBRARIES png tiff jpeg zlib regex expat)
247

248 249 250 251
  # DEPRECATED: Use find_package(wxWidgets COMPONENTS mono) instead.
  if(NOT wxWidgets_FIND_COMPONENTS)
    if(wxWidgets_USE_MONOLITHIC)
      set(wxWidgets_FIND_COMPONENTS mono)
252
    else()
253
      set(wxWidgets_FIND_COMPONENTS core base) # this is default
254 255
    endif()
  endif()
256

257 258
  # Add the common (usually required libs) unless
  # wxWidgets_EXCLUDE_COMMON_LIBRARIES has been set.
259 260
  if(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES)
    list(APPEND wxWidgets_FIND_COMPONENTS
261
      ${wxWidgets_COMMON_LIBRARIES})
262
  endif()
263

264
  #-------------------------------------------------------------------
265
  # WIN32: Helper MACROS
266 267
  #-------------------------------------------------------------------
  #
268 269 270 271
  # Get filename components for a configuration. For example,
  #   if _CONFIGURATION = mswunivud, then _UNV=univ, _UCD=u _DBG=d
  #   if _CONFIGURATION = mswu,      then _UNV="",   _UCD=u _DBG=""
  #
272 273 274 275 276
  macro(WX_GET_NAME_COMPONENTS _CONFIGURATION _UNV _UCD _DBG)
    string(REGEX MATCH "univ" ${_UNV} "${_CONFIGURATION}")
    string(REGEX REPLACE "msw.*(u)[d]*$" "u" ${_UCD} "${_CONFIGURATION}")
    if(${_UCD} STREQUAL ${_CONFIGURATION})
      set(${_UCD} "")
277
    endif()
278
    string(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}")
279
  endmacro()
280 281 282 283

  #
  # Find libraries associated to a configuration.
  #
284
  macro(WX_FIND_LIBS _UNV _UCD _DBG)
285 286 287
    DBG_MSG_V("m_unv = ${_UNV}")
    DBG_MSG_V("m_ucd = ${_UCD}")
    DBG_MSG_V("m_dbg = ${_DBG}")
288

289 290 291
    # FIXME: What if both regex libs are available. regex should be
    # found outside the loop and only wx${LIB}${_UCD}${_DBG}.
    # Find wxWidgets common libraries.
292 293
    foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla)
      find_library(WX_${LIB}${_DBG}
294 295 296 297 298 299
        NAMES
        wx${LIB}${_UCD}${_DBG} # for regex
        wx${LIB}${_DBG}
        PATHS ${WX_LIB_DIR}
        NO_DEFAULT_PATH
        )
300
      mark_as_advanced(WX_${LIB}${_DBG})
301
    endforeach()
302

303
    # Find wxWidgets multilib base libraries.
304
    find_library(WX_base${_DBG}
305
      NAMES
306
      wxbase30${_UCD}${_DBG}
307
      wxbase29${_UCD}${_DBG}
308 309
      wxbase28${_UCD}${_DBG}
      wxbase27${_UCD}${_DBG}
310 311 312 313 314
      wxbase26${_UCD}${_DBG}
      wxbase25${_UCD}${_DBG}
      PATHS ${WX_LIB_DIR}
      NO_DEFAULT_PATH
      )
315 316 317
    mark_as_advanced(WX_base${_DBG})
    foreach(LIB net odbc xml)
      find_library(WX_${LIB}${_DBG}
318
        NAMES
319
        wxbase30${_UCD}${_DBG}_${LIB}
320
        wxbase29${_UCD}${_DBG}_${LIB}
321 322
        wxbase28${_UCD}${_DBG}_${LIB}
        wxbase27${_UCD}${_DBG}_${LIB}
323 324 325 326 327
        wxbase26${_UCD}${_DBG}_${LIB}
        wxbase25${_UCD}${_DBG}_${LIB}
        PATHS ${WX_LIB_DIR}
        NO_DEFAULT_PATH
        )
328
      mark_as_advanced(WX_${LIB}${_DBG})
329
    endforeach()
330

331
    # Find wxWidgets monolithic library.
332
    find_library(WX_mono${_DBG}
333
      NAMES
334
      wxmsw${_UNV}30${_UCD}${_DBG}
335
      wxmsw${_UNV}29${_UCD}${_DBG}
336 337
      wxmsw${_UNV}28${_UCD}${_DBG}
      wxmsw${_UNV}27${_UCD}${_DBG}
338 339 340 341 342
      wxmsw${_UNV}26${_UCD}${_DBG}
      wxmsw${_UNV}25${_UCD}${_DBG}
      PATHS ${WX_LIB_DIR}
      NO_DEFAULT_PATH
      )
343
    mark_as_advanced(WX_mono${_DBG})
344

345
    # Find wxWidgets multilib libraries.
346
    foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
347
                stc ribbon propgrid webview)
348
      find_library(WX_${LIB}${_DBG}
349
        NAMES
350
        wxmsw${_UNV}30${_UCD}${_DBG}_${LIB}
351
        wxmsw${_UNV}29${_UCD}${_DBG}_${LIB}
352 353
        wxmsw${_UNV}28${_UCD}${_DBG}_${LIB}
        wxmsw${_UNV}27${_UCD}${_DBG}_${LIB}
354 355 356 357 358
        wxmsw${_UNV}26${_UCD}${_DBG}_${LIB}
        wxmsw${_UNV}25${_UCD}${_DBG}_${LIB}
        PATHS ${WX_LIB_DIR}
        NO_DEFAULT_PATH
        )
359
      mark_as_advanced(WX_${LIB}${_DBG})
360 361
    endforeach()
  endmacro()
362 363 364 365 366

  #
  # Clear all library paths, so that FIND_LIBRARY refinds them.
  #
  # Clear a lib, reset its found flag, and mark as advanced.
367 368 369 370
  macro(WX_CLEAR_LIB _LIB)
    set(${_LIB} "${_LIB}-NOTFOUND" CACHE FILEPATH "Cleared." FORCE)
    set(${_LIB}_FOUND FALSE)
    mark_as_advanced(${_LIB})
371
  endmacro()
372
  # Clear all debug or release library paths (arguments are "d" or "").
373
  macro(WX_CLEAR_ALL_LIBS _DBG)
374
    # Clear wxWidgets common libraries.
375
    foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla)
376
      WX_CLEAR_LIB(WX_${LIB}${_DBG})
377
    endforeach()
378

379
    # Clear wxWidgets multilib base libraries.
380
    WX_CLEAR_LIB(WX_base${_DBG})
381
    foreach(LIB net odbc xml)
382
      WX_CLEAR_LIB(WX_${LIB}${_DBG})
383
    endforeach()
384

385
    # Clear wxWidgets monolithic library.
386 387
    WX_CLEAR_LIB(WX_mono${_DBG})

388
    # Clear wxWidgets multilib libraries.
389
    foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
390
                stc ribbon propgrid)
391
      WX_CLEAR_LIB(WX_${LIB}${_DBG})
392 393
    endforeach()
  endmacro()
394
  # Clear all wxWidgets debug libraries.
395
  macro(WX_CLEAR_ALL_DBG_LIBS)
396
    WX_CLEAR_ALL_LIBS("d")
397
  endmacro()
398
  # Clear all wxWidgets release libraries.
399
  macro(WX_CLEAR_ALL_REL_LIBS)
400
    WX_CLEAR_ALL_LIBS("")
401
  endmacro()
402 403 404 405 406

  #
  # Set the wxWidgets_LIBRARIES variable.
  # Also, Sets output variable wxWidgets_FOUND to FALSE if it fails.
  #
407
  macro(WX_SET_LIBRARIES _LIBS _DBG)
408
    DBG_MSG_V("Looking for ${${_LIBS}}")
409 410
    if(WX_USE_REL_AND_DBG)
      foreach(LIB ${${_LIBS}})
411 412 413
        DBG_MSG_V("Searching for ${LIB} and ${LIB}d")
        DBG_MSG_V("WX_${LIB}  : ${WX_${LIB}}")
        DBG_MSG_V("WX_${LIB}d : ${WX_${LIB}d}")
414
        if(WX_${LIB} AND WX_${LIB}d)
415
          DBG_MSG_V("Found ${LIB} and ${LIB}d")
416
          list(APPEND wxWidgets_LIBRARIES
417
            debug ${WX_${LIB}d} optimized ${WX_${LIB}}
418
            )
419
        else()
420
          DBG_MSG_V("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}")
421
          set(wxWidgets_FOUND FALSE)
422 423 424
        endif()
      endforeach()
    else()
425
      foreach(LIB ${${_LIBS}})
426 427
        DBG_MSG_V("Searching for ${LIB}${_DBG}")
        DBG_MSG_V("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}")
428
        if(WX_${LIB}${_DBG})
429
          DBG_MSG_V("Found ${LIB}${_DBG}")
430
          list(APPEND wxWidgets_LIBRARIES ${WX_${LIB}${_DBG}})
431
        else()
432 433
          DBG_MSG_V(
            "- not found due to missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}")
434
          set(wxWidgets_FOUND FALSE)
435 436 437
        endif()
      endforeach()
    endif()
438

439
    DBG_MSG_V("OpenGL")
440 441
    list(FIND ${_LIBS} gl WX_USE_GL)
    if(NOT WX_USE_GL EQUAL -1)
442
      DBG_MSG_V("- is required.")
443
      list(APPEND wxWidgets_LIBRARIES opengl32 glu32)
444
    endif()
445

446
    list(APPEND wxWidgets_LIBRARIES winmm comctl32 rpcrt4 wsock32)
447
  endmacro()
448

449
  #-------------------------------------------------------------------
450
  # WIN32: Start actual work.
451 452
  #-------------------------------------------------------------------

453
  # Look for an installation tree.
454
  find_path(wxWidgets_ROOT_DIR
455 456
    NAMES include/wx/wx.h
    PATHS
457 458
      ENV wxWidgets_ROOT_DIR
      ENV WXWIN
459 460 461
      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\wxWidgets_is1;Inno Setup: App Path]"  # WX 2.6.x
      C:/
      D:/
462
      ENV ProgramFiles
463
    PATH_SUFFIXES
464 465
      wxWidgets-3.0.0
      wxWidgets-2.9.5
466 467 468 469 470
      wxWidgets-2.9.4
      wxWidgets-2.9.3
      wxWidgets-2.9.2
      wxWidgets-2.9.1
      wxWidgets-2.9.0
471
      wxWidgets-2.8.9
472
      wxWidgets-2.8.8
473
      wxWidgets-2.8.7
474 475 476 477 478 479 480 481 482 483
      wxWidgets-2.8.6
      wxWidgets-2.8.5
      wxWidgets-2.8.4
      wxWidgets-2.8.3
      wxWidgets-2.8.2
      wxWidgets-2.8.1
      wxWidgets-2.8.0
      wxWidgets-2.7.4
      wxWidgets-2.7.3
      wxWidgets-2.7.2
484
      wxWidgets-2.7.1
485 486
      wxWidgets-2.7.0
      wxWidgets-2.7.0-1
487
      wxWidgets-2.6.4
488 489 490 491 492 493 494 495
      wxWidgets-2.6.3
      wxWidgets-2.6.2
      wxWidgets-2.6.1
      wxWidgets-2.5.4
      wxWidgets-2.5.3
      wxWidgets-2.5.2
      wxWidgets-2.5.1
      wxWidgets
496
    DOC "wxWidgets base/installation directory"
497
    )
498 499

  # If wxWidgets_ROOT_DIR changed, clear lib dir.
500 501
  if(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR)
    set(WX_ROOT_DIR ${wxWidgets_ROOT_DIR}
502
        CACHE INTERNAL "wxWidgets_ROOT_DIR")
503
    set(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND"
504
        CACHE PATH "Cleared." FORCE)
505
  endif()
506

507
  if(WX_ROOT_DIR)
508 509 510
    # Select one default tree inside the already determined wx tree.
    # Prefer static/shared order usually consistent with build
    # settings.
511 512
    if(MINGW)
      set(WX_LIB_DIR_PREFIX gcc)
513 514
    elseif(CMAKE_CL_64)
      set(WX_LIB_DIR_PREFIX vc_x64)
515
    else()
516
      set(WX_LIB_DIR_PREFIX vc)
517
    endif()
518 519
    if(BUILD_SHARED_LIBS)
      find_path(wxWidgets_LIB_DIR
520 521 522 523 524 525 526 527 528
        NAMES
          msw/wx/setup.h
          mswd/wx/setup.h
          mswu/wx/setup.h
          mswud/wx/setup.h
          mswuniv/wx/setup.h
          mswunivd/wx/setup.h
          mswunivu/wx/setup.h
          mswunivud/wx/setup.h
529
        PATHS
530 531
        ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_dll   # prefer shared
        ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_lib
532
        DOC "Path to wxWidgets libraries"
533 534
        NO_DEFAULT_PATH
        )
535
    else()
536
      find_path(wxWidgets_LIB_DIR
537 538 539 540 541 542 543 544 545
        NAMES
          msw/wx/setup.h
          mswd/wx/setup.h
          mswu/wx/setup.h
          mswud/wx/setup.h
          mswuniv/wx/setup.h
          mswunivd/wx/setup.h
          mswunivu/wx/setup.h
          mswunivud/wx/setup.h
546
        PATHS
547 548
        ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_lib   # prefer static
        ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_dll
549
        DOC "Path to wxWidgets libraries"
550 551
        NO_DEFAULT_PATH
        )
552
    endif()
553 554

    # If wxWidgets_LIB_DIR changed, clear all libraries.
555 556
    if(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR)
      set(WX_LIB_DIR ${wxWidgets_LIB_DIR} CACHE INTERNAL "wxWidgets_LIB_DIR")
557 558
      WX_CLEAR_ALL_DBG_LIBS()
      WX_CLEAR_ALL_REL_LIBS()
559
    endif()
560

561
    if(WX_LIB_DIR)
562
      # If building shared libs, define WXUSINGDLL to use dllimport.
563
      if(WX_LIB_DIR MATCHES "[dD][lL][lL]")
564
        set(wxWidgets_DEFINITIONS WXUSINGDLL)
565
        DBG_MSG_V("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}")
566
      endif()
567

568
      # Search for available configuration types.
569 570 571 572 573 574
      foreach(CFG mswunivud mswunivd mswud mswd mswunivu mswuniv mswu msw)
        set(WX_${CFG}_FOUND FALSE)
        if(EXISTS ${WX_LIB_DIR}/${CFG})
          list(APPEND WX_CONFIGURATION_LIST ${CFG})
          set(WX_${CFG}_FOUND TRUE)
          set(WX_CONFIGURATION ${CFG})
575 576
        endif()
      endforeach()
577
      DBG_MSG_V("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}")
578

579 580
      if(WX_CONFIGURATION)
        set(wxWidgets_FOUND TRUE)
581

582 583 584 585
        # If the selected configuration wasn't found force the default
        # one. Otherwise, use it but still force a refresh for
        # updating the doc string with the current list of available
        # configurations.
586 587
        if(NOT WX_${wxWidgets_CONFIGURATION}_FOUND)
          set(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING
588
            "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
589
        else()
590
          set(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING
591
            "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
592
        endif()
593

594
        # If release config selected, and both release/debug exist.
595 596
        if(WX_${wxWidgets_CONFIGURATION}d_FOUND)
          option(wxWidgets_USE_REL_AND_DBG
597
            "Use release and debug configurations?" TRUE)
598
          set(WX_USE_REL_AND_DBG ${wxWidgets_USE_REL_AND_DBG})
599
        else()
600
          # If the option exists (already in cache), force it false.
601 602
          if(wxWidgets_USE_REL_AND_DBG)
            set(wxWidgets_USE_REL_AND_DBG FALSE CACHE BOOL
603
              "No ${wxWidgets_CONFIGURATION}d found." FORCE)
604
          endif()
605
          set(WX_USE_REL_AND_DBG FALSE)
606
        endif()
607 608 609 610 611

        # Get configuration parameters from the name.
        WX_GET_NAME_COMPONENTS(${wxWidgets_CONFIGURATION} UNV UCD DBG)

        # Set wxWidgets lib setup include directory.
612 613
        if(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h)
          set(wxWidgets_INCLUDE_DIRS
614
            ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION})
615
        else()
616
          DBG_MSG("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exists.")
617
          set(wxWidgets_FOUND FALSE)
618
        endif()
619

620
        # Set wxWidgets main include directory.
621 622
        if(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h)
          list(APPEND wxWidgets_INCLUDE_DIRS ${WX_ROOT_DIR}/include)
623
        else()
624
          DBG_MSG("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h")
625
          set(wxWidgets_FOUND FALSE)
626
        endif()
627

628 629
        # Find wxWidgets libraries.
        WX_FIND_LIBS("${UNV}" "${UCD}" "${DBG}")
630
        if(WX_USE_REL_AND_DBG)
631
          WX_FIND_LIBS("${UNV}" "${UCD}" "d")
632
        endif()
633 634

        # Settings for requested libs (i.e., include dir, libraries, etc.).
635
        WX_SET_LIBRARIES(wxWidgets_FIND_COMPONENTS "${DBG}")
636

637
        # Add necessary definitions for unicode builds
638 639
        if("${UCD}" STREQUAL "u")
          list(APPEND wxWidgets_DEFINITIONS UNICODE _UNICODE)
640
        endif()
641 642

        # Add necessary definitions for debug builds
643
        set(wxWidgets_DEFINITIONS_DEBUG _DEBUG __WXDEBUG__)
644

645 646 647
      endif()
    endif()
  endif()
648

649
#=====================================================================
650
# UNIX_FIND_STYLE
651
#=====================================================================
652
else()
653
  if(wxWidgets_FIND_STYLE STREQUAL "unix")
654 655 656 657 658 659
    #-----------------------------------------------------------------
    # UNIX: Helper MACROS
    #-----------------------------------------------------------------
    #
    # Set the default values based on "wx-config --selected-config".
    #
660 661
    macro(WX_CONFIG_SELECT_GET_DEFAULT)
      execute_process(
662 663
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_CONFIG_OPTIONS} --selected-config
664 665 666 667
        OUTPUT_VARIABLE _wx_selected_config
        RESULT_VARIABLE _wx_result
        ERROR_QUIET
        )
668 669 670
      if(_wx_result EQUAL 0)
        foreach(_opt_name debug static unicode universal)
          string(TOUPPER ${_opt_name} _upper_opt_name)
671
          if(_wx_selected_config MATCHES "${_opt_name}")
672
            set(wxWidgets_DEFAULT_${_upper_opt_name} ON)
673
          else()
674
            set(wxWidgets_DEFAULT_${_upper_opt_name} OFF)
675 676 677
          endif()
        endforeach()
      else()
678 679
        foreach(_upper_opt_name DEBUG STATIC UNICODE UNIVERSAL)
          set(wxWidgets_DEFAULT_${_upper_opt_name} OFF)
680 681 682
        endforeach()
      endif()
    endmacro()
683 684 685 686 687 688

    #
    # Query a boolean configuration option to determine if the system
    # has both builds available. If so, provide the selection option
    # to the user.
    #
689 690
    macro(WX_CONFIG_SELECT_QUERY_BOOL _OPT_NAME _OPT_HELP)
      execute_process(
691 692
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=yes
693 694 695 696
        RESULT_VARIABLE _wx_result_yes
        OUTPUT_QUIET
        ERROR_QUIET
        )
697
      execute_process(
698 699
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=no
700 701 702 703
        RESULT_VARIABLE _wx_result_no
        OUTPUT_QUIET
        ERROR_QUIET
        )
704 705 706
      string(TOUPPER ${_OPT_NAME} _UPPER_OPT_NAME)
      if(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0)
        option(wxWidgets_USE_${_UPPER_OPT_NAME}
707
          ${_OPT_HELP} ${wxWidgets_DEFAULT_${_UPPER_OPT_NAME}})
708
      else()
709
        # If option exists (already in cache), force to available one.
710 711 712
        if(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME})
          if(_wx_result_yes EQUAL 0)
            set(wxWidgets_USE_${_UPPER_OPT_NAME} ON  CACHE BOOL ${_OPT_HELP} FORCE)
713
          else()
714
            set(wxWidgets_USE_${_UPPER_OPT_NAME} OFF CACHE BOOL ${_OPT_HELP} FORCE)
715 716 717 718
          endif()
        endif()
      endif()
    endmacro()
719

720
    #
721 722 723
    # Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting
    # among multiple builds.
    #
724 725 726 727 728 729 730
    macro(WX_CONFIG_SELECT_SET_OPTIONS)
      set(wxWidgets_SELECT_OPTIONS ${wxWidgets_CONFIG_OPTIONS})
      foreach(_opt_name debug static unicode universal)
        string(TOUPPER ${_opt_name} _upper_opt_name)
        if(DEFINED wxWidgets_USE_${_upper_opt_name})
          if(wxWidgets_USE_${_upper_opt_name})
            list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=yes)
731
          else()
732
            list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no)
733 734 735 736
          endif()
        endif()
      endforeach()
    endmacro()
737 738 739 740

    #-----------------------------------------------------------------
    # UNIX: Start actual work.
    #-----------------------------------------------------------------
741
    # Support cross-compiling, only search in the target platform.
742
    find_program(wxWidgets_CONFIG_EXECUTABLE wx-config
743
      DOC "Location of wxWidgets library configuration provider binary (wx-config)."
744 745 746
      ONLY_CMAKE_FIND_ROOT_PATH
      )

747 748
    if(wxWidgets_CONFIG_EXECUTABLE)
      set(wxWidgets_FOUND TRUE)
749

750 751 752 753 754 755 756 757 758 759 760 761 762
      # get defaults based on "wx-config --selected-config"
      WX_CONFIG_SELECT_GET_DEFAULT()

      # for each option: if both builds are available, provide option
      WX_CONFIG_SELECT_QUERY_BOOL(debug "Use debug build?")
      WX_CONFIG_SELECT_QUERY_BOOL(unicode "Use unicode build?")
      WX_CONFIG_SELECT_QUERY_BOOL(universal "Use universal build?")
      WX_CONFIG_SELECT_QUERY_BOOL(static "Link libraries statically?")

      # process selection to set wxWidgets_SELECT_OPTIONS
      WX_CONFIG_SELECT_SET_OPTIONS()
      DBG_MSG("wxWidgets_SELECT_OPTIONS=${wxWidgets_SELECT_OPTIONS}")

763
      # run the wx-config program to get cxxflags
764
      execute_process(
765 766
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_SELECT_OPTIONS} --cxxflags
767
        OUTPUT_VARIABLE wxWidgets_CXX_FLAGS
768
        RESULT_VARIABLE RET
769
        ERROR_QUIET
770
        )
771 772 773
      if(RET EQUAL 0)
        string(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS)
        separate_arguments(wxWidgets_CXX_FLAGS)
774 775 776

        DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")

777 778
        # parse definitions from cxxflags;
        #   drop -D* from CXXFLAGS and the -D prefix
779
        string(REGEX MATCHALL "-D[^;]+"
780
          wxWidgets_DEFINITIONS  "${wxWidgets_CXX_FLAGS}")
781
        string(REGEX REPLACE "-D[^;]+(;|$)" ""
782
          wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
783
        string(REGEX REPLACE ";$" ""
784
          wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
785
        string(REPLACE "-D" ""
786
          wxWidgets_DEFINITIONS "${wxWidgets_DEFINITIONS}")
787 788

        # parse include dirs from cxxflags; drop -I prefix
789
        string(REGEX MATCHALL "-I[^;]+"
790
          wxWidgets_INCLUDE_DIRS "${wxWidgets_CXX_FLAGS}")
791
        string(REGEX REPLACE "-I[^;]+;" ""
792
          wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}")
793
        string(REPLACE "-I" ""
794 795 796 797 798
          wxWidgets_INCLUDE_DIRS "${wxWidgets_INCLUDE_DIRS}")

        DBG_MSG_V("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}")
        DBG_MSG_V("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}")
        DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")
799

800
      else()
801
        set(wxWidgets_FOUND FALSE)
802 803
        DBG_MSG_V(
          "${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}")
804
      endif()
805 806 807 808 809

      # run the wx-config program to get the libs
      # - NOTE: wx-config doesn't verify that the libs requested exist
      #         it just produces the names. Maybe a TRY_COMPILE would
      #         be useful here...
810
      string(REPLACE ";" ","
811
        wxWidgets_FIND_COMPONENTS "${wxWidgets_FIND_COMPONENTS}")
812
      execute_process(
813 814
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_SELECT_OPTIONS} --libs ${wxWidgets_FIND_COMPONENTS}
815
        OUTPUT_VARIABLE wxWidgets_LIBRARIES
816
        RESULT_VARIABLE RET
817
        ERROR_QUIET
818
        )
819 820 821 822
      if(RET EQUAL 0)
        string(STRIP "${wxWidgets_LIBRARIES}" wxWidgets_LIBRARIES)
        separate_arguments(wxWidgets_LIBRARIES)
        string(REPLACE "-framework;" "-framework "
823
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
824
        string(REPLACE "-arch;" "-arch "
825
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
826
        string(REPLACE "-isysroot;" "-isysroot "
827
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
828 829

        # extract linkdirs (-L) for rpath (i.e., LINK_DIRECTORIES)
830
        string(REGEX MATCHALL "-L[^;]+"
831
          wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARIES}")
832
        string(REPLACE "-L" ""
833 834
          wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}")

835 836 837
        DBG_MSG_V("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}")
        DBG_MSG_V("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}")

838
      else()
839
        set(wxWidgets_FOUND FALSE)
840
        DBG_MSG("${wxWidgets_CONFIG_EXECUTABLE} --libs ${wxWidgets_FIND_COMPONENTS} FAILED with RET=${RET}")
841 842
      endif()
    endif()
843

844
#=====================================================================
845
# Neither UNIX_FIND_STYLE, nor WIN32_FIND_STYLE
846
#=====================================================================
847
  else()
848 849
    if(NOT wxWidgets_FIND_QUIETLY)
      message(STATUS
850 851
        "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): \n"
        "  Platform unknown/unsupported. It's neither WIN32 nor UNIX "
852
        "find style."
853
        )
854 855 856
    endif()
  endif()
endif()
857

858
# Debug output:
859 860 861
DBG_MSG("wxWidgets_FOUND           : ${wxWidgets_FOUND}")
DBG_MSG("wxWidgets_INCLUDE_DIRS    : ${wxWidgets_INCLUDE_DIRS}")
DBG_MSG("wxWidgets_LIBRARY_DIRS    : ${wxWidgets_LIBRARY_DIRS}")
862
DBG_MSG("wxWidgets_LIBRARIES       : ${wxWidgets_LIBRARIES}")
863 864 865 866 867
DBG_MSG("wxWidgets_CXX_FLAGS       : ${wxWidgets_CXX_FLAGS}")
DBG_MSG("wxWidgets_USE_FILE        : ${wxWidgets_USE_FILE}")

#=====================================================================
#=====================================================================
868
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
869
FIND_PACKAGE_HANDLE_STANDARD_ARGS(wxWidgets DEFAULT_MSG wxWidgets_FOUND)
870
# Maintain consistency with all other variables.
871
set(wxWidgets_FOUND ${WXWIDGETS_FOUND})
872 873 874 875 876 877 878 879 880 881

#=====================================================================
# Macros for use in wxWidgets apps.
# - This module will not fail to find wxWidgets based on the code
#   below. Hence, it's required to check for validity of:</