Don't allow #include <lxqt-qt5/lxqtxxxxx.h>
[lxde/liblxqt.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.9)
2
3 project(liblxqt)
4
5 set(LXQT_MAJOR_VERSION 0)
6 set(LXQT_MINOR_VERSION 7)
7 set(LXQT_PATCH_VERSION 0)
8
9 # Set default installation paths
10 set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}" CACHE PATH "Installation path for libraries")
11 set(LXQT_PKG_CONFIG_DESCRIPTION "Shared library for LXQt applications")
12
13 set(PUB_HDRS
14     aboutdialog/lxqtaboutdialog.h
15     lxqtsettings.h
16     lxqtxfitman.h
17     lxqtplugininfo.h
18     lxqtpowermanager.h
19     addplugindialog/lxqtaddplugindialog.h
20     lxqtscreensaver.h
21     lxqtapplication.h
22     lxqttranslator.h
23     lxqtprogramfinder.h
24
25     configdialog/lxqtconfigdialog.h
26     configdialog/lxqtpageselectwidget.h
27
28     lxqtpower/lxqtpower.h
29     lxqtnotification.h
30     lxqtautostartentry.h
31     lxqtgridlayout.h
32     lxqtrotatedwidget.h
33     lxqtglobals.h
34 )
35
36 set(PUBLIC_CLASSES
37     AboutDialog
38     Settings
39     XfitMan
40     PluginInfo
41     PowerManager
42     AddPluginDialog
43     ScreenSaver
44     Application
45     Translator
46     ProgramFinder
47
48     ConfigDialog
49     PageSelectWidget
50
51     Power
52     Notification
53     AutostartEntry
54     GridLayout
55     RotatedWidget
56 )
57
58 set(PRIV_HDRS
59     aboutdialog/lxqtaboutdialog_p.h
60     aboutdialog/technicalinfo.h
61     translatorsinfo/translatorsinfo.h
62 )
63
64 set(SRCS
65     aboutdialog/lxqtaboutdialog.cpp
66     aboutdialog/technicalinfo.cpp
67     lxqtxfitman.cpp
68     lxqtplugininfo.cpp
69     lxqtpowermanager.cpp
70     addplugindialog/lxqtaddplugindialog.cpp
71     lxqtsettings.cpp
72     lxqtscreensaver.cpp
73     lxqtapplication.cpp
74     lxqttranslator.cpp
75     lxqtprogramfinder.cpp
76
77     configdialog/lxqtconfigdialog.cpp
78     configdialog/lxqtpageselectwidget.cpp
79
80     lxqtpower/lxqtpower.cpp
81     lxqtpower/lxqtpowerproviders.cpp
82     lxqtnotification.cpp
83     lxqtautostartentry.cpp
84     translatorsinfo/translatorsinfo.cpp
85     lxqtgridlayout.cpp
86     lxqtrotatedwidget.cpp
87 )
88
89 set(MOCS
90     aboutdialog/lxqtaboutdialog.h
91     aboutdialog/lxqtaboutdialog_p.h
92     lxqtpowermanager.h
93     addplugindialog/lxqtaddplugindialog.h
94     lxqtsettings.h
95     lxqtscreensaver.h
96     lxqtapplication.h
97
98     configdialog/lxqtconfigdialog.h
99     configdialog/lxqtpageselectwidget.h
100
101     lxqtnotification.h
102     lxqtnotification_p.h
103     lxqtpower/lxqtpower.h
104     lxqtpower/lxqtpowerproviders.h
105     lxqtgridlayout.h
106     lxqtrotatedwidget.h
107 )
108
109 set(FORMS
110     aboutdialog/lxqtaboutdialog.ui
111     configdialog/lxqtconfigdialog.ui
112     addplugindialog/lxqtaddplugindialog.ui
113 )
114
115 file(GLOB TS_FILES
116     ${CMAKE_CURRENT_SOURCE_DIR}/translations/liblxqt_*.ts
117 )
118
119 # additional cmake files
120 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
121
122
123 option(USE_QT5 "Force use the Qt5." $ENV{USE_QT5})
124 option(USE_QT4 "Force use the Qt4." $ENV{USE_QT4})
125
126 if((USE_QT4 AND USE_QT5) OR
127    (NOT USE_QT4 AND NOT USE_QT5))
128
129     # Autodetect Qt version
130     find_package(Qt4 QUIET)
131     if (QT4_FOUND)
132         set(USE_QT4 ON)
133         set(USE_QT5 OFF)
134     else()
135         set(USE_QT4 OFF)
136         set(USE_QT5 ON)
137     endif()
138 endif()
139
140 set(CMAKE_INCLUDE_CURRENT_DIR ON)
141 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
142
143 if(USE_QT5)
144     set(CMAKE_AUTOMOC ON)
145     find_package(Qt5Widgets REQUIRED QUIET)
146     find_package(Qt5DBus REQUIRED QUIET)
147     find_package(Qt5X11Extras REQUIRED QUIET)
148     find_package(Qt5LinguistTools REQUIRED QUIET)
149     find_package(Qt5Xdg REQUIRED)
150     message(STATUS "Building with Qt ${Qt5Core_VERSION_STRING}")
151
152     QT5_WRAP_UI(UIS ${FORMS})
153     QT5_ADD_TRANSLATION(QM_FILES ${TS_FILES})
154     QT5_ADD_DBUS_INTERFACE(SRCS
155         dbus/org.freedesktop.Notifications.xml
156         notifications_interface
157     )
158
159     set(LXQT_QT_VERSION "5")
160     set(LXQT_QT_VERSION_SUFFIX "-qt5")
161     set(LXQT_PKG_CONFIG_REQUIRES "Qt5Widgets Qt5Xml Qt5DBus Qt5X11Extras")
162 else()
163     find_package(Qt4 REQUIRED QtCore QtGui QUIET)
164     find_package(qtxdg REQUIRED)
165     message(STATUS "Building with Qt ${QTVERSION}")
166
167     include(${QT_USE_FILE})
168
169     QT4_WRAP_CPP(MOCS ${MOCS})
170     QT4_WRAP_UI(UIS ${FORMS})
171     QT4_ADD_TRANSLATION(QM_FILES ${TS_FILES})
172     QT4_ADD_DBUS_INTERFACE(SRCS
173         dbus/org.freedesktop.Notifications.xml
174         notifications_interface
175     )
176
177     set(LXQT_QT_VERSION "4")
178     set(LXQT_QT_VERSION_SUFFIX "")
179     set(LXQT_PKG_CONFIG_REQUIRES "QtCore, QtXml")
180 endif()
181
182 include(${QTXDG_USE_FILE})
183
184 find_package(X11 REQUIRED QUIET)
185
186 include_directories (
187     ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
188     ${X11_INCLUDE_DIR}
189     ${QTXDG_INCLUDE_DIRS}
190 )
191
192 if (NOT USE_QT5)
193     include_directories (
194         ${QT_QTCORE_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTDBUS_INCLUDE_DIR}
195     )
196 endif()
197
198 # Standard directories for installation
199 include(GNUInstallDirs)
200
201 set(LXQT_VERSION ${LXQT_MAJOR_VERSION}.${LXQT_MINOR_VERSION}.${LXQT_PATCH_VERSION})
202 set(LXQT_LIBRARY_NAME "lxqt${LXQT_QT_VERSION_SUFFIX}")
203 set(LXQT_SHARE_DIR ${CMAKE_INSTALL_PREFIX}/share/${LXQT_LIBRARY_NAME})
204 set(LXQT_TRANSLATIONS_DIR ${LXQT_SHARE_DIR}/translations)
205
206 set(LXQT_INTREE_INCLUDE_DIR     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/include)
207 set(LXQT_INTREE_TARGETS_FILE    ${CMAKE_BINARY_DIR}/${LXQT_LIBRARY_NAME}-targets.cmake)
208
209 set(LXQT_INSTALL_INCLUDE_DIR   ${CMAKE_INSTALL_FULL_INCLUDEDIR}/${LXQT_LIBRARY_NAME})
210 set(LXQT_INSTALL_CMAKE_DIR     ${CMAKE_INSTALL_PREFIX}/share/cmake)
211
212 include(cmake/FindInstallConfigPath.cmake)
213 include(create_portable_headers)
214
215 message(STATUS "")
216 message(STATUS "liblxqt version: ${LXQT_VERSION}")
217 message(STATUS "")
218
219
220 # Copy public headers
221 foreach(h ${PUB_HDRS})
222     get_filename_component(bh ${h} NAME)
223     configure_file(${h} ${LXQT_INTREE_INCLUDE_DIR}/LXQt/${bh} COPYONLY)
224     if (USE_QT4)
225         configure_file(${h} ${LXQT_INTREE_INCLUDE_DIR}/lxqt/${bh} COPYONLY)
226     endif()
227 endforeach()
228
229 # Create the portable headers
230 create_portable_headers(INTREE_PORTABLE_HEADERS ${LXQT_INTREE_INCLUDE_DIR}/LXQt ${PUBLIC_CLASSES})
231 check_portable_headers(H_FILES ${PUB_HDRS} LINKS ${INTREE_PORTABLE_HEADERS})
232
233 #************************************************
234 # Create in-tree build infrastructure
235 #************************************************
236 set(CFG_LXQT_INCLUDE_DIR    ${LXQT_INTREE_INCLUDE_DIR})
237 set(CFG_LXQT_LIBRARY        ${LXQT_LIBRARY_NAME})
238 set(CFG_LXQT_USE_FILE       ${CMAKE_BINARY_DIR}/${LXQT_LIBRARY_NAME}_use.cmake)
239 set(CFG_LXQT_TARGETS_FILE   ${LXQT_INTREE_TARGETS_FILE})
240
241 configure_file(
242     ${CMAKE_CURRENT_SOURCE_DIR}/cmake/lxqtX-config.cmake.in 
243     ${CMAKE_BINARY_DIR}/${LXQT_LIBRARY_NAME}-config.cmake
244     @ONLY
245 )
246
247 configure_file(
248     ${CMAKE_CURRENT_SOURCE_DIR}/cmake/lxqt_use.cmake.in
249     ${CMAKE_BINARY_DIR}/${LXQT_LIBRARY_NAME}_use.cmake
250     @ONLY
251 )
252
253 include(${CFG_LXQT_USE_FILE})
254
255
256 #************************************************
257 # Create instalable build infrastructure
258 #************************************************
259 set(CFG_LXQT_INCLUDE_DIR    ${LXQT_INSTALL_INCLUDE_DIR})
260 set(CFG_LXQT_LIBRARY        ${LXQT_LIBRARY_NAME})
261 set(CFG_LXQT_USE_FILE       ${LXQT_INSTALL_CMAKE_DIR}/${LXQT_LIBRARY_NAME}/${LXQT_LIBRARY_NAME}_use.cmake)
262 set(CFG_LXQT_TARGETS_FILE   ${LXQT_INSTALL_CMAKE_DIR}/${LXQT_LIBRARY_NAME}/${LXQT_LIBRARY_NAME}-targets.cmake)
263
264 configure_file(
265     ${CMAKE_CURRENT_SOURCE_DIR}/cmake/lxqtX-config.cmake.in 
266     ${CMAKE_CURRENT_BINARY_DIR}/install/${LXQT_LIBRARY_NAME}-config.cmake
267     @ONLY
268 )
269
270 # use gcc visibility feature to decrease unnecessary exported symbols
271 if (CMAKE_COMPILER_IS_GNUCXX)
272     # set visibility to hidden to hide symbols, unlesss they're exporeted
273     # manually in the code
274     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wl,-no-undefined -Wall")
275 endif()
276 add_definitions(-DCOMPILE_LIBLXQT)
277
278
279 configure_file(
280     ${CMAKE_CURRENT_SOURCE_DIR}/cmake/lxqt_use.cmake.in
281     ${CMAKE_CURRENT_BINARY_DIR}/install/${LXQT_LIBRARY_NAME}_use.cmake
282     @ONLY
283 )
284
285 install(FILES 
286     ${CMAKE_CURRENT_BINARY_DIR}/install/${LXQT_LIBRARY_NAME}-config.cmake
287     ${CMAKE_CURRENT_BINARY_DIR}/install/${LXQT_LIBRARY_NAME}_use.cmake
288     DESTINATION ${LXQT_INSTALL_CMAKE_DIR}/${LXQT_LIBRARY_NAME}
289     COMPONENT Devel
290 )
291
292 install(EXPORT 
293     ${LXQT_LIBRARY_NAME}-targets
294     DESTINATION ${LXQT_INSTALL_CMAKE_DIR}/${LXQT_LIBRARY_NAME}
295     COMPONENT Devel
296 )
297
298
299 include(translatorsinfo/CMakeLists.txt)
300 get_translatorsinfo_qrc(translatorsinfo_qrc)
301 if(USE_QT5)
302     qt5_add_resources(QRC_CXX_SOURCES ${translatorsinfo_qrc})
303 else()
304     qt4_add_resources(QRC_CXX_SOURCES ${translatorsinfo_qrc})
305 endif()
306
307 add_library(${LXQT_LIBRARY_NAME}
308     SHARED ${PUB_HDRS}
309            ${PRIV_HDRS}
310            ${SRCS}
311            ${dbus_generated}
312            ${UIS} ${MOCS}
313            ${QM_FILES}
314            ${QRC_CXX_SOURCES}
315            
316 )
317
318 if (USE_QT5)
319         qt5_use_modules(${LXQT_LIBRARY_NAME} Widgets DBus X11Extras)
320     target_link_libraries(${LXQT_LIBRARY_NAME}
321         ${X11_X11_LIB}
322         ${QTXDG_LIBRARIES}
323     )
324 else()
325     target_link_libraries(${LXQT_LIBRARY_NAME}
326         ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY}
327         ${QT_QTDBUS_LIBRARY}
328         ${X11_X11_LIB}
329         ${QTXDG_LIBRARIES}
330     )
331 endif()
332
333 set_target_properties(${LXQT_LIBRARY_NAME} PROPERTIES
334     VERSION   ${LXQT_VERSION}
335     SOVERSION ${LXQT_MAJOR_VERSION}
336 )
337
338 install(TARGETS 
339     ${LXQT_LIBRARY_NAME} 
340     DESTINATION ${CMAKE_INSTALL_LIBDIR} 
341     EXPORT ${LXQT_LIBRARY_NAME}-targets
342     LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
343 )
344
345
346 export(TARGETS ${LXQT_LIBRARY_NAME} ${QTXDG_TARGET} FILE ${LXQT_INTREE_TARGETS_FILE})
347
348 install(FILES ${PUB_HDRS}                DESTINATION ${LXQT_INSTALL_INCLUDE_DIR}/LXQt)
349
350 if (USE_QT4)
351     install(FILES ${PUB_HDRS}   DESTINATION ${LXQT_INSTALL_INCLUDE_DIR})
352 endif()
353
354 install(FILES ${INTREE_PORTABLE_HEADERS} DESTINATION ${LXQT_INSTALL_INCLUDE_DIR}/LXQt)
355
356 install(FILES ${QM_FILES} DESTINATION ${LXQT_TRANSLATIONS_DIR})
357
358 #************************************************
359 # Create pkgconfig file
360 #************************************************
361 lxqt_create_pkgconfig_file(${LXQT_LIBRARY_NAME}
362     ${LXQT_PKG_CONFIG_DESCRIPTION}
363     ${LXQT_PKG_CONFIG_REQUIRES}
364     ${LXQT_LIBRARY_NAME}
365     ${LXQT_VERSION}
366 )
367 #************************************************
368
369 # building tarball with CPack -------------------------------------------------
370 include (InstallRequiredSystemLibraries)
371 set (CPACK_PACKAGE_VERSION_MAJOR ${LXQT_MAJOR_VERSION})
372 set (CPACK_PACKAGE_VERSION_MINOR ${LXQT_MINOR_VERSION})
373 set (CPACK_PACKAGE_VERSION_PATCH ${LXQT_PATCH_VERSION})
374 set (CPACK_GENERATOR TBZ2)
375 set (CPACK_SOURCE_GENERATOR TBZ2)
376 set (CPACK_SOURCE_IGNORE_FILES /build/;.gitignore;.*~;.git;.kdev4;temp)
377 include (CPack)