diff --git a/.github/workflows/ci-master.yml b/.github/workflows/ci-master.yml index 381826e95e..78cbd75067 100644 --- a/.github/workflows/ci-master.yml +++ b/.github/workflows/ci-master.yml @@ -52,11 +52,6 @@ jobs: python-version: '3.8' - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Install Required Packages run: | sudo apt-get update @@ -66,14 +61,27 @@ jobs: python3 -m pip install --upgrade pip python3 -m pip install pyzmq - name: Download Dependencies - run: make -C depends download + run: | + attempt=1 + max=5 + until make -C depends download; do + if [ "$attempt" -ge "$max" ]; then + echo "make -C depends download failed after $attempt attempts" + exit 1 + fi + echo "make -C depends download attempt $attempt failed; retrying in $((attempt*5))s..." + sleep $((attempt*5)) + attempt=$((attempt+1)) + done - name: Build Dependencies run: make -C depends -j$(nproc) - name: Build Firo run: | - mkdir build export HOST_TRIPLET=$(depends/config.guess) - cmake -DCMAKE_TOOLCHAIN_FILE=$(realpath depends/$HOST_TRIPLET/toolchain.cmake) -DBUILD_CLI=ON -DBUILD_TESTS=ON -DBUILD_GUI=ON -DCMAKE_BUILD_TYPE=Release -DCLIENT_VERSION_IS_RELEASE=true -S$(realpath .) -B$(realpath build) + env PKG_CONFIG_PATH="$(realpath depends/$HOST_TRIPLET/lib/pkgconfig):$PKG_CONFIG_PATH" \ + cmake -DCMAKE_TOOLCHAIN_FILE=$(realpath depends/$HOST_TRIPLET/toolchain.cmake) \ + -DBUILD_CLI=ON -DBUILD_TESTS=ON -DBUILD_GUI=ON -DCMAKE_BUILD_TYPE=Release \ + -DCLIENT_VERSION_IS_RELEASE=true -S$(realpath .) -B$(realpath build) cd build && make -j$(nproc) - name: Run Unit Tests run: | @@ -114,38 +122,47 @@ jobs: with: name: test-linux-cmake-logs-${{ env.COMMIT_HASH }} path: ${{ env.TEST_LOG_ARTIFACT_DIR }} + build-windows-cmake: needs: get-commit-hash name: build-windows-cmake - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest env: ARTIFACT_DIR: windows-cmake-binaries COMMIT_HASH: ${{ needs.get-commit-hash.outputs.short_sha }} steps: - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Install Required Packages run: | sudo apt-get update - sudo apt-get install -y g++-mingw-w64-x86-64 gcc-mingw-w64-x86-64 cmake + sudo apt-get install -y g++-mingw-w64-x86-64 gcc-mingw-w64-x86-64 binutils-mingw-w64-x86-64 cmake mingw-w64-common mingw-w64-i686-dev mingw-w64-x86-64-dev wget unzip - name: Switch MinGW GCC and G++ to POSIX Threading run: | sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix - name: Download Dependencies - run: make -C depends download + run: | + attempt=1 + max=5 + until make -C depends download; do + if [ "$attempt" -ge "$max" ]; then + echo "make -C depends download failed after $attempt attempts" + exit 1 + fi + echo "make -C depends download attempt $attempt failed; retrying in $((attempt*5))s..." + sleep $((attempt*5)) + attempt=$((attempt+1)) + done - name: Build Dependencies run: make -C depends -j$(nproc) HOST=x86_64-w64-mingw32 - name: Build Firo run: | - mkdir build export HOST_TRIPLET=$(x86_64-w64-mingw32-gcc -dumpmachine) - cmake -DCMAKE_TOOLCHAIN_FILE=$(realpath depends/$HOST_TRIPLET/toolchain.cmake) -DBUILD_CLI=ON -DBUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_GUI=ON -DCLIENT_VERSION_IS_RELEASE=true -S$(realpath .) -B$(realpath build) + env PKG_CONFIG_PATH="$(realpath depends/$HOST_TRIPLET/lib/pkgconfig):$PKG_CONFIG_PATH" \ + cmake -DCMAKE_TOOLCHAIN_FILE=$(realpath depends/$HOST_TRIPLET/toolchain.cmake) \ + -DBUILD_CLI=ON -DBUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release \ + -DCLIENT_VERSION_IS_RELEASE=true -DBUILD_GUI=ON -S$(realpath .) -B$(realpath build) cd build && make -j$(nproc) - name: Prepare Files for Artifact run: | @@ -167,11 +184,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Use Xcode instead of Command Line Tools run: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer - name: Set NJOBS variable @@ -189,15 +201,28 @@ jobs: - name: Install setuptools run: sudo -H pip install setuptools - name: Download Dependencies - run: make -C depends download + run: | + attempt=1 + max=5 + until make -C depends download; do + if [ "$attempt" -ge "$max" ]; then + echo "make -C depends download failed after $attempt attempts" + exit 1 + fi + echo "make -C depends download attempt $attempt failed; retrying in $((attempt*5))s..." + sleep $((attempt*5)) + attempt=$((attempt+1)) + done - name: Build Dependencies run: | make -C depends -j$NJOBS - name: Build Firo run: | - mkdir build export HOST_TRIPLET=$(depends/config.guess) - cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/depends/$HOST_TRIPLET/toolchain.cmake -DBUILD_CLI=ON -DBUILD_TESTS=OFF -DBUILD_GUI=ON -DCMAKE_BUILD_TYPE=Release -DCLIENT_VERSION_IS_RELEASE=true -S$(pwd) -B$(pwd)/build + env PKG_CONFIG_PATH="$(pwd)/depends/$HOST_TRIPLET/lib/pkgconfig:$PKG_CONFIG_PATH" \ + cmake -DCMAKE_TOOLCHAIN_FILE=$(pwd)/depends/$HOST_TRIPLET/toolchain.cmake \ + -DBUILD_CLI=ON -DBUILD_TESTS=OFF -DBUILD_GUI=ON -DCMAKE_BUILD_TYPE=Release \ + -DCLIENT_VERSION_IS_RELEASE=true -S$(pwd) -B$(pwd)/build cd build && make -j$NJOBS - name: Prepare Files for Artifact run: | @@ -208,6 +233,7 @@ jobs: with: name: mac-cmake-binaries-${{ env.COMMIT_HASH }} path: ${{ env.ARTIFACT_DIR }} + build-guix-x86_64-linux-gnu: needs: get-commit-hash name: build-guix-x86_64-linux-gnu @@ -220,11 +246,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Set up Python 3.8 uses: actions/setup-python@v4 with: @@ -232,24 +253,6 @@ jobs: - name: Free Disk Space run: | sudo apt-get clean - sudo apt-get purge nginx nginx-common nginx-core nginx-full nginx-light nginx-extras -y -f - sudo apt-get purge aria2 ansible azure-cli shellcheck rpm xorriso zsync -y -f - sudo apt-get purge firefox gfortran-9 google-chrome-stable -y -f - sudo apt-get purge google-cloud-sdk imagemagick -y -f - sudo apt-get purge libmagickcore-dev libmagickwand-dev libmagic-dev ant ant-optional kubectl -y -f - sudo apt-get purge mercurial apt-transport-https mono-complete -y -f - sudo apt-get purge unixodbc-dev libssl-dev -y -f - sudo apt-get purge libfreetype6-dev libfontconfig1-dev -y -f - sudo apt-get purge snmp pollinate libpq-dev postgresql-client powershell ruby-full -y -f - sudo apt-get purge sphinxsearch subversion azure-cli microsoft-edge-stable -y -f - sudo apt-get purge google-cloud-sdk -f -y - sudo apt-get purge microsoft-edge-stable -f -y || true - sudo apt purge microsoft-edge-stable -f -y || true - sudo apt-get purge "^mysql" -f -y || true - sudo apt-get purge "^php" -f -y || true - sudo apt-get purge "^dotnet" -f -y || true - sudo apt-get autoremove -y - sudo apt-get autoclean -y sudo rm -rf /var/lib/apt/lists/* sudo rm -rf /var/tmp/* sudo rm -rf /tmp/* @@ -259,11 +262,6 @@ jobs: sudo rm -rf /usr/share/dotnet sudo rm -rf /usr/local/lib/android sudo rm -rf /opt/ghc - sudo rm -rf \ - /usr/share/dotnet /usr/local/lib/android /opt/ghc \ - /usr/local/share/powershell /usr/share/swift /usr/local/.ghcup \ - /usr/lib/jvm || true - echo "some directories deleted" echo "Disk space now: $(df -h / | tail -1 | awk '{print $4}')" - name: Install Guix run: | @@ -325,11 +323,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Set up Python 3.8 uses: actions/setup-python@v4 with: @@ -337,24 +330,6 @@ jobs: - name: Free Disk Space run: | sudo apt-get clean - sudo apt-get purge nginx nginx-common nginx-core nginx-full nginx-light nginx-extras -y -f - sudo apt-get purge aria2 ansible azure-cli shellcheck rpm xorriso zsync -y -f - sudo apt-get purge firefox gfortran-9 google-chrome-stable -y -f - sudo apt-get purge google-cloud-sdk imagemagick -y -f - sudo apt-get purge libmagickcore-dev libmagickwand-dev libmagic-dev ant ant-optional kubectl -y -f - sudo apt-get purge mercurial apt-transport-https mono-complete -y -f - sudo apt-get purge unixodbc-dev libssl-dev -y -f - sudo apt-get purge libfreetype6-dev libfontconfig1-dev -y -f - sudo apt-get purge snmp pollinate libpq-dev postgresql-client powershell ruby-full -y -f - sudo apt-get purge sphinxsearch subversion azure-cli microsoft-edge-stable -y -f - sudo apt-get purge google-cloud-sdk -f -y - sudo apt-get purge microsoft-edge-stable -f -y || true - sudo apt purge microsoft-edge-stable -f -y || true - sudo apt-get purge "^mysql" -f -y || true - sudo apt-get purge "^php" -f -y || true - sudo apt-get purge "^dotnet" -f -y || true - sudo apt-get autoremove -y - sudo apt-get autoclean -y sudo rm -rf /var/lib/apt/lists/* sudo rm -rf /var/tmp/* sudo rm -rf /tmp/* @@ -364,11 +339,6 @@ jobs: sudo rm -rf /usr/share/dotnet sudo rm -rf /usr/local/lib/android sudo rm -rf /opt/ghc - sudo rm -rf \ - /usr/share/dotnet /usr/local/lib/android /opt/ghc \ - /usr/local/share/powershell /usr/share/swift /usr/local/.ghcup \ - /usr/lib/jvm || true - echo "some directories deleted" echo "Disk space now: $(df -h / | tail -1 | awk '{print $4}')" - name: Install Guix run: | @@ -429,11 +399,6 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Set up Python 3.8 uses: actions/setup-python@v4 with: @@ -441,24 +406,6 @@ jobs: - name: Free Disk Space run: | sudo apt-get clean - sudo apt-get purge nginx nginx-common nginx-core nginx-full nginx-light nginx-extras -y -f - sudo apt-get purge aria2 ansible azure-cli shellcheck rpm xorriso zsync -y -f - sudo apt-get purge firefox gfortran-9 google-chrome-stable -y -f - sudo apt-get purge google-cloud-sdk imagemagick -y -f - sudo apt-get purge libmagickcore-dev libmagickwand-dev libmagic-dev ant ant-optional kubectl -y -f - sudo apt-get purge mercurial apt-transport-https mono-complete -y -f - sudo apt-get purge unixodbc-dev libssl-dev -y -f - sudo apt-get purge libfreetype6-dev libfontconfig1-dev -y -f - sudo apt-get purge snmp pollinate libpq-dev postgresql-client powershell ruby-full -y -f - sudo apt-get purge sphinxsearch subversion azure-cli microsoft-edge-stable -y -f - sudo apt-get purge google-cloud-sdk -f -y - sudo apt-get purge microsoft-edge-stable -f -y || true - sudo apt purge microsoft-edge-stable -f -y || true - sudo apt-get purge "^mysql" -f -y || true - sudo apt-get purge "^php" -f -y || true - sudo apt-get purge "^dotnet" -f -y || true - sudo apt-get autoremove -y - sudo apt-get autoclean -y sudo rm -rf /var/lib/apt/lists/* sudo rm -rf /var/tmp/* sudo rm -rf /tmp/* @@ -468,11 +415,6 @@ jobs: sudo rm -rf /usr/share/dotnet sudo rm -rf /usr/local/lib/android sudo rm -rf /opt/ghc - sudo rm -rf \ - /usr/share/dotnet /usr/local/lib/android /opt/ghc \ - /usr/local/share/powershell /usr/share/swift /usr/local/.ghcup \ - /usr/lib/jvm || true - echo "some directories deleted" echo "Disk space now: $(df -h / | tail -1 | awk '{print $4}')" - name: Install Guix run: | @@ -537,14 +479,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Download macOS SDK run: | - wget https://raw.githubusercontent.com/hebasto/artefacts/refs/heads/Xcode/Xcode/Xcode-15.0/Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz + wget https://bitcoincore.org/depends-sources/sdks/Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz - name: Verify macOS SDK SHA256 run: | echo "c0c2e7bb92c1fee0c4e9f3a485e4530786732d6c6dd9e9f418c282aa6892f55d Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz" | sha256sum -c - @@ -559,24 +496,6 @@ jobs: - name: Free Disk Space run: | sudo apt-get clean - sudo apt-get purge nginx nginx-common nginx-core nginx-full nginx-light nginx-extras -y -f - sudo apt-get purge aria2 ansible azure-cli shellcheck rpm xorriso zsync -y -f - sudo apt-get purge firefox gfortran-9 google-chrome-stable -y -f - sudo apt-get purge google-cloud-sdk imagemagick -y -f - sudo apt-get purge libmagickcore-dev libmagickwand-dev libmagic-dev ant ant-optional kubectl -y -f - sudo apt-get purge mercurial apt-transport-https mono-complete -y -f - sudo apt-get purge unixodbc-dev libssl-dev -y -f - sudo apt-get purge libfreetype6-dev libfontconfig1-dev -y -f - sudo apt-get purge snmp pollinate libpq-dev postgresql-client powershell ruby-full -y -f - sudo apt-get purge sphinxsearch subversion azure-cli microsoft-edge-stable -y -f - sudo apt-get purge google-cloud-sdk -f -y - sudo apt-get purge microsoft-edge-stable -f -y || true - sudo apt purge microsoft-edge-stable -f -y || true - sudo apt-get purge "^mysql" -f -y || true - sudo apt-get purge "^php" -f -y || true - sudo apt-get purge "^dotnet" -f -y || true - sudo apt-get autoremove -y - sudo apt-get autoclean -y sudo rm -rf /var/lib/apt/lists/* sudo rm -rf /var/tmp/* sudo rm -rf /tmp/* @@ -586,11 +505,6 @@ jobs: sudo rm -rf /usr/share/dotnet sudo rm -rf /usr/local/lib/android sudo rm -rf /opt/ghc - sudo rm -rf \ - /usr/share/dotnet /usr/local/lib/android /opt/ghc \ - /usr/local/share/powershell /usr/share/swift /usr/local/.ghcup \ - /usr/lib/jvm || true - echo "some directories deleted" echo "Disk space now: $(df -h / | tail -1 | awk '{print $4}')" - name: Install Guix run: | @@ -598,7 +512,18 @@ jobs: sudo apt-get install -y guix guix pull --url=https://codeberg.org/guix/guix-mirror --substitute-urls="http://git.savannah.gnu.org/git/guix.git http://hydra-guix-129.guix.gnu.org http://ci.guix.gnu.org" - name: Download Dependencies - run: make -C depends download + run: | + attempt=1 + max=5 + until make -C depends download; do + if [ "$attempt" -ge "$max" ]; then + echo "make -C depends download failed after $attempt attempts" + exit 1 + fi + echo "make -C depends download attempt $attempt failed; retrying in $((attempt*5))s..." + sleep $((attempt*5)) + attempt=$((attempt+1)) + done - name: Run Guix Build run: | CORES=$(nproc) @@ -658,14 +583,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name }} - ref: ${{ github.event.pull_request.head.sha }} - fetch-depth: 1 - fetch-tags: true - name: Download macOS SDK run: | - wget https://raw.githubusercontent.com/hebasto/artefacts/refs/heads/Xcode/Xcode/Xcode-15.0/Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz + wget https://bitcoincore.org/depends-sources/sdks/Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz - name: Verify macOS SDK SHA256 run: | echo "c0c2e7bb92c1fee0c4e9f3a485e4530786732d6c6dd9e9f418c282aa6892f55d Xcode-15.0-15A240d-extracted-SDK-with-libcxx-headers.tar.gz" | sha256sum -c - @@ -680,24 +600,6 @@ jobs: - name: Free Disk Space run: | sudo apt-get clean - sudo apt-get purge nginx nginx-common nginx-core nginx-full nginx-light nginx-extras -y -f - sudo apt-get purge aria2 ansible azure-cli shellcheck rpm xorriso zsync -y -f - sudo apt-get purge firefox gfortran-9 google-chrome-stable -y -f - sudo apt-get purge google-cloud-sdk imagemagick -y -f - sudo apt-get purge libmagickcore-dev libmagickwand-dev libmagic-dev ant ant-optional kubectl -y -f - sudo apt-get purge mercurial apt-transport-https mono-complete -y -f - sudo apt-get purge unixodbc-dev libssl-dev -y -f - sudo apt-get purge libfreetype6-dev libfontconfig1-dev -y -f - sudo apt-get purge snmp pollinate libpq-dev postgresql-client powershell ruby-full -y -f - sudo apt-get purge sphinxsearch subversion azure-cli microsoft-edge-stable -y -f - sudo apt-get purge google-cloud-sdk -f -y - sudo apt-get purge microsoft-edge-stable -f -y || true - sudo apt purge microsoft-edge-stable -f -y || true - sudo apt-get purge "^mysql" -f -y || true - sudo apt-get purge "^php" -f -y || true - sudo apt-get purge "^dotnet" -f -y || true - sudo apt-get autoremove -y - sudo apt-get autoclean -y sudo rm -rf /var/lib/apt/lists/* sudo rm -rf /var/tmp/* sudo rm -rf /tmp/* @@ -707,11 +609,6 @@ jobs: sudo rm -rf /usr/share/dotnet sudo rm -rf /usr/local/lib/android sudo rm -rf /opt/ghc - sudo rm -rf \ - /usr/share/dotnet /usr/local/lib/android /opt/ghc \ - /usr/local/share/powershell /usr/share/swift /usr/local/.ghcup \ - /usr/lib/jvm || true - echo "some directories deleted" echo "Disk space now: $(df -h / | tail -1 | awk '{print $4}')" - name: Install Guix run: | @@ -719,7 +616,18 @@ jobs: sudo apt-get install -y guix guix pull --url=https://codeberg.org/guix/guix-mirror --substitute-urls="http://git.savannah.gnu.org/git/guix.git http://hydra-guix-129.guix.gnu.org http://ci.guix.gnu.org" - name: Download Dependencies - run: make -C depends download + run: | + attempt=1 + max=5 + until make -C depends download; do + if [ "$attempt" -ge "$max" ]; then + echo "make -C depends download failed after $attempt attempts" + exit 1 + fi + echo "make -C depends download attempt $attempt failed; retrying in $((attempt*5))s..." + sleep $((attempt*5)) + attempt=$((attempt+1)) + done - name: Run Guix Build run: | CORES=$(nproc) diff --git a/CMakeLists.txt b/CMakeLists.txt index 10cf80a80b..309f6d9c8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -245,7 +245,7 @@ if(BUILD_GUI) if(BUILD_GUI_TESTS) list(APPEND qt_components Test) endif() - find_package(Qt 5.11.3 MODULE REQUIRED + find_package(Qt 6.7.3 MODULE REQUIRED COMPONENTS ${qt_components} ) unset(qt_components) @@ -831,15 +831,6 @@ if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.29) set(CMAKE_SKIP_TEST_ALL_DEPENDENCY FALSE) endif() -# TODO: The `CMAKE_SKIP_BUILD_RPATH` variable setting can be deleted -# in the future after reordering Guix script commands to -# perform binary checks after the installation step. -# Relevant discussions: -# - https://github.com/hebasto/firo/pull/236#issuecomment-2183120953 -# - https://github.com/firo/firo/pull/30312#issuecomment-2191235833 -set(CMAKE_SKIP_BUILD_RPATH TRUE) -set(CMAKE_SKIP_INSTALL_RPATH TRUE) - if(BUILD_TESTS) # Create test configuration file # This file is used by the test framework to configure the tests. diff --git a/README.md b/README.md index 42dfd6fc70..2f4d6b185b 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ If you use a later version of Ubuntu, you may need to replace `python` with `pyt sudo dnf update sudo dnf install bzip2 perl-lib perl-FindBin gcc-c++ make cmake patch which # Also needed for GUI wallet only: -sudo dnf install qt5-qttools-devel qt5-qtbase-devel xz bison +sudo dnf install qt6-qttools-devel qt6-qtbase-devel xz bison sudo ln /usr/bin/bison /usr/bin/yacc ``` - Arch: diff --git a/cmake/module/FindQt.cmake b/cmake/module/FindQt.cmake index c2b7a21de1..d98af5bb56 100644 --- a/cmake/module/FindQt.cmake +++ b/cmake/module/FindQt.cmake @@ -27,19 +27,6 @@ if(CMAKE_HOST_APPLE) endif() endif() -# Save CMAKE_FIND_ROOT_PATH_MODE_LIBRARY state. -unset(_qt_find_root_path_mode_library_saved) -if(DEFINED CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) - set(_qt_find_root_path_mode_library_saved ${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}) -endif() - -# The Qt config files internally use find_library() calls for all -# dependencies to ensure their availability. In turn, the find_library() -# inspects the well-known locations on the file system; therefore, it must -# be able to find platform-specific system libraries, for example: -# /usr/x86_64-w64-mingw32/lib/libm.a or /usr/arm-linux-gnueabihf/lib/libm.a. -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) - find_package(Qt${Qt_FIND_VERSION_MAJOR} ${Qt_FIND_VERSION} COMPONENTS ${Qt_FIND_COMPONENTS} HINTS ${_qt_homebrew_prefix} @@ -47,14 +34,6 @@ find_package(Qt${Qt_FIND_VERSION_MAJOR} ${Qt_FIND_VERSION} ) unset(_qt_homebrew_prefix) -# Restore CMAKE_FIND_ROOT_PATH_MODE_LIBRARY state. -if(DEFINED _qt_find_root_path_mode_library_saved) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ${_qt_find_root_path_mode_library_saved}) - unset(_qt_find_root_path_mode_library_saved) -else() - unset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) -endif() - include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Qt REQUIRED_VARS Qt${Qt_FIND_VERSION_MAJOR}_DIR @@ -64,130 +43,3 @@ find_package_handle_standard_args(Qt foreach(component IN LISTS Qt_FIND_COMPONENTS ITEMS "") mark_as_advanced(Qt${Qt_FIND_VERSION_MAJOR}${component}_DIR) endforeach() - -# Prioritize finding static libraries -set(_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) -set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${_CMAKE_FIND_LIBRARY_SUFFIXES}) - -find_library(LIB_QTLIBPNG NAMES qtlibpng REQUIRED) -message(STATUS "Found Qt5 dependency: qtlibpng : ${LIB_QTLIBPNG}") - -if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT MINGW) - find_library(LIB_FONTCONFIG NAMES fontconfig REQUIRED) - message(STATUS "Found Qt5 dependency: fontconfig : ${LIB_FONTCONFIG}") - - find_library(LIB_EXPAT NAMES expat REQUIRED) - message(STATUS "Found Qt5 dependency: expat : ${LIB_EXPAT}") - - find_library(LIB_FREETYPE NAMES freetype REQUIRED) - message(STATUS "Found Qt5 dependency: freetype : ${LIB_FREETYPE}") - - find_library(LIB_XCB_EWMH NAMES xcb-ewmh REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-ewmh : ${LIB_XCB_EWMH}") - - find_library(LIB_XCB_ICCCM NAMES xcb-icccm REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-icccm : ${LIB_XCB_ICCCM}") - - find_library(LIB_XCB_IMAGE NAMES xcb-image REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-image : ${LIB_XCB_IMAGE}") - - find_library(LIB_XCB_KEYSYMS NAMES xcb-keysyms REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-keysyms : ${LIB_XCB_KEYSYMS}") - - find_library(LIB_XCB_RANDR NAMES xcb-randr REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-randr : ${LIB_XCB_RANDR}") - - find_library(LIB_XCB_RENDER_UTIL NAMES xcb-render-util REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-render-util : ${LIB_XCB_RENDER_UTIL}") - - find_library(LIB_XCB_RENDER NAMES xcb-render REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-render : ${LIB_XCB_RENDER}") - - find_library(LIB_XCB_SHAPE NAMES xcb-shape REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-shape : ${LIB_XCB_SHAPE}") - - find_library(LIB_XCB_SHM NAMES xcb-shm REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-shm : ${LIB_XCB_SHM}") - - find_library(LIB_XCB_SYNC NAMES xcb-sync REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-sync : ${LIB_XCB_SYNC}") - - find_library(LIB_XCB_UTIL NAMES xcb-util REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-util : ${LIB_XCB_UTIL}") - - find_library(LIB_XCB_XFIXES NAMES xcb-xfixes REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-xfixes : ${LIB_XCB_XFIXES}") - - find_library(LIB_XCB_XINERAMA NAMES xcb-xinerama REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-xinerama : ${LIB_XCB_XINERAMA}") - - find_library(LIB_XCB_XKB NAMES xcb-xkb REQUIRED) - message(STATUS "Found Qt5 dependency: xcb-xkb : ${LIB_XCB_XKB}") - - find_library(LIB_XCB NAMES xcb REQUIRED) - message(STATUS "Found Qt5 dependency: xcb : ${LIB_XCB}") - - find_library(LIB_XKBCOMMON_X11 NAMES xkbcommon-x11 REQUIRED) - message(STATUS "Found Qt5 dependency: xkbcommon-x11 : ${LIB_XKBCOMMON_X11}") - - find_library(LIB_XKBCOMMON NAMES xkbcommon REQUIRED) - message(STATUS "Found Qt5 dependency: xkbcommon : ${LIB_XKBCOMMON}") - - find_library(LIB_XAU NAMES Xau REQUIRED) - message(STATUS "Found Qt5 dependency: Xau : ${LIB_XAU}") - -endif() - -find_library(LIB_QTHARFBUZZ NAMES qtharfbuzz REQUIRED) -message(STATUS "Found Qt5 dependency: qtharfbuzz : ${LIB_QTHARFBUZZ}") - -find_library(LIB_QTPCR2 NAMES qtpcre2 REQUIRED) -message(STATUS "Found Qt5 dependency: qtpcre2 : ${LIB_QTPCR2}") - -find_library(LIB_Z NAMES z REQUIRED) -message(STATUS "Found Qt5 dependency: z : ${LIB_Z}") - -# Qt5 dependencies libraries, order is important, should be last -add_library(Qt5_Dependencies - INTERFACE -) -target_link_libraries(Qt5_Dependencies - INTERFACE - ${LIB_QTLIBPNG} - ${LIB_QTHARFBUZZ} - ${LIB_QTPCR2} - $<$:${LIB_FONTCONFIG}> - $<$:${LIB_FREETYPE}> - $<$:${LIB_EXPAT}> - $<$:${LIB_XCB_EWMH}> - $<$:${LIB_XCB_ICCCM}> - $<$:${LIB_XCB_IMAGE}> - $<$:${LIB_XCB_KEYSYMS}> - $<$:${LIB_XCB_RANDR}> - $<$:${LIB_XCB_RENDER_UTIL}> - $<$:${LIB_XCB_RENDER}> - $<$:${LIB_XCB_SHAPE}> - $<$:${LIB_XCB_SHM}> - $<$:${LIB_XCB_SYNC}> - $<$:${LIB_XCB_UTIL}> - $<$:${LIB_XCB_XFIXES}> - $<$:${LIB_XCB_XINERAMA}> - $<$:${LIB_XCB_XKB}> - $<$:${LIB_XCB}> - $<$:${LIB_XKBCOMMON_X11}> - $<$:${LIB_XKBCOMMON}> - $<$:${LIB_XAU}> - ${LIB_Z} -) - -if(NOT WIN32 AND NOT MINGW) - target_link_libraries(Qt5_Dependencies - INTERFACE - ${CMAKE_DL_LIBS} # Ensure dynamic loading is available. - ) -endif() - -add_library(Qt5::Dependencies ALIAS Qt5_Dependencies) - -# Restore CMAKE_FIND_LIBRARY_SUFFIXES state. -set(CMAKE_FIND_LIBRARY_SUFFIXES ${_CMAKE_FIND_LIBRARY_SUFFIXES}) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 33dab9b638..389ac5a2e5 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -45,7 +45,7 @@ bitcoin (0.13.1-trusty1) trusty; urgency=medium * New upstream release. * Backport updated bitcoin-qt.desktop from upstream master * Add zmq dependency - * Switch to Qt5 (breaks precise, but that was already broken by C++11) + * Switch to Qt6 (breaks precise, but that was already broken by C++11) -- Matt Corallo (BlueMatt) Thu, 27 Oct 2016 17:32:00 -0400 diff --git a/contrib/debian/rules b/contrib/debian/rules index 6885e38521..fe4db76f22 100755 --- a/contrib/debian/rules +++ b/contrib/debian/rules @@ -12,7 +12,7 @@ override_dh_auto_clean: if [ -f Makefile ]; then $(MAKE) distclean; fi rm -rf Makefile.in aclocal.m4 configure src/Makefile.in src/bitcoin-config.h.in src/build-aux src/qt/Makefile.in src/qt/test/Makefile.in src/test/Makefile.in -QT=$(shell dpkg-vendor --derives-from Ubuntu && echo qt4 || echo qt5) +QT=$(shell dpkg-vendor --derives-from Ubuntu && echo qt4 || echo qt6) # Yea, autogen should be run on the source archive, but I like doing git archive override_dh_auto_configure: diff --git a/contrib/guix/libexec/build.sh b/contrib/guix/libexec/build.sh index bc8666b6a8..bb0b72e461 100755 --- a/contrib/guix/libexec/build.sh +++ b/contrib/guix/libexec/build.sh @@ -365,20 +365,22 @@ mkdir -p "$DISTSRC" ;; esac - # Empty environment variables for x86_64-apple-darwin - if [[ "$HOST" == "x86_64-apple-darwin"* ]]; then - unset LIBRARY_PATH + # Empty environment variables for all Darwin builds to prevent GCC header conflicts + if [[ "$HOST" == *"darwin"* ]]; then unset CPATH unset C_INCLUDE_PATH unset CPLUS_INCLUDE_PATH unset OBJC_INCLUDE_PATH unset OBJCPLUS_INCLUDE_PATH + unset CC + unset CXX + unset CPP fi # Configure this DISTSRC for $HOST # shellcheck disable=SC2086 - env CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" OBJCXXFLAGS="${HOST_OBJCXXFLAGS}" \ + env PKG_CONFIG_PATH="${BASEPREFIX}/${HOST}/lib/pkgconfig:$PKG_CONFIG_PATH" CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" OBJCXXFLAGS="${HOST_OBJCXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" \ cmake --toolchain "${BASEPREFIX}/${HOST}/toolchain.cmake" -S . -B build \ -DCMAKE_INSTALL_PREFIX="${INSTALLPATH}" \ -DCMAKE_EXE_LINKER_FLAGS="${HOST_LDFLAGS}" \ diff --git a/contrib/rpm/README.md b/contrib/rpm/README.md index e1fd0b317b..575681e94b 100644 --- a/contrib/rpm/README.md +++ b/contrib/rpm/README.md @@ -72,7 +72,7 @@ difficult for a user to recover from backup in the event of a system failure. ## Graphical User Interface and Qt Version -The RPM spec file will by default build the GUI client linked against the Qt5 +The RPM spec file will by default build the GUI client linked against the Qt6 libraries. If you wish instead to link against the Qt4 libraries you need to pass the switch `-D '_use_qt4 1'` at build time to the `rpmbuild` or `mock` command used to build the packages. diff --git a/contrib/rpm/bitcoin.spec b/contrib/rpm/bitcoin.spec index 516f42334e..b705ca7c65 100644 --- a/contrib/rpm/bitcoin.spec +++ b/contrib/rpm/bitcoin.spec @@ -9,7 +9,7 @@ %if 0%{?_use_qt4} %define buildargs --with-qrencode --with-gui=qt4 %else -%define buildargs --with-qrencode --with-gui=qt5 +%define buildargs --with-qrencode --with-gui=qt6 %endif %endif @@ -67,9 +67,9 @@ Provides: %{name} = %{version}-%{release} %if 0%{?_use_qt4} BuildRequires: qt-devel %else -BuildRequires: qt5-qtbase-devel -# for /usr/bin/lrelease-qt5 -BuildRequires: qt5-linguist +BuildRequires: qt6-qtbase-devel +# for /usr/bin/lrelease-qt6 +BuildRequires: qt6-linguist %endif BuildRequires: protobuf-devel BuildRequires: qrencode-devel @@ -429,7 +429,7 @@ rm -rf %{buildroot} * Fri Feb 26 2016 Alice Wonder - 0.12.0-2 - Rename Qt package from bitcoin to bitcoin-core - Make building of the Qt package optional -- When building the Qt package, default to Qt5 but allow building +- When building the Qt package, default to Qt6 but allow building - against Qt4 - Only run SELinux stuff in post scripts if it is not set to disabled diff --git a/depends/Makefile b/depends/Makefile index 430f5cda28..8dc0409a3c 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -47,7 +47,7 @@ FALLBACK_DOWNLOAD_PATH ?= https://firo.org/depends-sources FALLBACK_DOWNLOAD_PATH_ALTERNATIVE ?= https://bitcoincore.org/depends-sources C_STANDARD ?= c11 -CXX_STANDARD ?= c++17 +CXX_STANDARD ?= c++20 BUILD = $(shell ./config.guess) PATCHES_PATH = $(BASEDIR)/patches @@ -169,7 +169,7 @@ zmq_packages_$(NO_ZMQ) = $(zmq_packages) multiprocess_packages_$(MULTIPROCESS) = $(multiprocess_packages) packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(boost_packages_) $(libevent_packages_) $(qt_packages_) $(wallet_packages_) -native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) +native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) $(qt_native_packages_) ifneq ($(zmq_packages_),) packages += $(zmq_packages) @@ -203,32 +203,6 @@ else crosscompiling=TRUE endif -$(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_build_id) - $(AT)@mkdir -p $(@D)Add commentMore actions - $(AT)sed -e 's|@HOST@|$(host)|' \ - -e 's|@CC@|$(host_CC)|' \ - -e 's|@CXX@|$(host_CXX)|' \ - -e 's|@AR@|$(host_AR)|' \ - -e 's|@RANLIB@|$(host_RANLIB)|' \ - -e 's|@NM@|$(host_NM)|' \ - -e 's|@STRIP@|$(host_STRIP)|' \ - -e 's|@build_os@|$(build_os)|' \ - -e 's|@host_os@|$(host_os)|' \ - -e 's|@CFLAGS@|$(strip $(host_CFLAGS) $(host_$(release_type)_CFLAGS))|' \ - -e 's|@CXXFLAGS@|$(strip $(host_CXXFLAGS) $(host_$(release_type)_CXXFLAGS))|' \ - -e 's|@CPPFLAGS@|$(strip $(host_CPPFLAGS) $(host_$(release_type)_CPPFLAGS))|' \ - -e 's|@LDFLAGS@|$(strip $(host_LDFLAGS) $(host_$(release_type)_LDFLAGS))|' \ - -e 's|@allow_host_packages@|$(ALLOW_HOST_PACKAGES)|' \ - -e 's|@no_qt@|$(NO_QT)|' \ - -e 's|@no_qr@|$(NO_QR)|' \ - -e 's|@no_zmq@|$(NO_ZMQ)|' \ - -e 's|@no_wallet@|$(NO_WALLET)|' \ - -e 's|@no_bdb@|$(NO_BDB)|' \ - -e 's|@no_sqlite@|$(NO_SQLITE)|' \ - -e 's|@debug@|$(DEBUG)|' \ - $< > $@ - $(AT)touch $@ - $(host_prefix)/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_$(final_build_id) @mkdir -p $(@D) sed -e 's|@depends_crosscompiling@|$(crosscompiling)|' \ @@ -298,7 +272,7 @@ clean-all: clean clean: @rm -rf $(WORK_PATH) $(BASE_CACHE) $(BUILD) *.log -install: check-packages $(host_prefix)/toolchain.cmake $(host_prefix)/share/config.site +install: check-packages $(host_prefix)/toolchain.cmake download-one: check-sources $(all_sources) diff --git a/depends/config.site.in b/depends/config.site.in index 87d0011b1c..6a1f9ad970 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -63,7 +63,7 @@ if test -z "$with_gui" && test -n "@no_qt@"; then fi if test -n "@debug@" && test -z "@no_qt@" && test "x$with_gui" != xno; then - with_gui=qt5_debug + with_gui=qt6_debug fi if test -z "$enable_zmq" && test -n "@no_zmq@"; then diff --git a/depends/funcs.mk b/depends/funcs.mk index bf5012f547..a0c3d8ed8a 100644 --- a/depends/funcs.mk +++ b/depends/funcs.mk @@ -42,6 +42,36 @@ define fetch_file $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(4),$(4),$(5)))) endef +# # Shell script to create a source tarball in $(1)_source from local directory +# # $(1)_local_dir instead of downloading remote sources. Tarball is recreated if +# # any paths in the local directory have a newer mtime, and checksum of the +# # tarball is saved to $(1)_fetched and returned as output. +# define fetch_local_dir_sha256 +# if ! [ -f $($(1)_source) ] || [ -n "$$(find $($(1)_local_dir) -newer $($(1)_source) | head -n1)" ]; then \ +# mkdir -p $(dir $($(1)_source)) && \ +# $(build_TAR) -c -f $($(1)_source) -C $($(1)_local_dir) . && \ +# rm -f $($(1)_fetched); \ +# fi && \ +# if ! [ -f $($(1)_fetched) ] || [ -n "$$(find $($(1)_source) -newer $($(1)_fetched))" ]; then \ +# mkdir -p $(dir $($(1)_fetched)) && \ +# cd $($(1)_source_dir) && \ +# $(build_SHA256SUM) $($(1)_all_sources) > $($(1)_fetched); \ +# fi && \ +# cut -d" " -f1 $($(1)_fetched) +# endef + +# define int_get_build_recipe_hash +# $(eval $(1)_patches_path?=$(PATCHES_PATH)/$(1)) +# $(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $($(1)_patches_path)/,$($(1)_patches)) | cut -d" " -f1)) +# # If $(1)_local_dir is set, create a tarball of the local directory contents to +# # use as the source of the package, and include a hash of the tarball in the +# # package id, so if directory contents change, the package and packages +# # depending on it will be rebuilt. +# $(if $($(1)_local_dir),$(eval $(1)_sha256_hash:=$(shell $(call fetch_local_dir_sha256,$(1))))) +# $(if $($(1)_local_dir),$(eval $(1)_all_file_checksums+=$($(1)_sha256_hash))) +# $(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) +# endef + define int_get_build_recipe_hash $(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1)) final_build_id_long+=:[$(1)_all_file_checksums]$(foreach checksum,$($(1)_all_file_checksums),$(shell echo ":$(checksum)")): @@ -49,12 +79,16 @@ $(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_ endef define int_get_build_id + $(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies)) -$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($(1)_dependencies))) +# $(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($(1)_dependencies))) +# $(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($(1)_dependencies))) $(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) $(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string)) +# $(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id)) $(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) final_build_id_long+=:[recipe]:$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type):[deps]$(foreach dep,$($(1)_build_id_deps),$(shell echo ":$(dep)")):[$($(1)_type)_id]:$($($(1)_type)_id_string): +# final_build_id_long+=$($(package)_build_id_long) #compute package-specific paths $(1)_build_subdir?=. @@ -70,6 +104,25 @@ $(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_bui $(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id) $(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ $(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz +# $(1)_build_log:=$(BASEDIR)/$(1)-$($(1)_version)-$($(1)_build_id).log +# endef + +# # Convert a string to a human-readable filename, replacing dot, slash, and space +# # characters that could cause problems with dashes and collapsing them. +# define int_friendly_file_name +# $(subst $(null) $(null),-,$(strip $(subst ., ,$(subst /, ,$(1))))) +# endef + +# define int_get_build_properties +# $(1)_build_subdir?=. +# $(1)_download_file?=$($(1)_file_name) +# $(1)_source_dir:=$(SOURCES_PATH) +# # If $(1)_file_name is empty and $(1)_local_dir is nonempty, set file name to a +# # .tar file with a friendly filename named after the directory path. +# $(if $($(1)_file_name),,$(if $($(1)_local_dir),$(eval $(1)_file_name:=$(call int_friendly_file_name,$($(1)_local_dir)).tar))) +# $(1)_source:=$$($(1)_source_dir)/$($(1)_file_name) +# $(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version) +# $(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ $(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources) #stamps @@ -79,6 +132,7 @@ $(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed $(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned $(1)_built=$$($(1)_build_dir)/.stamp_built $(1)_configured=$$($(1)_build_dir)/.stamp_configured +# $(1)_configured=$(host_prefix)/.$(1)_stamp_configured $(1)_staged=$$($(1)_staging_dir)/.stamp_staged $(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed $(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) @@ -92,6 +146,15 @@ $(1)_build_cmds ?= $(1)_config_cmds ?= $(1)_stage_cmds ?= $(1)_set_vars ?= +# #default commands +# # The default behavior for tar will try to set ownership when running as uid 0 and may not succeed, --no-same-owner disables this behavior +# $(1)_fetch_cmds ?= $(call fetch_file,$(1),$(subst \:,:,$$($(1)_download_path_fixed)),$$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash)) +# $(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash) $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_TAR) --no-same-owner --strip-components=1 -xf $$($(1)_source) +# $(1)_preprocess_cmds ?= true +# $(1)_build_cmds ?= true +# $(1)_config_cmds ?= true +# $(1)_stage_cmds ?= true +# $(1)_set_vars ?= all_sources+=$$($(1)_fetched) @@ -153,6 +216,7 @@ $(1)_stage_env+=$($(1)_stage_env_$(host_arch)_$(host_os)) $($(1)_stage_env_$(hos $(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig $(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig +$(1)_config_env+=PKG_CONFIG_SYSROOT_DIR=/ $(1)_config_env+=CMAKE_MODULE_PATH=$($($(1)_type)_prefix)/lib/cmake $(1)_config_env+=PATH="$(build_prefix)/bin:$(PATH)" $(1)_build_env+=PATH="$(build_prefix)/bin:$(PATH)" @@ -187,17 +251,29 @@ ifneq ($($(1)_ldflags),) $(1)_autoconf += LDFLAGS="$$($(1)_ldflags)" endif +# We hardcode the library install path to "lib" to match the PKG_CONFIG_PATH +# setting in depends/toolchain.cmake.in, which also hardcodes "lib". +# Without this setting, CMake by default would use the OS library +# directory, which might be "lib64" or something else, not "lib", on multiarch systems. $(1)_cmake=env CC="$$($(1)_cc)" \ CFLAGS="$$($(1)_cppflags) $$($(1)_cflags)" \ CXX="$$($(1)_cxx)" \ CXXFLAGS="$$($(1)_cppflags) $$($(1)_cxxflags)" \ LDFLAGS="$$($(1)_ldflags)" \ - cmake -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" $$($(1)_config_opts) + cmake -G "Unix Makefiles" \ + -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" \ + -DCMAKE_AR=`which $$($(1)_ar)` \ + -DCMAKE_NM=`which $$($(1)_nm)` \ + -DCMAKE_RANLIB=`which $$($(1)_ranlib)` \ + -DCMAKE_INSTALL_LIBDIR=lib/ \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=$(V) \ + $$($(1)_config_opts) ifeq ($($(1)_type),build) $(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib" else ifneq ($(host),$(build)) -$(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system) +$(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system_name) $(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host) $(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host) endif @@ -205,6 +281,11 @@ endif endef define int_add_cmds + +# ifneq ($(LOG),) +# $(1)_logging = >>$$($(1)_build_log) 2>&1 || { if test -f $$($(1)_build_log); then cat $$($(1)_build_log); fi; exit 1; } +# endif + $($(1)_fetched): $(AT)mkdir -p $$(@D) $(SOURCES_PATH) $(AT)rm -f $$@ @@ -282,8 +363,13 @@ $(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os))) $(foreach package,$(all_packages),$(eval $(call int_vars,$(package)))) #include package files +# $(foreach native_package,$(native_packages),$(eval include packages/$(native_package).mk)) +# $(foreach package,$(packages),$(eval include packages/$(package).mk)) $(foreach package,$(all_packages),$(eval include packages/$(package).mk)) +# set build properties for included package files +# $(foreach package,$(all_packages),$(eval $(call int_get_build_properties,$(package)))) + #compute a hash of all files that comprise this package's build recipe $(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package)))) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk index 6f39718eff..857660c6b1 100644 --- a/depends/hosts/darwin.mk +++ b/depends/hosts/darwin.mk @@ -66,8 +66,8 @@ darwin_LDFLAGS=-Wl,-platform_version,macos,$(OSX_MIN_VERSION),$(OSX_SDK_VERSION) ifneq ($(build_os),darwin) darwin_CFLAGS += -mlinker-version=$(LLD_VERSION) -darwin_CXXFLAGS += -mlinker-version=$(LLD_VERSION) -darwin_LDFLAGS += -Wl,-no_adhoc_codesign -fuse-ld=lld +darwin_CXXFLAGS += -mlinker-version=$(LLD_VERSION) -nostdinc++ -isystem$(OSX_SDK)/usr/include/c++/v1 -fuse-ld=lld +darwin_LDFLAGS += -Wl,-syslibroot,$(OSX_SDK) -Wl,-platform_version,macos,$(OSX_MIN_VERSION),$(OSX_SDK_VERSION) -Wl,-no_adhoc_codesign -fuse-ld=lld endif darwin_release_CFLAGS=-O2 diff --git a/depends/packages/libxcb_util_cursor.mk b/depends/packages/libxcb_util_cursor.mk new file mode 100644 index 0000000000..50c71b34fa --- /dev/null +++ b/depends/packages/libxcb_util_cursor.mk @@ -0,0 +1,31 @@ +package=libxcb_util_cursor +$(package)_version=0.1.5 +$(package)_download_path=https://xcb.freedesktop.org/dist +$(package)_file_name=xcb-util-cursor-$($(package)_version).tar.gz +$(package)_sha256_hash=0e9c5446dc6f3beb8af6ebfcc9e27bcc6da6fe2860f7fc07b99144dfa568e93b +$(package)_dependencies=libxcb libxcb_util_render libxcb_util_image + +define $(package)_set_vars +$(package)_config_opts = --enable-static --disable-shared +$(package)_config_opts += --disable-dependency-tracking --enable-option-checking +endef + +define $(package)_preprocess_cmds + cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub . +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + rm lib/*.la +endef diff --git a/depends/packages/native_qt.mk b/depends/packages/native_qt.mk new file mode 100644 index 0000000000..ffb65bb7bc --- /dev/null +++ b/depends/packages/native_qt.mk @@ -0,0 +1,158 @@ +package=native_qt +include packages/qt_details.mk +$(package)_version=$(qt_details_version) +$(package)_download_path=$(qt_details_download_path) +$(package)_file_name=$(qt_details_qtbase_file_name) +$(package)_sha256_hash=$(qt_details_qtbase_sha256_hash) +$(package)_patches_path := $(qt_details_patches_path) +$(package)_patches := dont_hardcode_pwd.patch +$(package)_patches += qtbase-moc-ignore-gcc-macro.patch +$(package)_patches += qtbase_avoid_native_float16.patch +$(package)_patches += qtbase_skip_tools.patch +$(package)_patches += rcc_hardcode_timestamp.patch +$(package)_patches += qttools_skip_dependencies.patch + +$(package)_qttranslations_file_name=$(qt_details_qttranslations_file_name) +$(package)_qttranslations_sha256_hash=$(qt_details_qttranslations_sha256_hash) + +$(package)_qttools_file_name=$(qt_details_qttools_file_name) +$(package)_qttools_sha256_hash=$(qt_details_qttools_sha256_hash) + +$(package)_extra_sources := $($(package)_qttranslations_file_name) +$(package)_extra_sources += $($(package)_qttools_file_name) + +$(package)_top_download_path=$(qt_details_top_download_path) +$(package)_top_cmakelists_file_name=$(qt_details_top_cmakelists_file_name) +$(package)_top_cmakelists_download_file=$(qt_details_top_cmakelists_download_file) +$(package)_top_cmakelists_sha256_hash=$(qt_details_top_cmakelists_sha256_hash) +$(package)_top_cmake_download_path=$(qt_details_top_cmake_download_path) +$(package)_top_cmake_ecmoptionaladdsubdirectory_file_name=$(qt_details_top_cmake_ecmoptionaladdsubdirectory_file_name) +$(package)_top_cmake_ecmoptionaladdsubdirectory_download_file=$(qt_details_top_cmake_ecmoptionaladdsubdirectory_download_file) +$(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash=$(qt_details_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) +$(package)_top_cmake_qttoplevelhelpers_file_name=$(qt_details_top_cmake_qttoplevelhelpers_file_name) +$(package)_top_cmake_qttoplevelhelpers_download_file=$(qt_details_top_cmake_qttoplevelhelpers_download_file) +$(package)_top_cmake_qttoplevelhelpers_sha256_hash=$(qt_details_top_cmake_qttoplevelhelpers_sha256_hash) + +$(package)_extra_sources += $($(package)_top_cmakelists_file_name)-$($(package)_version) +$(package)_extra_sources += $($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) +$(package)_extra_sources += $($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) + +define $(package)_set_vars +# Build options. +$(package)_config_opts := -release +$(package)_config_opts += -make tools +$(package)_config_opts += -no-pkg-config +$(package)_config_opts += -no-reduce-relocations +$(package)_config_opts += -no-use-gold-linker +$(package)_config_opts += -prefix $(host_prefix) +$(package)_config_opts += -static + +# Modules. +$(package)_config_opts += -no-feature-concurrent +$(package)_config_opts += -no-feature-network +$(package)_config_opts += -no-feature-printsupport +$(package)_config_opts += -no-feature-sql +$(package)_config_opts += -no-feature-testlib +$(package)_config_opts += -no-feature-xml +$(package)_config_opts += -no-gui +$(package)_config_opts += -no-widgets + +$(package)_config_opts += -no-glib +$(package)_config_opts += -no-icu +$(package)_config_opts += -no-libudev +$(package)_config_opts += -no-openssl +$(package)_config_opts += -no-zstd +$(package)_config_opts += -qt-pcre +$(package)_config_opts += -qt-zlib +$(package)_config_opts += -no-feature-backtrace +$(package)_config_opts += -no-feature-permissions +$(package)_config_opts += -no-feature-process +$(package)_config_opts += -no-feature-settings + +# Core tools. +$(package)_config_opts += -no-feature-androiddeployqt +$(package)_config_opts += -no-feature-macdeployqt +$(package)_config_opts += -no-feature-windeployqt +$(package)_config_opts += -no-feature-qmake + +# Qt Tools module. +$(package)_config_opts += -feature-linguist +$(package)_config_opts += -no-feature-assistant +$(package)_config_opts += -no-feature-clang +$(package)_config_opts += -no-feature-clangcpp +$(package)_config_opts += -no-feature-designer +$(package)_config_opts += -no-feature-pixeltool +$(package)_config_opts += -no-feature-qdoc +$(package)_config_opts += -no-feature-qtattributionsscanner +$(package)_config_opts += -no-feature-qtdiag +$(package)_config_opts += -no-feature-qtplugininfo + +$(package)_config_env := CC="$$(build_CC)" +$(package)_config_env += CXX="$$(build_CXX)" +ifeq ($(build_os),darwin) +$(package)_config_env += OBJC="$$(build_CC)" +$(package)_config_env += OBJCXX="$$(build_CXX)" +endif + +$(package)_cmake_opts := -DCMAKE_EXE_LINKER_FLAGS="$$(build_LDFLAGS)" +ifneq ($(V),) +$(package)_cmake_opts += --log-level=STATUS +endif +endef + +define $(package)_fetch_cmds +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttranslations_file_name),$($(package)_qttranslations_file_name),$($(package)_qttranslations_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttools_file_name),$($(package)_qttools_file_name),$($(package)_qttools_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_top_download_path),$($(package)_top_cmakelists_download_file),$($(package)_top_cmakelists_file_name)-$($(package)_version),$($(package)_top_cmakelists_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_top_cmake_download_path),$($(package)_top_cmake_ecmoptionaladdsubdirectory_download_file),$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version),$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_top_cmake_download_path),$($(package)_top_cmake_qttoplevelhelpers_download_file),$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version),$($(package)_top_cmake_qttoplevelhelpers_sha256_hash)) +endef + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_qttranslations_sha256_hash) $($(package)_source_dir)/$($(package)_qttranslations_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_qttools_sha256_hash) $($(package)_source_dir)/$($(package)_qttools_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmakelists_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmake_qttoplevelhelpers_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir qtbase && \ + $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source) -C qtbase && \ + mkdir qttranslations && \ + $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttranslations_file_name) -C qttranslations && \ + mkdir qttools && \ + $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools && \ + cp $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version) ./$($(package)_top_cmakelists_file_name) && \ + mkdir cmake && \ + cp $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name) && \ + cp $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_qttoplevelhelpers_file_name) +endef + +define $(package)_preprocess_cmds + patch -p1 -i $($(package)_patch_dir)/dont_hardcode_pwd.patch && \ + patch -p1 -i $($(package)_patch_dir)/qtbase-moc-ignore-gcc-macro.patch && \ + patch -p1 -i $($(package)_patch_dir)/qtbase_avoid_native_float16.patch && \ + patch -p1 -i $($(package)_patch_dir)/qtbase_skip_tools.patch && \ + patch -p1 -i $($(package)_patch_dir)/rcc_hardcode_timestamp.patch && \ + patch -p1 -i $($(package)_patch_dir)/qttools_skip_dependencies.patch +endef + +define $(package)_config_cmds + cd qtbase && \ + ./configure -top-level $($(package)_config_opts) -- $($(package)_cmake_opts) +endef + +define $(package)_build_cmds + cmake --build . -- $$(filter -j%,$$(MAKEFLAGS)) +endef + +define $(package)_stage_cmds + cmake --install . --prefix $($(package)_staging_prefix_dir) +endef + +define $(package)_postprocess_cmds + rm -rf doc/ && \ + mv translations/ .. +endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk index 7761cba39c..3f69b12bf2 100644 --- a/depends/packages/packages.mk +++ b/depends/packages/packages.mk @@ -3,10 +3,13 @@ darwin_packages:=zeromq linux_packages:=zeromq native_packages := -qt_linux_packages:=qt expat libxcb xcb_proto libXau xproto freetype fontconfig libxkbcommon libxcb_util libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm - +qt_linux_packages:=qt expat libxcb xcb_proto libXau xproto freetype fontconfig libxkbcommon libxcb_util libxcb_util_cursor libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm +qt_freebsd_packages:=$(qt_linux_packages) qt_darwin_packages=qt qt_mingw32_packages=qt +ifneq ($(host),$(build)) +qt_native_packages := native_qt +endif bdb_packages=bdb sqlite_packages=sqlite diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index 0c6eaef9b7..ae53e773b6 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,51 +1,59 @@ package=qt -$(package)_version=5.15.11 -$(package)_download_path=https://download.qt.io/official_releases/qt/5.15/$($(package)_version)/submodules -$(package)_suffix=everywhere-opensource-src-$($(package)_version).tar.xz -$(package)_file_name=qtbase-$($(package)_suffix) -$(package)_sha256_hash=425ad301acd91ca66c10c0dabee0704e2d0cd2801a6b670115800cbb95f84846 -$(package)_dependencies=zlib -$(package)_linux_dependencies=freetype fontconfig libxcb libxkbcommon libxcb_util libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm -$(package)_qt_libs=corelib network widgets gui plugins testlib -$(package)_linguist_tools = lrelease lupdate lconvert -$(package)_patches = qt.pro -$(package)_patches += qttools_src.pro -$(package)_patches += mac-qmake.conf -$(package)_patches += fix_qt_pkgconfig.patch -$(package)_patches += no-xlib.patch -$(package)_patches += fix_android_jni_static.patch -$(package)_patches += dont_hardcode_pwd.patch +include packages/qt_details.mk +$(package)_version=$(qt_details_version) +$(package)_download_path=$(qt_details_download_path) +$(package)_file_name=$(qt_details_qtbase_file_name) +$(package)_sha256_hash=$(qt_details_qtbase_sha256_hash) +ifneq ($(host),$(build)) +$(package)_dependencies := native_$(package) +endif +$(package)_linux_dependencies := freetype fontconfig libxcb libxkbcommon libxcb_util libxcb_util_cursor libxcb_util_render libxcb_util_keysyms libxcb_util_image libxcb_util_wm +$(package)_freebsd_dependencies := $($(package)_linux_dependencies) +$(package)_patches_path := $(qt_details_patches_path) +$(package)_patches := dont_hardcode_pwd.patch $(package)_patches += qtbase-moc-ignore-gcc-macro.patch -$(package)_patches += use_android_ndk23.patch +$(package)_patches += qtbase_avoid_native_float16.patch +$(package)_patches += qtbase_avoid_qmain.patch +$(package)_patches += qtbase_platformsupport.patch +$(package)_patches += qtbase_plugins_cocoa.patch +$(package)_patches += qtbase_skip_tools.patch $(package)_patches += rcc_hardcode_timestamp.patch -$(package)_patches += duplicate_lcqpafonts.patch -$(package)_patches += fast_fixed_dtoa_no_optimize.patch -$(package)_patches += guix_cross_lib_path.patch -$(package)_patches += fix-macos-linker.patch -$(package)_patches += memory_resource.patch -$(package)_patches += windows_lto.patch -$(package)_patches += fix-libpng.patch -$(package)_patches += guix-arm64-darwin-build.patch +$(package)_patches += qttools_skip_dependencies.patch -$(package)_qttranslations_file_name=qttranslations-$($(package)_suffix) -$(package)_qttranslations_sha256_hash=a31785948c640b7c66d9fe2db4993728ca07f64e41c560b3625ad191b276ff20 +$(package)_qttranslations_file_name=$(qt_details_qttranslations_file_name) +$(package)_qttranslations_sha256_hash=$(qt_details_qttranslations_sha256_hash) -$(package)_qttools_file_name=qttools-$($(package)_suffix) -$(package)_qttools_sha256_hash=7cd847ae6ff09416df617136eadcaf0eb98e3bc9b89979219a3ea8111fb8d339 +$(package)_qttools_file_name=$(qt_details_qttools_file_name) +$(package)_qttools_sha256_hash=$(qt_details_qttools_sha256_hash) -$(package)_extra_sources = $($(package)_qttranslations_file_name) +$(package)_extra_sources := $($(package)_qttranslations_file_name) $(package)_extra_sources += $($(package)_qttools_file_name) +$(package)_top_download_path=$(qt_details_top_download_path) +$(package)_top_cmakelists_file_name=$(qt_details_top_cmakelists_file_name) +$(package)_top_cmakelists_download_file=$(qt_details_top_cmakelists_download_file) +$(package)_top_cmakelists_sha256_hash=$(qt_details_top_cmakelists_sha256_hash) +$(package)_top_cmake_download_path=$(qt_details_top_cmake_download_path) +$(package)_top_cmake_ecmoptionaladdsubdirectory_file_name=$(qt_details_top_cmake_ecmoptionaladdsubdirectory_file_name) +$(package)_top_cmake_ecmoptionaladdsubdirectory_download_file=$(qt_details_top_cmake_ecmoptionaladdsubdirectory_download_file) +$(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash=$(qt_details_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) +$(package)_top_cmake_qttoplevelhelpers_file_name=$(qt_details_top_cmake_qttoplevelhelpers_file_name) +$(package)_top_cmake_qttoplevelhelpers_download_file=$(qt_details_top_cmake_qttoplevelhelpers_download_file) +$(package)_top_cmake_qttoplevelhelpers_sha256_hash=$(qt_details_top_cmake_qttoplevelhelpers_sha256_hash) + +$(package)_extra_sources += $($(package)_top_cmakelists_file_name)-$($(package)_version) +$(package)_extra_sources += $($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) +$(package)_extra_sources += $($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) + define $(package)_set_vars $(package)_config_env = QT_MAC_SDK_NO_VERSION_CHECK=1 $(package)_config_opts_release = -release $(package)_config_opts_debug = -debug +$(package)_config_opts = -no-egl $(package)_config_opts_debug += -optimized-tools $(package)_config_opts += -bindir $(build_prefix)/bin $(package)_config_opts += -c++std c++17 $(package)_config_opts += -confirm-license -$(package)_config_opts += -hostprefix $(build_prefix) -$(package)_config_opts += -no-compile-examples $(package)_config_opts += -no-cups $(package)_config_opts += -no-egl $(package)_config_opts += -no-eglfs @@ -55,252 +63,295 @@ $(package)_config_opts += -no-glib $(package)_config_opts += -no-icu $(package)_config_opts += -no-zstd $(package)_config_opts += -no-ico -$(package)_config_opts += -no-iconv $(package)_config_opts += -no-kms $(package)_config_opts += -no-linuxfb $(package)_config_opts += -no-libjpeg $(package)_config_opts += -no-libproxy $(package)_config_opts += -no-libudev $(package)_config_opts += -no-mtdev +$(package)_config_opts += -no-opengl $(package)_config_opts += -no-openssl $(package)_config_opts += -no-openvg $(package)_config_opts += -no-reduce-relocations +$(package)_config_opts += -no-schannel $(package)_config_opts += -no-sctp $(package)_config_opts += -no-securetransport $(package)_config_opts += -no-sql-db2 $(package)_config_opts += -no-sql-ibase $(package)_config_opts += -no-sql-oci -$(package)_config_opts += -no-sql-tds $(package)_config_opts += -no-sql-mysql $(package)_config_opts += -no-sql-odbc $(package)_config_opts += -no-sql-psql $(package)_config_opts += -no-sql-sqlite -$(package)_config_opts += -no-sql-sqlite2 $(package)_config_opts += -no-system-proxies $(package)_config_opts += -no-use-gold-linker +$(package)_config_opts += -no-zstd $(package)_config_opts += -nomake examples $(package)_config_opts += -nomake tests $(package)_config_opts += -nomake tools $(package)_config_opts += -opensource -$(package)_config_opts += -optimized-qmake -$(package)_config_opts += -pch $(package)_config_opts += -prefix $(host_prefix) +$(package)_config_opts += -qt-doubleconversion +$(package)_config_opts += -qt-harfbuzz +ifneq ($(host),$(build)) +$(package)_config_opts += -qt-host-path $(build_prefix) +endif $(package)_config_opts += -qt-libpng $(package)_config_opts += -qt-pcre -$(package)_config_opts += -qt-harfbuzz $(package)_config_opts += -system-zlib +$(package)_config_opts += -qt-zlib $(package)_config_opts += -static -$(package)_config_opts += -v -$(package)_config_opts += -no-feature-bearermanagement +$(package)_config_opts += -no-feature-backtrace $(package)_config_opts += -no-feature-colordialog -$(package)_config_opts += -no-feature-commandlineparser $(package)_config_opts += -no-feature-concurrent $(package)_config_opts += -no-feature-dial -$(package)_config_opts += -no-feature-fontcombobox -$(package)_config_opts += -no-feature-ftp +$(package)_config_opts += -no-feature-gssapi $(package)_config_opts += -no-feature-http $(package)_config_opts += -no-feature-image_heuristic_mask $(package)_config_opts += -no-feature-keysequenceedit $(package)_config_opts += -no-feature-lcdnumber +$(package)_config_opts += -no-feature-libresolv $(package)_config_opts += -no-feature-networkdiskcache $(package)_config_opts += -no-feature-pdf $(package)_config_opts += -no-feature-printdialog $(package)_config_opts += -no-feature-printer $(package)_config_opts += -no-feature-printpreviewdialog $(package)_config_opts += -no-feature-printpreviewwidget +$(package)_config_opts += -no-feature-networkproxy +$(package)_config_opts += -no-feature-printsupport $(package)_config_opts += -no-feature-sessionmanager $(package)_config_opts += -no-feature-socks5 $(package)_config_opts += -no-feature-sql $(package)_config_opts += -no-feature-sqlmodel -$(package)_config_opts += -no-feature-statemachine $(package)_config_opts += -no-feature-syntaxhighlighter -$(package)_config_opts += -no-feature-textbrowser $(package)_config_opts += -no-feature-textmarkdownwriter +$(package)_config_opts += -no-feature-textmarkdownreader $(package)_config_opts += -no-feature-textodfwriter $(package)_config_opts += -no-feature-topleveldomain +$(package)_config_opts += -no-feature-udpsocket $(package)_config_opts += -no-feature-undocommand $(package)_config_opts += -no-feature-undogroup $(package)_config_opts += -no-feature-undostack $(package)_config_opts += -no-feature-undoview $(package)_config_opts += -no-feature-vnc -$(package)_config_opts += -no-feature-xml $(package)_config_opts_darwin = -no-dbus $(package)_config_opts_darwin += -no-opengl -$(package)_config_opts_darwin += -pch $(package)_config_opts_darwin += -no-feature-corewlan -$(package)_config_opts_darwin += -no-freetype -$(package)_config_opts_darwin += -no-pkg-config -$(package)_config_opts_darwin += QMAKE_MACOSX_DEPLOYMENT_TARGET=$(OSX_MIN_VERSION) +$(package)_config_opts += -no-feature-vulkan -ifneq ($(build_os),darwin) -$(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_VERSION=$(OSX_SDK_VERSION) -$(package)_config_opts_darwin += -device-option CROSS_COMPILE="$(host)-" -$(package)_config_opts_darwin += -device-option MAC_TARGET=$(host) -$(package)_config_opts_darwin += -device-option XCODE_VERSION=$(XCODE_VERSION) -endif +# Core tools. +$(package)_config_opts += -no-feature-androiddeployqt +$(package)_config_opts += -no-feature-macdeployqt +$(package)_config_opts += -no-feature-qmake +$(package)_config_opts += -no-feature-windeployqt -ifdef GUIX_ENVIRONMENT -export QT_MAC_SDK_NO_VERSION_CHECK=1 -$(package)_cflags_darwin += -fuse-ld=lld -$(package)_cxxflags_darwin += -fuse-ld=lld -$(package)_config_opts_darwin += "QMAKE_CFLAGS = '$($(package)_cflags) -fuse-ld=lld -include math.h -I$(SYSROOT)/usr/include'" -$(package)_config_opts_darwin += "QMAKE_CXX = '$($(package)_cxx)'" -$(package)_config_opts_darwin += "QMAKE_CXXFLAGS = '$($(package)_cxxflags) $($(package)_cppflags) -fuse-ld=lld -include math.h -I$(SYSROOT)/usr/include'" -$(package)_config_opts_darwin += "QMAKE_LFLAGS = '$($(package)_ldflags)'" -$(package)_config_opts_darwin += "QMAKE_LIB = '$($(package)_ar) rc'" -$(package)_config_opts_darwin += "QMAKE_AR = '$($(package)_ar) rc'" -$(package)_config_opts_darwin += "QMAKE_RANLIB = '$($(package)_ranlib)'" +ifeq ($(host),$(build)) +# Qt Tools module. +$(package)_config_opts += -feature-linguist +$(package)_config_opts += -no-feature-assistant +$(package)_config_opts += -no-feature-clang +$(package)_config_opts += -no-feature-clangcpp +$(package)_config_opts += -no-feature-designer +$(package)_config_opts += -no-feature-pixeltool +$(package)_config_opts += -no-feature-qdoc +$(package)_config_opts += -no-feature-qtattributionsscanner +$(package)_config_opts += -no-feature-qtdiag +$(package)_config_opts += -no-feature-qtplugininfo endif -ifneq ($(build_arch),$(host_arch)) -$(package)_config_opts_aarch64_darwin += -device-option QMAKE_APPLE_DEVICE_ARCHS=arm64 -$(package)_config_opts_x86_64_darwin += -device-option QMAKE_APPLE_DEVICE_ARCHS=x86_64 -endif +$(package)_config_opts_darwin := -no-dbus +$(package)_config_opts_darwin += -no-opengl +$(package)_config_opts_darwin += -pch +$(package)_config_opts_darwin += -no-feature-printsupport +$(package)_config_opts_darwin += -no-freetype +$(package)_config_opts_darwin += -no-pkg-config -$(package)_config_opts_linux = -xcb -$(package)_config_opts_linux += -no-xcb-xlib -$(package)_config_opts_linux += -no-pkg-config +$(package)_config_opts_linux := -dbus-runtime +$(package)_config_opts_linux += -fontconfig +$(package)_config_opts_linux += -no-feature-process $(package)_config_opts_linux += -no-feature-xlib +$(package)_config_opts_linux += -no-xcb-xlib +$(package)_config_opts_linux += -pkg-config $(package)_config_opts_linux += -system-freetype $(package)_config_opts_linux += -fontconfig $(package)_config_opts_linux += -no-opengl $(package)_config_opts_linux += -no-feature-vulkan $(package)_config_opts_linux += -dbus-runtime +$(package)_config_opts_linux += -feature-xcb ifneq ($(LTO),) $(package)_config_opts_linux += -ltcg endif +$(package)_config_opts_freebsd := $$($(package)_config_opts_linux) -ifneq (,$(findstring clang,$($(package)_cxx))) - ifneq (,$(findstring -stdlib=libc++,$($(package)_cxx))) - $(package)_config_opts_linux += -platform linux-clang-libc++ -xplatform linux-clang-libc++ - else - $(package)_config_opts_linux += -platform linux-clang -xplatform linux-clang - endif -else - $(package)_config_opts_linux += -platform linux-g++ -xplatform bitcoin-linux-g++ -endif - -$(package)_config_opts_mingw32 = -no-opengl -$(package)_config_opts_mingw32 += -no-dbus +$(package)_config_opts_mingw32 := -no-dbus $(package)_config_opts_mingw32 += -no-freetype $(package)_config_opts_mingw32 += -no-pkg-config -$(package)_config_opts_mingw32 += -xplatform win32-g++ -$(package)_config_opts_mingw32 += "QMAKE_CFLAGS = '$($(package)_cflags) $($(package)_cppflags)'" -$(package)_config_opts_mingw32 += "QMAKE_CXX = '$($(package)_cxx)'" -$(package)_config_opts_mingw32 += "QMAKE_CXXFLAGS = '$($(package)_cxxflags) $($(package)_cppflags)'" -$(package)_config_opts_mingw32 += "QMAKE_LFLAGS = '$($(package)_ldflags)'" -$(package)_config_opts_mingw32 += "QMAKE_LIB = '$($(package)_ar) rc'" -$(package)_config_opts_mingw32 += -device-option CROSS_COMPILE="$(host)-" -$(package)_config_opts_mingw32 += -pch -ifneq ($(LTO),) -$(package)_config_opts_mingw32 += -ltcg + +$(package)_config_env := CC="$$($(package)_cc)" +$(package)_config_env += CXX="$$($(package)_cxx)" +$(package)_config_env_darwin := OBJC="$$($(package)_cc)" +$(package)_config_env_darwin += OBJCXX="$$($(package)_cxx)" + +$(package)_cmake_opts := -DCMAKE_PREFIX_PATH=$(host_prefix) +$(package)_cmake_opts += -DQT_FEATURE_cxx20=ON +$(package)_cmake_opts += -DQT_ENABLE_CXX_EXTENSIONS=OFF + +ifeq ($(host_os),mingw32) +$(package)_cmake_opts += -DCMAKE_SYSTEM_NAME=Windows +$(package)_windres := $(host)-windres +$(package)_cmake_opts += -DCMAKE_RC_COMPILER=$$($(package)_windres) +endif +ifneq ($(V),) +$(package)_cmake_opts += --log-level=STATUS +endif + +$(package)_cmake_opts += -DQT_USE_DEFAULT_CMAKE_OPTIMIZATION_FLAGS=ON + +# Here we used firstword and filter-out functions (guix-functions) to extract the compiler and flags seperately. +# They defined together in darwin.mk, because for autotools we would pass them together as CC/CXX, but for cmake, we should seperate them. +$(package)_cmake_opts += -DCMAKE_C_COMPILER="$$(firstword $$($(package)_cc))" +$(package)_cmake_opts += -DCMAKE_C_FLAGS="$$(filter-out $$(firstword $$($(package)_cc)),$$($(package)_cc)) $($(package)_cflags) $($(package)_cppflags)" +$(package)_cmake_opts += -DCMAKE_C_FLAGS_RELEASE="$$(filter-out $$(firstword $$($(package)_cc)),$$($(package)_cc)) $($(package)_release_cflags) $($(package)_release_cppflags)" +$(package)_cmake_opts += -DCMAKE_C_FLAGS_DEBUG="$$(filter-out $$(firstword $$($(package)_cc)),$$($(package)_cc)) $($(package)_debug_cflags) $($(package)_debug_cppflags)" +$(package)_cmake_opts += -DCMAKE_CXX_COMPILER="$$(firstword $$($(package)_cxx))" +$(package)_cmake_opts += -DCMAKE_CXX_FLAGS="$$(filter-out $$(firstword $$($(package)_cxx)),$$($(package)_cxx)) $($(package)_cxxflags) $($(package)_cppflags)" +$(package)_cmake_opts += -DCMAKE_CXX_FLAGS_RELEASE="$$(filter-out $$(firstword $$($(package)_cxx)),$$($(package)_cxx)) $($(package)_release_cxxflags) $($(package)_release_cppflags)" +$(package)_cmake_opts += -DCMAKE_CXX_FLAGS_DEBUG="$$(filter-out $$(firstword $$($(package)_cxx)),$$($(package)_cxx)) $($(package)_debug_cxxflags) $($(package)_debug_cppflags)" +$(package)_cmake_opts += -DCMAKE_EXE_LINKER_FLAGS="$($(package)_ldflags)" +$(package)_cmake_opts += -DCMAKE_EXE_LINKER_FLAGS_RELEASE="$($(package)_ldflags)" +$(package)_cmake_opts += -DCMAKE_EXE_LINKER_FLAGS_DEBUG="$($(package)_ldflags)" +$(package)_cmake_opts += -DCMAKE_SHARED_LINKER_FLAGS="$($(package)_ldflags)" +$(package)_cmake_opts += -DCMAKE_SHARED_LINKER_FLAGS_RELEASE="$($(package)_ldflags)" +$(package)_cmake_opts += -DCMAKE_SHARED_LINKER_FLAGS_DEBUG="$($(package)_ldflags)" +ifeq ($(host_os),darwin) +$(package)_cmake_opts += -DCMAKE_OBJC_FLAGS="$($(package)_cflags) $($(package)_cppflags) -ffile-prefix-map=$$($(package)_extract_dir)=/usr" +$(package)_cmake_opts += -DCMAKE_OBJC_FLAGS_RELEASE="$$($$($(package)_type)_release_CFLAGS)" +$(package)_cmake_opts += -DCMAKE_OBJC_FLAGS_DEBUG="$$($$($(package)_type)_debug_CFLAGS)" +$(package)_cmake_opts += -DCMAKE_OBJCXX_FLAGS="$($(package)_cxxflags) $($(package)_cppflags) -ffile-prefix-map=$$($(package)_extract_dir)=/usr" +$(package)_cmake_opts += -DCMAKE_OBJCXX_FLAGS_RELEASE="$$($$($(package)_type)_release_CXXFLAGS)" +$(package)_cmake_opts += -DCMAKE_OBJCXX_FLAGS_DEBUG="$$($$($(package)_type)_debug_CXXFLAGS)" +endif + +ifeq ($(host_os),linux) +$(package)_cmake_opts += -DQT_FEATURE_xcb=ON endif -$(package)_config_opts_android = -xplatform android-clang -$(package)_config_opts_android += -android-sdk $(ANDROID_SDK) -$(package)_config_opts_android += -android-ndk $(ANDROID_NDK) -$(package)_config_opts_android += -android-ndk-platform android-$(ANDROID_API_LEVEL) -$(package)_config_opts_android += -egl -$(package)_config_opts_android += -no-dbus -$(package)_config_opts_android += -opengl es2 -$(package)_config_opts_android += -qt-freetype -$(package)_config_opts_android += -no-fontconfig -$(package)_config_opts_android += -L $(host_prefix)/lib -$(package)_config_opts_android += -I $(host_prefix)/include -$(package)_config_opts_android += -pch -$(package)_config_opts_android += -no-feature-vulkan +ifdef GUIX_ENVIRONMENT +export QT_MAC_SDK_NO_VERSION_CHECK=1 +ifneq ($(host_os),darwin) +$(package)_config_env_darwin += AR="$$($(package)_ar)" +$(package)_config_env_darwin += RANLIB="$$($(package)_ranlib)" +endif +endif + +ifneq ($(host),$(build)) +$(package)_cmake_opts += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system_name) +$(package)_cmake_opts += -DCMAKE_SYSTEM_VERSION=$($(host_os)_cmake_system_version) +$(package)_cmake_opts += -DCMAKE_SYSTEM_PROCESSOR=$(host_arch) +$(package)_cmake_opts += -DQT_HOST_PATH=$(build_prefix) +# Native packages cannot be used during cross-compiling. However, +# Qt still unconditionally tries to find them, which causes issues +# in some cases, such as when cross-compiling from macOS to Windows. +# Explicitly disable this unnecessary Qt behaviour. +$(package)_cmake_opts += -DCMAKE_DISABLE_FIND_PACKAGE_Libb2=TRUE +$(package)_cmake_opts += -DCMAKE_DISABLE_FIND_PACKAGE_WrapSystemDoubleConversion=TRUE +$(package)_cmake_opts += -DCMAKE_DISABLE_FIND_PACKAGE_WrapSystemMd4c=TRUE +$(package)_cmake_opts += -DCMAKE_DISABLE_FIND_PACKAGE_WrapZSTD=TRUE +ifneq ($(host_os), darwin) +$(package)_cmake_opts += -DCMAKE_ASM_COMPILER=$$(firstword $$($(package)_cc)) +endif +endif -$(package)_config_opts_aarch64_android += -android-arch arm64-v8a -$(package)_config_opts_armv7a_android += -android-arch armeabi-v7a -$(package)_config_opts_x86_64_android += -android-arch x86_64 +ifeq ($(host_os),darwin) +$(package)_cmake_opts += -DCMAKE_INSTALL_NAME_TOOL=true +$(package)_cmake_opts += -DCMAKE_FRAMEWORK_PATH=$(OSX_SDK)/System/Library/Frameworks +$(package)_cmake_opts += -DQT_INTERNAL_APPLE_SDK_VERSION=$(OSX_SDK_VERSION) +$(package)_cmake_opts += -DQT_INTERNAL_XCODE_VERSION=$(XCODE_VERSION) +$(package)_cmake_opts += -DQT_NO_APPLE_SDK_MAX_VERSION_CHECK=ON +$(package)_config_env_darwin += unset LIBRARY_PATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH OBJCPLUS_INCLUDE_PATH; +endif endef define $(package)_fetch_cmds $(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \ $(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttranslations_file_name),$($(package)_qttranslations_file_name),$($(package)_qttranslations_sha256_hash)) && \ -$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttools_file_name),$($(package)_qttools_file_name),$($(package)_qttools_sha256_hash)) +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttools_file_name),$($(package)_qttools_file_name),$($(package)_qttools_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_top_download_path),$($(package)_top_cmakelists_download_file),$($(package)_top_cmakelists_file_name)-$($(package)_version),$($(package)_top_cmakelists_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_top_cmake_download_path),$($(package)_top_cmake_ecmoptionaladdsubdirectory_download_file),$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version),$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_top_cmake_download_path),$($(package)_top_cmake_qttoplevelhelpers_download_file),$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version),$($(package)_top_cmake_qttoplevelhelpers_sha256_hash)) endef +ifeq ($(host),$(build)) define $(package)_extract_cmds mkdir -p $($(package)_extract_dir) && \ echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ echo "$($(package)_qttranslations_sha256_hash) $($(package)_source_dir)/$($(package)_qttranslations_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ echo "$($(package)_qttools_sha256_hash) $($(package)_source_dir)/$($(package)_qttools_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmakelists_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmake_qttoplevelhelpers_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ mkdir qtbase && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source) -C qtbase && \ mkdir qttranslations && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttranslations_file_name) -C qttranslations && \ mkdir qttools && \ - $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools + $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools && \ + cp $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version) ./$($(package)_top_cmakelists_file_name) && \ + mkdir cmake && \ + cp $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name) && \ + cp $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_qttoplevelhelpers_file_name) && \ + rm -rf qtbase/src/qtbase/tests/ && \ + rm -rf qtbase/src/qtbase/tools/ && \ + rm -rf qtbase/src/qtbase/examples/ endef +else +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmakelists_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_top_cmake_qttoplevelhelpers_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir qtbase && \ + $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source) -C qtbase && \ + cp $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version) ./$($(package)_top_cmakelists_file_name) && \ + mkdir cmake && \ + cp $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name) && \ + cp $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_qttoplevelhelpers_file_name) && \ + rm -rf qtbase/src/qtbase/tests/ && \ + rm -rf qtbase/src/qtbase/tools/ && \ + rm -rf qtbase/src/qtbase/examples/ +endef +endif -# Preprocessing steps work as follows: -# -# 1. Apply our patches to the extracted source. See each patch for more info. -# -# 2. Create a macOS-Clang-Linux mkspec using our mac-qmake.conf. -# -# 3. After making a copy of the mkspec for the linux-arm-gnueabi host, named -# bitcoin-linux-g++, replace tool names with $($($(package)_type)_TOOL). -# -# 4. Put our C, CXX and LD FLAGS into gcc-base.conf. Only used for non-host builds. -# -# 5. In clang.conf, swap out clang & clang++, for our compiler + flags. See #17466. define $(package)_preprocess_cmds - echo "Patching with $($(package)_patches)" && \ - [ -z "$GUIX_ENVIRONMENT" ] || patch -p1 < $($(package)_patch_dir)/guix-arm64-darwin-build.patch && \ - cp $($(package)_patch_dir)/qt.pro qt.pro && \ - cp $($(package)_patch_dir)/qttools_src.pro qttools/src/src.pro && \ - patch -p1 -i $($(package)_patch_dir)/fix-macos-linker.patch && \ patch -p1 -i $($(package)_patch_dir)/dont_hardcode_pwd.patch && \ - patch -p1 -i $($(package)_patch_dir)/fix_qt_pkgconfig.patch && \ - patch -p1 -i $($(package)_patch_dir)/fix_android_jni_static.patch && \ - patch -p1 -i $($(package)_patch_dir)/no-xlib.patch && \ patch -p1 -i $($(package)_patch_dir)/qtbase-moc-ignore-gcc-macro.patch && \ - patch -p1 -i $($(package)_patch_dir)/use_android_ndk23.patch && \ - patch -p1 -i $($(package)_patch_dir)/memory_resource.patch && \ - patch -p1 -i $($(package)_patch_dir)/rcc_hardcode_timestamp.patch && \ - patch -p1 -i $($(package)_patch_dir)/duplicate_lcqpafonts.patch && \ - patch -p1 -i $($(package)_patch_dir)/fast_fixed_dtoa_no_optimize.patch && \ - patch -p1 -i $($(package)_patch_dir)/guix_cross_lib_path.patch && \ - patch -p1 -i $($(package)_patch_dir)/windows_lto.patch && \ - patch -p1 -i $($(package)_patch_dir)/fix-libpng.patch && \ - mkdir -p qtbase/mkspecs/macx-clang-linux &&\ - cp -f qtbase/mkspecs/macx-clang/qplatformdefs.h qtbase/mkspecs/macx-clang-linux/ &&\ - cp -f $($(package)_patch_dir)/mac-qmake.conf qtbase/mkspecs/macx-clang-linux/qmake.conf && \ - cp -r qtbase/mkspecs/linux-arm-gnueabi-g++ qtbase/mkspecs/bitcoin-linux-g++ && \ - sed -i.old "s|arm-linux-gnueabi-gcc|$($($(package)_type)_CC)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-g++|$($($(package)_type)_CXX)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-ar|$($($(package)_type)_AR)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-objcopy|$($($(package)_type)_OBJCOPY)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-nm|$($($(package)_type)_NM)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - sed -i.old "s|arm-linux-gnueabi-strip|$($($(package)_type)_STRIP)|" qtbase/mkspecs/bitcoin-linux-g++/qmake.conf && \ - echo "!host_build: QMAKE_CFLAGS += $($(package)_cflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - echo "!host_build: QMAKE_CXXFLAGS += $($(package)_cxxflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - echo "!host_build: QMAKE_LFLAGS += $($(package)_ldflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ - sed -i.old "s|QMAKE_CC = \$$$$\$$$${CROSS_COMPILE}clang|QMAKE_CC = $($(package)_cc)|" qtbase/mkspecs/common/clang.conf && \ - sed -i.old "s|QMAKE_CXX = \$$$$\$$$${CROSS_COMPILE}clang++|QMAKE_CXX = $($(package)_cxx)|" qtbase/mkspecs/common/clang.conf + patch -p1 -i $($(package)_patch_dir)/qtbase_avoid_native_float16.patch && \ + patch -p1 -i $($(package)_patch_dir)/qtbase_avoid_qmain.patch && \ + patch -p1 -i $($(package)_patch_dir)/qtbase_platformsupport.patch && \ + patch -p1 -i $($(package)_patch_dir)/qtbase_plugins_cocoa.patch && \ + patch -p1 -i $($(package)_patch_dir)/qtbase_skip_tools.patch && \ + patch -p1 -i $($(package)_patch_dir)/rcc_hardcode_timestamp.patch endef - +ifeq ($(host),$(build)) + $(package)_preprocess_cmds += && patch -p1 -i $($(package)_patch_dir)/qttools_skip_dependencies.patch +endif define $(package)_config_cmds cd qtbase && \ - ./configure -top-level $($(package)_config_opts) + $($(package)_config_env) ./configure -top-level $($(package)_config_opts) -- $($(package)_cmake_opts) endef define $(package)_build_cmds - $(MAKE) + $($(package)_config_env) cmake --build . --parallel endef define $(package)_stage_cmds - $(MAKE) -C qtbase INSTALL_ROOT=$($(package)_staging_dir) install && \ - $(MAKE) -C qttools INSTALL_ROOT=$($(package)_staging_dir) install && \ - $(MAKE) -C qttranslations INSTALL_ROOT=$($(package)_staging_dir) install_subtargets + cmake --install . --prefix $($(package)_staging_prefix_dir) endef define $(package)_postprocess_cmds - rm -f lib/lib*.la + rm -rf doc/ endef diff --git a/depends/packages/qt_details.mk b/depends/packages/qt_details.mk new file mode 100644 index 0000000000..341448149e --- /dev/null +++ b/depends/packages/qt_details.mk @@ -0,0 +1,26 @@ +qt_details_version := 6.7.3 +qt_details_download_path := https://download.qt.io/archive/qt/6.7/$(qt_details_version)/submodules +qt_details_suffix := everywhere-src-$(qt_details_version).tar.xz + +qt_details_qtbase_file_name := qtbase-$(qt_details_suffix) +qt_details_qtbase_sha256_hash := 8ccbb9ab055205ac76632c9eeddd1ed6fc66936fc56afc2ed0fd5d9e23da3097 + +qt_details_qttranslations_file_name := qttranslations-$(qt_details_suffix) +qt_details_qttranslations_sha256_hash := dcc762acac043b9bb5e4d369b6d6f53e0ecfcf76a408fe0db5f7ef071c9d6dc8 + +qt_details_qttools_file_name := qttools-$(qt_details_suffix) +qt_details_qttools_sha256_hash := f03bb7df619cd9ac9dba110e30b7bcab5dd88eb8bdc9cc752563b4367233203f + +qt_details_patches_path := $(PATCHES_PATH)/qt + +qt_details_top_download_path := https://code.qt.io/cgit/qt/qt5.git/plain +qt_details_top_cmakelists_file_name := CMakeLists.txt +qt_details_top_cmakelists_download_file := $(qt_details_top_cmakelists_file_name)?h=$(qt_details_version) +qt_details_top_cmakelists_sha256_hash := 9fb720a633c0c0a21c31fe62a34bf617726fed72480d4064f29ca5d6973d513f +qt_details_top_cmake_download_path := $(qt_details_top_download_path)/cmake +qt_details_top_cmake_ecmoptionaladdsubdirectory_file_name := ECMOptionalAddSubdirectory.cmake +qt_details_top_cmake_ecmoptionaladdsubdirectory_download_file := $(qt_details_top_cmake_ecmoptionaladdsubdirectory_file_name)?h=$(qt_details_version) +qt_details_top_cmake_ecmoptionaladdsubdirectory_sha256_hash := 97ee8bbfcb0a4bdcc6c1af77e467a1da0c5b386c42be2aa97d840247af5f6f70 +qt_details_top_cmake_qttoplevelhelpers_file_name := QtTopLevelHelpers.cmake +qt_details_top_cmake_qttoplevelhelpers_download_file := $(qt_details_top_cmake_qttoplevelhelpers_file_name)?h=$(qt_details_version) +qt_details_top_cmake_qttoplevelhelpers_sha256_hash := 5ac2a7159ee27b5b86d26ecff44922e7b8f319aa847b7b5766dc17932fd4a294 diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk index 5aef066e52..5c6b33fddf 100644 --- a/depends/packages/zeromq.mk +++ b/depends/packages/zeromq.mk @@ -14,8 +14,7 @@ define $(package)_set_vars $(package)_config_opts_android=--with-pic $(package)_cxxflags=-std=c++17 ifdef GUIX_ENVIRONMENT -$(package)_config_env_x86_64_darwin = LIB_LIBRARY_BACKUP=$LIBRARY_PATH -$(package)_config_env_x86_64_darwin = LIBRARY_PATH="" +$(package)_config_env_x86_64_darwin = LIB_LIBRARY_BACKUP="$(LIBRARY_PATH)" LIBRARY_PATH="" endif endef diff --git a/depends/patches/native_qt/dont_hardcode_pwd.patch b/depends/patches/native_qt/dont_hardcode_pwd.patch new file mode 100644 index 0000000000..217b6bec15 --- /dev/null +++ b/depends/patches/native_qt/dont_hardcode_pwd.patch @@ -0,0 +1,51 @@ +Do not assume FHS in scripts + +On systems that do not follow the Filesystem Hierarchy Standard, such as +guix, the hardcoded `/bin/pwd` will fail to be found so that the script +will fail. + +Use `pwd`, instead, so that the command can be found through the normal +path search mechanism. + +See https://github.com/qt/qtbase/commit/3388de698bfb9bbc456c08f03e83bf3e749df35c. + +diff --git a/qtbase/configure b/qtbase/configure +index 08b49a8d..faea5b55 100755 +--- a/qtbase/configure ++++ b/qtbase/configure +@@ -9,9 +9,9 @@ + + # the directory of this script is the "source tree" + relpath=`dirname "$0"` +-relpath=`(cd "$relpath"; /bin/pwd)` ++relpath=`(cd "$relpath"; pwd)` + # the current directory is the "build tree" or "object tree" +-outpath=`/bin/pwd` ++outpath=`pwd` + outpathPrefix=$outpath + + # do this early so we don't store it in config.status + +--- a/qtbase/bin/qt-cmake.in ++++ b/qtbase/bin/qt-cmake.in +@@ -2,7 +2,7 @@ + + # The directory of this script is the expanded absolute path of the "$qt_prefix/bin" directory. + script_dir_path=`dirname $0` +-script_dir_path=`(cd "$script_dir_path"; /bin/pwd)` ++script_dir_path=`(cd "$script_dir_path"; pwd)` + + # Try to use original cmake, otherwise to make it relocatable, use any cmake found in PATH. + original_cmake_path="@CMAKE_COMMAND@" + +--- a/qtbase/bin/qt-configure-module.in ++++ b/qtbase/bin/qt-configure-module.in +@@ -2,7 +2,7 @@ + set -eu + + script_dir_path=`dirname $0` +-script_dir_path=`(cd "$script_dir_path"; /bin/pwd)` ++script_dir_path=`(cd "$script_dir_path"; pwd)` + + printUsage() + { diff --git a/depends/patches/native_qt/qtbase-moc-ignore-gcc-macro.patch b/depends/patches/native_qt/qtbase-moc-ignore-gcc-macro.patch new file mode 100644 index 0000000000..e5e7b126f6 --- /dev/null +++ b/depends/patches/native_qt/qtbase-moc-ignore-gcc-macro.patch @@ -0,0 +1,17 @@ +The moc executable loops through headers on CPLUS_INCLUDE_PATH and stumbles +on the GCC internal _GLIBCXX_VISIBILITY macro. Tell it to ignore it as it is +not supposed to be looking there to begin with. + +Upstream report: https://bugreports.qt.io/browse/QTBUG-83160 + +diff --git a/qtbase/src/tools/moc/main.cpp b/qtbase/src/tools/moc/main.cpp +--- a/qtbase/src/tools/moc/main.cpp ++++ b/qtbase/src/tools/moc/main.cpp +@@ -186,6 +186,7 @@ int runMoc(int argc, char **argv) + dummyVariadicFunctionMacro.arguments += Symbol(0, PP_IDENTIFIER, "__VA_ARGS__"); + pp.macros["__attribute__"] = dummyVariadicFunctionMacro; + pp.macros["__declspec"] = dummyVariadicFunctionMacro; ++ pp.macros["_GLIBCXX_VISIBILITY"] = dummyVariadicFunctionMacro; + + QString filename; + QString output; diff --git a/depends/patches/native_qt/qtbase_avoid_native_float16.patch b/depends/patches/native_qt/qtbase_avoid_native_float16.patch new file mode 100644 index 0000000000..ec03d140e3 --- /dev/null +++ b/depends/patches/native_qt/qtbase_avoid_native_float16.patch @@ -0,0 +1,37 @@ +Avoid using native float16 types in Qt's qfloat16 + +Using native float16 types may introduce compatibility issues +in release binaries for Linux platforms. + +See: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=e42d2d2a20f2bb59928bc895ec9f46503a1b5c73 + +This patch can be dropped once the minimum required libgcc version +is updated to 12.x or newer. + + +--- a/qtbase/src/corelib/global/qtypes.h ++++ b/qtbase/src/corelib/global/qtypes.h +@@ -258,23 +258,8 @@ using qsizetype = QIntegerForSizeof::Signed; + + // Define a native float16 type + namespace QtPrivate { +-#if defined(__STDCPP_FLOAT16_T__) +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = std::float16_t; +-#elif defined(Q_CC_CLANG) && defined(__FLT16_MAX__) && 0 +-// disabled due to https://github.com/llvm/llvm-project/issues/56963 +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = decltype(__FLT16_MAX__); +-#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__) && defined(__ARM_FP16_FORMAT_IEEE) +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = __fp16; +-#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__) && defined(__SSE2__) +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = _Float16; +-#else + # define QFLOAT16_IS_NATIVE 0 + using NativeFloat16Type = void; +-#endif + } // QtPrivate + + #endif // __cplusplus diff --git a/depends/patches/native_qt/qtbase_skip_tools.patch b/depends/patches/native_qt/qtbase_skip_tools.patch new file mode 100644 index 0000000000..bbd87e8689 --- /dev/null +++ b/depends/patches/native_qt/qtbase_skip_tools.patch @@ -0,0 +1,61 @@ +Skip building/installing unneeded tools: + +1. Wrapper CMake scripts. +2. CI support files. +3. tracepointgen and tracegen tools. +4. Qt Look Ahead LR Parser Generator (qlalr). +5. Qt Vulkan Header Generator (qvkgen). + + +--- a/qtbase/cmake/QtBaseGlobalTargets.cmake ++++ b/qtbase/cmake/QtBaseGlobalTargets.cmake +@@ -118,9 +118,6 @@ qt_generate_global_module_pri_file() + qt_generate_global_device_pri_file() + qt_generate_qmake_and_qtpaths_wrapper_for_target() + +-# Depends on the global features being evaluated. +-qt_internal_create_wrapper_scripts() +- + add_library(Qt::GlobalConfig ALIAS GlobalConfig) + + add_library(GlobalConfigPrivate INTERFACE) + +--- a/qtbase/cmake/QtBaseGlobalTargets.cmake ++++ b/qtbase/cmake/QtBaseGlobalTargets.cmake +@@ -349,12 +349,3 @@ elseif(WASM) + qt_install(PROGRAMS "${QT_BUILD_DIR}/${INSTALL_LIBEXECDIR}/qt-wasmtestrunner.py" + DESTINATION "${INSTALL_LIBEXECDIR}") + endif() +- +-# Install CI support files to libexec. +-qt_path_join(__qt_libexec_install_dir "${QT_INSTALL_DIR}" "${INSTALL_LIBEXECDIR}") +-qt_copy_or_install(FILES coin/instructions/qmake/ensure_pro_file.cmake +- DESTINATION "${__qt_libexec_install_dir}") +-qt_copy_or_install(PROGRAMS "util/testrunner/qt-testrunner.py" +- DESTINATION "${__qt_libexec_install_dir}") +-qt_copy_or_install(PROGRAMS "util/testrunner/sanitizer-testrunner.py" +- DESTINATION "${__qt_libexec_install_dir}") + + +--- a/qtbase/src/CMakeLists.txt ++++ b/qtbase/src/CMakeLists.txt +@@ -21,8 +21,6 @@ function(find_or_build_bootstrap_names) + endif() + add_subdirectory(tools/moc) + add_subdirectory(tools/rcc) +- add_subdirectory(tools/tracepointgen) +- add_subdirectory(tools/tracegen) + add_subdirectory(tools/cmake_automoc_parser) + endfunction() + +--- a/qtbase/src/tools/CMakeLists.txt ++++ b/qtbase/src/tools/CMakeLists.txt +@@ -11,8 +11,6 @@ if (QT_FEATURE_dbus) + add_subdirectory(qdbuscpp2xml) + add_subdirectory(qdbusxml2cpp) + endif() +-add_subdirectory(qlalr) +-add_subdirectory(qvkgen) + if (QT_FEATURE_commandlineparser) + add_subdirectory(qtpaths) + endif() diff --git a/depends/patches/native_qt/qttools_skip_dependencies.patch b/depends/patches/native_qt/qttools_skip_dependencies.patch new file mode 100644 index 0000000000..09f66f4497 --- /dev/null +++ b/depends/patches/native_qt/qttools_skip_dependencies.patch @@ -0,0 +1,36 @@ +QtTools: Skip unnecessary dependencies: + +1. The LLVM installatiion. +2. Build only required tools. + + +--- a/qttools/configure.cmake ++++ b/qttools/configure.cmake +@@ -17,7 +17,7 @@ + # Presumably because 6.0 ClangConfig.cmake files are not good enough? + # In any case explicitly request a minimum version of 8.x for now, otherwise + # building with CMake will fail at compilation time. +-qt_find_package(WrapLibClang 8 PROVIDED_TARGETS WrapLibClang::WrapLibClang) ++#qt_find_package(WrapLibClang 8 PROVIDED_TARGETS WrapLibClang::WrapLibClang) + # special case end + + if(TARGET WrapLibClang::WrapLibClang) + +--- a/qttools/src/linguist/CMakeLists.txt ++++ b/qttools/src/linguist/CMakeLists.txt +@@ -9,15 +9,8 @@ if(NOT QT_FEATURE_linguist) + return() + endif() + add_subdirectory(lconvert) +-add_subdirectory(lprodump) + add_subdirectory(lrelease) +-add_subdirectory(lrelease-pro) + add_subdirectory(lupdate) +-add_subdirectory(lupdate-pro) +-if(QT_FEATURE_process AND QT_FEATURE_pushbutton AND QT_FEATURE_toolbutton +- AND QT_FEATURE_png AND QT_FEATURE_printsupport AND TARGET Qt::Widgets) +- add_subdirectory(linguist) +-endif() + + # Create a fake module that would emulate the Qt5::LinguistTools CMake Config package + qt_internal_add_module(Linguist diff --git a/depends/patches/native_qt/rcc_hardcode_timestamp.patch b/depends/patches/native_qt/rcc_hardcode_timestamp.patch new file mode 100644 index 0000000000..e72f4bd037 --- /dev/null +++ b/depends/patches/native_qt/rcc_hardcode_timestamp.patch @@ -0,0 +1,24 @@ +Hardcode last modified timestamp in Qt RCC + +This change allows the already built qt package to be reused even with +the SOURCE_DATE_EPOCH variable set, e.g., for Guix builds. + + +--- old/qtbase/src/tools/rcc/rcc.cpp ++++ new/qtbase/src/tools/rcc/rcc.cpp +@@ -201,14 +201,7 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) + + if (lib.formatVersion() >= 2) { + // last modified time stamp +- const QDateTime lastModified = m_fileInfo.lastModified(QTimeZone::UTC); +- quint64 lastmod = quint64(lastModified.isValid() ? lastModified.toMSecsSinceEpoch() : 0); +- static const quint64 sourceDate = 1000 * qgetenv("QT_RCC_SOURCE_DATE_OVERRIDE").toULongLong(); +- if (sourceDate != 0) +- lastmod = sourceDate; +- static const quint64 sourceDate2 = 1000 * qgetenv("SOURCE_DATE_EPOCH").toULongLong(); +- if (sourceDate2 != 0) +- lastmod = sourceDate2; ++ quint64 lastmod = quint64(1); + lib.writeNumber8(lastmod); + if (text || pass1) + lib.writeChar('\n'); diff --git a/depends/patches/qt/dont_hardcode_pwd.patch b/depends/patches/qt/dont_hardcode_pwd.patch index a74e9cb098..217b6bec15 100644 --- a/depends/patches/qt/dont_hardcode_pwd.patch +++ b/depends/patches/qt/dont_hardcode_pwd.patch @@ -1,27 +1,51 @@ -commit 0e953866fc4672486e29e1ba6d83b4207e7b2f0b -Author: fanquake -Date: Tue Aug 18 15:09:06 2020 +0800 +Do not assume FHS in scripts - Don't hardcode pwd path +On systems that do not follow the Filesystem Hierarchy Standard, such as +guix, the hardcoded `/bin/pwd` will fail to be found so that the script +will fail. - Let a man use his builtins if he wants to! Also, removes the unnecessary - assumption that pwd lives under /bin/pwd. +Use `pwd`, instead, so that the command can be found through the normal +path search mechanism. - See #15581. +See https://github.com/qt/qtbase/commit/3388de698bfb9bbc456c08f03e83bf3e749df35c. diff --git a/qtbase/configure b/qtbase/configure index 08b49a8d..faea5b55 100755 --- a/qtbase/configure +++ b/qtbase/configure -@@ -36,9 +36,9 @@ - relconf=`basename $0` +@@ -9,9 +9,9 @@ + # the directory of this script is the "source tree" - relpath=`dirname $0` + relpath=`dirname "$0"` -relpath=`(cd "$relpath"; /bin/pwd)` +relpath=`(cd "$relpath"; pwd)` # the current directory is the "build tree" or "object tree" -outpath=`/bin/pwd` +outpath=`pwd` + outpathPrefix=$outpath + + # do this early so we don't store it in config.status - WHICH="which" +--- a/qtbase/bin/qt-cmake.in ++++ b/qtbase/bin/qt-cmake.in +@@ -2,7 +2,7 @@ + + # The directory of this script is the expanded absolute path of the "$qt_prefix/bin" directory. + script_dir_path=`dirname $0` +-script_dir_path=`(cd "$script_dir_path"; /bin/pwd)` ++script_dir_path=`(cd "$script_dir_path"; pwd)` + + # Try to use original cmake, otherwise to make it relocatable, use any cmake found in PATH. + original_cmake_path="@CMAKE_COMMAND@" +--- a/qtbase/bin/qt-configure-module.in ++++ b/qtbase/bin/qt-configure-module.in +@@ -2,7 +2,7 @@ + set -eu + + script_dir_path=`dirname $0` +-script_dir_path=`(cd "$script_dir_path"; /bin/pwd)` ++script_dir_path=`(cd "$script_dir_path"; pwd)` + + printUsage() + { diff --git a/depends/patches/qt/memory_resource.patch b/depends/patches/qt/memory_resource.patch index 650c328528..14e25121c0 100644 --- a/depends/patches/qt/memory_resource.patch +++ b/depends/patches/qt/memory_resource.patch @@ -14,36 +14,3 @@ and https://bugreports.qt.io/browse/QTBUG-114316 # include # include #else - ---- a/qtbase/src/corelib/global/qcompilerdetection.h -+++ b/qtbase/src/corelib/global/qcompilerdetection.h -@@ -1050,16 +1050,22 @@ - # endif // !_HAS_CONSTEXPR - # endif // !__GLIBCXX__ && !_LIBCPP_VERSION - # endif // Q_OS_QNX --# if (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) && defined(__GNUC_LIBSTD__) \ -- && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402) -+# if (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) -+# if defined(__GNUC_LIBSTD__) && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402) - // Apple has not updated libstdc++ since 2007, which means it does not have - // or std::move. Let's disable these features --# undef Q_COMPILER_INITIALIZER_LISTS --# undef Q_COMPILER_RVALUE_REFS --# undef Q_COMPILER_REF_QUALIFIERS -+# undef Q_COMPILER_INITIALIZER_LISTS -+# undef Q_COMPILER_RVALUE_REFS -+# undef Q_COMPILER_REF_QUALIFIERS - // Also disable , since it's clearly not there --# undef Q_COMPILER_ATOMICS --# endif -+# undef Q_COMPILER_ATOMICS -+# endif -+# if defined(__cpp_lib_memory_resource) \ -+ && ((defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 140000) \ -+ || (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 170000)) -+# undef __cpp_lib_memory_resource // Only supported on macOS 14 and iOS 17 -+# endif -+# endif // (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) - # if defined(Q_CC_CLANG) && defined(Q_CC_INTEL) && Q_CC_INTEL >= 1500 - // ICC 15.x and 16.0 have their own implementation of std::atomic, which is activated when in Clang mode - // (probably because libc++'s on OS X failed to compile), but they're missing some diff --git a/depends/patches/qt/qtbase-moc-ignore-gcc-macro.patch b/depends/patches/qt/qtbase-moc-ignore-gcc-macro.patch index f0c14a9400..e5e7b126f6 100644 --- a/depends/patches/qt/qtbase-moc-ignore-gcc-macro.patch +++ b/depends/patches/qt/qtbase-moc-ignore-gcc-macro.patch @@ -7,7 +7,7 @@ Upstream report: https://bugreports.qt.io/browse/QTBUG-83160 diff --git a/qtbase/src/tools/moc/main.cpp b/qtbase/src/tools/moc/main.cpp --- a/qtbase/src/tools/moc/main.cpp +++ b/qtbase/src/tools/moc/main.cpp -@@ -238,6 +238,7 @@ int runMoc(int argc, char **argv) +@@ -186,6 +186,7 @@ int runMoc(int argc, char **argv) dummyVariadicFunctionMacro.arguments += Symbol(0, PP_IDENTIFIER, "__VA_ARGS__"); pp.macros["__attribute__"] = dummyVariadicFunctionMacro; pp.macros["__declspec"] = dummyVariadicFunctionMacro; diff --git a/depends/patches/qt/qtbase_avoid_native_float16.patch b/depends/patches/qt/qtbase_avoid_native_float16.patch new file mode 100644 index 0000000000..ec03d140e3 --- /dev/null +++ b/depends/patches/qt/qtbase_avoid_native_float16.patch @@ -0,0 +1,37 @@ +Avoid using native float16 types in Qt's qfloat16 + +Using native float16 types may introduce compatibility issues +in release binaries for Linux platforms. + +See: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=e42d2d2a20f2bb59928bc895ec9f46503a1b5c73 + +This patch can be dropped once the minimum required libgcc version +is updated to 12.x or newer. + + +--- a/qtbase/src/corelib/global/qtypes.h ++++ b/qtbase/src/corelib/global/qtypes.h +@@ -258,23 +258,8 @@ using qsizetype = QIntegerForSizeof::Signed; + + // Define a native float16 type + namespace QtPrivate { +-#if defined(__STDCPP_FLOAT16_T__) +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = std::float16_t; +-#elif defined(Q_CC_CLANG) && defined(__FLT16_MAX__) && 0 +-// disabled due to https://github.com/llvm/llvm-project/issues/56963 +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = decltype(__FLT16_MAX__); +-#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__) && defined(__ARM_FP16_FORMAT_IEEE) +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = __fp16; +-#elif defined(Q_CC_GNU_ONLY) && defined(__FLT16_MAX__) && defined(__SSE2__) +-# define QFLOAT16_IS_NATIVE 1 +-using NativeFloat16Type = _Float16; +-#else + # define QFLOAT16_IS_NATIVE 0 + using NativeFloat16Type = void; +-#endif + } // QtPrivate + + #endif // __cplusplus diff --git a/depends/patches/qt/qtbase_avoid_qmain.patch b/depends/patches/qt/qtbase_avoid_qmain.patch new file mode 100644 index 0000000000..45a54fe881 --- /dev/null +++ b/depends/patches/qt/qtbase_avoid_qmain.patch @@ -0,0 +1,21 @@ +Avoid defining QT_NEEDS_QMAIN macro + +Qt's QT_NEEDS_QMAIN macro renames our main() function to qMain(), +which breaks our assumptions regarding exported symbols. In particular, +the CONTROL_FLOW security check fails for Windows builds in Guix. + +The QT_NEEDS_QMAIN macro is required for linking to the Qt DLLs only, +so we can safely disable it. + + +--- a/qtbase/src/entrypoint/CMakeLists.txt ++++ b/qtbase/src/entrypoint/CMakeLists.txt +@@ -104,8 +104,6 @@ if(WIN32) + APPEND PROPERTY INTERFACE_QT_MODULE_LDFLAGS "-lmingw32" + ) + +- target_compile_definitions(EntryPointPrivate INTERFACE QT_NEEDS_QMAIN) +- qt_internal_extend_target(EntryPointImplementation DEFINES QT_NEEDS_QMAIN) + endif() + + qt_internal_add_sync_header_dependencies(EntryPointImplementation Core) diff --git a/depends/patches/qt/qtbase_platformsupport.patch b/depends/patches/qt/qtbase_platformsupport.patch new file mode 100644 index 0000000000..45ccaea53a --- /dev/null +++ b/depends/patches/qt/qtbase_platformsupport.patch @@ -0,0 +1,34 @@ +CMake: Prevent creation of empty InputSupportPrivate module + +The combination of + -no-feature-evdev + -no-feature-tslib + -no-feature-libinput +led to the creation of the InputSupportPrivate module without source +files. + +This triggered CMake upstream issue 23464 when using CMake < 3.25. + +Fix this by adjusting the inexact condition that decides whether to +build InputSupportPrivate. + + +See: https://codereview.qt-project.org/c/qt/qtbase/+/633612 + + +--- a/qtbase/src/platformsupport/CMakeLists.txt ++++ b/qtbase/src/platformsupport/CMakeLists.txt +@@ -3,7 +3,12 @@ + + add_subdirectory(devicediscovery) + add_subdirectory(fbconvenience) +-if(QT_FEATURE_evdev OR QT_FEATURE_integrityhid OR QT_FEATURE_libinput OR QT_FEATURE_tslib OR QT_FEATURE_xkbcommon) ++if(QT_FEATURE_evdev ++ OR QT_FEATURE_vxworksevdev ++ OR QT_FEATURE_integrityhid ++ OR QT_FEATURE_libinput ++ OR QT_FEATURE_tslib ++ OR (QT_FEATURE_libinput AND QT_FEATURE_xkbcommon)) + add_subdirectory(input) + endif() + if(QT_FEATURE_kms) diff --git a/depends/patches/qt/qtbase_plugins_cocoa.patch b/depends/patches/qt/qtbase_plugins_cocoa.patch new file mode 100644 index 0000000000..118a72d66e --- /dev/null +++ b/depends/patches/qt/qtbase_plugins_cocoa.patch @@ -0,0 +1,21 @@ +CMake: Fix macOS -no-feature-sessionmanager build with CMake < 3.25 + +Work around CMake issue 23464. + + +See: https://codereview.qt-project.org/c/qt/qtbase/+/634002 + + +--- a/qtbase/src/plugins/platforms/cocoa/CMakeLists.txt ++++ b/qtbase/src/plugins/platforms/cocoa/CMakeLists.txt +@@ -102,3 +102,10 @@ qt_internal_extend_target(QCocoaIntegrationPlugin CONDITION QT_FEATURE_sessionma + SOURCES + qcocoasessionmanager.cpp qcocoasessionmanager.h + ) ++ ++# Work around CMake issue 23464 ++if(CMAKE_VERSION VERSION_LESS "3.25" AND NOT QT_FEATURE_sessionmanager) ++ set_target_properties(QCocoaIntegrationPlugin PROPERTIES ++ DISABLE_PRECOMPILE_HEADERS ON ++ ) ++endif() diff --git a/depends/patches/qt/qtbase_skip_tools.patch b/depends/patches/qt/qtbase_skip_tools.patch new file mode 100644 index 0000000000..bbd87e8689 --- /dev/null +++ b/depends/patches/qt/qtbase_skip_tools.patch @@ -0,0 +1,61 @@ +Skip building/installing unneeded tools: + +1. Wrapper CMake scripts. +2. CI support files. +3. tracepointgen and tracegen tools. +4. Qt Look Ahead LR Parser Generator (qlalr). +5. Qt Vulkan Header Generator (qvkgen). + + +--- a/qtbase/cmake/QtBaseGlobalTargets.cmake ++++ b/qtbase/cmake/QtBaseGlobalTargets.cmake +@@ -118,9 +118,6 @@ qt_generate_global_module_pri_file() + qt_generate_global_device_pri_file() + qt_generate_qmake_and_qtpaths_wrapper_for_target() + +-# Depends on the global features being evaluated. +-qt_internal_create_wrapper_scripts() +- + add_library(Qt::GlobalConfig ALIAS GlobalConfig) + + add_library(GlobalConfigPrivate INTERFACE) + +--- a/qtbase/cmake/QtBaseGlobalTargets.cmake ++++ b/qtbase/cmake/QtBaseGlobalTargets.cmake +@@ -349,12 +349,3 @@ elseif(WASM) + qt_install(PROGRAMS "${QT_BUILD_DIR}/${INSTALL_LIBEXECDIR}/qt-wasmtestrunner.py" + DESTINATION "${INSTALL_LIBEXECDIR}") + endif() +- +-# Install CI support files to libexec. +-qt_path_join(__qt_libexec_install_dir "${QT_INSTALL_DIR}" "${INSTALL_LIBEXECDIR}") +-qt_copy_or_install(FILES coin/instructions/qmake/ensure_pro_file.cmake +- DESTINATION "${__qt_libexec_install_dir}") +-qt_copy_or_install(PROGRAMS "util/testrunner/qt-testrunner.py" +- DESTINATION "${__qt_libexec_install_dir}") +-qt_copy_or_install(PROGRAMS "util/testrunner/sanitizer-testrunner.py" +- DESTINATION "${__qt_libexec_install_dir}") + + +--- a/qtbase/src/CMakeLists.txt ++++ b/qtbase/src/CMakeLists.txt +@@ -21,8 +21,6 @@ function(find_or_build_bootstrap_names) + endif() + add_subdirectory(tools/moc) + add_subdirectory(tools/rcc) +- add_subdirectory(tools/tracepointgen) +- add_subdirectory(tools/tracegen) + add_subdirectory(tools/cmake_automoc_parser) + endfunction() + +--- a/qtbase/src/tools/CMakeLists.txt ++++ b/qtbase/src/tools/CMakeLists.txt +@@ -11,8 +11,6 @@ if (QT_FEATURE_dbus) + add_subdirectory(qdbuscpp2xml) + add_subdirectory(qdbusxml2cpp) + endif() +-add_subdirectory(qlalr) +-add_subdirectory(qvkgen) + if (QT_FEATURE_commandlineparser) + add_subdirectory(qtpaths) + endif() diff --git a/depends/patches/qt/qttools_skip_dependencies.patch b/depends/patches/qt/qttools_skip_dependencies.patch new file mode 100644 index 0000000000..09f66f4497 --- /dev/null +++ b/depends/patches/qt/qttools_skip_dependencies.patch @@ -0,0 +1,36 @@ +QtTools: Skip unnecessary dependencies: + +1. The LLVM installatiion. +2. Build only required tools. + + +--- a/qttools/configure.cmake ++++ b/qttools/configure.cmake +@@ -17,7 +17,7 @@ + # Presumably because 6.0 ClangConfig.cmake files are not good enough? + # In any case explicitly request a minimum version of 8.x for now, otherwise + # building with CMake will fail at compilation time. +-qt_find_package(WrapLibClang 8 PROVIDED_TARGETS WrapLibClang::WrapLibClang) ++#qt_find_package(WrapLibClang 8 PROVIDED_TARGETS WrapLibClang::WrapLibClang) + # special case end + + if(TARGET WrapLibClang::WrapLibClang) + +--- a/qttools/src/linguist/CMakeLists.txt ++++ b/qttools/src/linguist/CMakeLists.txt +@@ -9,15 +9,8 @@ if(NOT QT_FEATURE_linguist) + return() + endif() + add_subdirectory(lconvert) +-add_subdirectory(lprodump) + add_subdirectory(lrelease) +-add_subdirectory(lrelease-pro) + add_subdirectory(lupdate) +-add_subdirectory(lupdate-pro) +-if(QT_FEATURE_process AND QT_FEATURE_pushbutton AND QT_FEATURE_toolbutton +- AND QT_FEATURE_png AND QT_FEATURE_printsupport AND TARGET Qt::Widgets) +- add_subdirectory(linguist) +-endif() + + # Create a fake module that would emulate the Qt5::LinguistTools CMake Config package + qt_internal_add_module(Linguist diff --git a/depends/patches/qt/rcc_hardcode_timestamp.patch b/depends/patches/qt/rcc_hardcode_timestamp.patch index 03f3897975..e72f4bd037 100644 --- a/depends/patches/qt/rcc_hardcode_timestamp.patch +++ b/depends/patches/qt/rcc_hardcode_timestamp.patch @@ -6,11 +6,11 @@ the SOURCE_DATE_EPOCH variable set, e.g., for Guix builds. --- old/qtbase/src/tools/rcc/rcc.cpp +++ new/qtbase/src/tools/rcc/rcc.cpp -@@ -227,14 +227,7 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) +@@ -201,14 +201,7 @@ void RCCFileInfo::writeDataInfo(RCCResourceLibrary &lib) if (lib.formatVersion() >= 2) { // last modified time stamp -- const QDateTime lastModified = m_fileInfo.lastModified(); +- const QDateTime lastModified = m_fileInfo.lastModified(QTimeZone::UTC); - quint64 lastmod = quint64(lastModified.isValid() ? lastModified.toMSecsSinceEpoch() : 0); - static const quint64 sourceDate = 1000 * qgetenv("QT_RCC_SOURCE_DATE_OVERRIDE").toULongLong(); - if (sourceDate != 0) diff --git a/depends/toolchain.cmake.in b/depends/toolchain.cmake.in index df84362aad..781dcad665 100644 --- a/depends/toolchain.cmake.in +++ b/depends/toolchain.cmake.in @@ -13,6 +13,10 @@ if(@depends_crosscompiling@) set(CMAKE_SYSTEM_NAME @host_system_name@) set(CMAKE_SYSTEM_VERSION @host_system_version@) set(CMAKE_SYSTEM_PROCESSOR @host_arch@) + + set(CMAKE_C_COMPILER_TARGET @host@) + set(CMAKE_CXX_COMPILER_TARGET @host@) + set(CMAKE_OBJCXX_COMPILER_TARGET @host@) endif() if(NOT DEFINED CMAKE_C_FLAGS_INIT) @@ -96,14 +100,17 @@ set(CMAKE_OBJDUMP "@OBJDUMP@") # affected by a potentially random environment. set(CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH OFF) -set(CMAKE_FIND_ROOT_PATH "@depends_prefix@") -list(APPEND CMAKE_PREFIX_PATH "${CMAKE_FIND_ROOT_PATH};${CMAKE_FIND_ROOT_PATH}/lib/") +set(CMAKE_FIND_ROOT_PATH "${CMAKE_CURRENT_LIST_DIR}") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) -set(QT_TRANSLATIONS_DIR "@depends_prefix@/translations") -set(Qt5_DIR "${CMAKE_FIND_ROOT_PATH}/lib/cmake/Qt5" CACHE PATH "Path to Qt5 CMake configuration files" FORCE) +set(QT_TRANSLATIONS_DIR "${CMAKE_CURRENT_LIST_DIR}/translations") + +# Make sure we only append once, as this file may be called repeatedly. +if(NOT "/" IN_LIST CMAKE_PREFIX_PATH) + list(APPEND CMAKE_PREFIX_PATH "/") +endif() if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_HOST_APPLE) # The find_package(Qt ...) function internally uses find_library() @@ -113,35 +120,50 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_HOST_APPLE) set(CMAKE_FRAMEWORK_PATH "@OSX_SDK@/System/Library/Frameworks") endif() + +if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|FreeBSD|Windows)$") + # Customize pkg-config behavior for finding dependencies + # of the xcb QPA platform plugin: + # 1. Restrict search paths to the depends. + # 2. Make output suitable for static linking. + cmake_path(APPEND CMAKE_CURRENT_LIST_DIR "lib" "pkgconfig" OUTPUT_VARIABLE pkg_config_path) + set(ENV{PKG_CONFIG_PATH} ${pkg_config_path}) + set(ENV{PKG_CONFIG_LIBDIR} ${pkg_config_path}) + unset(pkg_config_path) + set(PKG_CONFIG_ARGN --static) +endif() + + # Set configuration options for the main build system. -set(qt_packages @qt_packages@) -if("${qt_packages}" STREQUAL "") +# The depends/Makefile can generate values with "not-set" +# semantics as empty strings or strings containing only spaces. +# Therefore, MATCHES must be used rather than STREQUAL. +if("@qt_packages@" MATCHES "^[ ]*$") set(BUILD_GUI OFF CACHE BOOL "") else() set(BUILD_GUI ON CACHE BOOL "") + set(Qt6_ROOT "${CMAKE_CURRENT_LIST_DIR}" CACHE PATH "") endif() -set(qrencode_packages @qrencode_packages@) -if("${qrencode_packages}" STREQUAL "") +if("@qrencode_packages@" MATCHES "^[ ]*$") set(WITH_QRENCODE OFF CACHE BOOL "") else() set(WITH_QRENCODE ON CACHE BOOL "") endif() -set(zmq_packages @zmq_packages@) -if("${zmq_packages}" STREQUAL "") +if("@zmq_packages@" MATCHES "^[ ]*$") set(WITH_ZMQ OFF CACHE BOOL "") else() set(WITH_ZMQ ON CACHE BOOL "") endif() -set(wallet_packages @wallet_packages@) -if("${wallet_packages}" STREQUAL "") +if("@wallet_packages@" MATCHES "^[ ]*$") set(ENABLE_WALLET OFF CACHE BOOL "") else() set(ENABLE_WALLET ON CACHE BOOL "") endif() +set(wallet_packages @wallet_packages@) set(bdb_packages @bdb_packages@) if("${wallet_packages}" STREQUAL "" OR "${bdb_packages}" STREQUAL "") set(WITH_BDB OFF CACHE BOOL "") @@ -149,8 +171,7 @@ else() set(WITH_BDB ON CACHE BOOL "") endif() -set(usdt_packages @usdt_packages@) -if("${usdt_packages}" STREQUAL "") +if("@usdt_packages@" MATCHES "^[ ]*$") set(WITH_USDT OFF CACHE BOOL "") else() set(WITH_USDT ON CACHE BOOL "") diff --git a/doc/build-unix.md b/doc/build-unix.md index 41ed3733a8..2677b0dc8a 100644 --- a/doc/build-unix.md +++ b/doc/build-unix.md @@ -92,7 +92,7 @@ Optional: To build with Qt 5 (recommended) you need the following: - sudo dnf install qt5-qttools-devel qt5-qtbase-devel xz bison + sudo dnf install qt6-qttools-devel qt6-qtbase-devel xz bison sudo ln /usr/bin/bison /usr/bin/yacc diff --git a/src/crypto/MerkleTreeProof/blake2/blake2.h b/src/crypto/MerkleTreeProof/blake2/blake2.h index 9a1fa624a0..a85c4212c6 100644 --- a/src/crypto/MerkleTreeProof/blake2/blake2.h +++ b/src/crypto/MerkleTreeProof/blake2/blake2.h @@ -1,3 +1,14 @@ +#define blake2b_state firo_blake2b_state +#define blake2b_param firo_blake2b_param +#define blake2b_init firo_blake2b_init +#define blake2b_init_key firo_blake2b_init_key +#define blake2b_init_param firo_blake2b_init_param +#define blake2b_update firo_blake2b_update +#define blake2b_final firo_blake2b_final +#define blake2b blake2b_firo +#define blake2b_long blake2b_long_firo +#define blake2b_4r_update blake2b_4r_update_firo +#define blake2b_4r_final blake2b_4r_final_firo /* * Argon2 reference source code package - reference C implementations * diff --git a/src/crypto/MerkleTreeProof/blake2/blake2b.c b/src/crypto/MerkleTreeProof/blake2/blake2b.c index 4783cf725b..1a1f954588 100644 --- a/src/crypto/MerkleTreeProof/blake2/blake2b.c +++ b/src/crypto/MerkleTreeProof/blake2/blake2b.c @@ -1,3 +1,14 @@ +#define blake2b_state firo_blake2b_state +#define blake2b_param firo_blake2b_param +#define blake2b_init firo_blake2b_init +#define blake2b_init_key firo_blake2b_init_key +#define blake2b_init_param firo_blake2b_init_param +#define blake2b_update firo_blake2b_update +#define blake2b_final firo_blake2b_final +#define blake2b blake2b_firo +#define blake2b_long blake2b_long_firo +#define blake2b_4r_update blake2b_4r_update_firo +#define blake2b_4r_final blake2b_4r_final_firo /* * Argon2 reference source code package - reference C implementations * diff --git a/src/init.cpp b/src/init.cpp index f2b5cd8fff..94cc400ab1 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -43,6 +43,7 @@ #include "mtpstate.h" #include "batchproof_container.h" #include +#include "leveldb/env.h" #ifdef ENABLE_WALLET #include "wallet/wallet.h" @@ -341,6 +342,7 @@ void Shutdown() #endif globalVerifyHandle.reset(); ECC_Stop(); + leveldb::Env::Default()->Shutdown(); LogPrintf("%s: done\n", __func__); } diff --git a/src/leveldb/include/leveldb/env.h b/src/leveldb/include/leveldb/env.h index 96c21b3966..8571817a57 100644 --- a/src/leveldb/include/leveldb/env.h +++ b/src/leveldb/include/leveldb/env.h @@ -187,6 +187,9 @@ class LEVELDB_EXPORT Env { // Sleep/delay the thread for the prescribed number of micro-seconds. virtual void SleepForMicroseconds(int micros) = 0; + + // Request the background threads to shut down. + virtual void Shutdown(); }; // A file abstraction for reading sequentially through a file diff --git a/src/leveldb/util/env.cc b/src/leveldb/util/env.cc index d2f0aef326..8c56e03ea5 100644 --- a/src/leveldb/util/env.cc +++ b/src/leveldb/util/env.cc @@ -87,6 +87,8 @@ Status ReadFileToString(Env* env, const std::string& fname, std::string* data) { return s; } +void Env::Shutdown() {} + EnvWrapper::~EnvWrapper() {} } // namespace leveldb diff --git a/src/leveldb/util/env_posix.cc b/src/leveldb/util/env_posix.cc index fac41be6ce..689edda5bf 100644 --- a/src/leveldb/util/env_posix.cc +++ b/src/leveldb/util/env_posix.cc @@ -729,6 +729,11 @@ class PosixEnv : public Env { std::this_thread::sleep_for(std::chrono::microseconds(micros)); } + void Shutdown() override { + shutdown_requested_ = true; + background_work_cv_.SignalAll(); + } + private: void BackgroundThreadMain(); @@ -760,6 +765,7 @@ class PosixEnv : public Env { PosixLockTable locks_; // Thread-safe. Limiter mmap_limiter_; // Thread-safe. Limiter fd_limiter_; // Thread-safe. + std::atomic shutdown_requested_{false}; }; // Return the maximum number of concurrent mmaps. @@ -818,6 +824,10 @@ void PosixEnv::BackgroundThreadMain() { // Wait until there is work to be done. while (background_work_queue_.empty()) { + if (shutdown_requested_) { + background_work_mutex_.Unlock(); + return; + } background_work_cv_.Wait(); } diff --git a/src/leveldb/util/env_windows.cc b/src/leveldb/util/env_windows.cc index aafcdcc3be..cf3a3cfe42 100644 --- a/src/leveldb/util/env_windows.cc +++ b/src/leveldb/util/env_windows.cc @@ -677,6 +677,11 @@ class WindowsEnv : public Env { std::this_thread::sleep_for(std::chrono::microseconds(micros)); } + void Shutdown() override { + shutdown_requested_ = true; + background_work_cv_.SignalAll(); + } + private: void BackgroundThreadMain(); @@ -701,6 +706,7 @@ class WindowsEnv : public Env { port::Mutex background_work_mutex_; port::CondVar background_work_cv_ GUARDED_BY(background_work_mutex_); bool started_background_thread_ GUARDED_BY(background_work_mutex_); + std::atomic shutdown_requested_{false}; std::queue background_work_queue_ GUARDED_BY(background_work_mutex_); @@ -768,6 +774,10 @@ void WindowsEnv::BackgroundThreadMain() { // Wait until there is work to be done. while (background_work_queue_.empty()) { + if (shutdown_requested_) { + background_work_mutex_.Unlock(); + return; + } background_work_cv_.Wait(); } diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index c251df1031..597d9e0d85 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -11,21 +11,35 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") string(APPEND CMAKE_OBJCXX_COMPILE_OBJECT " ${APPEND_CPPFLAGS} ${APPEND_CXXFLAGS}") endif() -get_target_property(qt_lib_type Qt5::Core TYPE) +get_target_property(qt_lib_type Qt6::Core TYPE) function(import_plugins target) if(qt_lib_type STREQUAL "STATIC_LIBRARY") - set(plugins Qt5::QMinimalIntegrationPlugin) - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND plugins Qt5::QXcbIntegrationPlugin) + set(plugins Qt6::QMinimalIntegrationPlugin) + if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|FreeBSD)$") + list(APPEND plugins Qt6::QXcbIntegrationPlugin) elseif(WIN32) - list(APPEND plugins Qt5::QWindowsIntegrationPlugin Qt5::QWindowsVistaStylePlugin) + list(APPEND plugins Qt6::QWindowsIntegrationPlugin Qt6::QModernWindowsStylePlugin) elseif(APPLE) - list(APPEND plugins Qt5::QCocoaIntegrationPlugin Qt5::QMacStylePlugin) + list(APPEND plugins Qt6::QCocoaIntegrationPlugin Qt6::QMacStylePlugin) endif() - qt5_import_plugins(${target} + qt6_import_plugins(${target} INCLUDE ${plugins} - EXCLUDE_BY_TYPE imageformats iconengines + EXCLUDE_BY_TYPE + accessiblebridge + platforms + platforms_darwin + xcbglintegrations + platformthemes + platforminputcontexts + generic + iconengines + imageformats + egldeviceintegrations + styles + networkaccess + networkinformation + tls ) endif() endfunction() @@ -40,16 +54,27 @@ set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOUIC_SEARCH_PATHS forms) -# TODO: The file(GLOB ...) command should be replaced with an explicit -# file list. Such a change must be synced with the corresponding change -# to https://github.com/bitcoin-core/bitcoin-maintainer-tools/blob/main/update-translations.py -file(GLOB ts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} locale/*.ts) -set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/locale) -qt5_add_translation(qm_files ${ts_files}) +# Generate QM files from TS files +file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/locale/*.ts") +set(LOCALE_BUILD_DIR "${CMAKE_BINARY_DIR}/src/qt/locale") +file(MAKE_DIRECTORY ${LOCALE_BUILD_DIR}) +foreach(TS_FILE ${TS_FILES}) + get_filename_component(TS_NAME ${TS_FILE} NAME_WE) + set(QM_FILE "${LOCALE_BUILD_DIR}/${TS_NAME}.qm") + add_custom_command( + OUTPUT ${QM_FILE} + COMMAND Qt6::lrelease ${TS_FILE} -qm ${QM_FILE} + DEPENDS ${TS_FILE} + COMMENT "Generating ${TS_NAME}.qm in build directory" + ) + list(APPEND QM_FILES ${QM_FILE}) +endforeach() + +add_custom_target(translations ALL DEPENDS ${QM_FILES}) configure_file(bitcoin_locale.qrc bitcoin_locale.qrc USE_SOURCE_PERMISSIONS COPYONLY) -# The firoqt sources have to include headers in +# The bitcoinqt sources have to include headers in # order to parse them to collect translatable strings. add_library(firoqt STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/bitcoin.qrc @@ -144,8 +169,8 @@ target_link_libraries(firoqt secp256k1 univalue secp256k1pp - Qt5::Widgets - Qt5::Network + Qt6::Widgets + Qt6::Network PRIVATE core_interface firo_cli @@ -162,6 +187,9 @@ target_link_libraries(firoqt $<$:windows_system> ) +# Make sure translations are built before firoqt +add_dependencies(firoqt translations) + if(ENABLE_WALLET) target_sources(firoqt PRIVATE @@ -202,19 +230,34 @@ if(ENABLE_WALLET) target_link_libraries(firoqt PRIVATE firo_wallet - Qt5::Network + Qt6::Network ) endif() if(WITH_DBUS AND NOT MINGW) - target_link_libraries(firoqt PRIVATE Qt5::DBus) + target_link_libraries(firoqt PRIVATE Qt6::DBus) endif() if(qt_lib_type STREQUAL "STATIC_LIBRARY") # We want to define static plugins to link ourselves, thus preventing # automatic linking against a "sane" set of default static plugins. - qt5_import_plugins(firoqt - EXCLUDE_BY_TYPE bearer iconengines imageformats platforms styles + qt6_import_plugins(firoqt + EXCLUDE_BY_TYPE + bearer + accessiblebridge + platforms + platforms_darwin + xcbglintegrations + platformthemes + platforminputcontexts + generic + iconengines + imageformats + egldeviceintegrations + styles + networkaccess + networkinformation + tls ) endif() @@ -227,8 +270,7 @@ target_link_libraries(firo-qt PUBLIC core_interface firoqt - Qt5::Widgets - Qt5::Dependencies + Qt6::Widgets firo_node firo_cli univalue @@ -305,36 +347,37 @@ endif() # Gets sources to be parsed to gather translatable strings. function(get_translatable_sources var) set(result) - set(targets) foreach(dir IN ITEMS ${ARGN}) - get_directory_property(dir_targets DIRECTORY ${PROJECT_SOURCE_DIR}/${dir} BUILDSYSTEM_TARGETS) - list(APPEND targets ${dir_targets}) - endforeach() - foreach(target IN LISTS targets) - get_target_property(target_sources ${target} SOURCES) - if(target_sources) - foreach(source IN LISTS target_sources) - # Get an expression from the generator expression, if any. - if(source MATCHES ":([^>]+)>$") - set(source ${CMAKE_MATCH_1}) - endif() - cmake_path(GET source EXTENSION LAST_ONLY ext) - if(ext STREQUAL ".qrc") - continue() - endif() - if(NOT IS_ABSOLUTE source) - get_target_property(target_source_dir ${target} SOURCE_DIR) - cmake_path(APPEND target_source_dir ${source} OUTPUT_VARIABLE source) - endif() - get_property(is_generated - SOURCE ${source} TARGET_DIRECTORY ${target} - PROPERTY GENERATED - ) - if(NOT is_generated) - list(APPEND result ${source}) - endif() - endforeach() - endif() + # Use file() instead of get_directory_property() to avoid target dependency issues + file(GLOB_RECURSE dir_sources + ${PROJECT_SOURCE_DIR}/${dir}/*.cpp + ${PROJECT_SOURCE_DIR}/${dir}/*.h + ${PROJECT_SOURCE_DIR}/${dir}/*.mm + ) + + foreach(source IN LISTS dir_sources) + # Skip resource files and generated files + get_filename_component(source_name ${source} NAME) + if(source_name MATCHES "^(moc_|ui_|qrc_)") + continue() + endif() + + cmake_path(GET source EXTENSION LAST_ONLY ext) + if(ext STREQUAL ".qrc") + continue() + endif() + + # Check if file is generated (best effort without target dependencies) + get_filename_component(source_dir ${source} DIRECTORY) + get_filename_component(build_dir ${CMAKE_BINARY_DIR} REALPATH) + get_filename_component(source_dir_real ${source_dir} REALPATH) + string(FIND "${source_dir_real}" "${build_dir}" is_in_build_dir) + if(NOT is_in_build_dir EQUAL -1) + continue() # Skip files in build directory (likely generated) + endif() + + list(APPEND result ${source}) + endforeach() endforeach() set(${var} ${result} PARENT_SCOPE) endfunction() @@ -350,7 +393,7 @@ elseif(NOT SED_EXECUTABLE) COMMAND ${CMAKE_COMMAND} -E echo "Error: GNU sed not found" ) else() - set(translatable_sources_directories src src/qt) + set(translatable_sources_directories src src/qt src/util) if(ENABLE_WALLET) list(APPEND translatable_sources_directories src/wallet) endif() @@ -358,9 +401,9 @@ else() get_translatable_sources(qt_translatable_sources src/qt) file(GLOB ui_files ${CMAKE_CURRENT_SOURCE_DIR}/forms/*.ui) add_custom_target(translate - COMMAND ${CMAKE_COMMAND} -E env XGETTEXT=${XGETTEXT_EXECUTABLE} COPYRIGHT_HOLDERS=${COPYRIGHT_HOLDERS} ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/share/qt/extract_strings_qt.py ${translatable_sources} - COMMAND Qt5::lupdate -no-obsolete -I ${PROJECT_SOURCE_DIR}/src -locations relative ${CMAKE_CURRENT_SOURCE_DIR}/bitcoinstrings.cpp ${ui_files} ${qt_translatable_sources} -ts ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts - COMMAND Qt5::lconvert -drop-translations -o ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf -i ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts + COMMAND ${CMAKE_COMMAND} -E env XGETTEXT=${XGETTEXT_EXECUTABLE} COPYRIGHT_HOLDERS=${COPYRIGHT_HOLDERS} $ ${PROJECT_SOURCE_DIR}/share/qt/extract_strings_qt.py ${translatable_sources} + COMMAND Qt6::lupdate -no-obsolete -I ${PROJECT_SOURCE_DIR}/src -locations relative ${CMAKE_CURRENT_SOURCE_DIR}/bitcoinstrings.cpp ${ui_files} ${qt_translatable_sources} -ts ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts + COMMAND Qt6::lconvert -drop-translations -o ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf -i ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.ts COMMAND ${SED_EXECUTABLE} -i.old -e "s|source-language=\"en\" target-language=\"en\"|source-language=\"en\"|" -e "/<\\/target>/d" ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf COMMAND ${CMAKE_COMMAND} -E rm ${CMAKE_CURRENT_SOURCE_DIR}/locale/bitcoin_en.xlf.old WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 60f4a05474..42e082b6e9 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -230,6 +230,8 @@ class BitcoinApplication: public QApplication /// Request core shutdown void requestShutdown(); + void showCloseWindow(); + /// Get process return value int getReturnValue() { return returnValue; } @@ -482,7 +484,7 @@ void BitcoinApplication::requestShutdown() window->hide(); window->setClientModel(0); pollShutdownTimer->stop(); - + showCloseWindow(); #ifdef ENABLE_WALLET window->removeAllWallets(); delete walletModel; @@ -492,9 +494,15 @@ void BitcoinApplication::requestShutdown() clientModel = 0; StartShutdown(); + // Delay shutdown signal by 500 milliseconds + QTimer::singleShot(1000, this, [this]() { + // Request shutdown from core thread after delay + Q_EMIT requestedShutdown(); + }); +} - // Request shutdown from core thread - Q_EMIT requestedShutdown(); +void BitcoinApplication::showCloseWindow(){ + shutdownWindow->show(); } void BitcoinApplication::initializeResult(int retval) @@ -553,6 +561,10 @@ void BitcoinApplication::initializeResult(int retval) void BitcoinApplication::shutdownResult(int retval) { qDebug() << __func__ << ": Shutdown result: " << retval; + if (shutdownWindow) { + shutdownWindow->close(); + shutdownWindow.reset(); + } quit(); // Exit main loop after shutdown finished } diff --git a/src/qt/bitcoinamountfield.cpp b/src/qt/bitcoinamountfield.cpp index 9abba8ef78..7954dd2679 100644 --- a/src/qt/bitcoinamountfield.cpp +++ b/src/qt/bitcoinamountfield.cpp @@ -122,8 +122,7 @@ class AmountSpinBox: public QAbstractSpinBox opt.rect = rect(); - cachedMinimumSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this) - .expandedTo(QApplication::globalStrut()); + cachedMinimumSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this); } return cachedMinimumSizeHint; } diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index ca3735057e..c6bc97e4cb 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -42,6 +42,7 @@ #include #include +#include #include #include #include @@ -310,14 +311,14 @@ void BitcoinGUI::createActions() overviewAction->setStatusTip(tr("Show general overview of wallet")); overviewAction->setToolTip(overviewAction->statusTip()); overviewAction->setCheckable(true); - overviewAction->setShortcut(QKeySequence(Qt::ALT + key++)); + overviewAction->setShortcut(QKeySequence(QString("Alt+%1").arg(key++))); tabGroup->addAction(overviewAction); sendCoinsAction = new QAction(tr("&Send"), this); sendCoinsAction->setStatusTip(tr("Send coins to a Firo address")); sendCoinsAction->setToolTip(sendCoinsAction->statusTip()); sendCoinsAction->setCheckable(true); - sendCoinsAction->setShortcut(QKeySequence(Qt::ALT + key++)); + sendCoinsAction->setShortcut(QKeySequence(QString("Alt+%1").arg(key++))); tabGroup->addAction(sendCoinsAction); sendCoinsMenuAction = new QAction(sendCoinsAction->text(), this); @@ -328,7 +329,7 @@ void BitcoinGUI::createActions() receiveCoinsAction->setStatusTip(tr("Request payments (generates QR codes and firo: URIs)")); receiveCoinsAction->setToolTip(receiveCoinsAction->statusTip()); receiveCoinsAction->setCheckable(true); - receiveCoinsAction->setShortcut(QKeySequence(Qt::ALT + key++)); + receiveCoinsAction->setShortcut(QKeySequence(QString("Alt+%1").arg(key++))); tabGroup->addAction(receiveCoinsAction); receiveCoinsMenuAction = new QAction(receiveCoinsAction->text(), this); @@ -339,7 +340,7 @@ void BitcoinGUI::createActions() historyAction->setStatusTip(tr("Browse transaction history")); historyAction->setToolTip(historyAction->statusTip()); historyAction->setCheckable(true); - historyAction->setShortcut(QKeySequence(Qt::ALT + key++)); + historyAction->setShortcut(QKeySequence(QString("Alt+%1").arg(key++))); tabGroup->addAction(historyAction); #ifdef ENABLE_WALLET @@ -347,7 +348,7 @@ void BitcoinGUI::createActions() lelantusAction->setStatusTip(tr("Anonymize your coins")); lelantusAction->setToolTip(lelantusAction->statusTip()); lelantusAction->setCheckable(true); - lelantusAction->setShortcut(QKeySequence(Qt::ALT + key++)); + lelantusAction->setShortcut(QKeySequence(QString("Alt+%1").arg(key++))); tabGroup->addAction(lelantusAction); lelantusAction->setVisible(false); @@ -358,9 +359,9 @@ void BitcoinGUI::createActions() masternodeAction->setToolTip(masternodeAction->statusTip()); masternodeAction->setCheckable(true); #ifdef Q_OS_MAC - masternodeAction->setShortcut(QKeySequence(Qt::CTRL + key++)); + masternodeAction->setShortcut(QKeySequence(QString("Alt+%1").arg(key++))); #else - masternodeAction->setShortcut(QKeySequence(Qt::ALT + key++)); + masternodeAction->setShortcut(QKeySequence(QString("Alt+%1").arg(key++))); #endif tabGroup->addAction(masternodeAction); #endif @@ -385,7 +386,7 @@ void BitcoinGUI::createActions() quitAction = new QAction(tr("E&xit"), this); quitAction->setStatusTip(tr("Quit application")); - quitAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); + quitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q)); quitAction->setMenuRole(QAction::QuitRole); aboutAction = new QAction(tr("&About %1").arg(tr(PACKAGE_NAME)), this); aboutAction->setStatusTip(tr("Show information about %1").arg(tr(PACKAGE_NAME))); @@ -458,8 +459,8 @@ void BitcoinGUI::createActions() } #endif // ENABLE_WALLET - connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_C), this), &QShortcut::activated, this, &BitcoinGUI::showDebugWindowActivateConsole); - connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_D), this), &QShortcut::activated, this, &BitcoinGUI::showDebugWindow); + connect(new QShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_C), this), &QShortcut::activated, this, &BitcoinGUI::showDebugWindowActivateConsole); + connect(new QShortcut(QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_D), this), &QShortcut::activated, this, &BitcoinGUI::showDebugWindow); } void BitcoinGUI::createMenuBar() @@ -550,7 +551,7 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel) connect(_clientModel, &ClientModel::numConnectionsChanged, this, &BitcoinGUI::setNumConnections); connect(_clientModel, &ClientModel::networkActiveChanged, this, &BitcoinGUI::setNetworkActive); - modalOverlay->setKnownBestHeight(_clientModel->getHeaderTipHeight(), QDateTime::fromTime_t(_clientModel->getHeaderTipTime())); + modalOverlay->setKnownBestHeight(_clientModel->getHeaderTipHeight(), QDateTime::fromSecsSinceEpoch(_clientModel->getHeaderTipTime())); setNumBlocks(_clientModel->getNumBlocks(), _clientModel->getLastBlockDate(), _clientModel->getVerificationProgress(NULL), false); connect(_clientModel, &ClientModel::numBlocksChanged, this, &BitcoinGUI::setNumBlocks); diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index c84326e3a9..3d65aacda6 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -164,11 +164,11 @@ QDateTime ClientModel::getLastBlockDate() const return cachedLastBlockDate; if (chainActive.Tip()) { - cachedLastBlockDate = QDateTime::fromTime_t(chainActive.Tip()->GetBlockTime()); + cachedLastBlockDate = QDateTime::fromSecsSinceEpoch(chainActive.Tip()->GetBlockTime()); return cachedLastBlockDate; } - return QDateTime::fromTime_t(Params().GenesisBlock().GetBlockTime()); // Genesis block's time of current network + return QDateTime::fromSecsSinceEpoch(Params().GenesisBlock().GetBlockTime()); // Genesis block's time of current network } long ClientModel::getMempoolSize() const @@ -286,7 +286,7 @@ bool ClientModel::isReleaseVersion() const QString ClientModel::formatClientStartupTime() const { - return QDateTime::fromTime_t(nClientStartupTime).toString(); + return QDateTime::fromSecsSinceEpoch(nClientStartupTime).toString(); } QString ClientModel::dataDir() const @@ -372,7 +372,7 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, const CB //pass a async signal to the UI thread QMetaObject::invokeMethod(clientmodel, "numBlocksChanged", Qt::QueuedConnection, Q_ARG(int, pIndex->nHeight), - Q_ARG(QDateTime, QDateTime::fromTime_t(pIndex->GetBlockTime())), + Q_ARG(QDateTime, QDateTime::fromSecsSinceEpoch(pIndex->GetBlockTime())), Q_ARG(double, clientmodel->getVerificationProgress(pIndex)), Q_ARG(bool, fHeader)); nLastUpdateNotification = now; diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index da7b9b5bb5..b6563e66e6 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -678,7 +678,7 @@ void CoinControlDialog::updateView() ui->treeWidget->setEnabled(false); // performance, otherwise updateLabels would be called for every checked checkbox ui->treeWidget->setAlternatingRowColors(true); QFlags flgCheckbox = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable; - QFlags flgTristate = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsTristate; + QFlags flgTristate = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsUserTristate; int nDisplayUnit = model->getOptionsModel()->getDisplayUnit(); diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index f11b9a432b..e00c786526 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -47,12 +47,14 @@ #include #include #include -#include +#include #include #include #include #include +#include #include +#include #include // for Qt::mightBeRichText #include #include @@ -95,7 +97,7 @@ QString dateTimeStr(const QDateTime &date) QString dateTimeStr(qint64 nTime) { - return dateTimeStr(QDateTime::fromTime_t((qint32)nTime)); + return dateTimeStr(QDateTime::fromSecsSinceEpoch((qint32)nTime)); } QFont fixedPitchFont() @@ -305,6 +307,17 @@ QList getEntryData(QAbstractItemView *view, int column) return view->selectionModel()->selectedRows(column); } +QString ExtractFirstSuffixFromFilter(const QString& filter) +{ + QRegularExpression filter_re(QStringLiteral(".* \\(\\*\\.(.*)[ \\)]"), QRegularExpression::InvertedGreedinessOption); + QString suffix; + QRegularExpressionMatch m = filter_re.match(filter); + if (m.hasMatch()) { + suffix = m.captured(1); + } + return suffix; +} + QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut) @@ -326,13 +339,7 @@ QString getSaveFileName(QWidget *parent, const QString &caption, const QString & /* Directly convert path to native OS path separators */ QString result = QDir::toNativeSeparators(QFileDialog::getSaveFileName(parent, caption, myDir, filter, &selectedFilter)); - /* Extract first suffix from filter pattern "Description (*.foo)" or "Description (*.foo *.bar ...) */ - QRegExp filter_re(".* \\(\\*\\.(.*)[ \\)]"); - QString selectedSuffix; - if(filter_re.exactMatch(selectedFilter)) - { - selectedSuffix = filter_re.cap(1); - } + QString selectedSuffix = ExtractFirstSuffixFromFilter(selectedFilter); /* Add suffix if needed */ QFileInfo info(result); @@ -378,14 +385,7 @@ QString getOpenFileName(QWidget *parent, const QString &caption, const QString & if(selectedSuffixOut) { - /* Extract first suffix from filter pattern "Description (*.foo)" or "Description (*.foo *.bar ...) */ - QRegExp filter_re(".* \\(\\*\\.(.*)[ \\)]"); - QString selectedSuffix; - if(filter_re.exactMatch(selectedFilter)) - { - selectedSuffix = filter_re.cap(1); - } - *selectedSuffixOut = selectedSuffix; + *selectedSuffixOut = ExtractFirstSuffixFromFilter(selectedFilter); } return result; } diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp index 27044f8778..5f6e563648 100644 --- a/src/qt/notificator.cpp +++ b/src/qt/notificator.cpp @@ -27,6 +27,32 @@ #include "macnotificationhandler.h" #endif +#ifdef USE_DBUS +// Loosely based on http://www.qtcentre.org/archive/index.php/t-25879.html +class FreedesktopImage +{ +public: + FreedesktopImage() {} + FreedesktopImage(const QImage &img); + + static int metaType(); + + // Image to variant that can be marshalled over DBus + static QVariant toVariant(const QImage &img); + +private: + int width, height, stride; + bool hasAlpha; + int channels; + int bitsPerSample; + QByteArray image; + + friend QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImage &i); + friend const QDBusArgument &operator>>(const QDBusArgument &a, FreedesktopImage &i); +}; + +Q_DECLARE_METATYPE(FreedesktopImage); +#endif #ifdef USE_DBUS // https://wiki.ubuntu.com/NotificationDevelopmentGuidelines recommends at least 128 @@ -53,6 +79,9 @@ Notificator::Notificator(const QString &_programName, QSystemTrayIcon *_trayIcon if(interface->isValid()) { mode = Freedesktop; + // Make sure the custom DBus type is registered before use + FreedesktopImage::metaType(); + // Alternatively: qDBusRegisterMetaType(); } #endif #ifdef Q_OS_MAC @@ -72,31 +101,6 @@ Notificator::~Notificator() #ifdef USE_DBUS -// Loosely based on http://www.qtcentre.org/archive/index.php/t-25879.html -class FreedesktopImage -{ -public: - FreedesktopImage() {} - FreedesktopImage(const QImage &img); - - static int metaType(); - - // Image to variant that can be marshalled over DBus - static QVariant toVariant(const QImage &img); - -private: - int width, height, stride; - bool hasAlpha; - int channels; - int bitsPerSample; - QByteArray image; - - friend QDBusArgument &operator<<(QDBusArgument &a, const FreedesktopImage &i); - friend const QDBusArgument &operator>>(const QDBusArgument &a, FreedesktopImage &i); -}; - -Q_DECLARE_METATYPE(FreedesktopImage); - // Image configuration settings const int CHANNELS = 4; const int BYTES_PER_PIXEL = 4; @@ -144,13 +148,13 @@ const QDBusArgument &operator>>(const QDBusArgument &a, FreedesktopImage &i) int FreedesktopImage::metaType() { - return qDBusRegisterMetaType(); + return qDBusRegisterMetaType().id(); } QVariant FreedesktopImage::toVariant(const QImage &img) { FreedesktopImage fimg(img); - return QVariant(FreedesktopImage::metaType(), &fimg); + return QVariant::fromValue(fimg); } void Notificator::notifyDBus(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout) diff --git a/src/qt/recentrequeststablemodel.cpp b/src/qt/recentrequeststablemodel.cpp index 476983f188..6c06965103 100644 --- a/src/qt/recentrequeststablemodel.cpp +++ b/src/qt/recentrequeststablemodel.cpp @@ -242,7 +242,7 @@ bool RecentRequestEntryLessThan::operator()(RecentRequestEntry &left, RecentRequ switch(column) { case RecentRequestsTableModel::Date: - return pLeft->date.toTime_t() < pRight->date.toTime_t(); + return pLeft->date.toSecsSinceEpoch() < pRight->date.toSecsSinceEpoch(); case RecentRequestsTableModel::Label: return pLeft->recipient.label < pRight->recipient.label; case RecentRequestsTableModel::Message: diff --git a/src/qt/recentrequeststablemodel.h b/src/qt/recentrequeststablemodel.h index e3b1de6702..5ba0220501 100644 --- a/src/qt/recentrequeststablemodel.h +++ b/src/qt/recentrequeststablemodel.h @@ -28,15 +28,16 @@ class RecentRequestEntry template inline void SerializationOp(Stream& s, Operation ser_action) { - unsigned int nDate = date.toTime_t(); + unsigned int nDate = date.toSecsSinceEpoch(); READWRITE(this->nVersion); READWRITE(id); READWRITE(nDate); READWRITE(recipient); - if (ser_action.ForRead()) - date = QDateTime::fromTime_t(nDate); + if (ser_action.ForRead()) { + date = QDateTime::fromSecsSinceEpoch(nDate); + } } }; diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 2c7bfe85fc..0dd22b2800 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -496,7 +496,14 @@ bool RPCConsole::eventFilter(QObject* obj, QEvent *event) case Qt::Key_PageDown: if(obj == ui->lineEdit) { - QApplication::postEvent(ui->messagesWidget, new QKeyEvent(*keyevt)); + QApplication::postEvent(ui->messagesWidget, new QKeyEvent( + keyevt->type(), + keyevt->key(), + keyevt->modifiers(), + keyevt->text(), + keyevt->isAutoRepeat(), + keyevt->count() + )); return true; } break; @@ -504,7 +511,14 @@ bool RPCConsole::eventFilter(QObject* obj, QEvent *event) case Qt::Key_Enter: // forward these events to lineEdit if(obj == autoCompleter->popup()) { - QApplication::postEvent(ui->lineEdit, new QKeyEvent(*keyevt)); + QApplication::postEvent(ui->lineEdit, new QKeyEvent( + keyevt->type(), + keyevt->key(), + keyevt->modifiers(), + keyevt->text(), + keyevt->isAutoRepeat(), + keyevt->count() + )); return true; } break; @@ -517,7 +531,14 @@ bool RPCConsole::eventFilter(QObject* obj, QEvent *event) ((mod & Qt::ShiftModifier) && key == Qt::Key_Insert))) { ui->lineEdit->setFocus(); - QApplication::postEvent(ui->lineEdit, new QKeyEvent(*keyevt)); + QApplication::postEvent(ui->lineEdit, new QKeyEvent( + keyevt->type(), + keyevt->key(), + keyevt->modifiers(), + keyevt->text(), + keyevt->isAutoRepeat(), + keyevt->count() + )); return true; } } @@ -1133,16 +1154,16 @@ void RPCConsole::banSelectedNode(int bantime) // Get currently selected peer address NodeId id = nodes.at(i).data().toLongLong(); - // Get currently selected peer address - int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(id); - if(detailNodeRow < 0) - return; + // Get currently selected peer address + int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(id); + if(detailNodeRow < 0) + return; - // Find possible nodes, ban it and clear the selected node - const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow); - if(stats) { - g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime); - } + // Find possible nodes, ban it and clear the selected node + const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow); + if(stats) { + g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime); + } } clearSelectedNode(); clientModel->getBanTableModel()->refresh(); diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp index 4b7cab66bb..8ed1eedfb2 100644 --- a/src/qt/sendcoinsentry.cpp +++ b/src/qt/sendcoinsentry.cpp @@ -16,6 +16,9 @@ #include #include + +#include + #include SendCoinsEntry::SendCoinsEntry(const PlatformStyle *_platformStyle, QWidget *parent) : @@ -82,7 +85,7 @@ void SendCoinsEntry::on_MemoTextChanged(const QString &text) ui->iconMessageWarning->setVisible(true); } else { QString sanitized = text; - sanitized.remove(QRegExp("[\\x00-\\x1F\\x7F]")); + sanitized.remove(QRegularExpression("[\\x00-\\x1F\\x7F]")); if (sanitized != text) { ui->messageTextLabel->setText(sanitized); return; diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp index fed6be176c..b480f34655 100644 --- a/src/qt/splashscreen.cpp +++ b/src/qt/splashscreen.cpp @@ -21,7 +21,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/qt/test/CMakeLists.txt b/src/qt/test/CMakeLists.txt index 753ce6e935..757c4ddd10 100644 --- a/src/qt/test/CMakeLists.txt +++ b/src/qt/test/CMakeLists.txt @@ -32,9 +32,8 @@ target_link_libraries(test_firo-qt ${TOR_LIBRARY} Boost::headers Boost::unit_test_framework - Qt5::Test - Qt5::Dependencies - Qt5::Widgets + Qt6::Test + Qt6::Widgets Boost::thread $ $ diff --git a/src/qt/transactionfilterproxy.cpp b/src/qt/transactionfilterproxy.cpp index 733dd7a0cc..b2750b9257 100644 --- a/src/qt/transactionfilterproxy.cpp +++ b/src/qt/transactionfilterproxy.cpp @@ -12,9 +12,9 @@ #include // Earliest date that can be represented (far in the past) -const QDateTime TransactionFilterProxy::MIN_DATE = QDateTime::fromTime_t(0); +const QDateTime TransactionFilterProxy::MIN_DATE = QDateTime::fromSecsSinceEpoch(0); // Last date that can be represented (far in the future) -const QDateTime TransactionFilterProxy::MAX_DATE = QDateTime::fromTime_t(0xFFFFFFFF); +const QDateTime TransactionFilterProxy::MAX_DATE = QDateTime::fromSecsSinceEpoch(0xFFFFFFFF); TransactionFilterProxy::TransactionFilterProxy(QObject *parent) : QSortFilterProxyModel(parent), diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index 363d01d8d8..0f8775e8ae 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -733,7 +733,7 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const case TypeRole: return rec->type; case DateRole: - return QDateTime::fromTime_t(static_cast(rec->time)); + return QDateTime::fromSecsSinceEpoch(static_cast(rec->time)); case WatchonlyRole: return rec->involvesWatchAddress; case WatchonlyDecorationRole: @@ -762,7 +762,7 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const case TxPlainTextRole: { QString details; - QDateTime date = QDateTime::fromTime_t(static_cast(rec->time)); + QDateTime date = QDateTime::fromSecsSinceEpoch(static_cast(rec->time)); QString txLabel = walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(rec->address)); details.append(date.toString("M/d/yy HH:mm")); diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp index 27cdb40da8..591c4003b8 100644 --- a/src/qt/utilitydialog.cpp +++ b/src/qt/utilitydialog.cpp @@ -24,7 +24,7 @@ #include #include -#include +#include #include #include #include @@ -54,8 +54,8 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) : QString licenseInfo = QString::fromStdString(LicenseInfo()); QString licenseInfoHTML = licenseInfo; // Make URLs clickable - QRegExp uri("<(.*)>", Qt::CaseSensitive, QRegExp::RegExp2); - uri.setMinimal(true); // use non-greedy matching + + QRegularExpression uri("<(.*?)>"); // Non-greedy matching with ? licenseInfoHTML.replace(uri, "\\1"); // Replace newlines with HTML breaks licenseInfoHTML.replace("\n", "
"); diff --git a/src/qt/winshutdownmonitor.cpp b/src/qt/winshutdownmonitor.cpp index 859c1cb4b6..38602acc1a 100644 --- a/src/qt/winshutdownmonitor.cpp +++ b/src/qt/winshutdownmonitor.cpp @@ -16,7 +16,7 @@ // 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. -bool WinShutdownMonitor::nativeEventFilter(const QByteArray &eventType, void *pMessage, long *pnResult) +bool WinShutdownMonitor::nativeEventFilter(const QByteArray &eventType, void *pMessage, qintptr *pnResult) { Q_UNUSED(eventType); diff --git a/src/qt/winshutdownmonitor.h b/src/qt/winshutdownmonitor.h index 080ddd0722..1f00161a6e 100644 --- a/src/qt/winshutdownmonitor.h +++ b/src/qt/winshutdownmonitor.h @@ -18,7 +18,7 @@ class WinShutdownMonitor : public QAbstractNativeEventFilter { public: /** Implements QAbstractNativeEventFilter interface for processing Windows messages */ - bool nativeEventFilter(const QByteArray &eventType, void *pMessage, long *pnResult) override; + bool nativeEventFilter(const QByteArray &eventType, void *pMessage, qintptr *pnResult) override; /** Register the reason for blocking shutdown on Windows to allow clean client exit */ static void registerShutdownBlockReason(const QString& strReason, const HWND& mainWinId);