# Copyright (c) 2013-2016 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.

bin_PROGRAMS += qt/bitcoin-qt

if BUILD_BITCOIN_GUI
  bin_PROGRAMS += bitcoin-gui
endif

EXTRA_LIBRARIES += qt/libbitcoinqt.a

# bitcoin qt core #
include Makefile.qt_locale.include

QT_FORMS_UI = \
  qt/forms/addressbookpage.ui \
  qt/forms/askpassphrasedialog.ui \
  qt/forms/coincontroldialog.ui \
  qt/forms/createwalletdialog.ui \
  qt/forms/editaddressdialog.ui \
  qt/forms/helpmessagedialog.ui \
  qt/forms/intro.ui \
  qt/forms/modaloverlay.ui \
  qt/forms/openuridialog.ui \
  qt/forms/optionsdialog.ui \
  qt/forms/overviewpage.ui \
  qt/forms/psbtoperationsdialog.ui \
  qt/forms/receivecoinsdialog.ui \
  qt/forms/receiverequestdialog.ui \
  qt/forms/debugwindow.ui \
  qt/forms/sendcoinsdialog.ui \
  qt/forms/sendcoinsentry.ui \
  qt/forms/signverifymessagedialog.ui \
  qt/forms/transactiondescdialog.ui

QT_MOC_CPP = \
  qt/moc_addressbookpage.cpp \
  qt/moc_addresstablemodel.cpp \
  qt/moc_askpassphrasedialog.cpp \
  qt/moc_createwalletdialog.cpp \
  qt/moc_bantablemodel.cpp \
  qt/moc_bitcoin.cpp \
  qt/moc_bitcoinaddressvalidator.cpp \
  qt/moc_bitcoinamountfield.cpp \
  qt/moc_bitcoingui.cpp \
  qt/moc_bitcoinunits.cpp \
  qt/moc_clientmodel.cpp \
  qt/moc_coincontroldialog.cpp \
  qt/moc_coincontroltreewidget.cpp \
  qt/moc_csvmodelwriter.cpp \
  qt/moc_editaddressdialog.cpp \
  qt/moc_guiutil.cpp \
  qt/moc_initexecutor.cpp \
  qt/moc_intro.cpp \
  qt/moc_macdockiconhandler.cpp \
  qt/moc_macnotificationhandler.cpp \
  qt/moc_modaloverlay.cpp \
  qt/moc_notificator.cpp \
  qt/moc_openuridialog.cpp \
  qt/moc_optionsdialog.cpp \
  qt/moc_optionsmodel.cpp \
  qt/moc_overviewpage.cpp \
  qt/moc_peertablemodel.cpp \
  qt/moc_peertablesortproxy.cpp \
  qt/moc_paymentserver.cpp \
  qt/moc_psbtoperationsdialog.cpp \
  qt/moc_qrimagewidget.cpp \
  qt/moc_qvalidatedlineedit.cpp \
  qt/moc_qvaluecombobox.cpp \
  qt/moc_receivecoinsdialog.cpp \
  qt/moc_receiverequestdialog.cpp \
  qt/moc_recentrequeststablemodel.cpp \
  qt/moc_rpcconsole.cpp \
  qt/moc_sendcoinsdialog.cpp \
  qt/moc_sendcoinsentry.cpp \
  qt/moc_signverifymessagedialog.cpp \
  qt/moc_splashscreen.cpp \
  qt/moc_trafficgraphwidget.cpp \
  qt/moc_transactiondesc.cpp \
  qt/moc_transactiondescdialog.cpp \
  qt/moc_transactionfilterproxy.cpp \
  qt/moc_transactionoverviewwidget.cpp \
  qt/moc_transactiontablemodel.cpp \
  qt/moc_transactionview.cpp \
  qt/moc_utilitydialog.cpp \
  qt/moc_walletcontroller.cpp \
  qt/moc_walletframe.cpp \
  qt/moc_walletmodel.cpp \
  qt/moc_walletview.cpp

