Skip to content

fix(libffi): publish libffi.so.8 into the subos view - #676

Merged
Sunrisepeak merged 1 commit into
openxlings:mainfrom
FarnaHerry:fix/libffi-so8-publish
Aug 24, 2026
Merged

fix(libffi): publish libffi.so.8 into the subos view#676
Sunrisepeak merged 1 commit into
openxlings:mainfrom
FarnaHerry:fix/libffi-so8-publish

Conversation

@FarnaHerry

Copy link
Copy Markdown
Contributor

问题

libffi 3.4.4 的 tarball 同时携带两条 soname 线(libffi.so.7.1.0libffi.so.8.1.4),但 config() 的发布清单只写了 .so.7:

local libs = { "libffi.so", "libffi.so.7" }

针对 .so.8 构建的下游 —— xim:glib 2.80.0 就是,它的 libgio NEEDs libffi.so.8 —— 在 mcpp 的运行时闭包检查里失败:

runtime closure ... cannot be satisfied: libffi.so.8 ... not found on the search path

payload 里明明有 libffi.so.8,但闭包检查搜的是 subos 视图,而视图没发布它。

修复

发布清单补上 libffi.so.8(一行,另加注释说明为什么两条 soname 线都要在)。已在本机验证:修复后重装 libffi,视图出现 libffi.so.8,glib 链路闭包检查通过。

背景

这是在给 mcpp-index 的 compat.eui-neo 启用 Linux SNI 托盘(EUI_TRAY_SNI,glib/gio over GDBus)时暴露的,mcpplibs/mcpp-index#245 的 CI 依赖本修复先合入。

The 3.4.4 tarball ships both soname lines (libffi.so.7.1.0 and
libffi.so.8.1.4) but the publish list names only .so.7. Consumers built
against .so.8 — xim:glib 2.80.0 is one, its libgio NEEDs libffi.so.8 —
then fail mcpp's runtime closure check even though the payload carries
the file: the view is what the closure searches, and the view lacks it.
FarnaHerry added a commit to FarnaHerry/mcpp-index that referenced this pull request Aug 23, 2026
…ies not symlinks

CI on the previous commit failed cold with 'libffi.so.8 is not in this
subos'. Root cause chain: xim:glib's libgio NEEDs libffi.so.8; libffi's
publish list names only .so.7 though the tarball ships both; the runtime
closure searches the subos VIEW, so the missing publish is fatal even
though the store holds the file. openxlings/xim-pkgindex#676 fixes the
list upstream, but the descriptor must not hinge on it:

* resolve() now tiers view -> xim STORE. The view alone is unreliable at
  hook time in both directions: a publish list can lag the payload
  (libffi.so.8), and a package already cached in the store skips the
  config() run that would publish it, leaving a fresh project view
  without pcre2/zlib (observed on a wiped .mcpp/). The store is complete
  from the moment a dep is fetched, which for xpm deps is strictly
  before this hook runs. XLINGS_HOME provides the second store root.
* stage() now COPIES instead of symlinking. The subos view is
  project-local while the payload is shared across projects: a staged
  symlink dangled the moment the providing project's .mcpp/ was wiped
  (observed: 'gio/gio.h file not found' off a shared payload). Copies
  make the payload self-contained; it is version-immutable and already
  on the consumer's RPATH, so nothing is lost.
* header staging gets the same view->store treatment; os.files/os.dirs
  are not in the xpm sandbox, so globbing goes through the shell.

Verified locally against the CI shape: live pkgindex with the libffi
fix REVERTED, all hand-made subos workarounds removed, payload and
project store wiped — eui-neo passes cold, the other five members pass
against the shared self-contained payload.
@FarnaHerry

Copy link
Copy Markdown
Contributor Author

@Sunrisepeak

@Sunrisepeak
Sunrisepeak merged commit b248baf into openxlings:main Aug 24, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants