ci: restore the full OBS install, and stop passing a Windows SDK to -A
Build / macOS (macos-latest) (push) Failing after 23s
Build / Linux (ubuntu-24.04) (push) Successful in 56s
Build / Windows (windows-latest) (push) Failing after 9m22s

Two more findings from the three-platform run, both from reading the actual
CI logs rather than guessing.

macOS. libobs now builds, installs, and is FOUND by find_package -- and then
every consumer fails with:

  IMPORTED_LOCATION or IMPORTED_IMPLIB not set for imported target
  "OBS::libobs" configuration "Release".

Restricting --install to the libobs subdirectory (the previous commit's fix
for the obs-frontend-api install error) also loses the per-configuration
export file, so libobsTargets.cmake lands without its
libobsTargets-release.cmake sibling and the imported target has no location
for any configuration. The install therefore goes back to the whole build
tree, exactly as upstream does, with its exit code tolerated: it gets all the
way through libobs and only then trips over the install rule of a target this
build deliberately skips. If libobs genuinely did not install,
find_package(libobs) in the top-level CMakeLists is where that surfaces, with
a far better message than a half-installed tree.

Belt and braces, the top-level CMakeLists also picks up
obs-plugintemplate's CMAKE_MAP_IMPORTED_CONFIG_* fallbacks, so an imported
target exported under a different configuration name still resolves.

Windows. The sub-configure was re-entering obs-studio's OWN dependency
downloader with a corrupted architecture:

  string sub-command JSON member 'hashes windows-x64,version=10.0.26100.0'
    not found
  Unable to download .../windows-deps-2023-11-03-x64,version=10.0.26100.0.zip

Upstream passes "-A x64,version=<Windows SDK>", and with a current CMake that
",version=" suffix comes back out verbatim in the sub-build's
CMAKE_VS_PLATFORM_NAME -- which obs-studio keys its release assets off. Plain
"-A x64" now. The Windows SDK is selected automatically anyway ("Selecting
Windows SDK version 10.0.26100.0" in the same log), and CMAKE_SYSTEM_VERSION
is passed explicitly.

The macOS job also lists the installed libobs export directory, so the next
run answers "which target files actually landed" from CI output instead of
inference.

Linux remains green and unaffected: ctest 6/6.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RL8abRmgFXkVASHkkqiJbE
This commit is contained in:
2026-09-06 22:22:03 -07:00
co-authored by Claude Sonnet 5
parent f281b4c382
commit edb0c02be2
3 changed files with 49 additions and 16 deletions
+1
View File
@@ -79,6 +79,7 @@ jobs:
- name: Show what was built
run: |
ls -la .deps/Frameworks/libobs.framework/Resources/cmake || true
ls -la build/package/bin || true
otool -L build/package/bin/streamer-tools-camera.so || true
+11
View File
@@ -35,6 +35,17 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/common")
# a from-source libobs build.
option(STPLUGIN_BOOTSTRAP_OBS "Download and build libobs from source (macOS/Windows)" ON)
# Fallbacks for imported targets that were exported under a different
# configuration name than the one being built, lifted from
# obs-plugintemplate's cmake/common/bootstrap.cmake. Without these, an
# imported libobs exported as (say) RelWithDebInfo fails a Release build with
# "IMPORTED_LOCATION or IMPORTED_IMPLIB not set for imported target
# OBS::libobs configuration Release".
set(CMAKE_MAP_IMPORTED_CONFIG_RELEASE Release RelWithDebInfo MinSizeRel None "")
set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO RelWithDebInfo Release MinSizeRel None "")
set(CMAKE_MAP_IMPORTED_CONFIG_MINSIZEREL MinSizeRel Release RelWithDebInfo None "")
set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Debug RelWithDebInfo Release MinSizeRel None "")
include(osconfig)
if(STPLUGIN_BOOTSTRAP_OBS AND (OS_MACOS OR OS_WINDOWS))
if(OS_MACOS)
+36 -15
View File
@@ -163,11 +163,19 @@ function(_setup_obs_studio)
if(OS_WINDOWS)
set(_cmake_generator "${CMAKE_GENERATOR}")
if(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION)
list(APPEND _cmake_arch -A "${arch},version=${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
else()
# Plain "-A x64", NOT upstream's "-A x64,version=<Windows SDK>". With a
# current CMake the ",version=" suffix comes back out verbatim in the
# sub-build's CMAKE_VS_PLATFORM_NAME, and obs-studio's OWN dependency
# downloader keys its release assets off that value -- so the sub-configure
# goes looking for a file that cannot exist:
#
# string sub-command JSON member 'hashes windows-x64,version=10.0.26100.0'
# not found
# Unable to download .../windows-deps-2023-11-03-x64,version=10.0.26100.0.zip
#
# The Windows SDK is selected automatically anyway ("Selecting Windows SDK
# version 10.0.26100.0"), and CMAKE_SYSTEM_VERSION is passed below.
list(APPEND _cmake_arch -A "${arch}")
endif()
list(APPEND _cmake_extra "-DCMAKE_SYSTEM_VERSION=${CMAKE_SYSTEM_VERSION}")
elseif(OS_MACOS)
# Ninja, not upstream's Xcode generator. A runner with only the Command
@@ -216,25 +224,38 @@ function(_setup_obs_studio)
)
message(STATUS "Build ${label} (Release - ${arch}) - done")
# Install only libobs's own rules, not the whole build tree's. Installing
# from the top-level build directory walks every subproject's
# cmake_install.cmake, including UI/obs-frontend-api's, which then fails on
# a binary that was deliberately never built:
# Install the whole build tree, and tolerate a non-zero exit.
#
# Installing from the top-level build directory walks every subproject's
# cmake_install.cmake, including UI/obs-frontend-api's, which fails on a
# binary this build deliberately never produced (that is the whole point of
# dropping Qt):
#
# file INSTALL cannot find ".../obs-frontend-api.dylib": No such file
#
# Pointing --install at the libobs subdirectory installs the framework /
# import library, the headers, and libobsConfig.cmake + libobsTargets.cmake
# -- everything find_package(libobs) needs -- and nothing else.
# Restricting --install to the libobs subdirectory avoids that error, but
# then the per-configuration export file (libobsTargets-release.cmake) never
# lands, and every consumer fails with "IMPORTED_LOCATION or IMPORTED_IMPLIB
# not set for imported target OBS::libobs configuration Release". So run the
# full install exactly as upstream does, let it get through libobs, and
# ignore the error it hits afterwards. If libobs really did not install, the
# find_package(libobs) in the top-level CMakeLists is where that surfaces --
# loudly, and with a far more useful message than a half-installed tree.
message(STATUS "Install ${label} (${arch})")
execute_process(
COMMAND
"${CMAKE_COMMAND}" --install build_${arch}/libobs --component Development --config Release --prefix
"${dependencies_dir}"
"${CMAKE_COMMAND}" --install build_${arch} --component Development --config Release --prefix "${dependencies_dir}"
WORKING_DIRECTORY "${dependencies_dir}/${_obs_destination}"
RESULT_VARIABLE _process_result
COMMAND_ERROR_IS_FATAL ANY
RESULT_VARIABLE _install_result
OUTPUT_QUIET
)
if(NOT _install_result EQUAL 0)
message(
STATUS
"Install ${label} (${arch}) reported errors; expected, because install rules exist for "
"targets this build skips. Continuing -- find_package(libobs) is the real check."
)
endif()
message(STATUS "Install ${label} (${arch}) - done")
endfunction()