FindwxWidgets.cmake 41.5 KB
Newer Older
1
2
3
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#[=======================================================================[.rst:
FindwxWidgets
-------------

Find a wxWidgets (a.k.a., wxWindows) installation.

This module finds if wxWidgets is installed and selects a default
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:

find_package(wxWidgets COMPONENTS core base ... OPTIONAL_COMPONENTS net ...)

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
debug/release, unicode/ansi, universal/non-universal, and
static/shared in the QtDialog or ccmake interfaces by turning ON/OFF
the following variables:

::

  wxWidgets_USE_DEBUG
  wxWidgets_USE_UNICODE
  wxWidgets_USE_UNIVERSAL
  wxWidgets_USE_STATIC



There is also a wxWidgets_CONFIG_OPTIONS variable for all other
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.



Sample usage:

::

   # Note that for MinGW users the order of libs is important!
   find_package(wxWidgets COMPONENTS gl core base OPTIONAL_COMPONENTS net)
   if(wxWidgets_FOUND)
     include(${wxWidgets_USE_FILE})
     # and for each of your dependent executable/library targets:
     target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})
   endif()



If wxWidgets is required (i.e., not an optional part):

::

   find_package(wxWidgets REQUIRED gl core base OPTIONAL_COMPONENTS net)
   include(${wxWidgets_USE_FILE})
   # and for each of your dependent executable/library targets:
   target_link_libraries(<YourTarget> ${wxWidgets_LIBRARIES})
#]=======================================================================]
110

111
#
112
# FIXME: check this and provide a correct sample usage...
113
#        Remember to connect back to the upper text.
114
# Sample usage with monolithic wx build:
115
#
116
#   find_package(wxWidgets COMPONENTS mono)
117
118
119
120
121
122
123
124
125
126
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
#   ...

# 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.


160
161
# FIXME: This and all the DBG_MSG calls should be removed after the
# module stabilizes.
162
#
163
164
# Helper macro to control the debugging output globally. There are
# two versions for controlling how verbose your output should be.
165
166
macro(DBG_MSG _MSG)
#  message(STATUS
167
#    "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}")
168
endmacro()
169
170
macro(DBG_MSG_V _MSG)
#  message(STATUS
171
#    "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}")
172
endmacro()
173
174

# Clear return values in case the module is loaded more than once.
175
176
177
178
179
set(wxWidgets_FOUND FALSE)
set(wxWidgets_INCLUDE_DIRS "")
set(wxWidgets_LIBRARIES    "")
set(wxWidgets_LIBRARY_DIRS "")
set(wxWidgets_CXX_FLAGS    "")
180

181
# DEPRECATED: This is a patch to support the DEPRECATED use of
182
183
184
185
186
# 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
187
188
if(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS)
  set(wxWidgets_FIND_COMPONENTS ${wxWidgets_USE_LIBS})
