Skip to content

chore(ci) : expand lib targets - #50

Open
aheev wants to merge 17 commits into
lance-format:mainfrom
aheev:widen-targets
Open

aheev wants to merge 17 commits into
lance-format:mainfrom
aheev:widen-targets

Conversation

@aheev

@aheev aheev commented Jun 24, 2026 •

Copy link
Copy Markdown
  • target lower GLIBC(2.28) via manylinux images
  • mandate C++ standard
  • set macos min-deployment-target to 11.0
  • As all items in the roadmap are checked, removed them from README

@aheev aheev changed the title Expand lib targets chore(ci) : expand lib targets Jun 24, 2026
@aheev

aheev commented Jun 24, 2026

Copy link
Copy Markdown
Author

@LuciferYang @jja725 could you PTAL? Also, should we have a formatter for C/C++ like clang-format?

Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread CMakeLists.txt Resolved
Comment thread examples/cmake-consumer/CMakeLists.txt Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release.yml Resolved
Comment thread .github/workflows/release.yml Resolved
@aheev

aheev commented Jun 25, 2026

Copy link
Copy Markdown
Author

@LuciferYang the build is still failing. I will fix them and ping you once it is ready

@aheev
aheev force-pushed the widen-targets branch 4 times, most recently from 2087e62 to 946a7e0 Compare June 28, 2026 10:08
@aheev

aheev commented Jun 28, 2026

Copy link
Copy Markdown
Author

@LuciferYang can you please take a look now? I have removed zig. Instead manylinux2_28 images are used for GLIBC 2.28 support. PR is a lot simpler now

@aheev

aheev commented Jul 7, 2026

Copy link
Copy Markdown
Author

@LuciferYang gentle ping

@jja725 jja725 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Heads up before anything else: I opened #53 yesterday doing a subset of what this does (Debian 12 container for a glibc 2.36 floor, release workflow only). I didn't check for open PRs first, which was sloppy of me. This one is older, goes lower (2.28), and covers CI and the smoke test too, so it supersedes mine. Happy to close #53 if this lands. They also touch the same lines in release.yml, so they can't both go in as-is.

Separately, this is showing as conflicting against main and hasn't been updated since early July, so it needs a rebase either way.

The glibc work itself is the right idea and I want it. Most of what's below is about the other four things that came along with it.

Things I'd want changed before merging

Pin the container images. quay.io/pypa/manylinux_2_28_x86_64 with no tag means latest, and pypa rebuilds those regularly. In CI that's mildly annoying. In release.yml it means the binaries we publish aren't reproducible, and an upstream image push can break a release with no change on our side. What's odd is that clang is pinned to 20.1.8.0 exactly, so the toolchain is nailed down but the image handing it to us isn't. A digest pin would settle it.

Why C++20? I went through lance.hpp and it includes <array> <cstdint> <memory> <optional> <stdexcept> <string> <utility> <vector>, with no concepts, ranges, <format>, <span>, coroutines, or <=> anywhere. As far as I can tell nothing in the public headers needs it. Meanwhile CMAKE_CXX_STANDARD 20 plus the bumps to the consumer example, the Conan test_package, and compile_and_run_test.rs push C++20 onto everyone downstream.

That sits awkwardly against the rest of the PR: we widen the glibc floor so more people can consume this, then narrow the language floor so fewer can. There's also a wrinkle specific to manylinux, whose docs note its clang still uses the libgcc/libstdc++ from the image, so the C++20 library surface isn't fully there anyway. If there's a concrete reason I'm missing I'm happy to be talked into it, but right now C++17 looks like it keeps more doors open.

The visibility presets don't do anything. CMAKE_C_VISIBILITY_PRESET, CMAKE_CXX_VISIBILITY_PRESET and CMAKE_VISIBILITY_INLINES_HIDDEN only apply to targets CMake compiles. liblance_c comes out of cargo via Corrosion, and everything else here is INTERFACE or IMPORTED, so no target in the project is affected. It reads like symbol hardening but changes nothing in the shipped library. If hiding symbols is the actual goal it has to happen on the Rust side.

Two with: blocks quietly disappear from release.yml: target: on setup-rust-toolchain and key: on rust-cache, neither mentioned in the description. The target one is probably harmless since every runner is native for its triple. The cache key I'm less sure about: both Linux rows are runner.os == Linux under the same job id, and I think rust-cache disambiguates on the rustc host triple, but I haven't verified that. Putting the key back costs nothing and removes the question.

Smaller things

.github/baseline.env is now a hard build dependency. baseline.cmake raises FATAL_ERROR if it's missing, on every platform, for a value only macOS uses. I checked and this won't break packaging today: both vcpkg_from_github and Conan's get() pull the GitHub source tarball, and there's no .gitattributes export-ignore, so .github/ ships. But a required build input living in a directory everyone reads as "CI stuff" is asking for someone to prune it later. cmake/baseline.env would say what it means. I'd also make the missing-file case non-fatal off macOS.

Related: that file now has two parsers with different rules. CI does set -a; source, CMake does a hand-rolled regex. Shell handles export FOO=bar, quoted values, ${VAR}, and trailing comments. The CMake side handles none of them. Write MACOSX_DEPLOYMENT_TARGET="11" and shell gives you 11 while CMake gives you "11", quotes included. That's a silent divergence in the one value the file exists to keep in sync. Either document the accepted format in the file itself, or generate one side from the other.

The protoc install block is copy-pasted six times (four jobs in ci.yml, plus the smoke test and release). A composite action under .github/actions/ would make the next version bump a one-line change.

Deleting the roadmap feels like its own PR. It's 50 lines of README in a change titled "expand lib targets", and #46 and #48 exist purely to tick boxes in it, so somebody clearly cares about keeping it current. Could it go in a collapsed <details> block instead of away entirely?

We now advertise "GLIBC baseline 2.28" in the README with nothing in CI checking it, so the first regression shows up on a user's machine rather than in a build. I had a go at this on my branch (readelf --dyn-syms on the .so, nm --undefined-only on the .a, take the highest GLIBC_ version, fail if it's above the floor) and can hand it over if it's useful.

Minor, but the rustfmt and license-header jobs now pull a multi-gigabyte manylinux image to run cargo fmt and a grep loop. Neither produces a binary, so that's pure wall-clock cost.

A few nits:

  • the arch case has no default branch, so an unexpected uname -m leaves PA empty and you get a 404 on protoc-25.3-.zip instead of a useful error
  • the protoc zip isn't checksummed, which is a little inconsistent given how precisely clang is pinned
  • manylinux-install-clang is marked BETA upstream, worth knowing we're leaning on it
  • the Install Clang 20 (Linux) body is indented 12 spaces where its siblings use 10

Things I liked

The shasum/sha256sum fallback is a good catch. macOS has no sha256sum and manylinux has no shasum, so you genuinely need both arms and it's the kind of thing that only bites you at release time. Pinning protoc instead of taking whatever the distro ships is worth having on its own. timeout-minutes on publish closes a real gap. And keeping the deployment target in one place so CMake and CI can't drift is the right instinct, even if I'd move the file.

@aheev

aheev commented Aug 6, 2026

Copy link
Copy Markdown
Author

Heads up before anything else: I opened #53 yesterday doing a subset of what this does (Debian 12 container for a glibc 2.36 floor, release workflow only). I didn't check for open PRs first, which was sloppy of me. This one is older, goes lower (2.28), and covers CI and the smoke test too, so it supersedes mine. Happy to close #53 if this lands. They also touch the same lines in release.yml, so they can't both go in as-is.

Separately, this is showing as conflicting against main and hasn't been updated since early July, so it needs a rebase either way.

The glibc work itself is the right idea and I want it. Most of what's below is about the other four things that came along with it.

Things I'd want changed before merging

...
Why C++20? I went through lance.hpp and it includes <array> <cstdint> <memory> <optional> <stdexcept> <string> <utility> <vector>, with no concepts, ranges, <format>, <span>, coroutines, or <=> anywhere. As far as I can tell nothing in the public headers needs it. Meanwhile CMAKE_CXX_STANDARD 20 plus the bumps to the consumer example, the Conan test_package, and compile_and_run_test.rs push C++20 onto everyone downstream.

That sits awkwardly against the rest of the PR: we widen the glibc floor so more people can consume this, then narrow the language floor so fewer can. There's also a wrinkle specific to manylinux, whose docs note its clang still uses the libgcc/libstdc++ from the image, so the C++20 library surface isn't fully there anyway. If there's a concrete reason I'm missing I'm happy to be talked into it, but right now C++17 looks like it keeps more doors open.

The motivation behind bumping C++ version is to utilise the above mentioned features and C++17 is almost a decade old. Even the new fundamental features like std::format require C++ 20

That said, since manylinux libstdc++ doesn't ship all the features, we can reduce it back to 17

The visibility presets don't do anything. CMAKE_C_VISIBILITY_PRESET, CMAKE_CXX_VISIBILITY_PRESET and CMAKE_VISIBILITY_INLINES_HIDDEN only apply to targets CMake compiles. liblance_c comes out of cargo via Corrosion, and everything else here is INTERFACE or IMPORTED, so no target in the project is affected. It reads like symbol hardening but changes nothing in the shipped library. If hiding symbols is the actual goal it has to happen on the Rust side.

I have only added it for posterity. Rust exports only the ones explicitly marked pub extern

Two with: blocks quietly disappear from release.yml: target: on setup-rust-toolchain and key: on rust-cache, neither mentioned in the description. The target one is probably harmless since every runner is native for its triple. The cache key I'm less sure about: both Linux rows are runner.os == Linux under the same job id, and I think rust-cache disambiguates on the rustc host triple, but I haven't verified that. Putting the key back costs nothing and removes the question.

official doc:

An additional cache key that is added alongside the automatic job-based
cache key and can be used to further differentiate jobs.
default: empty

I think it uses job id for cache key

Smaller things

...
Deleting the roadmap feels like its own PR. It's 50 lines of README in a change titled "expand lib targets", and #46 and #48 exist purely to tick boxes in it, so somebody clearly cares about keeping it current. Could it go in a collapsed <details> block instead of away entirely?

sure will do it in a separate PR

We now advertise "GLIBC baseline 2.28" in the README with nothing in CI checking it, so the first regression shows up on a user's machine rather than in a build. I had a go at this on my branch (readelf --dyn-syms on the .so, nm --undefined-only on the .a, take the highest GLIBC_ version, fail if it's above the floor) and can hand it over if it's useful.

As long as we are using quay.io/pypa/manylinux_2_28_x86_64 images baseline should be respected, shouldn't it 🤔 .

Minor, but the rustfmt and license-header jobs now pull a multi-gigabyte manylinux image to run cargo fmt and a grep loop. Neither produces a binary, so that's pure wall-clock cost.

will change to official GH images

I will address rest of the comments in the next commit

@Xuanwo
Xuanwo requested review from lance-community and removed request for lance-community August 8, 2026 10:48
@lance-gatekeeper
lance-gatekeeper Bot removed the request for review from lance-community August 8, 2026 11:02

@lance-gatekeeper lance-gatekeeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ Gate recommendation: request changes.

The manylinux direction fixes the demonstrated root cause: the existing v0.1.2 Linux artifact reaches GLIBC_2.39. The remaining blockers share two release contracts: shipped artifacts must prove their advertised runtime floors, and executable inputs to a write-capable release job must be immutable and integrity-checked.

A viable revision would use digest-pinned build roots, restrict the build job to read-only repository access, verify downloaded tools, and gate upload on Linux/Mach-O artifact plus packaged static/shared consumer checks.

Please mark this PR with the breaking-change label.

runner: ubuntu-24.04-arm
os_label: linux
- os: ubuntu-24.04
container: quay.io/pypa/manylinux_2_28_x86_64

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These release builders are untagged references, so they resolve a mutable latest. An upstream rebuild can silently change the toolchain, platform guarantee, or shipped bytes. Because the workflow grants contents: write, this also gives mutable third-party code unnecessary release authority. Pin both images by digest and give the build job contents: read, reserving write permission for publishing.

run: |
ARCH=$(uname -m)
case "${ARCH}" in x86_64) PA="linux-x86_64" ;; aarch64) PA="linux-aarch_64" ;; esac
curl -fsSL "https://github.com/protocolbuffers/protobuf/releases/download/v25.3/protoc-25.3-${PA}.zip" -o /tmp/protoc.zip

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v25.3 identifies a release but does not authenticate this executable. A replaced or corrupted asset is installed into /usr/local and executed during the release build. Verify a fixed SHA-256 for each architecture before installing it.

