Skip to content

Commit 232f913

Browse files
committed
Auto merge of #13131 - ChrisDenton:windows-manifest, r=ehuss
Add a windows manifest file This adds a Windows [application manifest file](https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests) to the built `cargo.exe` for windows msvc. This manifest file is used to enable modern features of Windows. [`rustc`](https://github.com/rust-lang/rust/tree/7df0c211ace4157009eebd015f1a083490faa0bc/compiler/rustc) has been using a similar manifest for about a year now. The manifest file does the following: * States our compatibility with Windows versions 7, 8, 8.1, 10 and 11. This allows avoiding unnecessary compatibility shims. * Sets the code page to UTF-8. This should have no real impact on existing code (which should work with any code page). That said it may avoid issues if dependencies do use the local code page because conversions to/from Unicode are lossy so if a Unicode code point has no local code page equivalent, information is lost. * Enable long path awareness. Mostly rust itself side-steps long path issues by using `\\?\` paths internally. However, this doesn't work for the current directory whereas using this option does. You can test that a manifest file has been embedded by extracting it to a new file: mt -nologo -inputresource:cargo.exe -out:embedded.manifest You can also examine the `.rsrc` (aka resource) section using `dumpbin` dumpbin /SECTION:.rsrc /ALL cargo.exe ### Additional info This also sets the [`/Wx` linker option](https://learn.microsoft.com/en-us/cpp/build/reference/wx-treat-linker-warnings-as-errors?view=msvc-170) which turns linker warnings into errors. When setting linker options manually, I prefer to also set this because, unless there are also linker errors, `rustc` will not show linker warnings by default. Linker warnings should be rare and usually do indicate an actual problem so not ignoring them should be fine.
2 parents 749654c + 6f7f927 commit 232f913

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

build.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::process::Command;
77
fn main() {
88
commit_info();
99
compress_man();
10+
windows_manifest();
1011
// ALLOWED: Accessing environment during build time shouldn't be prohibited.
1112
#[allow(clippy::disallowed_methods)]
1213
let target = std::env::var("TARGET").unwrap();
@@ -76,3 +77,26 @@ fn commit_info() {
7677
println!("cargo:rustc-env=CARGO_COMMIT_SHORT_HASH={}", next());
7778
println!("cargo:rustc-env=CARGO_COMMIT_DATE={}", next())
7879
}
80+
81+
#[allow(clippy::disallowed_methods)]
82+
fn windows_manifest() {
83+
use std::env;
84+
let target_os = env::var("CARGO_CFG_TARGET_OS");
85+
let target_env = env::var("CARGO_CFG_TARGET_ENV");
86+
if Ok("windows") == target_os.as_deref() && Ok("msvc") == target_env.as_deref() {
87+
static WINDOWS_MANIFEST_FILE: &str = "windows.manifest.xml";
88+
89+
let mut manifest = env::current_dir().unwrap();
90+
manifest.push(WINDOWS_MANIFEST_FILE);
91+
92+
println!("cargo:rerun-if-changed={WINDOWS_MANIFEST_FILE}");
93+
// Embed the Windows application manifest file.
94+
println!("cargo:rustc-link-arg-bin=cargo=/MANIFEST:EMBED");
95+
println!(
96+
"cargo:rustc-link-arg-bin=cargo=/MANIFESTINPUT:{}",
97+
manifest.to_str().unwrap()
98+
);
99+
// Turn linker warnings into errors.
100+
println!("cargo:rustc-link-arg-bin=cargo=/WX");
101+
}
102+
}

windows.manifest.xml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<!--
3+
This is a Windows application manifest file.
4+
See: https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests
5+
-->
6+
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
7+
<!-- Versions cargo supports as hosts -->
8+
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
9+
<application>
10+
<!-- Windows 7 --><supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
11+
<!-- Windows 8 --><supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
12+
<!-- Windows 8.1 --><supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
13+
<!-- Windows 10 and 11 --><supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
14+
</application>
15+
</compatibility>
16+
<!-- Use UTF-8 code page -->
17+
<asmv3:application>
18+
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
19+
<activeCodePage>UTF-8</activeCodePage>
20+
</asmv3:windowsSettings>
21+
</asmv3:application>
22+
<!-- Remove (most) legacy path limits -->
23+
<asmv3:application>
24+
<asmv3:windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
25+
<ws2:longPathAware>true</ws2:longPathAware>
26+
</asmv3:windowsSettings>
27+
</asmv3:application>
28+
</assembly>

0 commit comments

Comments
 (0)