mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
Merge pull request #5718 from knst/mac-improvements
backport: bitcoin#24603, #26694, #24669, #22546, #22199, #25817 (mac build)
This commit is contained in:
parent
a8573c942f
commit
7c966c9db0
17
Makefile.am
17
Makefile.am
@ -36,7 +36,6 @@ OSX_APP=Dash-Qt.app
|
|||||||
OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME))
|
OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME))
|
||||||
OSX_DMG = $(OSX_VOLNAME).dmg
|
OSX_DMG = $(OSX_VOLNAME).dmg
|
||||||
OSX_TEMP_ISO = $(OSX_DMG:.dmg=).temp.iso
|
OSX_TEMP_ISO = $(OSX_DMG:.dmg=).temp.iso
|
||||||
OSX_BACKGROUND_IMAGE=$(top_srcdir)/contrib/macdeploy/background.tiff
|
|
||||||
OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus
|
OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus
|
||||||
OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/dash.icns
|
OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/dash.icns
|
||||||
OSX_PLIST=$(top_builddir)/share/qt/Info.plist #not installed
|
OSX_PLIST=$(top_builddir)/share/qt/Info.plist #not installed
|
||||||
@ -60,7 +59,6 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/dash.ico \
|
|||||||
$(top_srcdir)/doc/README_windows.txt
|
$(top_srcdir)/doc/README_windows.txt
|
||||||
|
|
||||||
OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_INSTALLER_ICONS) \
|
OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_INSTALLER_ICONS) \
|
||||||
$(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \
|
|
||||||
$(top_srcdir)/contrib/macdeploy/detached-sig-create.sh
|
$(top_srcdir)/contrib/macdeploy/detached-sig-create.sh
|
||||||
|
|
||||||
COVERAGE_INFO = baseline.info \
|
COVERAGE_INFO = baseline.info \
|
||||||
@ -125,28 +123,17 @@ $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
|||||||
deploydir: $(OSX_DMG)
|
deploydir: $(OSX_DMG)
|
||||||
else !BUILD_DARWIN
|
else !BUILD_DARWIN
|
||||||
APP_DIST_DIR=$(top_builddir)/dist
|
APP_DIST_DIR=$(top_builddir)/dist
|
||||||
APP_DIST_EXTRAS=$(APP_DIST_DIR)/.background/background.tiff $(APP_DIST_DIR)/.DS_Store $(APP_DIST_DIR)/Applications
|
|
||||||
|
|
||||||
$(APP_DIST_DIR)/Applications:
|
$(OSX_TEMP_ISO): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt
|
||||||
@rm -f $@
|
|
||||||
@cd $(@D); $(LN_S) /Applications $(@F)
|
|
||||||
|
|
||||||
$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt
|
|
||||||
|
|
||||||
$(OSX_TEMP_ISO): $(APP_DIST_EXTRAS)
|
|
||||||
$(XORRISOFS) -D -l -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -o $@ $(APP_DIST_DIR) -- $(if $(SOURCE_DATE_EPOCH),-volume_date all_file_dates =$(SOURCE_DATE_EPOCH))
|
$(XORRISOFS) -D -l -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -o $@ $(APP_DIST_DIR) -- $(if $(SOURCE_DATE_EPOCH),-volume_date all_file_dates =$(SOURCE_DATE_EPOCH))
|
||||||
|
|
||||||
$(OSX_DMG): $(OSX_TEMP_ISO)
|
$(OSX_DMG): $(OSX_TEMP_ISO)
|
||||||
$(DMG) dmg "$<" "$@"
|
$(DMG) dmg "$<" "$@"
|
||||||
|
|
||||||
$(APP_DIST_DIR)/.background/background.tiff:
|
|
||||||
$(MKDIR_P) $(@D)
|
|
||||||
cp $(OSX_BACKGROUND_IMAGE) $@
|
|
||||||
|
|
||||||
$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
||||||
INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) $(OSX_VOLNAME) -translations-dir=$(QT_TRANSLATION_DIR)
|
INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) $(OSX_VOLNAME) -translations-dir=$(QT_TRANSLATION_DIR)
|
||||||
|
|
||||||
deploydir: $(APP_DIST_EXTRAS)
|
deploydir: $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt
|
||||||
endif !BUILD_DARWIN
|
endif !BUILD_DARWIN
|
||||||
|
|
||||||
appbundle: $(OSX_APP_BUILT)
|
appbundle: $(OSX_APP_BUILT)
|
||||||
|
@ -15,5 +15,5 @@ export RUN_UNIT_TESTS_SEQUENTIAL="true"
|
|||||||
export RUN_UNIT_TESTS="false"
|
export RUN_UNIT_TESTS="false"
|
||||||
export GOAL="install"
|
export GOAL="install"
|
||||||
export TEST_PREVIOUS_RELEASES=true
|
export TEST_PREVIOUS_RELEASES=true
|
||||||
export PREVIOUS_RELEASES_TO_DOWNLOAD="v0.15.0.0 v0.16.1.1 v0.17.0.3 v18.2.2 v19.3.0"
|
export PREVIOUS_RELEASES_TO_DOWNLOAD="v0.15.0.0 v0.16.1.1 v0.17.0.3 v18.2.2 v19.3.0 v20.0.1"
|
||||||
export BITCOIN_CONFIG="--enable-zmq --enable-reduce-exports --disable-fuzz-binary LDFLAGS=-static-libstdc++"
|
export BITCOIN_CONFIG="--enable-zmq --enable-reduce-exports --disable-fuzz-binary LDFLAGS=-static-libstdc++"
|
||||||
|
@ -328,7 +328,7 @@ mkdir -p "$DISTSRC"
|
|||||||
mkdir -p "unsigned-app-${HOST}"
|
mkdir -p "unsigned-app-${HOST}"
|
||||||
cp --target-directory="unsigned-app-${HOST}" \
|
cp --target-directory="unsigned-app-${HOST}" \
|
||||||
osx_volname \
|
osx_volname \
|
||||||
contrib/macdeploy/detached-sig-{apply,create}.sh \
|
contrib/macdeploy/detached-sig-create.sh \
|
||||||
"${BASEPREFIX}/${HOST}"/native/bin/dmg
|
"${BASEPREFIX}/${HOST}"/native/bin/dmg
|
||||||
mv --target-directory="unsigned-app-${HOST}" dist
|
mv --target-directory="unsigned-app-${HOST}" dist
|
||||||
(
|
(
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# Copyright (c) 2014-2015 The Bitcoin Core developers
|
|
||||||
# Distributed under the MIT software license, see the accompanying
|
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
||||||
|
|
||||||
export LC_ALL=C
|
|
||||||
set -e
|
|
||||||
|
|
||||||
UNSIGNED="$1"
|
|
||||||
SIGNATURE="$2"
|
|
||||||
ROOTDIR=dist
|
|
||||||
OUTDIR=signed-app
|
|
||||||
SIGNAPPLE=signapple
|
|
||||||
|
|
||||||
if [ -z "$UNSIGNED" ]; then
|
|
||||||
echo "usage: $0 <unsigned app> <signature>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$SIGNATURE" ]; then
|
|
||||||
echo "usage: $0 <unsigned app> <signature>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
${SIGNAPPLE} apply ${UNSIGNED} ${SIGNATURE}
|
|
||||||
mv ${ROOTDIR} ${OUTDIR}
|
|
||||||
echo "Signed: ${OUTDIR}"
|
|
@ -16,8 +16,7 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
import plistlib
|
import sys, re, os, platform, shutil, stat, subprocess, os.path
|
||||||
import sys, re, os, shutil, stat, os.path
|
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from ds_store import DSStore
|
from ds_store import DSStore
|
||||||
from mac_alias import Alias
|
from mac_alias import Alias
|
||||||
@ -53,7 +52,7 @@ class FrameworkInfo(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f""" Framework name: {frameworkName}
|
return f""" Framework name: {self.frameworkName}
|
||||||
Framework directory: {self.frameworkDirectory}
|
Framework directory: {self.frameworkDirectory}
|
||||||
Framework path: {self.frameworkPath}
|
Framework path: {self.frameworkPath}
|
||||||
Binary name: {self.binaryName}
|
Binary name: {self.binaryName}
|
||||||
@ -85,8 +84,8 @@ class FrameworkInfo(object):
|
|||||||
if line == "":
|
if line == "":
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Don't deploy system libraries (exception for libQtuitools and libQtlucene).
|
# Don't deploy system libraries
|
||||||
if line.startswith("/System/Library/") or line.startswith("@executable_path") or (line.startswith("/usr/lib/") and "libQt" not in line):
|
if line.startswith("/System/Library/") or line.startswith("@executable_path") or line.startswith("/usr/lib/"):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
m = cls.reOLine.match(line)
|
m = cls.reOLine.match(line)
|
||||||
@ -246,56 +245,46 @@ def copyFramework(framework: FrameworkInfo, path: str, verbose: int) -> Optional
|
|||||||
toDir = os.path.join(path, framework.destinationDirectory)
|
toDir = os.path.join(path, framework.destinationDirectory)
|
||||||
toPath = os.path.join(toDir, framework.binaryName)
|
toPath = os.path.join(toDir, framework.binaryName)
|
||||||
|
|
||||||
if not os.path.exists(fromPath):
|
if framework.isDylib():
|
||||||
raise RuntimeError(f"No file at {fromPath}")
|
if not os.path.exists(fromPath):
|
||||||
|
raise RuntimeError(f"No file at {fromPath}")
|
||||||
|
|
||||||
if os.path.exists(toPath):
|
if os.path.exists(toPath):
|
||||||
return None # Already there
|
return None # Already there
|
||||||
|
|
||||||
if not os.path.exists(toDir):
|
if not os.path.exists(toDir):
|
||||||
os.makedirs(toDir)
|
os.makedirs(toDir)
|
||||||
|
|
||||||
shutil.copy2(fromPath, toPath)
|
shutil.copy2(fromPath, toPath)
|
||||||
if verbose:
|
if verbose:
|
||||||
print("Copied:", fromPath)
|
print("Copied:", fromPath)
|
||||||
print(" to:", toPath)
|
print(" to:", toPath)
|
||||||
|
else:
|
||||||
|
to_dir = os.path.join(path, "Contents", "Frameworks", framework.frameworkName)
|
||||||
|
if os.path.exists(to_dir):
|
||||||
|
return None # Already there
|
||||||
|
|
||||||
|
from_dir = framework.frameworkPath
|
||||||
|
if not os.path.exists(from_dir):
|
||||||
|
raise RuntimeError(f"No directory at {from_dir}")
|
||||||
|
|
||||||
|
shutil.copytree(from_dir, to_dir, symlinks=True)
|
||||||
|
if verbose:
|
||||||
|
print("Copied:", from_dir)
|
||||||
|
print(" to:", to_dir)
|
||||||
|
|
||||||
|
headers_link = os.path.join(to_dir, "Headers")
|
||||||
|
if os.path.exists(headers_link):
|
||||||
|
os.unlink(headers_link)
|
||||||
|
|
||||||
|
headers_dir = os.path.join(to_dir, framework.binaryDirectory, "Headers")
|
||||||
|
if os.path.exists(headers_dir):
|
||||||
|
shutil.rmtree(headers_dir)
|
||||||
|
|
||||||
permissions = os.stat(toPath)
|
permissions = os.stat(toPath)
|
||||||
if not permissions.st_mode & stat.S_IWRITE:
|
if not permissions.st_mode & stat.S_IWRITE:
|
||||||
os.chmod(toPath, permissions.st_mode | stat.S_IWRITE)
|
os.chmod(toPath, permissions.st_mode | stat.S_IWRITE)
|
||||||
|
|
||||||
if not framework.isDylib(): # Copy resources for real frameworks
|
|
||||||
|
|
||||||
linkfrom = os.path.join(path, "Contents","Frameworks", framework.frameworkName, "Versions", "Current")
|
|
||||||
linkto = framework.version
|
|
||||||
if not os.path.exists(linkfrom):
|
|
||||||
os.symlink(linkto, linkfrom)
|
|
||||||
print("Linked:", linkfrom, "->", linkto)
|
|
||||||
fromResourcesDir = framework.sourceResourcesDirectory
|
|
||||||
if os.path.exists(fromResourcesDir):
|
|
||||||
toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory)
|
|
||||||
shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True)
|
|
||||||
if verbose:
|
|
||||||
print("Copied resources:", fromResourcesDir)
|
|
||||||
print(" to:", toResourcesDir)
|
|
||||||
fromContentsDir = framework.sourceVersionContentsDirectory
|
|
||||||
if not os.path.exists(fromContentsDir):
|
|
||||||
fromContentsDir = framework.sourceContentsDirectory
|
|
||||||
if os.path.exists(fromContentsDir):
|
|
||||||
toContentsDir = os.path.join(path, framework.destinationVersionContentsDirectory)
|
|
||||||
shutil.copytree(fromContentsDir, toContentsDir, symlinks=True)
|
|
||||||
if verbose:
|
|
||||||
print("Copied Contents:", fromContentsDir)
|
|
||||||
print(" to:", toContentsDir)
|
|
||||||
elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout)
|
|
||||||
qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "Resources", "qt_menu.nib")
|
|
||||||
qtMenuNibDestinationPath = os.path.join(path, "Contents", "Resources", "qt_menu.nib")
|
|
||||||
if os.path.exists(qtMenuNibSourcePath) and not os.path.exists(qtMenuNibDestinationPath):
|
|
||||||
shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath, symlinks=True)
|
|
||||||
if verbose:
|
|
||||||
print("Copied for libQtGui:", qtMenuNibSourcePath)
|
|
||||||
print(" to:", qtMenuNibDestinationPath)
|
|
||||||
|
|
||||||
return toPath
|
return toPath
|
||||||
|
|
||||||
def deployFrameworks(frameworks: List[FrameworkInfo], bundlePath: str, binaryPath: str, strip: bool, verbose: int, deploymentInfo: Optional[DeploymentInfo] = None) -> DeploymentInfo:
|
def deployFrameworks(frameworks: List[FrameworkInfo], bundlePath: str, binaryPath: str, strip: bool, verbose: int, deploymentInfo: Optional[DeploymentInfo] = None) -> DeploymentInfo:
|
||||||
@ -351,115 +340,20 @@ def deployFrameworksForAppBundle(applicationBundle: ApplicationBundleInfo, strip
|
|||||||
return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose)
|
return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose)
|
||||||
|
|
||||||
def deployPlugins(appBundleInfo: ApplicationBundleInfo, deploymentInfo: DeploymentInfo, strip: bool, verbose: int):
|
def deployPlugins(appBundleInfo: ApplicationBundleInfo, deploymentInfo: DeploymentInfo, strip: bool, verbose: int):
|
||||||
# Lookup available plugins, exclude unneeded
|
|
||||||
plugins = []
|
plugins = []
|
||||||
if deploymentInfo.pluginPath is None:
|
if deploymentInfo.pluginPath is None:
|
||||||
return
|
return
|
||||||
for dirpath, dirnames, filenames in os.walk(deploymentInfo.pluginPath):
|
for dirpath, dirnames, filenames in os.walk(deploymentInfo.pluginPath):
|
||||||
pluginDirectory = os.path.relpath(dirpath, deploymentInfo.pluginPath)
|
pluginDirectory = os.path.relpath(dirpath, deploymentInfo.pluginPath)
|
||||||
if pluginDirectory == "designer":
|
|
||||||
# Skip designer plugins
|
if pluginDirectory not in ['styles', 'platforms']:
|
||||||
continue
|
continue
|
||||||
elif pluginDirectory == "printsupport":
|
|
||||||
# Skip printsupport plugins
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "imageformats":
|
|
||||||
# Skip imageformats plugins
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "sqldrivers":
|
|
||||||
# Deploy the sql plugins only if QtSql is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtSql"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "script":
|
|
||||||
# Deploy the script plugins only if QtScript is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtScript"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "qmltooling" or pluginDirectory == "qml1tooling":
|
|
||||||
# Deploy the qml plugins only if QtDeclarative is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtDeclarative"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "bearer":
|
|
||||||
# Deploy the bearer plugins only if QtNetwork is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtNetwork"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "position":
|
|
||||||
# Deploy the position plugins only if QtPositioning is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtPositioning"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "sensors" or pluginDirectory == "sensorgestures":
|
|
||||||
# Deploy the sensor plugins only if QtSensors is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtSensors"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "audio" or pluginDirectory == "playlistformats":
|
|
||||||
# Deploy the audio plugins only if QtMultimedia is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtMultimedia"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "mediaservice":
|
|
||||||
# Deploy the mediaservice plugins only if QtMultimediaWidgets is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtMultimediaWidgets"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "canbus":
|
|
||||||
# Deploy the canbus plugins only if QtSerialBus is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtSerialBus"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "webview":
|
|
||||||
# Deploy the webview plugins only if QtWebView is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtWebView"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "gamepads":
|
|
||||||
# Deploy the webview plugins only if QtGamepad is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtGamepad"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "geoservices":
|
|
||||||
# Deploy the webview plugins only if QtLocation is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtLocation"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "texttospeech":
|
|
||||||
# Deploy the texttospeech plugins only if QtTextToSpeech is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtTextToSpeech"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "virtualkeyboard":
|
|
||||||
# Deploy the virtualkeyboard plugins only if QtVirtualKeyboard is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtVirtualKeyboard"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "sceneparsers":
|
|
||||||
# Deploy the virtualkeyboard plugins only if Qt3DCore is in use
|
|
||||||
if not deploymentInfo.usesFramework("Qt3DCore"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "renderplugins":
|
|
||||||
# Deploy the renderplugins plugins only if Qt3DCore is in use
|
|
||||||
if not deploymentInfo.usesFramework("Qt3DCore"):
|
|
||||||
continue
|
|
||||||
elif pluginDirectory == "geometryloaders":
|
|
||||||
# Deploy the geometryloaders plugins only if Qt3DCore is in use
|
|
||||||
if not deploymentInfo.usesFramework("Qt3DCore"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
for pluginName in filenames:
|
for pluginName in filenames:
|
||||||
pluginPath = os.path.join(pluginDirectory, pluginName)
|
pluginPath = os.path.join(pluginDirectory, pluginName)
|
||||||
if pluginName.endswith("_debug.dylib"):
|
|
||||||
# Skip debug plugins
|
if pluginName.split('.')[0] not in ['libqminimal', 'libqcocoa', 'libqmacstyle']:
|
||||||
continue
|
continue
|
||||||
elif pluginPath == "imageformats/libqsvg.dylib" or pluginPath == "iconengines/libqsvgicon.dylib":
|
|
||||||
# Deploy the svg plugins only if QtSvg is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtSvg"):
|
|
||||||
continue
|
|
||||||
elif pluginPath == "accessible/libqtaccessiblecompatwidgets.dylib":
|
|
||||||
# Deploy accessibility for Qt3Support only if the Qt3Support is in use
|
|
||||||
if not deploymentInfo.usesFramework("Qt3Support"):
|
|
||||||
continue
|
|
||||||
elif pluginPath == "graphicssystems/libqglgraphicssystem.dylib":
|
|
||||||
# Deploy the opengl graphicssystem plugin only if QtOpenGL is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtOpenGL"):
|
|
||||||
continue
|
|
||||||
elif pluginPath == "accessible/libqtaccessiblequick.dylib":
|
|
||||||
# Deploy the accessible qtquick plugin only if QtQuick is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtQuick"):
|
|
||||||
continue
|
|
||||||
elif pluginPath == "platforminputcontexts/libqtvirtualkeyboardplugin.dylib":
|
|
||||||
# Deploy the virtualkeyboardplugin plugin only if QtVirtualKeyboard is in use
|
|
||||||
if not deploymentInfo.usesFramework("QtVirtualKeyboard"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
plugins.append((pluginDirectory, pluginName))
|
plugins.append((pluginDirectory, pluginName))
|
||||||
|
|
||||||
@ -527,6 +421,9 @@ if os.path.exists(appname + ".dmg"):
|
|||||||
print("+ Removing existing DMG +")
|
print("+ Removing existing DMG +")
|
||||||
os.unlink(appname + ".dmg")
|
os.unlink(appname + ".dmg")
|
||||||
|
|
||||||
|
if os.path.exists(appname + ".temp.dmg"):
|
||||||
|
os.unlink(appname + ".temp.dmg")
|
||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
target = os.path.join("dist", "Dash-Qt.app")
|
target = os.path.join("dist", "Dash-Qt.app")
|
||||||
@ -644,6 +541,25 @@ ds.close()
|
|||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
|
if platform.system() == "Darwin":
|
||||||
|
subprocess.check_call(f"codesign --deep --force --sign - {target}", shell=True)
|
||||||
|
|
||||||
|
print("+ Installing background.tiff +")
|
||||||
|
|
||||||
|
bg_path = os.path.join('dist', '.background', 'background.tiff')
|
||||||
|
os.mkdir(os.path.dirname(bg_path))
|
||||||
|
|
||||||
|
tiff_path = os.path.join('contrib', 'macdeploy', 'background.tiff')
|
||||||
|
shutil.copy2(tiff_path, bg_path)
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
|
||||||
|
print("+ Generating symlink for /Applications +")
|
||||||
|
|
||||||
|
os.symlink("/Applications", os.path.join('dist', "Applications"))
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
|
||||||
if config.dmg is not None:
|
if config.dmg is not None:
|
||||||
|
|
||||||
print("+ Preparing .dmg disk image +")
|
print("+ Preparing .dmg disk image +")
|
||||||
@ -667,19 +583,6 @@ if config.dmg is not None:
|
|||||||
print("Attaching temp image...")
|
print("Attaching temp image...")
|
||||||
output = run(["hdiutil", "attach", tempname, "-readwrite"], check=True, universal_newlines=True, stdout=PIPE).stdout
|
output = run(["hdiutil", "attach", tempname, "-readwrite"], check=True, universal_newlines=True, stdout=PIPE).stdout
|
||||||
|
|
||||||
m = re.search(r"/Volumes/(.+$)", output)
|
|
||||||
disk_root = m.group(0)
|
|
||||||
|
|
||||||
print("+ Applying fancy settings +")
|
|
||||||
|
|
||||||
bg_path = os.path.join(disk_root, ".background", os.path.basename('background.tiff'))
|
|
||||||
os.mkdir(os.path.dirname(bg_path))
|
|
||||||
if verbose:
|
|
||||||
print('background.tiff', "->", bg_path)
|
|
||||||
shutil.copy2('contrib/macdeploy/background.tiff', bg_path)
|
|
||||||
|
|
||||||
os.symlink("/Applications", os.path.join(disk_root, "Applications"))
|
|
||||||
|
|
||||||
print("+ Finalizing .dmg disk image +")
|
print("+ Finalizing .dmg disk image +")
|
||||||
|
|
||||||
run(["hdiutil", "detach", f"/Volumes/{appname}"], universal_newlines=True)
|
run(["hdiutil", "detach", f"/Volumes/{appname}"], universal_newlines=True)
|
||||||
|
@ -134,6 +134,9 @@ $(package)_config_opts_darwin += -no-feature-corewlan
|
|||||||
$(package)_config_opts_darwin += -no-freetype
|
$(package)_config_opts_darwin += -no-freetype
|
||||||
$(package)_config_opts_darwin += QMAKE_MACOSX_DEPLOYMENT_TARGET=$(OSX_MIN_VERSION)
|
$(package)_config_opts_darwin += QMAKE_MACOSX_DEPLOYMENT_TARGET=$(OSX_MIN_VERSION)
|
||||||
|
|
||||||
|
# Optimizing using > -O1 causes non-determinism when building across arches.
|
||||||
|
$(package)_config_opts_aarch64_darwin += "QMAKE_CFLAGS_OPTIMIZE_FULL = -O1"
|
||||||
|
|
||||||
ifneq ($(build_os),darwin)
|
ifneq ($(build_os),darwin)
|
||||||
$(package)_config_opts_darwin += -xplatform macx-clang-linux
|
$(package)_config_opts_darwin += -xplatform macx-clang-linux
|
||||||
$(package)_config_opts_darwin += -device-option MAC_SDK_PATH=$(OSX_SDK)
|
$(package)_config_opts_darwin += -device-option MAC_SDK_PATH=$(OSX_SDK)
|
||||||
|
@ -30,11 +30,12 @@ from test_framework.util import (
|
|||||||
class BackwardsCompatibilityTest(BitcoinTestFramework):
|
class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 6
|
self.num_nodes = 7
|
||||||
# Add new version after each release:
|
# Add new version after each release:
|
||||||
self.extra_args = [
|
self.extra_args = [
|
||||||
[], # Pre-release: use to mine blocks
|
[], # Pre-release: use to mine blocks
|
||||||
["-nowallet"], # Pre-release: use to receive coins, swap wallets, etc
|
["-nowallet"], # Pre-release: use to receive coins, swap wallets, etc
|
||||||
|
["-nowallet"], # v20.0.1
|
||||||
["-nowallet"], # v19.3.0
|
["-nowallet"], # v19.3.0
|
||||||
["-nowallet"], # v18.2.2
|
["-nowallet"], # v18.2.2
|
||||||
["-nowallet"], # v0.17.0.3
|
["-nowallet"], # v0.17.0.3
|
||||||
@ -51,6 +52,7 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
|||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
19030000,
|
19030000,
|
||||||
|
19030000,
|
||||||
18020200,
|
18020200,
|
||||||
170003,
|
170003,
|
||||||
160101,
|
160101,
|
||||||
@ -68,7 +70,8 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
|||||||
res = self.nodes[self.num_nodes - 1].getblockchaininfo()
|
res = self.nodes[self.num_nodes - 1].getblockchaininfo()
|
||||||
assert_equal(res['blocks'], 101)
|
assert_equal(res['blocks'], 101)
|
||||||
|
|
||||||
node_master = self.nodes[self.num_nodes - 5]
|
node_master = self.nodes[self.num_nodes - 6]
|
||||||
|
node_v20 = self.nodes[self.num_nodes - 5]
|
||||||
node_v19 = self.nodes[self.num_nodes - 4]
|
node_v19 = self.nodes[self.num_nodes - 4]
|
||||||
node_v18 = self.nodes[self.num_nodes - 3]
|
node_v18 = self.nodes[self.num_nodes - 3]
|
||||||
node_v17 = self.nodes[self.num_nodes - 2]
|
node_v17 = self.nodes[self.num_nodes - 2]
|
||||||
@ -117,6 +120,13 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
|||||||
assert info['private_keys_enabled'] == False
|
assert info['private_keys_enabled'] == False
|
||||||
assert info['keypoolsize'] == 0
|
assert info['keypoolsize'] == 0
|
||||||
|
|
||||||
|
# w1_v20: regular wallet, created with v20.0
|
||||||
|
node_v20.createwallet(wallet_name="w1_v20")
|
||||||
|
wallet = node_v20.get_wallet_rpc("w1_v20")
|
||||||
|
info = wallet.getwalletinfo()
|
||||||
|
assert info['private_keys_enabled']
|
||||||
|
assert info['keypoolsize'] > 0
|
||||||
|
|
||||||
# w2_v19: wallet with private keys disabled, created with v0.19
|
# w2_v19: wallet with private keys disabled, created with v0.19
|
||||||
node_v19.createwallet(wallet_name="w2_v19", disable_private_keys=True)
|
node_v19.createwallet(wallet_name="w2_v19", disable_private_keys=True)
|
||||||
wallet = node_v19.get_wallet_rpc("w2_v19")
|
wallet = node_v19.get_wallet_rpc("w2_v19")
|
||||||
@ -155,6 +165,7 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
# Copy the wallets to older nodes:
|
# Copy the wallets to older nodes:
|
||||||
node_master_wallets_dir = os.path.join(node_master.datadir, "regtest/wallets")
|
node_master_wallets_dir = os.path.join(node_master.datadir, "regtest/wallets")
|
||||||
|
node_v20_wallets_dir = os.path.join(node_v20.datadir, "regtest/wallets")
|
||||||
node_v19_wallets_dir = os.path.join(node_v19.datadir, "regtest/wallets")
|
node_v19_wallets_dir = os.path.join(node_v19.datadir, "regtest/wallets")
|
||||||
node_v18_wallets_dir = os.path.join(node_v18.datadir, "regtest/wallets")
|
node_v18_wallets_dir = os.path.join(node_v18.datadir, "regtest/wallets")
|
||||||
node_v17_wallets_dir = os.path.join(node_v17.datadir, "regtest/wallets")
|
node_v17_wallets_dir = os.path.join(node_v17.datadir, "regtest/wallets")
|
||||||
@ -199,6 +210,34 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
|||||||
os.path.join(node_v19_wallets_dir, wallet)
|
os.path.join(node_v19_wallets_dir, wallet)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Copy wallets to v0.20
|
||||||
|
for wallet in os.listdir(node_master_wallets_dir):
|
||||||
|
shutil.copytree(
|
||||||
|
os.path.join(node_master_wallets_dir, wallet),
|
||||||
|
os.path.join(node_v20_wallets_dir, wallet)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Open the wallets in v0.20
|
||||||
|
node_v20.loadwallet("w1")
|
||||||
|
wallet = node_v20.get_wallet_rpc("w1")
|
||||||
|
info = wallet.getwalletinfo()
|
||||||
|
assert info['private_keys_enabled']
|
||||||
|
assert info['keypoolsize'] > 0
|
||||||
|
txs = wallet.listtransactions()
|
||||||
|
assert_equal(len(txs), 1)
|
||||||
|
|
||||||
|
node_v20.loadwallet("w2")
|
||||||
|
wallet = node_v20.get_wallet_rpc("w2")
|
||||||
|
info = wallet.getwalletinfo()
|
||||||
|
assert info['private_keys_enabled'] == False
|
||||||
|
assert info['keypoolsize'] == 0
|
||||||
|
|
||||||
|
node_v20.loadwallet("w3")
|
||||||
|
wallet = node_v20.get_wallet_rpc("w3")
|
||||||
|
info = wallet.getwalletinfo()
|
||||||
|
assert info['private_keys_enabled']
|
||||||
|
assert info['keypoolsize'] == 0
|
||||||
|
|
||||||
# Open the wallets in v0.19
|
# Open the wallets in v0.19
|
||||||
node_v19.loadwallet("w1")
|
node_v19.loadwallet("w1")
|
||||||
wallet = node_v19.get_wallet_rpc("w1")
|
wallet = node_v19.get_wallet_rpc("w1")
|
||||||
@ -277,15 +316,15 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
|||||||
# assert_raises_rpc_error(-4, "Wallet loading failed.", node_v17.loadwallet, 'w3_v18')
|
# assert_raises_rpc_error(-4, "Wallet loading failed.", node_v17.loadwallet, 'w3_v18')
|
||||||
|
|
||||||
# Instead, we stop node and try to launch it with the wallet:
|
# Instead, we stop node and try to launch it with the wallet:
|
||||||
self.stop_node(4)
|
self.stop_node(5)
|
||||||
# it expected to fail with error 'DBErrors::TOO_NEW' but Dash Core can open v18 by version 17
|
# it expected to fail with error 'DBErrors::TOO_NEW' but Dash Core can open v18 by version 17
|
||||||
# can be implemented in future if there's any incompatible versions
|
# can be implemented in future if there's any incompatible versions
|
||||||
#node_v17.assert_start_raises_init_error(["-wallet=w3_v18"], "Error: Error loading w3_v18: Wallet requires newer version of Dash Core")
|
#node_v17.assert_start_raises_init_error(["-wallet=w3_v18"], "Error: Error loading w3_v18: Wallet requires newer version of Dash Core")
|
||||||
#node_v17.assert_start_raises_init_error(["-wallet=w3"], "Error: Error loading w3: Wallet requires newer version of Dash Core")
|
#node_v17.assert_start_raises_init_error(["-wallet=w3"], "Error: Error loading w3: Wallet requires newer version of Dash Core")
|
||||||
self.start_node(4)
|
self.start_node(5)
|
||||||
|
|
||||||
# Open most recent wallet in v0.16 (no loadwallet RPC)
|
# Open most recent wallet in v0.16 (no loadwallet RPC)
|
||||||
self.restart_node(5, extra_args=["-wallet=w2"])
|
self.restart_node(6, extra_args=["-wallet=w2"])
|
||||||
wallet = node_v16.get_wallet_rpc("w2")
|
wallet = node_v16.get_wallet_rpc("w2")
|
||||||
info = wallet.getwalletinfo()
|
info = wallet.getwalletinfo()
|
||||||
assert info['keypoolsize'] == 1
|
assert info['keypoolsize'] == 1
|
||||||
|
@ -21,6 +21,18 @@ import hashlib
|
|||||||
|
|
||||||
|
|
||||||
SHA256_SUMS = {
|
SHA256_SUMS = {
|
||||||
|
"d1f7121a7d7bdd4077709284076860389d6a0f4481a934ad9acb85cae3d7b83e": "dashcore-20.0.1-aarch64-linux-gnu.tar.gz",
|
||||||
|
"37375229e5ab18d7050b729fb016df24acdd72d60bc3fa074270d89030a27827": "dashcore-20.0.1-arm-linux-gnueabihf.tar.gz",
|
||||||
|
"ab530f72d2bfbfcd7fca0644e3ea5c5b279e2204fe50ff7bd9cc452a0d413c65": "dashcore-20.0.1-arm64-apple-darwin.dmg",
|
||||||
|
"8f4b55e4a3d6bb38a0c1f51ece14f387fd4dcffa000aeecfbbd1f751da8b4446": "dashcore-20.0.1-arm64-apple-darwin.tar.gz",
|
||||||
|
"1d9cdb00d93e8babe9f54d0ecb04c55f2cd6fd6cfaa85466aa7f95a6976d040d": "dashcore-20.0.1-riscv64-linux-gnu.tar.gz",
|
||||||
|
"f722954c38d5b18f8290e41ca9dd833929258dcf68c9396cbbc81d241285947b": "dashcore-20.0.1-win64-setup.exe",
|
||||||
|
"bb6d59a3eadac316e86e073a9f7ca4d28f3a2e8a59b7109d509a7368675a6f5f": "dashcore-20.0.1-win64.zip",
|
||||||
|
"5373a84f49e4f76bd04987806f5fcde0b537fa1408e1f98370680f3f5134970f": "dashcore-20.0.1-x86_64-apple-darwin.dmg",
|
||||||
|
"0c9344961ae5800f54ffc90af63826cdbf61acc5c442f3fab6527d528f2d9323": "dashcore-20.0.1-x86_64-apple-darwin.tar.gz",
|
||||||
|
"7c82bdbd1c2de515d6c7245886d8c0b0044a4a9b6f74166b8d58c82cd4ae3270": "dashcore-20.0.1-x86_64-linux-gnu.tar.gz",
|
||||||
|
"bb898a8e4c54fd5989f114673e1fee5116bf6ffa257c63397993035c390de806": "dashcore-20.0.1.tar.gz",
|
||||||
|
#
|
||||||
"a4b555b47f5f9a5a01fc5d3b543731088bd10a65dd7fa81fb552818146e424b5": "dashcore-19.3.0-aarch64-linux-gnu.tar.gz",
|
"a4b555b47f5f9a5a01fc5d3b543731088bd10a65dd7fa81fb552818146e424b5": "dashcore-19.3.0-aarch64-linux-gnu.tar.gz",
|
||||||
"531bb188c1aea808ef6f3533d71182a51958136f6e43d9fcadaef1a5fcdd0468": "dashcore-19.3.0-osx.dmg",
|
"531bb188c1aea808ef6f3533d71182a51958136f6e43d9fcadaef1a5fcdd0468": "dashcore-19.3.0-osx.dmg",
|
||||||
"1b4673a2bd71f9f2b593c2d71386e60f4744b59b57142707f0045ed49c92024b": "dashcore-19.3.0-osx64.tar.gz",
|
"1b4673a2bd71f9f2b593c2d71386e60f4744b59b57142707f0045ed49c92024b": "dashcore-19.3.0-osx64.tar.gz",
|
||||||
@ -105,8 +117,11 @@ def download_binary(tag, args) -> int:
|
|||||||
if match:
|
if match:
|
||||||
bin_path = 'releases/download/test.{}'.format(
|
bin_path = 'releases/download/test.{}'.format(
|
||||||
match.group(1), match.group(2))
|
match.group(1), match.group(2))
|
||||||
|
platform = args.platform
|
||||||
|
if tag < "v20" and platform in ["x86_64-apple-darwin", "aarch64-apple-darwin"]:
|
||||||
|
platform = "osx64"
|
||||||
tarball = 'dashcore-{tag}-{platform}.tar.gz'.format(
|
tarball = 'dashcore-{tag}-{platform}.tar.gz'.format(
|
||||||
tag=tag[1:], platform=args.platform)
|
tag=tag[1:], platform=platform)
|
||||||
tarballUrl = 'https://github.com/dashpay/dash/{bin_path}/{tarball}'.format(
|
tarballUrl = 'https://github.com/dashpay/dash/{bin_path}/{tarball}'.format(
|
||||||
bin_path=bin_path, tarball=tarball)
|
bin_path=bin_path, tarball=tarball)
|
||||||
|
|
||||||
@ -147,10 +162,39 @@ def download_binary(tag, args) -> int:
|
|||||||
ret = subprocess.run(['tar', '-zxf', tarball, '-C', tag,
|
ret = subprocess.run(['tar', '-zxf', tarball, '-C', tag,
|
||||||
'--strip-components=1',
|
'--strip-components=1',
|
||||||
'dashcore-{tag}'.format(tag=filename, platform=args.platform)]).returncode
|
'dashcore-{tag}'.format(tag=filename, platform=args.platform)]).returncode
|
||||||
if ret:
|
if ret != 0:
|
||||||
|
print(f"Failed to extract the {tag} tarball")
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
Path(tarball).unlink()
|
Path(tarball).unlink()
|
||||||
|
|
||||||
|
if tag >= "v19" and platform == "arm64-apple-darwin":
|
||||||
|
# Starting with v23 there are arm64 binaries for ARM (e.g. M1, M2) macs, but they have to be signed to run
|
||||||
|
binary_path = f'{os.getcwd()}/{tag}/bin/'
|
||||||
|
|
||||||
|
for arm_binary in os.listdir(binary_path):
|
||||||
|
# Is it already signed?
|
||||||
|
ret = subprocess.run(
|
||||||
|
['codesign', '-v', binary_path + arm_binary],
|
||||||
|
stderr=subprocess.DEVNULL, # Suppress expected stderr output
|
||||||
|
).returncode
|
||||||
|
if ret == 1:
|
||||||
|
# Have to self-sign the binary
|
||||||
|
ret = subprocess.run(
|
||||||
|
['codesign', '-s', '-', binary_path + arm_binary]
|
||||||
|
).returncode
|
||||||
|
if ret != 0:
|
||||||
|
print(f"Failed to self-sign {tag} {arm_binary} arm64 binary")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
# Confirm success
|
||||||
|
ret = subprocess.run(
|
||||||
|
['codesign', '-v', binary_path + arm_binary]
|
||||||
|
).returncode
|
||||||
|
if ret != 0:
|
||||||
|
print(f"Failed to verify the self-signed {tag} {arm_binary} arm64 binary")
|
||||||
|
return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
@ -212,8 +256,8 @@ def check_host(args) -> int:
|
|||||||
platforms = {
|
platforms = {
|
||||||
'aarch64-*-linux*': 'aarch64-linux-gnu',
|
'aarch64-*-linux*': 'aarch64-linux-gnu',
|
||||||
'x86_64-*-linux*': 'x86_64-linux-gnu',
|
'x86_64-*-linux*': 'x86_64-linux-gnu',
|
||||||
'x86_64-apple-darwin*': 'osx64',
|
'x86_64-apple-darwin*': 'x86_64-apple-darwin',
|
||||||
'aarch64-apple-darwin*': 'osx64',
|
'aarch64-apple-darwin*': 'aarch64-apple-darwin',
|
||||||
}
|
}
|
||||||
args.platform = ''
|
args.platform = ''
|
||||||
for pattern, target in platforms.items():
|
for pattern, target in platforms.items():
|
||||||
|
Loading…
Reference in New Issue
Block a user