mirror of
https://github.com/monero-project/monero-gui.git
synced 2026-04-02 14:07:26 -04:00
workflows: fix macOS bundle
This commit is contained in:
107
.github/qt_helper.py
vendored
107
.github/qt_helper.py
vendored
@@ -1,107 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import defusedxml.ElementTree
|
|
||||||
import hashlib
|
|
||||||
import mmap
|
|
||||||
import pathlib
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import urllib.parse
|
|
||||||
import urllib.request
|
|
||||||
import xml.etree.ElementTree as ET
|
|
||||||
|
|
||||||
MAX_TRIES = 32
|
|
||||||
|
|
||||||
def fetch_links_to_archives(os, target, major, minor, patch, toolchain):
|
|
||||||
MAX_XML_SIZE = 1024 * 1024 * 1024
|
|
||||||
MIRROR = 'download.qt.io'
|
|
||||||
base_url = f'https://{MIRROR}/online/qtsdkrepository/{os}/{target}/qt{major}_{major}{minor}{patch}'
|
|
||||||
url = f'{base_url}/Updates.xml'
|
|
||||||
for _ in range(MAX_TRIES):
|
|
||||||
try:
|
|
||||||
resp = urllib.request.urlopen(url).read(MAX_XML_SIZE)
|
|
||||||
update_xml = defusedxml.ElementTree.fromstring(resp)
|
|
||||||
break
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
raise
|
|
||||||
except BaseException as e:
|
|
||||||
print('error', e, flush=True)
|
|
||||||
else:
|
|
||||||
return
|
|
||||||
for pkg in update_xml.findall('./PackageUpdate'):
|
|
||||||
name = pkg.find('.//Name')
|
|
||||||
if name == None:
|
|
||||||
continue
|
|
||||||
if name.text != f'qt.qt{major}.{major}{minor}{patch}.{toolchain}':
|
|
||||||
continue
|
|
||||||
version = pkg.find('.//Version')
|
|
||||||
if version == None:
|
|
||||||
continue
|
|
||||||
archives = pkg.find('.//DownloadableArchives')
|
|
||||||
if archives == None or archives.text == None:
|
|
||||||
continue
|
|
||||||
for archive in archives.text.split(', '):
|
|
||||||
url = f'{base_url}/{name.text}/{version.text}{archive}'
|
|
||||||
file_name = pathlib.Path(urllib.parse.urlparse(url).path).name
|
|
||||||
yield {'name': file_name, 'url': url}
|
|
||||||
|
|
||||||
def download(links):
|
|
||||||
metalink = ET.Element('metalink', xmlns = "urn:ietf:params:xml:ns:metalink")
|
|
||||||
for link in links:
|
|
||||||
file = ET.SubElement(metalink, 'file', name = link['name'])
|
|
||||||
ET.SubElement(file, 'url').text = link['url']
|
|
||||||
data = ET.tostring(metalink, encoding='UTF-8', xml_declaration=True)
|
|
||||||
for _ in range(MAX_TRIES):
|
|
||||||
with subprocess.Popen([
|
|
||||||
'aria2c',
|
|
||||||
'--connect-timeout=8',
|
|
||||||
'--console-log-level=warn',
|
|
||||||
'--continue',
|
|
||||||
'--follow-metalink=mem',
|
|
||||||
'--max-concurrent-downloads=100',
|
|
||||||
'--max-connection-per-server=16',
|
|
||||||
'--max-file-not-found=100',
|
|
||||||
'--max-tries=100',
|
|
||||||
'--min-split-size=1MB',
|
|
||||||
'--retry-wait=1',
|
|
||||||
'--split=100',
|
|
||||||
'--summary-interval=0',
|
|
||||||
'--timeout=8',
|
|
||||||
'--user-agent=',
|
|
||||||
'--metalink-file=-',
|
|
||||||
], stdin=subprocess.PIPE) as aria:
|
|
||||||
aria.communicate(data)
|
|
||||||
if aria.wait() == 0:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def calc_hash_sum(files):
|
|
||||||
obj = hashlib.new('sha256')
|
|
||||||
for path in files:
|
|
||||||
with open(path, 'rb') as f:
|
|
||||||
with mmap.mmap(f.fileno(), 0, mmap.MAP_SHARED, mmap.PROT_READ) as m:
|
|
||||||
file_hash = hashlib.new('sha256', m).digest()
|
|
||||||
obj.update(file_hash)
|
|
||||||
return obj.digest().hex()
|
|
||||||
|
|
||||||
def extract_archives(files, out='.', targets=[]):
|
|
||||||
for path in files:
|
|
||||||
if subprocess.Popen(['7z', 'x', '-bd', '-y', '-aoa', f'-o{out}', path] + targets,
|
|
||||||
stdout=subprocess.DEVNULL,
|
|
||||||
).wait() != 0:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def main():
|
|
||||||
os, target, version, toolchain, expect = sys.argv[1:]
|
|
||||||
major, minor, patch = version.split('.')
|
|
||||||
links = [*fetch_links_to_archives(os, target, major, minor, patch, toolchain)]
|
|
||||||
print(*[l['url'].encode() for l in links], sep='\n', flush=True)
|
|
||||||
assert download(links)
|
|
||||||
result = calc_hash_sum([l['name'] for l in links])
|
|
||||||
print('result', result, 'expect', expect, flush=True)
|
|
||||||
assert result == expect
|
|
||||||
assert extract_archives([l['name'] for l in links], '.', ['{}.{}.{}'.format(major, minor, patch)])
|
|
||||||
[pathlib.Path(l['name']).unlink() for l in links]
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
34
.github/workflows/build.yml
vendored
34
.github/workflows/build.yml
vendored
@@ -5,6 +5,8 @@ on: [push, pull_request]
|
|||||||
env:
|
env:
|
||||||
FREE_DISKSPACE: |
|
FREE_DISKSPACE: |
|
||||||
sudo rm -rf /usr/local/.ghcup /usr/share/dotnet /usr/share/swift /usr/share/miniconda
|
sudo rm -rf /usr/local/.ghcup /usr/share/dotnet /usr/share/swift /usr/share/miniconda
|
||||||
|
QT_TAG: v5.15.17-lts-lgpl
|
||||||
|
QT_PREFIX: ${{ github.workspace }}/qt-install
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-macos:
|
build-macos:
|
||||||
@@ -66,25 +68,35 @@ jobs:
|
|||||||
run: build/release/bin/monero-wallet-gui --test-qml
|
run: build/release/bin/monero-wallet-gui --test-qml
|
||||||
|
|
||||||
macos-bundle:
|
macos-bundle:
|
||||||
runs-on: macos-13
|
runs-on: macos-15
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
- name: install dependencies
|
- name: install dependencies
|
||||||
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc expat libunwind-headers protobuf pkg-config pyenv p7zip aria2
|
run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc expat libunwind-headers protobuf pkg-config
|
||||||
- name: install dependencies
|
- name: clone qt repo
|
||||||
|
run: git clone -b "${QT_TAG}" --recursive --depth 1 --shallow-submodules https://github.com/qt/qt5
|
||||||
|
- name: build qt from source
|
||||||
run: |
|
run: |
|
||||||
pyenv install 3.12.0
|
cd qt5
|
||||||
pip install defusedxml
|
mkdir build && cd build
|
||||||
- name: download qt
|
../configure -prefix "${QT_PREFIX}" -opensource -confirm-license -release -nomake examples -nomake tests -no-rpath -skip qtwebengine -skip qt3d -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtnetworkauth -skip qtpurchasing -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qttools -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip gamepad -skip serialbus -skip location -skip webengine
|
||||||
run: python monero-gui/.github/qt_helper.py mac_x64 desktop 5.15.2 clang_64 c384008156fe63cc183bade0316828c598ff3e5074397c0c9ccc588d6cdc5aca
|
make -j"$(sysctl -n hw.ncpu)"
|
||||||
working-directory: ../
|
make install
|
||||||
- name: build
|
cd ../qttools/src/linguist/lrelease
|
||||||
|
../../../../build/qtbase/bin/qmake
|
||||||
|
make -j"$(sysctl -n hw.ncpu)"
|
||||||
|
make install
|
||||||
|
cd ../../../../qttools/src/macdeployqt/macdeployqt/
|
||||||
|
../../../../build/qtbase/bin/qmake
|
||||||
|
make -j"$(sysctl -n hw.ncpu)"
|
||||||
|
make install
|
||||||
|
- name: build monero-gui
|
||||||
run: |
|
run: |
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default -D CMAKE_PREFIX_PATH=/Users/runner/work/monero-gui/5.15.2/clang_64 ..
|
cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default -D CMAKE_PREFIX_PATH="${QT_PREFIX}" ..
|
||||||
make
|
make -j"$(sysctl -n hw.ncpu)"
|
||||||
- name: deploy
|
- name: deploy
|
||||||
run: make deploy
|
run: make deploy
|
||||||
working-directory: build
|
working-directory: build
|
||||||
|
|||||||
Reference in New Issue
Block a user