@@ -12,10 +12,24 @@ const GENERATED_REGISTRY_FILE: &str = "generated_agent_type_registry.rs";
1212
1313fn main ( ) {
1414 generate_agent_type_registry ( ) ;
15- // setup the env variable for the generated registry path
15+
1616 println ! ( "cargo:rustc-env=GENERATED_REGISTRY_FILE={GENERATED_REGISTRY_FILE}" ) ;
17- // re-run only if the registry has changed
18- println ! ( "cargo:rerun-if-changed={REGISTRY_PATH}" )
17+ println ! ( "cargo:rerun-if-changed={REGISTRY_PATH}" ) ;
18+
19+ let target = env:: var ( "TARGET" ) . unwrap_or_default ( ) ;
20+ let host = env:: var ( "HOST" ) . unwrap_or_default ( ) ;
21+
22+ println ! ( "cargo:warning=Build.rs Diagnostic: Host is {}" , host) ;
23+ println ! ( "cargo:warning=Build.rs Diagnostic: Target is {}" , target) ;
24+
25+ println ! ( "cargo:rerun-if-env-changed=AGENT_CONTROL_VERSION" ) ;
26+
27+ if target. contains ( "windows" ) {
28+ println ! ( "cargo:warning=Build.rs: Target is Windows, applying resources..." ) ;
29+ set_windows_resources ( ) ;
30+ } else {
31+ println ! ( "cargo:warning=Build.rs: Target is NOT Windows. Skipping resources." ) ;
32+ }
1933}
2034
2135fn generate_agent_type_registry ( ) {
@@ -42,3 +56,77 @@ fn generate_agent_type_registry() {
4256 let dest_path = Path :: new ( & out_dir) . join ( GENERATED_REGISTRY_FILE ) ;
4357 fs:: write ( dest_path, contents) . expect ( "Could not write the filesystem registry file" ) ;
4458}
59+
60+ fn set_windows_resources ( ) {
61+ let original_target = std:: env:: var ( "TARGET" ) . unwrap_or_default ( ) ;
62+ let original_env = std:: env:: var ( "CARGO_CFG_TARGET_ENV" ) . unwrap_or_default ( ) ;
63+ let host = std:: env:: var ( "HOST" ) . unwrap_or_default ( ) ;
64+
65+ let is_msvc_cross = host. contains ( "linux" ) && original_target. contains ( "msvc" ) ;
66+ if is_msvc_cross {
67+ println ! (
68+ "cargo:warning=Aplicando hack de winres: Cambiando TARGET y ENV a gnu temporalmente"
69+ ) ;
70+ unsafe {
71+ env:: set_var ( "TARGET" , "x86_64-pc-windows-gnu" ) ;
72+ env:: set_var ( "CARGO_CFG_TARGET_ENV" , "gnu" ) ;
73+ }
74+ }
75+
76+ let mut res = winres:: WindowsResource :: new ( ) ;
77+
78+ if is_msvc_cross {
79+ res. set_windres_path ( "x86_64-w64-mingw32-windres" ) ;
80+ }
81+
82+ res. set ( "FileDescription" , "New Relic Agent Control" ) ;
83+ res. set ( "ProductName" , "New Relic Agent Control" ) ;
84+ res. set ( "CompanyName" , "New Relic, Inc." ) ;
85+ res. set (
86+ "LegalCopyright" ,
87+ "© 2026 New Relic, Inc. All rights reserved." ,
88+ ) ;
89+ res. set ( "OriginalFilename" , "newrelic-agent-control.exe" ) ;
90+
91+ if let Ok ( version) = std:: env:: var ( "AGENT_CONTROL_VERSION" ) {
92+ let clean_version = version. trim_start_matches ( 'v' ) ;
93+ let version_semver = format ! ( "{}.0" , clean_version) ;
94+
95+ if let Ok ( u64_version) = parse_version_u64 ( & version_semver) {
96+ res. set_version_info ( winres:: VersionInfo :: PRODUCTVERSION , u64_version) ;
97+ res. set_version_info ( winres:: VersionInfo :: FILEVERSION , u64_version) ;
98+ }
99+
100+ res. set ( "ProductVersion" , & version) ;
101+ res. set ( "FileVersion" , & version) ;
102+ }
103+
104+ res. compile ( )
105+ . expect ( "Failed to compile Windows resources. Is 'mingw-w64' installed?" ) ;
106+
107+ if is_msvc_cross {
108+ unsafe {
109+ env:: set_var ( "TARGET" , & original_target) ;
110+ env:: set_var ( "CARGO_CFG_TARGET_ENV" , & original_env) ;
111+ }
112+ }
113+ }
114+
115+ // Helper to convert string "1.9.1" to u64 (Windows binary format X.X.X.X)
116+ fn parse_version_u64 ( v : & str ) -> Result < u64 , std:: num:: ParseIntError > {
117+ let parts: Result < Vec < u16 > , _ > = v. split ( '.' ) . map ( |s| s. parse ( ) ) . collect ( ) ;
118+
119+ let parts = parts?;
120+
121+ // We expect for example "1.9.1".
122+ // .first() -> 1 (Major)
123+ // .get(1) -> 9 (Minor)
124+ // .get(2) -> 1 (Patch)
125+ // .get(3) -> None -> defaults to 0 (Build)
126+ let major = * parts. first ( ) . unwrap_or ( & 0 ) as u64 ;
127+ let minor = * parts. get ( 1 ) . unwrap_or ( & 0 ) as u64 ;
128+ let patch = * parts. get ( 2 ) . unwrap_or ( & 0 ) as u64 ;
129+ let build = * parts. get ( 3 ) . unwrap_or ( & 0 ) as u64 ;
130+
131+ Ok ( ( major << 48 ) | ( minor << 32 ) | ( patch << 16 ) | build)
132+ }
0 commit comments