189
endif()
190
191
192
193
194
195
196
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
197
198
set(wxWidgets_USE_FILE "")
get_filename_component(
199
200
201
  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.
202
203
if(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
  set(wxWidgets_USE_FILE
204
    "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake")
205
else()
206
  set(wxWidgets_USE_FILE UsewxWidgets)
207
endif()
208
209

#=====================================================================
210
# Determine whether unix or win32 paths should be used
211
#=====================================================================
212
if(WIN32 AND NOT CYGWIN AND NOT MSYS AND NOT CMAKE_CROSSCOMPILING)
213
  set(wxWidgets_FIND_STYLE "win32")
214
else()
215
  set(wxWidgets_FIND_STYLE "unix")
216
endif()
217

218
#=====================================================================
219
# WIN32_FIND_STYLE
220
#=====================================================================
221
if(wxWidgets_FIND_STYLE STREQUAL "win32")
222
  # Useful common wx libs needed by almost all components.
223
  set(wxWidgets_COMMON_LIBRARIES png tiff jpeg zlib regex expat)
224

225
226
227
228
  # DEPRECATED: Use find_package(wxWidgets COMPONENTS mono) instead.
  if(NOT wxWidgets_FIND_COMPONENTS)
    if(wxWidgets_USE_MONOLITHIC)
      set(wxWidgets_FIND_COMPONENTS mono)
229
    else()
230
      set(wxWidgets_FIND_COMPONENTS core base) # this is default
231
232
    endif()
  endif()
233

234
235
  # Add the common (usually required libs) unless
  # wxWidgets_EXCLUDE_COMMON_LIBRARIES has been set.
236
237
  if(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES)
    list(APPEND wxWidgets_FIND_COMPONENTS
238
      ${wxWidgets_COMMON_LIBRARIES})
239
  endif()
240

241
  #-------------------------------------------------------------------
242
  # WIN32: Helper MACROS
243
244
  #-------------------------------------------------------------------
  #
245
  # Get filename components for a configuration. For example,
246
247
  #   if _CONFIGURATION = mswunivud, then _PF="msw", _UNV=univ, _UCD=u _DBG=d
  #   if _CONFIGURATION = mswu,      then _PF="msw", _UNV="",   _UCD=u _DBG=""
248
  #
249
250
  macro(WX_GET_NAME_COMPONENTS _CONFIGURATION _PF _UNV _UCD _DBG)
    DBG_MSG_V(${_CONFIGURATION})
251
    string(REGEX MATCH "univ" ${_UNV} "${_CONFIGURATION}")
252
    string(REGEX REPLACE "[msw|qt].*(u)[d]*$" "u" ${_UCD} "${_CONFIGURATION}")
253
254
    if(${_UCD} STREQUAL ${_CONFIGURATION})
      set(${_UCD} "")
255
    endif()
256
    string(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}")
257
    string(REGEX MATCH "^[msw|qt]*" ${_PF} "${_CONFIGURATION}")
258
  endmacro()
259
260
261
262

  #
  # Find libraries associated to a configuration.
  #
263
  macro(WX_FIND_LIBS _PF _UNV _UCD _DBG)
264
265
266
    DBG_MSG_V("m_unv = ${_UNV}")
    DBG_MSG_V("m_ucd = ${_UCD}")
    DBG_MSG_V("m_dbg = ${_DBG}")
267

268
269
270
    # 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.
271
272
    foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla)
      find_library(WX_${LIB}${_DBG}
273
274
275
276
277
278
        NAMES
        wx${LIB}${_UCD}${_DBG} # for regex
        wx${LIB}${_DBG}
        PATHS ${WX_LIB_DIR}
        NO_DEFAULT_PATH
        )
279
      mark_as_advanced(WX_${LIB}${_DBG})
280
    endforeach()
281

282
    # Find wxWidgets multilib base libraries.
283
    find_library(WX_base${_DBG}
284
      NAMES
285
      wxbase31${_UCD}${_DBG}
286
      wxbase30${_UCD}${_DBG}
287
      wxbase29${_UCD}${_DBG}
288
289
      wxbase28${_UCD}${_DBG}
      wxbase27${_UCD}${_DBG}
290
291
292
293
294
      wxbase26${_UCD}${_DBG}
      wxbase25${_UCD}${_DBG}
      PATHS ${WX_LIB_DIR}
      NO_DEFAULT_PATH
      )
295
296
297
    mark_as_advanced(WX_base${_DBG})
    foreach(LIB net odbc xml)
      find_library(WX_${LIB}${_DBG}
298
        NAMES
299
        wxbase31${_UCD}${_DBG}_${LIB}
300
        wxbase30${_UCD}${_DBG}_${LIB}
301
        wxbase29${_UCD}${_DBG}_${LIB}
302
303
        wxbase28${_UCD}${_DBG}_${LIB}
        wxbase27${_UCD}${_DBG}_${LIB}
304
305
306
307
308
        wxbase26${_UCD}${_DBG}_${LIB}
        wxbase25${_UCD}${_DBG}_${LIB}
        PATHS ${WX_LIB_DIR}
        NO_DEFAULT_PATH
        )
309
      mark_as_advanced(WX_${LIB}${_DBG})
310
    endforeach()
311

312
    # Find wxWidgets monolithic library.
313
    find_library(WX_mono${_DBG}
314
      NAMES
315
316
317
318
319
320
321
      wx${_PF}${_UNV}31${_UCD}${_DBG}
      wx${_PF}${_UNV}30${_UCD}${_DBG}
      wx${_PF}${_UNV}29${_UCD}${_DBG}
      wx${_PF}${_UNV}28${_UCD}${_DBG}
      wx${_PF}${_UNV}27${_UCD}${_DBG}
      wx${_PF}${_UNV}26${_UCD}${_DBG}
      wx${_PF}${_UNV}25${_UCD}${_DBG}
322
323
324
      PATHS ${WX_LIB_DIR}
      NO_DEFAULT_PATH
      )
325
    mark_as_advanced(WX_mono${_DBG})
326

327
    # Find wxWidgets multilib libraries.
328
    foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
329
                stc ribbon propgrid webview)
