<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/129223>129223</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang -winsdkdir is overridden in presence of a system-installed Visual Studio
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mkre
      </td>
    </tr>
</table>

<pre>
    Hi,

We are trying to build a binary on Windows using a specific set of Visual Studio (installed under `C:\Users\ydfb4q\BDM-2130\16.9.31910.168`) and Windows libraries (`C:\Users\ydfb4q\BDM-2130\10.0.19041.0`). 

### No VS installed

This is working as expected with `-winsdkdir` and `-vctoolsdir` when there is no Visual Studio installed on the system: 
```
.\clang.exe -fuse-ld=lld-link.exe C:\Users\ydfb4q\BDM-2130\hello.cpp -Wl,-vctoolsdir:C:\Users\ydfb4q\BDM-2130\16.9.31910.168\Professional\VC\Tools\MSVC\14.28.29910\ -Wl,-winsdkdir:C:\Users\ydfb4q\BDM-2130\10.0.19041.0\ -o C:\Users\ydfb4q\BDM-2130\hello.exe -L C:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\um\x64\ -Wl,-verbose -isystem C:\Users\ydfb4q\BDM-2130\16.9.31910.168\Professional\VC\Tools\MSVC\14.28.29910\include -isystem C:\Users\ydfb4q\BDM-2130\10.0.19041.0\include\ucrt
```
[link_no_vs.txt](https://github.com/user-attachments/files/19026076/link_no_vs.txt) indicates the correct libraries being used:
```
lld-link: Reading C:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\um\x64\kernel32.lib
lld-link: Reading C:\Users\ydfb4q\BDM-2130\16.9.31910.168\Professional\VC\Tools\MSVC\14.28.29910\lib\x64\libvcruntime.lib
lld-link: Reading C:\Users\ydfb4q\BDM-2130\10.0.19041.0\Lib\ucrt\x64\libucrt.lib
```

### VS installed

After installing Visual Studio on the system, we would still like ignore its installation when linking our binary. However, the same command line no leads to [link_with_vs_installed.txt](https://github.com/user-attachments/files/19026083/link_with_vs_installed.txt), which shows that system libraries are pulled in:
```
lld-link: Reading C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64\kernel32.lib
lld-link: Reading c:\apps\MVS174\VC\Tools\MSVC\14.34.31933\lib\x64\libvcruntime.lib
lld-link: Reading C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\ucrt\x64\libucrt.lib
```

Setting the `VCINSTALLDIR` environment variable
```
set VCINSTALLDIR=C:\Users\ydfb4q\BDM-2130\16.9.31910.168
```
leads to correctly picking up the Visual Studio libraries (but still the system Windows libraries, obviously): [link_with_vs_installed-vcinstalldir.txt](https://github.com/user-attachments/files/19026106/link_with_vs_installed-vcinstalldir.txt)
```
lld-link: Reading C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64\kernel32.lib
lld-link: Reading C:\Users\ydfb4q\BDM-2130\16.9.31910.168\Professional\VC\Tools\MSVC\14.28.29910\lib\x64\libvcruntime.lib
lld-link: Reading C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\ucrt\x64\libucrt.lib
```

Setting the `WindowsSdkDir` environment variable
```
set WindowsSdkDir=C:\Users\ydfb4q\BDM-2130\10.0.19041.0
```
has no effect, it is still linking against the system Windows libs: [link_with_vs_installed-vcinstalldir-windowssdkdir.txt](https://github.com/user-attachments/files/19026124/link_with_vs_installed-vcinstalldir-windowssdkdir.txt)
```
lld-link: Reading C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64\kernel32.lib
lld-link: Reading C:\Users\ydfb4q\BDM-2130\16.9.31910.168\Professional\VC\Tools\MSVC\14.28.29910\lib\x64\libvcruntime.lib
lld-link: Reading C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\ucrt\x64\libucrt.lib
```

### Workaround

The only way we could find to get the desired behavior is to specify absolute paths to the Windows system libraries, adding 
```
-lC:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\um\x64\kernel32.lib -lC:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\um\x64\uuid.lib -lC:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\ucrt\x64\libucrt.lib
```
to the command line: [link_with_vs_installed-vcinstalldir-windowssdkdir-explicitpath.txt](https://github.com/user-attachments/files/19026142/link_with_vs_installed-vcinstalldir-windowssdkdir-explicitpath.txt)
```
lld-link: Reading C:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\um\x64\kernel32.lib
lld-link: Reading C:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\um\x64\uuid.lib
lld-link: Reading C:\Users\ydfb4q\BDM-2130\10.0.19041.0\lib\ucrt\x64\libucrt.lib
lld-link: Reading C:\Users\ydfb4q\BDM-2130\16.9.31910.168\Professional\VC\Tools\MSVC\14.28.29910\lib\x64\libcpmt.lib
```
While that works, it is not very robust, because we have to specify all libraries explicitly. If we were to change our source code to require more Windows libraries, there is always the risk of unintendedly pulling in system libraries.

-----

Can we somehow get `-winsdkdir` to take precedence over any system-installed libraries? The same question applies to `-vctoolsdir`. Ideally, it would pick up only the libraries under the specified location without having to set `VCTOOLSDIR` additionally.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWElv4zoS_jX0hbAgUZYTHXxIKwheY_IWvGSSY4MSSxbHNKnmYsf_flCUHS_pDJyOgekBJghgW0utX31VRe6cnGuAGSm-kOJ2xIPvjJ0tFxZGtRGb2W-SsIqkNyS9eQbKLVBvN1LPqTe0DlIJymktNbcbajR9llqYtaPB4SOcuh4a2cqGOvDUtPRJusAVffBBSEMJu5baea4UCBq0AEvJNK1IfkOK6p8OrCNFtRFtPflOiurL7e9jluUpKapsmpRJnpVZmmTTazJNCSsp1-JVv5K15VaCQx1nykyTNMnKdJIl6SAxoYPfhOXDP_3D0KcH-mrzcPuxk45KR9fGLqLXjsJLD40HQdfSd-jTeC21EwshLZmm0VK8uGq8Mcptr6470NR3YAGlaXMSrH2kTHyMuo3zsCT5TTRzmm7_05uEFFWjuJ4n8AJ03AYHYyVIfquUGCupF_H6GSHpQCmTNH1Px8-KsOrQ4Pzm43kqqr-sacE5aTRXpKieKlJUjyiSFNXvD_FnNknYdcLKMkMJO837-J2n-DCZKMWc728M2v05z59oUbImRRWWpKheppMD41dga-OAjuWQs7Nkfzp0UjcqiA9qPfZoKwK9aqw_gRkpviCYvmnzbeUS_-JJcUvYded971ATuyPsbi59F-qkMUvC7oIDO-be86ZbgvaOsLtWKsDPrEzZNL2aEnZ3IpSVVGohG-7BRdw3xlpo_EGN14B1FxwI1Hts5Q7zWCd_Axf45AVSuwCrQeUswTs_r-XTSR4MG2xSsl41Nmgvl_BJu469vx-8Rwgc6MLfWzVHsDgkzLdsedN6sLuLaM4xyx1zG6voGujaBCWo81IpquQCqJxrgyzp3U4Q99LogUHRXZRrgt02poT-ZtawAovyonS-RBgtl0jESmpAtlXAhcOutsM1cve3lfv26sBlMH6d7zD-YwWsjG53sumo67CZ-Y77bUQOQI-tuA-xIUj9Idz_Zc3c8iW9Q7uwQb5cT1FtUe3a5z-kdxEGr8mPiGAsTdOIiI9VQjPo5X0fcfz0kF1N3kd3PsGSyPNPofsSPp6N9wfwPo5EHWBff6q-_vHweHN_f_v1b2zsoFfSGo1woCtuJa8VnAjB8ejotfz24_RxAoAdnrd8qTa0l00sjdBHU48r72hkqoPfFty-Gt8OVwhUU6-kCU5tMLo4i7xXPeNVs_0upL1IKWXp9N1SequNlb9whfziveK_WU1bDQ9icTvMyWeW0_F759XTYds7ltjxOJJD20LjEffS45S-a0pDy-FzjqB7p2bc-eWB4y6-Noy8lykWNjmvWH6g-_-l8z9SOvvB69nYBbcm6NclFajRakPXfIMzVRNnqlZqgS1iDgNoBThpQdAaOr6SxiLEvdlu8RvKa2dU8EB77rt4B1_a-XE6oWCVcBFjcWLpWF14AqcXkRiCFJ-Vdl6qtpE7HEF_lhzG8NIr2UiPObkMU0zYzzDFW0M-Qhu_wC52JjoureF9xPwqbNf0yx-B-LmTCoblZG3swu27ojaersBuqDV1cLFd1tDw4ACpp-MrOGKV2EF3w-cORWqT0K9tXP_Axuebjus5xL3OmWAbrB8R71j4HqQFusSt8IdT6uuxGldrvhnOEax0C2paGrTUHrQAgSNyGLZSqd_wWTIw6Rj_hq8V12igM0vozDqy6JuzPix1vgDaW2hAgG6AmhVYyvVmq2G8P9nb25zf0cfdpvo9gIv7Le97hTHCJfX0-DChXwVwhXN4TMOwNOPEj-N-pH50eh_o4bw1jirDIS3qN812k5a-M8FjrrZnvW5w7ql6_PPP-4ftZoP07iOu1CYZiVkuyrzkI5hlV5P0Ki9zlo26GW-va9FmvEnb_GoKrBENQHnF2ul0kpZtOZIzlrIiZew6SycszZKSt23W5O3kesqgKCdkksKSS5UotVomxs5H0rkAs4yVjOUjxWtQLh5hMxZPPgljpLgd2Rm-MK7D3JFJqqTzbi_CS69gFh-n-5whSDBBVgoBGnHQW3BD3lrK3-bsaIsaBatm_4F7Ufn2Y9xb8684TN5FZyL_Dv6sZuzfAQAA__-Y-k7X">