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:
co-authored by
Claude Opus 5.5
parent
aac3edf7e3
commit
266a2f9ce9
+37
-8
@@ -12,7 +12,12 @@ set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
|
|||||||
#find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core)
|
#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} REQUIRED COMPONENTS Gui Multimedia Qml Quick WebSockets Widgets QuickControls2 QuickDialogs2 Svg)
|
||||||
#find_package(Qt${QT_VERSION_MAJOR} OPTIONAL_COMPONENTS DBus)
|
#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)
|
find_package(Vulkan REQUIRED)
|
||||||
|
|
||||||
qt_standard_project_setup(REQUIRES 6.8)
|
qt_standard_project_setup(REQUIRES 6.8)
|
||||||
@@ -246,6 +251,15 @@ qt_add_executable(AdvancedSettings
|
|||||||
)
|
)
|
||||||
#src/res/resources.qrc
|
#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
|
qt_add_qml_module(AdvancedSettings
|
||||||
URI AdvancedSettings
|
URI AdvancedSettings
|
||||||
QML_FILES
|
QML_FILES
|
||||||
@@ -264,6 +278,12 @@ target_include_directories(AdvancedSettings PUBLIC
|
|||||||
# Avoid collision between executable name and QML module directory (QTBUG-98568).
|
# Avoid collision between executable name and QML module directory (QTBUG-98568).
|
||||||
if(NOT WIN32 AND NOT APPLE)
|
if(NOT WIN32 AND NOT APPLE)
|
||||||
set_property(TARGET AdvancedSettings PROPERTY OUTPUT_NAME AdvancedSettings_app)
|
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()
|
endif()
|
||||||
|
|
||||||
target_compile_definitions(AdvancedSettings PRIVATE
|
target_compile_definitions(AdvancedSettings PRIVATE
|
||||||
@@ -282,16 +302,20 @@ target_compile_definitions(AdvancedSettings PRIVATE
|
|||||||
# NO_DEFAULT_PATH
|
# NO_DEFAULT_PATH
|
||||||
# NO_CMAKE_FIND_ROOT_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)
|
if (WIN32)
|
||||||
target_link_directories(AdvancedSettings PRIVATE
|
set(OPENVR_LIB_DIR ${CMAKE_SOURCE_DIR}/third-party/openvr/lib/win64)
|
||||||
${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 ()
|
endif ()
|
||||||
|
target_link_directories(AdvancedSettings PRIVATE ${OPENVR_LIB_DIR})
|
||||||
|
|
||||||
target_link_libraries(AdvancedSettings PRIVATE
|
target_link_libraries(AdvancedSettings PRIVATE
|
||||||
Qt::Gui
|
Qt::Gui
|
||||||
Qt6::Core5Compat
|
# For QRhi; temporary, see find_package(Qt6 ...) above.
|
||||||
# For QRhi
|
|
||||||
Qt::GuiPrivate
|
Qt::GuiPrivate
|
||||||
Qt::Multimedia
|
Qt::Multimedia
|
||||||
Qt::Qml
|
Qt::Qml
|
||||||
@@ -377,7 +401,7 @@ if (WIN32)
|
|||||||
else ()
|
else ()
|
||||||
add_custom_command(TARGET AdvancedSettings POST_BUILD
|
add_custom_command(TARGET AdvancedSettings POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
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 ()
|
endif ()
|
||||||
|
|
||||||
@@ -430,7 +454,12 @@ elseif (UNIX)
|
|||||||
src/keyboard_input/input_sender_X11.cpp
|
src/keyboard_input/input_sender_X11.cpp
|
||||||
)
|
)
|
||||||
find_package(X11 REQUIRED)
|
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)
|
elseif (NOT APPLE AND noX11)
|
||||||
target_sources(AdvancedSettings PRIVATE
|
target_sources(AdvancedSettings PRIVATE
|
||||||
src/keyboard_input/input_sender_dummy.cpp
|
src/keyboard_input/input_sender_dummy.cpp
|
||||||
|
|||||||
@@ -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).
|
||||||
@@ -30,7 +30,10 @@
|
|||||||
#include <qnamespace.h>
|
#include <qnamespace.h>
|
||||||
#include <rhi/qrhi.h>
|
#include <rhi/qrhi.h>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <d3d11.h>
|
// Direct3D exists only on Windows.
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <d3d11.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// application namespace
|
// application namespace
|
||||||
namespace advsettings
|
namespace advsettings
|
||||||
@@ -521,21 +524,25 @@ void OverlayController::SetWidget( QQuickItem* quickItem,
|
|||||||
auto ctrlRole = info.second;
|
auto ctrlRole = info.second;
|
||||||
if ( vr::TrackedDeviceClass_HMD == ctrlRole )
|
if ( vr::TrackedDeviceClass_HMD == ctrlRole )
|
||||||
{
|
{
|
||||||
LOG(INFO) << "HMD is: " << ovr_system_wrapper::getDeviceName(device);
|
qInfo() << "HMD is: "
|
||||||
|
<< ovr_system_wrapper::getDeviceName( device );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ( vr::TrackedControllerRole_LeftHand == ctrlRole )
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
if ( vr::TrackedControllerRole_RightHand == ctrlRole )
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG(INFO)<< "Initilizaion is complete--------------------------------------------------";
|
qInfo() << "Initilizaion is "
|
||||||
|
"complete--------------------------------------------------";
|
||||||
}
|
}
|
||||||
|
|
||||||
void OverlayController::OnRenderRequest()
|
void OverlayController::OnRenderRequest()
|
||||||
@@ -560,6 +567,8 @@ void OverlayController::SetOverlayFromQRhiTexture( QRhiTexture& tex )
|
|||||||
vrTex.eColorSpace = vr::ColorSpace_Auto;
|
vrTex.eColorSpace = vr::ColorSpace_Auto;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
// Direct3D exists only on Windows.
|
||||||
|
#ifdef _WIN32
|
||||||
case QRhi::D3D11:
|
case QRhi::D3D11:
|
||||||
{
|
{
|
||||||
vrTex.handle = reinterpret_cast<ID3D11Texture2D *>( tex.nativeTexture().object );
|
vrTex.handle = reinterpret_cast<ID3D11Texture2D *>( tex.nativeTexture().object );
|
||||||
@@ -568,6 +577,7 @@ void OverlayController::SetOverlayFromQRhiTexture( QRhiTexture& tex )
|
|||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
#if QT_CONFIG( vulkan )
|
#if QT_CONFIG( vulkan )
|
||||||
case QRhi::Vulkan:
|
case QRhi::Vulkan:
|
||||||
{
|
{
|
||||||
@@ -1425,7 +1435,7 @@ void OverlayController::RotateUniverseCenter(
|
|||||||
// }
|
// }
|
||||||
vr::HmdMatrix34_t curPos;
|
vr::HmdMatrix34_t curPos;
|
||||||
auto calState = vr::VRChaperone()->GetCalibrationState();
|
auto calState = vr::VRChaperone()->GetCalibrationState();
|
||||||
LOG( INFO ) << "Calibration State on Rotate is: " << calState;
|
qInfo() << "Calibration State on Rotate is: " << calState;
|
||||||
if ( universe == vr::TrackingUniverseStanding )
|
if ( universe == vr::TrackingUniverseStanding )
|
||||||
{
|
{
|
||||||
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
|
vr::VRChaperoneSetup()->GetWorkingStandingZeroPoseToRawTrackingPose(
|
||||||
@@ -1440,7 +1450,8 @@ void OverlayController::RotateUniverseCenter(
|
|||||||
{
|
{
|
||||||
//TODO 8/3/26, will see if this causes issues
|
//TODO 8/3/26, will see if this causes issues
|
||||||
//should exclusively happen with openxr
|
//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);
|
vr::VRChaperoneSetup()->GetLiveSeatedZeroPoseToRawTrackingPose(&curPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1500,7 +1500,7 @@ void ChaperoneTabController::createNewAutosaveProfile()
|
|||||||
true,
|
true,
|
||||||
true,
|
true,
|
||||||
true );
|
true );
|
||||||
LOG(INFO) <<"Chaperone Automatic Chaperone Profile Saved";
|
qInfo() << "Chaperone Automatic Chaperone Profile Saved";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChaperoneTabController::applyAutosavedProfile()
|
void ChaperoneTabController::applyAutosavedProfile()
|
||||||
|
|||||||
@@ -1109,7 +1109,8 @@ void MoveCenterTabController::zeroOffsets()
|
|||||||
parent->m_chaperoneTabController.createNewAutosaveProfile();
|
parent->m_chaperoneTabController.createNewAutosaveProfile();
|
||||||
m_initComplete = true;
|
m_initComplete = true;
|
||||||
m_chaperoneBasisAcquired = true;
|
m_chaperoneBasisAcquired = true;
|
||||||
LOG( INFO ) << "Chaperone Initilization Complete, Space Drag Now Enabled";
|
qInfo() << "Chaperone Initilization Complete, Space Drag "
|
||||||
|
"Now Enabled";
|
||||||
}
|
}
|
||||||
//}
|
//}
|
||||||
// else
|
// else
|
||||||
|
|||||||
Reference in New Issue
Block a user