source: ogBrowser-Git/qtermwidget/CMakeLists.txt @ 9004d96

jenkinsmain
Last change on this file since 9004d96 was 64efc22, checked in by Vadim Troshchinskiy <vtroshchinskiy@…>, 19 months ago

Update qtermwidget to modern version

  • Property mode set to 100644
File size: 10.5 KB
RevLine 
[64efc22]1cmake_minimum_required(VERSION 3.16 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)
20
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 "2")
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(LXQTBT_MINIMUM_VERSION "0.12.0")
37
38#find_package(Qt5Widgets "${QT_MINIMUM_VERSION}" REQUIRED)
39#find_package(Qt5LinguistTools "${QT_MINIMUM_VERSION}" REQUIRED)
40
41find_package(QT NAMES Qt5 COMPONENTS Widgets LinguistTools REQUIRED)
42find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets LinguistTools REQUIRED)
43
44
45find_package(lxqt-build-tools ${LXQTBT_MINIMUM_VERSION} REQUIRED)
46
47message(STATUS "Building qtermwidget with Qt ${QT_VERSION}")
48
49if(USE_UTF8PROC)
50    find_package(Utf8Proc REQUIRED)
51endif()
52
53include(LXQtPreventInSourceBuilds)
54include(LXQtTranslateTs)
55include(LXQtCompilerSettings NO_POLICY_SCOPE)
56include(LXQtCreatePkgConfigFile)
57
58if(APPLE)
59    if(CMAKE_VERSION VERSION_GREATER 3.9)
60        cmake_policy(SET CMP0068 NEW)
61        set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
62    endif()
63endif()
64
65set(QTERMWIDGET_LIBRARY_NAME qtermwidget5)
66
67
68# main library
69
70set(SRCS
71    lib/BlockArray.cpp
72    lib/ColorScheme.cpp
73    lib/Emulation.cpp
74    lib/Filter.cpp
75    lib/History.cpp
76    lib/HistorySearch.cpp
77    lib/KeyboardTranslator.cpp
78    lib/konsole_wcwidth.cpp
79    lib/kprocess.cpp
80    lib/kpty.cpp
81    lib/kptydevice.cpp
82    lib/kptyprocess.cpp
83    lib/Pty.cpp
84    lib/qtermwidget.cpp
85    lib/Screen.cpp
86    lib/ScreenWindow.cpp
87    lib/SearchBar.cpp
88    lib/Session.cpp
89    lib/ShellCommand.cpp
90    lib/TerminalCharacterDecoder.cpp
91    lib/TerminalDisplay.cpp
92    lib/tools.cpp
93    lib/Vt102Emulation.cpp
94)
95
96# Only the Headers that need to be moc'd go here
97set(HDRS
98    lib/Emulation.h
99    lib/Filter.h
100    lib/HistorySearch.h
101    lib/kprocess.h
102    lib/kptydevice.h
103    lib/kptyprocess.h
104    lib/Pty.h
105    lib/qtermwidget.h
106    lib/ScreenWindow.h
107    lib/SearchBar.h
108    lib/Session.h
109    lib/TerminalDisplay.h
110    lib/Vt102Emulation.h
111)
112
113set(UI
114    lib/SearchBar.ui
115)
116
117# for distribution
118set(HDRS_DISTRIB
119    lib/qtermwidget.h
120    lib/Emulation.h
121    lib/KeyboardTranslator.h
122    lib/Filter.h
123    lib/qtermwidget_interface.h
124)
125
126# dirs
127set(KB_LAYOUT_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${QTERMWIDGET_LIBRARY_NAME}/kb-layouts")
128message(STATUS "Keyboard layouts will be installed in: ${KB_LAYOUT_DIR}")
129
130set(COLORSCHEMES_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${QTERMWIDGET_LIBRARY_NAME}/color-schemes")
131message(STATUS "Color schemes will be installed in: ${COLORSCHEMES_DIR}" )
132
133set(TRANSLATIONS_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${QTERMWIDGET_LIBRARY_NAME}/translations")
134message(STATUS "Translations will be installed in: ${TRANSLATIONS_DIR}")
135
136set(QTERMWIDGET_INCLUDE_DIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}/${QTERMWIDGET_LIBRARY_NAME}")
137
138CHECK_FUNCTION_EXISTS(updwtmpx HAVE_UPDWTMPX)
139
140qt_wrap_cpp(MOCS ${HDRS})
141qt_wrap_ui(UI_SRCS ${UI})
142set(PKG_CONFIG_REQ "Qt5Widgets")
143
144lxqt_translate_ts(QTERMWIDGET_QM
145    TRANSLATION_DIR "lib/translations"
146    UPDATE_TRANSLATIONS
147        ${UPDATE_TRANSLATIONS}
148    SOURCES
149        ${SRCS} ${HDRS} ${UI}
150    INSTALL_DIR
151        ${TRANSLATIONS_DIR}
152    COMPONENT
153        Runtime
154)
155
156add_library(${QTERMWIDGET_LIBRARY_NAME} SHARED ${SRCS} ${MOCS} ${UI_SRCS} ${QTERMWIDGET_QM})
157target_link_libraries(${QTERMWIDGET_LIBRARY_NAME} Qt${QT_VERSION_MAJOR}::Widgets)
158set_target_properties( ${QTERMWIDGET_LIBRARY_NAME} PROPERTIES
159                       SOVERSION ${QTERMWIDGET_VERSION_MAJOR}
160                       VERSION ${QTERMWIDGET_VERSION}
161                     )
162
163
164if(APPLE)
165    target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
166        PRIVATE
167            "HAVE_UTMPX"
168            "UTMPX_COMPAT"
169    )
170endif()
171
172if(HAVE_UPDWTMPX)
173    target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
174        PRIVATE
175            "HAVE_UPDWTMPX"
176    )
177endif()
178
179if (QTERMWIDGET_USE_UTEMPTER)
180    CHECK_INCLUDE_FILE(utempter.h HAVE_UTEMPTER)
181    if (HAVE_UTEMPTER)
182        target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME} PRIVATE
183                "HAVE_UTEMPTER"
184        )
185        find_library(UTEMPTER_LIB NAMES utempter ulog REQUIRED)
186        target_link_libraries(${QTERMWIDGET_LIBRARY_NAME} ${UTEMPTER_LIB})
187    endif()
188endif()
189
190if (UTF8PROC_FOUND)
191    target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
192        PRIVATE
193            "HAVE_UTF8PROC"
194    )
195    target_include_directories(${QTERMWIDGET_LIBRARY_NAME}
196        INTERFACE
197            ${UTF8PROC_INCLUDE_DIRS}
198    )
199    target_link_libraries(${QTERMWIDGET_LIBRARY_NAME}
200        ${UTF8PROC_LIBRARIES}
201    )
202    string(APPEND PKG_CONFIG_REQ ", libutf8proc")
203endif()
204
205if(APPLE)
206    set (CMAKE_SKIP_RPATH 1)
207    # this is a must to load the lib correctly
208    set_target_properties(${QTERMWIDGET_LIBRARY_NAME} PROPERTIES INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR})
209endif()
210
211target_compile_definitions(${QTERMWIDGET_LIBRARY_NAME}
212    PRIVATE
213        "KB_LAYOUT_DIR=\"${KB_LAYOUT_DIR}\""
214        "COLORSCHEMES_DIR=\"${COLORSCHEMES_DIR}\""
215        "TRANSLATIONS_DIR=\"${TRANSLATIONS_DIR}\""
216        "HAVE_POSIX_OPENPT"
217        "HAVE_SYS_TIME_H"
218)
219
220
221generate_export_header(${QTERMWIDGET_LIBRARY_NAME}
222    EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/lib/qtermwidget_export.h"
223    BASE_NAME QTERMWIDGET
224)
225
226# Ugly hack here: When building a multi-component build, qtermwidget_version.h is generated in the wrong dir.
227# eg:
228# build/
229#    digitalclock/
230#    qtermwidget/         <--- Should be here
231#    browser/
232#    qtermwidget_version  <--- But is instead written here
233#
234# So do an ugly hack to ensure it's found.
235# Proper fix is probably fixing the write_basic_package_version_file below.
236
237target_include_directories(${QTERMWIDGET_LIBRARY_NAME}
238    PUBLIC
239        "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>"
240        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/lib>"
241        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../lib>"
242
243    INTERFACE
244        "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
245        "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${QTERMWIDGET_LIBRARY_NAME}>"
246)
247
248write_basic_package_version_file(
249    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config-version.cmake"
250    VERSION ${QTERMWIDGET_VERSION}
251    COMPATIBILITY AnyNewerVersion
252)
253
254install(FILES
255    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config-version.cmake"
256    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}"
257    COMPONENT Devel
258)
259
260install(EXPORT
261    "${QTERMWIDGET_LIBRARY_NAME}-targets"
262    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}"
263    COMPONENT Devel
264)
265
266install(FILES
267    ${HDRS_DISTRIB} "${CMAKE_CURRENT_BINARY_DIR}/lib/qtermwidget_export.h" "${CMAKE_CURRENT_BINARY_DIR}/lib/qtermwidget_version.h"
268    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${QTERMWIDGET_LIBRARY_NAME}"
269    COMPONENT Devel
270)
271# keyboard layouts
272install(DIRECTORY
273    lib/kb-layouts/
274    DESTINATION "${KB_LAYOUT_DIR}"
275    COMPONENT Runtime
276    FILES_MATCHING PATTERN "*.keytab"
277)
278# color schemes
279install(DIRECTORY
280    lib/color-schemes/
281    DESTINATION "${COLORSCHEMES_DIR}"
282    COMPONENT Runtime
283    FILES_MATCHING PATTERN "*.*schem*"
284)
285
286lxqt_create_pkgconfig_file(
287    PACKAGE_NAME ${QTERMWIDGET_LIBRARY_NAME}
288    DESCRIPTIVE_NAME ${QTERMWIDGET_LIBRARY_NAME}
289    DESCRIPTION "QTermWidget library for Qt ${QTERMWIDGET_VERSION_MAJOR}.x"
290    INCLUDEDIRS ${QTERMWIDGET_LIBRARY_NAME}
291    LIBS ${QTERMWIDGET_LIBRARY_NAME}
292    REQUIRES ${PKG_CONFIG_REQ}
293    VERSION ${QTERMWIDGET_VERSION}
294    INSTALL
295    COMPONENT Devel
296)
297
298configure_file(
299    "${PROJECT_SOURCE_DIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}-config.cmake.in"
300    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config.cmake"
301    @ONLY
302)
303
304configure_file(
305    "${PROJECT_SOURCE_DIR}/lib/qtermwidget_version.h.in"
306    "${CMAKE_BINARY_DIR}/lib/qtermwidget_version.h"
307    @ONLY
308)
309
310install(FILES
311    "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-config.cmake"
312    DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QTERMWIDGET_LIBRARY_NAME}"
313    COMPONENT Devel
314)
315
316install(TARGETS ${QTERMWIDGET_LIBRARY_NAME}
317    DESTINATION "${CMAKE_INSTALL_LIBDIR}"
318    EXPORT "${QTERMWIDGET_LIBRARY_NAME}-targets"
319    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
320    PUBLIC_HEADER
321    COMPONENT Runtime
322)
323
324export(TARGETS ${QTERMWIDGET_LIBRARY_NAME}
325    FILE "${CMAKE_BINARY_DIR}/${QTERMWIDGET_LIBRARY_NAME}-targets.cmake"
326    EXPORT_LINK_INTERFACE_LIBRARIES
327)
328# end of main library
329
330
331# example application
332if(BUILD_EXAMPLE)
333    set(EXAMPLE_SRC examples/cpp/main.cpp)
334    add_executable(example ${EXAMPLE_SRC})
335    target_link_libraries(example ${QTERMWIDGET_LIBRARY_NAME})
336endif()
337# end of example application
338
339# python binding
340if (QTERMWIDGET_BUILD_PYTHON_BINDING)
341    message(SEND_ERROR "QTERMWIDGET_BUILD_PYTHON_BINDING is no longer supported. Check README.md for how to build PyQt bindings.")
342endif()
343# end of python binding
344
345
346CONFIGURE_FILE(
347    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
348    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
349    IMMEDIATE @ONLY
350)
351ADD_CUSTOM_TARGET(uninstall
352    "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
353)
354
355#message(STATUS "Include dir: ${PROJECT_SOURCE_DIR}")
356# We export this information so that other projects can use it
357set(${PROJECT_NAME}_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/lib CACHE INTERNAL "${PROJECT_NAME}: Include directories" FORCE)
358set(${PROJECT_NAME}_LIB_DIRS ${PROJECT_BINARY_DIR} CACHE INTERNAL "${PROJECT_NAME}: Library directories" FORCE)
359#set(${PROJECT_NAME}_BUILD_DIRS ${PROJECT_B} CACHE INTERNAL "${PROJECT_NAME}: Library directories" FORCE)
360
361
Note: See TracBrowser for help on using the repository browser.