with msvc, replace va_copy by assigning the va_lists (cherry picked from commit 42d61...
[platform/upstream/dbus.git] / cmake / modules / FindQt4.cmake
1 # - Find QT 4
2 # This module can be used to find Qt4.
3 # The most important issue is that the Qt4 qmake is available via the system path.
4 # This qmake is then used to detect basically everything else.
5 # This module defines a number of key variables and macros. First is 
6 # QT_USE_FILE which is the path to a CMake file that can be included to compile
7 # Qt 4 applications and libraries.  By default, the QtCore and QtGui 
8 # libraries are loaded. This behavior can be changed by setting one or more 
9 # of the following variables to true:
10 #                    QT_DONT_USE_QTCORE
11 #                    QT_DONT_USE_QTGUI
12 #                    QT_USE_QT3SUPPORT
13 #                    QT_USE_QTASSISTANT
14 #                    QT_USE_QTDESIGNER
15 #                    QT_USE_QTMOTIF
16 #                    QT_USE_QTMAIN
17 #                    QT_USE_QTNETWORK
18 #                    QT_USE_QTNSPLUGIN
19 #                    QT_USE_QTOPENGL
20 #                    QT_USE_QTSQL
21 #                    QT_USE_QTXML
22 # All the libraries required are stored in a variable called QT_LIBRARIES.  
23 # Add this variable to your TARGET_LINK_LIBRARIES.
24 #  
25 #  macro QT4_WRAP_CPP(outfiles inputfile ... )
26 #  macro QT4_WRAP_UI(outfiles inputfile ... )
27 #  macro QT4_ADD_RESOURCE(outfiles inputfile ... )
28 #  macro QT4_AUTOMOC(inputfile ... )
29 #  macro QT4_GENERATE_MOC(inputfile outputfile )
30 #
31 #  macro QT4_ADD_DBUS_INTERFACE(outfiles interface basename)
32 #        create a the interface header and implementation files with the 
33 #        given basename from the given interface xml file and add it to 
34 #        the list of sources
35 #
36 #  macro QT4_ADD_DBUS_INTERFACES(outfiles inputfile ... )
37 #        create the interface header and implementation files 
38 #        for all listed interface xml files
39 #        the name will be automatically determined from the name of the xml file
40 #
41 #  macro QT4_ADD_DBUS_ADAPTOR(outfiles xmlfile parentheader parentclassname [basename] )
42 #        create a dbus adaptor (header and implementation file) from the xml file
43 #        describing the interface, and add it to the list of sources. The adaptor
44 #        forwards the calls to a parent class, defined in parentheader and named
45 #        parentclassname. The name of the generated files will be
46 #        <basename>adaptor.{cpp,h} where basename is the basename of the xml file.
47 #
48 #  macro QT4_GENERATE_DBUS_INTERFACE( header)
49 #        generate the xml interface file from the given header
50 #
51 #  QT_FOUND         If false, don't try to use Qt.
52 #  QT4_FOUND        If false, don't try to use Qt 4.
53 #
54 #  QT_QTCORE_FOUND        True if QtCore was found.
55 #  QT_QTGUI_FOUND         True if QtGui was found.
56 #  QT_QT3SUPPORT_FOUND    True if Qt3Support was found.
57 #  QT_QTASSISTANT_FOUND   True if QtAssistant was found.
58 #  QT_QTDBUS_FOUND        True if QtDBus was found.
59 #  QT_QTDESIGNER_FOUND    True if QtDesigner was found.
60 #  QT_QTMOTIF_FOUND       True if QtMotif was found.
61 #  QT_QTNETWORK_FOUND     True if QtNetwork was found.
62 #  QT_QTNSPLUGIN_FOUND    True if QtNsPlugin was found.
63 #  QT_QTOPENGL_FOUND      True if QtOpenGL was found.
64 #  QT_QTSQL_FOUND         True if QtSql was found.
65 #  QT_QTXML_FOUND         True if QtXml was found.
66 #  QT_QTSVG_FOUND         True if QtSvg was found.
67 #  QT_QTTEST_FOUND        True if QtTest was found.
68 #                      
69 #  QT_DEFINITIONS   Definitions to use when compiling code that uses Qt.
70 #                  
71 #  QT_INCLUDES      List of paths to all include directories of 
72 #                   Qt4 QT_INCLUDE_DIR and QT_QTCORE_INCLUDE_DIR are
73 #                   always in this variable even if NOTFOUND,
74 #                   all other INCLUDE_DIRS are
75 #                   only added if they are found.
76 #   
77 #  QT_INCLUDE_DIR              Path to "include" of Qt4
78 #  QT_QT_INCLUDE_DIR           Path to "include/Qt" 
79 #  QT_QT3SUPPORT_INCLUDE_DIR   Path to "include/Qt3Support" 
80 #  QT_QTASSISTANT_INCLUDE_DIR  Path to "include/QtAssistant" 
81 #  QT_QTCORE_INCLUDE_DIR       Path to "include/QtCore"         
82 #  QT_QTDESIGNER_INCLUDE_DIR   Path to "include/QtDesigner" 
83 #  QT_QTDBUS_INCLUDE_DIR       Path to "include/QtDBus" 
84 #  QT_QTGUI_INCLUDE_DIR        Path to "include/QtGui" 
85 #  QT_QTMOTIF_INCLUDE_DIR      Path to "include/QtMotif" 
86 #  QT_QTNETWORK_INCLUDE_DIR    Path to "include/QtNetwork" 
87 #  QT_QTNSPLUGIN_INCLUDE_DIR   Path to "include/QtNsPlugin" 
88 #  QT_QTOPENGL_INCLUDE_DIR     Path to "include/QtOpenGL" 
89 #  QT_QTSQL_INCLUDE_DIR        Path to "include/QtSql" 
90 #  QT_QTXML_INCLUDE_DIR        Path to "include/QtXml" 
91 #  QT_QTSVG_INCLUDE_DIR        Path to "include/QtSvg"
92 #  QT_QTTEST_INCLUDE_DIR       Path to "include/QtTest"
93 #                            
94 #  QT_LIBRARY_DIR              Path to "lib" of Qt4
95 #                            
96 # For every library of Qt there are three variables:
97 #  QT_QTFOO_LIBRARY_RELEASE, which contains the full path to the release version
98 #  QT_QTFOO_LIBRARY_DEBUG, which contains the full path to the debug version
99 #  QT_QTFOO_LIBRARY, the full path to the release version if available, otherwise to the debug version
100 #
101 # So there are the following variables:
102 # The Qt3Support library:     QT_QT3SUPPORT_LIBRARY
103 #                             QT_QT3SUPPORT_LIBRARY_RELEASE
104 #                             QT_QT3SUPPORT_DEBUG
105 #
106 # The QtAssistant library:    QT_QTASSISTANT_LIBRARY
107 #                             QT_QTASSISTANT_LIBRARY_RELEASE
108 #                             QT_QTASSISTANT_LIBRARY_DEBUG
109 #
110 # The QtCore library:         QT_QTCORE_LIBRARY
111 #                             QT_QTCORE_LIBRARY_RELEASE
112 #                             QT_QTCORE_LIBRARY_DEBUG
113 #
114 # The QtDBus library:         QT_QTDBUS_LIBRARY
115 #                             QT_QTDBUS_LIBRARY_RELEASE
116 #                             QT_QTDBUS_LIBRARY_DEBUG
117 #
118 # The QtDesigner library:     QT_QTDESIGNER_LIBRARY
119 #                             QT_QTDESIGNER_LIBRARY_RELEASE
120 #                             QT_QTDESIGNER_LIBRARY_DEBUG
121 #
122 # The QtGui library:          QT_QTGUI_LIBRARY
123 #                             QT_QTGUI_LIBRARY_RELEASE
124 #                             QT_QTGUI_LIBRARY_DEBUG
125 #
126 # The QtMotif library:        QT_QTMOTIF_LIBRARY
127 #                             QT_QTMOTIF_LIBRARY_RELEASE
128 #                             QT_QTMOTIF_LIBRARY_DEBUG
129 #
130 # The QtNetwork library:      QT_QTNETWORK_LIBRARY
131 #                             QT_QTNETWORK_LIBRARY_RELEASE
132 #                             QT_QTNETWORK_LIBRARY_DEBUG
133 #
134 # The QtNsPLugin library:     QT_QTNSPLUGIN_LIBRARY
135 #                             QT_QTNSPLUGIN_LIBRARY_RELEASE
136 #                             QT_QTNSPLUGIN_LIBRARY_DEBUG
137 #
138 # The QtOpenGL library:       QT_QTOPENGL_LIBRARY
139 #                             QT_QTOPENGL_LIBRARY_RELEASE
140 #                             QT_QTOPENGL_LIBRARY_DEBUG
141 #
142 # The QtSql library:          QT_QTSQL_LIBRARY
143 #                             QT_QTSQL_LIBRARY_RELEASE
144 #                             QT_QTSQL_LIBRARY_DEBUG
145 #
146 # The QtXml library:          QT_QTXML_LIBRARY
147 #                             QT_QTXML_LIBRARY_RELEASE
148 #                             QT_QTXML_LIBRARY_DEBUG
149 #
150 # The QtSvg library:          QT_QTSVG_LIBRARY
151 #                             QT_QTSVG_LIBRARY_RELEASE
152 #                             QT_QTSVG_LIBRARY_DEBUG
153 #
154 # The QtTest library:         QT_QTTEST_LIBRARY
155 #                             QT_QTTEST_LIBRARY_RELEASE
156 #                             QT_QTTEST_LIBRARY_DEBUG
157 #
158 # The qtmain library for Windows QT_QTMAIN_LIBRARY
159 #                             QT_QTMAIN_LIBRARY_RELEASE
160 #                             QT_QTMAIN_LIBRARY_DEBUG
161 #
162 #The QtUiTools library:       QT_QTUITOOLS_LIBRARY
163 #                             QT_QTUITOOLS_LIBRARY_RELEASE
164 #                             QT_QTUITOOLS_LIBRARY_DEBUG
165 #  
166 # also defined, but NOT for general use are
167 #  QT_MOC_EXECUTABLE          Where to find the moc tool.
168 #  QT_UIC_EXECUTABLE          Where to find the uic tool.
169 #  QT_UIC3_EXECUTABLE         Where to find the uic3 tool.
170 #  QT_RCC_EXECUTABLE          Where to find the rcc tool
171 #  QT_DBUSCPP2XML_EXECUTABLE  Where to find the dbuscpp2xml tool.
172 #  QT_DBUSXML2CPP_EXECUTABLE  Where to find the dbusxml2cpp tool.
173 #  
174 #  QT_DOC_DIR                 Path to "doc" of Qt4
175 #  QT_MKSPECS_DIR             Path to "mkspecs" of Qt4
176 #
177 #
178 # These are around for backwards compatibility 
179 # they will be set
180 #  QT_WRAP_CPP  Set true if QT_MOC_EXECUTABLE is found
181 #  QT_WRAP_UI   Set true if QT_UIC_EXECUTABLE is found
182 #  
183 # These variables do _NOT_ have any effect anymore (compared to FindQt.cmake)
184 #  QT_MT_REQUIRED         Qt4 is now always multithreaded
185 #  
186 # These variables are set to "" Because Qt structure changed 
187 # (They make no sense in Qt4)
188 #  QT_QT_LIBRARY        Qt-Library is now split
189
190 INCLUDE(CheckSymbolExists)
191 INCLUDE(MacroAddFileDependencies)
192
193 SET(QT_USE_FILE ${CMAKE_ROOT}/Modules/UseQt4.cmake)
194
195 SET( QT_DEFINITIONS "")
196
197 IF (WIN32)
198   SET(QT_DEFINITIONS -DQT_DLL)
199 ENDIF(WIN32)
200
201 # check for qmake
202 FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake qmake-qt4 PATHS
203   "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/bin"
204   "[HKEY_CURRENT_USER\\Software\\Trolltech\\Versions\\4.0.0;InstallDir]/bin"
205   $ENV{QTDIR}/bin
206 )
207
208 SET(QT4_INSTALLED_VERSION_TOO_OLD FALSE)
209
210
211 IF (QT_QMAKE_EXECUTABLE)
212
213    SET(QT4_QMAKE_FOUND FALSE)
214    
215    EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE} ARGS "-query QT_VERSION" OUTPUT_VARIABLE QTVERSION)
216
217    # check that we found the Qt4 qmake, Qt3 qmake output won't match here
218    STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" qt_version_tmp "${QTVERSION}")
219    IF (qt_version_tmp)
220
221       # we need at least version 4.0.0
222       IF (NOT QT_MIN_VERSION)
223          SET(QT_MIN_VERSION "4.0.0")
224       ENDIF (NOT QT_MIN_VERSION)
225    
226       #now parse the parts of the user given version string into variables
227       STRING(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" req_qt_major_vers "${QT_MIN_VERSION}")
228       IF (NOT req_qt_major_vers)
229          MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT_MIN_VERSION}\", expected e.g. \"4.0.1\"")
230       ENDIF (NOT req_qt_major_vers)
231    
232       # now parse the parts of the user given version string into variables
233       STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_qt_major_vers "${QT_MIN_VERSION}")
234       STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" req_qt_minor_vers "${QT_MIN_VERSION}")
235       STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_qt_patch_vers "${QT_MIN_VERSION}")
236    
237       IF (NOT req_qt_major_vers EQUAL 4)
238          MESSAGE( FATAL_ERROR "Invalid Qt version string given: \"${QT_MIN_VERSION}\", major version 4 is required, e.g. \"4.0.1\"")
239       ENDIF (NOT req_qt_major_vers EQUAL 4)
240    
241       # and now the version string given by qmake
242       STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_qt_major_vers "${QTVERSION}")
243       STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+.*" "\\1" found_qt_minor_vers "${QTVERSION}")
244       STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_qt_patch_vers "${QTVERSION}")
245    
246       # compute an overall version number which can be compared at once
247       MATH(EXPR req_vers "${req_qt_major_vers}*10000 + ${req_qt_minor_vers}*100 + ${req_qt_patch_vers}")
248       MATH(EXPR found_vers "${found_qt_major_vers}*10000 + ${found_qt_minor_vers}*100 + ${found_qt_patch_vers}")
249    
250       IF (found_vers LESS req_vers)
251          SET(QT4_QMAKE_FOUND FALSE)
252          SET(QT4_INSTALLED_VERSION_TOO_OLD TRUE)
253       ELSE (found_vers LESS req_vers)
254     SET(QT4_QMAKE_FOUND TRUE)
255       ENDIF (found_vers LESS req_vers)
256
257    ENDIF (qt_version_tmp)
258
259 ENDIF (QT_QMAKE_EXECUTABLE)
260
261 IF (QT4_QMAKE_FOUND)
262
263   # ask qmake for the library dir
264   # Set QT_LIBRARY_DIR
265   IF (NOT QT_LIBRARY_DIR)
266     EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
267       ARGS "-query QT_INSTALL_LIBS"
268       OUTPUT_VARIABLE QT_LIBRARY_DIR_TMP )
269     IF(EXISTS "${QT_LIBRARY_DIR_TMP}")
270       SET(QT_LIBRARY_DIR ${QT_LIBRARY_DIR_TMP} CACHE PATH "Qt library dir")
271     ELSE(EXISTS "${QT_LIBRARY_DIR_TMP}")
272       MESSAGE("Warning: QT_QMAKE_EXECUTABLE reported QT_INSTALL_LIBS as ${QT_LIBRARY_DIR_TMP}")
273        MESSAGE("Warning: ${QT_LIBRARY_DIR_TMP} does NOT exist, Qt must NOT be installed correctly.")
274     ENDIF(EXISTS "${QT_LIBRARY_DIR_TMP}")
275   ENDIF(NOT QT_LIBRARY_DIR)
276   
277   IF (APPLE)
278     IF (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework)
279       SET(QT_USE_FRAMEWORKS ON
280         CACHE BOOL "Set to ON if Qt build uses frameworks.")
281     ELSE (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework)
282       SET(QT_USE_FRAMEWORKS OFF
283         CACHE BOOL "Set to ON if Qt build uses frameworks.")
284     ENDIF (EXISTS ${QT_LIBRARY_DIR}/QtCore.framework)
285     
286     MARK_AS_ADVANCED(QT_USE_FRAMEWORKS)
287   ENDIF (APPLE)
288   
289   # ask qmake for the binary dir
290   IF (NOT QT_BINARY_DIR)
291      EXEC_PROGRAM(${QT_QMAKE_EXECUTABLE}
292         ARGS "-query QT_INSTALL_BINS"
293         OUTPUT_VARIABLE qt_bins )
294      SET(QT_BINARY_DIR ${qt_bins} CACHE INTERNAL "")
295   ENDIF (NOT QT_BINARY_DIR)
296
297   # ask qmake for the include dir
298   IF (NOT QT_HEADERS_DIR)
299       EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
300         ARGS "-query QT_INSTALL_HEADERS" 
301         OUTPUT_VARIABLE qt_headers )
302       SET(QT_HEADERS_DIR ${qt_headers} CACHE INTERNAL "")
303   ENDIF(NOT QT_HEADERS_DIR)
304
305
306   # ask qmake for the documentation directory
307   IF (NOT QT_DOC_DIR)
308     EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
309       ARGS "-query QT_INSTALL_DOCS"
310       OUTPUT_VARIABLE qt_doc_dir )
311     SET(QT_DOC_DIR ${qt_doc_dir} CACHE PATH "The location of the Qt docs")
312   ENDIF (NOT QT_DOC_DIR)
313
314   # ask qmake for the mkspecs directory
315   IF (NOT QT_MKSPECS_DIR)
316     EXEC_PROGRAM( ${QT_QMAKE_EXECUTABLE}
317       ARGS "-query QMAKE_MKSPECS"
318       OUTPUT_VARIABLE qt_mkspecs_dir )
319     SET(QT_MKSPECS_DIR ${qt_mkspecs_dir} CACHE PATH "The location of the Qt mkspecs")
320   ENDIF (NOT QT_MKSPECS_DIR)
321
322   ########################################
323   #
324   #       Setting the INCLUDE-Variables
325   #
326   ########################################
327
328   FIND_PATH(QT_QTCORE_INCLUDE_DIR QtGlobal
329     "[HKEY_CURRENT_USER\\Software\\Trolltech\\Qt3Versions\\4.0.0;InstallDir]/include/QtCore"
330     ${QT_HEADERS_DIR}/QtCore
331     ${QT_LIBRARY_DIR}/QtCore.framework/Headers
332     $ENV{QTDIR}/include/QtCore
333     "$ENV{ProgramFiles}/qt/include/Qt"
334    )
335
336   # Set QT_INCLUDE_DIR by removine "/QtCore" in the string ${QT_QTCORE_INCLUDE_DIR}
337   IF( QT_QTCORE_INCLUDE_DIR AND NOT QT_INCLUDE_DIR)
338     IF (QT_USE_FRAMEWORKS)
339       SET(QT_INCLUDE_DIR ${QT_HEADERS_DIR})
340     ELSE (QT_USE_FRAMEWORKS)
341       STRING( REGEX REPLACE "/QtCore$" "" qt4_include_dir ${QT_QTCORE_INCLUDE_DIR})
342       SET( QT_INCLUDE_DIR ${qt4_include_dir} CACHE PATH "")
343     ENDIF (QT_USE_FRAMEWORKS)
344   ENDIF( QT_QTCORE_INCLUDE_DIR AND NOT QT_INCLUDE_DIR)
345
346   IF( NOT QT_INCLUDE_DIR)
347     IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
348       MESSAGE( FATAL_ERROR "Could NOT find QtGlobal header")
349     ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
350   ENDIF( NOT QT_INCLUDE_DIR)
351
352   #############################################
353   #
354   # Find out what window system we're using
355   #
356   #############################################
357   # Save required includes variable
358   SET(CMAKE_REQUIRED_INCLUDES_SAVE ${CMAKE_REQUIRED_INCLUDES})
359   # Add QT_INCLUDE_DIR to CMAKE_REQUIRED_INCLUDES
360   SET(CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES};${QT_INCLUDE_DIR}")
361   # Check for Window system symbols (note: only one should end up being set)
362   CHECK_SYMBOL_EXISTS(Q_WS_X11 "QtCore/qglobal.h" Q_WS_X11)
363   CHECK_SYMBOL_EXISTS(Q_WS_MAC "QtCore/qglobal.h" Q_WS_MAC)
364   CHECK_SYMBOL_EXISTS(Q_WS_WIN "QtCore/qglobal.h" Q_WS_WIN)
365
366   IF (QT_QTCOPY_REQUIRED)
367      CHECK_SYMBOL_EXISTS(QT_IS_QTCOPY "QtCore/qglobal.h" QT_KDE_QT_COPY)
368      IF (NOT QT_IS_QTCOPY)
369         MESSAGE(FATAL_ERROR "qt-copy is required, but hasn't been found")
370      ENDIF (NOT QT_IS_QTCOPY)
371   ENDIF (QT_QTCOPY_REQUIRED)
372
373   # Restore CMAKE_REQUIRED_INCLUDES variable
374   SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_SAVE})
375   #
376   #############################################
377
378   IF (QT_USE_FRAMEWORKS)
379     SET(QT_DEFINITIONS ${QT_DEFINITIONS} -F${QT_LIBRARY_DIR} -L${QT_LIBRARY_DIR} )
380   ENDIF (QT_USE_FRAMEWORKS)
381
382   # Set QT_QT3SUPPORT_INCLUDE_DIR
383   FIND_PATH(QT_QT3SUPPORT_INCLUDE_DIR Qt3Support
384     PATHS
385     ${QT_INCLUDE_DIR}/Qt3Support
386     ${QT_LIBRARY_DIR}/Qt3Support.framework/Headers
387     NO_DEFAULT_PATH
388     )
389
390   # Set QT_QT_INCLUDE_DIR
391   FIND_PATH(QT_QT_INCLUDE_DIR qglobal.h
392     PATHS
393     ${QT_INCLUDE_DIR}/Qt
394     ${QT_LIBRARY_DIR}/QtCore.framework/Headers
395     NO_DEFAULT_PATH
396     )
397
398   # Set QT_QTGUI_INCLUDE_DIR
399   FIND_PATH(QT_QTGUI_INCLUDE_DIR QtGui
400     PATHS
401     ${QT_INCLUDE_DIR}/QtGui
402     ${QT_LIBRARY_DIR}/QtGui.framework/Headers
403     NO_DEFAULT_PATH
404     )
405
406   # Set QT_QTSVG_INCLUDE_DIR
407   FIND_PATH(QT_QTSVG_INCLUDE_DIR QtSvg
408     PATHS
409     ${QT_INCLUDE_DIR}/QtSvg
410     ${QT_LIBRARY_DIR}/QtSvg.framework/Headers
411     NO_DEFAULT_PATH
412     )
413
414   # Set QT_QTTEST_INCLUDE_DIR
415   FIND_PATH(QT_QTTEST_INCLUDE_DIR QtTest
416     PATHS
417     ${QT_INCLUDE_DIR}/QtTest
418     ${QT_LIBRARY_DIR}/QtTest.framework/Headers
419     NO_DEFAULT_PATH
420     )
421
422   # Set QT_QTUITOOLS_INCLUDE_DIR
423   FIND_PATH(QT_QTUITOOLS_INCLUDE_DIR QtUiTools
424     PATHS
425     ${QT_INCLUDE_DIR}/QtUiTools
426     ${QT_LIBRARY_DIR}/QtUiTools.framework/Headers
427     NO_DEFAULT_PATH
428     )
429
430
431
432   # Set QT_QTMOTIF_INCLUDE_DIR
433   IF(Q_WS_X11)
434     FIND_PATH(QT_QTMOTIF_INCLUDE_DIR QtMotif PATHS ${QT_INCLUDE_DIR}/QtMotif NO_DEFAULT_PATH )
435   ENDIF(Q_WS_X11)
436
437   # Set QT_QTNETWORK_INCLUDE_DIR
438   FIND_PATH(QT_QTNETWORK_INCLUDE_DIR QtNetwork
439     PATHS
440     ${QT_INCLUDE_DIR}/QtNetwork
441     ${QT_LIBRARY_DIR}/QtNetwork.framework/Headers
442     NO_DEFAULT_PATH
443     )
444
445   # Set QT_QTNSPLUGIN_INCLUDE_DIR
446   FIND_PATH(QT_QTNSPLUGIN_INCLUDE_DIR QtNsPlugin
447     PATHS
448     ${QT_INCLUDE_DIR}/QtNsPlugin
449     ${QT_LIBRARY_DIR}/QtNsPlugin.framework/Headers
450     NO_DEFAULT_PATH
451     )
452
453   # Set QT_QTOPENGL_INCLUDE_DIR
454   FIND_PATH(QT_QTOPENGL_INCLUDE_DIR QtOpenGL
455     PATHS
456     ${QT_INCLUDE_DIR}/QtOpenGL
457     ${QT_LIBRARY_DIR}/QtOpenGL.framework/Headers
458     NO_DEFAULT_PATH
459     )
460
461   # Set QT_QTSQL_INCLUDE_DIR
462   FIND_PATH(QT_QTSQL_INCLUDE_DIR QtSql
463     PATHS
464     ${QT_INCLUDE_DIR}/QtSql
465     ${QT_LIBRARY_DIR}/QtSql.framework/Headers
466     NO_DEFAULT_PATH
467     )
468
469   # Set QT_QTXML_INCLUDE_DIR
470   FIND_PATH(QT_QTXML_INCLUDE_DIR QtXml
471     PATHS
472     ${QT_INCLUDE_DIR}/QtXml
473     ${QT_LIBRARY_DIR}/QtXml.framework/Headers
474     NO_DEFAULT_PATH
475     )
476
477   # Set QT_QTASSISTANT_INCLUDE_DIR
478   FIND_PATH(QT_QTASSISTANT_INCLUDE_DIR QtAssistant
479     PATHS
480     ${QT_INCLUDE_DIR}/QtAssistant
481     ${QT_HEADERS_DIR}/QtAssistant
482     NO_DEFAULT_PATH
483     )
484
485   # Set QT_QTDESIGNER_INCLUDE_DIR
486   FIND_PATH(QT_QTDESIGNER_INCLUDE_DIR QDesignerComponents
487     PATHS
488     ${QT_INCLUDE_DIR}/QtDesigner
489     ${QT_HEADERS_DIR}/QtDesigner
490     NO_DEFAULT_PATH
491     )
492
493   # Set QT_QTDBUS_INCLUDE_DIR
494   FIND_PATH(QT_QTDBUS_INCLUDE_DIR QtDBus
495     PATHS
496     ${QT_INCLUDE_DIR}/QtDBus
497     ${QT_HEADERS_DIR}/QtDBus
498     NO_DEFAULT_PATH
499     )
500
501   # Make variables changeble to the advanced user
502   MARK_AS_ADVANCED( QT_LIBRARY_DIR QT_INCLUDE_DIR QT_QT_INCLUDE_DIR QT_DOC_DIR)
503
504   # Set QT_INCLUDES
505   SET( QT_INCLUDES ${QT_INCLUDE_DIR} ${QT_QT_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default )
506
507
508   ########################################
509   #
510   #       Setting the LIBRARY-Variables
511   #
512   ########################################
513
514   IF (QT_USE_FRAMEWORKS)
515     # If FIND_LIBRARY found libraries in Apple frameworks, we would NOT have
516     # to jump through these hoops.
517     SET(QT_QTCORE_LIBRARY_RELEASE "-F${QT_LIBRARY_DIR} -framework QtCore" CACHE STRING "The QtCore library.")
518     SET(QT_QTCORE_LIBRARY_DEBUG   "-F${QT_LIBRARY_DIR} -framework QtCore" CACHE STRING "The QtCore library.")
519     SET(QT_QT3SUPPORT_LIBRARY_RELEASE "-framework Qt3Support" CACHE STRING "The Qt3Support library.")
520     SET(QT_QT3SUPPORT_LIBRARY_DEBUG   "-framework Qt3Support" CACHE STRING "The Qt3Support library.")
521     SET(QT_QTGUI_LIBRARY_RELEASE      "-framework QtGui"      CACHE STRING "The QtGui library.")
522     SET(QT_QTGUI_LIBRARY_DEBUG        "-framework QtGui"      CACHE STRING "The QtGui library.")
523     SET(QT_QTNETWORK_LIBRARY_RELEASE  "-framework QtNetwork"  CACHE STRING "The QtNetwork library.")
524     SET(QT_QTNETWORK_LIBRARY_DEBUG    "-framework QtNetwork"  CACHE STRING "The QtNetwork library.")
525     SET(QT_QTOPENGL_LIBRARY_RELEASE   "-framework QtOpenGL"   CACHE STRING "The QtOpenGL library.")
526     SET(QT_QTOPENGL_LIBRARY_DEBUG     "-framework QtOpenGL"   CACHE STRING "The QtOpenGL library.")
527     SET(QT_QTSQL_LIBRARY_RELEASE      "-framework QtSql"      CACHE STRING "The QtSql library.")
528     SET(QT_QTSQL_LIBRARY_DEBUG        "-framework QtSql"      CACHE STRING "The QtSql library.")
529     SET(QT_QTXML_LIBRARY_RELEASE      "-framework QtXml"      CACHE STRING "The QtXml library.")
530     SET(QT_QTXML_LIBRARY_DEBUG        "-framework QtXml"      CACHE STRING "The QtXml library.")
531     SET(QT_QTSVG_LIBRARY_RELEASE      "-framework QtSvg"      CACHE STRING "The QtSvg library.")
532     SET(QT_QTSVG_LIBRARY_DEBUG        "-framework QtSvg"      CACHE STRING "The QtSvg library.")
533     SET(QT_QTDBUS_LIBRARY_RELEASE     "-framework QtDBus"     CACHE STRING "The QtDBus library.")
534     SET(QT_QTDBUS_LIBRARY_DEBUG       "-framework QtDBus"     CACHE STRING "The QtDBus library.")
535
536
537     # WTF?  why don't we have frameworks?  :P
538     SET(QT_QTUITOOLS_LIBRARY_RELEASE      "-L${QT_LIBRARY_DIR} -lQtUiTools"      CACHE STRING "The QtUiTools library.")
539     SET(QT_QTUITOOLS_LIBRARY_DEBUG      "-L${QT_LIBRARY_DIR} -lQtUiTools"      CACHE STRING "The QtUiTools library.")
540     SET(QT_QTTEST_LIBRARY_RELEASE "-L${QT_LIBRARY_DIR} -lQtTest" CACHE STRING "The QtTest library.")
541     SET(QT_QTTEST_LIBRARY_DEBUG   "-L${QT_LIBRARY_DIR} -lQtTest_debug" CACHE STRING "The QtTest library.")
542     MARK_AS_ADVANCED(QT_QT3SUPPORT_LIBRARY QT_QTGUI_LIBRARY )
543
544   ELSE (QT_USE_FRAMEWORKS)
545     
546     # Set QT_QTCORE_LIBRARY by searching for a lib with "QtCore."  as part of the filename
547     FIND_LIBRARY(QT_QTCORE_LIBRARY_RELEASE NAMES QtCore QtCore4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH )
548     FIND_LIBRARY(QT_QTCORE_LIBRARY_DEBUG NAMES QtCore_debug QtCored4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
549
550     # Set QT_QT3SUPPORT_LIBRARY
551     FIND_LIBRARY(QT_QT3SUPPORT_LIBRARY_RELEASE NAMES Qt3Support Qt3Support4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
552     FIND_LIBRARY(QT_QT3SUPPORT_LIBRARY_DEBUG   NAMES Qt3Support_debug Qt3Supportd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
553
554     # Set QT_QTGUI_LIBRARY
555     FIND_LIBRARY(QT_QTGUI_LIBRARY_RELEASE NAMES QtGui QtGui4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
556     FIND_LIBRARY(QT_QTGUI_LIBRARY_DEBUG   NAMES QtGui_debug QtGuid4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
557
558     # Set QT_QTMOTIF_LIBRARY
559     IF(Q_WS_X11)
560       FIND_LIBRARY(QT_QTMOTIF_LIBRARY_RELEASE NAMES QtMotif PATHS ${QT_LIBRARY_DIR}       NO_DEFAULT_PATH)
561       FIND_LIBRARY(QT_QTMOTIF_LIBRARY_DEBUG   NAMES QtMotif_debug PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
562     ENDIF(Q_WS_X11)
563
564     # Set QT_QTNETWORK_LIBRARY
565     FIND_LIBRARY(QT_QTNETWORK_LIBRARY_RELEASE NAMES QtNetwork QtNetwork4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
566     FIND_LIBRARY(QT_QTNETWORK_LIBRARY_DEBUG   NAMES QtNetwork_debug QtNetworkd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
567
568     # Set QT_QTNSPLUGIN_LIBRARY
569     FIND_LIBRARY(QT_QTNSPLUGIN_LIBRARY_RELEASE NAMES QtNsPlugin PATHS ${QT_LIBRARY_DIR}       NO_DEFAULT_PATH)
570     FIND_LIBRARY(QT_QTNSPLUGIN_LIBRARY_DEBUG   NAMES QtNsPlugin_debug PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
571
572     # Set QT_QTOPENGL_LIBRARY
573     FIND_LIBRARY(QT_QTOPENGL_LIBRARY_RELEASE NAMES QtOpenGL QtOpenGL4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
574     FIND_LIBRARY(QT_QTOPENGL_LIBRARY_DEBUG   NAMES QtOpenGL_debug QtOpenGLd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
575
576     # Set QT_QTSQL_LIBRARY
577     FIND_LIBRARY(QT_QTSQL_LIBRARY_RELEASE NAMES QtSql QtSql4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
578     FIND_LIBRARY(QT_QTSQL_LIBRARY_DEBUG   NAMES QtSql_debug QtSqld4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
579
580     # Set QT_QTXML_LIBRARY
581     FIND_LIBRARY(QT_QTXML_LIBRARY_RELEASE NAMES QtXml QtXml4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
582     FIND_LIBRARY(QT_QTXML_LIBRARY_DEBUG   NAMES QtXml_debug QtXmld4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
583
584     # Set QT_QTSVG_LIBRARY
585     FIND_LIBRARY(QT_QTSVG_LIBRARY_RELEASE NAMES QtSvg QtSvg4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
586     FIND_LIBRARY(QT_QTSVG_LIBRARY_DEBUG   NAMES QtSvg_debug QtSvgd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
587
588     # Set QT_QTUITOOLS_LIBRARY
589     FIND_LIBRARY(QT_QTUITOOLS_LIBRARY_RELEASE NAMES QtUiTools QtUiTools4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
590     FIND_LIBRARY(QT_QTUITOOLS_LIBRARY_DEBUG   NAMES QtUiTools_debug QtUiToolsd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
591
592     # Set QT_QTTEST_LIBRARY
593     FIND_LIBRARY(QT_QTTEST_LIBRARY_RELEASE NAMES QtTest QtTest4 PATHS ${QT_LIBRARY_DIR}                      NO_DEFAULT_PATH)
594     FIND_LIBRARY(QT_QTTEST_LIBRARY_DEBUG   NAMES QtTest_debug QtTest_debug4 QtTestd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
595
596     FIND_LIBRARY(QT_QTDBUS_LIBRARY_RELEASE NAMES QtDBus QtDBus4 PATHS ${QT_LIBRARY_DIR}                      NO_DEFAULT_PATH)
597     FIND_LIBRARY(QT_QTDBUS_LIBRARY_DEBUG   NAMES QtDBus_debug QtDBus_debug4 QtDBusd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
598
599     MARK_AS_ADVANCED(QT_QT3SUPPORT_LIBRARY QT_QTGUI_LIBRARY )
600
601   ENDIF (QT_USE_FRAMEWORKS)
602
603   IF( NOT QT_QTCORE_LIBRARY_DEBUG AND NOT QT_QTCORE_LIBRARY_RELEASE )
604     IF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
605       MESSAGE( FATAL_ERROR "Could NOT find QtCore. Check CMakeFiles/CMakeError.log for more details.")
606     ENDIF( NOT Qt4_FIND_QUIETLY AND Qt4_FIND_REQUIRED)
607   ENDIF( NOT QT_QTCORE_LIBRARY_DEBUG AND NOT QT_QTCORE_LIBRARY_RELEASE )
608
609   # Set QT_QTASSISTANT_LIBRARY
610   FIND_LIBRARY(QT_QTASSISTANT_LIBRARY_RELEASE NAMES QtAssistantClient QtAssistant QtAssistant4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
611   FIND_LIBRARY(QT_QTASSISTANT_LIBRARY_DEBUG   NAMES QtAssistantClientd QtAssistantClient_debug QtAssistant_debug QtAssistantd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
612
613   # Set QT_QTDESIGNER_LIBRARY
614   FIND_LIBRARY(QT_QTDESIGNER_LIBRARY_RELEASE NAMES QtDesigner QtDesigner4 PATHS ${QT_LIBRARY_DIR}        NO_DEFAULT_PATH)
615   FIND_LIBRARY(QT_QTDESIGNER_LIBRARY_DEBUG   NAMES QtDesigner_debug QtDesignerd4 PATHS ${QT_LIBRARY_DIR} NO_DEFAULT_PATH)
616
617   ############################################
618   #
619   # Check the existence of the libraries.
620   #
621   ############################################
622
623   MACRO (_QT4_ADJUST_LIB_VARS basename)
624     IF (QT_${basename}_INCLUDE_DIR)
625
626       # if only the release version was found, set the debug variable also to the release version
627       IF (QT_${basename}_LIBRARY_RELEASE AND NOT QT_${basename}_LIBRARY_DEBUG)
628         SET(QT_${basename}_LIBRARY_DEBUG ${QT_${basename}_LIBRARY_RELEASE})
629         SET(QT_${basename}_LIBRARY       ${QT_${basename}_LIBRARY_RELEASE})
630         SET(QT_${basename}_LIBRARIES     ${QT_${basename}_LIBRARY_RELEASE})
631       ENDIF (QT_${basename}_LIBRARY_RELEASE AND NOT QT_${basename}_LIBRARY_DEBUG)
632
633       # if only the debug version was found, set the release variable also to the debug version
634       IF (QT_${basename}_LIBRARY_DEBUG AND NOT QT_${basename}_LIBRARY_RELEASE)
635         SET(QT_${basename}_LIBRARY_RELEASE ${QT_${basename}_LIBRARY_DEBUG})
636         SET(QT_${basename}_LIBRARY         ${QT_${basename}_LIBRARY_DEBUG})
637         SET(QT_${basename}_LIBRARIES       ${QT_${basename}_LIBRARY_DEBUG})
638       ENDIF (QT_${basename}_LIBRARY_DEBUG AND NOT QT_${basename}_LIBRARY_RELEASE)
639
640       IF (QT_${basename}_LIBRARY_DEBUG AND QT_${basename}_LIBRARY_RELEASE)
641         IF(NOT MSVC)
642         SET(QT_${basename}_LIBRARY         ${QT_${basename}_LIBRARY_RELEASE})
643         ELSE(NOT MSVC)
644           SET(QT_${basename}_LIBRARY       optimized ${QT_${basename}_LIBRARY_RELEASE} debug ${QT_${basename}_LIBRARY_DEBUG})
645         ENDIF(NOT MSVC)
646         SET(QT_${basename}_LIBRARIES       optimized ${QT_${basename}_LIBRARY_RELEASE} debug ${QT_${basename}_LIBRARY_DEBUG})
647       ENDIF (QT_${basename}_LIBRARY_DEBUG AND QT_${basename}_LIBRARY_RELEASE)
648
649       SET(QT_${basename}_LIBRARY ${QT_${basename}_LIBRARY} CACHE FILEPATH "The Qt ${basename} library")
650
651       IF (QT_${basename}_LIBRARY)
652         SET(QT_${basename}_FOUND 1)
653       ENDIF (QT_${basename}_LIBRARY)
654
655       #add the include directory to QT_INCLUDES
656       SET(QT_INCLUDES ${QT_INCLUDES} "${QT_${basename}_INCLUDE_DIR}")
657     ENDIF (QT_${basename}_INCLUDE_DIR )
658
659     # Make variables changeble to the advanced user
660     MARK_AS_ADVANCED(QT_${basename}_LIBRARY QT_${basename}_LIBRARY_RELEASE QT_${basename}_LIBRARY_DEBUG QT_${basename}_INCLUDE_DIR)
661   ENDMACRO (_QT4_ADJUST_LIB_VARS)
662
663   IF(WIN32)
664      _QT4_ADJUST_LIB_VARS(QTMAIN)
665   ENDIF(WIN32)
666
667
668   _QT4_ADJUST_LIB_VARS(QTCORE)
669   _QT4_ADJUST_LIB_VARS(QTGUI)
670   _QT4_ADJUST_LIB_VARS(QT3SUPPORT)
671   _QT4_ADJUST_LIB_VARS(QTASSISTANT)
672   _QT4_ADJUST_LIB_VARS(QTDESIGNER)
673   IF(Q_WS_X11)
674     _QT4_ADJUST_LIB_VARS(QTMOTIF)
675   ENDIF(Q_WS_X11)
676   _QT4_ADJUST_LIB_VARS(QTNETWORK)
677   _QT4_ADJUST_LIB_VARS(QTNSPLUGIN)
678   _QT4_ADJUST_LIB_VARS(QTOPENGL)
679   _QT4_ADJUST_LIB_VARS(QTSQL)
680   _QT4_ADJUST_LIB_VARS(QTXML)
681   _QT4_ADJUST_LIB_VARS(QTSVG)
682   _QT4_ADJUST_LIB_VARS(QTUITOOLS)
683   _QT4_ADJUST_LIB_VARS(QTTEST)
684   _QT4_ADJUST_LIB_VARS(QTDBUS)
685
686   #######################################
687   #
688   #       Check the executables of Qt 
689   #          ( moc, uic, rcc )
690   #
691   #######################################
692
693
694    # find moc and uic using qmake
695    FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmpQmake/tmp.pro
696     "message(MOC<$$QMAKE_MOC>)
697       message(UIC<$$QMAKE_UIC>)
698    ")
699
700    EXECUTE_PROCESS(COMMAND ${QT_QMAKE_EXECUTABLE}
701       WORKING_DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmpQmake
702       OUTPUT_VARIABLE _moc_OUTPUT
703       ERROR_VARIABLE _moc_OUTPUT )
704    FILE(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/CMakeTmpQmake")
705
706    STRING(REGEX REPLACE ".*MOC<([^>]+).*" "\\1" QT_MOC_EXECUTABLE_INTERNAL "${_moc_OUTPUT}" )
707    STRING(REGEX REPLACE ".*UIC<([^>]+).*" "\\1" QT_UIC_EXECUTABLE_INTERNAL "${_moc_OUTPUT}" )
708
709    FILE(TO_CMAKE_PATH "${QT_MOC_EXECUTABLE_INTERNAL}" QT_MOC_EXECUTABLE_INTERNAL)
710    FILE(TO_CMAKE_PATH "${QT_UIC_EXECUTABLE_INTERNAL}" QT_UIC_EXECUTABLE_INTERNAL)
711
712    SET(QT_MOC_EXECUTABLE ${QT_MOC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The moc executable")
713    SET(QT_UIC_EXECUTABLE ${QT_UIC_EXECUTABLE_INTERNAL} CACHE FILEPATH "The uic executable")
714
715   FIND_PROGRAM(QT_UIC3_EXECUTABLE
716     NAMES uic3
717     PATHS ${QT_BINARY_DIR}
718     NO_DEFAULT_PATH
719     )
720
721   FIND_PROGRAM(QT_RCC_EXECUTABLE 
722     NAMES rcc
723     PATHS ${QT_BINARY_DIR}
724     NO_DEFAULT_PATH
725     )
726
727   FIND_PROGRAM(QT_DBUSCPP2XML_EXECUTABLE 
728     NAMES dbuscpp2xml
729     PATHS ${QT_BINARY_DIR}
730     NO_DEFAULT_PATH
731     )
732
733   FIND_PROGRAM(QT_DBUSXML2CPP_EXECUTABLE 
734     NAMES dbusxml2cpp
735     PATHS ${QT_BINARY_DIR}
736     NO_DEFAULT_PATH
737     )
738
739   IF (QT_MOC_EXECUTABLE)
740      SET(QT_WRAP_CPP "YES")
741   ENDIF (QT_MOC_EXECUTABLE)
742
743   IF (QT_UIC_EXECUTABLE)
744      SET(QT_WRAP_UI "YES")
745   ENDIF (QT_UIC_EXECUTABLE)
746
747
748
749   MARK_AS_ADVANCED( QT_UIC_EXECUTABLE QT_UIC3_EXECUTABLE QT_MOC_EXECUTABLE QT_RCC_EXECUTABLE )
750
751   ######################################
752   #
753   #       Macros for building Qt files
754   #
755   ######################################
756
757   MACRO (QT4_GET_MOC_INC_DIRS _moc_INC_DIRS)
758      SET(${_moc_INC_DIRS})
759      GET_DIRECTORY_PROPERTY(_inc_DIRS INCLUDE_DIRECTORIES)
760
761      FOREACH(_current ${_inc_DIRS})
762         SET(${_moc_INC_DIRS} ${${_moc_INC_DIRS}} "-I" ${_current})
763      ENDFOREACH(_current ${_inc_DIRS})
764   ENDMACRO(QT4_GET_MOC_INC_DIRS)
765
766
767   MACRO (QT4_GENERATE_MOC infile outfile )
768   # get include dirs
769      QT4_GET_MOC_INC_DIRS(moc_includes)
770
771      GET_FILENAME_COMPONENT(abs_infile ${infile} ABSOLUTE)
772
773      ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
774         COMMAND ${QT_MOC_EXECUTABLE}
775         ARGS ${moc_includes} -o ${outfile} ${abs_infile}
776         DEPENDS ${abs_infile})
777
778      MACRO_ADD_FILE_DEPENDENCIES(${abs_infile} ${outfile})
779   ENDMACRO (QT4_GENERATE_MOC)
780
781
782   # QT4_WRAP_CPP(outfiles inputfile ... )
783   # TODO  perhaps add support for -D, -U and other minor options
784
785   MACRO (QT4_WRAP_CPP outfiles )
786     # get include dirs
787     QT4_GET_MOC_INC_DIRS(moc_includes)
788
789     FOREACH (it ${ARGN})
790       GET_FILENAME_COMPONENT(it ${it} ABSOLUTE)
791       GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
792
793       SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/moc_${outfile}.cxx)
794       ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
795         COMMAND ${QT_MOC_EXECUTABLE}
796         ARGS ${moc_includes} -o ${outfile} ${it}
797         DEPENDS ${it})
798       SET(${outfiles} ${${outfiles}} ${outfile})
799     ENDFOREACH(it)
800
801   ENDMACRO (QT4_WRAP_CPP)
802
803
804   # QT4_WRAP_UI(outfiles inputfile ... )
805
806   MACRO (QT4_WRAP_UI outfiles )
807
808     FOREACH (it ${ARGN})
809       GET_FILENAME_COMPONENT(outfile ${it} NAME_WE)
810       GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
811       SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
812       ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
813         COMMAND ${QT_UIC_EXECUTABLE}
814         ARGS -o ${outfile} ${infile}
815         MAIN_DEPENDENCY ${infile})
816       SET(${outfiles} ${${outfiles}} ${outfile})
817     ENDFOREACH (it)
818
819   ENDMACRO (QT4_WRAP_UI)
820
821
822   # QT4_ADD_RESOURCE(outfiles inputfile ... )
823   # TODO  perhaps consider adding support for compression and root options to rcc
824
825   MACRO (QT4_ADD_RESOURCES outfiles )
826
827     FOREACH (it ${ARGN})
828       GET_FILENAME_COMPONENT(outfilename ${it} NAME_WE)
829       GET_FILENAME_COMPONENT(infile ${it} ABSOLUTE)
830       SET(outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${outfilename}.cxx)
831       ADD_CUSTOM_COMMAND(OUTPUT ${outfile}
832         COMMAND ${QT_RCC_EXECUTABLE}
833         ARGS -name ${outfilename} -o ${outfile} ${infile}
834         MAIN_DEPENDENCY ${infile} )
835       SET(${outfiles} ${${outfiles}} ${outfile})
836     ENDFOREACH (it)
837
838   ENDMACRO (QT4_ADD_RESOURCES)
839
840
841   MACRO(QT4_ADD_DBUS_INTERFACE _sources _interface _basename)
842     GET_FILENAME_COMPONENT(_infile ${_interface} ABSOLUTE)
843     SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
844     SET(_impl   ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
845     SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc)
846   
847     ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}
848         COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -p ${_basename} ${_infile}
849         DEPENDS ${_infile})
850   
851     SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE)
852     
853     QT4_GENERATE_MOC(${_header} ${_moc})
854   
855     SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc})
856     MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc})
857   
858   ENDMACRO(QT4_ADD_DBUS_INTERFACE)
859   
860   
861   MACRO(QT4_ADD_DBUS_INTERFACES _sources)
862      FOREACH (_current_FILE ${ARGN})
863         GET_FILENAME_COMPONENT(_infile ${_current_FILE} ABSOLUTE)
864   
865   # get the part before the ".xml" suffix
866         STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2" _basename ${_current_FILE})
867         STRING(TOLOWER ${_basename} _basename)
868   
869         QT4_ADD_DBUS_INTERFACE(${_sources} ${_infile} ${_basename}interface)
870      ENDFOREACH (_current_FILE)
871   ENDMACRO(QT4_ADD_DBUS_INTERFACES)
872   
873   
874   MACRO(QT4_GENERATE_DBUS_INTERFACE _header)
875     GET_FILENAME_COMPONENT(_in_file ${_header} ABSOLUTE)
876     GET_FILENAME_COMPONENT(_basename ${_header} NAME_WE)
877     SET(_target ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.xml)
878   
879     ADD_CUSTOM_COMMAND(OUTPUT ${_target}
880         COMMAND ${QT_DBUSCPP2XML_EXECUTABLE} ${_in_file} > ${_target}
881         DEPENDS ${_in_file}
882     )
883   ENDMACRO(QT4_GENERATE_DBUS_INTERFACE)
884   
885   
886   MACRO(QT4_ADD_DBUS_ADAPTOR _sources _xml_file _include _parentClass)
887     GET_FILENAME_COMPONENT(_infile ${_xml_file} ABSOLUTE)
888     
889     SET(_optionalBasename "${ARGV4}")
890     IF (_optionalBasename)
891        SET(_basename ${_optionalBasename} )
892     ELSE (_optionalBasename)
893        STRING(REGEX REPLACE "(.*[/\\.])?([^\\.]+)\\.xml" "\\2adaptor" _basename ${_infile})
894        STRING(TOLOWER ${_basename} _basename)
895     ENDIF (_optionalBasename)
896
897     SET(_optionalClassName "${ARGV5}")
898         SET(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
899     SET(_impl   ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
900     SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc)
901         
902         IF(_optionalClassName)
903        ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}
904           COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -c ${_optionalClassName} -i ${_include} -l ${_parentClass} ${_infile}
905           DEPENDS ${_infile}
906         )                       
907         ELSE(_optionalClassName)
908        ADD_CUSTOM_COMMAND(OUTPUT ${_impl} ${_header}
909           COMMAND ${QT_DBUSXML2CPP_EXECUTABLE} -m -a ${_basename} -i ${_include} -l ${_parentClass} ${_infile}
910           DEPENDS ${_infile}
911         )
912         ENDIF(_optionalClassName)
913
914     QT4_GENERATE_MOC(${_header} ${_moc})
915     SET_SOURCE_FILES_PROPERTIES(${_impl} PROPERTIES SKIP_AUTOMOC TRUE)
916     MACRO_ADD_FILE_DEPENDENCIES(${_impl} ${_moc})
917
918     SET(${_sources} ${${_sources}} ${_impl} ${_header} ${_moc})
919   ENDMACRO(QT4_ADD_DBUS_ADAPTOR)
920
921   MACRO(QT4_ADD_DBUS_ADAPTORS _sources)
922     message(FATAL_ERROR "There is a call to QT4_ADD_DBUS_ADAPTORS() in the CMakeLists.txt for '${ARGV0}', but this macro has been removed, please use QT4_ADD_DBUS_ADAPTOR and specify the include file and classname for the parent object implementing the code")
923   ENDMACRO(QT4_ADD_DBUS_ADAPTORS _sources)
924
925    MACRO(QT4_AUTOMOC)
926       QT4_GET_MOC_INC_DIRS(_moc_INCS)
927
928       SET(_matching_FILES )
929       FOREACH (_current_FILE ${ARGN})
930
931          GET_FILENAME_COMPONENT(_abs_FILE ${_current_FILE} ABSOLUTE)
932          # if "SKIP_AUTOMOC" is set to true, we will not handle this file here.
933          # here. this is required to make bouic work correctly:
934          # we need to add generated .cpp files to the sources (to compile them),
935          # but we cannot let automoc handle them, as the .cpp files don't exist yet when
936          # cmake is run for the very first time on them -> however the .cpp files might
937          # exist at a later run. at that time we need to skip them, so that we don't add two
938          # different rules for the same moc file
939          GET_SOURCE_FILE_PROPERTY(_skip ${_abs_FILE} SKIP_AUTOMOC)
940
941          IF ( NOT _skip AND EXISTS ${_abs_FILE} )
942
943             FILE(READ ${_abs_FILE} _contents)
944
945             GET_FILENAME_COMPONENT(_abs_PATH ${_abs_FILE} PATH)
946
947             STRING(REGEX MATCHALL "#include +[^ ]+\\.moc[\">]" _match "${_contents}")
948             IF(_match)
949                FOREACH (_current_MOC_INC ${_match})
950                   STRING(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}")
951
952                   GET_filename_component(_basename ${_current_MOC} NAME_WE)
953    #               SET(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h)
954                   SET(_header ${_abs_PATH}/${_basename}.h)
955                   SET(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC})
956                   ADD_CUSTOM_COMMAND(OUTPUT ${_moc}
957                      COMMAND ${QT_MOC_EXECUTABLE}
958                      ARGS ${_moc_INCS} ${_header} -o ${_moc}
959                      DEPENDS ${_header}
960                   )
961
962                   MACRO_ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc})
963                ENDFOREACH (_current_MOC_INC)
964             ENDIF(_match)
965          ENDIF ( NOT _skip AND EXISTS ${_abs_FILE} )
966       ENDFOREACH (_current_FILE)
967    ENDMACRO(QT4_AUTOMOC)
968
969
970
971   ######################################
972   #
973   #       decide if Qt got found
974   #
975   ######################################
976
977   # if the includes,libraries,moc,uic and rcc are found then we have it
978   IF( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND QT_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE)
979     SET( QT4_FOUND "YES" )
980     IF( NOT Qt4_FIND_QUIETLY)
981       MESSAGE(STATUS "Found Qt-Version ${QTVERSION}")
982     ENDIF( NOT Qt4_FIND_QUIETLY)
983   ELSE( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND QT_UIC_EXECUTABLE AND QT_RCC_EXECUTABLE)
984     SET( QT4_FOUND "NO")
985     SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE)
986     IF( Qt4_FIND_REQUIRED)
987       MESSAGE( FATAL_ERROR "Qt libraries, includes, moc, uic or/and rcc NOT found!")
988     ENDIF( Qt4_FIND_REQUIRED)
989   ENDIF( QT_LIBRARY_DIR AND QT_INCLUDE_DIR AND QT_MOC_EXECUTABLE AND QT_UIC_EXECUTABLE AND  QT_RCC_EXECUTABLE)
990   SET(QT_FOUND ${QT4_FOUND})
991
992
993   #######################################
994   #
995   #       System dependent settings  
996   #
997   #######################################
998   # for unix add X11 stuff
999   IF(UNIX)
1000     # on OS X X11 may not be required
1001     IF (Q_WS_X11)
1002     FIND_PACKAGE(X11)
1003     ENDIF (Q_WS_X11)
1004     FIND_PACKAGE(Threads)
1005     SET(QT_QTCORE_LIBRARY ${QT_QTCORE_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
1006   ENDIF(UNIX)
1007
1008
1009   #######################################
1010   #
1011   #       compatibility settings 
1012   #
1013   #######################################
1014   # Backwards compatibility for CMake1.4 and 1.2
1015   SET (QT_MOC_EXE ${QT_MOC_EXECUTABLE} )
1016   SET (QT_UIC_EXE ${QT_UIC_EXECUTABLE} )
1017
1018   SET( QT_QT_LIBRARY "")
1019
1020 ELSE(QT4_QMAKE_FOUND)
1021    
1022    SET(QT_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}-NOTFOUND" CACHE FILEPATH "Invalid qmake found" FORCE)
1023    IF(Qt4_FIND_REQUIRED)
1024       IF(QT4_INSTALLED_VERSION_TOO_OLD)
1025          MESSAGE(FATAL_ERROR "The installed Qt version ${QTVERSION} is too old, at least version ${QT_MIN_VERSION} is required")
1026       ELSE(QT4_INSTALLED_VERSION_TOO_OLD)
1027          MESSAGE( FATAL_ERROR "Qt qmake not found!")
1028       ENDIF(QT4_INSTALLED_VERSION_TOO_OLD)
1029    ELSE(Qt4_FIND_REQUIRED)
1030       IF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY)
1031          MESSAGE(STATUS "The installed Qt version ${QTVERSION} is too old, at least version ${QT_MIN_VERSION} is required")
1032       ENDIF(QT4_INSTALLED_VERSION_TOO_OLD AND NOT Qt4_FIND_QUIETLY)
1033    ENDIF(Qt4_FIND_REQUIRED)
1034  
1035 ENDIF (QT4_QMAKE_FOUND)
1036