330
      find_library(WX_${LIB}${_DBG}
331
        NAMES
332
333
334
335
336
337
338
        wx${_PF}${_UNV}31${_UCD}${_DBG}_${LIB}
        wx${_PF}${_UNV}30${_UCD}${_DBG}_${LIB}
        wx${_PF}${_UNV}29${_UCD}${_DBG}_${LIB}
        wx${_PF}${_UNV}28${_UCD}${_DBG}_${LIB}
        wx${_PF}${_UNV}27${_UCD}${_DBG}_${LIB}
        wx${_PF}${_UNV}26${_UCD}${_DBG}_${LIB}
        wx${_PF}${_UNV}25${_UCD}${_DBG}_${LIB}
339
340
341
        PATHS ${WX_LIB_DIR}
        NO_DEFAULT_PATH
        )
342
      mark_as_advanced(WX_${LIB}${_DBG})
343
344
    endforeach()
  endmacro()
345
346
347
348
349

  #
  # Clear all library paths, so that FIND_LIBRARY refinds them.
  #
  # Clear a lib, reset its found flag, and mark as advanced.
350
351
352
353
  macro(WX_CLEAR_LIB _LIB)
    set(${_LIB} "${_LIB}-NOTFOUND" CACHE FILEPATH "Cleared." FORCE)
    set(${_LIB}_FOUND FALSE)
    mark_as_advanced(${_LIB})
354
  endmacro()
355
  # Clear all debug or release library paths (arguments are "d" or "").
356
  macro(WX_CLEAR_ALL_LIBS _DBG)
357
    # Clear wxWidgets common libraries.
358
    foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla)
359
      WX_CLEAR_LIB(WX_${LIB}${_DBG})
360
    endforeach()
361

362
    # Clear wxWidgets multilib base libraries.
363
    WX_CLEAR_LIB(WX_base${_DBG})
364
    foreach(LIB net odbc xml)
365
      WX_CLEAR_LIB(WX_${LIB}${_DBG})
366
    endforeach()
367

368
    # Clear wxWidgets monolithic library.
369
370
    WX_CLEAR_LIB(WX_mono${_DBG})

371
    # Clear wxWidgets multilib libraries.
372
    foreach(LIB core adv aui html media xrc dbgrid gl qa richtext
373
                webview stc ribbon propgrid)
374
      WX_CLEAR_LIB(WX_${LIB}${_DBG})
375
376
    endforeach()
  endmacro()
377
  # Clear all wxWidgets debug libraries.
378
  macro(WX_CLEAR_ALL_DBG_LIBS)
379
    WX_CLEAR_ALL_LIBS("d")
380
  endmacro()
381
  # Clear all wxWidgets release libraries.
382
  macro(WX_CLEAR_ALL_REL_LIBS)
383
    WX_CLEAR_ALL_LIBS("")
384
  endmacro()
385
386
387
388
389

  #
  # Set the wxWidgets_LIBRARIES variable.
  # Also, Sets output variable wxWidgets_FOUND to FALSE if it fails.
  #
390
  macro(WX_SET_LIBRARIES _LIBS _DBG)
391
    DBG_MSG_V("Looking for ${${_LIBS}}")
