yggdrasil/Makefile
xfy fba88639a9 fix(build): dx build 后用源文件还原 webp 产物
dx build 0.7.9 会把 public/ 下的 .webp 重编码成 VP8L 无损静图:
动画帧被完全丢弃(动图变静图),静图因 VP8L 无损反而膨胀 7-8 倍。
这与 Dioxus 文档承诺的「public/ 原样拷贝」不符,疑似 0.7.9 的 bug。

新增 restore-webp target:dx build 完成后遍历所有产物目录
(release/debug),用源 public/ 的同名 .webp 覆盖回去。
仅在 build / build-linux 末尾调用,build-freebsd 不受影响
(用 cargo 直出,部署直接用源 public/)。

上游修复后可移除该 target 及两处调用。
2026-07-01 18:22:45 +08:00

188 lines
8.3 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.PHONY: dev build build-linux build-freebsd freebsd-sysroot docker css css-watch clean build-editor build-editor-incremental build-lightbox build-lightbox-incremental build-core build-core-incremental build-codemirror build-codemirror-incremental highlight-css test doc doc-open start clippy fix restore-webp
build:
@$(MAKE) build-editor
@$(MAKE) build-lightbox
@$(MAKE) build-core
@$(MAKE) build-codemirror
@$(MAKE) highlight-css
@tailwindcss -i input.css -o public/style.css --minify
@$(MAKE) doc
@dx build --release --debug-symbols=false
@$(MAKE) restore-webp
build-linux:
@$(MAKE) build-editor
@$(MAKE) build-lightbox
@$(MAKE) build-core
@$(MAKE) build-codemirror
@$(MAKE) highlight-css
@tailwindcss -i input.css -o public/style.css --minify
@dx build @client --release --debug-symbols=false --wasm-js-cfg false
@dx build @server --release --debug-symbols=false --target x86_64-unknown-linux-musl --wasm-js-cfg false --features server
@$(MAKE) restore-webp
@echo ""
@echo "Linux build complete! The server binary is at target/dx/yggdrasil/release/web/server"
@echo "Remember to deploy it alongside the target/dx/yggdrasil/release/web/public directory."
@echo "When running the server, ensure DIOXUS_ASSET_DIR is set or the public directory is in CWD."
# FreeBSD 15.1 base.txz 版本与下载源。sysroot 仅需 ./lib 与 ./usr/libcrt 对象 + 系统库)。
FREEBSD_VERSION ?= 15.1-RELEASE
FREEBSD_BASE_URL ?= https://download.freebsd.org/ftp/releases/amd64/amd64/$(FREEBSD_VERSION)/base.txz
FREEBSD_SYSROOT := $(CURDIR)/.freebsd-sysroot
# 下载并解压 FreeBSD base.txz 到 .freebsd-sysroot/供交叉链接crt 对象 + 系统库)。
# 幂等:若 sysroot 已存在则跳过下载。
freebsd-sysroot:
@if [ -d "$(FREEBSD_SYSROOT)/usr/lib" ] && [ -d "$(FREEBSD_SYSROOT)/lib" ]; then \
echo "FreeBSD sysroot already present at $(FREEBSD_SYSROOT)"; \
else \
echo "Downloading FreeBSD $(FREEBSD_VERSION) base.txz..."; \
curl -fL --retry 3 -o /tmp/freebsd-base.txz "$(FREEBSD_BASE_URL)"; \
mkdir -p "$(FREEBSD_SYSROOT)"; \
echo "Extracting crt objects and system libs..."; \
tar -xf /tmp/freebsd-base.txz -C "$(FREEBSD_SYSROOT)" ./lib ./usr/lib; \
rm -f /tmp/freebsd-base.txz; \
echo "FreeBSD sysroot ready at $(FREEBSD_SYSROOT)"; \
fi
# 交叉编译 FreeBSD x86_64 release server 二进制。
# 前置clang + lld 已装pacman -S clang lld、rustup target add x86_64-unknown-freebsd、
# `make freebsd-sysroot`。sysroot 路径经 CARGO_TARGET_*_RUSTFLAGS 注入,避免在
# .cargo/config.toml 里硬编码机器相关路径。server 二进制用 cargo 直出dx CLI 对该
# target 未经验证);前端 wasm 与静态资源与 build-linux 相同,不在此重复构建。
build-freebsd:
@$(MAKE) freebsd-sysroot
@SYSROOT="$(FREEBSD_SYSROOT)"; \
RUSTFLAGS_FREEBSD="-C linker=clang -C link-arg=--target=x86_64-unknown-freebsd -C link-arg=-fuse-ld=lld -C link-arg=--sysroot=$$SYSROOT -C link-arg=-L$$SYSROOT/usr/lib -C link-arg=-L$$SYSROOT/lib"; \
echo "Cross-compiling yggdrasil server for FreeBSD x86_64..."; \
CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_RUSTFLAGS="$$RUSTFLAGS_FREEBSD" \
cargo build --release --target x86_64-unknown-freebsd --features server --bin yggdrasil
@echo ""
@echo "FreeBSD build complete! Server binary: target/x86_64-unknown-freebsd/release/yggdrasil"
@echo "Deploy it to FreeBSD 15+ alongside the static public/ directory."
@echo "Runtime needs (bundled in FreeBSD base): libc.so.7 libthr.so.3 libkvm.so.7 etc."
# 兜底dx build 0.7.9 会把 public/ 下的 .webp 重编码成 VP8L 无损静图
# (动画帧被丢弃,静图体积反增 7-8 倍),与文档承诺的"原样拷贝"不符。
# SVG/ICO 等其他格式不受影响,故只需覆盖 .webp。
# 遍历所有 dx 产物目录release/debug用源 public/ 的同名文件覆盖回去。
# 仅覆盖产物中已存在的 .webp不引入源里新增但 dx 未生成的文件。
# 参考https://dioxuslabs.com/learn/0.7/essentials/ui/assets/
# 上游修复后可移除此 target 及 build/build-linux 里的调用。
restore-webp:
@find target/dx -type d -path "*/web/public" 2>/dev/null | while read prod; do \
find "$$prod" -type f -name "*.webp" 2>/dev/null | while read p; do \
rel=$${p#$$prod/}; \
src="public/$$rel"; \
if [ -f "$$src" ]; then \
cp "$$src" "$$p"; \
else \
echo "restore-webp: 源缺失,跳过 $$rel"; \
fi; \
done; \
done
highlight-css:
@cargo run --bin generate_highlight_css
build-editor:
@echo "Building Tiptap editor..."
@cd libs/tiptap-editor && pnpm ci --include=dev && pnpm run build
@echo "Tiptap editor built."
# dev 用的增量构建:跳过 pnpm ci假设 node_modules 已存在),仅 vite build。
# 与 build-editor 分开,避免每次 make dev 都重装依赖。
build-editor-incremental:
@cd libs/tiptap-editor && pnpm run build
build-lightbox:
@echo "Building Lightbox..."
@cd libs/lightbox && pnpm install && pnpm run build
@echo "Lightbox built."
# dev 用的增量构建:跳过 pnpm ci假设 node_modules 已存在),仅 vite build。
build-lightbox-incremental:
@cd libs/lightbox && pnpm run build
build-core:
@echo "Building yggdrasil-core..."
@cd libs/yggdrasil-core && pnpm install && pnpm run build
@echo "yggdrasil-core built."
# dev 用的增量构建:跳过 pnpm install假设 node_modules 已存在),仅 vite build。
build-core-incremental:
@cd libs/yggdrasil-core && pnpm run build
build-codemirror:
@echo "Building CodeMirror editor..."
@cd libs/codemirror-editor && pnpm ci --include=dev && pnpm run build
@echo "CodeMirror editor built."
# dev 用的增量构建:跳过 pnpm ci假设 node_modules 已存在),仅 vite build。
build-codemirror-incremental:
@cd libs/codemirror-editor && pnpm run build
dev: build-editor-incremental build-lightbox-incremental build-core-incremental build-codemirror-incremental
@echo "Cleaning static/..."
@rm -rf static/
@echo "Building Tiptap editor (incremental)..."
@echo "Starting tailwindcss watch and dx serve..."
@tailwindcss -i input.css -o public/style.css --watch & \
TAILWIND_PID=$$!; \
trap 'kill $$TAILWIND_PID 2>/dev/null; exit' INT TERM EXIT; \
SSR_CACHE_SECS=0 dx serve --addr 0.0.0.0
css:
@tailwindcss -i input.css -o public/style.css
css-watch:
@tailwindcss -i input.css -o public/style.css --watch
test:
@cargo test
@cd libs/tiptap-editor && pnpm test
@cd libs/lightbox && pnpm test
@cd libs/yggdrasil-core && pnpm test
@cd libs/codemirror-editor && pnpm test
clippy:
@cargo clippy --all-targets --all-features -- -D warnings
fix:
@cargo fix --allow-dirty
# 只编译当前 crate 的文档(--no-deps 跳过依赖,--document-private-items
# 让纯 binary crate 的内部模块/私有项也进文档,否则页面基本是空的)。
# RUSTDOCFLAGS 把 rustdoc 的 --default-theme=ayu 透传过去——cargo doc 本身
# 无主题参数,但会把该环境变量转交给底层 rustdoc。注意它是默认值浏览器
# 若已记住上次的主题选择localStorage则不会被覆盖。
#
# 生成后拷贝到 public/doc/,让文档随 Dioxus 静态目录发布。先清空旧目录再
# 整体拷贝避免删除模块后残留旧文件。rustdoc 内部用相对路径引用资源
# (如 ../../static.files/),原样挂载不会断链。
#
# 额外生成 public/doc/index.html 重定向页Dioxus 在 dev 用
# nest_service("/doc", ServeDir) 托管该目录ServeDir 访问目录根时默认
# 返回 index.html。用 meta refresh + JS 跳转到真正的文档入口
# yggdrasil/index.html这样裸路径 /doc 也能直达文档,且不与 Dioxus 的
# /doc/* 路由冲突(手动注册 /doc 会在 merge 时 panic
doc:
@RUSTDOCFLAGS="--default-theme=ayu" cargo doc --no-deps --document-private-items
@rm -rf public/doc
@cp -r target/doc public/doc
@printf '<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="refresh" content="0;url=yggdrasil/index.html"><title>Redirecting…</title></head><body><script>location.replace("yggdrasil/index.html")</script></body></html>' > public/doc/index.html
# 同 doc生成完自动用浏览器打开。
doc-open:
@RUSTDOCFLAGS="--default-theme=ayu" cargo doc --no-deps --document-private-items --open
docker:
@docker build -t yggdrasil .
clean:
@cargo clean
@rm -f public/style.css public/highlight.css
@rm -rf public/doc
@rm -rf uploads/.cache