YAOTU INSIGHTS

在 FreeBSD 上构建与运行 dotnet/runtime 的完整环境指南

在 FreeBSD 上构建与运行 dotnet/runtime 的完整环境指南
在 FreeBSD 上构建与运行 dotnet/runtime 的完整环境指南【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime本篇指南围绕 docs/workflow/requirements/freebsd-requirements.md 展开系统讲解在 FreeBSD 上构建与运行 .NET 运行时dotnet/runtime的三种可行路径使用预构建 Docker 镜像交叉编译、在 Linux 上交叉编译、以及直接在 FreeBSD 本机构建。读完本文你将掌握 FreeBSD 交叉编译所需的 Linux 宿主环境依赖、FreeBSD 本机工具链的安装命令、SDK 解压与 NuGet 本地包源配置的完整实操步骤并能结合仓库源码理解crossrootfs的构建原理。背景为什么 FreeBSD 构建不平凡dotnet/runtime 的官方构建产物与安装包主要面向主流操作系统没有面向 FreeBSD 的官方构建包仓库文档原文明确说明这一点因此在 FreeBSD 上进行原生构建并非开箱即用。从仓库文档的表述看社区一般有三种方案按易用程度排序使用预构建的 Docker 镜像进行交叉编译——最省事所有构建工具都已包含在镜像中在 Linux 环境中交叉编译——利用已有的 Linux 开发机借助crossrootfs构造 FreeBSD 目标环境直接在 FreeBSD 上构建——需要手动安装完整工具链文档标注为旧说明可能已过时。这三种方案在仓库中都有对应的工程支撑eng/common/cross/build-rootfs.sh负责构造 FreeBSD 的crossrootfseng/common/cross/toolchain.cmake负责识别 FreeBSD 目标并为 CMake 设置正确的系统名称而eng/RuntimeIdentifier.props与eng/native/configureplatform.cmake则在 MSBuild 与 CMake 两个层面声明 FreeBSD 的 target RID如freebsd-x64。方案一使用 Docker 镜像交叉编译Docker 方案的前提是先安装 Docker官方安装说明见 Docker 官网此处不赘述。仓库文档强调官方构建所用的 Docker 镜像已经内置了全部所需构建工具无需额外配置。拿到 Docker 环境后可以按照仓库的 Docker 构建文档 docs/workflow/using-docker.md 操作。这种方式之所以零配置是因为镜像内部已经预先完成了解析依赖、安装工具链、构造crossrootfs等一系列工作你只需挂载源码并触发构建脚本即可。方案二在 Linux 上交叉编译 FreeBSD先满足 Linux 常规构建前置条件要在 Linux 开发机上交叉编译 FreeBSD 目标首先需要满足常规的 Linux 构建前置条件详见 docs/workflow/requirements/linux-requirements.md。该文档提到Linux 构建至少需要 1GB 内存512MB 虚拟机已被证实构建会失败并且推荐使用eng/common/native/install-dependencies.sh辅助脚本安装依赖。构造 FreeBSD crossrootfs 所需的额外包交叉编译的机制是构造一个名为crossrootfs的目标系统根目录sysroot编译器借助它链接 FreeBSD 的库与头文件。要构造 FreeBSD 的crossrootfsLinux 宿主上需要额外安装 4 个包libbz2-dev——BZip2 压缩库开发头FreeBSDbase.txz使用 bzip2/xz 压缩解包需要liblzma-dev——LZMA 压缩库开发头base.txz是.txz即 xz 压缩的 tar 包libarchive-dev——libarchive 归档库开发头libbsd-dev——FreeBSD 兼容层库开发头此外如果做跨架构或跨系统的交叉编译如 Arm32、Arm64、Alpine、FreeBSDlinux-requirements.md 还要求安装binfmt-support、debootstrap、qemu、qemu-user-static这些包用于构造 rootfs而不是构建 runtime 本身。apt install binfmt-support debootstrap qemu qemu-user-staticcrossrootfs 构造的源码级原理eng/common/cross/build-rootfs.sh中与 FreeBSD 相关的逻辑非常直观。脚本的用法说明第 7-15 行明确列出CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine for alpine can be specified with version: alpineX.YY or alpineedge for FreeBSD can be: freebsd14, freebsd15即调用时传入freebsd14或freebsd15即可触发 FreeBSD rootfs 构建。脚本内部eng/common/cross/build-rootfs.sh为 FreeBSD 预置了以下参数变量默认值说明__FreeBSDBase14.4-RELEASE下载的 FreeBSD 发行版本freebsd15 分支覆盖为15.1-RELEASE__FreeBSDPkg2.8.0需要从源码编译的 pkg 包管理器版本__FreeBSDABI14pkg ABI 标识freebsd15 覆盖为15__FreeBSDPackageslibunwind icu libinotify openssl krb5 terminfo-db装入 rootfs 的运行时依赖包构建流程第 612-640 行依次执行从download.freebsd.org下载对应架构/发行版本的base.txz解包出lib、usr/lib、usr/include、usr/share/keys、etc、bin/freebsd-version等目录到 rootfs写入pkg.conf指定 ABI、指纹目录、关闭仓库自动更新与FreeBSD.conf指向 quarterly 仓库从 GitHub 拉取 pkg 源码在 rootfs 内编译出 host 侧 pkg 工具用编译出的 pkg 以-r $__RootfsDir方式将上述 6 个依赖包装入 rootfs。而 eng/common/cross/toolchain.cmake 则在 CMake 层面把交叉环境正式声明为 FreeBSDset(CMAKE_SYSTEM_NAME FreeBSD) set(FREEBSD 1)后续所有 CMake 分支逻辑如链接器选择、系统库判断都会依据FREEBSD标志走 FreeBSD 路径。同样eng/native/configureplatform.cmake 与 eng/RuntimeIdentifier.props 分别在原生层与托管层标记CLR_CMAKE_HOST_FREEBSD/CLR_CMAKE_TARGET_FREEBSD与TargetsFreeBSD保证整体构建系统能正确识别freebsd-x64等目标 RID。方案三直接在 FreeBSD 上构建使用 pkg 安装工具链官方文档明确以下说明假设你使用 FreeBSD 默认的二进制包工具pkg等价于 Linux 的apt、apt-get或yum来安装环境。从 ports tree 编译依赖理论上可行但未经过测试。文档中FreeBSD 前置条件即将推出一节目前是占位状态FreeBSD Prerequisites Coming Soon!因此仓库暂时给出的是下面这套旧版说明。请注意这些说明撰写时间较早今天是否仍然有效无法保证新版本说明正在编写中。下面按文档原文完整给出便于读者评估使用。构建Toolchain Setup所需的包构建 dotnet/runtime 仓库需要先安装以下工具包作用Bash构建脚本build.sh等的解释器CMake原生代码构建系统icuICU 国际化库Unicode/全球化支持libunwind栈回溯库异常与诊断需要krb5Kerberos 认证库opensslSSL/TLS 支持可选python39构建辅助脚本运行时libinotifyinotify API 兼容层ninja快速构建工具配合 CMake安装命令需要 root 权限使用sudosudo pkg install --yes libunwind icu libinotify lttng-ust krb5 cmake openssl ninja从源码实现看这份依赖清单与 crossrootfs 中装入的包高度一致libunwind、icu、libinotify、openssl、krb5在 build-rootfs.sh 中都能找到说明无论是交叉编译还是本机构建运行时依赖都是同一组库。运行时运行Running on FreeBSD所需的包如果只是运行已构建好的 .NET需要安装的包略有不同包作用icu国际化库必需libunwind栈回溯库必需lttng-ustLTTng 用户态追踪可选调试支持krb5Kerberos 认证库opensslSSL 支持可选libinotifyinotify 兼容层terminfo-db终端信息数据库可选终端颜色安装命令sudo pkg install --yes libunwind icu libinotify lttng-ust krb5 openssl terminfo-db注意terminfo-db恰好也在交叉 rootfs 的预置依赖列表中见 eng/common/cross/build-rootfs.sh可见它确实是 .NET 在 FreeBSD 上运行时的常规依赖。解压 SDKSDK 的标准安装位置是/usr/share/dotnet。VERSION指正在解压的 SDK 版本号sudo mkdir /usr/share/dotnet tar xf /tmp/dotnet-sdk-VERSION-freebsd-x64.tar.gz -C /usr/share/dotnet/配置 NuGet 本地包源NuGet 包的标准缓存位置是/var/cache/nuget。VERSION与上面 SDK 的版本号相同需要准备以下三个.nupkgMicrosoft.NETCore.App.Host.freebsd-x64.VERSION.nupkgMicrosoft.NETCore.App.Runtime.freebsd-x64.VERSION.nupkgMicrosoft.AspNetCore.App.Runtime.freebsd-x64.VERSION.nupkg然后在使用的任意NuGet.config的packageSources节下添加一行本地源add keylocal value/var/cache/nuget /让 dotnet 命令可用最后把/usr/share/dotnet加入PATH或者为/usr/share/dotnet/dotnet创建符号链接二者选其一即可# 方式一加入 PATH export PATH/usr/share/dotnet:$PATH # 方式二创建符号链接 sudo ln -s /usr/share/dotnet/dotnet /usr/local/bin/dotnet小结与建议综合仓库文档与工程源码可以给出如下选型建议追求零配置优先使用官方 Docker 镜像交叉编译所有依赖已内置已有 Linux 开发机按 linux-requirements.md 装好常规依赖后再补装libbz2-dev、liblzma-dev、libarchive-dev、libbsd-dev通过eng/common/cross/build-rootfs.sh以freebsd14或freebsd15为 CodeName 构造crossrootfs即可触发交叉编译FreeBSD 本机构建参照文档给出的旧版说明安装工具链libunwind icu libinotify lttng-ust krb5 cmake openssl ninja但要注意这些说明可能已不适用于今天实际使用前建议对照当前分支的构建脚本核实依赖。由于 FreeBSD 没有官方构建包无论选择哪条路径crossrootfs或本机依赖中的运行时库集合都是固定的libunwind、icu、libinotify、openssl、krb5、terminfo-db——这正是 .NET 运行时在 FreeBSD 上稳定运行所需的底层支撑。【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考