392
393
    if(WX_USE_REL_AND_DBG)
      foreach(LIB ${${_LIBS}})
394
395
396
        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}")
397
        if(WX_${LIB} AND WX_${LIB}d)
398
          DBG_MSG_V("Found ${LIB} and ${LIB}d")
399
          list(APPEND wxWidgets_LIBRARIES
400
            debug ${WX_${LIB}d} optimized ${WX_${LIB}}
401
            )
402
          set(wxWidgets_${LIB}_FOUND TRUE)
403
404
        elseif(NOT wxWidgets_FIND_REQUIRED_${LIB})
          DBG_MSG_V("- ignored optional missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}")
405
        else()
406
          DBG_MSG_V("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}")
407
          set(wxWidgets_FOUND FALSE)
408
409
410
        endif()
      endforeach()
    else()
411
      foreach(LIB ${${_LIBS}})
412
413
        DBG_MSG_V("Searching for ${LIB}${_DBG}")
        DBG_MSG_V("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}")
414
        if(WX_${LIB}${_DBG})
415
          DBG_MSG_V("Found ${LIB}${_DBG}")
416
          list(APPEND wxWidgets_LIBRARIES ${WX_${LIB}${_DBG}})
417
          set(wxWidgets_${LIB}_FOUND TRUE)
418
419
        elseif(NOT wxWidgets_FIND_REQUIRED_${LIB})
          DBG_MSG_V("- ignored optional missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}")
420
        else()
421
          DBG_MSG_V("- not found due to missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}")
422
          set(wxWidgets_FOUND FALSE)
423
424
425
        endif()
      endforeach()
    endif()
426

427
    DBG_MSG_V("OpenGL")
428
429
    list(FIND ${_LIBS} gl WX_USE_GL)
    if(NOT WX_USE_GL EQUAL -1)
430
      DBG_MSG_V("- is required.")
431
      list(APPEND wxWidgets_LIBRARIES opengl32 glu32)
432
    endif()
433

434
    list(APPEND wxWidgets_LIBRARIES winmm comctl32 uuid oleacc uxtheme rpcrt4 shlwapi version wsock32)
435
  endmacro()
436

437
  #-------------------------------------------------------------------
438
  # WIN32: Start actual work.
439
440
  #-------------------------------------------------------------------

441
  # Look for an installation tree.
442
  find_path(wxWidgets_ROOT_DIR
443
444
    NAMES include/wx/wx.h
    PATHS
445
446
      ENV wxWidgets_ROOT_DIR
      ENV WXWIN
447
448
449
      "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\wxWidgets_is1;Inno Setup: App Path]"  # WX 2.6.x
      C:/
      D:/
450
      ENV ProgramFiles
451
    PATH_SUFFIXES
Brad King's avatar
Brad King committed
452
      wxWidgets-3.1.0
453
454
      wxWidgets-3.0.2
      wxWidgets-3.0.1
455
456
      wxWidgets-3.0.0
      wxWidgets-2.9.5
457
458
459
460
461
      wxWidgets-2.9.4
      wxWidgets-2.9.3
      wxWidgets-2.9.2
      wxWidgets-2.9.1
      wxWidgets-2.9.0
462
      wxWidgets-2.8.9
463
      wxWidgets-2.8.8
464
      wxWidgets-2.8.7
465
466
467
468
469
470
471
472
473
474
      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
475
      wxWidgets-2.7.1
476
477
      wxWidgets-2.7.0
      wxWidgets-2.7.0-1
478
      wxWidgets-2.6.4
479
480
481
482
483
484
485
486
      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
487
    DOC "wxWidgets base/installation directory"
488
    )
489
490

  # If wxWidgets_ROOT_DIR changed, clear lib dir.
491
492
  if(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR)
    set(WX_ROOT_DIR ${wxWidgets_ROOT_DIR}
493
        CACHE INTERNAL "wxWidgets_ROOT_DIR")
494
    set(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND"
495
        CACHE PATH "Cleared." FORCE)
496
  endif()
497

498
  if(WX_ROOT_DIR)
