#!/bin/bash # ============================================================================= # packages/crun/crun.SlackBuild # # Builds the crun .txz package from upstream source (C, autotools). crun is # the OCI runtime this project uses (preferred over runc — lighter, cgroup # v2-friendly, see docs/ARCHITECTURE.md section 5.1). # # Requires (in the build environment): gcc, make, autoconf, automake, # libtool, pkg-config, libcap-dev, libseccomp-dev, libyajl-dev, python3 # (used by crun's build-time code generator). # ============================================================================= set -eu REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" # shellcheck source=/dev/null . "$REPO_ROOT/scripts/lib/slackbuild-common.sh" # shellcheck source=/dev/null . "$REPO_ROOT/versions.env" VERSION="$CRUN_VERSION" ARCH="$PKG_ARCH" BUILD="$PKG_BUILD" TAG="$PKG_TAG" sb_init "crun" tarball=$(sb_fetch_and_verify "$CRUN_SRC_URL" "$CRUN_SRC_SHA256" "crun-$VERSION.tar.gz") srcdir=$(sb_extract "$tarball") for patch in "$CWD"/patches/*.patch; do [ -e "$patch" ] || continue echo "==> [crun] applying $(basename "$patch")" patch -d "$srcdir" -p1 < "$patch" done cd "$srcdir" # GitHub's source archive has no .git directory, so `git submodule # update` can never work against it (it needs an actual git repo to # resolve against) — it silently fails and leaves libocispec/ empty, # which only surfaces much later as a confusing "No rule to make target # 'all'" in that subdirectory. Fetch libocispec as its own pinned source # instead, matching every other dependency in this project, and unpack it # directly over the empty submodule directory. echo "==> [crun] fetching libocispec (git submodule, pinned separately — see versions.env)" libocispec_tarball=$(sb_fetch_and_verify "$LIBOCISPEC_SRC_URL" "$LIBOCISPEC_SRC_SHA256" "libocispec-$LIBOCISPEC_COMMIT.tar.gz") rm -rf "$srcdir/libocispec" mkdir -p "$srcdir/libocispec" tar -xf "$libocispec_tarball" -C "$srcdir/libocispec" --strip-components=1 # libocispec has its own two git submodules (image-spec, runtime-spec) — # same problem, one level deeper. Same fix, same reasoning. echo "==> [crun] fetching libocispec's image-spec/runtime-spec submodules" imagespec_tarball=$(sb_fetch_and_verify "$IMAGE_SPEC_SRC_URL" "$IMAGE_SPEC_SRC_SHA256" "image-spec-$IMAGE_SPEC_COMMIT.tar.gz") rm -rf "$srcdir/libocispec/image-spec" mkdir -p "$srcdir/libocispec/image-spec" tar -xf "$imagespec_tarball" -C "$srcdir/libocispec/image-spec" --strip-components=1 runtimespec_tarball=$(sb_fetch_and_verify "$RUNTIME_SPEC_SRC_URL" "$RUNTIME_SPEC_SRC_SHA256" "runtime-spec-$RUNTIME_SPEC_COMMIT.tar.gz") rm -rf "$srcdir/libocispec/runtime-spec" mkdir -p "$srcdir/libocispec/runtime-spec" tar -xf "$runtimespec_tarball" -C "$srcdir/libocispec/runtime-spec" --strip-components=1 # crun.c unconditionally #includes git-version.h. Its own Makefile only # generates that file from `git describe` (needs .git, which a plain # tarball checkout never has) or, failing that, from a pre-existing # .tarball-git-version.h — the file crun's own `make dist` would have # written. We're not running `make dist`, so write it ourselves in the # exact format that Makefile target expects; this is the documented # fallback path, not a workaround around it. printf '/* autogenerated. */\n#ifndef GIT_VERSION\n# define GIT_VERSION "%s"\n#endif\n' "$VERSION" \ > .tarball-git-version.h echo "==> [crun] autogen + configure" ./autogen.sh ./configure --prefix=/usr --disable-systemd echo "==> [crun] make" make echo "==> [crun] make install into \$PKG" make install DESTDIR="$PKG" sb_install_docs "$srcdir/COPYING" "$srcdir/README.md" sb_make_package "$VERSION" "$ARCH" "$BUILD" "$TAG"