# Copyright (c) 2023-present The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or https://opensource.org/license/mit/. if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") enable_language(OBJCXX) set(CMAKE_OBJCXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") set(CMAKE_OBJCXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") set(CMAKE_OBJCXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") set(CMAKE_OBJCXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}") string(APPEND CMAKE_OBJCXX_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CXXFLAGS}") endif() get_target_property(qt_lib_type Qt5::Core TYPE) function(import_plugins target) if(qt_lib_type STREQUAL "STATIC_LIBRARY") set(plugins Qt5::QMinimalIntegrationPlugin) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") list(APPEND plugins Qt5::QXcbIntegrationPlugin) elseif(WIN32) list(APPEND plugins Qt5::QWindowsIntegrationPlugin Qt5::QWindowsVistaStylePlugin) elseif(APPLE) list(APPEND plugins Qt5::QCocoaIntegrationPlugin Qt5::QMacStylePlugin) endif() qt5_import_plugins(${target} INCLUDE ${plugins} EXCLUDE_BY_TYPE imageformats iconengines ) endif() endfunction() # For Qt-specific commands and variables, please consult: # - https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html # - https://doc.qt.io/qt-5/cmake-manual.html set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOUIC_SEARCH_PATHS forms) # TODO: The file(GLOB ...) command should be replaced with an explicit # file list. Such a change must be synced with the corresponding change # to https://github.com/bitcoin-core/bitcoin-maintainer-tools/blob/main/update-translations.py file(GLOB ts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} locale/*.ts) set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/locale) qt5_add_translation(qm_files ${ts_files}) configure_file(bitcoin_locale.qrc bitcoin_locale.qrc USE_SOURCE_PERMISSIONS COPYONLY) # The bitcoinqt sources have to include headers in # order to parse them to collect translatable strings. add_library(bitcoinqt STATIC EXCLUDE_FROM_ALL bantablemodel.cpp bantablemodel.h bitcoin.cpp bitcoin.h bitcoinaddressvalidator.cpp bitcoinaddressvalidator.h bitcoinamountfield.cpp bitcoinamountfield.h bitcoingui.cpp bitcoingui.h bitcoinunits.cpp bitcoinunits.h clientmodel.cpp clientmodel.h csvmodelwriter.cpp csvmodelwriter.h guiutil.cpp guiutil.h initexecutor.cpp initexecutor.h intro.cpp intro.h $<$:macdockiconhandler.h> $<$:macdockiconhandler.mm> $<$:macnotificationhandler.h> $<$:macnotificationhandler.mm> $<$:macos_appnap.h> $<$:macos_appnap.mm> modaloverlay.cpp modaloverlay.h networkstyle.cpp networkstyle.h notificator.cpp notificator.h optionsdialog.cpp optionsdialog.h optionsmodel.cpp optionsmodel.h peertablemodel.cpp peertablemodel.h peertablesortproxy.cpp peertablesortproxy.h platformstyle.cpp platformstyle.h qvalidatedlineedit.cpp qvalidatedlineedit.h qvaluecombobox.cpp qvaluecombobox.h rpcconsole.cpp rpcconsole.h splashscreen.cpp splashscreen.h trafficgraphwidget.cpp trafficgraphwidget.h utilitydialog.cpp utilitydialog.h $<$:winshutdownmonitor.cpp> $<$:winshutdownmonitor.h> bitcoin.qrc ${CMAKE_CURRENT_BINARY_DIR}/bitcoin_locale.qrc ) target_compile_definitions(bitcoinqt PUBLIC QT_NO_KEYWORDS QT_USE_QSTRINGBUILDER ) target_include_directories(bitcoinqt PUBLIC $ ) set_property(SOURCE macnotificationhandler.mm # Ignore warnings "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0". APPEND PROPERTY COMPILE_OPTIONS -Wno-deprecated-declarations ) target_link_libraries(bitcoinqt PUBLIC Qt5::Widgets PRIVATE core_interface bitcoin_cli leveldb Boost::headers $ $ $<$:-framework\ AppKit> $<$:shlwapi> ) if(ENABLE_WALLET) target_sources(bitcoinqt PRIVATE addressbookpage.cpp addressbookpage.h addresstablemodel.cpp addresstablemodel.h askpassphrasedialog.cpp askpassphrasedialog.h coincontroldialog.cpp coincontroldialog.h coincontroltreewidget.cpp coincontroltreewidget.h createwalletdialog.cpp createwalletdialog.h editaddressdialog.cpp editaddressdialog.h openuridialog.cpp openuridialog.h overviewpage.cpp overviewpage.h paymentserver.cpp paymentserver.h psbtoperationsdialog.cpp psbtoperationsdialog.h qrimagewidget.cpp qrimagewidget.h receivecoinsdialog.cpp receivecoinsdialog.h receiverequestdialog.cpp receiverequestdialog.h recentrequeststablemodel.cpp recentrequeststablemodel.h sendcoinsdialog.cpp sendcoinsdialog.h sendcoinsentry.cpp sendcoinsentry.h signverifymessagedialog.cpp signverifymessagedialog.h transactiondesc.cpp transactiondesc.h transactiondescdialog.cpp transactiondescdialog.h transactionfilterproxy.cpp transactionfilterproxy.h transactionoverviewwidget.cpp transactionoverviewwidget.h transactionrecord.cpp transactionrecord.h transactiontablemodel.cpp transactiontablemodel.h transactionview.cpp transactionview.h walletcontroller.cpp walletcontroller.h walletframe.cpp walletframe.h walletmodel.cpp walletmodel.h walletmodeltransaction.cpp walletmodeltransaction.h walletview.cpp walletview.h ) target_link_libraries(bitcoinqt PRIVATE bitcoin_wallet Qt5::Network ) endif() if(WITH_DBUS) target_link_libraries(bitcoinqt PRIVATE Qt5::DBus) endif() if(qt_lib_type STREQUAL "STATIC_LIBRARY") # We want to define static plugins to link ourselves, thus preventing # automatic linking against a "sane" set of default static plugins. qt5_import_plugins(bitcoinqt EXCLUDE_BY_TYPE bearer iconengines imageformats platforms styles ) endif() add_executable(bitcoin-qt main.cpp ../init/bitcoin-qt.cpp ) add_windows_resources(bitcoin-qt res/bitcoin-qt-res.rc) target_link_libraries(bitcoin-qt core_interface bitcoinqt bitcoin_node ) import_plugins(bitcoin-qt) set(installable_targets bitcoin-qt) if(WIN32) set_target_properties(bitcoin-qt PROPERTIES WIN32_EXECUTABLE TRUE) endif() if(WITH_MULTIPROCESS) add_executable(bitcoin-gui main.cpp ../init/bitcoin-gui.cpp ) target_link_libraries(bitcoin-gui core_interface bitcoinqt bitcoin_node bitcoin_ipc ) import_plugins(bitcoin-gui) list(APPEND installable_targets bitcoin-gui) if(WIN32) set_target_properties(bitcoin-gui PROPERTIES WIN32_EXECUTABLE TRUE) endif() endif() install(TARGETS ${installable_targets} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT GUI ) if(BUILD_GUI_TESTS) add_subdirectory(test) endif() # Gets sources to be parsed to gather translatable strings. function(get_translatable_sources var) set(result) set(targets) foreach(dir IN ITEMS ${ARGN}) get_directory_property(dir_targets DIRECTORY ${PROJECT_SOURCE_DIR}/${dir} BUILDSYSTEM_TARGETS) list(APPEND targets ${dir_targets}) endforeach() foreach(target IN LISTS targets) get_target_property(target_sources ${target} SOURCES) if(target_sources) foreach(source IN LISTS target_sources) # Get an expression from the generator expression, if any. if(source MATCHES ":([^>]+)>$") set(source ${CMAKE_MATCH_1}) endif() cmake_path(GET source EXTENSION LAST_ONLY ext) if(ext STREQUAL ".qrc") continue() endif() if(NOT IS_ABSOLUTE source) get_target_property(target_source_dir ${target} SOURCE_DIR) cmake_path(APPEND target_source_dir ${source} OUTPUT_VARIABLE source) endif() list(APPEND result ${source}) endforeach() endif() endforeach() set(${var} ${result} PARENT_SCOPE) endfunction() find_program(XGETTEXT_EXECUTABLE xgettext) find_program(SED_EXECUTABLE sed) if(NOT XGETTEXT_EXECUTABLE) add_custom_target(translate COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU gettext-tools not found" ) elseif(NOT SED_EXECUTABLE) add_custom_target(translate COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU sed not found" ) else() set(translatable_sources_directories src src/qt src/util) if(ENABLE_WALLET) list(APPEND translatable_sources_directories src/wallet) endif() get_translatable_sources(translatable_sources ${translatable_sources_directories}) get_translatable_sources(qt_translatable_sources src/qt) file(GLOB ui_files ${CMAKE_CURRENT_SOURCE_DIR}/forms/*.ui) add_custom_target(translate COMMAND ${CMAKE_COMMAND} -E env XGETTEXT=${XGETTEXT_EXECUTABLE} COPYRIGHT_HOLDERS=${COPYRIGHT_HOLDERS} ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/share/qt/extract_strings_qt.py ${translatable_sources} COMMAND Qt5::lupdate -no-obsolete -I ${PROJECT_SOURCE_DIR}/src -locations relative ${CMAKE_CURRENT_SOURCE_DIR}/bitcoinstrings.cpp ${ui_files} ${qt_translatable_sources} -ts ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts COMMAND Qt5::lconvert -drop-translations -o ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf -i ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts COMMAND ${SED_EXECUTABLE} -i.old -e "s|source-language=\"en\" target-language=\"en\"|source-language=\"en\"|" -e "/<\\/target>/d" ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf.old WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src VERBATIM ) endif()