BITCOIN_MM = \
  qt/macdockiconhandler.mm \
  qt/macnotificationhandler.mm \
  qt/macos_appnap.mm

QT_MOC = \
  qt/bitcoinamountfield.moc \
  qt/intro.moc \
  qt/overviewpage.moc \
  qt/rpcconsole.moc

QT_QRC_CPP = qt/qrc_bitcoin.cpp
QT_QRC = qt/bitcoin.qrc
QT_QRC_LOCALE_CPP = qt/qrc_bitcoin_locale.cpp
QT_QRC_LOCALE = qt/bitcoin_locale.qrc

BITCOIN_QT_H = \
  qt/addressbookpage.h \
  qt/addresstablemodel.h \
  qt/askpassphrasedialog.h \
  qt/bantablemodel.h \
  qt/bitcoin.h \
  qt/bitcoinaddressvalidator.h \
  qt/bitcoinamountfield.h \
  qt/bitcoingui.h \
  qt/bitcoinunits.h \
  qt/clientmodel.h \
  qt/coincontroldialog.h \
  qt/coincontroltreewidget.h \
  qt/createwalletdialog.h \
  qt/csvmodelwriter.h \
  qt/editaddressdialog.h \
  qt/guiconstants.h \
  qt/guiutil.h \
  qt/initexecutor.h \
  qt/intro.h \
  qt/macdockiconhandler.h \
  qt/macnotificationhandler.h \
  qt/macos_appnap.h \
  qt/modaloverlay.h \
  qt/networkstyle.h \
  qt/notificator.h \
  qt/openuridialog.h \
  qt/optionsdialog.h \
  qt/optionsmodel.h \
  qt/overviewpage.h \
  qt/paymentserver.h \
  qt/peertablemodel.h \
  qt/peertablesortproxy.h \
  qt/platformstyle.h \
  qt/psbtoperationsdialog.h \
  qt/qrimagewidget.h \
  qt/qvalidatedlineedit.h \
  qt/qvaluecombobox.h \
  qt/receivecoinsdialog.h \
  qt/receiverequestdialog.h \
  qt/recentrequeststablemodel.h \
  qt/rpcconsole.h \
  qt/sendcoinsdialog.h \
  qt/sendcoinsentry.h \
  qt/sendcoinsrecipient.h \
  qt/signverifymessagedialog.h \
  qt/splashscreen.h \
  qt/trafficgraphwidget.h \
  qt/transactiondesc.h \
  qt/transactiondescdialog.h \
  qt/transactionfilterproxy.h \
  qt/transactionoverviewwidget.h \
  qt/transactionrecord.h \
  qt/transactiontablemodel.h \
  qt/transactionview.h \
  qt/utilitydialog.h \
  qt/walletcontroller.h \
  qt/walletframe.h \
  qt/walletmodel.h \
  qt/walletmodeltransaction.h \
  qt/walletview.h \
  qt/winshutdownmonitor.h

QT_RES_FONTS = \
  qt/res/fonts/RobotoMono-Bold.ttf

