From 4ec098ee9de601f2c92b8804dff53388bacec7aa Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 28 Feb 2026 23:12:54 +0100 Subject: [PATCH] cmake: Workaround for buggy Qt 6.4.2 & 6.6.3 --- .github/workflows/ubuntu.yml | 6 +++--- client/CMakeLists.txt | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 759b2f690..ee88ced0f 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -30,7 +30,7 @@ jobs: run: sudo apt-get update - name: Install dependencies - run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qt6-base-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.4-dev liblua5.4-0 lua5.4 sed libssl-dev libgd-dev + run: sudo apt-get install -yqq make build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qt6-base-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.4-dev liblua5.4-0 lua5.4 sed libssl-dev libgd-dev - name: Install Python dependencies run: pip install -r tools/requirements.txt @@ -60,7 +60,7 @@ jobs: run: sudo apt-get update - name: Install dependencies - run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qt6-base-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.4-dev liblua5.4-0 lua5.4 sed libssl-dev libgd-dev + run: sudo apt-get install -yqq make build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qt6-base-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.4-dev liblua5.4-0 lua5.4 sed libssl-dev libgd-dev - name: Install Python dependencies run: pip install -r tools/requirements.txt @@ -91,7 +91,7 @@ jobs: run: sudo apt-get update - name: Install dependencies - run: sudo apt-get install -yqq make autoconf build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qt6-base-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.4-dev liblua5.4-0 lua5.4 sed libssl-dev libgd-dev + run: sudo apt-get install -yqq make build-essential ca-certificates pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev qt6-base-dev libbz2-dev liblz4-dev libbluetooth-dev libpython3-dev python3 python3-dev libpython3-all-dev liblua5.4-dev liblua5.4-0 lua5.4 sed libssl-dev libgd-dev - name: Install Python dependencies run: pip install -r tools/requirements.txt diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 8713fc8c9..a81f64f0d 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -751,6 +751,47 @@ add_executable(proxmark3 ${ADDITIONAL_SRC} ) +# Handle overlays.ui manually to apply the Qt6 setNum fix +if ((NOT SKIPQT EQUAL 1) AND Qt6_FOUND) + # Find the UIC tool + get_target_property(QT_UIC_EXECUTABLE Qt6::uic IMPORTED_LOCATION) + + set(UI_OVERLAYS_INPUT ${PM3_ROOT}/client/src/ui/overlays.ui) + set(UI_OVERLAYS_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ui/ui_overlays.h) + + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ui) + + add_custom_command( + OUTPUT ${UI_OVERLAYS_OUTPUT} + COMMAND ${QT_UIC_EXECUTABLE} ${UI_OVERLAYS_INPUT} -o ${UI_OVERLAYS_OUTPUT} + # Fix bug in headers generated by some Qt6 versions (seen on 6.4.2 & 6.6.3): + # replace &QLabel::setNum with qOverload(&QLabel::setNum) + COMMAND ${CMAKE_COMMAND} + -DFILE=${UI_OVERLAYS_OUTPUT} + -P ${CMAKE_CURRENT_BINARY_DIR}/fix_overlays.cmake + DEPENDS ${UI_OVERLAYS_INPUT} + COMMENT "UIC overlays.ui (with Qt6 setNum fix)" + ) + + # Write the sed-equivalent cmake script at configure time + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/fix_overlays.cmake [=[ + file(READ "${FILE}" _content) + string(REPLACE + "&QLabel::setNum);" + "qOverload(&QLabel::setNum));" + _content "${_content}") + file(WRITE "${FILE}" "${_content}") + ]=]) + + # Add the generated header as a source so it gets built + # and tell AUTOUIC to skip the .ui file (we handle it ourselves) + set_property(SOURCE ${UI_OVERLAYS_INPUT} PROPERTY SKIP_AUTOUIC ON) + + # Make proxmark3 depend on the generated header + target_sources(proxmark3 PRIVATE ${UI_OVERLAYS_OUTPUT}) + target_include_directories(proxmark3 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +endif() + target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) if (EMBED_READLINE) if (NOT SKIPREADLINE EQUAL 1)