Skip to content

Commit 5e6bb83

Browse files
committed
Auto merge of #96737 - ChrisDenton:win-manifest, r=wesleywiser
Add Windows application manifest to rustc-main Windows allows setting some runtime options using a manifest file. The format of the XML file is documented here: https://docs.microsoft.com/en-us/windows/win32/sbscs/application-manifests The manifest file in this PR does three things: * Declares which Windows versions we support. This may help avoid unnecessary compatibility shims. * Uses the UTF-8 code page. While Rust itself uses UTF-16 APIs, other code may rely on the code page. * Makes the application long path aware (if also enabled by the user). This allows for the current directory to be longer than `PATH_MAX`. These changes only affect the `rustc` process and not any other DLLs or compiled programs.
2 parents fb19760 + 7255bc6 commit 5e6bb83

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

Diff for: compiler/rustc/Windows Manifest.xml

+28
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 rustc supports as compiler 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>

Diff for: compiler/rustc/build.rs

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use std::env;
2+
3+
fn main() {
4+
let target_os = env::var("CARGO_CFG_TARGET_OS");
5+
let target_env = env::var("CARGO_CFG_TARGET_ENV");
6+
if Ok("windows") == target_os.as_deref() && Ok("msvc") == target_env.as_deref() {
7+
set_windows_exe_options();
8+
}
9+
}
10+
11+
// Add a manifest file to rustc.exe.
12+
fn set_windows_exe_options() {
13+
static WINDOWS_MANIFEST_FILE: &str = "Windows Manifest.xml";
14+
15+
let mut manifest = env::current_dir().unwrap();
16+
manifest.push(WINDOWS_MANIFEST_FILE);
17+
18+
println!("cargo:rerun-if-changed={}", WINDOWS_MANIFEST_FILE);
19+
// Embed the Windows application manifest file.
20+
println!("cargo:rustc-link-arg-bin=rustc-main=/MANIFEST:EMBED");
21+
println!("cargo:rustc-link-arg-bin=rustc-main=/MANIFESTINPUT:{}", manifest.to_str().unwrap());
22+
// Turn linker warnings into errors.
23+
println!("cargo:rustc-link-arg-bin=rustc-main=/WX");
24+
}

0 commit comments

Comments
 (0)