QT_RES_ICONS = \
  qt/res/icons/add.png \
  qt/res/icons/address-book.png \
  qt/res/icons/bitcoin.ico \
  qt/res/icons/bitcoin_testnet.ico \
  qt/res/icons/bitcoin.png \
  qt/res/icons/chevron.png \
  qt/res/icons/clock1.png \
  qt/res/icons/clock2.png \
  qt/res/icons/clock3.png \
  qt/res/icons/clock4.png \
  qt/res/icons/clock5.png \
  qt/res/icons/connect0.png \
  qt/res/icons/connect1.png \
  qt/res/icons/connect2.png \
  qt/res/icons/connect3.png \
  qt/res/icons/connect4.png \
  qt/res/icons/edit.png \
  qt/res/icons/editcopy.png \
  qt/res/icons/editpaste.png \
  qt/res/icons/export.png \
  qt/res/icons/eye.png \
  qt/res/icons/eye_minus.png \
  qt/res/icons/eye_plus.png \
  qt/res/icons/fontbigger.png \
  qt/res/icons/fontsmaller.png \
  qt/res/icons/hd_disabled.png \
  qt/res/icons/hd_enabled.png \
  qt/res/icons/history.png \
  qt/res/icons/lock_closed.png \
  qt/res/icons/lock_open.png \
  qt/res/icons/network_disabled.png \
  qt/res/icons/overview.png \
  qt/res/icons/proxy.png \
  qt/res/icons/receive.png \
  qt/res/icons/remove.png \
  qt/res/icons/send.png \
  qt/res/icons/synced.png \
  qt/res/icons/transaction0.png \
  qt/res/icons/transaction2.png \
  qt/res/icons/transaction_abandoned.png \
  qt/res/icons/transaction_conflicted.png \
  qt/res/icons/tx_inout.png \
  qt/res/icons/tx_input.png \
  qt/res/icons/tx_output.png \
  qt/res/icons/tx_mined.png \
  qt/res/icons/warning.png

BITCOIN_QT_BASE_CPP = \
  qt/bantablemodel.cpp \
  qt/bitcoin.cpp \
  qt/bitcoinaddressvalidator.cpp \
  qt/bitcoinamountfield.cpp \
  qt/bitcoingui.cpp \
  qt/bitcoinunits.cpp \
  qt/clientmodel.cpp \
  qt/csvmodelwriter.cpp \
  qt/guiutil.cpp \
  qt/initexecutor.cpp \
  qt/intro.cpp \
  qt/modaloverlay.cpp \
  qt/networkstyle.cpp \
  qt/notificator.cpp \
  qt/optionsdialog.cpp \
  qt/optionsmodel.cpp \
  qt/peertablemodel.cpp \
  qt/peertablesortproxy.cpp \
  qt/platformstyle.cpp \
  qt/qvalidatedlineedit.cpp \
  qt/qvaluecombobox.cpp \
  qt/rpcconsole.cpp \
  qt/splashscreen.cpp \
  qt/trafficgraphwidget.cpp \
  qt/utilitydialog.cpp

BITCOIN_QT_WINDOWS_CPP = qt/winshutdownmonitor.cpp

BITCOIN_QT_WALLET_CPP = \
  qt/addressbookpage.cpp \
  qt/addresstablemodel.cpp \
  qt/askpassphrasedialog.cpp \
  qt/coincontroldialog.cpp \
  qt/coincontroltreewidget.cpp \
  qt/createwalletdialog.cpp \
  qt/editaddressdialog.cpp \
  qt/openuridialog.cpp \
  qt/overviewpage.cpp \
  qt/paymentserver.cpp \
  qt/psbtoperationsdialog.cpp \
  qt/qrimagewidget.cpp \
  qt/receivecoinsdialog.cpp \
  qt/receiverequestdialog.cpp \
  qt/recentrequeststablemodel.cpp \
  qt/sendcoinsdialog.cpp \
  qt/sendcoinsentry.cpp \
  qt/signverifymessagedialog.cpp \
  qt/transactiondesc.cpp \
  qt/transactiondescdialog.cpp \
  qt/transactionfilterproxy.cpp \
  qt/transactionoverviewwidget.cpp \
  qt/transactionrecord.cpp \
  qt/transactiontablemodel.cpp \
  qt/transactionview.cpp \
  qt/walletcontroller.cpp \
  qt/walletframe.cpp \
  qt/walletmodel.cpp \
  qt/walletmodeltransaction.cpp \
  qt/walletview.cpp

BITCOIN_QT_CPP = $(BITCOIN_QT_BASE_CPP)
if TARGET_WINDOWS
BITCOIN_QT_CPP += $(BITCOIN_QT_WINDOWS_CPP)
endif
if ENABLE_WALLET
BITCOIN_QT_CPP += $(BITCOIN_QT_WALLET_CPP)
endif # ENABLE_WALLET

