nodejs / node-gyp

Node.js native addon build tool
MIT License
9.95k stars 1.8k forks source link

Use clang-cl for Windows #3072

Open SuibianP opened 1 month ago

SuibianP commented 1 month ago

I am trying to build the llnode module on Windows, which can only be built with clang-cl. The project previously (ab)used the passthrough of arguments to msbuild to configure the CLToolPath and CLToolExe properties, which has hence been fixed in #1164. (nodejs/llnode#321, nodejs/llnode#377)

I have attempted the following to no avail,

  1. Add in binding.gyp
"msbuild_settings": {
    "ClCompile": {
        "CLToolPath": "<(cl_tool_path)",
        "CLToolExe": "<(cl_tool_exe)",
    },
},

This does put the properties into the vcxproj, but in the ClCompile section. https://stackoverflow.com/a/31362960/12385184

  1. CC and CXX environment variables (https://github.com/nodejs/node-gyp/issues/2813#issuecomment-1462523117)

This does have some effect on the configure phase, but only accepts GCC (not CL) compatible compilers, and it has no effect on the building phase which still uses CL.exe.


This issue might be a case of #1537 if there is no special way to specify the compiler executable on Windows.

SuibianP commented 1 week ago

Without changes to gyp and without breaking backward compatibility, the only way I can think of to pass arbitrary parameters is to prepend some character illegal in msbuild target names, such as ? or (. It is going to be rather ugly that way though... node-gyp build target1 target2 ?/p:CLToolExe="C:\bin\LLVM\clang-cl.exe" ?/p:CLToolPath="C:\bin\LLVM"

A reasonable compromise might be to pass through all arguments beginning with / to msbuild, on the assumption that target names rarely begins with a slash (although it is probably legal).

@cclauss any comments?

cclauss commented 1 week ago

Sorry, I am not a Windows user.