Bug #20904
open3.4.0-preview2: Building miniruby.exe fails for mswin32
Added by jun66j5 (Jun Omae) 12 months ago. Updated 11 months ago.
Description
I tried to build 3.4.0-preview2 with MSVC x86, however linking miniruby.exe failed with the following eror:
linking miniruby.exe
   Creating library miniruby.lib and object miniruby.exp
win32.obj : error LNK2019: unresolved external symbol _GetSystemTimePreciseAsFileTime referenced in function _clock_gettime
miniruby.exe : fatal error LNK1120: 1 unresolved externals
It doesn't fail with MSVC x64.
Investigating it, Windows 8 is required after #20563 but NTVER is still 0x0600 in win32/Makefile.sub. I think it should be 0x0602. Workaround is to invoke win32\configure.bat with --with-ntver=0x0602.
Also, adding temporarily -w24013 to WARNFLAGS in win32/Makefile.sub, the following warning is received.
compiling win32/win32.c
win32.c
win32/win32.c(4789): warning C4013: 'GetSystemTimePreciseAsFileTime' undefined; assuming extern returning int
  
        
          
          Updated by nobu (Nobuyoshi Nakada) 12 months ago
          
          
        
        
          
            Actions
          
          #1
            [ruby-core:119997]
        
      
      - Status changed from Open to Feedback
 
jun66j5 (Jun Omae) wrote:
Investigating it, Windows 8 is required after #20563 but
NTVERis still0x0600inwin32/Makefile.sub. I think it should be0x0602. Workaround is to invokewin32\configure.batwith--with-ntver=0x0602.
Thank you, fixed it by 80cfa57234255667a86d46096093099349a7262a.
Also, adding temporarily
-w24013toWARNFLAGSinwin32/Makefile.sub, the following warning is received.compiling win32/win32.c win32.c win32/win32.c(4789): warning C4013: 'GetSystemTimePreciseAsFileTime' undefined; assuming extern returning int
I can't reproduce it with:
- Visual Studio 2022 Developer Command Prompt v17.12.0
 - Windows 11 SDK Version 10.0.26100.0
 - Windows 11 [Version 10.0.26100.2314]
 
        
          
          Updated by nobu (Nobuyoshi Nakada) 12 months ago
          
          
        
        
          
            Actions
          
          #2
        
      
      - Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN to 3.1: DONTNEED, 3.2: DONTNEED, 3.3: DONTNEED
 
        
          
          Updated by jun66j5 (Jun Omae) 11 months ago
          
          
        
        
          
            Actions
          
          #3
            [ruby-core:119999]
        
      
      nobu (Nobuyoshi Nakada) wrote in #note-1:
jun66j5 (Jun Omae) wrote:
Investigating it, Windows 8 is required after #20563 but
NTVERis still0x0600inwin32/Makefile.sub. I think it should be0x0602. Workaround is to invokewin32\configure.batwith--with-ntver=0x0602.Thank you, fixed it by 80cfa57234255667a86d46096093099349a7262a.
Thanks for the fix!
Also, adding temporarily
-w24013toWARNFLAGSinwin32/Makefile.sub, the following warning is received.compiling win32/win32.c win32.c win32/win32.c(4789): warning C4013: 'GetSystemTimePreciseAsFileTime' undefined; assuming extern returning intI can't reproduce it with:
- Visual Studio 2022 Developer Command Prompt v17.12.0
 - Windows 11 SDK Version 10.0.26100.0
 - Windows 11 [Version 10.0.26100.2314]
 
Weird. I get the warning on the following environments:
- Windows Server 2022 (10.0.20348) on GitHub Actions
- Visual Studio 2022 Developer Command Prompt v17.12.0
 - Windows SDK: 10.0.26100.0
 - See:
 
 - Windows 10 22H2
- Visual Studio 2022 Developer Command Prompt v17.12.1
 - Windows SDK: 10.0.20348.0
 
 
I noticed C4013 warnings for _finitef only for x86 by adding -w24013 flag at https://github.com/jun66j5/ruby-build/actions/runs/11993783074/job/33435109634#step:4:580:
D:\a\ruby-build\ruby-build\ruby-3.4.0-preview2\vm_insnhelper.c(6432): warning C4013: '_finitef' undefined; assuming extern returning int
prism/static_literals.c(504): warning C4013: '_finitef' undefined; assuming extern returning int
prism/prism.c(4153): warning C4013: '_finitef' undefined; assuming extern returning int
Checking ucrt/corecrt_math.h, the _finitef seems to be available for x64 but not x86.
        
          
          Updated by nobu (Nobuyoshi Nakada) 11 months ago
          
          
        
        
          
            Actions
          
          #4
            [ruby-core:120065]
        
      
      jun66j5 (Jun Omae) wrote in #note-3:
Weird. I get the warning on the following environments:
- Windows Server 2022 (10.0.20348) on GitHub Actions
 
- Visual Studio 2022 Developer Command Prompt v17.12.0
 - Windows SDK: 10.0.26100.0
 - See:
 - Windows 10 22H2
 
- Visual Studio 2022 Developer Command Prompt v17.12.1
 - Windows SDK: 10.0.20348.0
 
