1- cmake_minimum_required (VERSION 3.6.0 )
2- project (fcitx VERSION 5.1.11 )
1+ cmake_minimum_required (VERSION 3.13 )
2+ project (fcitx VERSION 5.1.17 )
33set (FCITX_VERSION ${PROJECT_VERSION} )
44
55find_package (ECM REQUIRED 1.0.0)
@@ -16,11 +16,14 @@ include(WriteBasicConfigVersionFile)
1616include (ECMUninstallTarget)
1717include (src/lib/fcitx-utils/Fcitx5Macros.cmake)
1818include (CheckSymbolExists)
19+ include (CheckIncludeFile)
20+ include (CheckCXXCompilerFlag)
1921
2022#######################################################################
2123# Options
2224#######################################################################
23- option (ENABLE_TEST "Build Test" On )
25+ option (ENABLE_TESTING_ADDONS "Build testing frontend, im and ui addons" On )
26+ option (ENABLE_TEST "Build Test (Need ENABLE_TESTING_ADDONS=On)" On )
2427option (ENABLE_COVERAGE "Build the project with gcov support (Need ENABLE_TEST=On)" Off )
2528set (GCOV_TOOL "gcov" CACHE STRING "Path to gcov tool used by coverage." )
2629set (DEFAULT_XKB_RULES "evdev" CACHE STRING "Xkb rules name" )
@@ -31,12 +34,15 @@ option(ENABLE_DBUS "Enable DBus" On)
3134option (ENABLE_DOC "Build doxygen" Off )
3235option (ENABLE_SERVER "Build a fcitx as server, disable this option if you want to use fcitx as an embedded library." On )
3336option (ENABLE_KEYBOARD "Enable key event translation with XKB and build keyboard engine" On )
34- option (USE_SYSTEMD "Use systemd for event loop and dbus, will fallback to libuv/libdbus if not found." On )
37+ option (USE_SYSTEMD "Use systemd for event loop and dbus, will fallback to libuv/libdbus if not found. Only used when EVENT_LOOP_BACKEND is auto. " On )
3538option (ENABLE_XDGAUTOSTART "Enable xdg autostart desktop file installation" On )
3639option (USE_FLATPAK_ICON "Use flatpak icon name for desktop files" Off )
3740option (ENABLE_EMOJI "Enable emoji module" On )
3841option (ENABLE_LIBUUID "Use libuuid for uuid generation" On )
39- set (NO_PREEDIT_APPS "gvim.*,wps.*,wpp.*,et.*" CACHE STRING "Disable preedit for follwing app by default." )
42+ option (BUILD_SPELL_DICT "Build en_dict.fscd for English spell check" On )
43+ option (BUILD_SHARED_LIBS "Build library as shared libs" On )
44+ set (NO_PREEDIT_APPS "gvim.*,wps.*,wpp.*,et.*" CACHE STRING "Disable preedit for following app by default." )
45+ set (EVENT_LOOP_BACKEND "auto" CACHE STRING "Set the underlying event loop implementation, valid values are auto,systemd,libuv,none" )
4046
4147if (ENABLE_EMOJI)
4248 find_package (ZLIB REQUIRED)
@@ -46,35 +52,67 @@ if ((ENABLE_WAYLAND OR ENABLE_X11) AND NOT ENABLE_KEYBOARD)
4652 message (FATAL_ERROR "X11 and Wayland require ENABLE_KEYBOARD to be set to ON." )
4753endif ()
4854
49-
5055#######################################################################
5156# Find packages
5257#######################################################################
5358
5459find_package (PkgConfig REQUIRED)
5560
56- if (USE_SYSTEMD)
57- find_package (Systemd)
58- endif ()
61+ set (CANDIDATE_EVENT_LOOP_BACKENDS)
5962
60- if (USE_FLATPAK_ICON)
61- set (FCITX_ICON_NAME "org.fcitx.Fcitx5" )
62- else ()
63- set (FCITX_ICON_NAME "fcitx" )
63+ if (EVENT_LOOP_BACKEND STREQUAL "auto" )
64+ if (USE_SYSTEMD)
65+ list (APPEND CANDIDATE_EVENT_LOOP_BACKENDS systemd)
66+ endif ()
67+
68+ list (APPEND CANDIDATE_EVENT_LOOP_BACKENDS libuv)
69+ elseif (EVENT_LOOP_BACKEND STREQUAL "systemd" )
70+ list (APPEND CANDIDATE_EVENT_LOOP_BACKENDS systemd)
71+ elseif (EVENT_LOOP_BACKEND STREQUAL "libuv" )
72+ list (APPEND CANDIDATE_EVENT_LOOP_BACKENDS libuv)
73+ elseif (EVENT_LOOP_BACKEND STREQUAL "none" )
74+ list (APPEND CANDIDATE_EVENT_LOOP_BACKENDS none)
6475endif ()
6576
66- if (NOT TARGET Systemd::Systemd)
67- if (ENABLE_DBUS)
68- pkg_check_modules(DBus REQUIRED IMPORTED_TARGET "dbus-1" )
69- pkg_get_variable(DBUS_SYSTEM_BUS_DEFAULT_ADDRESS "dbus-1" "system_bus_default_address" )
70- endif ()
77+ set (FCITX_EVENT_LOOP_BACKEND "" )
78+ foreach (CANDIDATE_EVENT_LOOP_BACKEND IN LISTS CANDIDATE_EVENT_LOOP_BACKENDS)
79+ if (CANDIDATE_EVENT_LOOP_BACKEND STREQUAL systemd)
80+ find_package (Systemd)
81+ if (TARGET Systemd::Systemd)
82+ set (FCITX_EVENT_LOOP_BACKEND "systemd" )
83+ break ()
84+ endif ()
85+ elseif (CANDIDATE_EVENT_LOOP_BACKEND STREQUAL libuv)
86+ if (NOT LIBUV_TARGET)
87+ if (NOT (TARGET PkgConfig::LibUV))
88+ pkg_check_modules(LibUV IMPORTED_TARGET "libuv" )
89+ set (LIBUV_TARGET PkgConfig::LibUV)
90+ endif ()
91+ endif ()
7192
72- if (NOT LIBUV_TARGET)
73- if ( NOT ( TARGET PkgConfig::LibUV) )
74- pkg_check_modules(LibUV REQUIRED IMPORTED_TARGET "libuv" )
93+ if (TARGET " ${ LIBUV_TARGET} " )
94+ set (FCITX_EVENT_LOOP_BACKEND "libuv" )
95+ break ( )
7596 endif ()
76- set (LIBUV_TARGET PkgConfig::LibUV)
97+ elseif (CANDIDATE_EVENT_LOOP_BACKEND STREQUAL none)
98+ set (FCITX_EVENT_LOOP_BACKEND "none" )
99+ break ()
77100 endif ()
101+ endforeach ()
102+
103+ if (ENABLE_DBUS AND NOT (FCITX_EVENT_LOOP_BACKEND STREQUAL systemd))
104+ pkg_check_modules(DBus REQUIRED IMPORTED_TARGET "dbus-1" )
105+ pkg_get_variable(DBUS_SYSTEM_BUS_DEFAULT_ADDRESS "dbus-1" "system_bus_default_address" )
106+ endif ()
107+
108+ if (FCITX_EVENT_LOOP_BACKEND STREQUAL "" )
109+ message (FATAL_ERROR "Failed to find a valid event loop backend. Backends checked: ${CANDIDATE_EVENT_LOOP_BACKENDS} " )
110+ endif ()
111+
112+ if (USE_FLATPAK_ICON)
113+ set (FCITX_ICON_NAME "org.fcitx.Fcitx5" )
114+ else ()
115+ set (FCITX_ICON_NAME "fcitx" )
78116endif ()
79117
80118if (${CMAKE_SYSTEM_NAME} MATCHES "BSD|DragonFly" )
@@ -94,16 +132,6 @@ find_package(Pthread REQUIRED)
94132find_package (Execinfo)
95133find_package (Gettext REQUIRED)
96134
97- if (NOT (TARGET fmt::fmt OR TARGET fmt::fmt-header-only))
98- find_package (fmt REQUIRED)
99- endif ()
100-
101- if (TARGET fmt::fmt-header-only)
102- set (FMT_TARGET fmt::fmt-header-only)
103- else ()
104- set (FMT_TARGET fmt::fmt)
105- endif ()
106-
107135set (REQUIRED_XKBCOMMON_COMPONENTS XKBCommon)
108136if (ENABLE_X11)
109137 set (REQUIRED_XKBCOMMON_COMPONENTS ${REQUIRED_XKBCOMMON_COMPONENTS} X11)
@@ -121,7 +149,7 @@ if (ENABLE_KEYBOARD)
121149 find_package (XKBCommon REQUIRED COMPONENTS ${REQUIRED_XKBCOMMON_COMPONENTS} )
122150 find_package (IsoCodes REQUIRED)
123151 find_package (XKeyboardConfig REQUIRED)
124- pkg_check_modules(JsonC REQUIRED IMPORTED_TARGET "json-c" )
152+ find_package (nlohmann_json )
125153
126154 set (DEFAULT_XKB_RULES_FILES "${XKEYBOARDCONFIG_XKBBASE} /rules/${DEFAULT_XKB_RULES} .xml" )
127155 if (NOT EXISTS "${DEFAULT_XKB_RULES_FILES} " AND NOT APPLE )
@@ -139,9 +167,9 @@ endif()
139167
140168if (ENABLE_WAYLAND)
141169 set (REQUIRED_WAYLAND_COMPONENTS Client Cursor)
142- find_package (Wayland REQUIRED COMPONENTS ${REQUIRED_WAYLAND_COMPONENTS} )
170+ find_package (Wayland 1.22 REQUIRED COMPONENTS ${REQUIRED_WAYLAND_COMPONENTS} )
143171 find_package (WaylandScanner REQUIRED)
144- find_package (WaylandProtocols REQUIRED)
172+ find_package (WaylandProtocols 1.39 REQUIRED)
145173 pkg_check_modules(Gio IMPORTED_TARGET gio-2.0)
146174endif ()
147175
@@ -163,13 +191,19 @@ if(NOT CMAKE_INSTALL_LIBDATADIR)
163191 set (CMAKE_INSTALL_LIBDATADIR "${CMAKE_INSTALL_LIBDIR} " CACHE PATH "libdata root (LIBDIR)" )
164192endif ()
165193
166- get_filename_component (CMAKE_INSTALL_FULL_LIBDATADIR " ${ CMAKE_INSTALL_LIBDATADIR} " ABSOLUTE )
194+ GNUInstallDirs_get_absolute_install_dir (CMAKE_INSTALL_FULL_LIBDATADIR CMAKE_INSTALL_LIBDATADIR LIBDATADIR )
167195mark_as_advanced (CMAKE_INSTALL_LIBDATADIR)
168196mark_as_advanced (CMAKE_INSTALL_FULL_LIBDATADIR)
169197
198+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR} /lib" )
199+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR} /bin" )
200+ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR} /bin" )
201+
170202include (Fcitx5CompilerSettings)
203+ check_cxx_compiler_flag(-Wno-deprecated-declarations HAVE_NO_DEPRECATED_DECLARATIONS)
171204
172205set (FCITX_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} )
206+ set (FCITX_INSTALL_SYSCONFDIR ${CMAKE_INSTALL_FULL_SYSCONFDIR} )
173207set (FCITX_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_FULL_INCLUDEDIR} )
174208set (FCITX_INSTALL_LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR} )
175209set (FCITX_INSTALL_LIBDATADIR ${CMAKE_INSTALL_FULL_LIBDATADIR} )
@@ -181,18 +215,28 @@ set(FCITX_INSTALL_LOCALEDIR ${CMAKE_INSTALL_FULL_LOCALEDIR})
181215set (FCITX_INSTALL_ADDONDIR "${CMAKE_INSTALL_FULL_LIBDIR} /fcitx5" )
182216set (FCITX_INSTALL_CMAKECONFIG_DIR "${CMAKE_INSTALL_FULL_LIBDIR} /cmake" )
183217set (FCITX_INSTALL_MODULE_HEADER_DIR "${CMAKE_INSTALL_FULL_INCLUDEDIR} /Fcitx5/Module/fcitx-module" )
184- # TODO mac/win
185- set (FCITX_LIBRARY_SUFFIX ".so" )
218+
219+ if (WIN32 )
220+ set (FCITX_LIBRARY_SUFFIX ".dll" )
221+ else ()
222+ set (FCITX_LIBRARY_SUFFIX ".so" )
223+ endif ()
186224
187225check_function_exists(pipe2 HAVE_PIPE2)
226+ check_include_file(sys/wait.h HAVE_SYS_WAIT_H)
227+ check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
228+ check_include_file(sys/uio.h HAVE_SYS_UIO_H)
188229
189230configure_file (${CMAKE_CURRENT_SOURCE_DIR} /config.h.in ${CMAKE_CURRENT_BINARY_DIR} /config.h)
190231include_directories (${CMAKE_CURRENT_BINARY_DIR} )
191232
192233add_subdirectory (src)
193234add_subdirectory (data)
194235add_subdirectory (po)
195- add_subdirectory (testing)
236+
237+ if (ENABLE_TESTING_ADDONS)
238+ add_subdirectory (testing)
239+ endif ()
196240
197241#######################################################################
198242# Test features
0 commit comments