499
500
501
    # Select one default tree inside the already determined wx tree.
    # Prefer static/shared order usually consistent with build
    # settings.
502
503
504
    set(_WX_TOOL "")
    set(_WX_TOOLVER "")
    set(_WX_ARCH "")
505
    if(MINGW)
506
      set(_WX_TOOL gcc)
507
    elseif(MSVC)
508
      set(_WX_TOOL vc)
509
      set(_WX_TOOLVER ${MSVC_TOOLSET_VERSION})
510
      if(CMAKE_SIZEOF_VOID_P EQUAL 8)
511
        set(_WX_ARCH _x64)
512
      endif()
513
    endif()
514
515
    if(BUILD_SHARED_LIBS)
      find_path(wxWidgets_LIB_DIR
516
        NAMES
517
          qtu/wx/setup.h
518
519
520
521
522
523
524
525
          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
526
        PATHS
527
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_dll   # prefer shared
528
529
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_dll   # prefer shared
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_dll                 # prefer shared
530
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_lib
531
532
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_lib
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_lib
533
        DOC "Path to wxWidgets libraries"
534
535
        NO_DEFAULT_PATH
        )
536
    else()
537
      find_path(wxWidgets_LIB_DIR
538
        NAMES
539
          qtu/wx/setup.h
540
541
542
543
544
545
546
547
          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
548
        PATHS
549
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_lib   # prefer static
550
551
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_lib   # prefer static
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_lib                 # prefer static
552
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}_xp${_WX_ARCH}_dll
553
554
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_TOOLVER}${_WX_ARCH}_dll
        ${WX_ROOT_DIR}/lib/${_WX_TOOL}${_WX_ARCH}_dll
555
        DOC "Path to wxWidgets libraries"
556
557
        NO_DEFAULT_PATH
        )
558
    endif()
559
560
561
    unset(_WX_TOOL)
    unset(_WX_TOOLVER)
    unset(_WX_ARCH)
562
563

    # If wxWidgets_LIB_DIR changed, clear all libraries.
564
565
    if(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR)
      set(WX_LIB_DIR ${wxWidgets_LIB_DIR} CACHE INTERNAL "wxWidgets_LIB_DIR")
566
567
      WX_CLEAR_ALL_DBG_LIBS()
      WX_CLEAR_ALL_REL_LIBS()
568
    endif()
569

570
    if(WX_LIB_DIR)
571
      # If building shared libs, define WXUSINGDLL to use dllimport.
572
      if(WX_LIB_DIR MATCHES "[dD][lL][lL]")
573
        set(wxWidgets_DEFINITIONS WXUSINGDLL)
574
        DBG_MSG_V("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}")
575
      endif()
576

577
      # Search for available configuration types.
578
      foreach(CFG mswunivud mswunivd mswud mswd mswunivu mswuniv mswu msw qt qtd qtu qtud)
579
580
581
582
583
        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})
584
585
        endif()
      endforeach()
586
      DBG_MSG_V("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}")
587

588
589
      if(WX_CONFIGURATION)
        set(wxWidgets_FOUND TRUE)
590

591
592
593
594
        # 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.
