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 - name: Show what was built
run: | run: |
ls -la .deps/Frameworks/libobs.framework/Resources/cmake || true
ls -la build/package/bin || true ls -la build/package/bin || true
otool -L build/package/bin/streamer-tools-camera.so || 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. # a from-source libobs build.
option(STPLUGIN_BOOTSTRAP_OBS "Download and build libobs from source (macOS/Windows)" ON) 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) include(osconfig)
if(STPLUGIN_BOOTSTRAP_OBS AND (OS_MACOS OR OS_WINDOWS)) if(STPLUGIN_BOOTSTRAP_OBS AND (OS_MACOS OR OS_WINDOWS))
if(OS_MACOS) if(OS_MACOS)
+37 -16
View File
@@ -163,11 +163,19 @@ function(_setup_obs_studio)
if(OS_WINDOWS) if(OS_WINDOWS)
set(_cmake_generator "${CMAKE_GENERATOR}") set(_cmake_generator "${CMAKE_GENERATOR}")
if(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION) # Plain "-A x64", NOT upstream's "-A x64,version=<Windows SDK>". With a
list(APPEND _cmake_arch -A "${arch},version=${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") # current CMake the ",version=" suffix comes back out verbatim in the
else() # sub-build's CMAKE_VS_PLATFORM_NAME, and obs-studio's OWN dependency
list(APPEND _cmake_arch -A "${arch}") # downloader keys its release assets off that value -- so the sub-configure
endif() # 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}")
list(APPEND _cmake_extra "-DCMAKE_SYSTEM_VERSION=${CMAKE_SYSTEM_VERSION}") list(APPEND _cmake_extra "-DCMAKE_SYSTEM_VERSION=${CMAKE_SYSTEM_VERSION}")
elseif(OS_MACOS) elseif(OS_MACOS)
# Ninja, not upstream's Xcode generator. A runner with only the Command # 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") message(STATUS "Build ${label} (Release - ${arch}) - done")
# Install only libobs's own rules, not the whole build tree's. Installing # Install the whole build tree, and tolerate a non-zero exit.
# from the top-level build directory walks every subproject's #
# cmake_install.cmake, including UI/obs-frontend-api's, which then fails on # Installing from the top-level build directory walks every subproject's
# a binary that was deliberately never built: # 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 # file INSTALL cannot find ".../obs-frontend-api.dylib": No such file
# #
# Pointing --install at the libobs subdirectory installs the framework / # Restricting --install to the libobs subdirectory avoids that error, but
# import library, the headers, and libobsConfig.cmake + libobsTargets.cmake # then the per-configuration export file (libobsTargets-release.cmake) never
# -- everything find_package(libobs) needs -- and nothing else. # 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})") message(STATUS "Install ${label} (${arch})")
execute_process( execute_process(
COMMAND COMMAND
"${CMAKE_COMMAND}" --install build_${arch}/libobs --component Development --config Release --prefix "${CMAKE_COMMAND}" --install build_${arch} --component Development --config Release --prefix "${dependencies_dir}"
"${dependencies_dir}"
WORKING_DIRECTORY "${dependencies_dir}/${_obs_destination}" WORKING_DIRECTORY "${dependencies_dir}/${_obs_destination}"
RESULT_VARIABLE _process_result RESULT_VARIABLE _install_result
COMMAND_ERROR_IS_FATAL ANY 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") message(STATUS "Install ${label} (${arch}) - done")
endfunction() endfunction()