From: cfis@... Date: 2021-02-06T08:27:03+00:00 Subject: [ruby-core:102408] [Ruby master Bug#16651] Extensions Do Not Compile on Mingw64 Issue #16651 has been updated by cfis (Charlie Savage). Sorry, missed your comment. This is still wrong in Ruby 3.0.0 and causes building extensions to fail. Note the comment in this method: ```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') path end ``` The problem is /C/ does not work. When you try to compile an extension with mingw64/msys, you get this error message: ```bash * No rule to make target '/C/msys64/usr/local/ruby-3.0.0/include/ruby-3.0.0/ruby.h', needed by 'breakpoint.o'. Stop. ``` If you comment out this line: ```ruby #path.sub!(/\A([A-Za-z]):(?=\/)/, '/\1') ``` Then the paths becomes: C:/msys64/usr/local/ruby-3.0.0/include/ruby-3.0.0/ruby.h And the problem is fixed. ---------------------------------------- Bug #16651: Extensions Do Not Compile on Mingw64 https://bugs.ruby-lang.org/issues/16651#change-90281 * Author: cfis (Charlie Savage) * Status: Open * Priority: Normal * ruby -v: ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x64-mingw32] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- When mkmf.rb creates a Makefile for an extension, it will generate something that looks like this: 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: 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: 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. -- https://bugs.ruby-lang.org/ Unsubscribe: