premake-core
premake-core copied to clipboard
support clang-cl as a toolset
this is a follow-up of #2111, where it became clear that the currently supported clang[-X] does not work with clang-cl by simply overwriting the environment like make GXX="clang-cl" CXXFLAGS="/EHsc ..." ...
this is due to the nature of clang-cl being a LLVM frontend specifically compatible to Microsofts Visual C++ compiler, see https://clang.llvm.org/docs/UsersManual.html#clang-cl.
What problem will this solve?
It will allow to build Visual C++ codes, especially those that make direct use of Microsoft CRT and Windows SDK (which can be installed on Linux using xwin).
What might be a solution?
The main problem with clang-cl and its linker lld-link is their command line options dont work the same way as the g++ and ld duo. Specifically:
In order to link against CRT and SDK things one needs to 1) tell clang-cl to use lld-link instead of the GNU ld and 2) pass their installation paths down to lld-link, for example like so:
make CXX=clang-cl \
CXXFLAGS="/EHsc" \
LDFLAGS="-fuse-ld=lld-link /link /libpath:/path/CRT /libpath:/path/SDK" \
config=release_win64
This however does not work cause the /link parameter (of lld-link) must be the very last thing of the command constructed, since everyting after /link gets passed to the linker. This does not happen the way linking is currently done in GNU style by constructing a command like $CXX $LDFLAGS ... <objects> -o <lib or exe>
I see two possible solutions:
-
construct a link command that respects
/linkwith everything thereafter being last -
link more Windows style by constructing a linker command from $LD, in which case the
-fuse-ld=lld-linkparam would not be necessary and it would still need to respect the position of/link ...(right now $LD does not appear to me supported at all by the generated makefiles)
What other alternatives have you already considered?
There are none as far I see and tried; its ether supported or its not.
Anything else we should know?
Distributions like Ubuntu package clang-cl with version numbers; which means the actual commands are clang-cl-14 or clang-cl-12 and lld-link-14 or lld-link-12 or whatever version the user installed. So a optional version number should be supported, same way as the current clang toolset does (when #2113 is released).
For this, I'm recommending a target of gmake2, as gmake is deprecated.