diff --git a/houdini/CLAUDE.md b/houdini/CLAUDE.md index 1517a6b..b374e4e 100644 --- a/houdini/CLAUDE.md +++ b/houdini/CLAUDE.md @@ -38,6 +38,55 @@ to read this — it's implementation reasoning, not usage docs (those are in and symlinks it to `/opt/hfs` itself, so `houdini-run` and the `/etc/profile.d` snippet don't need to know the exact version. +## SideFX Labs — baked in, not installed at runtime + +Simon hit `No such file or directory` using Houdini's own in-app package +installer for Labs. Root cause (confirmed, not guessed): this image never +installed `ca-certificates`, so any HTTPS download from inside the container +fails TLS verification — reproduced directly with `wget` against +`github.com` inside a test build (`wget` exit 5, "cannot verify github.com's +certificate"). The in-app installer's `No such file or directory` is almost +certainly it shelling out to `git` (also never installed) for the same +underlying reason: no working way to fetch anything over HTTPS. `wget` was +already installed and used fine elsewhere in this Dockerfile, so the gap was +specifically the missing CA bundle, not a missing downloader. Fixed by +adding `ca-certificates` to the apt-get install list (`base` stage). + +Rather than also install `git` and instruct Simon to run the in-app +installer, Labs is fetched and baked in at build time: + +- Downloaded from a GitHub **release tag** + (`https://github.com/sideeffects/SideFXLabs/archive/refs/tags/.tar.gz`), + pinned via `ARG SIDEFXLABS_VERSION`, same pattern as `HOUDINI_EULA_DATE` — + unpinned upstream, pick the newest tag whose `target_commitish` is + `Development` and whose bundled `SideFXLabs.json` `enable` range covers + this image's Houdini version. Checked via the GitHub releases API at + writing time: tag `22.0.440` declares + `"enable": "houdini_version >= '22.0' and houdini_version < '22.5'"`, + which covers this image's `22.0.429`. +- Extracted straight into **`$HFS/packages/SideFXLabs22.0/`**, with the + vendored `SideFXLabs.json` copied up to `$HFS/packages/SideFXLabs22.0.json` + unmodified. This location was not a guess: `$HFS/packages` is where + Houdini's *own* shipped optional packages already live (confirmed by + listing the real installed tree in a test build — `apex`, `kinefx`, + `ocio`, `sculpt`, `shotbuilder`, `texturepaint` all follow the exact same + `.json` + `/` pattern there). It's also documented as a + package search path independent of `$HOME` + (https://www.sidefx.com/docs/houdini/ref/plugins.html), which matters + specifically because distrobox bind-mounts the host's `$HOME` over + whatever the image ships under `$HOUDINI_USER_PREF_DIR` — anything baked + in there would be invisible at runtime. No edits to the vendored JSON were + needed: its default `"$HOUDINI_PACKAGE_PATH/SideFXLabs22.0"` already + resolves correctly, since `HOUDINI_PACKAGE_PATH` just means "the directory + this json file itself lives in". +- Verified end-to-end in a real build: `ca-certificates` fix lets `wget` + fetch the release tarball; extracted tree has 452 `.hda` files under + `otls/`; `$HFS/packages/SideFXLabs22.0.json` present and well-formed. + **Not** verified against a real license + GUI launch (Apprentice + activation needs a real SideFX login, out of scope for this check) — the + Labs menu actually appearing in a running Houdini session is unconfirmed, + though the mechanism matches Houdini's own shipped packages exactly. + ## Runtime library list SideFX's own package list in `docker/Ubuntu/Dockerfile` is built for headless @@ -155,6 +204,7 @@ Everything below was confirmed with an actual build + an actual | GUI rendering via XWayland (Hyprland host) | High | Confirmed real AMD hardware acceleration (`glxinfo`: direct rendering, AMD Radeon Vega renderer, not llvmpipe). First launch was slow (container's first-run package install + cold start); later launches fluid. | | AMD OpenCL (sims) | Low | Not set up; needs ROCm/rusticl. GL/Vulkan viewport is unaffected. | | NVIDIA variant | Untested | Builds fine (same base, no extra packages), but never run against real NVIDIA hardware — only the `amd` target has been used end to end. | +| SideFX Labs baked into `$HFS/packages` | Medium | Build-time fetch + extraction confirmed (452 `.hda`s, well-formed json), and the target path matches Houdini's own shipped packages exactly — but never confirmed against a real license + GUI launch that the Labs menu actually appears. | ## Repo-wide conventions diff --git a/houdini/Dockerfile b/houdini/Dockerfile index d282a35..17ab5cb 100644 --- a/houdini/Dockerfile +++ b/houdini/Dockerfile @@ -12,9 +12,13 @@ ARG HOUDINI_TARBALL=houdini-linux.tar.gz # unrelated houdini_installer launcher tool). Current EULA date: 2021-10-13, # see https://www.sidefx.com/legal/license-agreement/ ARG HOUDINI_EULA_DATE=2021-10-13 +# Github release tag at https://github.com/sideeffects/SideFXLabs/releases — +# pick the newest tag whose target branch is "Development" and whose bundled +# SideFXLabs.json "enable" range covers this image's Houdini version. +ARG SIDEFXLABS_VERSION=22.0.440 RUN apt-get update && apt-get install -y --no-install-recommends \ - sudo procps \ + sudo procps ca-certificates \ bc fontconfig wget libasound2 libgl1 libglu1 libglu1-mesa libglx0 \ libegl1 libatomic1 libxkbfile1 libxcb-cursor0 \ libice6 libnss3 libopengl0 libpci3 libsm6 libx11-6 libx11-xcb1 \ @@ -43,6 +47,27 @@ RUN chmod +x /usr/local/bin/houdini-run && \ printf 'if [ -d /opt/hfs ]; then _p="$PWD"; cd /opt/hfs && . ./houdini_setup >/dev/null 2>&1; cd "$_p"; fi\n' \ > /etc/profile.d/houdini.sh +# SideFX Labs, baked in rather than installed through Houdini's own in-app +# package installer. That installer writes into $HOUDINI_USER_PREF_DIR +# (under $HOME), which distrobox bind-mounts from the host over whatever the +# image ships there — so anything baked in under $HOME would just be +# shadowed at runtime, and doing it live means every container needs its own +# git-clone/download at first launch (this is also almost certainly the +# actual source of the "no such file or directory": the installer shells out +# to `git`, which this image never installed). +# $HFS/packages is a package-search path Houdini scans unconditionally, +# independent of $HOME (see `houdini/ref/plugins.html` in SideFX's docs), so +# drop the official package descriptor + the Labs tree there untouched: the +# descriptor's default `$HOUDINI_PACKAGE_PATH/SideFXLabs22.0` already +# resolves correctly since HOUDINI_PACKAGE_PATH is just "wherever this json +# file lives". +RUN mkdir -p /opt/hfs/packages/SideFXLabs22.0 && \ + wget -qO /tmp/sidefxlabs.tar.gz \ + "https://github.com/sideeffects/SideFXLabs/archive/refs/tags/${SIDEFXLABS_VERSION}.tar.gz" && \ + tar xzf /tmp/sidefxlabs.tar.gz --strip-components=1 -C /opt/hfs/packages/SideFXLabs22.0 && \ + cp /opt/hfs/packages/SideFXLabs22.0/SideFXLabs.json /opt/hfs/packages/SideFXLabs22.0.json && \ + rm /tmp/sidefxlabs.tar.gz + FROM base AS amd RUN apt-get update && apt-get install -y --no-install-recommends \ libgl1-mesa-dri libglx-mesa0 mesa-vulkan-drivers && \ diff --git a/houdini/README.md b/houdini/README.md index e5846d7..070e1b2 100644 --- a/houdini/README.md +++ b/houdini/README.md @@ -1,5 +1,10 @@ # Houdini Apprentice in distrobox +SideFX Labs is baked into the image at build time (see `SIDEFXLABS_VERSION` +below) — no need to install it from Houdini's own package menu, which needs +`git` and a working CA bundle that this image doesn't ship. The Labs menu +should just appear in Houdini's menu bar on first launch. + Two images built from the same `Dockerfile`, pushed to a private registry, used via distrobox: @@ -32,11 +37,16 @@ TARBALL=houdini-22.0.429-linux_x86_64_gcc14.2.tar.gz # Date the EULA at https://www.sidefx.com/legal/license-agreement/ was last # updated, format YYYY-MM-DD, no "SideFX-" prefix. EULA_DATE=2021-10-13 +# Release tag at https://github.com/sideeffects/SideFXLabs/releases — pick +# the newest tag whose bundled SideFXLabs.json "enable" range covers your +# Houdini version (default below already matches 22.0.429). +SIDEFXLABS_VERSION=22.0.440 # Build amd image podman build -f Dockerfile \ --build-arg "HOUDINI_TARBALL=${TARBALL}" \ --build-arg "HOUDINI_EULA_DATE=${EULA_DATE}" \ + --build-arg "SIDEFXLABS_VERSION=${SIDEFXLABS_VERSION}" \ --target "amd" \ -t "${REGISTRY}/houdini-amd:${VERSION}" \ -t "${REGISTRY}/houdini-amd:latest" . @@ -45,6 +55,7 @@ podman build -f Dockerfile \ podman build -f Dockerfile \ --build-arg "HOUDINI_TARBALL=${TARBALL}" \ --build-arg "HOUDINI_EULA_DATE=${EULA_DATE}" \ + --build-arg "SIDEFXLABS_VERSION=${SIDEFXLABS_VERSION}" \ --target "nvidia" \ -t "${REGISTRY}/houdini-nvidia:${VERSION}" \ -t "${REGISTRY}/houdini-nvidia:latest" .