595
596
        if(NOT WX_${wxWidgets_CONFIGURATION}_FOUND)
          set(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING
597
            "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
598
        else()
599
          set(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING
600
            "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
601
        endif()
602

603
        # If release config selected, and both release/debug exist.
604
605
        if(WX_${wxWidgets_CONFIGURATION}d_FOUND)
          option(wxWidgets_USE_REL_AND_DBG
606
            "Use release and debug configurations?" TRUE)
607
          set(WX_USE_REL_AND_DBG ${wxWidgets_USE_REL_AND_DBG})
608
        else()
609
          # If the option exists (already in cache), force it false.
610
611
          if(wxWidgets_USE_REL_AND_DBG)
            set(wxWidgets_USE_REL_AND_DBG FALSE CACHE BOOL
612
              "No ${wxWidgets_CONFIGURATION}d found." FORCE)
613
          endif()
614
          set(WX_USE_REL_AND_DBG FALSE)
615
        endif()
616
617

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

        # Set wxWidgets lib setup include directory.
621
622
        if(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h)
          set(wxWidgets_INCLUDE_DIRS
623
            ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION})
624
        else()
625
          DBG_MSG("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exists.")
626
          set(wxWidgets_FOUND FALSE)
627
        endif()
628

629
        # Set wxWidgets main include directory.
630
631
        if(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h)
          list(APPEND wxWidgets_INCLUDE_DIRS ${WX_ROOT_DIR}/include)
632
        else()
633
          DBG_MSG("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h")
634
          set(wxWidgets_FOUND FALSE)
635
        endif()
636

637
        # Find wxWidgets libraries.
638
        WX_FIND_LIBS("${PF}" "${UNV}" "${UCD}" "${DBG}")
639
        if(WX_USE_REL_AND_DBG)
640
          WX_FIND_LIBS("${UNV}" "${UCD}" "d")
641
        endif()
642
643

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

646
        # Add necessary definitions for unicode builds
647
648
        if("${UCD}" STREQUAL "u")
          list(APPEND wxWidgets_DEFINITIONS UNICODE _UNICODE)
649
        endif()
650
651

        # Add necessary definitions for debug builds
652
        set(wxWidgets_DEFINITIONS_DEBUG _DEBUG __WXDEBUG__)
653

654
655
656
      endif()
    endif()
  endif()
657

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

    #
    # Query a boolean configuration option to determine if the system
    # has both builds available. If so, provide the selection option
    # to the user.
    #
698
699
    macro(WX_CONFIG_SELECT_QUERY_BOOL _OPT_NAME _OPT_HELP)
      execute_process(
700
701
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=yes
702
703
704
705
        RESULT_VARIABLE _wx_result_yes
        OUTPUT_QUIET
        ERROR_QUIET
        )
706
      execute_process(
707
708
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=no
709
710
711
712
        RESULT_VARIABLE _wx_result_no
        OUTPUT_QUIET
        ERROR_QUIET
        )
713
714
715
      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}
716
          ${_OPT_HELP} ${wxWidgets_DEFAULT_${_UPPER_OPT_NAME}})
717
      else()
718
        # If option exists (already in cache), force to available one.
719
720
721
        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)
722
          else()
723
            set(wxWidgets_USE_${_UPPER_OPT_NAME} OFF CACHE BOOL ${_OPT_HELP} FORCE)
724
725
726
727
          endif()
        endif()
      endif()
    endmacro()
728

729
    #
730
731
732
    # Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting
    # among multiple builds.
    #
733
734
735
736
737
738
739
    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)
740
          else()
741
            list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no)
742
743
744
745
          endif()
        endif()
      endforeach()
    endmacro()
746
747
748
749

    #-----------------------------------------------------------------
    # UNIX: Start actual work.
    #-----------------------------------------------------------------
750
    # Support cross-compiling, only search in the target platform.
751
    find_program(wxWidgets_CONFIG_EXECUTABLE
752
      NAMES $ENV{WX_CONFIG} wx-config wx-config-3.1 wx-config-3.0 wx-config-2.9 wx-config-2.8
753
      DOC "Location of wxWidgets library configuration provider binary (wx-config)."
754
755
756
      ONLY_CMAKE_FIND_ROOT_PATH
      )

757
758
    if(wxWidgets_CONFIG_EXECUTABLE)
      set(wxWidgets_FOUND TRUE)
759

760
761
762
763
764
765
766
767
768
769
770
771
772
      # 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}")

773
      # run the wx-config program to get cxxflags
774
      execute_process(
775
776
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_SELECT_OPTIONS} --cxxflags
777
        OUTPUT_VARIABLE wxWidgets_CXX_FLAGS
778
        RESULT_VARIABLE RET
779
        ERROR_QUIET
780
        )
781
782
      if(RET EQUAL 0)
        string(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS)
783
        separate_arguments(wxWidgets_CXX_FLAGS_LIST NATIVE_COMMAND "${wxWidgets_CXX_FLAGS}")
784
785
786

        DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")

