Project

General

Profile

Feature #3330

Updated by mame (Yusuke Endoh) over 8 years ago

=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 
 

Back