[Feature:trunk] mkmf (find|have)_cxx_header

e$B$&$C$+$je(Bruby-liste$B$KEj$2$F$7$^$C$?$-$7$b$H$G$9e(B

[ruby-list:47092]
e$B$G?6$C$F$_$?OCBj$K4X78$7$F!"$J$N$G$9$,!J%D%j!<$K$J$j$^$;$s$G$7$?$,!K!"e(B
mkmf e$B$Ke(B C++ e$B$N%X%C%@$r%A%’%C%/$9$k5!G=$rDI2C$9$k%Q%C%A$G$9!#e(B

Index: configure.in

— configure.in (revision 27940)
+++ configure.in (working copy)
@@ -243,6 +243,7 @@
fi
AC_PROG_CC
AC_PROG_CXX
+AC_PROG_CXXCPP
AC_PROG_GCC_TRADITIONAL
AC_SUBST(GCC)
if test “$GCC” = yes; then
Index: lib/mkmf.rb

— lib/mkmf.rb (revision 27940)
+++ lib/mkmf.rb (working copy)
@@ -408,6 +408,14 @@
conf)
end

+def cxxcpp_command(outfile, opt="")

  • conf = RbConfig::CONFIG.merge(‘hdrdir’ => $hdrdir.quote, ‘srcdir’ =>
    $srcdir.quote,
  •                            'arch_hdrdir' => "#$arch_hdrdir",
    
  •                            'top_srcdir' => $top_srcdir.quote)
    
  • RbConfig::expand("$(CXXCPP) #$INCFLAGS #$CPPFLAGS #$CXXFLAGS #{opt}
    #{CONFTEST_C} #{outfile}",
  •   conf)
    

+end
+
def libpathflag(libpath=$DEFLIBPATH|$LIBPATH)
libpath.map{|x|
case x
@@ -454,8 +462,15 @@
rm_f “conftest*”
end

+def try_cxxcpp(src, opt="", &b)

  • try_do(src, cxxcpp_command(CPPOUTFILE, opt), &b)
    +ensure
  • rm_f “conftest*”
    +end

class Object
alias_method :try_header, (config_string(‘try_header’) || :try_cpp)

  • alias_method :try_cxx_header, (config_string(‘try_cxx_header’) ||
    :try_cxxcpp)
    end

def cpp_include(header)
@@ -840,6 +855,24 @@
end
end

+# Returns whether or not the given C plus plus +header+ file can be
found on
+# your system. If found, a macro is passed as a preprocessor constant
to the
+# compiler using the header file name, in uppercase, prepended with
‘HAVE_’.
+#
+# For example, if have_header(‘foo.h’) returned true, then the
HAVE_FOO_H
+# preprocessor macro would be passed to the compiler.
+#
+def have_cxx_header(header, preheaders = nil, &b)

  • checking_for header do
  • if try_cxx_header(cpp_include(preheaders)+cpp_include(header), &b)
  •  $defs.push(format("-DHAVE_%s", header.tr_cpp))
    
  •  true
    
  • else
  •  false
    
  • end
  • end
    +end

Instructs mkmf to search for the given +header+ in any of the +paths+

provided, and returns whether or not it was found in those paths.

@@ -867,6 +900,33 @@
end
end

+# Instructs mkmf to search for the given C plus plus +header+ in any of
the
+# +paths+ provided, and returns whether or not it was found in those
paths.
+#
+# If the header is found then the path it was found on is added to the
list
+# of included directories that are sent to the compiler (via the -I
switch).
+#
+def find_cxx_header(header, *paths)

  • message = checking_message(header, paths)
  • header = cpp_include(header)
  • checking_for message do
  • if try_cxx_header(header)
  •  true
    
  • else
  •  found = false
    
  •  paths.each do |dir|
    
  •    opt = "-I#{dir}".quote
    
  •    if try_cxx_header(header, opt)
    
  •      $INCFLAGS << " " << opt
    
  •      found = true
    
  •      break
    
  •    end
    
  •  end
    
  •  found
    
  • end
  • end
    +end

Returns whether or not the struct of type +type+ contains +member+.

If

it does not, or the struct type can’t be found, then false is

returned. You

may optionally specify additional +headers+ in which to look for the

struct