Files
triangles_v5/triangles-qt.pro
T
sami7777 5530920b25 Add data directory selection dialog on first run
Shows an intro dialog on first launch letting users choose where to store
blockchain data. Saves the choice in QSettings so it only appears once.
Styled to match the existing Triangles dark theme.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 02:25:26 -07:00

555 lines
17 KiB
Prolog

TEMPLATE = app
TARGET = triangles-qt
VERSION = 5.1.5.0
INCLUDEPATH += src src/json src/qt src/qt/plugins/mrichtexteditor
DEFINES += QT_GUI BOOST_THREAD_USE_LIB BOOST_SPIRIT_THREADSAFE BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN BOOST_BIND_GLOBAL_PLACEHOLDERS __NO_SYSTEM_INCLUDES
CONFIG += no_include_pwd
CONFIG += thread
lessThan(QT_MAJOR_VERSION, 5) {
error(Triangles Qt requires Qt 5 or newer)
}
QT += widgets
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
# UNCOMMENT THIS SECTION TO BUILD ON WINDOWS
# MSYS2 MinGW64 paths
win32 {
BOOST_LIB_SUFFIX=-mt
BOOST_THREAD_LIB_SUFFIX=-mt
BOOST_INCLUDE_PATH=C:/msys64/mingw64/include
BOOST_LIB_PATH=C:/msys64/mingw64/lib
BDB_INCLUDE_PATH=C:/msys64/mingw64/include
BDB_LIB_PATH=C:/msys64/mingw64/lib
OPENSSL_INCLUDE_PATH=C:/msys64/mingw64/include
OPENSSL_LIB_PATH=C:/msys64/mingw64/lib
MINIUPNPC_INCLUDE_PATH=C:/msys64/mingw64/include
MINIUPNPC_LIB_PATH=C:/msys64/mingw64/lib
EVENT_INCLUDE_PATH=C:/msys64/mingw64/include
EVENT_LIB_PATH=C:/msys64/mingw64/lib
}
# for boost 1.37, add -mt to the boost libraries
# use: qmake BOOST_LIB_SUFFIX=-mt
# for boost thread win32 with _win32 sufix
# use: BOOST_THREAD_LIB_SUFFIX=_win32-...
# or when linking against a specific BerkelyDB version: BDB_LIB_SUFFIX=-4.8
# Dependency library locations can be customized with:
# BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH,
# BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively
OBJECTS_DIR = build
MOC_DIR = build
UI_DIR = build
# use: qmake "RELEASE=1"
contains(RELEASE, 1) {
# Mac: compile for compatibility (macOS 11+)
macx:QMAKE_CXXFLAGS += -mmacosx-version-min=11.0
macx:QMAKE_LFLAGS += -mmacosx-version-min=11.0
!windows:!macx {
# Linux: static link
LIBS += -Wl,-Bstatic
}
}
!win32 {
# for extra security against potential buffer overflows: enable GCCs Stack Smashing Protection
QMAKE_CXXFLAGS *= -fstack-protector-all --param ssp-buffer-size=1
QMAKE_LFLAGS *= -fstack-protector-all --param ssp-buffer-size=1
# We need to exclude this for Windows cross compile with MinGW 4.2.x, as it will result in a non-working executable!
# This can be enabled for Windows, when we switch to MinGW >= 4.4.x.
}
# for extra security on Windows: enable ASLR and DEP via GCC linker flags
win32:QMAKE_LFLAGS *= -static
win32:QMAKE_LFLAGS += -static-libgcc -static-libstdc++
lessThan(QT_MAJOR_VERSION, 5): win32: QMAKE_LFLAGS *= -static
# use: qmake "USE_QRCODE=1"
# libqrencode (http://fukuchi.org/works/qrencode/index.en.html) must be installed for support
contains(USE_QRCODE, 1) {
message(Building with QRCode support)
DEFINES += USE_QRCODE
LIBS += -lqrencode
}
#triangles: use UPNP with TOR
USE_UPNP=1
# use: qmake "USE_UPNP=1" ( enabled by default; default)
# or: qmake "USE_UPNP=0" (disabled by default)
# or: qmake "USE_UPNP=-" (not supported)
# miniupnpc (http://miniupnp.free.fr/files/) must be installed for support
contains(USE_UPNP, -) {
message(Building without UPNP support)
} else {
message(Building with UPNP support)
count(USE_UPNP, 0) {
USE_UPNP=1
}
DEFINES += USE_UPNP=$$USE_UPNP STATICLIB MINIUPNP_STATICLIB
INCLUDEPATH += $$MINIUPNPC_INCLUDE_PATH
LIBS += $$join(MINIUPNPC_LIB_PATH,,-L,) -lminiupnpc
win32:LIBS += -liphlpapi
}
# use: qmake "USE_DBUS=1" or qmake "USE_DBUS=0"
linux:count(USE_DBUS, 0) {
USE_DBUS=1
}
contains(USE_DBUS, 1) {
message(Building with DBUS (Freedesktop notifications) support)
DEFINES += USE_DBUS
QT += dbus
}
# use: qmake "USE_IPV6=1" ( enabled by default; default)
# or: qmake "USE_IPV6=0" (disabled by default)
# or: qmake "USE_IPV6=-" (not supported)
contains(USE_IPV6, -) {
message(Building without IPv6 support)
} else {
count(USE_IPV6, 0) {
USE_IPV6=1
}
DEFINES += USE_IPV6=$$USE_IPV6
}
contains(TRIANGLES_NEED_QT_PLUGINS, 1) {
message(Building with Qt Plugins)
DEFINES += TRIANGLES_NEED_QT_PLUGINS
QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets
} else {
message(Building without Qt Plugins)
}
INCLUDEPATH += src/leveldb/include src/leveldb/helpers
LIBS += $$PWD/src/leveldb/libleveldb.a $$PWD/src/leveldb/libmemenv.a
SOURCES += src/txdb-leveldb.cpp \
src/blake.c \
src/groestl.c \
src/jh.c \
src/keccak.c \
src/skein.c \
src/aes_helper.c \
src/bmw.c \
src/cubehash.c \
src/echo.c \
src/fugue.c \
src/hamsi.c \
src/hamsi_helper.c \
src/luffa.c \
src/shavite.c \
src/simd.c
!win32 {
# we use QMAKE_CXXFLAGS_RELEASE even without RELEASE=1 because we use RELEASE to indicate linking preferences not -O preferences
genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a
} else {
# make an educated guess about what the ranlib command is called
isEmpty(QMAKE_RANLIB) {
QMAKE_RANLIB = $$replace(QMAKE_STRIP, strip, ranlib)
}
LIBS += -lshlwapi
genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
}
genleveldb.target = $$PWD/src/leveldb/libleveldb.a
genleveldb.depends = FORCE
PRE_TARGETDEPS += $$PWD/src/leveldb/libleveldb.a
QMAKE_EXTRA_TARGETS += genleveldb
# Gross ugly hack that depends on qmake internals, unfortunately there is no other way to do it.
QMAKE_CLEAN += $$PWD/src/leveldb/libleveldb.a; cd $$PWD/src/leveldb ; $(MAKE) clean
# regenerate src/build.h
!windows|contains(USE_BUILD_INFO, 1) {
genbuild.depends = FORCE
genbuild.commands = cd $$PWD; /bin/sh share/genbuild.sh $$OUT_PWD/build/build.h
genbuild.target = $$OUT_PWD/build/build.h
PRE_TARGETDEPS += $$OUT_PWD/build/build.h
QMAKE_EXTRA_TARGETS += genbuild
DEFINES += HAVE_BUILD_INFO
}
contains(USE_O3, 1) {
message(Building O3 optimization flag)
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS += -O3
QMAKE_CFLAGS += -O3
}
*-g++-32 {
message("32 platform, adding -msse2 flag")
QMAKE_CXXFLAGS += -msse2
QMAKE_CFLAGS += -msse2
}
QMAKE_CXXFLAGS_WARN_ON = -fdiagnostics-show-option -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter -Wstack-protector
# Input
DEPENDPATH += src src/json src/qt
HEADERS += src/qt/trianglesgui.h \
src/qt/transactiontablemodel.h \
src/qt/addresstablemodel.h \
src/qt/optionsdialog.h \
src/qt/coincontroldialog.h \
src/qt/coincontroltreewidget.h \
src/qt/sendcoinsdialog.h \
src/qt/addressbookpage.h \
src/qt/aboutdialog.h \
src/qt/introdialog.h \
src/qt/editaddressdialog.h \
src/qt/trianglesaddressvalidator.h \
src/alert.h \
src/addrman.h \
src/base58.h \
src/bignum.h \
src/checkpoints.h \
src/compat.h \
src/coincontrol.h \
src/sync.h \
src/util.h \
src/uint256.h \
src/kernel.h \
src/net_bootstrap.h \
src/tor/onion_v3.h \
src/tor/tor_process.h \
src/tor/tor_crypto_compat.h \
src/scrypt.h \
src/pbkdf2.h \
src/serialize.h \
src/strlcpy.h \
src/smessage.h \
src/zmqpublishnotifier.h \
src/notificationqueue.h \
src/addressindex.h \
src/main.h \
src/miner.h \
src/net.h \
src/key.h \
src/db.h \
src/txdb.h \
src/walletdb.h \
src/script.h \
src/init.h \
src/irc.h \
src/mruset.h \
src/json/json_spirit_writer_template.h \
src/json/json_spirit_writer.h \
src/json/json_spirit_value.h \
src/json/json_spirit_utils.h \
src/json/json_spirit_stream_reader.h \
src/json/json_spirit_reader_template.h \
src/json/json_spirit_reader.h \
src/json/json_spirit_error_position.h \
src/json/json_spirit.h \
src/qt/clientmodel.h \
src/qt/guiutil.h \
src/qt/transactionrecord.h \
src/qt/guiconstants.h \
src/qt/optionsmodel.h \
src/qt/monitoreddatamapper.h \
src/qt/transactiondesc.h \
src/qt/transactiondescdialog.h \
src/qt/trianglesamountfield.h \
src/wallet.h \
src/keystore.h \
src/qt/transactionfilterproxy.h \
src/qt/transactionview.h \
src/qt/walletmodel.h \
src/trianglesrpc.h \
src/rest.h \
src/qt/overviewpage.h \
src/qt/csvmodelwriter.h \
src/crypter.h \
src/qt/sendcoinsentry.h \
src/qt/qvalidatedlineedit.h \
src/qt/trianglesunits.h \
src/qt/qvaluecombobox.h \
src/qt/askpassphrasedialog.h \
src/protocol.h \
src/qt/notificator.h \
src/qt/qtipcserver.h \
src/allocators.h \
src/ui_interface.h \
src/qt/rpcconsole.h \
src/version.h \
src/netbase.h \
src/clientversion.h \
src/hashblock.h \
src/sph_blake.h \
src/sph_groestl.h \
src/sph_jh.h \
src/sph_keccak.h \
src/sph_skein.h \
src/sph_types.h \
src/qt/messagepage.h \
src/qt/dialog_move_handler.h \
src/qt/signmessagepage.h \
src/qt/verifymessagepage.h \
src/qt/messagemodel.h \
src/qt/sendmessagesdialog.h \
src/qt/sendmessagesentry.h \
src/qt/plugins/mrichtexteditor/mrichtextedit.h \
src/qt/qvalidatedtextedit.h \
src/txdb-leveldb.h \
src/onionseed.h \
src/sph_bmw.h \
src/sph_cubehash.h \
src/sph_echo.h \
src/sph_fugue.h \
src/sph_hamsi.h \
src/sph_luffa.h \
src/sph_shavite.h \
src/sph_simd.h
SOURCES += src/qt/triangles.cpp src/qt/trianglesgui.cpp \
src/qt/transactiontablemodel.cpp \
src/qt/addresstablemodel.cpp \
src/qt/optionsdialog.cpp \
src/qt/sendcoinsdialog.cpp \
src/qt/coincontroldialog.cpp \
src/qt/coincontroltreewidget.cpp \
src/qt/addressbookpage.cpp \
src/qt/aboutdialog.cpp \
src/qt/introdialog.cpp \
src/qt/editaddressdialog.cpp \
src/qt/trianglesaddressvalidator.cpp \
# Old embedded Tor v2 client removed - incompatible with OpenSSL 3.x
# Tor v3 onion services handled by onion_v3.cpp via external Tor/SOCKS5
src/tor/anonymize.cpp \
src/alert.cpp \
src/version.cpp \
src/sync.cpp \
src/smessage.cpp \
src/util.cpp \
src/netbase.cpp \
src/key.cpp \
src/script.cpp \
src/main.cpp \
src/miner.cpp \
src/init.cpp \
src/net.cpp \
src/irc.cpp \
src/checkpoints.cpp \
src/addrman.cpp \
src/db.cpp \
src/walletdb.cpp \
src/qt/clientmodel.cpp \
src/qt/guiutil.cpp \
src/qt/transactionrecord.cpp \
src/qt/optionsmodel.cpp \
src/qt/monitoreddatamapper.cpp \
src/qt/transactiondesc.cpp \
src/qt/transactiondescdialog.cpp \
src/qt/trianglesstrings.cpp \
src/qt/trianglesamountfield.cpp \
src/wallet.cpp \
src/keystore.cpp \
src/qt/transactionfilterproxy.cpp \
src/qt/transactionview.cpp \
src/qt/walletmodel.cpp \
src/trianglesrpc.cpp \
src/rest.cpp \
src/rpcdump.cpp \
src/rpcnet.cpp \
src/rpcmining.cpp \
src/rpcwallet.cpp \
src/rpcblockchain.cpp \
src/rpcrawtransaction.cpp \
src/rpcsmessage.cpp \
src/zmqpublishnotifier.cpp \
src/qt/overviewpage.cpp \
src/qt/csvmodelwriter.cpp \
src/crypter.cpp \
src/qt/sendcoinsentry.cpp \
src/qt/qvalidatedlineedit.cpp \
src/qt/trianglesunits.cpp \
src/qt/qvaluecombobox.cpp \
src/qt/askpassphrasedialog.cpp \
src/protocol.cpp \
src/qt/notificator.cpp \
src/qt/qtipcserver.cpp \
src/qt/rpcconsole.cpp \
src/qt/messagepage.cpp \
src/qt/dialog_move_handler.cpp \
src/qt/signmessagepage.cpp \
src/qt/verifymessagepage.cpp \
src/qt/messagemodel.cpp \
src/qt/sendmessagesdialog.cpp \
src/qt/sendmessagesentry.cpp \
src/qt/qvalidatedtextedit.cpp \
src/qt/plugins/mrichtexteditor/mrichtextedit.cpp \
src/noui.cpp \
src/kernel.cpp \
src/net_bootstrap.cpp \
src/tor/onion_v3.cpp \
src/tor/tor_process.cpp \
src/scrypt-arm.S \
src/scrypt-x86.S \
src/scrypt-x86_64.S \
src/scrypt.cpp \
src/pbkdf2.cpp
RESOURCES += \
src/qt/triangles.qrc
FORMS += \
src/qt/forms/coincontroldialog.ui \
src/qt/forms/sendcoinsdialog.ui \
src/qt/forms/addressbookpage.ui \
src/qt/forms/aboutdialog.ui \
src/qt/forms/editaddressdialog.ui \
src/qt/forms/transactiondescdialog.ui \
src/qt/forms/overviewpage.ui \
src/qt/forms/sendcoinsentry.ui \
src/qt/forms/askpassphrasedialog.ui \
src/qt/forms/rpcconsole.ui \
src/qt/forms/optionsdialog.ui \
src/qt/forms/messagepage.ui \
src/qt/forms/sendmessagesentry.ui \
src/qt/forms/sendmessagesdialog.ui \
src/qt/plugins/mrichtexteditor/mrichtextedit.ui \
src/qt/forms/mainwindow.ui \
src/qt/forms/signmessagepage.ui \
src/qt/forms/verifymessagepage.ui \
src/qt/forms/transactionspage.ui
contains(USE_QRCODE, 1) {
HEADERS += src/qt/qrcodedialog.h
SOURCES += src/qt/qrcodedialog.cpp
FORMS += src/qt/forms/qrcodedialog.ui
}
CODECFORTR = UTF-8
# for lrelease/lupdate
# also add new translations to src/qt/triangles.qrc under translations/
TRANSLATIONS = $$files(src/qt/locale/triangles_*.ts)
isEmpty(QMAKE_LRELEASE) {
win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe
else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
}
isEmpty(QM_DIR):QM_DIR = $$PWD/src/qt/locale
# automatically build translations, so they can be included in resource file
TSQM.name = lrelease ${QMAKE_FILE_IN}
TSQM.input = TRANSLATIONS
TSQM.output = $$QM_DIR/${QMAKE_FILE_BASE}.qm
TSQM.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
TSQM.CONFIG = no_link
QMAKE_EXTRA_COMPILERS += TSQM
# "Other files" to show in Qt Creator
OTHER_FILES += \
doc/*.rst doc/*.txt doc/README README.md res/triangles-qt.rc
# platform specific defaults, if not overridden on command line
isEmpty(BOOST_LIB_SUFFIX) {
macx:BOOST_LIB_SUFFIX =
windows:BOOST_LIB_SUFFIX = -mt
}
isEmpty(BOOST_THREAD_LIB_SUFFIX) {
win32:BOOST_THREAD_LIB_SUFFIX = _win32$$BOOST_LIB_SUFFIX
else:BOOST_THREAD_LIB_SUFFIX = $$BOOST_LIB_SUFFIX
}
isEmpty(BDB_LIB_PATH) {
macx:BDB_LIB_PATH = /opt/homebrew/opt/berkeley-db@5/lib
}
isEmpty(BDB_LIB_SUFFIX) {
macx:BDB_LIB_SUFFIX =
}
isEmpty(BDB_INCLUDE_PATH) {
macx:BDB_INCLUDE_PATH = /opt/homebrew/opt/berkeley-db@5/include
}
isEmpty(BOOST_LIB_PATH) {
macx:BOOST_LIB_PATH = /opt/homebrew/opt/boost/lib
}
isEmpty(BOOST_INCLUDE_PATH) {
macx:BOOST_INCLUDE_PATH = /opt/homebrew/opt/boost/include
}
windows:DEFINES += WIN32
windows:RC_FILE = src/qt/res/triangles-qt.rc
windows:!contains(MINGW_THREAD_BUGFIX, 0) {
# At least qmake's win32-g++-cross profile is missing the -lmingwthrd
# thread-safety flag. GCC has -mthreads to enable this, but it doesn't
# work with static linking. -lmingwthrd must come BEFORE -lmingw, so
# it is prepended to QMAKE_LIBS_QT_ENTRY.
# It can be turned off with MINGW_THREAD_BUGFIX=0, just in case it causes
# any problems on some untested qmake profile now or in the future.
DEFINES += _MT
QMAKE_LIBS_QT_ENTRY = -lmingwthrd $$QMAKE_LIBS_QT_ENTRY
}
!windows:!macx {
DEFINES += LINUX
LIBS += -lrt
}
macx:HEADERS += src/qt/macdockiconhandler.h \
src/qt/macnotificationhandler.h
macx:OBJECTIVE_SOURCES += src/qt/macdockiconhandler.mm \
src/qt/macnotificationhandler.mm
macx:LIBS += -framework Foundation -framework ApplicationServices -framework AppKit
macx:DEFINES += MAC_OSX MSG_NOSIGNAL=0
macx:ICON = src/qt/res/icons/triangles.icns
macx:TARGET = "Triangles-Qt"
macx:QMAKE_CFLAGS_THREAD += -pthread
macx:QMAKE_LFLAGS_THREAD += -pthread
macx:QMAKE_CXXFLAGS_THREAD += -pthread
macx:QMAKE_CXXFLAGS += -Wno-reserved-user-defined-literal -Wno-deprecated-declarations
# Set libraries and includes at end, to use platform-defined defaults if not overridden
#$$join(ADDITIONAL_LIBS_PATH,,-L,)
INCLUDEPATH += $$BOOST_INCLUDE_PATH \
$$BDB_INCLUDE_PATH \
$$OPENSSL_INCLUDE_PATH \
#$$QRENCODE_INCLUDE_PATH \
$$EVENT_INCLUDE_PATH
LIBS += $$join(BOOST_LIB_PATH,,-L,) \
$$join(BDB_LIB_PATH,,-L,) \
$$join(OPENSSL_LIB_PATH,,-L,) \
#$$join(QRENCODE_LIB_PATH,,-L,) \
$$join(EVENT_LIB_PATH,,-L,)
LIBS += -lssl -lcrypto -ldb_cxx$$BDB_LIB_SUFFIX
LIBS += -levent -lz
# -lgdi32 has to happen after -lcrypto (see #681)
windows:LIBS += -lws2_32 -lshlwapi -lmswsock -lole32 -loleaut32 -luuid -lgdi32 -lcrypt32
LIBS += -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX
LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX
contains(RELEASE, 1) {
!windows:!macx {
# Linux: turn dynamic linking back on for c/c++ runtime libraries
LIBS += -Wl,-Bdynamic
}
}
# ZMQ support (optional)
# Build with: qmake "USE_ZMQ=1"
contains(USE_ZMQ, 1) {
message(Building with ZMQ support)
DEFINES += ENABLE_ZMQ
LIBS += -lzmq
}
system($$QMAKE_LRELEASE -silent $$_PRO_FILE_)