#!/usr/bin/env bash # marknb / py-blog 公共构建逻辑(供 install.sh、upgrade.sh 引用) set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" VENDOR="$ROOT/vendor/marknb" MARKNB_REPO="${MARKNB_REPO:-https://cnb.cool/whcself/marknb.git}" MARKNB_SRC="$VENDOR/src" LIB_PATH="$VENDOR/libmarknb.so" apt_install() { if ! command -v apt-get >/dev/null 2>&1; then return 0 fi local pkgs=(gcc make git python3 python3-pip python3-venv) if command -v sudo >/dev/null 2>&1 && [ "$(id -u)" -ne 0 ]; then sudo apt-get update -qq sudo apt-get install -y --no-install-recommends "${pkgs[@]}" else apt-get update -qq apt-get install -y --no-install-recommends "${pkgs[@]}" fi } build_marknb() { mkdir -p "$VENDOR" if [ -d "$MARKNB_SRC/.git" ]; then git -C "$MARKNB_SRC" fetch --depth 1 origin main git -C "$MARKNB_SRC" checkout -f main git -C "$MARKNB_SRC" reset --hard origin/main else git clone --depth 1 --branch main "$MARKNB_REPO" "$MARKNB_SRC" fi local srcs=( "$MARKNB_SRC/src/fsm.c" "$MARKNB_SRC/src/table_stats.c" "$MARKNB_SRC/src/line_index.c" "$MARKNB_SRC/src/render.c" "$MARKNB_SRC/src/marknb.c" "$MARKNB_SRC/src/compat_cmark.c" ) gcc -std=c11 -Wall -Wextra -O3 -fPIC -shared \ -I"$MARKNB_SRC/include" -I"$MARKNB_SRC/src" \ "${srcs[@]}" -lm -o "$LIB_PATH" } install_python() { if [ ! -d "$ROOT/venv" ]; then python3 -m venv "$ROOT/venv" fi "$ROOT/venv/bin/pip" install -U pip "$ROOT/venv/bin/pip" install -r "$ROOT/requirements.txt" } upgrade_python() { if [ ! -d "$ROOT/venv" ]; then echo "未找到 venv,改为执行 install.sh" >&2 exec bash "$ROOT/scripts/install.sh" fi "$ROOT/venv/bin/pip" install -U pip "$ROOT/venv/bin/pip" install -U -r "$ROOT/requirements.txt" } pull_py_blog() { if [ ! -d "$ROOT/.git" ]; then echo "当前目录不是 git 仓库,跳过 py-blog 代码拉取" return 0 fi local branch branch="$(git -C "$ROOT" rev-parse --abbrev-ref HEAD)" git -C "$ROOT" fetch origin "$branch" git -C "$ROOT" merge --ff-only "origin/$branch" }