Project

General

Profile

Bug #16651

Updated by nobu (Nobuyoshi Nakada) over 3 years ago

When mkmf.rb creates a Makefile for an extension, it will generate something that looks like this: 

 ```makefile 
 srcdir = . 
 topdir = C/MSYS64/USR/LOCAL/ruby-2.7.0/include/ruby-2.7.0 
 hdrdir = $(topdir) 
 arch_hdrdir = C:/MSYS64/USR/LOCAL/ruby-2.7.0/include/ruby-2.7.0/x64-mingw32 
 ``` 

 Notice the topdir path is c/ without the ":" Its only the topdir that does this, all other paths in the makefile use the "c:/" style. 

 mkmf.rb intentionally does that, see line 1098: 

 ```ruby 
       

       def mkintpath(path) 
         # mingw uses make from msys and it needs special care 
         # converts from C:\some\path to /C/some/path 
         path = path.dup 
         path.tr!('\\', '/') 
         path.sub!(/\A([A-Za-z]):(?=\/)/, '/\1') <-------- This line 
         path 
       end 
 ``` 

 But this is wrong, and causes errors like this (this is compiling the debase gem but it doesn't matter what c extension you use): 

 ``` 
 make: *** No rule to make target 'C/MSYS64/USR/LOCAL/ruby-2.7.0/include/ruby-2.7.0/ruby.h', needed by 'breakpoint.o'.    Stop. 
 ``` 

 The fix is simple, just delete that line. The makefile should look like this: 

 ```makefile 
 srcdir = . 
 topdir = C:/MSYS64/USR/LOCAL/ruby-2.7.0/include/ruby-2.7.0 
 hdrdir = $(topdir) 
 arch_hdrdir = C:/MSYS64/USR/LOCAL/ruby-2.7.0/include/ruby-2.7.0/x64-mingw32 
 ``` 

 Note I'm not the first person to see this, but I've just been manually fixing it over the years. Would be good to really fix it. 

 https://github.com/oneclick/rubyinstaller2/issues/105 
 https://github.com/oneclick/rubyinstaller2/issues/47 
 https://github.com/tmm1/http_parser.rb/issues/55 

 Note some of those tickets put the blame on using mingw-make versus msys make. But on my system, neither work with the "c/" style path but both work with the "c:/" style path. 

Back