CMakeLists.txt raw
1 # Copyright (c) 2023-present The Bitcoin Core developers
2 # Distributed under the MIT software license, see the accompanying
3 # file COPYING or https://opensource.org/license/mit/.
4
5 if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
6 enable_language(OBJCXX)
7 set(CMAKE_OBJCXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
8 set(CMAKE_OBJCXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
9 set(CMAKE_OBJCXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
10 set(CMAKE_OBJCXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
11 string(APPEND CMAKE_OBJCXX_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CXXFLAGS}")
12 endif()
13
14 get_target_property(qt_lib_type Qt6::Core TYPE)
15
16 function(import_plugins target)
17 if(qt_lib_type STREQUAL "STATIC_LIBRARY")
18 set(plugins Qt6::QMinimalIntegrationPlugin)
19 if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|FreeBSD|OpenBSD)$")
20 list(APPEND plugins Qt6::QXcbIntegrationPlugin)
21 elseif(WIN32)
22 list(APPEND plugins Qt6::QWindowsIntegrationPlugin Qt6::QModernWindowsStylePlugin)
23 elseif(APPLE)
24 list(APPEND plugins Qt6::QCocoaIntegrationPlugin Qt6::QMacStylePlugin)
25 endif()
26 qt6_import_plugins(${target}
27 INCLUDE ${plugins}
28 EXCLUDE_BY_TYPE
29 accessiblebridge
30 platforms
31 platforms_darwin
32 xcbglintegrations
33 platformthemes
34 platforminputcontexts
35 generic
36 iconengines
37 imageformats
38 egldeviceintegrations
39 styles
40 networkaccess
41 networkinformation
42 tls
43 )
44 endif()
45 endfunction()
46
47 # For Qt-specific commands and variables, please consult:
48 # - https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html
49 # - https://doc.qt.io/qt-5/cmake-manual.html
50
51 set(CMAKE_AUTOMOC ON)
52 set(CMAKE_AUTOMOC_MOC_OPTIONS "-p${CMAKE_CURRENT_SOURCE_DIR}")
53 set(CMAKE_AUTOUIC ON)
54 set(CMAKE_AUTOUIC_SEARCH_PATHS forms)
55
56 set(CMAKE_AUTORCC OFF)
57 configure_file(bitcoin_locale.qrc bitcoin_locale.qrc USE_SOURCE_PERMISSIONS COPYONLY)
58 qt6_add_resources(BITCOIN_QRC bitcoin.qrc)
59 qt6_add_resources(BITCOIN_LOCALE_QRC ${CMAKE_CURRENT_BINARY_DIR}/bitcoin_locale.qrc)
60 # See: https://bugreports.qt.io/browse/QTBUG-141858.
61 get_target_property(warn_flags warn_interface INTERFACE_COMPILE_OPTIONS)
62 if("-Wtrailing-whitespace=any" IN_LIST warn_flags)
63 set_source_files_properties(${BITCOIN_QRC} ${BITCOIN_LOCALE_QRC} PROPERTIES COMPILE_OPTIONS -Wno-trailing-whitespace)
64 endif()
65 unset(warn_flags)
66
67 # The bitcoinqt sources have to include headers in
68 # order to parse them to collect translatable strings.
69 add_library(bitcoinqt STATIC EXCLUDE_FROM_ALL
70 bantablemodel.cpp
71 bantablemodel.h
72 bitcoin.cpp
73 bitcoin.h
74 bitcoinaddressvalidator.cpp
75 bitcoinaddressvalidator.h
76 bitcoinamountfield.cpp
77 bitcoinamountfield.h
78 bitcoingui.cpp
79 bitcoingui.h
80 bitcoinunits.cpp
81 bitcoinunits.h
82 clientmodel.cpp
83 clientmodel.h
84 csvmodelwriter.cpp
85 csvmodelwriter.h
86 freespacechecker.cpp
87 freespacechecker.h
88 guiutil.cpp
89 guiutil.h
90 initexecutor.cpp
91 initexecutor.h
92 intro.cpp
93 intro.h
94 $<$<PLATFORM_ID:Darwin>:macdockiconhandler.h>
95 $<$<PLATFORM_ID:Darwin>:macdockiconhandler.mm>
96 $<$<PLATFORM_ID:Darwin>:macnotificationhandler.h>
97 $<$<PLATFORM_ID:Darwin>:macnotificationhandler.mm>
98 $<$<PLATFORM_ID:Darwin>:macos_appnap.h>
99 $<$<PLATFORM_ID:Darwin>:macos_appnap.mm>
100 modaloverlay.cpp
101 modaloverlay.h
102 networkstyle.cpp
103 networkstyle.h
104 notificator.cpp
105 notificator.h
106 optionsdialog.cpp
107 optionsdialog.h
108 optionsmodel.cpp
109 optionsmodel.h
110 peertablemodel.cpp
111 peertablemodel.h
112 peertablesortproxy.cpp
113 peertablesortproxy.h
114 platformstyle.cpp
115 platformstyle.h
116 qvalidatedlineedit.cpp
117 qvalidatedlineedit.h
118 qvaluecombobox.cpp
119 qvaluecombobox.h
120 rpcconsole.cpp
121 rpcconsole.h
122 splashscreen.cpp
123 splashscreen.h
124 trafficgraphwidget.cpp
125 trafficgraphwidget.h
126 utilitydialog.cpp
127 utilitydialog.h
128 $<$<PLATFORM_ID:Windows>:winshutdownmonitor.cpp>
129 $<$<PLATFORM_ID:Windows>:winshutdownmonitor.h>
130 ${BITCOIN_QRC}
131 ${BITCOIN_LOCALE_QRC}
132 )
133 target_compile_definitions(bitcoinqt
134 PUBLIC
135 QT_NO_KEYWORDS
136 QT_USE_QSTRINGBUILDER
137 )
138 target_include_directories(bitcoinqt
139 PUBLIC
140 $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>
141 )
142 set_property(SOURCE macnotificationhandler.mm
143 # Ignore warnings "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0".
144 APPEND PROPERTY COMPILE_OPTIONS -Wno-deprecated-declarations
145 )
146 target_link_libraries(bitcoinqt
147 PUBLIC
148 Qt6::Widgets
149 PRIVATE
150 core_interface
151 bitcoin_cli
152 leveldb
153 Boost::headers
154 $<TARGET_NAME_IF_EXISTS:QRencode::QRencode>
155 $<$<PLATFORM_ID:Darwin>:-framework\ AppKit>
156 $<$<CXX_COMPILER_ID:MSVC>:shlwapi>
157 )
158
159 if(ENABLE_WALLET)
160 target_sources(bitcoinqt
161 PRIVATE
162 addressbookpage.cpp
163 addressbookpage.h
164 addresstablemodel.cpp
165 addresstablemodel.h
166 askpassphrasedialog.cpp
167 askpassphrasedialog.h
168 coincontroldialog.cpp
169 coincontroldialog.h
170 coincontroltreewidget.cpp
171 coincontroltreewidget.h
172 createwalletdialog.cpp
173 createwalletdialog.h
174 editaddressdialog.cpp
175 editaddressdialog.h
176 openuridialog.cpp
177 openuridialog.h
178 overviewpage.cpp
179 overviewpage.h
180 paymentserver.cpp
181 paymentserver.h
182 psbtoperationsdialog.cpp
183 psbtoperationsdialog.h
184 qrimagewidget.cpp
185 qrimagewidget.h
186 receivecoinsdialog.cpp
187 receivecoinsdialog.h
188 receiverequestdialog.cpp
189 receiverequestdialog.h
190 recentrequeststablemodel.cpp
191 recentrequeststablemodel.h
192 sendcoinsdialog.cpp
193 sendcoinsdialog.h
194 sendcoinsentry.cpp
195 sendcoinsentry.h
196 signverifymessagedialog.cpp
197 signverifymessagedialog.h
198 transactiondesc.cpp
199 transactiondesc.h
200 transactiondescdialog.cpp
201 transactiondescdialog.h
202 transactionfilterproxy.cpp
203 transactionfilterproxy.h
204 transactionoverviewwidget.cpp
205 transactionoverviewwidget.h
206 transactionrecord.cpp
207 transactionrecord.h
208 transactiontablemodel.cpp
209 transactiontablemodel.h
210 transactionview.cpp
211 transactionview.h
212 walletcontroller.cpp
213 walletcontroller.h
214 walletframe.cpp
215 walletframe.h
216 walletmodel.cpp
217 walletmodel.h
218 walletmodeltransaction.cpp
219 walletmodeltransaction.h
220 walletview.cpp
221 walletview.h
222 )
223 target_link_libraries(bitcoinqt
224 PRIVATE
225 bitcoin_wallet
226 Qt6::Network
227 )
228 endif()
229
230 if(WITH_DBUS)
231 target_link_libraries(bitcoinqt PRIVATE Qt6::DBus)
232 endif()
233
234 if(qt_lib_type STREQUAL "STATIC_LIBRARY")
235 # We want to define static plugins to link ourselves, thus preventing
236 # automatic linking against a "sane" set of default static plugins.
237 qt6_import_plugins(bitcoinqt
238 EXCLUDE_BY_TYPE
239 accessiblebridge
240 platforms
241 platforms_darwin
242 xcbglintegrations
243 platformthemes
244 platforminputcontexts
245 generic
246 iconengines
247 imageformats
248 egldeviceintegrations
249 styles
250 networkaccess
251 networkinformation
252 tls
253 )
254 endif()
255
256 add_subdirectory(locale)
257
258 add_executable(bitcoin-qt
259 main.cpp
260 ../init/bitcoin-qt.cpp
261 )
262
263 add_windows_resources(bitcoin-qt res/bitcoin-qt-res.rc)
264 add_windows_application_manifest(bitcoin-qt)
265
266 target_link_libraries(bitcoin-qt
267 core_interface
268 bitcoinqt
269 bitcoin_node
270 )
271
272 import_plugins(bitcoin-qt)
273 install_binary_component(bitcoin-qt HAS_MANPAGE)
274 if(WIN32)
275 set_target_properties(bitcoin-qt PROPERTIES WIN32_EXECUTABLE TRUE)
276 endif()
277
278 if(ENABLE_IPC)
279 add_executable(bitcoin-gui
280 main.cpp
281 ../init/bitcoin-gui.cpp
282 )
283 target_link_libraries(bitcoin-gui
284 core_interface
285 bitcoinqt
286 bitcoin_node
287 bitcoin_ipc
288 )
289 import_plugins(bitcoin-gui)
290 install_binary_component(bitcoin-gui INTERNAL)
291 if(WIN32)
292 set_target_properties(bitcoin-gui PROPERTIES WIN32_EXECUTABLE TRUE)
293 endif()
294 endif()
295
296 if(BUILD_GUI_TESTS)
297 add_subdirectory(test)
298 endif()
299
300 find_program(XGETTEXT_EXECUTABLE xgettext)
301 if(NOT XGETTEXT_EXECUTABLE)
302 add_custom_target(translate
303 COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU gettext-tools not found"
304 )
305 else()
306 add_custom_target(translate COMMAND ${CMAKE_COMMAND}
307 -D "PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}"
308 -D "COPYRIGHT_HOLDERS=${COPYRIGHT_HOLDERS}"
309 -D "LCONVERT_EXECUTABLE=$<TARGET_FILE:Qt6::lconvert>"
310 -D "LUPDATE_EXECUTABLE=$<TARGET_FILE:Qt6::lupdate>"
311 -D "XGETTEXT_EXECUTABLE=${XGETTEXT_EXECUTABLE}"
312 -P ${PROJECT_SOURCE_DIR}/share/qt/translate.cmake
313 )
314 endif()
315