Description
I hoped I fixed it in 263870d, but it turned out, that this is not enough, see astral-sh/python-build-standalone#549 (comment).
Digging in deeper, I now know more, but do not have an ideal fix, yet.
First, for Hacl_Hash_Blake2b_Simd256.c
<AdditionalOptions>/arch:AVX2</AdditionalOptions>
is missing %(AdditionalOptions)
. Likewise, Hacl_Hash_Blake2s_Simd128.c
. Then, both will "see" the -m32
/ -m64
defined in
cpython/PCbuild/pyproject-clangcl.props
Lines 42 to 43 in 0a54bd6
This will fix regular release or debug builds (#131475), since they do not have to link against anything from clang.
But unfortunately, for PGO builds, clang-cl needs to link against clang_rt.profile.lib
:
<VS install path>\Community\VC\Tools\Llvm\lib\clang\<clang major version>\lib\windows\clang_rt.profile-i386.lib
<VS install path>\Community\VC\Tools\Llvm\x64\lib\clang\<clang major version>\lib\windows\clang_rt.profile-x86_64.lib
This is not found correctly without setting PreferredToolArchitecture
(or LLVMInstallDir
).
The reason stems from <VS install path>\Community\MSBuild\Microsoft\VC\v160\Microsoft.Cpp.ClangCl.Common.props
:
<_DefaultLLVMInstallDir Condition="'$(_DefaultLLVMInstallDir)' == '' AND '$(PreferredToolArchitecture)' == 'arm64'">$(VsInstallRoot)\VC\Tools\Llvm\ARM64</_DefaultLLVMInstallDir>
<_DefaultLLVMInstallDir Condition="'$(_DefaultLLVMInstallDir)' == '' AND '$(PreferredToolArchitecture)' == 'x64'">$(VsInstallRoot)\VC\Tools\Llvm\x64</_DefaultLLVMInstallDir>
<_DefaultLLVMInstallDir Condition="'$(_DefaultLLVMInstallDir)' == '' AND '$(PreferredToolArchitecture)' != 'x64'">$(VsInstallRoot)\VC\Tools\Llvm</_DefaultLLVMInstallDir>
<LLVMInstallDir Condition="'$(LLVMInstallDir)' == ''">$(_DefaultLLVMInstallDir)</LLVMInstallDir>
This means, if PreferredToolArchitecture
is not given on the command line, for a 64bit build the LLVMInstallDir
is chosen to be the "32bit clang installation". Even though this one will happily "cross-compile" getting the -m64
switch, it will fail in the link step, because the 64bit libs are "in the 64bit clang installation directory".
The PreferredToolArchitecture property determines whether the 32-bit or 64-bit compiler and tools are used in the build.
I am unsure what to do here:
- try to fix that somewhere in
pyproject-clangcl.props
: not so easy, because "too late":LLVMInstallDir
will always be set here, either because- given on the command line, i.e. custom clang installation
- or
Microsoft.Cpp.ClangCl.Common.props
will already have set it to the bundled clang installation based onPreferredToolArchitecture
- ask Microsoft to fix that? There are some hits about this behaviour in the net ...
- document (again, but this time I have more background knowledge) that the user is responsible to either
- set
PreferredToolArchitecture
correctly when using the bundled version - set
LLVMInstallDir
to a 32bit installation for 32bit builds and similarily for 64bit builds.
- set
See here, why I personally anyways always set PreferredToolArchitecture
(spoiler: I do not like the _freeze_module
to be compiled as 32bit, for exactly the same reason: if PreferredToolArchitecture
is missing, it defaults to 32bit). Most probably an unwanted side effect of https://github.com/python/cpython/pull/28491/files or the lesser evil :)
ISTM, I returned to this habit too quickly, and so I missed that rabit hole - but now I've dug deeper.
FTR, this will also be needed when someone wants to do ASAN, UBSAN, FUZZER, etc, builds using clang-cl on Windows, because in all those cases the correct libs are needed.