Electron builder fails with: no 'object' file generated

186 views Asked by At

I have a problem with electron-builder since upgrading to Electron 10.1.2. My build now fails at rebuild for keyboard-layout. The rebuild only fails for Windows, not Mac. I don't know where to open this issue so I am asking here :).


My setup:

  • angular: 9.0.7
  • electron: 10.1.2
  • electron-builder: 22.8.x

The problem started when I updated electron from 9.0.0 to 10.1.2. Nothing else changed.


The problem:
When calling electron-builder with command electron-builder.cmd --x64 -p always -w rebuild of keyboard-layout is called as one of the steps as:

> [email protected] install C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout
> node-gyp rebuild

That fails with:

...
 win_delay_load_hook.cc
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): error C2220: warning treated as error - no 'object' file generated (compiling source file ..\src\keyboard-layout-manager-windows.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): warning C4309: 'static_cast': truncation of constant value (compiling source file ..\src\keyboard-layout-manager-windows.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): error C2220: warning treated as error - no 'object' file generated (compiling source file ..\src\keyboard-layout-manager.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): warning C4309: 'static_cast': truncation of constant value (compiling source file ..\src\keyboard-layout-manager.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    Done Building Project "C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj" (default targets) -- FAILED.
    Done Building Project "C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\binding.sln" (default targets) -- FAILED.

    Build FAILED.
...

What I have tried that DID NOT help:
Change binding.gyp in node_modules/keyboard-layout to (chnages marked with <---):

['OS=="win"', {
         "sources": [
           "src/keyboard-layout-manager-windows.cc",
         ],
         'msvs_settings': {
           'VCCLCompilerTool': {
             'ExceptionHandling': 1, # /EHsc
             'WarnAsError': 'false', # <--- I chnaged this from true to false
           },
         },
         'msvs_disabled_warnings': [
           4018,  # signed/unsigned mismatch
           2220,  # <--- I added this
           4244,  # conversion from 'type1' to 'type2', possible loss of data
           4267,  # conversion from 'size_t' to 'type', possible loss of data
           4302,  # 'type cast': truncation from 'HKL' to 'UINT'
           4311,  # 'type cast': pointer truncation from 'HKL' to 'UINT'
           4530,  # C++ exception handler used, but unwind semantics are not enabled
           4506,  # no definition for inline function
           4577,  # 'noexcept' used with no exception handling mode specified
           4996,  # function was declared deprecated
         ],
       }],  # OS=="win"

What I have tried that DID help:
Electron 10.x.y updated v8 to 8.5 (Electron 10.0.0 release notes) and looking at line that causes the error (...\.electron-gyp\10.1.2\include\node\v8.h(5378)) I see this:

 static constexpr size_t kMaxLength =
      internal::kApiSystemPointerSize == 4
          ? internal::kSmiMaxValue
          : static_cast<size_t>(uint64_t{1} << 32); <--- Line 5378

When I compare v8.h files from ...\.electron-gyp\10.1.2\include\node\v8.h and ...\.electron-gyp\9.0.0\include\node\v8.h, there is a change in this exact line.

Same line in old version:

  static constexpr size_t kMaxLength = internal::kApiSystemPointerSize == 4
                                           ? internal::kSmiMaxValue
                                           : 0xFFFFFFFF;

If I chnage static_cast<size_t>(uint64_t{1} << 32) to 0xFFFFFFFF, build succeedes.


My understanding ends here.

  1. Are the old and new lines not theoretically the same? One shifted for 32 bits results in 0xFFFFFFFF?
  2. What can I do to fix this issue and what could be the reason for this change?
  3. Why is this problem only on Windows?
1

There are 1 answers

2
jmrk On BEST ANSWER

What I have tried that DID NOT help:

'WarnAsError': 'false' should do the trick; however the error was reported for two different files (..\src\keyboard-layout-manager.cc and ..\src\keyboard-layout-manager-windows.cc) so you'd have to modify the build rules for both of them.

Disabling the warning should help too, but it'd have to be warning 4309 (not 2220) that you need to disable. Again, you'd have to do that for both files (or just for the entire compilation).

Are the old and new lines not theoretically the same? One shifted for 32 bits results in 0xFFFFFFFF?

No, 1 << 32 == 0x100000000 == 0xFFFFFFFF + 1).

What can I do to fix this issue?

  • turning off 'WarnAsError' should help
  • turning off warning 4309 should help
  • reverting that one line in your local checkout should help
  • using Clang instead of MSVC should help
  • possibly using a different (newer?) version of MSVC would also help

and what could be the reason for this change?

V8 now allows TypedArrays with up to 2**32 elements, which is one more element than before.

Why is this problem only on Windows?

Because warnings are compiler-specific, and MSVC is only used on Windows.

The weird part is that you're seeing this error in the first place. You compile with --x64; if that does what it sounds like, you should be compiling a 64-bit build, where internal::kApiSystemPointerSize == 8 and size_t has 64 bits just like uint64_t, so in the expression static_cast<size_t>(uint64_t{1} << 32); nothing gets truncated.

Even if for whatever reason this build tried to create a 32-bit build of V8, then the other branch should be taken (internal::kApiSystemPointerSize == 4) and the compiler should be smart enough not to warn about a branch that's statically dead anyway.

At any rate, this seems like a compiler bug/limitation. So appropriate workarounds are to either update your compiler, or disable the erroneous warning.