From: "Berger, Daniel" Date: 2005-01-18T02:27:39+09:00 Subject: What do when when T_DATA is redefined? Hi all, Ruby 1.8.2 Solaris 9 gcc 3.4.2 I'm having a T_DATA conflict with a Solaris extension that I'm trying to write. The problem stems from the nfs/nfs.h, which is in turn doing an include on tiuser.h which in turn does an include on sys/tiuser.h. It's this last file, sys/tiuser.h, that does a "#define T_DATA 0x004" and is causing the problem. I have no choice but to include nfs/nfs.h, otherwise I can't see struct mntinfo, which I need for this particular extension that I'm writing. Moving the '#include "ruby.h"' to the bottom of the #include's is not an ideal solution either, since that means I'm redefining a value that nfs.h may be using. Below are the rkstat.c, extconf.rb and test.rb files that demonstrate the problem. Below I have included two sample outputs, one from test.rb and one from the 'make' command results. /* rkstat.c */ #include "ruby.h" /* Try putting this later, too */ #include #include #include struct kstruct{ kstat_ctl_t* kc; kstat_t* ksp; }; typedef struct kstruct KS; static void ks_free(KS* kptr){ if(kptr->kc != NULL){ kstat_close(kptr->kc); } free(kptr); } /* Class Methods */ static VALUE ks_allocate(VALUE klass){ KS* kptr; return Data_Make_Struct(klass,KS,0,ks_free,kptr); } /* Instance Methods */ static VALUE ks_init(int argc, VALUE* argv, VALUE self){ KS* kptr; VALUE rbModule,rbInstance,rbName; Data_Get_Struct(self,KS,kptr); rb_scan_args(argc,argv,"03",&rbModule,&rbInstance,&rbName); return self; } void Init_kstat(){ VALUE mSolaris, cKstat; /* Modules and Classes */ mSolaris = rb_define_module("Solaris"); cKstat = rb_define_class_under(mSolaris,"Kstat",rb_cObject); /* Class Methods */ rb_define_alloc_func(cKstat,ks_allocate); /* Instance Methods */ rb_define_method(cKstat,"initialize",ks_init,-1); } # extconf.rb require "mkmf" have_library("kstat") create_makefile("solaris/kstat") # test.rb require "solaris/kstat" include Solaris k = Kstat.new p k # Output from test.rb with ruby.h as first include # Note that there were no warnings during 'make', even with -Wall: 'initialize': wrong argument type Solaris::Kstat (expected iClass) (TypeError) # Output during make phase with ruby.h as last include # Note that test.rb will run as expected, but this warning makes me very nervous: djberge@sp5wd-b1-/home/djberge/local/modules/ruby/solaris-kstat-0.2.0-61 0>make gcc -Wall -mcpu=ultrasparc -fno-strict-aliasing -fPIC -g -O2 -I. -I/opt/lib/ruby/1.8/sparc-solaris2.9 -I/opt/lib/ruby/1.8/sparc-solaris2.9 -I. -c rkstat.c In file included from rkstat.c:4: /opt/lib/ruby/1.8/sparc-solaris2.9/ruby.h:198:1: warning: "T_DATA" redefined In file included from /usr/include/tiuser.h:17, from /usr/include/rpc/rpc.h:22, from /usr/include/rpc/rpc_sztypes.h:9, from /usr/include/nfs/nfs.h:49, from rkstat.c:2: /usr/include/sys/tiuser.h:30:1: warning: this is the location of the previous definition gcc -Wall -mcpu=ultrasparc -fno-strict-aliasing -Wl,-G -L"/opt/lib" -o kstat.so rkstat.o -lkstat -ldl -lm -lc What is the ideal solution here? Regards, Dan