Project

General

Profile

Bug #17578

mkmf experimental C++ Support

Added by cfis (Charlie Savage) about 1 month ago. Updated about 1 month ago.

Status:
Assigned
Priority:
Normal
Target version:
-
ruby -v:
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]
[ruby-core:102230]

Description

I've been working on the Rice gem (https://github.com/jasonroelofs/rice) that wraps C++ code for use in Ruby.

I noticed that some c++ support was added to mkmf for Ruby 2.7. However, if I try to use it find a header it fails to work. For example:

find_header('rice.hpp')

The reason is the conftest uses gcc -E instead of g++ -E. To fix that requires overlading the cpp_command to support C++.

This the fix I have put in that works:

MakeMakefile['C++'].module_eval do
  def cpp_command(outfile, opt="")
    conf = cc_config(opt)
    if $universal and (arch_flag = conf['ARCH_FLAG']) and !arch_flag.empty?
      conf['ARCH_FLAG'] = arch_flag.gsub(/(?:\G|\s)-arch\s+\S+/, '')
    end
    RbConfig::expand("$(CXX) -E #$INCFLAGS #$CPPFLAGS #$CFLAGS #{opt} #{CONFTEST_CXX} #{outfile}",
                     conf)
  end
end

The two changes over the default method are:

$(CC) -> $(CXX) -E
#{CONFTEST_c} -> #{CONFTEST_cxx}

Could this change be merged in? I can provide a patch file if you would like.

Last, it wasn't obvious to me how to activate the C++ support in mkfm. I ended up doing this:

include MakeMakefile['C++']

Is that correct?

Updated by shyouhei (Shyouhei Urabe) about 1 month ago

  • Assignee set to nobu (Nobuyoshi Nakada)
  • Status changed from Open to Assigned
  • Description updated (diff)

I guess recent 4b6fd8329b46701414aba2eeca10013cf66ec513 has something to do with it. cfis (Charlie Savage) Can you try the current master? If that fixes your situation I guess we need to backport.

The canonical usage of MakeMakefile['C++'] is not clear to me either... We need nobu (Nobuyoshi Nakada)'s document.

Updated by cfis (Charlie Savage) about 1 month ago

Thanks for the quick response.

I think that is different. try_cpp calls cpp_command:

  def try_cpp(src, opt="", *opts, &b)
    try_do(src, cpp_command(CPPOUTFILE, opt), *opts, &b)
   ...
  end

And cpp_command is the function that needs to be overridden.

Updated by shyouhei (Shyouhei Urabe) about 1 month ago

Yes try_cpp is still a problem. I guess find_header does not use try_cpp though.

nobu (Nobuyoshi Nakada) What do you think? It seems the problem exists and we need to take care.

Updated by cfis (Charlie Savage) about 1 month ago

Just to be clear:

find_header calls try_header
try_header is an alias to try_cpp.
And try_cpp calls cpp_command.

Updated by shyouhei (Shyouhei Urabe) about 1 month ago

cfis (Charlie Savage) wrote in #note-4:

Just to be clear:

find_header calls try_header
try_header is an alias to try_cpp.
And try_cpp calls cpp_command.

Yes, true for 2.7. The commit I mentioned before is basically changing try_header's backend from try_cpp to try_compile.

Also available in: Atom PDF