
WSL 源码开发如何用 UserConfig.cmake 构建更小的开发包加快迭代速度【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL在 WSL 仓库中开发时一次完整的改代码 → 打包 → 安装循环很慢wsl.msi包里带有很高的压缩级别和多个大文件每次构建都要重新打包安装时还要重新解包解压。仓库在 dev-loop 文档 中给出了专门的开发快捷方式把 CMake 配置指向一个本地开发目录WSL_DEV_BINARY_PATH让构建逻辑生成一个更小、安装更快的开发包再配合WSL_BUILD_THIN_PACKAGE和WSL_POST_BUILD_COMMAND两个可选开关可以把构建 部署压缩到一条命令里完成。这篇文章只针对这一件事如何配置UserConfig.cmake、如何构建、以及如何确认开发包真正生效。机制为什么指向本地目录就能变小WSL_DEV_BINARY_PATH生效后CMakeLists.txt 会做两件事在开发目录里为各种二进制建立符号链接而不是复制进包kernel、msrdc.exe、wslg.rdp、rdclientax.dll、lib/libd3d12.so等只有体积大的system.vhd和artifacts.vhd使用COPY_FILE ... ONLY_IF_DIFFERENT复制即仅在文件变化时才重新拷贝见 UserConfig.cmake.sample通过编译定义WSL_SYSTEM_DISTRO_PATH、WSL_KERNEL_PATH、WSL_KERNEL_MODULES_PATH、WSL_DEV_INSTALL_PATH、WSL_GPU_LIB_PATH把安装逻辑指向该目录。例如 WslCoreVm.cpp 中定义了WSL_DEV_INSTALL_PATH时服务直接使用这个开发路径而不是 MSI 安装路径。也就是说构建产物通过符号链接引用开发目录里的文件MSI 包本身不再携带这些大文件体积变小、安装变快符号链接的另一层好处是后续构建更新了二进制时开发目录里的链接自动指向新文件不必重新安装。准备条件前置环境与正常构建 WSL 相同见 dev-loop 文档Windows 上开启 Developer Mode否则需要以管理员身份构建符号链接支持需要CMake ≥ 3.25Visual Studio 2022 及所需工作负载。可运行tools\setup-dev-env.ps1自动安装或用 VS Installer 导入仓库的.vsconfig已经 clone 的 WSL 仓库。配置 UserConfig.cmake在仓库根目录执行copy UserConfig.cmake.sample UserConfig.cmake编辑生成的UserConfig.cmake取消WSL_DEV_BINARY_PATH一行的注释把路径改成你实际使用的目录示例值来自 dev-loop 文档# Uncomment to enable development packages (smaller, faster to install) # Note: .vhd files fail to mount via symlink / hardlink, so COPY is needed. set(WSL_DEV_BINARY_PATH C:/wsldev)仓库根目录的 CMakeLists.txt 在配置阶段检测到UserConfig.cmake存在时会通过find_package(USER REQUIRED ...)加载它因此改完配置需要重新执行 CMake configure 才会生效。可选进一步减小包体或自动部署除了主路径UserConfig.cmake.sample 还提供了两个与加快开发循环直接相关的开关按需取消注释# Uncomment to generate a thin MSI package which builds and installs faster set(WSL_BUILD_THIN_PACKAGE true) # Uncomment to install the package as part of the build set(WSL_POST_BUILD_COMMAND powershell;-ExecutionPolicy;Bypass;-NoProfile;-NonInteractive;./tools/deploy/deploy-to-host.ps1)WSL_BUILD_THIN_PACKAGE生成更小的thin MSI。在 msipackage/CMakeLists.txt 中它把COMPRESS_PACKAGE设为no跳过压缩并在 msixinstaller/CMakeLists.txt 中使 MSIX 不再内嵌wsl.msi同时 CMakeLists.txt 会定义WSL_DEV_THIN_MSI_PACKAGE指向bin/platform/target/wsl.msi安装程序改为引用这个本地路径。该编译定义带有一条断言禁止出现在官方构建中static_assert(!wsl::shared::OfficialBuild)即只面向本地开发。WSL_POST_BUILD_COMMAND在msipackage目标构建完成后自动执行你指定的命令。示例命令会调用 deploy-to-host.ps1以管理员权限静默执行msiexec.exe /i wsl.msi /qn /norestart安装构建产物——副作用是每次构建结束都会覆盖安装当前机器上的 WSL只应在开发机上使用。两者可以只启用一个只设WSL_DEV_BINARY_PATH就已经得到更小、装得快的开发包两个开关是进一步压缩包体和省掉手动安装步骤。构建在仓库根目录生成并构建解决方案cmake . cmake --build .cmake .会在当前目录生成wsl.sln如果之前已经 configure 过修改UserConfig.cmake后重新执行cmake .即可让新配置生效。ARM64 目标加-A arm64Release 构建加-DCMAKE_BUILD_TYPERelease并配合cmake --build . --config Release。构建完成后检查两处输出bin\platform\target\wsl.msi生成成功例如bin\x64\debug\wsl.msi开发目录上例为C:\wsldev下出现预期内容kernel、msrdc.exe、wslg.rdp等符号链接以及system.vhd、artifacts.vhd两个 VHD 文件和lib子目录。第二点可以直接核对 CMake 脚本里创建的文件列表与 UserConfig.cmake.sample 中if(WSL_DEV_BINARY_PATH)分支逐一对应链接创建失败通常意味着 Developer Mode 未开启且没有以管理员身份运行构建dev-loop 文档将这一点列为构建前置要求。部署与验证手动安装开发包powershell tools\deploy\deploy-to-host.ps1该脚本需要管理员权限#Requires -RunAsAdministrator默认安装bin\X64\Debug\wsl.msiRelease 构建加-BuildType Release。脚本会打印Installing: 路径安装成功时输出文档中的固定文本示例结果Package C:\...\wsl.msi installed successfully如果启用了WSL_POST_BUILD_COMMAND这一步会随cmake --build .自动完成无需手动执行。安装完成后运行wsl命令确认服务正常响应即可开始日常迭代改动源码 →cmake --build .自动或手动安装→wsl验证。如需跑单元测试dev-loop 文档 给出的最小集合是bin\platform\target\test.bat /name:*UnitTest*。限制与注意事项.vhd文件无法通过符号链接或硬链接挂载所以system.vhd/artifacts.vhd是复制进开发目录的并且脚本会用icacls给这两个文件授予Everyone:(R)只读权限以便挂载成功。因此开发目录必须可写且不会被误删。开发包依赖符号链接目录结构定位是本地开发机上的快速迭代方案要交付或分发的完整包按正常路径构建不设置WSL_DEV_BINARY_PATH不启用 thin 包。WSL_DEV_BINARY_PATH除了写在UserConfig.cmake里也可以在环境中以同名环境变量提供CMakeLists.txt 中有DEFINED ENV{WSL_DEV_BINARY_PATH}的读取逻辑但主路径仍然是UserConfig.cmake里的set。要退出开发包模式注释掉UserConfig.cmake中的set(WSL_DEV_BINARY_PATH ...)重新cmake .并构建即可回到标准包。更多开发循环内容测试运行、WSL_PRE_COMMIT_MODE等其它UserConfig.cmake选项见 doc/docs/dev-loop.md。【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考