QT_RES_ANIMATION = $(wildcard $(srcdir)/qt/res/animation/spinner-*.png)

BITCOIN_QT_RC = qt/res/bitcoin-qt-res.rc

BITCOIN_QT_INCLUDES = -DQT_NO_KEYWORDS -DQT_USE_QSTRINGBUILDER

qt_libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
  $(QT_INCLUDES) $(QT_DBUS_INCLUDES) $(QR_CFLAGS) $(BOOST_CPPFLAGS)
qt_libbitcoinqt_a_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
qt_libbitcoinqt_a_OBJCXXFLAGS = $(AM_OBJCXXFLAGS) $(QT_PIE_FLAGS)

qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \
  $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(QT_RES_FONTS) $(QT_RES_ICONS) $(QT_RES_ANIMATION)
if TARGET_DARWIN
  qt_libbitcoinqt_a_SOURCES += $(BITCOIN_MM)
endif

nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP)

# forms/foo.h -> forms/ui_foo.h
QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h))))

# Most files will depend on the forms and moc files as includes. Generate them
# before anything else.
$(QT_MOC): $(QT_FORMS_H)
$(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) $(bitcoin_gui_OBJECTS) : | $(QT_MOC)

# bitcoin-qt and bitcoin-gui binaries #
bitcoin_qt_cppflags = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
  $(QT_INCLUDES) $(QR_CFLAGS)
bitcoin_qt_cxxflags = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)

bitcoin_qt_sources = qt/main.cpp
if TARGET_WINDOWS
  bitcoin_qt_sources += $(BITCOIN_QT_RC)
endif
bitcoin_qt_ldadd = qt/libbitcoinqt.a $(LIBBITCOIN_NODE)
if ENABLE_WALLET
bitcoin_qt_ldadd += $(LIBBITCOIN_UTIL) $(LIBBITCOIN_WALLET)
endif
if ENABLE_ZMQ
bitcoin_qt_ldadd += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
endif
bitcoin_qt_ldadd += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
  $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(LIBSECP256K1) \
  $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(SQLITE_LIBS)
bitcoin_qt_ldflags = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
bitcoin_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX

qt_bitcoin_qt_CPPFLAGS = $(bitcoin_qt_cppflags)
qt_bitcoin_qt_CXXFLAGS = $(bitcoin_qt_cxxflags)
qt_bitcoin_qt_SOURCES = $(bitcoin_qt_sources) init/bitcoin-qt.cpp
qt_bitcoin_qt_LDADD = $(bitcoin_qt_ldadd)
qt_bitcoin_qt_LDFLAGS = $(bitcoin_qt_ldflags)
qt_bitcoin_qt_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)

bitcoin_gui_CPPFLAGS = $(bitcoin_qt_cppflags)
bitcoin_gui_CXXFLAGS = $(bitcoin_qt_cxxflags)
bitcoin_gui_SOURCES = $(bitcoin_qt_sources) init/bitcoin-gui.cpp
bitcoin_gui_LDADD = $(bitcoin_qt_ldadd) $(LIBBITCOIN_IPC) $(LIBBITCOIN_UTIL) $(LIBMULTIPROCESS_LIBS)
bitcoin_gui_LDFLAGS = $(bitcoin_qt_ldflags)
bitcoin_gui_LIBTOOLFLAGS = $(bitcoin_qt_libtoolflags)

#locale/foo.ts -> locale/foo.qm
QT_QM=$(QT_TS:.ts=.qm)

SECONDARY: $(QT_QM)

$(srcdir)/qt/bitcoinstrings.cpp: FORCE
	@test -n $(XGETTEXT) || echo "xgettext is required for updating translations"
	$(AM_V_GEN) cd $(srcdir); XGETTEXT=$(XGETTEXT) COPYRIGHT_HOLDERS="$(COPYRIGHT_HOLDERS)" $(PYTHON) ../share/qt/extract_strings_qt.py $(libbitcoin_node_a_SOURCES) $(libbitcoin_wallet_a_SOURCES) $(libbitcoin_common_a_SOURCES) $(libbitcoin_zmq_a_SOURCES) $(libbitcoin_consensus_a_SOURCES) $(libbitcoin_util_a_SOURCES)

