dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.45k stars 4.76k forks source link

build-runtime.cmd fails when the latest version in C:\Program Files (x86)\Windows Kits\10\Lib does not contain ucrt #42774

Open Maoni0 opened 4 years ago

Maoni0 commented 4 years ago

Initial cost estimate: 1 week Initial contacts: @trylek, @hoyosjs, @ViktorHofer

so I just freshly cloned the repo and failed to build. this was what I got when trying to build clr -

  CSC : warning CS1668: Invalid search path 'C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64' specified in 'LIB environment variable' -- 'directory does not exist' [C:\runtime-doubly-fl\artifacts\obj\coreclr\Windows_NT.x64.Release\src\ToolBox\SOS\DacTableGen\dactablegen.csproj]
  CSC : warning CS1668: Invalid search path 'C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x86' specified in 'LIB environment variable' -- 'directory does not exist' [C:\runtime-doubly-fl\artifacts\obj\coreclr\Windows_NT.x64.Release\src\ToolBox\SOS\DacTableGen\dactablegen.csproj]
      4 Warning(s)
      0 Error(s)

  Time Elapsed 00:01:17.78
  File not found - *.dll
  0 File(s) copied
  BUILD: Error: Failed to copy the Universal CRT to the artifacts directory.
C:\runtime-doubly-fl\src\coreclr\runtime.proj(37,5): error MSB3073: The command ""C:\runtime-doubly-fl\src\coreclr\build-runtime.cmd" -x64 -release -enforcepgo" exited with code 4.

my latest version in C:\Program Files (x86)\Windows Kits\10\Lib is 10.0.19041.0 but it does not have a ucrt dir in it -

 Directory of C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0

08/19/2020  11:16 PM    <DIR>          .
08/19/2020  11:16 PM    <DIR>          ..
07/27/2020  01:23 AM    <DIR>          km
04/18/2019  06:46 PM               512 stub512.com
07/27/2020  12:44 AM    <DIR>          um

this is because I installed "Windows Driver Kit - Windows 10.0.19041.1" which created this 10.0.19041.0 dir but it did not install ucrt in it.

when I uninstalled the Windows Driver Kit the build succeeded. now the last ver in this dir does have ucrt:

C:\WINDOWS\system32>dir "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0" Volume in drive C is OSDisk Volume Serial Number is EA9A-AF54

 Directory of C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0

07/27/2020  12:56 AM    <DIR>          .
07/27/2020  12:56 AM    <DIR>          ..
07/27/2020  12:56 AM    <DIR>          ucrt
07/27/2020  12:56 AM    <DIR>          ucrt_enclave
07/27/2020  12:56 AM    <DIR>          um
               0 File(s)              0 bytes

so this says we have problems searching for the right dir for ucrt.

yew commented 3 years ago

@Maoni0 Solution: Simply create "ucrt\x64", "ucrt\x86" sub folders and rerun MSbuild. MSbuild doesn't actually need anything from this folder but it's set as input variable anyways during Visual Studio setup.

hoyosjs commented 3 years ago

Haven't seen any other repro of this.

drewnoakes commented 10 months ago

CS1668: Invalid search path 'C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64' specified in 'LIB environment variable' -- 'directory does not exist'

I hit this in VS after uninstalling that version (and several others) of the Windows SDK. Restarting VS seems to have made it go away.

vatsan-madhavan commented 8 months ago

FYI - I've done something like this to work around this warning in my builds.

  <PropertyGroup>
    <SetBuildDefaultEnvironmentVariablesDependsOn>
      _SanitizeLibraryPathComponents;
      $(SetBuildDefaultEnvironmentVariablesDependsOn);
    </SetBuildDefaultEnvironmentVariablesDependsOn>
  </PropertyGroup>

  <!--    
    Ensure that components of $(LibraryPath) that are actually not
    present on disk are removed.

    This target will run before 'SetBuildDefaultEnvironmentVariables'
    is called within Microsoft.Cpp.Current.targets,
    which sets the environment variable 'LIB' based on $(LibraryPath).
  -->
  <Target Name="_SanitizeLibraryPathComponents">
    <ItemGroup>
      <_LibraryPathComponents Include="$(LibraryPath)" />
    </ItemGroup>

    <PropertyGroup>
      <LibraryPath>@(_LibraryPathComponents->Exists())</LibraryPath>     
    </PropertyGroup>
  </Target>