diff --git a/.github/qt_helper.py b/.github/qt_helper.py deleted file mode 100644 index 309b3974..00000000 --- a/.github/qt_helper.py +++ /dev/null @@ -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() diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index deb82b41..90fe0c66 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,8 @@ on: [push, pull_request] env: FREE_DISKSPACE: | 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: build-macos: @@ -66,25 +68,35 @@ jobs: run: build/release/bin/monero-wallet-gui --test-qml macos-bundle: - runs-on: macos-13 + runs-on: macos-15 steps: - uses: actions/checkout@v1 with: submodules: recursive - 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 - - name: install dependencies + run: HOMEBREW_NO_AUTO_UPDATE=1 brew install boost hidapi openssl zmq libpgm miniupnpc expat libunwind-headers protobuf pkg-config + - 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: | - pyenv install 3.12.0 - pip install defusedxml - - name: download qt - run: python monero-gui/.github/qt_helper.py mac_x64 desktop 5.15.2 clang_64 c384008156fe63cc183bade0316828c598ff3e5074397c0c9ccc588d6cdc5aca - working-directory: ../ - - name: build + cd qt5 + mkdir build && cd build + ../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 + make -j"$(sysctl -n hw.ncpu)" + make install + 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: | 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 .. - make + cmake -D CMAKE_BUILD_TYPE=Release -D ARCH=default -D CMAKE_PREFIX_PATH="${QT_PREFIX}" .. + make -j"$(sysctl -n hw.ncpu)" - name: deploy run: make deploy working-directory: build