# Copyright 2020-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit go-module shell-completion
# Private jemalloc pin (matches Gentoo distfiles; not a runtime dependency).
JEMALLOC_PV="5.3.0"
DESCRIPTION="BadgerDB – embeddable key-value database (CLI)"
HOMEPAGE="https://github.com/dgraph-io/badger"
SRC_URI="
https://github.com/dgraph-io/badger/archive/refs/tags/v${PV}.tar.gz
-> ${P}.tar.gz
https://github.com/0x6d6e647a/mndz-overlay-assets/releases/download/badger-${PV}/badger-${PV}-vendor.tar.xz
jemalloc? (
https://github.com/jemalloc/jemalloc/releases/download/${JEMALLOC_PV}/jemalloc-${JEMALLOC_PV}.tar.bz2
)
"
LICENSE="Apache-2.0 jemalloc? ( BSD-2 )"
SLOT="0"
KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~s390 ~x64-macos ~x64-solaris ~x86"
IUSE="bash-completion fish-completion jemalloc test zsh-completion"
RESTRICT="!test? ( test )"
BDEPEND=">=dev-lang/go-1.24.0:="
# Strip upstream debug/listener noise that is printed on stdout around cobra
# completion scripts (main.go starts a /debug listener and prints jemalloc status).
_badger_filter_completion() {
sed \
-e '/^Listening for \/debug HTTP requests at port:/d' \
-e '/^Port busy\. Trying another one\.\.\./d' \
-e '/^jemalloc enabled:/d' \
-e '/^Using Go memory$/d' \
-e '/^Num Allocated Bytes at program end:/d'
}
src_compile() {
# Package path is ./badger (directory); do not use -o badger or the binary
# is written as badger/badger and dobin fails on a directory.
local out="${T}/badger"
if use jemalloc; then
local je="${WORKDIR}/jemalloc-prefix"
local jemalloc_src="${WORKDIR}/jemalloc-${JEMALLOC_PV}"
[[ -d ${jemalloc_src} ]] || die "jemalloc source not found at ${jemalloc_src}"
pushd "${jemalloc_src}" >/dev/null || die
econf \
--prefix="${je}" \
--libdir="${je}/lib" \
--includedir="${je}/include" \
--docdir="${je}/share/doc/jemalloc" \
--disable-shared \
--enable-static \
--with-jemalloc-prefix=je_ \
--with-malloc-conf=background_thread:true,metadata_thp:auto
emake
# Install only what CGO needs. Full `install` still targets system docdir
# paths under some autotools layouts and trips the Portage sandbox.
emake install_lib install_include
popd >/dev/null || die
# Prefer PIC archive for CGO/Go link; fall back to non-PIC static.
local jelib
if [[ -f ${je}/lib/libjemalloc_pic.a ]]; then
jelib="${je}/lib/libjemalloc_pic.a"
elif [[ -f ${je}/lib/libjemalloc.a ]]; then
jelib="${je}/lib/libjemalloc.a"
else
die "private jemalloc static library missing under ${je}/lib"
fi
[[ -f ${je}/include/jemalloc/jemalloc.h ]] || die "private jemalloc headers missing"
# ristretto hardcodes #cgo LDFLAGS to /usr/local/lib/libjemalloc.a
local calloc
calloc="$(find "${WORKDIR}/go-mod" -path '*/z/calloc_jemalloc.go' -print -quit)"
[[ -n ${calloc} && -f ${calloc} ]] || die "ristretto calloc_jemalloc.go not found in go-mod cache"
sed -i \
-e "s|^\\(#cgo LDFLAGS:\\).*|\\1 ${jelib} -lm -lstdc++ -pthread -ldl|" \
"${calloc}" || die
export CGO_ENABLED=1
export CGO_CFLAGS="${CGO_CFLAGS} -I${je}/include"
ego build -tags=jemalloc -v -x -work -o "${out}" ./badger
else
export CGO_ENABLED=0
ego build -v -x -work -o "${out}" ./badger
fi
}
src_install() {
einstalldocs
dobin "${T}/badger"
# PersistentPreRunE requires --dir even for completion generation.
if use bash-completion; then
"${T}/badger" --dir /var/empty completion bash 2>/dev/null \
| _badger_filter_completion > badger.bash \
|| die "failed to generate bash completion"
newbashcomp badger.bash badger
fi
if use fish-completion; then
"${T}/badger" --dir /var/empty completion fish 2>/dev/null \
| _badger_filter_completion > badger.fish \
|| die "failed to generate fish completion"
newfishcomp badger.fish badger.fish
fi
if use zsh-completion; then
"${T}/badger" --dir /var/empty completion zsh 2>/dev/null \
| _badger_filter_completion > badger.zsh \
|| die "failed to generate zsh completion"
newzshcomp badger.zsh _badger
fi
}
src_test() {
ego test ./...
}