#交叉编译 #下载 #头文件 #SDK #CRT #符号链接 #MSVC

程序+库 xwin

允许下载和重新打包 MSVC CRT 和 Windows SDK 以进行交叉编译

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 开发工具

Download history 6818/week @ 2024-05-02 8356/week @ 2024-05-09 7589/week @ 2024-05-16 7253/week @ 2024-05-23 8689/week @ 2024-05-30 7100/week @ 2024-06-06 7882/week @ 2024-06-13 6749/week @ 2024-06-20 9854/week @ 2024-06-27 7861/week @ 2024-07-04 8628/week @ 2024-07-11 12200/week @ 2024-07-18 14015/week @ 2024-07-25 15129/week @ 2024-08-01 13780/week @ 2024-08-08 11302/week @ 2024-08-15

56,373 每月下载量
用于 3 个 Crates (2 个直接)

Apache-2.0 OR MIT

175KB
3.5K SLoC

xwin

xwin 是一个用于下载和打包 Microsoft CRT 头文件和库以及 Windows SDK 头文件和库的工具,这些头文件和库是编译和链接针对 Windows 的程序所需的。

Crates.io Docs dependency status Build status

简介

本项目目标是创建一个根目录,其中包含 CRT 和 Windows SDK 所需的所有包含文件和库,以便从非 Windows 平台使用本机交叉编译工具链(如 clang/LLVM)编译和链接应用程序。这包括为 Windows SDK 添加符号链接以纠正多个大小写问题,以便此程序生成的文件可以在大小写敏感的文件系统中运行。

有关如何使用 xwin 的详细介绍,请参阅此 博客文章

安装

从源码

cargoinstall xwin --locked

功能

xwin 提供两个功能切换,用于决定使用哪个 TLS 实现

  • rustls(默认)- 使用 rustls 进行 TLS
  • native-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

修正软件包以删除不必要的文件,并添加符号链接以解决文件大小写问题,然后将其最终工件分散到目录中。这是你想要运行的主要命令,因为它还自动执行 downloadunpack,并提供在 --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特定的x64armarm64目标架构转换为LLVM等更通用的x86_64aarchaarch64。通过传递此标志,将保留这些目标的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 文件,这些文件对于本项目是必需的

许可

此贡献根据您选择的任一项双许可

任选。

依赖

~20–36MB
~661K SLoC