|
1 | 1 | #!/bin/bash |
| 2 | +set -e |
2 | 3 |
|
3 | | -## Patches |
| 4 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
4 | 5 |
|
5 | | -## Apply patches from the `patches` directory |
6 | | -if [ -d "patches" ]; then |
7 | | - for patch in $(ls patches); do |
8 | | - echo "Applying patch $patch" |
9 | | - patch -d llama.cpp/ -p1 < patches/$patch |
10 | | - done |
| 6 | +## Generate patches from fork sources if not already present. |
| 7 | +## If patches/<name>/ already contains .patch files (vendored), skip fetching. |
| 8 | +## Otherwise, clone the fork and generate them on the fly. |
| 9 | +if [ -f "patches/sources.yaml" ] && command -v yq &>/dev/null; then |
| 10 | + SOURCE_COUNT=$(yq '.sources | length' patches/sources.yaml) |
| 11 | + |
| 12 | + for i in $(seq 0 $((SOURCE_COUNT - 1))); do |
| 13 | + NAME=$(yq ".sources[$i].name" patches/sources.yaml) |
| 14 | + REPO=$(yq ".sources[$i].repo" patches/sources.yaml) |
| 15 | + BRANCH=$(yq ".sources[$i].branch" patches/sources.yaml) |
| 16 | + FORK_BASE=$(yq ".sources[$i].fork_base" patches/sources.yaml) |
| 17 | + |
| 18 | + SOURCE_DIR="patches/$NAME" |
| 19 | + EXISTING=$(ls "$SOURCE_DIR"/*.patch 2>/dev/null | wc -l) |
| 20 | + |
| 21 | + if [ "$EXISTING" -gt 0 ]; then |
| 22 | + echo "Source '$NAME': $EXISTING patches already present — skipping fetch." |
| 23 | + else |
| 24 | + echo "Source '$NAME': no patches found — fetching from $REPO ($BRANCH)" |
| 25 | + |
| 26 | + TMPDIR=$(mktemp -d) |
| 27 | + |
| 28 | + if git clone --single-branch -b "$BRANCH" --depth=500 "$REPO" "$TMPDIR/fork" 2>&1; then |
| 29 | + cd "$TMPDIR/fork" |
| 30 | + PATCH_COUNT=$(git rev-list --count "$FORK_BASE"..HEAD 2>/dev/null || echo "0") |
| 31 | + echo " $PATCH_COUNT commits to extract" |
| 32 | + |
| 33 | + if [ "$PATCH_COUNT" -gt 0 ]; then |
| 34 | + mkdir -p "$SCRIPT_DIR/$SOURCE_DIR" |
| 35 | + git format-patch "$FORK_BASE"..HEAD -o "$SCRIPT_DIR/$SOURCE_DIR/" >/dev/null 2>&1 |
| 36 | + echo " Generated $PATCH_COUNT patches in $SOURCE_DIR/" |
| 37 | + fi |
| 38 | + cd "$SCRIPT_DIR" |
| 39 | + else |
| 40 | + echo "WARNING: Failed to clone $REPO — skipping source '$NAME'" |
| 41 | + fi |
| 42 | + |
| 43 | + rm -rf "$TMPDIR" |
| 44 | + fi |
| 45 | + done |
| 46 | +elif [ -f "patches/sources.yaml" ]; then |
| 47 | + echo "WARNING: yq not found — skipping source-based patch generation. Install yq to enable." |
11 | 48 | fi |
12 | 49 |
|
13 | | -set -e |
| 50 | +## Apply patches from source subdirectories (alphabetical order) |
| 51 | +if [ -d "patches" ]; then |
| 52 | + for source_dir in $(find patches -mindepth 1 -maxdepth 1 -type d | sort); do |
| 53 | + for p in $(ls "$source_dir"/*.patch 2>/dev/null | sort); do |
| 54 | + echo "Applying: $p" |
| 55 | + patch -d llama.cpp/ -p1 < "$p" || { echo "FAILED: $p"; exit 1; } |
| 56 | + done |
| 57 | + done |
| 58 | + # Apply any top-level .patch files (manual patches) |
| 59 | + for p in $(ls patches/*.patch 2>/dev/null | sort); do |
| 60 | + echo "Applying: $p" |
| 61 | + patch -d llama.cpp/ -p1 < "$p" || { echo "FAILED: $p"; exit 1; } |
| 62 | + done |
| 63 | +fi |
14 | 64 |
|
15 | 65 | for file in $(ls llama.cpp/tools/server/); do |
16 | 66 | cp -rfv llama.cpp/tools/server/$file llama.cpp/tools/grpc-server/ |
|
28 | 78 | echo "add_subdirectory(grpc-server)" >> llama.cpp/tools/CMakeLists.txt |
29 | 79 | fi |
30 | 80 | set -e |
31 | | - |
|
0 commit comments