Weird.
Can you reproduce it locally?
If so, what is shown by nmake process.i && findstr "GetSystemTime" process.i?
I noticed C4013 warnings for
_finitefonly for x86 by adding -w24013 flag at https://github.com/jun66j5/ruby-build/actions/runs/11993783074/job/33435109634#step:4:580:D:\a\ruby-build\ruby-build\ruby-3.4.0-preview2\vm_insnhelper.c(6432): warning C4013: '_finitef' undefined; assuming extern returning int prism/static_literals.c(504): warning C4013: '_finitef' undefined; assuming extern returning int prism/prism.c(4153): warning C4013: '_finitef' undefined; assuming extern returning intChecking ucrt/corecrt_math.h, the
_finitefseems to be available for x64 but not x86.
It is because https://github.com/ruby/prism/commit/4267161ca7.
The latest MSVC seems to define isinf as a macro using fpclassify, and both seem conform to POSIX and C99.
Older versions of MSVC did not full-support C99, so isinf might not support float argument.
@kddnewton (Kevin Newton), for what version of MSVC is this needed?
        
          
          Updated by nobu (Nobuyoshi Nakada) 11 months ago
          
          ยท Edited
        
        
          
            Actions
          
          #5
            [ruby-core:120066]
        
      
      _finitef is stated as x64 and ARM/ARM64 only, in https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/finite-finitef?view=msvc-170#syntax
int _finitef(
   float x
); /* x64 and ARM/ARM64 only */
        
          
          Updated by nobu (Nobuyoshi Nakada) 11 months ago
          
          
        
        
          
            Actions
          
          #6
        
      
      - Status changed from Feedback to Open
 
        
          
          Updated by kddnewton (Kevin Newton) 11 months ago
          
          
        
        
          
            Actions
          
          #7
            [ruby-core:120077]
        
      
      The Prism portion should be fixed by https://github.com/ruby/prism/pull/3270.
        
          
          Updated by nobu (Nobuyoshi Nakada) 11 months ago
          
          
        
        
          
            Actions
          
          #8
            [ruby-core:120084]
        
      
      kddnewton (Kevin Newton) wrote in #note-7:
The Prism portion should be fixed by https://github.com/ruby/prism/pull/3270.
Does Prism support older than VS 2015 that is the minimum version for ruby 3.4?
VS 2015 at least supports the generic isinf macro:
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/isinf?view=msvc-140
        
          
          Updated by jun66j5 (Jun Omae) 11 months ago
          
          
        
        
          
            Actions
          
          #9
            [ruby-core:120112]
        
      
      nobu (Nobuyoshi Nakada) wrote in #note-4:
Weird.
Can you reproduce it locally?
If so, what is shown bynmake process.i && findstr "GetSystemTime" process.i?
Yes. Reproduced locally.
C:\usr\src\x86\ruby-3.4.0-preview2>nmake process.i
Microsoft (R) Program Maintenance Utility Version 14.42.34433.0
Copyright (C) Microsoft Corporation.  All rights reserved.
Could Not Find C:\usr\src\x86\ruby-3.4.0-preview2\baseruby.mk
preprocessing process.c
process.c
C:\usr\src\x86\ruby-3.4.0-preview2>findstr "GetSystemTime" process.i
GetSystemTimes(
GetSystemTime(
GetSystemTimeAsFileTime(
GetSystemTimeAdjustment(
GetSystemTimeAdjustmentPrecise(
timeGetSystemTime(
        
          
          Updated by nobu (Nobuyoshi Nakada) 11 months ago
          
          
        
        
          
            Actions
          
          #10
            [ruby-core:120163]
        
      
      
    
        
          
          Updated by jun66j5 (Jun Omae) 11 months ago
          
          
        
        
          
            Actions
          
          #11
            [ruby-core:120169]
        
      
      nobu (Nobuyoshi Nakada) wrote in #note-10:
Try
win32/win32.iinstead ofprocess.i.
Okay.
C:\usr\src\x86\ruby-3.4.0-preview2>findstr "GetSystemTime" win32\win32.i
GetSystemTimes(
GetSystemTime(
GetSystemTimeAsFileTime(
GetSystemTimeAdjustment(
GetSystemTimeAdjustmentPrecise(
timeGetSystemTime(
    GetSystemTimePreciseAsFileTime(&ft);
            GetSystemTimePreciseAsFileTime(&ft);
        GetSystemTimePreciseAsFileTime(&atime);
If running .\win32\configure.bat with --with-ntver=0x0602:
C:\usr\src\x86\ruby-3.4.0-preview2>findstr "GetSystemTime" win32\win32.i
GetSystemTimes(
GetSystemTime(
GetSystemTimeAsFileTime(
GetSystemTimeAdjustment(
GetSystemTimeAdjustmentPrecise(
GetSystemTimePreciseAsFileTime(
timeGetSystemTime(
    GetSystemTimePreciseAsFileTime(&ft);
            GetSystemTimePreciseAsFileTime(&ft);
        GetSystemTimePreciseAsFileTime(&atime);
        
          
          Updated by nobu (Nobuyoshi Nakada) 11 months ago
          
          
        
        
          
            Actions
          
          #12
            [ruby-core:120171]
        
      
      jun66j5 (Jun Omae) wrote in #note-11:
nobu (Nobuyoshi Nakada) wrote in #note-10:
Try
win32/win32.iinstead ofprocess.i.Okay.
Thank you.
If running
.\win32\configure.batwith--with-ntver=0x0602:C:\usr\src\x86\ruby-3.4.0-preview2>findstr "GetSystemTime" win32\win32.i GetSystemTimes( GetSystemTime( GetSystemTimeAsFileTime( GetSystemTimeAdjustment( GetSystemTimeAdjustmentPrecise( GetSystemTimePreciseAsFileTime( timeGetSystemTime( GetSystemTimePreciseAsFileTime(&ft); GetSystemTimePreciseAsFileTime(&ft); GetSystemTimePreciseAsFileTime(&atime);
This is the expected result, and it is the default now.
It seems I misread and thought that the warning would have been issued even if that option was given.
Could you try the latest snapshot (or master branch)?