Fix the Linux build of the qt6 branch, compile QML to bytecode only

- Remove Core5Compat (unused, not part of the Steam Frame's system Qt).
- Request GuiPrivate explicitly (required since Qt 6.10 for QRhi); temporary
  until rendering moves to public API.
- Compile QML to bytecode only: C++ generated from QML uses private Qt API
  that only matches the exact Qt version it was built with.
- Pick the OpenVR library per architecture (linux64, linuxarm64, win64) for
  linking and for the copy next to the binary; RPATH $ORIGIN.
- Link libXtst, needed by input_sender_X11.cpp.
- Include d3d11.h and handle QRhi::D3D11 only on Windows.
- Replace leftover easylogging LOG(INFO) calls with qInfo().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Matthias Janetschek
2026-10-07 13:29:53 +02:00
co-authored by Claude Opus 5.5
parent aac3edf7e3
commit 266a2f9ce9
5 changed files with 86 additions and 17 deletions
+37 -8
View File
@@ -12,7 +12,12 @@ set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
#find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core)
#find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui Multimedia Qml Quick WebSockets Widgets QuickControls2 QuickDialogs2 Svg)
#find_package(Qt${QT_VERSION_MAJOR} OPTIONAL_COMPONENTS DBus)
find_package(Qt6 REQUIRED COMPONENTS Gui Multimedia Qml Quick WebSockets Widgets QuickControls2 QuickDialogs2 Svg Qml Core5Compat)
# Core5Compat removed: nothing uses it, and the Steam Frame's system Qt
# doesn't ship it.
# GuiPrivate: QRhi (overlaycontroller.cpp) needs it. Since Qt 6.10 private
# modules must be requested explicitly. Temporary: it goes away when rendering
# switches to public API (docs/steamframe/DESIGN.md, section 3).
find_package(Qt6 REQUIRED COMPONENTS Gui Multimedia Qml Quick WebSockets Widgets QuickControls2 QuickDialogs2 Svg Qml GuiPrivate)
find_package(Vulkan REQUIRED)
qt_standard_project_setup(REQUIRES 6.8)
@@ -246,6 +251,15 @@ qt_add_executable(AdvancedSettings
)
#src/res/resources.qrc
# Compile QML to bytecode only, not to C++. C++ generated from QML calls Qt's
# private API (QQmlPrivate::AOTCompiledContext), which only matches the exact
# Qt version it was built with. Bytecode keeps the binary on public API, so it
# runs on another Qt 6 patch release, e.g. the Steam Frame's system Qt.
# Must be set before qt_add_qml_module() reads it.
set_target_properties(AdvancedSettings PROPERTIES
QT_QMLCACHEGEN_ARGUMENTS --only-bytecode
)
qt_add_qml_module(AdvancedSettings
URI AdvancedSettings
QML_FILES
@@ -264,6 +278,12 @@ target_include_directories(AdvancedSettings PUBLIC
# Avoid collision between executable name and QML module directory (QTBUG-98568).
if(NOT WIN32 AND NOT APPLE)
set_property(TARGET AdvancedSettings PROPERTY OUTPUT_NAME AdvancedSettings_app)
# libopenvr_api.so is copied next to the executable (see "openvrApiCopy");
# $ORIGIN makes the loader look there, in the build tree and in packages.
set_target_properties(AdvancedSettings PROPERTIES
BUILD_RPATH "$ORIGIN"
INSTALL_RPATH "$ORIGIN"
)
endif()
target_compile_definitions(AdvancedSettings PRIVATE
@@ -282,16 +302,20 @@ target_compile_definitions(AdvancedSettings PRIVATE
# NO_DEFAULT_PATH
# NO_CMAKE_FIND_ROOT_PATH)
# Directory of the OpenVR library for the target platform. Linux distinguishes
# x86_64 (linux64) from aarch64 (linuxarm64, e.g. the Steam Frame).
if (WIN32)
target_link_directories(AdvancedSettings PRIVATE
${CMAKE_SOURCE_DIR}/third-party/openvr/lib/win64
)
set(OPENVR_LIB_DIR ${CMAKE_SOURCE_DIR}/third-party/openvr/lib/win64)
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|ARM64)$")
set(OPENVR_LIB_DIR ${CMAKE_SOURCE_DIR}/third-party/openvr/lib/linuxarm64)
else ()
set(OPENVR_LIB_DIR ${CMAKE_SOURCE_DIR}/third-party/openvr/lib/linux64)
endif ()
target_link_directories(AdvancedSettings PRIVATE ${OPENVR_LIB_DIR})
target_link_libraries(AdvancedSettings PRIVATE
Qt::Gui
Qt6::Core5Compat
# For QRhi
# For QRhi; temporary, see find_package(Qt6 ...) above.
Qt::GuiPrivate
Qt::Multimedia
Qt::Qml
@@ -377,7 +401,7 @@ if (WIN32)
else ()
add_custom_command(TARGET AdvancedSettings POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${CMAKE_SOURCE_DIR}/third-party/openvr/lib/linux64/libopenvr_api.so" "${COPY_DEST_DIR}/libopenvr_api.so"
"${OPENVR_LIB_DIR}/libopenvr_api.so" "${COPY_DEST_DIR}/libopenvr_api.so"
)
endif ()
@@ -430,7 +454,12 @@ elseif (UNIX)
src/keyboard_input/input_sender_X11.cpp
)
find_package(X11 REQUIRED)
target_link_libraries(AdvancedSettings PRIVATE ${X11_LIBRARIES})
# input_sender_X11.cpp uses the XTest extension (XTestFakeKeyEvent,
# XTestGrabControl), which lives in its own library.
if (NOT X11_XTest_FOUND)
message(FATAL_ERROR "libXtst (X11 XTest extension) not found")
endif ()
target_link_libraries(AdvancedSettings PRIVATE ${X11_LIBRARIES} ${X11_XTest_LIB})
elseif (NOT APPLE AND noX11)
target_sources(AdvancedSettings PRIVATE
src/keyboard_input/input_sender_dummy.cpp
+28
View File
@@ -0,0 +1,28 @@
# Steam Frame port: progress
## Iteration 1
### Step 1: build fixes, bytecode-only QML (2026-10-07)
**Changes:**
- **`CMakeLists.txt`:**
- `Core5Compat` removed (unused, not on the Frame).
- `GuiPrivate` requested explicitly. This is temporary, until step 3 replaces QRhi.
- `QT_QMLCACHEGEN_ARGUMENTS --only-bytecode`.
- OpenVR library directory per architecture (`linux64` / `linuxarm64` / `win64`), for
linking and for the copy next to the binary.
- `RPATH $ORIGIN`.
- `libXtst` linked.
- **`overlaycontroller.cpp`:** `d3d11.h` and `case QRhi::D3D11` only under `_WIN32`.
- **Logging:** 8 active easylogging `LOG(INFO)` calls became `qInfo()`
(`overlaycontroller.cpp` 6, `ChaperoneTabController.cpp` 1,
`MoveCenterTabController.cpp` 1). Commented-out `LOG` lines are left unchanged.
- Only changed lines are formatted (`git clang-format`).
**Results (x86_64, Arch, Qt 6.11.1, GCC):**
- The build succeeds, with 1463 compiler warnings, as in `qt6`.
- `objdump -T`: 7 `Qt_6_PRIVATE_API` symbols, all `QRhi…` (step 3). The
`QQmlPrivate::AOTCompiledContext` symbols are gone (bytecode-only QML).
- `libopenvr_api.so` is resolved from the binary's directory (`ldd`).
- Not started: without a running SteamVR the start hangs in OpenVR init (expected; tested
on the Frame in step 5).
+18 -7
View File
@@ -30,7 +30,10 @@
#include <qnamespace.h>
#include <rhi/qrhi.h>
#include <stdexcept>
#include <d3d11.h>
// Direct3D exists only on Windows.
#ifdef _WIN32
# include <d3d11.h>
#endif
// application namespace
namespace advsettings
@@ -521,21 +524,25 @@ void OverlayController::SetWidget( QQuickItem* quickItem,
auto ctrlRole = info.second;
if ( vr::TrackedDeviceClass_HMD == ctrlRole )
{
LOG(INFO) << "HMD is: " << ovr_system_wrapper::getDeviceName(device);
qInfo() << "HMD is: "
<< ovr_system_wrapper::getDeviceName( device );
continue;
}
if ( vr::TrackedControllerRole_LeftHand == ctrlRole )
{
LOG(INFO) << "Controller (L) is: " << ovr_system_wrapper::getDeviceName(device);
qInfo() << "Controller (L) is: "
<< ovr_system_wrapper::getDeviceName( device );
continue;
}
if ( vr::TrackedControllerRole_RightHand == ctrlRole )
{
LOG(INFO) << "Controller (R) is: " << ovr_system_wrapper::getDeviceName(device);
qInfo() << "Controller (R) is: "
<< ovr_system_wrapper::getDeviceName( device );
continue;
}
}
LOG(INFO)<< "Initilizaion is complete--------------------------------------------------";
qInfo() << "Initilizaion is "
"complete--------------------------------------------------";
}
void OverlayController::OnRenderRequest()
@@ -560,6 +567,8 @@ void OverlayController::SetOverlayFromQRhiTexture( QRhiTexture& tex )
vrTex.eColorSpace = vr::ColorSpace_Auto;
}
break;
// Direct3D exists only on Windows.
#ifdef _WIN32
case QRhi::D3D11:
{
vrTex.handle = reinterpret_cast<ID3D11Texture2D *>( tex.nativeTexture().object );
@@ -568,6 +577,7 @@ void OverlayController::SetOverlayFromQRhiTexture( QRhiTexture& tex )
}
break;
#endif
#if QT_CONFIG( vulkan )
case QRhi::Vulkan:
{
@@ -1425,7 +1435,7 @@ void OverlayController::RotateUniverseCenter(
// }
vr::HmdMatrix34_t curPos;
auto calState = vr::VRChaperone()->GetCalibrationState();
LOG( INFO ) << "Calibration State on Rotate is: " << calState;
qInfo() << "Calibration State on Rotate is: " << calState;
if ( universe == vr::TrackingUniverseStanding )
{
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
@@ -1440,7 +1450,8 @@ void OverlayController::RotateUniverseCenter(
{
//TODO 8/3/26, will see if this causes issues
//should exclusively happen with openxr
LOG(INFO) << "rotating on undefined tracking universe probably openxr";
qInfo()
<< "rotating on undefined tracking universe probably openxr";
vr::VRChaperoneSetup()->GetLiveSeatedZeroPoseToRawTrackingPose(&curPos);
}
@@ -1500,7 +1500,7 @@ void ChaperoneTabController::createNewAutosaveProfile()
true,
true,
true );
LOG(INFO) <<"Chaperone Automatic Chaperone Profile Saved";
qInfo() << "Chaperone Automatic Chaperone Profile Saved";
}
void ChaperoneTabController::applyAutosavedProfile()
@@ -1109,7 +1109,8 @@ void MoveCenterTabController::zeroOffsets()
parent->m_chaperoneTabController.createNewAutosaveProfile();
m_initComplete = true;
m_chaperoneBasisAcquired = true;
LOG( INFO ) << "Chaperone Initilization Complete, Space Drag Now Enabled";
qInfo() << "Chaperone Initilization Complete, Space Drag "
"Now Enabled";
}
//}
// else