Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cgo_bundled.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ package lbug
/*
#cgo CFLAGS: -I${SRCDIR}/lib
#cgo darwin LDFLAGS: -lc++ -L${SRCDIR}/lib -llbug -Wl,-rpath,${SRCDIR}/lib
#cgo linux LDFLAGS: -L${SRCDIR}/lib -llbug -Wl,-rpath,${SRCDIR}/lib
#cgo linux LDFLAGS: -L${SRCDIR}/lib -llbug -lstdc++ -lm -Wl,-rpath,${SRCDIR}/lib
#cgo windows LDFLAGS: -L${SRCDIR}/lib -llbug_shared
#include "lbug.h"
*/
Expand Down
146 changes: 146 additions & 0 deletions download-liblbug.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
#!/usr/bin/env bash
# Download prebuilt liblbug archives from GitHub releases or workflow artifacts.
set -euo pipefail

LIB_KIND="${LBUG_LIB_KIND:-shared}"
LINUX_VARIANT="${LBUG_LINUX_VARIANT:-compat}"
REPOSITORY="${LBUG_GITHUB_REPOSITORY:-LadybugDB/ladybug}"
RUN_ID="${LBUG_PRECOMPILED_RUN_ID:-}"
VERSION_OVERRIDE="${LBUG_VERSION:-}"

if [ "$LIB_KIND" != "shared" ] && [ "$LIB_KIND" != "static" ]; then
echo "Unsupported LBUG_LIB_KIND: $LIB_KIND (expected 'shared' or 'static')" >&2
exit 1
fi

if [ "$LINUX_VARIANT" != "compat" ] && [ "$LINUX_VARIANT" != "perf" ]; then
echo "Unsupported LBUG_LINUX_VARIANT: $LINUX_VARIANT (expected 'compat' or 'perf')" >&2
exit 1
fi

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
TARGET_DIR="${LBUG_TARGET_DIR:-$PROJECT_DIR/lib}"

OS="$(uname -s)"
ARCH="$(uname -m)"

case "$OS" in
Darwin)
if [ "$ARCH" = "x86_64" ]; then
MACOS_ARCHIVE_ARCH="x86_64"
elif [ "$ARCH" = "arm64" ]; then
MACOS_ARCHIVE_ARCH="arm64"
else
echo "Unsupported macOS architecture: $ARCH" >&2
exit 1
fi
if [ "$LIB_KIND" = "static" ]; then
ARCHIVE="liblbug-static-osx-${MACOS_ARCHIVE_ARCH}.tar.gz"
ARTIFACT_NAME="liblbug-static-osx-${MACOS_ARCHIVE_ARCH}"
LIB_NAME="liblbug.a"
else
ARCHIVE="liblbug-osx-${MACOS_ARCHIVE_ARCH}.tar.gz"
ARTIFACT_NAME="liblbug-osx-${MACOS_ARCHIVE_ARCH}"
LIB_NAME="liblbug.dylib"
fi
;;
Linux)
if [ "$ARCH" = "x86_64" ]; then
LINUX_ARCHIVE_ARCH="x86_64"
elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then
LINUX_ARCHIVE_ARCH="aarch64"
else
echo "Unsupported Linux architecture: $ARCH" >&2
exit 1
fi
if [ "$LIB_KIND" = "static" ]; then
ARCHIVE="liblbug-static-linux-${LINUX_ARCHIVE_ARCH}-${LINUX_VARIANT}.tar.gz"
ARTIFACT_NAME="liblbug-static-linux-${LINUX_ARCHIVE_ARCH}-${LINUX_VARIANT}"
LIB_NAME="liblbug.a"
else
ARCHIVE="liblbug-linux-${LINUX_ARCHIVE_ARCH}.tar.gz"
ARTIFACT_NAME="liblbug-linux-${LINUX_ARCHIVE_ARCH}"
LIB_NAME="liblbug.so"
fi
;;
MINGW*|MSYS*|CYGWIN*)
if [ "$ARCH" = "x86_64" ] || [ "$ARCH" = "AMD64" ]; then
WINDOWS_ARCHIVE_ARCH="x86_64"
else
echo "Unsupported Windows architecture: $ARCH" >&2
exit 1
fi
if [ "$LIB_KIND" = "static" ]; then
ARCHIVE="liblbug-static-windows-${WINDOWS_ARCHIVE_ARCH}.zip"
ARTIFACT_NAME="liblbug-static-windows-${WINDOWS_ARCHIVE_ARCH}"
LIB_NAME="lbug.lib"
else
ARCHIVE="liblbug-windows-${WINDOWS_ARCHIVE_ARCH}.zip"
ARTIFACT_NAME="liblbug-windows-${WINDOWS_ARCHIVE_ARCH}"
LIB_NAME="lbug_shared.dll"
fi
;;
*)
echo "Unsupported OS: $OS" >&2
exit 1
;;
esac

if [ -f "$TARGET_DIR/$LIB_NAME" ]; then
echo "liblbug already exists in $TARGET_DIR"
exit 0
fi

mkdir -p "$TARGET_DIR"
TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT

fetch_release_archive() {
local download_url
if [ -n "$VERSION_OVERRIDE" ]; then
local version
version="$VERSION_OVERRIDE"
version="${version#v}"
if [ -z "$version" ]; then
echo "LBUG_VERSION must not be empty" >&2
exit 1
fi
download_url="https://github.com/${REPOSITORY}/releases/download/v${version}/${ARCHIVE}"
SOURCE_DESC="release:v${version}"
else
download_url="https://github.com/${REPOSITORY}/releases/latest/download/${ARCHIVE}"
SOURCE_DESC="release:latest"
fi
curl -fSL "$download_url" -o "$TMPDIR/$ARCHIVE"
}

fetch_run_artifact() {
if ! command -v gh >/dev/null 2>&1; then
echo "gh CLI is required when LBUG_PRECOMPILED_RUN_ID is set" >&2
exit 1
fi
gh run download "$RUN_ID" --repo "$REPOSITORY" --name "$ARTIFACT_NAME" --dir "$TMPDIR/artifact" >/dev/null
local extracted_archive
extracted_archive="$(find "$TMPDIR/artifact" -type f -name "$ARCHIVE" | head -n1)"
if [ -z "$extracted_archive" ]; then
echo "Artifact ${ARTIFACT_NAME} does not contain ${ARCHIVE}" >&2
exit 1
fi
mv "$extracted_archive" "$TMPDIR/$ARCHIVE"
SOURCE_DESC="run:${RUN_ID}/${ARTIFACT_NAME}"
}

if [ -n "$RUN_ID" ]; then
fetch_run_artifact
else
fetch_release_archive
fi

if [[ "$ARCHIVE" == *.zip ]]; then
unzip -o "$TMPDIR/$ARCHIVE" -d "$TARGET_DIR"
else
tar xzf "$TMPDIR/$ARCHIVE" -C "$TARGET_DIR"
fi

echo "Installed ${ARCHIVE} from ${SOURCE_DESC} to $TARGET_DIR"
99 changes: 63 additions & 36 deletions download_lbug.sh
Original file line number Diff line number Diff line change
@@ -1,51 +1,78 @@
#!/bin/sh
# Wrapper around download-liblbug.sh that places the library into lib/ where
# cgo_bundled.go expects it, then creates the versioned symlink that the
# runtime dynamic linker needs (the dylib/so embed a versioned install name).
#
# download-liblbug.sh is kept as a verbatim copy of the upstream script at:
# https://raw.githubusercontent.com/LadybugDB/ladybug/refs/heads/main/scripts/download-liblbug.sh
# To update it: curl -fsSL <url above> -o download-liblbug.sh

# pipefail is a bashism; use -eu which POSIX sh supports.
# The script contains no pipelines, so pipefail is not needed here.
# Wrapper around upstream download-liblbug.sh (same pattern as go-ladybug).
# Downloads prebuilt liblbug into the local cgo library directory.
set -eu

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LIB_DIR="$SCRIPT_DIR/lib"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"

ENV_FILE="${1:-$PROJECT_DIR/.cache/lbug-prebuilt.env}"
CACHE_LIB_DIR="${LBUG_TARGET_DIR:-$SCRIPT_DIR/lib}"
UPSTREAM_SCRIPT="$SCRIPT_DIR/download-liblbug.sh"
UPSTREAM_URL="https://raw.githubusercontent.com/LadybugDB/ladybug/refs/heads/main/scripts/download-liblbug.sh"

# Fetch the upstream helper script if it is not already present.
OS="$(uname -s)"
case "$OS" in
MINGW*|MSYS*|CYGWIN*)
DEFAULT_LIB_KIND="shared"
;;
*)
DEFAULT_LIB_KIND="static"
;;
esac
LIB_KIND="${LBUG_LIB_KIND:-$DEFAULT_LIB_KIND}"

# Fetch the upstream helper if needed.
if [ ! -f "$UPSTREAM_SCRIPT" ]; then
echo "Fetching $UPSTREAM_URL ..."
curl -fsSL "$UPSTREAM_URL" -o "$UPSTREAM_SCRIPT"
chmod +x "$UPSTREAM_SCRIPT"
fi

# The upstream script defaults TARGET_DIR to SCRIPT_DIR/../lib because it assumes
# it lives in a scripts/ subdir. Override to put things in lib/ at the project root.
LBUG_TARGET_DIR="$LIB_DIR" bash "$UPSTREAM_SCRIPT"
LBUG_TARGET_DIR="$CACHE_LIB_DIR" LBUG_LIB_KIND="$LIB_KIND" bash "$UPSTREAM_SCRIPT"

# The dylib/so embed a versioned install name (e.g. @rpath/liblbug.0.dylib,
# liblbug.so.0) but the archive only contains the unversioned file. Create a
# symlink so the runtime dynamic linker can resolve the name it expects.
OS="$(uname -s)"
case "$OS" in
Darwin)
if [ ! -e "$LIB_DIR/liblbug.0.dylib" ]; then
ln -s liblbug.dylib "$LIB_DIR/liblbug.0.dylib"
echo "Created symlink liblbug.0.dylib -> liblbug.dylib"
fi
;;
Linux)
if [ ! -e "$LIB_DIR/liblbug.so.0" ]; then
ln -s liblbug.so "$LIB_DIR/liblbug.so.0"
echo "Created symlink liblbug.so.0 -> liblbug.so"
fi
;;
esac
if [ "$LIB_KIND" = "shared" ]; then
case "$OS" in
Darwin)
LIB_PATH="$CACHE_LIB_DIR/liblbug.dylib"
;;
Linux)
LIB_PATH="$CACHE_LIB_DIR/liblbug.so"
;;
MINGW*|MSYS*|CYGWIN*)
LIB_PATH="$CACHE_LIB_DIR/lbug_shared.dll"
;;
*)
echo "Unsupported OS: $OS" >&2
exit 1
;;
esac
else
case "$OS" in
MINGW*|MSYS*|CYGWIN*)
LIB_PATH="$CACHE_LIB_DIR/lbug.lib"
;;
*)
LIB_PATH="$CACHE_LIB_DIR/liblbug.a"
;;
esac
fi

if [ ! -f "$LIB_PATH" ]; then
echo "Expected precompiled library not found at $LIB_PATH" >&2
exit 1
fi

mkdir -p "$(dirname "$ENV_FILE")"
if [ "$LIB_KIND" = "shared" ]; then
cat > "$ENV_FILE" <<EOF
LBUG_C_API_LIB_PATH=$LIB_PATH
EOF
else
cat > "$ENV_FILE" <<EOF
EXTRA_CMAKE_FLAGS=-DBUILD_LBUG=FALSE -DBUILD_SHELL=FALSE -DLBUG_API_USE_PRECOMPILED_LIB=TRUE -DLBUG_API_PRECOMPILED_LIB_PATH=$LIB_PATH
EOF
fi

# Copy the header to the project root so it is available without a -I flag.
cp "$LIB_DIR/lbug.h" "$SCRIPT_DIR/lbug.h"
echo "Copied lbug.h to $SCRIPT_DIR"
echo "Wrote $ENV_FILE"
echo "Resolved precompiled library: $LIB_PATH"
Loading
Loading