FindwxWidgets.cmake 40.1 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
#.rst:
# FindwxWidgets
# -------------
#
# Find a wxWidgets (a.k.a., wxWindows) installation.
#
10
# This module finds if wxWidgets is installed and selects a default
11
12
13
# 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:
14
#
15
# find_package(wxWidgets COMPONENTS core base ...)
16
#
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 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
39
40
41
# debug/release, unicode/ansi, universal/non-universal, and
# static/shared in the QtDialog or ccmake interfaces by turning ON/OFF
# the following variables:
42
#
43
44
45
46
47
48
49
50
# ::
#
#   wxWidgets_USE_DEBUG
#   wxWidgets_USE_UNICODE
#   wxWidgets_USE_UNIVERSAL
#   wxWidgets_USE_STATIC
#
#
51
52
#
# There is also a wxWidgets_CONFIG_OPTIONS variable for all other
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
# 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.
#
#
86
87
#
# Sample usage:
88
89
90
91
92
93
94
95
96
97
98
99
#
# ::
#
#    # 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()
#
#
100
#
101
# If wxWidgets is required (i.e., not an optional part):
102
103
104
105
106
107
108
#
# ::
#
#    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})
109

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

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


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

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

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

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

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

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

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

240
  #-------------------------------------------------------------------
241
  # WIN32: Helper MACROS
242
243
  #-------------------------------------------------------------------
  #
244
245
246
247
  # 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=""
  #
248
249
250
251
252
  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} "")
253
    endif()
254
    string(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}")
255
  endmacro()
256
257
258
259

  #
  # Find libraries associated to a configuration.
  #
260
  macro(WX_FIND_LIBS _UNV _UCD _DBG)
261
262
263
    DBG_MSG_V("m_unv = ${_UNV}")
    DBG_MSG_V("m_ucd = ${_UCD}")
    DBG_MSG_V("m_dbg = ${_DBG}")
264

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

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

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

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

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

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

365
    # Clear wxWidgets monolithic library.
366
367
    WX_CLEAR_LIB(WX_mono${_DBG})

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

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

419
    DBG_MSG_V("OpenGL")
420
421
    list(FIND ${_LIBS} gl WX_USE_GL)
    if(NOT WX_USE_GL EQUAL -1)
422
      DBG_MSG_V("- is required.")
423
      list(APPEND wxWidgets_LIBRARIES opengl32 glu32)
424
    endif()
425

426
    list(APPEND wxWidgets_LIBRARIES winmm comctl32 oleacc rpcrt4 shlwapi version wsock32)
427
  endmacro()
428

429
  #-------------------------------------------------------------------
430
  # WIN32: Start actual work.
431
432
  #-------------------------------------------------------------------

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

  # If wxWidgets_ROOT_DIR changed, clear lib dir.
483
484
  if(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR)
    set(WX_ROOT_DIR ${wxWidgets_ROOT_DIR}
485
        CACHE INTERNAL "wxWidgets_ROOT_DIR")
486
    set(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND"
487
        CACHE PATH "Cleared." FORCE)
488
  endif()
489

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

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

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

567
      # Search for available configuration types.
568
569
570
571
572
573
      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})
574
575
        endif()
      endforeach()
576
      DBG_MSG_V("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}")
577

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

581
582
583
584
        # 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.
585
586
        if(NOT WX_${wxWidgets_CONFIGURATION}_FOUND)
          set(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING
587
            "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
588
        else()
589
          set(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING
590
            "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE)
591
        endif()
592

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

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

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

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

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

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

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

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

644
645
646
      endif()
    endif()
  endif()
647

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

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

719
    #
720
721
722
    # Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting
    # among multiple builds.
    #
723
724
725
726
727
728
729
    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)
730
          else()
731
            list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no)
732
733
734
735
          endif()
        endif()
      endforeach()
    endmacro()
736
737
738
739

    #-----------------------------------------------------------------
    # UNIX: Start actual work.
    #-----------------------------------------------------------------
740
    # Support cross-compiling, only search in the target platform.
741
    find_program(wxWidgets_CONFIG_EXECUTABLE
742
      NAMES $ENV{WX_CONFIG} wx-config wx-config-3.1 wx-config-3.0 wx-config-2.9 wx-config-2.8
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
      if(RET EQUAL 0)
        string(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS)
773
        separate_arguments(wxWidgets_CXX_FLAGS_LIST NATIVE_COMMAND "${wxWidgets_CXX_FLAGS}")
774
775
776

        DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}")

777
778
779
780
781
782
783
784
785
786
787
788
789
790
        # 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()
791
792
793
794

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

796
      else()
797
        set(wxWidgets_FOUND FALSE)
798
799
        DBG_MSG_V(
          "${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}")
800
      endif()
801
802
803
804
805

      # 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...
806
      string(REPLACE ";" ","
807
        wxWidgets_FIND_COMPONENTS "${wxWidgets_FIND_COMPONENTS}")
808
      execute_process(
809
810
        COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}"
          ${wxWidgets_SELECT_OPTIONS} --libs ${wxWidgets_FIND_COMPONENTS}
811
        OUTPUT_VARIABLE wxWidgets_LIBRARIES
