Modernize Windows Qt6 wallet build

This commit is contained in:
root
2026-04-30 14:46:44 +00:00
parent 099316b662
commit c90370640c
17 changed files with 137 additions and 95 deletions
+4 -1
View File
@@ -406,9 +406,12 @@ AC_DEFUN([_BITCOIN_QT_FIND_STATIC_PLUGINS],[
if test -d "$qt_plugin_path/generic"; then if test -d "$qt_plugin_path/generic"; then
QT_LIBS="$QT_LIBS -L$qt_plugin_path/generic" QT_LIBS="$QT_LIBS -L$qt_plugin_path/generic"
fi fi
QT_LIBS="$QT_LIBS -lQt6BundledHarfbuzz -lQt6BundledLibpng -lQt6BundledLibjpeg -lQt6BundledPcre2"
if test "x$TARGET_OS" = xwindows; then
QT_LIBS="$QT_LIBS -lQt6BundledFreetype -ld3d11 -ldxgi -ldwrite -ldwmapi -luxtheme -lversion -lauthz -luserenv -lnetapi32 -lsynchronization -lsecur32 -lwinhttp -lsetupapi -lshcore -lwtsapi32 -ld3d9 -lruntimeobject"
fi
if test "x$TARGET_OS" = xlinux; then if test "x$TARGET_OS" = xlinux; then
QT_LIBS="-lQt6XcbQpa -lQt6InputSupport -lQt6FbSupport -lQt6DeviceDiscoverySupport $QT_LIBS" QT_LIBS="-lQt6XcbQpa -lQt6InputSupport -lQt6FbSupport -lQt6DeviceDiscoverySupport $QT_LIBS"
QT_LIBS="$QT_LIBS -lQt6BundledHarfbuzz -lQt6BundledLibpng -lQt6BundledLibjpeg -lQt6BundledPcre2"
if test "x$PKG_CONFIG" != x; then if test "x$PKG_CONFIG" != x; then
QT6_XCB_LIBS=`PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig $PKG_CONFIG --libs --static x11 x11-xcb xcb xcb-cursor xcb-icccm xcb-image xcb-keysyms xcb-randr xcb-renderutil xcb-shape xcb-shm xcb-sync xcb-xfixes xcb-xkb xkbcommon xkbcommon-x11 fontconfig freetype2 harfbuzz 2>/dev/null` QT6_XCB_LIBS=`PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig $PKG_CONFIG --libs --static x11 x11-xcb xcb xcb-cursor xcb-icccm xcb-image xcb-keysyms xcb-randr xcb-renderutil xcb-shape xcb-shm xcb-sync xcb-xfixes xcb-xkb xkbcommon xkbcommon-x11 fontconfig freetype2 harfbuzz 2>/dev/null`
QT_LIBS="$QT_LIBS $QT6_XCB_LIBS" QT_LIBS="$QT_LIBS $QT6_XCB_LIBS"
Vendored
+4 -1
View File
@@ -29333,9 +29333,12 @@ printf "%s\n" "#define QT_STATICPLUGIN 1" >>confdefs.h
if test -d "$qt_plugin_path/generic"; then if test -d "$qt_plugin_path/generic"; then
QT_LIBS="$QT_LIBS -L$qt_plugin_path/generic" QT_LIBS="$QT_LIBS -L$qt_plugin_path/generic"
fi fi
QT_LIBS="$QT_LIBS -lQt6BundledHarfbuzz -lQt6BundledLibpng -lQt6BundledLibjpeg -lQt6BundledPcre2"
if test "x$TARGET_OS" = xwindows; then
QT_LIBS="$QT_LIBS -lQt6BundledFreetype -ld3d11 -ldxgi -ldwrite -ldwmapi -luxtheme -lversion -lauthz -luserenv -lnetapi32 -lsynchronization -lsecur32 -lwinhttp -lsetupapi -lshcore -lwtsapi32 -ld3d9 -lruntimeobject"
fi
if test "x$TARGET_OS" = xlinux; then if test "x$TARGET_OS" = xlinux; then
QT_LIBS="-lQt6XcbQpa -lQt6InputSupport -lQt6FbSupport -lQt6DeviceDiscoverySupport $QT_LIBS" QT_LIBS="-lQt6XcbQpa -lQt6InputSupport -lQt6FbSupport -lQt6DeviceDiscoverySupport $QT_LIBS"
QT_LIBS="$QT_LIBS -lQt6BundledHarfbuzz -lQt6BundledLibpng -lQt6BundledLibjpeg -lQt6BundledPcre2"
if test "x$PKG_CONFIG" != x; then if test "x$PKG_CONFIG" != x; then
QT6_XCB_LIBS=`PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig $PKG_CONFIG --libs --static x11 x11-xcb xcb xcb-cursor xcb-icccm xcb-image xcb-keysyms xcb-randr xcb-renderutil xcb-shape xcb-shm xcb-sync xcb-xfixes xcb-xkb xkbcommon xkbcommon-x11 fontconfig freetype2 harfbuzz 2>/dev/null` QT6_XCB_LIBS=`PKG_CONFIG_LIBDIR=/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig $PKG_CONFIG --libs --static x11 x11-xcb xcb xcb-cursor xcb-icccm xcb-image xcb-keysyms xcb-randr xcb-renderutil xcb-shape xcb-shm xcb-sync xcb-xfixes xcb-xkb xkbcommon xkbcommon-x11 fontconfig freetype2 harfbuzz 2>/dev/null`
QT_LIBS="$QT_LIBS $QT6_XCB_LIBS" QT_LIBS="$QT_LIBS $QT6_XCB_LIBS"
+19 -6
View File
@@ -4,8 +4,9 @@ set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
JOBS="${JOBS:-1}" JOBS="${JOBS:-1}"
HOST="${HOST:-x86_64-w64-mingw32}" HOST="${HOST:-x86_64-w64-mingw32}"
BUILD_HOST="${BUILD_HOST:-$("$ROOT/depends/config.guess")}"
PREFIX="$ROOT/depends/$HOST" PREFIX="$ROOT/depends/$HOST"
NATIVE_BIN="$PREFIX/native/bin" NATIVE_BIN="$ROOT/depends/build/$BUILD_HOST/bin"
PROTOBUF_VERSION="${PROTOBUF_VERSION:-2.6.1}" PROTOBUF_VERSION="${PROTOBUF_VERSION:-2.6.1}"
PROTOBUF_SOURCE="$ROOT/depends/sources/protobuf-$PROTOBUF_VERSION.tar.bz2" PROTOBUF_SOURCE="$ROOT/depends/sources/protobuf-$PROTOBUF_VERSION.tar.bz2"
PROTOBUF_BUILD="${PROTOBUF_BUILD:-/tmp/agrarian-protobuf-$PROTOBUF_VERSION-native}" PROTOBUF_BUILD="${PROTOBUF_BUILD:-/tmp/agrarian-protobuf-$PROTOBUF_VERSION-native}"
@@ -27,7 +28,7 @@ require_path() {
copy_first_match() { copy_first_match() {
local name="$1" local name="$1"
local match local match
match="$(find "$ROOT/depends/work/build/$HOST" -path "*/qtbase/bin/$name" -type f | sort | tail -n 1 || true)" match="$(find "$ROOT/depends/$BUILD_HOST" \( -path "*/bin/$name" -o -path "*/libexec/$name" \) -type f | sort | tail -n 1 || true)"
if [[ -z "$match" ]]; then if [[ -z "$match" ]]; then
echo "Could not find Qt host tool after depends build: $name" >&2 echo "Could not find Qt host tool after depends build: $name" >&2
exit 1 exit 1
@@ -97,6 +98,15 @@ require_cmd cp
ensure_posix_mingw ensure_posix_mingw
echo "Building Win64 depends for $HOST..." echo "Building Win64 depends for $HOST..."
echo "Building native Qt6 host tools and metadata for $BUILD_HOST..."
make -C depends HOST="$BUILD_HOST" NO_QT=0 qt -j"$JOBS"
qt_host_cache=( "$ROOT/depends/built/$BUILD_HOST/qt"/qt-*.tar.gz )
if [[ ${#qt_host_cache[@]} -ne 1 || ! -f "${qt_host_cache[0]}" ]]; then
echo "Could not locate a single native Qt6 cache archive for $BUILD_HOST" >&2
exit 1
fi
mkdir -p "$ROOT/depends/$BUILD_HOST"
tar --no-same-owner -xf "${qt_host_cache[0]}" -C "$ROOT/depends/$BUILD_HOST"
make -C depends HOST="$HOST" NO_QT=0 -j"$JOBS" make -C depends HOST="$HOST" NO_QT=0 -j"$JOBS"
require_path "$PREFIX/share/config.site" require_path "$PREFIX/share/config.site"
ensure_native_tools ensure_native_tools
@@ -105,17 +115,20 @@ if [[ ! -f configure ]]; then
./autogen.sh ./autogen.sh
fi fi
echo "Configuring Win64 Qt wallet build..." echo "Configuring Win64 Qt6 wallet build..."
CONFIG_SITE="$PREFIX/share/config.site" ./configure \ CONFIG_SITE="$PREFIX/share/config.site" ./configure \
--prefix=/ \ --prefix=/ \
--disable-maintainer-mode \ --disable-maintainer-mode \
--disable-tests \ --disable-tests \
--disable-bench \ --disable-bench \
--with-gui=qt5 \ --with-gui=qt6 \
--with-qt-incdir="$PREFIX/include" \ --with-qt-incdir="$PREFIX/include" \
--with-qt-libdir="$PREFIX/lib" --with-qt-libdir="$PREFIX/lib" \
--with-qt-plugindir="$PREFIX/plugins" \
--with-qt-translationdir="$PREFIX/translations" \
--with-qt-bindir="$NATIVE_BIN"
echo "Building Win64 Qt wallet with JOBS=$JOBS..." echo "Building Win64 Qt6 wallet with JOBS=$JOBS..."
make -j"$JOBS" make -j"$JOBS"
echo "Windows wallet build complete:" echo "Windows wallet build complete:"
+2
View File
@@ -36,6 +36,8 @@ $(package)_config_opts_m68k_linux=linux-generic32
$(package)_config_opts_x86_64_darwin=darwin64-x86_64-cc $(package)_config_opts_x86_64_darwin=darwin64-x86_64-cc
$(package)_config_opts_x86_64_mingw32=mingw64 $(package)_config_opts_x86_64_mingw32=mingw64
$(package)_config_opts_i686_mingw32=mingw $(package)_config_opts_i686_mingw32=mingw
$(package)_config_env_x86_64_mingw32=WINDRES=x86_64-w64-mingw32-windres
$(package)_config_env_i686_mingw32=WINDRES=i686-w64-mingw32-windres
endef endef
define $(package)_config_cmds define $(package)_config_cmds
+17 -3
View File
@@ -29,6 +29,7 @@ $(package)_config_opts += -no-icu
$(package)_config_opts += -no-opengl $(package)_config_opts += -no-opengl
$(package)_config_opts += -no-pch $(package)_config_opts += -no-pch
$(package)_config_opts += -no-feature-sql $(package)_config_opts += -no-feature-sql
$(package)_config_opts += -no-feature-vulkan
$(package)_config_opts += -nomake examples $(package)_config_opts += -nomake examples
$(package)_config_opts += -nomake tests $(package)_config_opts += -nomake tests
$(package)_config_opts += -opensource $(package)_config_opts += -opensource
@@ -49,6 +50,19 @@ $(package)_config_opts_linux += -system-freetype
$(package)_config_opts_linux += -no-feature-sessionmanager $(package)_config_opts_linux += -no-feature-sessionmanager
$(package)_config_opts_mingw32 = -qpa windows $(package)_config_opts_mingw32 = -qpa windows
$(package)_config_opts_darwin = -qpa cocoa $(package)_config_opts_darwin = -qpa cocoa
$(package)_cmake_opts_mingw32 = -DCMAKE_SYSTEM_NAME=Windows
$(package)_cmake_opts_mingw32 += -DCMAKE_C_COMPILER=$($(package)_cc)
$(package)_cmake_opts_mingw32 += -DCMAKE_CXX_COMPILER=$($(package)_cxx)
$(package)_cmake_opts_mingw32 += -DCMAKE_RC_COMPILER=$(host_toolchain)windres
$(package)_cmake_opts_mingw32 += -DOPENSSL_ROOT_DIR=$(host_prefix)
$(package)_cmake_opts_mingw32 += -DOPENSSL_USE_STATIC_LIBS=TRUE
$(package)_cmake_opts_mingw32 += -DZLIB_ROOT=$(host_prefix)
$(package)_cmake_opts_mingw32 += -DQT_HOST_PATH=$(BASEDIR)/$(BUILD)
$(package)_cmake_opts_mingw32 += -DCMAKE_FIND_ROOT_PATH=$(host_prefix)
$(package)_cmake_opts_mingw32 += -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY
$(package)_cmake_opts_mingw32 += -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY
$(package)_cmake_opts_mingw32 += -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY
$(package)_cmake_opts_mingw32 += -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER
endef endef
define $(package)_fetch_cmds define $(package)_fetch_cmds
@@ -71,9 +85,9 @@ endef
define $(package)_config_cmds define $(package)_config_cmds
export PKG_CONFIG_SYSROOT_DIR=/ && \ export PKG_CONFIG_SYSROOT_DIR=/ && \
export PKG_CONFIG_LIBDIR=$(host_prefix)/lib/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig && \ export PKG_CONFIG_LIBDIR=$(host_prefix)/lib/pkgconfig$(if $(filter linux,$(host_os)),:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig) && \
export PKG_CONFIG_PATH=$(host_prefix)/share/pkgconfig && \ export PKG_CONFIG_PATH=$(host_prefix)/share/pkgconfig && \
../qtbase/configure $($(package)_config_opts) -- -G Ninja ../qtbase/configure $($(package)_config_opts) -- -G Ninja $($(package)_cmake_opts) $($(package)_cmake_opts_$(host_os)) $($(package)_cmake_opts_$(host_arch)_$(host_os))
endef endef
define $(package)_build_cmds define $(package)_build_cmds
@@ -85,6 +99,6 @@ define $(package)_stage_cmds
endef endef
define $(package)_postprocess_cmds define $(package)_postprocess_cmds
rm -rf lib/cmake share/doc share/examples share/qt6/sbom && \ rm -rf share/doc share/examples share/qt6/sbom && \
rm -f lib/lib*.la lib/*.prl plugins/*/*.prl rm -f lib/lib*.la lib/*.prl plugins/*/*.prl
endef endef
+1 -1
View File
@@ -53,7 +53,7 @@ The wallet build is sensitive to tool version mismatches:
* Native Ubuntu uses the deterministic depends Qt6, OpenSSL, Boost, protobuf, * Native Ubuntu uses the deterministic depends Qt6, OpenSSL, Boost, protobuf,
and supporting libraries. and supporting libraries.
* Windows cross-target wallets currently use the existing Qt5 cross path and * Windows cross-target wallets use the deterministic depends Qt6 path and
matching Qt host tools staged by depends. matching Qt host tools staged by depends.
The helper scripts keep those rules in one place so the build is repeatable on a The helper scripts keep those rules in one place so the build is repeatable on a
+3 -3
View File
@@ -227,9 +227,9 @@ builds and stages a matching native `protoc` when needed.
QT NOTE QT NOTE
============================================================ ============================================================
The current Windows cross-build helper still targets the existing Qt5 cross The Windows cross-build helper targets the Qt6 depends path. Keep the helper's
path. The native Ubuntu wallet path has moved to Qt6. Keep those paths separate Qt host tools (`moc`, `uic`, `rcc`) staged from the matching depends build to
until the Windows Qt6 cross-build is explicitly modernized and smoke-tested. avoid mixing host Qt tools with target Qt libraries.
============================================================ ============================================================
END OF DOCUMENT END OF DOCUMENT
+2 -2
View File
@@ -130,8 +130,8 @@ The installer requires these `.pc` files in `depends/<host>/(lib|share)/pkgconfi
- Native Ubuntu Qt6 path: `Qt6Core.pc`, `Qt6Gui.pc`, `Qt6Network.pc`, - Native Ubuntu Qt6 path: `Qt6Core.pc`, `Qt6Gui.pc`, `Qt6Network.pc`,
`Qt6Widgets.pc` `Qt6Widgets.pc`
- Windows cross-build Qt5 path: `Qt5Core.pc`, `Qt5Gui.pc`, `Qt5Network.pc`, - Windows cross-build Qt6 path: `Qt6Core.pc`, `Qt6Gui.pc`, `Qt6Network.pc`,
`Qt5Widgets.pc` `Qt6Widgets.pc`
Fix by rebuilding depends with Qt enabled: Fix by rebuilding depends with Qt enabled:
+1 -2
View File
@@ -34,8 +34,7 @@ If wallet is enabled (default), installer preflight checks require:
For the current native Ubuntu Qt wallet path, depends should also provide Qt6 For the current native Ubuntu Qt wallet path, depends should also provide Qt6
pkg-config files such as `Qt6Core.pc`, `Qt6Gui.pc`, `Qt6Network.pc`, and pkg-config files such as `Qt6Core.pc`, `Qt6Gui.pc`, `Qt6Network.pc`, and
`Qt6Widgets.pc`. The Windows cross-build path still uses the existing Qt5 `Qt6Widgets.pc`. The Windows cross-build path also uses the Qt6 depends target.
depends target.
When missing, the installer exits early and prints the exact missing path(s) plus the `make -C depends ...` command to fix them. When missing, the installer exits early and prints the exact missing path(s) plus the `make -C depends ...` command to fix them.
+3 -3
View File
@@ -56,7 +56,7 @@ static void convertSeed6(std::vector<CAddress>& vSeedsOut, const SeedSpec6* data
static Checkpoints::MapCheckpoints mapCheckpoints = static Checkpoints::MapCheckpoints mapCheckpoints =
boost::assign::map_list_of boost::assign::map_list_of
(0, uint256("000003452250d81f8b07d42e127c92729802e3c48f3c7b9834256fd0fb9a0c2e")); (0, uint256("000003452250d81f8b07d42e127c92729802e3c48f3c7b9834256fd0fb9a0c2e"));
static const Checkpoints::CCheckpointData data = { static const Checkpoints::CCheckpointData mainCheckpointData = {
&mapCheckpoints, &mapCheckpoints,
1643790201, // * UNIX timestamp of last checkpoint block 1643790201, // * UNIX timestamp of last checkpoint block
0, // * total number of transactions between genesis and last checkpoint 0, // * total number of transactions between genesis and last checkpoint
@@ -255,7 +255,7 @@ public:
const Checkpoints::CCheckpointData& Checkpoints() const const Checkpoints::CCheckpointData& Checkpoints() const
{ {
return data; return mainCheckpointData;
} }
}; };
static CMainParams mainParams; static CMainParams mainParams;
@@ -462,7 +462,7 @@ public:
const Checkpoints::CCheckpointData& Checkpoints() const const Checkpoints::CCheckpointData& Checkpoints() const
{ {
// UnitTest share the same checkpoints as MAIN // UnitTest share the same checkpoints as MAIN
return data; return mainCheckpointData;
} }
//! Published setters to allow changing values in unit test cases //! Published setters to allow changing values in unit test cases
+24 -24
View File
@@ -684,12 +684,12 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
} }
// hardcoded $DATADIR/bootstrap.dat // hardcoded $DATADIR/bootstrap.dat
filesystem::path pathBootstrap = GetDataDir() / "bootstrap.dat"; boost::filesystem::path pathBootstrap = GetDataDir() / "bootstrap.dat";
if (filesystem::exists(pathBootstrap)) { if (boost::filesystem::exists(pathBootstrap)) {
FILE* file = fopen(pathBootstrap.string().c_str(), "rb"); FILE* file = fopen(pathBootstrap.string().c_str(), "rb");
if (file) { if (file) {
CImportingNow imp; CImportingNow imp;
filesystem::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old"; boost::filesystem::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old";
LogPrintf("Importing bootstrap.dat...\n"); LogPrintf("Importing bootstrap.dat...\n");
LoadExternalBlockFile(file); LoadExternalBlockFile(file);
RenameOver(pathBootstrap, pathBootstrapOld); RenameOver(pathBootstrap, pathBootstrapOld);
@@ -1105,15 +1105,15 @@ bool AppInit2()
// ********************************************************* Step 5: Backup wallet and verify wallet database integrity // ********************************************************* Step 5: Backup wallet and verify wallet database integrity
#ifdef ENABLE_WALLET #ifdef ENABLE_WALLET
if (!fDisableWallet) { if (!fDisableWallet) {
filesystem::path backupDir = GetDataDir() / "backups"; boost::filesystem::path backupDir = GetDataDir() / "backups";
if (!filesystem::exists(backupDir)) { if (!boost::filesystem::exists(backupDir)) {
// Always create backup folder to not confuse the operating system's file browser // Always create backup folder to not confuse the operating system's file browser
filesystem::create_directories(backupDir); boost::filesystem::create_directories(backupDir);
} }
nWalletBackups = GetArg("-createwalletbackups", 10); nWalletBackups = GetArg("-createwalletbackups", 10);
nWalletBackups = std::max(0, std::min(10, nWalletBackups)); nWalletBackups = std::max(0, std::min(10, nWalletBackups));
if (nWalletBackups > 0) { if (nWalletBackups > 0) {
if (filesystem::exists(backupDir)) { if (boost::filesystem::exists(backupDir)) {
// Create backup of the wallet // Create backup of the wallet
std::string dateTimeStr = DateTimeStrFormat(".%Y-%m-%d-%H-%M", GetTime()); std::string dateTimeStr = DateTimeStrFormat(".%Y-%m-%d-%H-%M", GetTime());
std::string backupPathStr = backupDir.string(); std::string backupPathStr = backupDir.string();
@@ -1176,30 +1176,30 @@ bool AppInit2()
if (GetBoolArg("-resync", false)) { if (GetBoolArg("-resync", false)) {
uiInterface.InitMessage(_("Preparing for resync...")); uiInterface.InitMessage(_("Preparing for resync..."));
// Delete the local blockchain folders to force a resync from scratch to get a consitent blockchain-state // Delete the local blockchain folders to force a resync from scratch to get a consitent blockchain-state
filesystem::path blocksDir = GetDataDir() / "blocks"; boost::filesystem::path blocksDir = GetDataDir() / "blocks";
filesystem::path chainstateDir = GetDataDir() / "chainstate"; boost::filesystem::path chainstateDir = GetDataDir() / "chainstate";
filesystem::path sporksDir = GetDataDir() / "sporks"; boost::filesystem::path sporksDir = GetDataDir() / "sporks";
filesystem::path zerocoinDir = GetDataDir() / "zerocoin"; boost::filesystem::path zerocoinDir = GetDataDir() / "zerocoin";
LogPrintf("Deleting blockchain folders blocks, chainstate, sporks and zerocoin\n"); LogPrintf("Deleting blockchain folders blocks, chainstate, sporks and zerocoin\n");
// We delete in 4 individual steps in case one of the folder is missing already // We delete in 4 individual steps in case one of the folder is missing already
try { try {
if (filesystem::exists(blocksDir)){ if (boost::filesystem::exists(blocksDir)){
boost::filesystem::remove_all(blocksDir); boost::filesystem::remove_all(blocksDir);
LogPrintf("-resync: folder deleted: %s\n", blocksDir.string().c_str()); LogPrintf("-resync: folder deleted: %s\n", blocksDir.string().c_str());
} }
if (filesystem::exists(chainstateDir)){ if (boost::filesystem::exists(chainstateDir)){
boost::filesystem::remove_all(chainstateDir); boost::filesystem::remove_all(chainstateDir);
LogPrintf("-resync: folder deleted: %s\n", chainstateDir.string().c_str()); LogPrintf("-resync: folder deleted: %s\n", chainstateDir.string().c_str());
} }
if (filesystem::exists(sporksDir)){ if (boost::filesystem::exists(sporksDir)){
boost::filesystem::remove_all(sporksDir); boost::filesystem::remove_all(sporksDir);
LogPrintf("-resync: folder deleted: %s\n", sporksDir.string().c_str()); LogPrintf("-resync: folder deleted: %s\n", sporksDir.string().c_str());
} }
if (filesystem::exists(zerocoinDir)){ if (boost::filesystem::exists(zerocoinDir)){
boost::filesystem::remove_all(zerocoinDir); boost::filesystem::remove_all(zerocoinDir);
LogPrintf("-resync: folder deleted: %s\n", zerocoinDir.string().c_str()); LogPrintf("-resync: folder deleted: %s\n", zerocoinDir.string().c_str());
} }
@@ -1236,7 +1236,7 @@ bool AppInit2()
return false; return false;
} }
if (filesystem::exists(GetDataDir() / strWalletFile)) { if (boost::filesystem::exists(GetDataDir() / strWalletFile)) {
CDBEnv::VerifyResult r = bitdb.Verify(strWalletFile, CWalletDB::Recover); CDBEnv::VerifyResult r = bitdb.Verify(strWalletFile, CWalletDB::Recover);
if (r == CDBEnv::RECOVER_OK) { if (r == CDBEnv::RECOVER_OK) {
string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!" string msg = strprintf(_("Warning: wallet.dat corrupt, data salvaged!"
@@ -1400,19 +1400,19 @@ bool AppInit2()
fReindex = GetBoolArg("-reindex", false); fReindex = GetBoolArg("-reindex", false);
// Upgrading to 0.8; hard-link the old blknnnn.dat files into /blocks/ // Upgrading to 0.8; hard-link the old blknnnn.dat files into /blocks/
filesystem::path blocksDir = GetDataDir() / "blocks"; boost::filesystem::path blocksDir = GetDataDir() / "blocks";
if (!filesystem::exists(blocksDir)) { if (!boost::filesystem::exists(blocksDir)) {
filesystem::create_directories(blocksDir); boost::filesystem::create_directories(blocksDir);
bool linked = false; bool linked = false;
for (unsigned int i = 1; i < 10000; i++) { for (unsigned int i = 1; i < 10000; i++) {
filesystem::path source = GetDataDir() / strprintf("blk%04u.dat", i); boost::filesystem::path source = GetDataDir() / strprintf("blk%04u.dat", i);
if (!filesystem::exists(source)) break; if (!boost::filesystem::exists(source)) break;
filesystem::path dest = blocksDir / strprintf("blk%05u.dat", i - 1); boost::filesystem::path dest = blocksDir / strprintf("blk%05u.dat", i - 1);
try { try {
filesystem::create_hard_link(source, dest); boost::filesystem::create_hard_link(source, dest);
LogPrintf("Hardlinked %s -> %s\n", source.string(), dest.string()); LogPrintf("Hardlinked %s -> %s\n", source.string(), dest.string());
linked = true; linked = true;
} catch (filesystem::filesystem_error& e) { } catch (boost::filesystem::filesystem_error& e) {
// Note: hardlink creation failing is not a disaster, it just means // Note: hardlink creation failing is not a disaster, it just means
// blocks will get re-downloaded from peers. // blocks will get re-downloaded from peers.
LogPrintf("Error hardlinking blk%04u.dat : %s\n", i, e.what()); LogPrintf("Error hardlinking blk%04u.dat : %s\n", i, e.what());
+1 -1
View File
@@ -4966,7 +4966,7 @@ bool AbortNode(const std::string& strMessage, const std::string& userMessage)
bool CheckDiskSpace(uint64_t nAdditionalBytes) bool CheckDiskSpace(uint64_t nAdditionalBytes)
{ {
uint64_t nFreeBytesAvailable = filesystem::space(GetDataDir()).available; uint64_t nFreeBytesAvailable = boost::filesystem::space(GetDataDir()).available;
// Check for nMinDiskSpace bytes (currently 50MB) // Check for nMinDiskSpace bytes (currently 50MB)
if (nFreeBytesAvailable < nMinDiskSpace + nAdditionalBytes) if (nFreeBytesAvailable < nMinDiskSpace + nAdditionalBytes)
+19 -18
View File
@@ -4,6 +4,25 @@
// Distributed under the MIT/X11 software license, see the accompanying // Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifdef WIN32
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0501
#ifdef _WIN32_IE
#undef _WIN32_IE
#endif
#define _WIN32_IE 0x0501
#define WIN32_LEAN_AND_MEAN 1
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <shlwapi.h>
#endif
#include "guiutil.h" #include "guiutil.h"
#include "bitcoinaddressvalidator.h" #include "bitcoinaddressvalidator.h"
@@ -19,24 +38,6 @@
#include "script/standard.h" #include "script/standard.h"
#include "util.h" #include "util.h"
#ifdef WIN32
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0501
#ifdef _WIN32_IE
#undef _WIN32_IE
#endif
#define _WIN32_IE 0x0501
#define WIN32_LEAN_AND_MEAN 1
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include "shellapi.h"
#include "shlobj.h"
#include "shlwapi.h"
#endif
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp> #include <boost/filesystem/fstream.hpp>
#if BOOST_FILESYSTEM_VERSION >= 3 #if BOOST_FILESYSTEM_VERSION >= 3
+1 -1
View File
@@ -17,7 +17,7 @@
// If we don't want a message to be processed by Qt, return true and set result to // If we don't want a message to be processed by Qt, return true and set result to
// the value that the window procedure should return. Otherwise return false. // the value that the window procedure should return. Otherwise return false.
bool WinShutdownMonitor::nativeEventFilter(const QByteArray& eventType, void* pMessage, long* pnResult) bool WinShutdownMonitor::nativeEventFilter(const QByteArray& eventType, void* pMessage, WinShutdownMonitorResult* pnResult)
{ {
Q_UNUSED(eventType); Q_UNUSED(eventType);
+8 -1
View File
@@ -12,12 +12,19 @@
#include <windef.h> // for HWND #include <windef.h> // for HWND
#include <QAbstractNativeEventFilter> #include <QAbstractNativeEventFilter>
#include <QtGlobal>
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
typedef qintptr WinShutdownMonitorResult;
#else
typedef long WinShutdownMonitorResult;
#endif
class WinShutdownMonitor : public QAbstractNativeEventFilter class WinShutdownMonitor : public QAbstractNativeEventFilter
{ {
public: public:
/** Implements QAbstractNativeEventFilter interface for processing Windows messages */ /** Implements QAbstractNativeEventFilter interface for processing Windows messages */
bool nativeEventFilter(const QByteArray& eventType, void* pMessage, long* pnResult); bool nativeEventFilter(const QByteArray& eventType, void* pMessage, WinShutdownMonitorResult* pnResult);
/** Register the reason for blocking shutdown on Windows to allow clean client exit */ /** Register the reason for blocking shutdown on Windows to allow clean client exit */
static void registerShutdownBlockReason(const QString& strReason, const HWND& mainWinId); static void registerShutdownBlockReason(const QString& strReason, const HWND& mainWinId);
+9 -9
View File
@@ -4505,22 +4505,22 @@ string CWallet::GetUniqueWalletBackupName(bool fzagrAuto) const
void CWallet::ZPivBackupWallet() void CWallet::ZPivBackupWallet()
{ {
filesystem::path backupDir = GetDataDir() / "backups"; boost::filesystem::path backupDir = GetDataDir() / "backups";
filesystem::path backupPath; boost::filesystem::path backupPath;
string strNewBackupName; string strNewBackupName;
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
strNewBackupName = strprintf("wallet-autozagrbackup-%d.dat", i); strNewBackupName = strprintf("wallet-autozagrbackup-%d.dat", i);
backupPath = backupDir / strNewBackupName; backupPath = backupDir / strNewBackupName;
if (filesystem::exists(backupPath)) { if (boost::filesystem::exists(backupPath)) {
//Keep up to 10 backups //Keep up to 10 backups
if (i <= 8) { if (i <= 8) {
//If the next file backup exists and is newer, then iterate //If the next file backup exists and is newer, then iterate
filesystem::path nextBackupPath = backupDir / strprintf("wallet-autozagrbackup-%d.dat", i + 1); boost::filesystem::path nextBackupPath = backupDir / strprintf("wallet-autozagrbackup-%d.dat", i + 1);
if (filesystem::exists(nextBackupPath)) { if (boost::filesystem::exists(nextBackupPath)) {
time_t timeThis = filesystem::last_write_time(backupPath); time_t timeThis = boost::filesystem::last_write_time(backupPath);
time_t timeNext = filesystem::last_write_time(nextBackupPath); time_t timeNext = boost::filesystem::last_write_time(nextBackupPath);
if (timeThis > timeNext) { if (timeThis > timeNext) {
//The next backup is created before this backup was //The next backup is created before this backup was
//The next backup is the correct path to use //The next backup is the correct path to use
@@ -4543,8 +4543,8 @@ void CWallet::ZPivBackupWallet()
BackupWallet(*this, backupPath.string()); BackupWallet(*this, backupPath.string());
if(!GetArg("-zagrbackuppath", "").empty()) { if(!GetArg("-zagrbackuppath", "").empty()) {
filesystem::path customPath(GetArg("-zagrbackuppath", "")); boost::filesystem::path customPath(GetArg("-zagrbackuppath", ""));
filesystem::create_directories(customPath); boost::filesystem::create_directories(customPath);
if(!customPath.has_extension()) { if(!customPath.has_extension()) {
customPath /= GetUniqueWalletBackupName(true); customPath /= GetUniqueWalletBackupName(true);
+19 -19
View File
@@ -962,10 +962,10 @@ void NotifyBacked(const CWallet& wallet, bool fSuccess, string strMessage)
wallet.NotifyWalletBacked(fSuccess, strMessage); wallet.NotifyWalletBacked(fSuccess, strMessage);
} }
bool BackupWallet(const CWallet& wallet, const filesystem::path& strDest, bool fEnableCustom) bool BackupWallet(const CWallet& wallet, const boost::filesystem::path& strDest, bool fEnableCustom)
{ {
filesystem::path pathCustom; boost::filesystem::path pathCustom;
filesystem::path pathWithFile; boost::filesystem::path pathWithFile;
if (!wallet.fFileBacked) { if (!wallet.fFileBacked) {
return false; return false;
} else if(fEnableCustom) { } else if(fEnableCustom) {
@@ -978,8 +978,8 @@ bool BackupWallet(const CWallet& wallet, const filesystem::path& strDest, bool f
pathCustom = pathWithFile.parent_path(); pathCustom = pathWithFile.parent_path();
} }
try { try {
filesystem::create_directories(pathCustom); boost::filesystem::create_directories(pathCustom);
} catch(const filesystem::filesystem_error& e) { } catch(const boost::filesystem::filesystem_error& e) {
NotifyBacked(wallet, false, strprintf("%s\n", e.what())); NotifyBacked(wallet, false, strprintf("%s\n", e.what()));
pathCustom = ""; pathCustom = "";
} }
@@ -996,8 +996,8 @@ bool BackupWallet(const CWallet& wallet, const filesystem::path& strDest, bool f
bitdb.mapFileUseCount.erase(wallet.strWalletFile); bitdb.mapFileUseCount.erase(wallet.strWalletFile);
// Copy wallet.dat // Copy wallet.dat
filesystem::path pathDest(strDest); boost::filesystem::path pathDest(strDest);
filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile; boost::filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;
if (is_directory(pathDest)) { if (is_directory(pathDest)) {
if(!exists(pathDest)) create_directory(pathDest); if(!exists(pathDest)) create_directory(pathDest);
pathDest /= wallet.strWalletFile; pathDest /= wallet.strWalletFile;
@@ -1008,21 +1008,21 @@ bool BackupWallet(const CWallet& wallet, const filesystem::path& strDest, bool f
int nThreshold = GetArg("-custombackupthreshold", DEFAULT_CUSTOMBACKUPTHRESHOLD); int nThreshold = GetArg("-custombackupthreshold", DEFAULT_CUSTOMBACKUPTHRESHOLD);
if (nThreshold > 0) { if (nThreshold > 0) {
typedef std::multimap<std::time_t, filesystem::path> folder_set_t; typedef std::multimap<std::time_t, boost::filesystem::path> folder_set_t;
folder_set_t folderSet; folder_set_t folderSet;
filesystem::directory_iterator end_iter; boost::filesystem::directory_iterator end_iter;
pathCustom.make_preferred(); pathCustom.make_preferred();
// Build map of backup files for current(!) wallet sorted by last write time // Build map of backup files for current(!) wallet sorted by last write time
filesystem::path currentFile; boost::filesystem::path currentFile;
for (filesystem::directory_iterator dir_iter(pathCustom); dir_iter != end_iter; ++dir_iter) { for (boost::filesystem::directory_iterator dir_iter(pathCustom); dir_iter != end_iter; ++dir_iter) {
// Only check regular files // Only check regular files
if (filesystem::is_regular_file(dir_iter->status())) { if (boost::filesystem::is_regular_file(dir_iter->status())) {
currentFile = dir_iter->path().filename(); currentFile = dir_iter->path().filename();
// Only add the backups for the current wallet, e.g. wallet.dat.* // Only add the backups for the current wallet, e.g. wallet.dat.*
if (dir_iter->path().stem().string() == wallet.strWalletFile) { if (dir_iter->path().stem().string() == wallet.strWalletFile) {
folderSet.insert(folder_set_t::value_type(filesystem::last_write_time(dir_iter->path()), *dir_iter)); folderSet.insert(folder_set_t::value_type(boost::filesystem::last_write_time(dir_iter->path()), *dir_iter));
} }
} }
} }
@@ -1046,10 +1046,10 @@ bool BackupWallet(const CWallet& wallet, const filesystem::path& strDest, bool f
try { try {
auto entry = folderSet.find(oldestBackup); auto entry = folderSet.find(oldestBackup);
if (entry != folderSet.end()) { if (entry != folderSet.end()) {
filesystem::remove(entry->second); boost::filesystem::remove(entry->second);
LogPrintf("Old backup deleted: %s\n", (*entry).second); LogPrintf("Old backup deleted: %s\n", (*entry).second);
} }
} catch (filesystem::filesystem_error& error) { } catch (boost::filesystem::filesystem_error& error) {
string strMessage = strprintf("Failed to delete backup %s\n", error.what()); string strMessage = strprintf("Failed to delete backup %s\n", error.what());
LogPrint(nullptr, strMessage.data()); LogPrint(nullptr, strMessage.data());
NotifyBacked(wallet, false, strMessage); NotifyBacked(wallet, false, strMessage);
@@ -1067,7 +1067,7 @@ bool BackupWallet(const CWallet& wallet, const filesystem::path& strDest, bool f
return false; return false;
} }
bool AttemptBackupWallet(const CWallet& wallet, const filesystem::path& pathSrc, const filesystem::path& pathDest) bool AttemptBackupWallet(const CWallet& wallet, const boost::filesystem::path& pathSrc, const boost::filesystem::path& pathDest)
{ {
bool retStatus; bool retStatus;
string strMessage; string strMessage;
@@ -1077,9 +1077,9 @@ bool AttemptBackupWallet(const CWallet& wallet, const filesystem::path& pathSrc,
return false; return false;
} }
#if BOOST_VERSION >= 107400 /* BOOST_LIB_VERSION 1_74 */ #if BOOST_VERSION >= 107400 /* BOOST_LIB_VERSION 1_74 */
filesystem::copy_file(pathSrc.c_str(), pathDest, filesystem::copy_options::overwrite_existing); boost::filesystem::copy_file(pathSrc.c_str(), pathDest, boost::filesystem::copy_options::overwrite_existing);
#elif BOOST_VERSION >= 105800 /* BOOST_LIB_VERSION 1_58 */ #elif BOOST_VERSION >= 105800 /* BOOST_LIB_VERSION 1_58 */
filesystem::copy_file(pathSrc.c_str(), pathDest, filesystem::copy_option::overwrite_if_exists); boost::filesystem::copy_file(pathSrc.c_str(), pathDest, boost::filesystem::copy_option::overwrite_if_exists);
#else #else
std::ifstream src(pathSrc.c_str(), std::ios::binary | std::ios::in); std::ifstream src(pathSrc.c_str(), std::ios::binary | std::ios::in);
std::ofstream dst(pathDest.c_str(), std::ios::binary | std::ios::out | std::ios::trunc); std::ofstream dst(pathDest.c_str(), std::ios::binary | std::ios::out | std::ios::trunc);
@@ -1091,7 +1091,7 @@ bool AttemptBackupWallet(const CWallet& wallet, const filesystem::path& pathSrc,
strMessage = strprintf("copied wallet.dat to %s\n", pathDest.string()); strMessage = strprintf("copied wallet.dat to %s\n", pathDest.string());
LogPrint(nullptr, strMessage.data()); LogPrint(nullptr, strMessage.data());
retStatus = true; retStatus = true;
} catch (const filesystem::filesystem_error& e) { } catch (const boost::filesystem::filesystem_error& e) {
retStatus = false; retStatus = false;
strMessage = strprintf("%s\n", e.what()); strMessage = strprintf("%s\n", e.what());
LogPrint(nullptr, strMessage.data()); LogPrint(nullptr, strMessage.data());