premake / premake-core

Premake
https://premake.github.io/
BSD 3-Clause "New" or "Revised" License
3.23k stars 621 forks source link

support clang-cl as a toolset #2119

Open x3nb63 opened 1 year ago

x3nb63 commented 1 year ago

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:

1) construct a link command that respects /link with everything thereafter being last

2) link more Windows style by constructing a linker command from $LD, in which case the -fuse-ld=lld-link param 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).

nickclark2016 commented 1 year ago

For this, I'm recommending a target of gmake2, as gmake is deprecated.