39 个版本
新 0.6.5 | 2024 年 8 月 21 日 |
---|---|
0.6.2 | 2024 年 7 月 2 日 |
0.5.0 | 2023 年 11 月 13 日 |
0.2.14 | 2023 年 6 月 20 日 |
0.1.5 | 2021 年 11 月 25 日 |
#41 in 开发工具
56,373 每月下载量
用于 3 个 Crates (2 个直接)
175KB
3.5K SLoC
简介
本项目目标是创建一个根目录,其中包含 CRT 和 Windows SDK 所需的所有包含文件和库,以便从非 Windows 平台使用本机交叉编译工具链(如 clang/LLVM)编译和链接应用程序。这包括为 Windows SDK 添加符号链接以纠正多个大小写问题,以便此程序生成的文件可以在大小写敏感的文件系统中运行。
有关如何使用 xwin 的详细介绍,请参阅此 博客文章。
安装
从源码
cargoinstall xwin --locked
功能
xwin
提供两个功能切换,用于决定使用哪个 TLS 实现
rustls
(默认)- 使用rustls
进行 TLSnative-tls
- 使用native-tls
进行 TLS。注意,在使用 OpenSSL 的平台上,它始终是从源代码构建的。
从压缩包
您可以从 发布 下载预构建的二进制文件。
x86_64-unknown-linux-musl
x86_64-apple-darwin
aarch64-apple-darwin
用法
常见
--accept-license
- 不显示接受许可证的提示。您也可以设置环境变量XWIN_ACCEPT_LICENSE=1
--arch <arch>
- 包含的架构[默认:x86_64
] [可能值:x86
,x86_64
,aarch
,aarch64
]. 注意,我没有完全测试过 aarch/64 和 x86,所以它们可能会有问题,如果你遇到问题,请提交一个问题。--cache-dir <cache-dir>
- 指定用于将下载项持久化到磁盘的缓存目录。如果没有指定,默认为./.xwin-cache
。-L, --log-level <level>
- 消息的日志级别,只有等于或高于该级别的日志将被输出[默认: info] [可能值: off, error, warn, info, debug, trace]。--variant <variant>...
- 包含的变体[默认: desktop] [可能值: desktop, onecore, spectre]。注意,我没有完全测试除desktop
之外的任何变体,如果你尝试使用其他变体并遇到问题,请提交一个问题。注意,还有一个store
变体,由于它很奇怪,并且没有针对其实际项目,所以尚未实现。--channel <channel>
- 要使用的产品频道[默认: release]--manifest-version <version>
- 要检索的清单版本[默认: 17]。--manifest
- 指定要使用的高级清单,而不是从微软下载。这可以确保输出可重复。--sdk-version
- 要使用的特定 SDK 版本。如果没有指定,则使用清单中最新版本的 SDK。--crt-version
- 要使用的特定 CRT 版本。如果没有指定,则使用清单中最新版本的 CRT。--timeout
- 指定单个 HTTP GET 请求允许的最长时间。默认为 60 秒。
环境变量
https_proxy
- 指定要使用的 HTTPS 代理的环境变量。
xwin download
这会下载顶级清单以及任何需要的 vsix、msi 或 cab 文件,这些文件尚未包含在下载缓存中。
xwin unpack
将下载的软件包内容解压缩到磁盘。自动运行 download
。
xwin splat
修正软件包以删除不必要的文件,并添加符号链接以解决文件大小写问题,然后将其最终工件分散到目录中。这是你想要运行的主要命令,因为它还自动执行 download
和 unpack
,并提供在 --output
(./.xwin-cache/splat
)指定的路径上的所需头文件。
Splat 选项
--copy
- 将文件从解压缩目录复制到 splat 目录,而不是移动它们,这保留了原始解压缩目录,但增加了总体执行时间和磁盘使用。--disable-symlinks
- 默认情况下,为了解决一般使用中的大小写问题,会同时在CRT和WindowsSDK
中添加符号链接。例如,如果您正在编译C/C++代码,并使用#include <windows.h>
,那么在区分大小写的文件系统上将会出错,因为WindowsSDK
中的实际路径是Windows.h
。即使您正在编译的C/C++代码对所有CRT/SDK包含都使用了正确的大小写,这也适用,因为内部头文件在大多数情况下也使用了不正确的大小写。--include-debug-libs
- MSVCRT包含(不可再分发)各种库的调试版本,对于大多数使用来说通常没有保留价值。--include-debug-symbols
- MSVCRT包含几个库的PDB(调试符号)文件,对于大多数使用来说通常没有保留价值。--preserve-ms-arch-notation
- 默认情况下,我们在创建目录/名称时将MS特定的x64
、arm
和arm64
目标架构转换为LLVM等更通用的x86_64
、aarch
和aarch64
。通过传递此标志,将保留这些目标的MS名称。--use-winsysroot-style
- 使用/winsysroot布局,这样clang-cl的/winsysroot标志就可以与输出一起使用,而不是需要同时使用-vctoolsdir和-winsdkdir。您可能还希望使用--preserve-ms-arch-notation和--disable-symlinks与Windows上的clang-cl一起使用。--output
- 根输出目录。如果没有指定,默认为./.xwin-cache/splat
。--map
- 一个可选的map文件,用于配置要展开哪些文件,以及要创建的任何附加符号链接。
这会将所有未修剪的展开文件移动到根目录下的规范位置,例如,这里是一个x86_64
Desktop
展开的样子。unpack
在需要时自动运行。
.xwin-cache/splat
├── crt
│ ├── include
│ │ ├── cliext
│ │ ├── CodeAnalysis
│ │ ├── cvt
│ │ ├── experimental
│ │ ├── Manifest
│ │ └── msclr
│ │ └── com
│ └── lib
│ └── x86_64
└── sdk
├── include
│ ├── cppwinrt
│ │ └── winrt
│ │ └── impl
│ ├── shared
│ │ ├── ndis
│ │ └── netcx
│ │ └── shared
│ │ └── net
│ │ └── wifi
│ ├── ucrt
│ │ └── sys
│ ├── um
│ │ ├── alljoyn_c
│ │ ├── gl
│ │ ├── qcc
│ │ │ └── windows
│ │ └── winsqlite
│ └── winrt
│ └── wrl
│ └── wrappers
└── lib
├── ucrt
│ └── x86_64
└── um
└── x86_64
xwin最小化
这是一个高级命令,在构建使用strace捕获整个构建过程中使用到的所有头文件和库的cargo清单之前,先执行splat
。这些信息被输出到map文件中。此命令还可以将最终的splat输出到磁盘,或者可以使用map文件与splat
一起使用,只展开其中描述的文件和符号链接。
请注意,目前构建总是使用/vctoolsdir
和/winsdkdir
选项,因此预期这些是在您正常环境中编译C/C++代码时使用的相同选项。如果不是这种情况,请提出问题。
命令结束时,会打印原始文件和最小化文件的数量和大小,例如。
crt headers: 73(2.6MiB) / 384(18.4MiB) => 14.00%
crt libs: 5(28.0MiB) / 26(81.1MiB) => 34.58%
sdk headers: 180(9.6MiB) / 4435(304.7MiB) => 3.15%
sdk libs: 29(69.8MiB) / 456(169.9MiB) => 41.06%
需求
- Linux主机 - 这可能在其他平台上工作,但无法保证,也没有进行过测试。
cargo
- 这是唯一支持的构建工具。<arch>-pc-windows-msvc
- 您构建的目标需要安装(例如,通过rustup target add
)clang-cl
- 这用作 C/C++ 编译器llvm-lib
- 这用作归档器lld-link
- 这用作链接器strace
- 这用于捕获 lld 和 clang 编译器执行的系统调用
最小化选项
注意所有splat 选项也适用于最小化。
--map
- 输出最小化结果的 map 路径。如果未指定,默认为./.xwin-cache/xwin-map.toml
。--minimize-output
- 仅将最小化文件 splat 到的根目录。如果未指定,除了正常的 splat 之外,还将写入--map
文件。--preserve-strace
- 默认情况下,strace
输出被写入磁盘的一个临时位置,一旦构建完成就会被删除。通过传递此选项,允许它被持久化。在构建开始之前,路径会被写入。
映射文件
如最小化中所述,它有很多限制,使我生活更轻松,但这使它不适合不使用 cargo/rust 的人。其他人可以想出他们自己的最小化版本,可以输出 splat
理解的相同格式,仍然可以在不使用 cargo/rust 的情况下获得 xwin
的好处。
格式非常简单
├── crt
│ ├── headers
│ │ ├── filter - Array of relative paths to keep
│ │ └── symlinks
│ │ └── <path> - The same path as one of the filters
│ │ └── <names> - Array of symlinks to create in the same directory as the parent path
│ ├── libs *
└── sdk *
示例
查看文档/example-map.toml以获取真实世界示例。
容器
xwin.dockerfile 是一个示例 Dockerfile,可以用作构建和测试目标为 x86_64-pc-windows-msvc
的 Rust 仓库的容器镜像。
谢谢
特别感谢 https://github.com/mstorsjo/msvc-wine 的启发和 @mdsteele 发布的几个 Rust 仓库,这些仓库中包含 msi/cab 文件,这些文件对于本项目是必需的
许可
此贡献根据您选择的任一项双许可
- Apache 许可证第 2 版 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选。
依赖
~20–36MB
~661K SLoC