source: ogBrowser-Git/qtermwidget/CMakeLists.txt @ 52a56aa

jenkins
Last change on this file since 52a56aa was 67f8f0f, checked in by Vadim Troshchinskiy Shmelev <vtroshchinskiy@…>, 2 months ago

test

  • Property mode set to 100644
File size: 10.8 KB
Line 
1cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
2# CMP0000: Call the cmake_minimum_required() command at the beginning of the top-level
3# CMakeLists.txt file even before calling the project() command.
4# The cmake_minimum_required(VERSION) command implicitly invokes the cmake_policy(VERSION)
5# command to specify that the current project code is written for the given range of CMake
6# versions.
7project(qtermwidget)
8
9include(GNUInstallDirs)
10include(GenerateExportHeader)
11include(CMakePackageConfigHelpers)
12include(CheckFunctionExists)
13include(CheckIncludeFile)
14
15option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF)
16option(BUILD_EXAMPLE "Build example application. Default OFF." OFF)
17option(QTERMWIDGET_USE_UTEMPTER "Uses libutempter on Linux or libulog on FreeBSD for login records." OFF)
18option(QTERMWIDGET_BUILD_PYTHON_BINDING "Build python binding" OFF)
19option(USE_UTF8PROC "Use libutf8proc for better Unicode support. Default OFF" OFF)
20option(USE_QT5 "Use Qt 5 instead of Qt6 (if available). Default OFF" OFF)
21
22# just change version for releases
23# keep this in sync with the version in pyqt/pyproject.toml
24set(QTERMWIDGET_VERSION_MAJOR "1")
25set(QTERMWIDGET_VERSION_MINOR "3")
26set(QTERMWIDGET_VERSION_PATCH "0")
27
28set(QTERMWIDGET_VERSION "${QTERMWIDGET_VERSION_MAJOR}.${QTERMWIDGET_VERSION_MINOR}.${QTERMWIDGET_VERSION_PATCH}")
29
30# additional cmake files
31set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
32set(CMAKE_INCLUDE_CURRENT_DIR ON)
33
34# Minimum Versions
35set(QT_MINIMUM_VERSION "5.15.0")
36set(QT6_MINIMUM_VERSION "6.1.0")
37set(LXQTBT_MINIMUM_VERSION "0.10.0")
38
39if (NOT USE_QT5)
40    find_package(Qt6 COMPONENTS Widgets)
41    if (NOT Qt6_FOUND)
42        find_package(Qt5Widgets "${QT_MINIMUM_VERSION}" REQUIRED)
43        find_package(Qt5LinguistTools "${QT_MINIMUM_VERSION}" REQUIRED)
44    endif()
45
46    if (Qt6_FOUND)
47        find_package(Qt6Widgets "${QT6_MINIMUM_VERSION}" REQUIRED)
48        find_package(Qt6LinguistTools "${QT6_MINIMUM_VERSION}" REQUIRED)
49        find_package(Qt6Core5Compat "${QT6_MINIMUM_VERSION}" REQUIRED)
50    endif()
51else()
52    find_package(Qt5Widgets "${QT_MINIMUM_VERSION}" REQUIRED)
53    find_package(Qt5LinguistTools "${QT_MINIMUM_VERSION}" REQUIRED)
54endif()
55
56find_package(lxqt-build-tools ${LXQTBT_MINIMUM_VERSION} REQUIRED)
57
58if(USE_UTF8PROC)
59    find_package(Utf8Proc REQUIRED)
60endif()
61
62include(LXQtPreventInSourceBuilds)
63include(LXQtTranslateTs)
64include(LXQtCompilerSettings NO_POLICY_SCOPE)
65include(LXQtCreatePkgConfigFile)
66
67if(APPLE)
68    if(CMAKE_VERSION VERSION_GREATER 3.9)
69        cmake_policy(SET CMP0068 NEW)
70        set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
71    endif()
72endif()
73
74if (NOT Qt6_FOUND)
75    set(QTERMWIDGET_LIBRARY_NAME qtermwidget5)
76else()
77    set(QTERMWIDGET_LIBRARY_NAME qtermwidget6)
78endif()
79
80# main library
81
82set(SRCS
83    lib/BlockArray.cpp
84    lib/ColorScheme.cpp
85    lib/Emulation.cpp
86    lib/Filter.cpp
87    lib/History.cpp
88    lib/HistorySearch.cpp
89    lib/KeyboardTranslator.cpp
90    lib/konsole_wcwidth.cpp
91    lib/kprocess.cpp
92    lib/kpty.cpp
93    lib/kptydevice.cpp
94    lib/kptyprocess.cpp
95    lib/Pty.cpp
96    lib/qtermwidget.cpp
97    lib/Screen.cpp
98    lib/ScreenWindow.cpp
99    lib/SearchBar.cpp
100    lib/Session.cpp
101    lib/ShellCommand.cpp
102    lib/TerminalCharacterDecoder.cpp
103    lib/TerminalDisplay.cpp
104    lib/tools.cpp
105    lib/Vt102Emulation.cpp
106)
107
108# Only the Headers that need to be moc'd go here
109set(HDRS
110    lib/Emulation.h
111    lib/Filter.h
112    lib/HistorySearch.h
113    lib/kprocess.h
114    lib/kptydevice.h
115    lib/kptyprocess.h
116    lib/Pty.h
117    lib/qtermwidget.h
118    lib/ScreenWindow.h
119    lib/SearchBar.h
120    lib/Session.h
121    lib/TerminalDisplay.h
122    lib/Vt102Emulation.h
123)
124
125set(UI
126    lib/SearchBar.ui
127)
128
129# for distribution
130set(HDRS_DISTRIB
131    lib/qtermwidget.h
132    lib/Emulation.h
133    lib/KeyboardTranslator.h
134    lib/Filter.h
135    lib/qtermwidget_interface.h
136)
137
138# dirs
139set(KB_LAYOUT_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${QTERMWIDGET_LIBRARY_NAME}/kb-layouts")
140message(STATUS "Keyboard layouts will be installed in: ${KB_LAYOUT_DIR}")
141
142set(COLORSCHEMES_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${QTERMWIDGET_LIBRARY_NAME}/color-schemes")
143message(STATUS "Color schemes will be installed in: ${COLORSCHEMES_DIR}" )
144
145set(TRANSLATIONS_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${QTERMWIDGET_LIBRARY_NAME}/translations")
146message(STATUS "Translations will be installed in: ${TRANSLATIONS_DIR}")
147
148set(QTERMWIDGET_INCLUDE_DIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}/${QTERMWIDGET_LIBRARY_NAME}")
149
150CHECK_FUNCTION_EXISTS(updwtmpx HAVE_UPDWTMPX)
151
152if (NOT USE_QT5)
153    if (NOT Qt6_FOUND)
154        qt5_wrap_cpp(MOCS ${HDRS})
155        qt5_wrap_ui(UI_SRCS ${UI})
156        set(PKG_CONFIG_REQ "Qt5Widgets")
157    else()
158        qt6_wrap_cpp(MOCS ${HDRS})
159        qt6_wrap_ui(UI_SRCS ${UI})
160        set(PKG_CONFIG_REQ "Qt6Widgets")
161    endif()
162else()
163    qt5_wrap_cpp(MOCS ${HDRS})
164    qt5_wrap_ui(UI_SRCS ${UI})
165    set(PKG_CONFIG_REQ "Qt5Widgets")
166endif()
167
168lxqt_translate_ts(QTERMWIDGET_QM
169    TRANSLATION_DIR "lib/translations"
170    UPDATE_TRANSLATIONS
171        ${UPDATE_TRANSLATIONS}
172    SOURCES
173        ${SRCS} ${HDRS} ${UI}
174    INSTALL_DIR
175        ${TRANSLATIONS_DIR}
176    COMPONENT
177        Runtime
178)
179
180add_library(${QTERMWIDGET_LIBRARY_NAME} SHARED ${SRCS} ${MOCS} ${UI_SRCS} ${QTERMWIDGET_QM})
181if (NOT USE_QT5)
182    if (NOT Qt6_FOUND)
183        target_link_libraries(${QTERMWIDGET_LIBRARY_NAME} Qt5::Widgets)
184    else()
185        target_link_libraries(${QTERMWIDGET_LIBRARY_NAME} Qt6::Widgets)
186        target_link_libraries(${QTERMWIDGET_LIBRARY_NAME} Qt6::Core5Compat)
187    endif()
188else()
189    target_link_libraries(${QTERMWIDGET_LIBRARY_NAME} Qt5::Widgets)
190endif()
191
192set_target_properties( ${QTERMWIDGET_LIBRARY_NAME} PROPERTIES
193                       SOVERSION ${QTERMWIDGET_VERSION_MAJOR}
194                       VERSION ${QTERMWIDGET_VERSION}
195                     )
196
197
198if(APPLE)
199    target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
200        PRIVATE
201            "HAVE_UTMPX"
202            "UTMPX_COMPAT"
203    )
204endif()
205
206if(HAVE_UPDWTMPX)
207    target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
208        PRIVATE
209            "HAVE_UPDWTMPX"
210    )
211endif()
212
213if (QTERMWIDGET_USE_UTEMPTER)
214    CHECK_INCLUDE_FILE(utempter.h HAVE_UTEMPTER)
215    if (HAVE_UTEMPTER)
216        target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME} PRIVATE
217                "HAVE_UTEMPTER"
218        )
219        find_library(UTEMPTER_LIB NAMES utempter ulog REQUIRED)
220        target_link_libraries(${QTERMWIDGET_LIBRARY_NAME} ${UTEMPTER_LIB})
221    endif()
222endif()
223
224if (UTF8PROC_FOUND)
225    target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
226        PRIVATE
227            "HAVE_UTF8PROC"
228    )
229    target_include_directories(${QTERMWIDGET_LIBRARY_NAME}
230        INTERFACE
231            ${UTF8PROC_INCLUDE_DIRS}
232    )
233    target_link_libraries(${QTERMWIDGET_LIBRARY_NAME}
234        ${UTF8PROC_LIBRARIES}
235    )
236    string(APPEND PKG_CONFIG_REQ ", libutf8proc")
237endif()
238
239if(APPLE)
240    set (CMAKE_SKIP_RPATH 1)
241    # this is a must to load the lib correctly
242    set_target_properties(${QTERMWIDGET_LIBRARY_NAME} PROPERTIES INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR})
243endif()
244
245target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
246    PRIVATE
247        "KB_LAYOUT_DIR=\"${KB_LAYOUT_DIR}\""
248        "COLORSCHEMES_DIR=\"${COLORSCHEMES_DIR}\""
249        "TRANSLATIONS_DIR=\"${TRANSLATIONS_DIR}\""
250        "HAVE_POSIX_OPENPT"
251        "HAVE_SYS_TIME_H"
252)
253
254
255generate_export_header(${QTERMWIDGET_LIBRARY_NAME}
256    EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/lib/qtermwidget_export.h"
257    BASE_NAME QTERMWIDGET
258)
259
260target_include_directories(${QTERMWIDGET_LIBRARY_NAME}
261    PUBLIC
262        "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>"
263        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/lib>"
264        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../lib>"
265    INTERFACE
266        "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
267        "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${QTERMWIDGET_LIBRARY_NAME}>"
268)
269
270write_basic_package_version_file(
271    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config-version.cmake"
272    VERSION ${QTERMWIDGET_VERSION}
273    COMPATIBILITY AnyNewerVersion
274)
275
276install(FILES
277    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config-version.cmake"
278    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}"
279    COMPONENT Devel
280)
281
282install(EXPORT
283    "${QTERMWIDGET_LIBRARY_NAME}-targets"
284    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}"
285    COMPONENT Devel
286)
287
288install(FILES
289    ${HDRS_DISTRIB} "${CMAKE_CURRENT_BINARY_DIR}/lib/qtermwidget_export.h" "${CMAKE_BINARY_DIR}/lib/qtermwidget_version.h"
290    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${QTERMWIDGET_LIBRARY_NAME}"
291    COMPONENT Devel
292)
293# keyboard layouts
294install(DIRECTORY
295    lib/kb-layouts/
296    DESTINATION "${KB_LAYOUT_DIR}"
297    COMPONENT Runtime
298    FILES_MATCHING PATTERN "*.keytab"
299)
300# color schemes
301install(DIRECTORY
302    lib/color-schemes/
303    DESTINATION "${COLORSCHEMES_DIR}"
304    COMPONENT Runtime
305    FILES_MATCHING PATTERN "*.*schem*"
306)
307
308lxqt_create_pkgconfig_file(
309    PACKAGE_NAME ${QTERMWIDGET_LIBRARY_NAME}
310    DESCRIPTIVE_NAME ${QTERMWIDGET_LIBRARY_NAME}
311    DESCRIPTION "QTermWidget library for Qt ${QTERMWIDGET_VERSION_MAJOR}.x"
312    INCLUDEDIRS ${QTERMWIDGET_LIBRARY_NAME}
313    LIBS ${QTERMWIDGET_LIBRARY_NAME}
314    REQUIRES ${PKG_CONFIG_REQ}
315    VERSION ${QTERMWIDGET_VERSION}
316    INSTALL
317    COMPONENT Devel
318)
319
320configure_file(
321    "${PROJECT_SOURCE_DIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}-config.cmake.in"
322    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config.cmake"
323    @ONLY
324)
325
326configure_file(
327    "${PROJECT_SOURCE_DIR}/lib/qtermwidget_version.h.in"
328    "${CMAKE_BINARY_DIR}/lib/qtermwidget_version.h"
329    @ONLY
330)
331
332install(FILES
333    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config.cmake"
334    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}"
335    COMPONENT Devel
336)
337
338install(TARGETS ${QTERMWIDGET_LIBRARY_NAME}
339    DESTINATION "${CMAKE_INSTALL_LIBDIR}"
340    EXPORT "${QTERMWIDGET_LIBRARY_NAME}-targets"
341    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
342    PUBLIC_HEADER
343    COMPONENT Runtime
344)
345
346export(TARGETS ${QTERMWIDGET_LIBRARY_NAME}
347    FILE "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-targets.cmake"
348    EXPORT_LINK_INTERFACE_LIBRARIES
349)
350# end of main library
351
352
353# example application
354if(BUILD_EXAMPLE)
355    set(EXAMPLE_SRC examples/cpp/main.cpp)
356    add_executable(example ${EXAMPLE_SRC})
357    target_link_libraries(example ${QTERMWIDGET_LIBRARY_NAME})
358endif()
359# end of example application
360
361# python binding
362if (QTERMWIDGET_BUILD_PYTHON_BINDING)
363    message(SEND_ERROR "QTERMWIDGET_BUILD_PYTHON_BINDING is no longer supported. Check README.md for how to build PyQt bindings.")
364endif()
365# end of python binding
366
367
368CONFIGURE_FILE(
369    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
370    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
371    IMMEDIATE @ONLY
372)
373ADD_CUSTOM_TARGET(uninstall
374    "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
375)
Note: See TracBrowser for help on using the repository browser.