@@ -74,8 +87,13 @@ jobs:
TARGET=${{ matrix.target }}
ARCHIVE="lance-c-v${VERSION}-${TARGET}.tar.xz"
tar -C stage -cJf "${ARCHIVE}" .

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The compatibility claim is not asserted on the files packaged here, so a toolchain or dependency regression can still ship an incompatible release. I inspected v0.1.2 and its x86_64 .so requires symbols through GLIBC_2.39; this environment could not execute the proposed container, leaving the current-head ceiling unverified. Before upload, reject Linux symbols above 2.28 and unexpected dependencies, inspect macOS minos, and link/run packaged static and shared consumers for both Linux architectures.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After recalibrating this request against the concrete failure path, I’m withdrawing it as a merge blocker. Building and linking inside the manylinux 2.28 runtime constrains available GLIBC symbols by construction; an explicit ELF/Mach-O audit would improve regression evidence, but no current-head artifact failure is established. I’ll carry the missing audit as non-blocking evidence debt.

@Xuanwo Xuanwo added the K-changes Latest Gatekeeper recommendation requests changes. label Aug 10, 2026
@aheev

aheev commented Aug 10, 2026

Copy link
Copy Markdown
Author

Occupied with something else. Will get back to it by EOW or next week

@lance-gatekeeper lance-gatekeeper Bot removed the K-changes Latest Gatekeeper recommendation requests changes. label Sep 17, 2026
lance-gatekeeper[bot]

This comment was marked as outdated.

@Xuanwo

Xuanwo commented Nov 12, 2026

Copy link
Copy Markdown
Member

Thanks for contributing the manylinux 2.28 support. We'd like to move this forward alongside the existing Debian 12 packages. Are you still planning to update this PR? If you'd like help bringing it up to date with main, I'm happy to contribute follow-up commits here while preserving your work and commit history.

@lance-gatekeeper lance-gatekeeper Bot added K-changes Latest Gatekeeper recommendation requests changes. and removed K-changes Latest Gatekeeper recommendation requests changes. labels Nov 12, 2026
@aheev

aheev commented Nov 12, 2026

Copy link
Copy Markdown
Author

Thanks for contributing the manylinux 2.28 support. We'd like to move this forward alongside the existing Debian 12 packages. Are you still planning to update this PR? If you'd like help bringing it up to date with main, I'm happy to contribute follow-up commits here while preserving your work and commit history.

Yes. Thanks for the bump. I will try to resolve the comments by this weekend

@lance-gatekeeper lance-gatekeeper Bot added K-changes Latest Gatekeeper recommendation requests changes. and removed K-changes Latest Gatekeeper recommendation requests changes. labels Nov 12, 2026
@lance-gatekeeper lance-gatekeeper Bot removed the K-changes Latest Gatekeeper recommendation requests changes. label Nov 12, 2026

@lance-gatekeeper lance-gatekeeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ Gate recommendation: request changes.

2 findings remain / 4 new.

Manylinux 2.28 remains a useful way to lower the Linux ABI floor, but the merge now breaks release-matrix execution. Preserve the existing runner/platform metadata and separate setup by container family, keeping the Debian 12 packages introduced by #53 and the macOS paths working alongside manylinux.

The earlier release supply-chain requirements also remain: pin the manylinux builders, integrity-check the new Linux protoc downloads, and reserve repository write permission for publishing. The previous request for additional compatibility auditing remains withdrawn as a merge prerequisite.

build:
name: Build (${{ matrix.target }}${{ matrix.artifact_suffix }})
runs-on: ${{ matrix.runner }}
runs-on: ${{ matrix.os }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

matrix.os is absent from both Debian 12 rows and both macOS rows: those still define runner. Their runs-on therefore expands to an empty value, so the retained release matrix cannot schedule all of its builds and the publish job cannot complete. Keep runs-on: ${{ matrix.runner }} and use runner on the new manylinux rows, or migrate every row consistently.

Reproducer

Run from the checkout:

node <<'JS'
const fs = require('node:fs');
const s = fs.readFileSync('.github/workflows/release.yml', 'utf8');
const matrix = s.split('        include:\n')[1].split('\n    env:')[0];
const rows = matrix.split(/\n          - /).slice(1);
const missing = rows.filter(row => !/(?:^|\n)\s*os:/.test(row));
console.log(`${missing.length} release rows lack matrix.os`);
if (missing.length) process.exitCode = 1;
JS

Expected: every row supplies the selected runner key. Observed: 4 release rows lack matrix.os and exit 1. The base uses matrix.runner, which every base row supplies.

container: ""
- os: ubuntu-24.04
container: quay.io/pypa/manylinux_2_28_x86_64
target: x86_64-unknown-linux-gnu

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both replacement Linux rows drop os_label: linux, but the retained staging steps still consume it. In particular, stripping expands to bash .github/scripts/strip-release-shared.sh stage, which exits 2 before packaging; the Linux export/runtime guards would also be skipped. Restore os_label: linux on both rows so they retain the existing Linux package path.

Reproduced against this head with bash .github/scripts/strip-release-shared.sh stage: it prints usage: ... <install-prefix> <linux|macos> and exits 2. The expected expanded invocation includes the second argument linux.

os_label: linux
container: ""
- os: ubuntu-24.04
container: quay.io/pypa/manylinux_2_28_x86_64

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This image change also selects the inherited Install build dependencies (container) step, which still runs apt-get update and installs Debian package names. Manylinux 2.28 is AlmaLinux 8-based, using yum/dnf rather than apt. Both new Linux release rows therefore have an incompatible bootstrap before checkout. Restrict the Debian bootstrap to Debian images and provide the required manylinux tools using its own package manager/preinstalled tools.

Bounded reproducer

I could not execute a container in this environment. This check, run against the checkout, establishes the incompatible step selection rather than claiming a completed container run:

node <<'JS'
const fs = require('node:fs');
const s = fs.readFileSync('.github/workflows/release.yml', 'utf8');
const rows = s.split('        include:\n')[1].split('\n    env:')[0];
const bootstrap = s.split('      - name: Install build dependencies (container)')[1].split('      - uses: actions/checkout')[0];
if (rows.includes('quay.io/pypa/manylinux_2_28_') && bootstrap.includes("if: matrix.container != ''") && bootstrap.includes('apt-get update')) {
  console.error('FAIL: AlmaLinux manylinux rows select the Debian apt-get bootstrap');
  process.exitCode = 1;
}
JS

Expected: the AlmaLinux rows do not select apt setup. Observed: the check fails; the base has no AlmaLinux rows routed to this step.

curl -fsSL "https://github.com/protocolbuffers/protobuf/releases/download/v25.3/protoc-25.3-${PA}.zip" -o /tmp/protoc.zip
unzip -o /tmp/protoc.zip -d /usr/local bin/protoc 'include/*' && rm /tmp/protoc.zip
- name: Install Clang 20 (Linux)
if: runner.os == 'Linux'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

runner.os == 'Linux' includes the two retained debian:12 rows, but their bootstrap installs Debian's clang/protoc, not manylinux-install-clang. Even after fixing runner selection, these rows are routed to an unavailable image-specific tool and cannot reach the build. Keep the new setup on manylinux rows and retain the existing Debian package setup. That also avoids sending Debian through the new zip extraction path without installing unzip.

Bounded reproducer

Full container execution was unavailable here. This checkout-level check verifies the erroneous routing:

node <<'JS'
const fs = require('node:fs');
const s = fs.readFileSync('.github/workflows/release.yml', 'utf8');
const linux = s.split('      - name: Install Clang 20 (Linux)')[1].split('      - name: Install protobuf (macOS)')[0];
if (s.includes('container: "debian:12"') && linux.includes("if: runner.os == 'Linux'") && linux.includes('manylinux-install-clang')) {
  console.error('FAIL: Debian rows select an uninstalled manylinux-only tool');
  process.exitCode = 1;
}
JS

Expected: Debian rows use their declared distro tooling. Observed: the check fails; the base does not invoke this manylinux helper.

@lance-gatekeeper lance-gatekeeper Bot added the K-changes Latest Gatekeeper recommendation requests changes. label Nov 12, 2026
@Xuanwo

Xuanwo commented Nov 13, 2026

Copy link
Copy Markdown
Member

The Linux baseline decision in #103 is now settled: future generic x86_64 and AArch64 official packages will target glibc 2.28, alongside the existing Debian 12 variants and C++17 consumer contract. Both architectures have passed native manylinux_2_28 installed and freshly extracted static/shared consumer checks; #103 records the candidate identities and coverage limits.

Your update here remains the integration path. The accepted feasibility evidence can be reused where inputs are unchanged; the updated release workflow and its package/consumer paths still need integration acceptance. This policy applies to future packages and does not replace historical release assets.

@lance-gatekeeper lance-gatekeeper Bot removed the K-changes Latest Gatekeeper recommendation requests changes. label Nov 13, 2026

@lance-gatekeeper lance-gatekeeper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❌ Gate recommendation: request changes.

6 findings remain / 1 new.

The baseline decision settles glibc 2.28 for future generic Linux x86_64/AArch64 packages alongside Debian 12 variants and C++17 consumers; historical release assets are unchanged. #103 records scoped native feasibility, not acceptance of this PR’s workflow.

The recommendation is unchanged: restore consistent matrix metadata and separate Debian/manylinux setup, retaining the macOS release paths. Make the manylinux install physically use lib/ so staging and package consumers agree; the accepted experiments explicitly selected that layout.

The release supply-chain boundary also remains: pin the builders, verify Linux protoc archives, and reserve repository write permission for publishing. Reuse candidate evidence where build inputs match; the earlier blanket compatibility-audit request remains withdrawn.

os_label: linux
container: ""
- os: ubuntu-24.04
container: quay.io/pypa/manylinux_2_28_x86_64

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These AlmaLinux-based manylinux images default to CMAKE_INSTALL_LIBDIR=lib64, while the release configure command leaves that setting unspecified. Installation therefore puts the libraries under stage/lib64, but stripping, export verification and consumer checks require stage/lib. Even after the existing matrix/bootstrap findings are fixed, both new Linux rows stop before packaging. Set -DCMAKE_INSTALL_LIBDIR=lib in the release configuration, matching the physical layout exercised by the accepted candidate driver. Changing only the install prefix does not change the cached library subdirectory.

Bounded reproducer

Containers are unavailable here. This current-head check uses placeholder libraries and the image’s recorded lib64 setting to exercise installation and staging, not a Rust build or container execution:

work=$(mktemp -d)
mkdir -p "$work/prebuilt/lib"
cc -shared -x c /dev/null -o "$work/prebuilt/lib/liblance_c.so"
ar rcs "$work/prebuilt/lib/liblance_c.a"
for libdir in lib64 lib; do
  cmake -S . -B "$work/build-$libdir" -DLANCE_C_USE_PREBUILT=ON -DLANCE_C_PREBUILT_DIR="$work/prebuilt" -DCMAKE_INSTALL_LIBDIR="$libdir" >/dev/null
  cmake --install "$work/build-$libdir" --prefix "$work/stage-$libdir" >/dev/null
  if bash .github/scripts/strip-release-shared.sh "$work/stage-$libdir" linux; then
    echo "$libdir: exit 0"
  else
    echo "$libdir: exit $?"
  fi
done

Expected: release staging finds the installed library. Observed: lib64 reports staged shared library is missing: .../stage-lib64/lib/liblance_c.so and exits 1; the lib control exits 0. GNUInstallDirs selects lib64 for native 64-bit Linux outside its Debian/Alpine/Arch/Conda exceptions, consistent with the manylinux experiment recorded in #103.

@lance-gatekeeper lance-gatekeeper Bot added the K-changes Latest Gatekeeper recommendation requests changes. label Nov 13, 2026
Xuanwo added a commit that referenced this pull request Nov 13, 2026
…225)

The installation docs leave the adopted glibc 2.28 policy implicit and
still describe the published ARM64 library's audited libc requirement as
unknown. Document the future generic Linux baseline separately from the
five v0.1.9 archives, their actual recipe mappings, and candidate
platform validation.

The Debian 12 variants remain separate. The docs make clear that
workflow integration, package publication, and recipe hash updates are
separate steps; no glibc 2.28 package is available yet. This
documentation change is independent of the author-owned packaging
integration in #50 and the core migration in #224.

Checked the library requirements against the retained artifact audit at
`2c00796`, the vcpkg/Conan mappings, and the accepted x86_64/ARM64
manylinux feasibility evidence. No builds or platform experiments were
repeated.

Refs #103, #99.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

K-changes Latest Gatekeeper recommendation requests changes.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants