summarylogtreecommitdiffstats
path: root/PKGBUILD
blob: 69bd94ae11e7e041a8dd592978f0dc99e8552227 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# Maintainer: Mohamed Amine Zghal (medaminezghal) <medaminezghal at outlook dot com>

_name=sqlite-vec
pkgname=python-$_name
pkgver=0.1.9
pkgrel=2
pkgdesc='A vector search SQLite extension.'
arch=('x86_64' 'aarch64')
url='https://github.com/asg017/sqlite-vec'
license=('MIT OR Apache-2.0')
depends=('python' 'python-numpy' 'glibc' 'sqlite')
makedepends=('python-installer' 'gcc' 'git')
checkdepends=('python-pytest' 'python-syrupy')
source=("$_name::git+$url.git#tag=v$pkgver")
sha256sums=('d15838d73835fd0410ed60f8dec3aaa1129ec33342c42a5ba260dc92eca604e2')

build_wheel() {
  local outdir=distx/pip extra=bindings/python/extra_init.py stem=vec0
  local tag staging distinfo f

  case "$CARCH" in
    x86_64)  tag='manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux1_x86_64' ;;
    aarch64) tag='manylinux_2_17_aarch64.manylinux2014_aarch64' ;;
  esac

  staging=$(mktemp -d)
  distinfo=${_name//-/_}-$pkgver.dist-info
  mkdir -p $staging/${_name//-/_} $staging/$distinfo

  printf '%s' "
from os import path
import sqlite3

__version__ = \"$pkgver\"
__version_info__ = tuple(__version__.split(\".\"))

def loadable_path():
  \"\"\" Returns the full path to the $_name loadable SQLite extension bundled with this package \"\"\"

  loadable_path = path.join(path.dirname(__file__), \"$stem\")
  return path.normpath(loadable_path)

def load(conn: sqlite3.Connection)  -> None:
  \"\"\" Load the $_name SQLite extension into the given database connection. \"\"\"

  conn.load_extension(loadable_path())

" > $staging/${_name//-/_}/__init__.py
  cat $extra >> $staging/${_name//-/_}/__init__.py

  install -m644 dist/linux-$CARCH/$stem.so $staging/${_name//-/_}/$stem.so

  { printf '%s' "Metadata-Version: 2.1
Name: $_name
Version: $pkgver
Home-page: https://alexgarcia.xyz/sqlite-vec
Author: Alex Garcia
License: MIT License, Apache License, Version 2.0
Description-Content-Type: text/markdown

"
    cat README.md
  } > $staging/$distinfo/METADATA

  printf '%s' "Wheel-Version: 1.0
Generator: sqlite-dist 0.0.1-alpha.22
Root-Is-Purelib: false
Tag: py3-none-$tag" > $staging/$distinfo/WHEEL

  printf '%s\n' "${_name//-/_}" > $staging/$distinfo/top_level.txt

  local -a members=(
    ${_name//-/_}/__init__.py
    ${_name//-/_}/$stem.so
    $distinfo/METADATA
    $distinfo/WHEEL
    $distinfo/top_level.txt
  )

  : > $staging/$distinfo/RECORD
  for f in "${members[@]}"; do
    printf '%s,sha256=%s,%s\n' $f $(sha256sum $staging/$f | cut -d' ' -f1 | tr 'a-f' 'A-F' | basenc --base16 -d | basenc --base64url -w0 | tr -d '=') $(stat -c%s $staging/$f) >> $staging/$distinfo/RECORD
  done
  printf '%s,,\n' $distinfo/RECORD >> $staging/$distinfo/RECORD
  members+=($distinfo/RECORD)

  mkdir -p $outdir
  outdir=$(realpath $outdir)
  cd $staging
  bsdtar -cf $outdir/${_name//-/_}-$pkgver-py3-none-$tag.whl --format zip --options zip:compression=store "${members[@]}"

  rm -rf "$staging"
}

prepare() {
  cd "$srcdir"/$_name
  DATE=$(date -r VERSION +'%FT%TZ%z') \
  SOURCE=$(git log -n 1 --pretty=format:%H -- VERSION)
  VERSION_MAJOR=$(echo $pkgver | cut -d. -f1)
  VERSION_MINOR=$(echo $pkgver | cut -d. -f2)
  VERSION_PATCH=$(echo $pkgver | cut -d. -f3)
  mv sqlite-vec.h.tmpl sqlite-vec.h
  sed -i "s/\${VERSION}/$pkgver/g" sqlite-vec.h
  sed -i "s/\${DATE}/$DATE/g" sqlite-vec.h
  sed -i "s/\${SOURCE}/$SOURCE/g" sqlite-vec.h
  sed -i "s/\${VERSION_MAJOR}/$VERSION_MAJOR/g" sqlite-vec.h
  sed -i "s/\${VERSION_MINOR}/$VERSION_MINOR/g" sqlite-vec.h
  sed -i "s/\${VERSION_PATCH}/$VERSION_PATCH/g" sqlite-vec.h
  grep -rl "dist/vec0" tests/ | xargs sed -i "s|dist/vec0|dist/linux-$CARCH/vec0|g"
}

build(){
  cd "$srcdir"/$_name
  mkdir -p dist/linux-$CARCH
  gcc -fPIC -shared -Wall -Wextra -O3 -lm sqlite-vec.c -o dist/linux-$CARCH/vec0.so
  build_wheel
}

check(){
  local pytest_options=(
    -vv
    --disable-warnings
  )
  cd "$srcdir"/$_name
  python -m venv --system-site-packages test-env
  test-env/bin/python -m installer distx/pip/*.whl
  test-env/bin/python -P -m pytest "${pytest_options[@]}" tests/test-*.py
}

package() {
  cd "$srcdir"/$_name
  python -m installer --destdir="$pkgdir" distx/pip/*.whl
}