Skip to content

build: add option to enable clang-cl on Windows - #52870

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
targos:clang-cl-v2
May 13, 2024
Merged

build: add option to enable clang-cl on Windows#52870
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
targos:clang-cl-v2

Conversation

@targos

@targostargos commented May 7, 2024

Copy link
Copy Markdown
Member

The goal here is to do the right changes with lessons learned from #35433.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/actions
  • @nodejs/gyp

@nodejs-github-botnodejs-github-bot added build Issues and PRs related to build files or the CI. meta Issues and PRs related to the general management of the project. needs-ci PRs that need a full CI run. labels May 7, 2024
@targostargos added the wip Issues and PRs that are still a work in progress. label May 7, 2024
targos added a commit to targos/gyp-next that referenced this pull request May 7, 2024
Comment threadtools/gyp/pylib/gyp/MSVSSettings.py Outdated
@targos

Copy link
Copy Markdown
MemberAuthor

Stopping for now. Locally, current error is:

 ..\..\out\Release\\obj\global_intermediate\icudt75l_dat.obj: unknown machine: 0
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(1599,5): error MSB6006: Arrêt de "llvm-lib.exe" avec le code 1. [D:\Git\nodejs\node\tools\icu\icudata.vcxproj]

Which is #34201 (hack: 711a822)

@targostargos added the help wanted Issues that need assistance from volunteers or PRs that need help to proceed. label May 7, 2024
@targos

Copy link
Copy Markdown
MemberAuthor

Rebased on #52873 so I can use what it does.
I added a better version of the ICU hack based on the suggestion from #34201 (comment). I say we wait for nodejs/build#3709 and test what happens with the cross-compiler in CI.

@StefanStojanovic

Copy link
Copy Markdown
Contributor

Rebased on #52873 so I can use what it does. I added a better version of the ICU hack based on the suggestion from #34201 (comment). I say we wait for nodejs/build#3709 and test what happens with the cross-compiler in CI.

First of all, I'm very glad to see this new PR that aims to remove hardcoded stuff. Second, about the ICU hack, please see my comment from the original PR. Since that project is compiled for host architecture, for cross-compilation we cannot use _M_AMD64/_M_ARM64

targos added a commit to nodejs/gyp-next that referenced this pull request May 8, 2024
@targos

Copy link
Copy Markdown
MemberAuthor

I have no simple idea to fix it then. If we look at Chromium, I think they just prebuild the data files and add them to source control:
https://chromium.googlesource.com/chromium/deps/icu/+/refs/heads/main/README.chromiumhttps://chromium.googlesource.com/chromium/deps/icu/+/refs/heads/main/common/

@targos

Copy link
Copy Markdown
MemberAuthor

This feature interests me. Looking at the code, this looks like a PoC, which is completely fine for this stage, but I was just wondering what you see as the end result here @targos?

The way I see it, clang and MSVC would both have to be supported in parallel for some time, before potentially moving to Clang completely. In that time, we'd need a way to choose either of them, eg. vcbuild.bat would still use MSVC, while vcbuild.bat clang would use clang.

Luckily we could leverage __clang__ to have separate code for the 2 compilers, but we'd probably need either to push some deps changes upstream, or leave them as floating patches. Overall, it would be good to know the scope of changes and affected dependencies once PoC is done so productization can be planned well.

Originally posted by @StefanStojanovic in #35433 (review)

@targos

Copy link
Copy Markdown
MemberAuthor

I ported everything from the previous PR. Build works on my Windows PC.

@targos

Copy link
Copy Markdown
MemberAuthor

When building locally, I noticed a lot of warnings on the OpenSSL side. Should we care about them?

@nodejs/crypto

Unknown escape sequence:

openssl\crypto\ct\ct_log.c(173,15): warning : unknown escape sequence '\ ' [-Wunknown-escape-sequence] [D:\a\node\node\deps\openssl\openssl.vcxproj]
openssl\include\internal/cryptlib.h(71,35): message : expanded from macro 'CTLOG_FILE' [D:\a\node\node\deps\openssl\openssl.vcxproj]
<command line>(48,32): message : expanded from macro 'OPENSSLDIR' [D:\a\node\node\deps\openssl\openssl.vcxproj]
openssl\crypto\ct\ct_log.c(173,15): warning : unknown escape sequence '\ ' [-Wunknown-escape-sequence] [D:\a\node\node\deps\openssl\openssl.vcxproj]
openssl\include\internal/cryptlib.h(71,35): message : expanded from macro 'CTLOG_FILE' [D:\a\node\node\deps\openssl\openssl.vcxproj]
<command line>(48,47): message : expanded from macro 'OPENSSLDIR' [D:\a\node\node\deps\openssl\openssl.vcxproj]

Unused function:

openssl\ssl\ssl_sess.c(27,1): warning : unused function 'sk_SSL_SESSION_value' [-Wunused-function] [D:\a\node\node\deps\openssl\openssl.vcxproj]
openssl\include\openssl/../../../config/././archs/VC-WIN64A/asm/include/openssl/safestack.h(175,29): message : expanded from macro 'DEFINE_STACK_OF' [D:\a\node\node\deps\openssl\openssl.vcxproj]
openssl\include\openssl/../../../config/././archs/VC-WIN64A/asm/include/openssl/safestack.h(73,40): message : expanded from macro 'SKM_DEFINE_STACK_OF' [D:\a\node\node\deps\openssl\openssl.vcxproj]

You can see them all here: https://github.com/nodejs/node/actions/runs/8989345480/job/24692243725

@lemire

Copy link
Copy Markdown
Member

This switches the builds to ClangCL, correct? Meaning it is not an option, it just does it... right?

(Not an objection, I just want to clarify the intention.)

@targos

Copy link
Copy Markdown
MemberAuthor

It's what it does for now, but my intention is to refactor to add an option.

@StefanStojanovic

Copy link
Copy Markdown
Contributor

I have no simple idea to fix it then. If we look at Chromium, I think they just prebuild the data files and add them to source control:
https://chromium.googlesource.com/chromium/deps/icu/+/refs/heads/main/README.chromiumhttps://chromium.googlesource.com/chromium/deps/icu/+/refs/heads/main/common/

I'll look into these links and the ICU issue generally in much more detail, but for us .dat files are not an issue. We have a problem in the next step when making a .obj file out of it. I'll get back to you once I have a better understanding of this.

It's what it does for now, but my intention is to refactor to add an option.

This should be the way to go. Eventually, we can move to using Clang in the CI, but this should be done in phases and while maintaining MSVC.

@targos

Copy link
Copy Markdown
MemberAuthor

Added an option in 58a7bf7

@targos

Copy link
Copy Markdown
MemberAuthor

Rebased, squashed into a single commit, removed the ICU hack.
Now MSVC should be the default and I think we can land this PR.

@targostargos removed the help wanted Issues that need assistance from volunteers or PRs that need help to proceed. label May 10, 2024
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@StefanStojanovic

Copy link
Copy Markdown
Contributor

Just a note on this, Most likely, after landing V8 v12.4 (last change to V8) there is an error cross-compiling to ARM64 with ClangCL. I'm certain that previously I could build it if I just changed *pCPU value.

I'm currently working on that ICU issue, so I'll also investigate this as part of that. The error I'm getting btw is this:

 In file included from ..\..\deps\v8\src\objects\elements.cc:28:
In file included from ..\..\deps\v8\third_party/fp16/src/include/fp16.h:5:
In file included from ..\..\deps\v8\third_party\fp16\src\include\fp16/fp16.h:17:
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(28,9): error : use of undeclared identifier '_CopyFloatFromInt32' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(46,20): error : use of undeclared identifier '_CopyInt32FromFloat' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(64,9): error : use of undeclared identifier '_CopyDoubleFromInt64' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(82,20): error : use of undeclared identifier '_CopyInt64FromDouble' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]

