diff --git a/.cargo/config.toml b/.cargo/config.toml index 1e303a1..e291e16 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -7,3 +7,30 @@ rustflags = ["--cfg", "getrandom_backend=\"wasm_js\""] # Uncomment and adjust after installing a musl C toolchain: [target.x86_64-unknown-linux-musl] linker = "x86_64-linux-musl-gcc" + +# FreeBSD x86_64 交叉编译(方案 A:clang + lld + 本地 sysroot)。 +# +# rustc 为 freebsd target 链接的系统库(libc/libexecinfo/libgcc_s/libthr 等)及 sysinfo +# 依赖的 freebsd 专有库(libkvm/libmemstat/libprocstat/libdevstat)需 FreeBSD 运行时, +# 因此除 clang + lld 外还需一个本地 sysroot(由 base.txz 解出,见 .freebsd-sysroot/)。 +# ring(C + 预生成 ELF 汇编,freebsd 归入 LINUX_ABI)与 zstd-sys(bundled C)用 clang 编译。 +# +# sysroot 路径与机器绑定,故此 target 配置默认注释;`make build-freebsd` 会用环境变量 +# CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_RUSTFLAGS 注入当前机器的 sysroot 路径。 +# +# 准备步骤: +# 1. pacman -S clang lld # 或 apt install clang lld +# 2. rustup target add x86_64-unknown-freebsd +# 3. make freebsd-sysroot # 下载 base.txz 并解压到 .freebsd-sysroot/ +# 4. make build-freebsd # 交叉编译 release server 二进制 +# +# 手动调用(Makefile 之外)时取消注释并把 改成实际路径: +# [target.x86_64-unknown-freebsd] +# linker = "clang" +# rustflags = [ +# "-C", "link-arg=--target=x86_64-unknown-freebsd", +# "-C", "link-arg=-fuse-ld=lld", +# "-C", "link-arg=--sysroot=", +# "-C", "link-arg=-L/usr/lib", +# "-C", "link-arg=-L/lib", +# ] diff --git a/.gitignore b/.gitignore index d96028a..4c1ed60 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,6 @@ profile.json.gz # Git worktrees .worktrees/ + +# FreeBSD cross-compile sysroot (extracted from base.txz, machine-local) +.freebsd-sysroot/ diff --git a/AGENTS.md b/AGENTS.md index 401f3cd..1cf5320 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,6 +13,8 @@ make dev # tailwindcss watch + dx serve (needs PostgreSQL) make build # build-editor → highlight-css → tailwindcss → doc → dx build --release make build-linux # same as build but targets x86_64-unknown-linux-musl +make build-freebsd # cross-compile FreeBSD x86_64 server binary (clang + lld + sysroot) +make freebsd-sysroot # download/extract FreeBSD base.txz → .freebsd-sysroot/ (idempotent) make css # one-shot CSS make css-watch # watch mode make test # cargo test + vitest (tiptap-editor + lightbox + yggdrasil-core libs) diff --git a/Makefile b/Makefile index 0c61a3d..a35750f 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: dev build build-linux 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 +.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 build: @$(MAKE) build-editor @@ -24,6 +24,43 @@ build-linux: @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/lib(crt 对象 + 系统库)。 +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." + highlight-css: @cargo run --bin generate_highlight_css