787
788
789
790
791
792
793
794
795
796
797
798
799
800
        # parse definitions and include dirs from cxxflags
        #   drop the -D and -I prefixes
        set(wxWidgets_CXX_FLAGS)
        foreach(arg IN LISTS wxWidgets_CXX_FLAGS_LIST)
          if("${arg}" MATCHES "^-I(.*)$")
            # include directory
            list(APPEND wxWidgets_INCLUDE_DIRS "${CMAKE_MATCH_1}")
          elseif("${arg}" MATCHES "^-D(.*)$")
            # compile definition
            list(APPEND wxWidgets_DEFINITIONS "${CMAKE_MATCH_1}")
          else()
            list(APPEND wxWidgets_CXX_FLAGS "${arg}")
          endif()
        endforeach()
801
802
803
804

        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}")
805

806
      else()
807
        set(wxWidgets_FOUND FALSE)
808
809
        DBG_MSG_V(
          "${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}")
810
      endif()
811
812
813
814
815

      # 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...
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
      unset(_cmp_req)
      unset(_cmp_opt)
      foreach(_cmp IN LISTS wxWidgets_FIND_COMPONENTS)
        if(wxWidgets_FIND_REQUIRED_${_cmp})
          list(APPEND _cmp_req "${_cmp}")
        else()
          list(APPEND _cmp_opt "${_cmp}")
        endif()
      endforeach()
      DBG_MSG_V("wxWidgets required components : ${_cmp_req}")
      DBG_MSG_V("wxWidgets optional components : ${_cmp_opt}")
      if(DEFINED _cmp_opt)
        string(REPLACE ";" "," _cmp_opt "--optional-libs ${_cmp_opt}")
      endif()
      string(REPLACE ";" "," _cmp_req "${_cmp_req}")
831
      execute_process(
832
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
833
          ${wxWidgets_SELECT_OPTIONS} --libs ${_cmp_req} ${_cmp_opt}
834
        OUTPUT_VARIABLE wxWidgets_LIBRARIES
835
        RESULT_VARIABLE RET
836
        ERROR_QUIET
837
        )
