From: "mame (Yusuke Endoh)" Date: 2012-11-20T21:41:52+09:00 Subject: [ruby-core:49715] [ruby-trunk - Feature #4924] mkmf have_header fails with C++ headers Issue #4924 has been updated by mame (Yusuke Endoh). Target version set to next minor ---------------------------------------- Feature #4924: mkmf have_header fails with C++ headers https://bugs.ruby-lang.org/issues/4924#change-33242 Author: adgar (Michael Edgar) Status: Assigned Priority: Low Assignee: nobu (Nobuyoshi Nakada) Category: Target version: next minor =begin When a user calls (({have_header('some_cpp_header.h')})), and then header includes a line such as(({ #include })), mkmf will fail. An example run follows: + extconf.rb require 'mkmf' have_library('stdc++') have_header('BasicBlock.h') create_makefile('laser/BasicBlock') + mkmf.log have_header: checking for BasicBlock.h... -------------------- no "gcc -E -I/Users/michaeledgar/.rvm/rubies/ruby-1.9.2-head/include/ruby-1.9.1/x86_64-darwin10.7.0 -I/Users/michaeledgar/.rvm/rubies/ruby-1.9.2-head/include/ruby-1.9.1/ruby/backward -I/Users/michaeledgar/.rvm/rubies/ruby-1.9.2-head/include/ruby-1.9.1 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wshorten-64-to-32 -Wno-long-long -fno-common -pipe conftest.c -o conftest.i" In file included from conftest.c:3: ./BasicBlock.h:4:18: error: vector: No such file or directory ./BasicBlock.h:5:21: error: exception: No such file or directory ./BasicBlock.h:6:21: error: stdexcept: No such file or directory checked program was: /* begin */ 1: #include "ruby.h" 2: 3: #include /* end */ The issue here is that the temporary file created to perform the header test is ((%conftest.c%)), not ((%conftest.cc%)) or ((%conftest.cpp%)). Changing the name of the file and re-running gcc gives success. In ((%mkmf.rb%)), have_header executes cpp_command, which creates the shell command to run. However, cpp_command uses the constant (({CONFTEST_C = "conftest.c"})). It should use a new constant, (({CONFTEST_CPP = "conftest.cc"})). I've attached a patch that does this as expected. Tests pass; I'm unsure precisely how to construct a test case that would be appropriate for the Ruby trunk. There are very few guiding examples in the existing test suite. -- http://bugs.ruby-lang.org/