@targos

Copy link
Copy Markdown
MemberAuthor

This needs a new approval after my force-push

@StefanStojanovicStefanStojanovic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's give it a try, although my approval is gray so I doubt it will help you...

@targos

Copy link
Copy Markdown
MemberAuthor

@lemire Can you give me another green tick?

@targos

Copy link
Copy Markdown
MemberAuthor

Just a note on this, Most likely, after landing V8 v12.4 (last change to V8) there is an error cross-compiling to ARM64 with ClangCL. I'm certain that previously I could build it if I just changed *pCPU value.

I'm currently working on that ICU issue, so I'll also investigate this as part of that. The error I'm getting btw is this:

 In file included from ..\..\deps\v8\src\objects\elements.cc:28:
In file included from ..\..\deps\v8\third_party/fp16/src/include/fp16.h:5:
In file included from ..\..\deps\v8\third_party\fp16\src\include\fp16/fp16.h:17:
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(28,9): error : use of undeclared identifier '_CopyFloatFromInt32' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(46,20): error : use of undeclared identifier '_CopyInt32FromFloat' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(64,9): error : use of undeclared identifier '_CopyDoubleFromInt64' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]
..\..\deps\v8\third_party\fp16\src\include\fp16/bitcasts.h(82,20): error : use of undeclared identifier '_CopyInt64FromDouble' [E:\work\node\tools\v8_gypfiles\v8_base_without_compiler.vcxproj]

FWIW I found that support for _Copy* intrinsics was added to LLVM 18.1.0 (llvm/llvm-project@03c698a)

@lemire

Copy link
Copy Markdown
Member

@targos

Why is this not using std::bit_cast?

https://en.cppreference.com/w/cpp/numeric/bit_cast

@targostargos added the commit-queue Add this label to land a pull request using GitHub Actions. label May 13, 2024
@nodejs-github-botnodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label May 13, 2024
@nodejs-github-bot
nodejs-github-bot merged commit efa63f3 into nodejs:mainMay 13, 2024
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in efa63f3

@targos
targos deleted the clang-cl-v2 branch May 13, 2024 19:07
@StefanStojanovic

Copy link
Copy Markdown
Contributor

FWIW I found that support for _Copy* intrinsics was added to LLVM 18.1.0 (llvm/llvm-project@03c698a)

I already have a PR in FP16 not to use _Copy* for ClangCL. As there is no LLVM 18.0.0 from what I see in their releases, I could potentially use __clang_major__ to restrict it to valid ClangCL versions only. Although I couldn't test it with ClangCL installed from Visual Studio, I'll try downloading LLVM and checking if it works correctly with v18.x

Why is this not using std::bit_cast?

The FP16 is a header-only library and states Compatible with C99 and C++11. Since std::bit_cast is a C++20 feature it cannot be used there.

targos added a commit that referenced this pull request May 15, 2024
Most changes are gated by the `clang==1` condition to avoid breaking
MSVC builds.
Select C/C++ language standard with ClCompile options.
This avoids passing the `-std:c++20` flag while compiling C code.
Do it only under clang option to avoid breaking addons until node-gyp
supports the new LanguageStandard options.
Disable precompiled header configuration for now as it doesn't seem to
work with clang-cl.
Disable C++20 warnings emitted by the Visual Studio C++ STL.
They're very noisy and not our responsibility to fix.
Co-authored-by: Daniel Lemire <daniel@lemire.me>
Co-authored-by: Stefan Stojanovic <stefan.stojanovic@janeasystems.com>
PR-URL: #52870
Reviewed-By: Daniel Lemire <daniel@lemire.me>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
@targostargos mentioned this pull request May 15, 2024
eliphazbouye pushed a commit to eliphazbouye/node that referenced this pull request Jun 20, 2024
Most changes are gated by the `clang==1` condition to avoid breaking
MSVC builds.
Select C/C++ language standard with ClCompile options.
This avoids passing the `-std:c++20` flag while compiling C code.
Do it only under clang option to avoid breaking addons until node-gyp
supports the new LanguageStandard options.
Disable precompiled header configuration for now as it doesn't seem to
work with clang-cl.
Disable C++20 warnings emitted by the Visual Studio C++ STL.
They're very noisy and not our responsibility to fix.
Co-authored-by: Daniel Lemire <daniel@lemire.me>
Co-authored-by: Stefan Stojanovic <stefan.stojanovic@janeasystems.com>
PR-URL: nodejs#52870
Reviewed-By: Daniel Lemire <daniel@lemire.me>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
codebytere added a commit to electron/electron that referenced this pull request Oct 16, 2024
codebytere added a commit to electron/electron that referenced this pull request Oct 21, 2024
codebytere added a commit to electron/electron that referenced this pull request Oct 21, 2024
codebytere added a commit to electron/electron that referenced this pull request Oct 22, 2024
codebytere added a commit to electron/electron that referenced this pull request Oct 28, 2024
codebytere added a commit to electron/electron that referenced this pull request Oct 29, 2024
codebytere added a commit to electron/electron that referenced this pull request Oct 31, 2024
jkleinsc pushed a commit to electron/electron that referenced this pull request Nov 4, 2024
* chore: bump Node.js to v22.9.0
* build: drop base64 dep in GN build
nodejs/node#52856
* build,tools: make addons tests work with GN
nodejs/node#50737
* fs: add fast api for InternalModuleStat
nodejs/node#51344
* src: move package_json_reader cache to c++
nodejs/node#50322
* crypto: disable PKCS#1 padding for privateDecrypt
nodejs-private/node-private#525
* src: move more crypto code to ncrypto
nodejs/node#54320
* crypto: ensure valid point on elliptic curve in SubtleCrypto.importKey
nodejs/node#50234
* src: shift more crypto impl details to ncrypto
nodejs/node#54028
* src: switch crypto APIs to use Maybe<void>
nodejs/node#54775
* crypto: remove DEFAULT_ENCODING
nodejs/node#47182
* deps: update libuv to 1.47.0
nodejs/node#50650
* build: fix conflict gyp configs
nodejs/node#53605
* lib,src: drop --experimental-network-imports
nodejs/node#53822
* esm: align sync and async load implementations
nodejs/node#49152
* esm: remove unnecessary toNamespacedPath calls
nodejs/node#53656
* module: detect ESM syntax by trying to recompile as SourceTextModule
nodejs/node#52413
* test: adapt debugger tests to V8 11.4
nodejs/node#49639
* lib: update usage of always on Atomics API
nodejs/node#49639
* test: adapt test-fs-write to V8 internal changes
nodejs/node#49639
* test: adapt to new V8 trusted memory spaces
nodejs/node#50115
* deps: update libuv to 1.47.0
nodejs/node#50650
* src: use non-deprecated v8::Uint8Array::kMaxLength
nodejs/node#50115
* src: update default V8 platform to override functions with location
nodejs/node#51362
* src: add missing TryCatch
nodejs/node#51362
* lib,test: handle new Iterator global
nodejs/node#51362
* src: use non-deprecated version of CreateSyntheticModule
nodejs/node#50115
* src: remove calls to recently deprecated V8 APIs
nodejs/node#52996
* src: use new V8 API to define stream accessor
nodejs/node#53084
* src: do not use deprecated V8 API
nodejs/node#53084
* src: do not use soon-to-be-deprecated V8 API
nodejs/node#53174
* src: migrate to new V8 interceptors API
nodejs/node#52745
* src: use supported API to get stalled TLA messages
nodejs/node#51362
* module: print location of unsettled top-level await in entry points
nodejs/node#51999
* test: make snapshot comparison more flexible
nodejs/node#54375
* test: do not set concurrency on parallelized runs
nodejs/node#52177
* src: move FromNamespacedPath to path.cc
nodejs/node#53540
* test: adapt to new V8 trusted memory spaces
nodejs/node#50115
* build: add option to enable clang-cl on Windows
nodejs/node#52870
* chore: fixup patch indices
* chore: add/remove changed files
* esm: drop support for import assertions
nodejs/node#54890
* build: compile with C++20 support
nodejs/node#52838
* deps: update nghttp2 to 1.62.1
nodejs/node#52966
* src: parse inspector profiles with simdjson
nodejs/node#51783
* build: add GN build files
nodejs/node#47637
* deps,lib,src: add experimental web storage
nodejs/node#52435
* build: add missing BoringSSL dep
* src: rewrite task runner in c++
nodejs/node#52609
* fixup! build: add GN build files
* src: stop using deprecated fields of v8::FastApiCallbackOptions
nodejs/node#54077
* fix: shadow variable
* build: add back incorrectly removed SetAccessor patch
* fixup! fixup! build: add GN build files
* crypto: fix integer comparison in crypto for BoringSSL
* src,lib: reducing C++ calls of esm legacy main resolvenodejs/node#48325
* src: move more crypto_dh.cc code to ncrypto
nodejs/node#54459
* chore: fixup GN files for previous commit
* src: move more crypto code to ncrypto
nodejs/node#54320
* Fixup Perfetto ifdef guards
* fix: missing electron_natives dep
* fix: node_use_node_platform = false
* fix: include src/node_snapshot_stub.cc in libnode
* 5507047: [import-attributes] Remove support for import assertions
https://chromium-review.googlesource.com/c/v8/v8/+/5507047
* fix: restore v8-sandbox.h in filenames.json
* fix: re-add original-fs generation logic
* fix: ngtcp2 openssl dep
* test: try removing NAPI_VERSION undef
* chore(deps): bump @types/node
* src: move more crypto_dh.cc code to ncrypto
nodejs/node#54459
* esm: remove unnecessary toNamespacedPath calls
nodejs/node#53656
* buffer: fix out of range for toString
nodejs/node#54553
* lib: rewrite AsyncLocalStorage without async_hooks
nodejs/node#48528
* module: print amount of load time of a cjs module
nodejs/node#52213
* test: skip reproducible snapshot test on 32-bit
nodejs/node#53592
* fixup! src: move more crypto_dh.cc code to ncrypto
* test: adjust emittedUntil return type
* chore: remove redundant wpt streams patch
* fixup! chore(deps): bump @types/node
* fix: gn executable name on Windows
* fix: build on Windows
* fix: rename conflicting win32 symbols in //third_party/sqlite
On Windows otherwise we get:
lld-link: error: duplicate symbol: sqlite3_win32_write_debug
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:47987
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_sleep
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48042
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_is_nt
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48113
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_utf8_to_unicode
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48470
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_unicode_to_utf8
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48486
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_mbcs_to_utf8
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48502
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_mbcs_to_utf8_v2
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48518
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_utf8_to_mbcs
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48534
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
lld-link: error: duplicate symbol: sqlite3_win32_utf8_to_mbcs_v2
>>> defined at .\..\..\third_party\electron_node\deps\sqlite\sqlite3.c:48550
>>> obj/third_party/electron_node/deps/sqlite/sqlite/sqlite3.obj
>>> defined at obj/third_party/sqlite\chromium_sqlite3/sqlite3_shim.obj
* docs: remove unnecessary ts-expect-error after types bump
* src: move package resolver to c++
nodejs/node#50322
* build: set ASAN detect_container_overflow=0
nodejs/node#55584
* chore: fixup rebase
* test: disable failing ASAN test
* win: almost fix race detecting ESRCH in uv_kill
libuv/libuv#4341
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

buildIssues and PRs related to build files or the CI.metaIssues and PRs related to the general management of the project.needs-ciPRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@targos@nodejs-github-bot@StefanStojanovic@lemire@lpinca