838
839
840
841
      if(RET EQUAL 0)
        string(STRIP "${wxWidgets_LIBRARIES}" wxWidgets_LIBRARIES)
        separate_arguments(wxWidgets_LIBRARIES)
        string(REPLACE "-framework;" "-framework "
842
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
843
        string(REPLACE "-arch;" "-arch "
844
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
845
        string(REPLACE "-isysroot;" "-isysroot "
846
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
847
848

        # extract linkdirs (-L) for rpath (i.e., LINK_DIRECTORIES)
849
        string(REGEX MATCHALL "-L[^;]+"
850
          wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARIES}")
851
        string(REGEX REPLACE "-L([^;]+)" "\\1"
852
853
          wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}")

854
855
856
        DBG_MSG_V("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}")
        DBG_MSG_V("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}")

857
      else()
858
        set(wxWidgets_FOUND FALSE)
859
        DBG_MSG("${wxWidgets_CONFIG_EXECUTABLE} --libs ${_cmp_req} ${_cmp_opt} FAILED with RET=${RET}")
860
      endif()
861
862
      unset(_cmp_req)
      unset(_cmp_opt)
863
    endif()
864

865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
    # When using wx-config in MSYS, the include paths are UNIX style paths which may or may
    # not work correctly depending on you MSYS/MinGW configuration.  CMake expects native
    # paths internally.
    if(wxWidgets_FOUND AND MSYS)
      find_program(_cygpath_exe cygpath ONLY_CMAKE_FIND_ROOT_PATH)
      DBG_MSG_V("_cygpath_exe:  ${_cygpath_exe}")
      if(_cygpath_exe)
        set(_tmp_path "")
        foreach(_path ${wxWidgets_INCLUDE_DIRS})
          execute_process(
            COMMAND cygpath -w ${_path}
            OUTPUT_VARIABLE _native_path
            RESULT_VARIABLE _retv
            OUTPUT_STRIP_TRAILING_WHITESPACE
            ERROR_QUIET
            )
          if(_retv EQUAL 0)
            file(TO_CMAKE_PATH ${_native_path} _native_path)
            DBG_MSG_V("Path ${_path} converted to ${_native_path}")
Daniel Pfeifer's avatar
Daniel Pfeifer committed
884
            string(APPEND _tmp_path " ${_native_path}")
885
886
887
888
889
890
          endif()
        endforeach()
        DBG_MSG("Setting wxWidgets_INCLUDE_DIRS = ${_tmp_path}")
        set(wxWidgets_INCLUDE_DIRS ${_tmp_path})
        separate_arguments(wxWidgets_INCLUDE_DIRS)
        list(REMOVE_ITEM wxWidgets_INCLUDE_DIRS "")
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910

        set(_tmp_path "")
        foreach(_path ${wxWidgets_LIBRARY_DIRS})
          execute_process(
            COMMAND cygpath -w ${_path}
            OUTPUT_VARIABLE _native_path
            RESULT_VARIABLE _retv
            OUTPUT_STRIP_TRAILING_WHITESPACE
            ERROR_QUIET
            )
          if(_retv EQUAL 0)
            file(TO_CMAKE_PATH ${_native_path} _native_path)
            DBG_MSG_V("Path ${_path} converted to ${_native_path}")
            string(APPEND _tmp_path " ${_native_path}")
          endif()
        endforeach()
        DBG_MSG("Setting wxWidgets_LIBRARY_DIRS = ${_tmp_path}")
        set(wxWidgets_LIBRARY_DIRS ${_tmp_path})
        separate_arguments(wxWidgets_LIBRARY_DIRS)
        list(REMOVE_ITEM wxWidgets_LIBRARY_DIRS "")
911
912
913
914
      endif()
      unset(_cygpath_exe CACHE)
    endif()

915
#=====================================================================
916
# Neither UNIX_FIND_STYLE, nor WIN32_FIND_STYLE
917
#=====================================================================
918
  else()
919
920
    if(NOT wxWidgets_FIND_QUIETLY)
      message(STATUS
921
922
        "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): \n"
        "  Platform unknown/unsupported. It's neither WIN32 nor UNIX "
923
        "find style."
924
        )
925
926
927
    endif()
  endif()
endif()
928

929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
# Check that all libraries are present, as wx-config does not check it
set(_wx_lib_missing "")
foreach(_wx_lib_ ${wxWidgets_LIBRARIES})
  if("${_wx_lib_}" MATCHES "^-l(.*)")
    set(_wx_lib_name "${CMAKE_MATCH_1}")
    unset(_wx_lib_found CACHE)
    find_library(_wx_lib_found NAMES ${_wx_lib_name} HINTS ${wxWidgets_LIBRARY_DIRS})
    if(_wx_lib_found STREQUAL _wx_lib_found-NOTFOUND)
      list(APPEND _wx_lib_missing ${_wx_lib_name})
    endif()
    unset(_wx_lib_found CACHE)
  endif()
endforeach()

if (_wx_lib_missing)
  string(REPLACE ";" " " _wx_lib_missing "${_wx_lib_missing}")
  DBG_MSG_V("wxWidgets not found due to following missing libraries: ${_wx_lib_missing}")
  set(wxWidgets_FOUND FALSE)
  unset(wxWidgets_LIBRARIES)
endif()
unset(_wx_lib_missing)

luz.paz's avatar
luz.paz committed
951
# Check if a specific version was requested by find_package().
952
if(wxWidgets_FOUND)
953
954
955
  unset(_wx_filename)
  find_file(_wx_filename wx/version.h PATHS ${wxWidgets_INCLUDE_DIRS} NO_DEFAULT_PATH)
  dbg_msg("_wx_filename:  ${_wx_filename}")
956

957
  if(NOT _wx_filename)
958
959
960
    message(FATAL_ERROR "wxWidgets wx/version.h file not found in ${wxWidgets_INCLUDE_DIRS}.")
  endif()

961
962
  file(READ "${_wx_filename}" _wx_version_h)
  unset(_wx_filename CACHE)
963