Feature #3330
closedmkmf (find|have)_cxx_header
Description
=begin
うっかりruby-listに投げてしまったきしもとです
[ruby-list:47092] で振ってみた話題に関係して、なのですが(ツリーになりませんでしたが)、
mkmf に C++ のヘッダをチェックする機能を追加するパッチです。
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¶
=end