# The resulted bitcoin_en.xlf source file should follow Transifex requirements.
# See: https://docs.transifex.com/formats/xliff#how-to-distinguish-between-a-source-file-and-a-translation-file
translate: $(srcdir)/qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_BASE_CPP) qt/bitcoin.cpp $(BITCOIN_QT_WINDOWS_CPP) $(BITCOIN_QT_WALLET_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM)
	@test -n $(LUPDATE) || echo "lupdate is required for updating translations"
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) -no-obsolete -I $(srcdir) -locations relative $^ -ts $(srcdir)/qt/locale/bitcoin_en.ts
	@test -n $(LCONVERT) || echo "lconvert is required for updating translations"
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LCONVERT) -drop-translations -o $(srcdir)/qt/locale/bitcoin_en.xlf -i $(srcdir)/qt/locale/bitcoin_en.ts
	@$(SED) -i.old -e 's|source-language="en" target-language="en"|source-language="en"|' -e '/<target xml:space="preserve"><\/target>/d' $(srcdir)/qt/locale/bitcoin_en.xlf
	@rm -f $(srcdir)/qt/locale/bitcoin_en.xlf.old

$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM)
	@test -f $(RCC)
	@cp -f $< $(@D)/temp_$(<F)
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale --format-version 1 $(@D)/temp_$(<F) > $@
	@rm $(@D)/temp_$(<F)

$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(QT_RES_FONTS) $(QT_RES_ICONS) $(QT_RES_ANIMATION)
	@test -f $(RCC)
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin --format-version 1 $< > $@

CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno qt/temp_bitcoin_locale.qrc

CLEANFILES += $(CLEAN_QT)

bitcoin_qt_clean: FORCE
	rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT)

bitcoin_qt : qt/bitcoin-qt$(EXEEXT)

APK_LIB_DIR = qt/android/libs/$(ANDROID_ARCH)
QT_BASE_VERSION = $(lastword $(shell $(MOC) --version))
QT_BASE_PATH = $(shell find ../depends/sources/ -maxdepth 1 -type f -regex ".*qtbase.*$(QT_BASE_VERSION)\.tar.xz")
QT_BASE_TLD = $(shell tar tf $(QT_BASE_PATH) --exclude='*/*')

bitcoin_qt_apk: FORCE
	mkdir -p $(APK_LIB_DIR)
	cp $(dir $(lastword $(CC)))../sysroot/usr/lib/$(host_alias)/libc++_shared.so $(APK_LIB_DIR)
	tar xf $(QT_BASE_PATH) -C qt/android/src/ $(QT_BASE_TLD)src/android/jar/src --strip-components=5
	tar xf $(QT_BASE_PATH) -C qt/android/src/ $(QT_BASE_TLD)src/android/java/src --strip-components=5
	cp qt/bitcoin-qt $(APK_LIB_DIR)/libbitcoin-qt_$(ANDROID_ARCH).so
	cd qt/android && gradle wrapper --gradle-version=6.6.1
	cd qt/android && ./gradlew build

ui_%.h: %.ui
	@test -f $(UIC)
	@$(MKDIR_P) $(@D)
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(UIC) -o $@ $< || (echo "Error creating $@"; false)

%.moc: %.cpp
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES_UNSUPPRESSED) $(MOC_DEFS) $< > $@

moc_%.cpp: %.h
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(DEFAULT_INCLUDES) $(QT_INCLUDES_UNSUPPRESSED) $(MOC_DEFS) $< > $@

%.qm: %.ts
	@test -f $(LRELEASE)
	@$(MKDIR_P) $(@D)
	$(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LRELEASE) -silent $< -qm $@
