@@ -48,7 +48,8 @@ object MsvcEnvironment {
4848 logger.debug(s " not found: vcvars64.bat " )
4949 - 1
5050 case Some (vcvars) =>
51- logger.debug(s " Using vcvars script $vcvars" )
51+ logger.message(s " Using vcvars script: $vcvars" )
52+ logger.message(s " Working directory: $actualWorkingDir" )
5253
5354 val msvcEnv : Map [String , String ] = captureVcvarsEnv(vcvars, actualWorkingDir, logger)
5455
@@ -76,6 +77,49 @@ object MsvcEnvironment {
7677 // show aliased drive map
7778 getSubstMappings.foreach((k, v) => logger.message(s " substMap $k: -> $v" ))
7879
80+ // Log critical MSVC variables at message level for diagnosis
81+ val vsInstallDir = msvcEnv.get(" VSINSTALLDIR" ).orElse(msvcEnv.get(" vsinstalldir" ))
82+ val vcInstallDir = msvcEnv.get(" VCINSTALLDIR" ).orElse(msvcEnv.get(" vcinstalldir" ))
83+ logger.message(s " VSINSTALLDIR= ${vsInstallDir.getOrElse(" <not set>" )}" )
84+ logger.message(s " VCINSTALLDIR= ${vcInstallDir.getOrElse(" <not set>" )}" )
85+ logger.message(s " Environment has ${msvcEnv.size} variables " )
86+
87+ // Verify VSINSTALLDIR path exists
88+ vsInstallDir.foreach { dir =>
89+ val path = os.Path (dir.stripSuffix(" \\ " ), os.pwd)
90+ logger.message(s " VSINSTALLDIR exists: ${os.exists(path)}" )
91+ }
92+
93+ // Log PATH - check both casings and show what we find
94+ val pathValue =
95+ msvcEnv.get(" PATH" ).orElse(msvcEnv.get(" Path" )).orElse(msvcEnv.get(" path" ))
96+ logger.message(
97+ s " PATH found: ${pathValue.isDefined}, length: ${pathValue.map(_.length).getOrElse(0 )}"
98+ )
99+ pathValue.foreach { pv =>
100+ val pathEntries = pv.split(" ;" )
101+ val msvcPathEntries = pathEntries.filter(_.toLowerCase.contains(" msvc" ))
102+ val vcPathEntries = pathEntries.filter(_.toLowerCase.contains(" \\ vc\\ " ))
103+ logger.message(
104+ s " MSVC PATH entries: ${msvcPathEntries.length}, VC entries: ${vcPathEntries.length}"
105+ )
106+ if (vcPathEntries.nonEmpty)
107+ logger.message(s " First VC PATH: ${vcPathEntries.head}" )
108+ }
109+ // Also check what keys look like PATH
110+ val pathLikeKeys = msvcEnv.keys.filter(_.toLowerCase.contains(" path" )).toSeq
111+ logger.message(s " PATH-like keys in env: ${pathLikeKeys.mkString(" , " )}" )
112+
113+ // Direct check of TreeMap case-insensitive behavior
114+ pathLikeKeys.headOption.foreach { actualKey =>
115+ val directGet = msvcEnv.get(actualKey)
116+ val upperGet = msvcEnv.get(actualKey.toUpperCase)
117+ val lowerGet = msvcEnv.get(actualKey.toLowerCase)
118+ logger.message(
119+ s " TreeMap lookup test - direct: ${directGet.isDefined}, upper: ${upperGet.isDefined}, lower: ${lowerGet.isDefined}"
120+ )
121+ }
122+
79123 val finalEnv =
80124 msvcEnv +
81125 (" GRAALVM_ARGUMENT_VECTOR_PROGRAM_NAME" -> " native-image" )
@@ -113,6 +157,7 @@ object MsvcEnvironment {
113157 command
114158 }
115159
160+ logger.message(s " Running: ${updatedCommand.head}" )
116161 logger.debug(s " native-image w/args: $updatedCommand" )
117162
118163 val result =
@@ -190,6 +235,13 @@ object MsvcEnvironment {
190235 case _ => None
191236 }
192237
238+ // Debug: log if PATH was found during parsing
239+ val pathInEnv = envLines.find(_.toLowerCase.startsWith(" path=" ))
240+ if pathInEnv.isEmpty then
241+ logger.message(" WARNING: PATH not found in vcvars output!" )
242+ logger.message(s " First 10 env lines: ${envLines.take(10 ).mkString(" ; " )}" )
243+ logger.message(s " Last 10 env lines: ${envLines.takeRight(10 ).mkString(" ; " )}" )
244+
193245 if logger.verbosity > 0 then
194246 debugLines.foreach(dbg => logger.debug(s " $dbg" ))
195247 debugLines.find(_.contains(" Writing post-execution environment to " )) match {
0 commit comments