812
        RESULT_VARIABLE RET
813
        ERROR_QUIET
814
        )
815
816
817
818
      if(RET EQUAL 0)
        string(STRIP "${wxWidgets_LIBRARIES}" wxWidgets_LIBRARIES)
        separate_arguments(wxWidgets_LIBRARIES)
        string(REPLACE "-framework;" "-framework "
819
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
820
        string(REPLACE "-arch;" "-arch "
821
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
822
        string(REPLACE "-isysroot;" "-isysroot "
823
          wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}")
824
825

        # extract linkdirs (-L) for rpath (i.e., LINK_DIRECTORIES)
826
        string(REGEX MATCHALL "-L[^;]+"
827
          wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARIES}")
828
        string(REGEX REPLACE "-L([^;]+)" "\\1"
829
830
          wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}")

831
832
833
        DBG_MSG_V("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}")
        DBG_MSG_V("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}")

834
      else()
835
        set(wxWidgets_FOUND FALSE)
836
        DBG_MSG("${wxWidgets_CONFIG_EXECUTABLE} --libs ${wxWidgets_FIND_COMPONENTS} FAILED with RET=${RET}")
837
838
      endif()
    endif()
839

840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
    # 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
859
            string(APPEND _tmp_path " ${_native_path}")
860
861
862
863
864
865
          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 "")
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885

        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 "")
886
887
888
889
      endif()
      unset(_cygpath_exe CACHE)
    endif()

890
#=====================================================================
891
# Neither UNIX_FIND_STYLE, nor WIN32_FIND_STYLE
892
#=====================================================================
893
  else()
894
895
    if(NOT wxWidgets_FIND_QUIETLY)
      message(STATUS
896
897
        "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): \n"
        "  Platform unknown/unsupported. It's neither WIN32 nor UNIX "
898
        "find style."
899
        )
900
901
902
    endif()
  endif()
endif()
903

904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
# 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
926
# Check if a specific version was requested by find_package().
927
if(wxWidgets_FOUND)
928
929
930
  unset(_wx_filename)
  find_file(_wx_filename wx/version.h PATHS ${wxWidgets_INCLUDE_DIRS} NO_DEFAULT_PATH)
  dbg_msg("_wx_filename:  ${_wx_filename}")
931

932
  if(NOT _wx_filename)
933
934
935
    message(FATAL_ERROR "wxWidgets wx/version.h file not found in ${wxWidgets_INCLUDE_DIRS}.")
  endif()

936
937
  file(READ "${_wx_filename}" _wx_version_h)
  unset(_wx_filename CACHE)
938
939
940
941
942
943
944
945
946
947
948
949

  string(REGEX REPLACE "^(.*\n)?#define +wxMAJOR_VERSION +([0-9]+).*"
    "\\2" wxWidgets_VERSION_MAJOR "${_wx_version_h}" )
  string(REGEX REPLACE "^(.*\n)?#define +wxMINOR_VERSION +([0-9]+).*"
    "\\2" wxWidgets_VERSION_MINOR "${_wx_version_h}" )
  string(REGEX REPLACE "^(.*\n)?#define +wxRELEASE_NUMBER +([0-9]+).*"
    "\\2" wxWidgets_VERSION_PATCH "${_wx_version_h}" )
  set(wxWidgets_VERSION_STRING
    "${wxWidgets_VERSION_MAJOR}.${wxWidgets_VERSION_MINOR}.${wxWidgets_VERSION_PATCH}" )
  dbg_msg("wxWidgets_VERSION_STRING:    ${wxWidgets_VERSION_STRING}")
endif()

950
# Debug output:
951
952
953
DBG_MSG("wxWidgets_FOUND           : ${wxWidgets_FOUND}")
DBG_MSG("wxWidgets_INCLUDE_DIRS    : ${wxWidgets_INCLUDE_DIRS}")
DBG_MSG("wxWidgets_LIBRARY_DIRS    : ${wxWidgets_LIBRARY_DIRS}")
954
DBG_MSG("wxWidgets_LIBRARIES       : ${wxWidgets_LIBRARIES}")
955
956
957
958
959
DBG_MSG("wxWidgets_CXX_FLAGS       : ${wxWidgets_CXX_FLAGS}")
DBG_MSG("wxWidgets_USE_FILE        : ${wxWidgets_USE_FILE}")

#=====================================================================
#=====================================================================
960

961
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
962
963
964
965
966

find_package_handle_standard_args(wxWidgets
  REQUIRED_VARS wxWidgets_LIBRARIES wxWidgets_INCLUDE_DIRS
  VERSION_VAR   wxWidgets_VERSION_STRING
  )
967
968
969
970
971
972
973
974
975
976

#=====================================================================
# 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:
#
# wxWidgets_wxrc_EXECUTABLE
#=====================================================================

# Resource file compiler.
977
978
979
find_program(wxWidgets_wxrc_EXECUTABLE
  NAMES $ENV{WXRC_CMD} wxrc
  PATHS ${wxWidgets_ROOT_DIR}/utils/wxrc/vc_msw
980
  DOC "Location of wxWidgets resource file compiler binary (wxrc)"
981
982
  )

983
#