From: nobu.nokada@... Date: 2005-02-12T08:18:07+09:00 Subject: Re: [ ruby-Patches-1486 ] have_enum_member for mkmf.rb Hi, At Sat, 12 Feb 2005 01:50:47 +0900, noreply@rubyforge.org wrote in [ruby-core:04422]: > Certain headers, such as signal.h, use enum values instead of > preprocessor constants. However, these values are not > necessarily supported across platforms. For example, the > idtype_t enum in signal.h on Solaris 9 has a P_PROJID member > that is only defined on Solaris 8 or later. > > To allow programmers to check for the presence of certain enum members, I propose a "have_enum_member" method as follows: It doesn't check enum membership -- rather, it's impossible unless parsing header files. have_enum_member('int', 'NULL', 'stdio.h') => yes Note that enum members are just const int in C, and actually it doesn't matter if it is a macro or an enum. So I think have_const is good enough. And you already can use have_type to check if a type is defined. Index: lib/mkmf.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/mkmf.rb,v retrieving revision 1.162.2.22 diff -U2 -p -r1.162.2.22 mkmf.rb --- lib/mkmf.rb 6 Feb 2005 17:03:35 -0000 1.162.2.22 +++ lib/mkmf.rb 11 Feb 2005 23:15:50 -0000 @@ -615,4 +615,21 @@ SRC end +def have_const(const, header = nil, opt = "", &b) + checking_for type do + header = cpp_include(header) + if try_compile(<<"SRC", opt, &b) +#{COMMON_HEADERS} +#{header} +/*top*/ +static int t = #{const}; +SRC + $defs.push(format("-DHAVE_CONST_%s", type.strip.upcase.tr_s("^A-Z0-9_", "_"))) + true + else + false + end + end +end + def check_sizeof(type, header = nil, &b) expr = "sizeof(#{type})" -- Nobu Nakada