sparklemotion / sqlite3-ruby

Ruby bindings for the SQLite3 embedded database
https://github.com/sparklemotion/sqlite3-ruby/
BSD 3-Clause "New" or "Revised" License
768 stars 200 forks source link

Miniportile2 recipe.host is nil on windows in extconf.rb #506

Open jmarrec opened 8 months ago

jmarrec commented 8 months ago

It throws on this line as a result

https://github.com/sparklemotion/sqlite3-ruby/blob/16470dedb21c3054807ed70847f5ab99d333ff19/ext/sqlite3/extconf.rb#L70

I do use a mswin built of ruby (ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x64-mswin64_140]) in this specific case, but I can reproduce using 2.7.2 mingw.

Miniportile2 uses the output of running gcc -v to detect the host, and obviously this fails in this case.

https://github.com/flavorjones/mini_portile/blob/52fb0bc41c89a10f1ac7b5abcf0157e059194374/lib/mini_portile2/mini_portile.rb#L542-L557

I am able to work around it by using the same code as nokogiri: https://github.com/sparklemotion/nokogiri/blob/d7ee3b683246a9fdc19c51aabc98868dc8dcf134/ext/nokogiri/extconf.rb#L443-L446

    # We use 'host' to set compiler prefix for cross-compiling. Prefer host_alias over host. And
    # prefer i686 (what external dev tools use) to i386 (what ruby's configure.ac emits).
    recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"]
    recipe.host = recipe.host.gsub("i386", "i686")
flavorjones commented 8 months ago

@jmarrec Sorry you're having problems.

Miniportile's gcc_cmd in your case isn't actually gcc, it's your compiler:

  def gcc_cmd
    (ENV["CC"] || @gcc_command || RbConfig::CONFIG["CC"] || "gcc").dup
  end

What does your compiler emit when given a -v option? Can you recommend something as an alternative to detect the host string?

jmarrec commented 8 months ago

@flavorjones I appreciate the quick answer, thank you.

Note that I've worked around it already by using --enable-system-libraries --with-pkg-config=pkgconf (I have pkgconf in my PATH and I've set PKG_CONFIG_PATH to a location where I do have sqlite3.pc) so it doesn't use miniportile2 at all.

$ ruby -e "puts RbConfig::CONFIG['CC']"
cl -nologo

$ cl -nologo -v 
cl : Command line warning D9002 : ignoring unknown option '-v'
cl : Command line error D8003 : missing source filename

# Whereas
$ cl -v 
Microsoft (R) C/C++ Optimizing Compiler Version 19.38.33135 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

cl : Command line warning D9002 : ignoring unknown option '-v'
cl : Command line error D8003 : missing source filename

(cl is C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.3310\bin\Hostx64\x64\cl.exe)

jmarrec commented 8 months ago
$ ruby -e "puts RbConfig::CONFIG['host_alias']"
x64-mswin64_140
$ ruby -e "puts RbConfig::CONFIG['host']"
x64-pc-mswin64_140