Added CROSS_COMPILING flag to rbconfig.
[rbx.git] / rakelib / platform.rake
blob5f76f82a2635e5ecf12afb4608c8e69d05f76dfb
1 file 'runtime/platform.conf' => %w[Rakefile rakelib/platform.rake rakelib/struct_generator.rb] do |task|
2   addrinfo = StructGenerator.new
3   addrinfo.include 'sys/socket.h'
4   addrinfo.include 'netdb.h'
5   addrinfo.name 'struct addrinfo'
6   addrinfo.field :ai_flags, :int
7   addrinfo.field :ai_family, :int
8   addrinfo.field :ai_socktype, :int
9   addrinfo.field :ai_protocol, :int
10   addrinfo.field :ai_addrlen, :int
11   addrinfo.field :ai_addr, :pointer
12   addrinfo.field :ai_canonname, :string
13   addrinfo.field :ai_next, :pointer
14   addrinfo.calculate
16   dirent = StructGenerator.new
17   dirent.include "sys/types.h"
18   dirent.include "dirent.h"
19   dirent.name 'struct dirent'
20   dirent.field :d_ino, :ino_t
21   dirent.field :d_reclen, :ushort
22   dirent.field :d_name, :char_array
23   dirent.calculate
25   timeval = StructGenerator.new
26   timeval.include "sys/time.h"
27   timeval.name 'struct timeval'
28   timeval.field :tv_sec, :time_t
29   timeval.field :tv_usec, :suseconds_t
30   timeval.calculate
32   sockaddr_in = StructGenerator.new
33   sockaddr_in.include "netinet/in.h"
34   sockaddr_in.include "fcntl.h"
35   sockaddr_in.include "sys/socket.h"
36   sockaddr_in.include "sys/stat.h"
37   sockaddr_in.name 'struct sockaddr_in'
38   sockaddr_in.field :sin_family, :sa_family_t
39   sockaddr_in.field :sin_port, :ushort
40   sockaddr_in.field :sin_addr
41   sockaddr_in.field :sin_zero, :char_array
42   sockaddr_in.calculate
44   sockaddr_un = StructGenerator.new
45   sockaddr_un.include "sys/un.h"
46   sockaddr_un.name 'struct sockaddr_un'
47   sockaddr_un.field :sun_family, :sa_family_t
48   sockaddr_un.field :sun_path, :char_array
49   sockaddr_un.calculate
51   servent = StructGenerator.new
52   servent.include "netdb.h"
53   servent.name 'struct servent'
54   servent.field :s_name, :pointer
55   servent.field :s_aliases, :pointer
56   servent.field :s_port, :int
57   servent.field :s_proto, :pointer
58   servent.calculate
59   
60   stat = StructGenerator.new
61   stat.include "sys/types.h"
62   stat.include "sys/stat.h"
63   stat.name 'struct stat'
64   stat.field :st_dev, :dev_t
65   stat.field :st_ino, :ino_t
66   stat.field :st_mode, :mode_t
67   stat.field :st_nlink, :nlink_t
68   stat.field :st_uid, :uid_t
69   stat.field :st_gid, :gid_t
70   stat.field :st_rdev, :dev_t
71   stat.field :st_size, :off_t
72   stat.field :st_blksize
73   stat.field :st_blocks
74   stat.field :st_atime, :time_t
75   stat.field :st_mtime, :time_t
76   stat.field :st_ctime, :time_t
77   stat.calculate
78   
79   rlimit = StructGenerator.new
80   rlimit.include "sys/types.h"
81   rlimit.include "sys/time.h"
82   rlimit.include "sys/resource.h"
83   rlimit.name 'struct rlimit'
84   rlimit.field :rlim_cur, :rlim_t
85   rlimit.field :rlim_max, :rlim_t
86   rlimit.calculate
88   evp_md = StructGenerator.new
89   evp_md.include "openssl/ossl_typ.h"
90   evp_md.include "openssl/evp.h"
91   evp_md.name 'struct env_md_st'
92   evp_md.field  :type, :int
93   evp_md.field  :pkey_type, :int
94   evp_md.field  :md_size, :int
95   evp_md.field  :flags, :ulong
96   evp_md.field  :init, :pointer
97   evp_md.field  :update, :pointer
98   evp_md.field  :final, :pointer
99   evp_md.field  :copy, :pointer
100   evp_md.field  :cleanup, :pointer
101   evp_md.field  :sign, :pointer
102   evp_md.field  :verify, :pointer
103   # int required_pkey[5] goes here but we don't care
104   evp_md.field  :block_size, :int
105   evp_md.field  :ctx_size, :int
106   evp_md.calculate
108   evp_md_ctx = StructGenerator.new
109   evp_md_ctx.include "openssl/ossl_typ.h"
110   evp_md_ctx.include "openssl/evp.h"
111   evp_md_ctx.name 'struct env_md_ctx_st'
112   evp_md_ctx.field :digest, :pointer
113   evp_md_ctx.field :engine, :pointer
114   evp_md_ctx.field :flags, :ulong
115   evp_md_ctx.field :md_data, :pointer
116   evp_md_ctx.calculate
117   
118   # FIXME these constants don't have standard names.
119   # LOCK_SH == Linux, O_SHLOCK on Bsd/Darwin, etc.
120   # Binary doesn't exist at all in many non-Unix variants.
121   # This should come out of something like config.h
122   fixme_constants = %w{
123     LOCK_SH
124     LOCK_EX
125     LOCK_NB
126     LOCK_UN
127     BINARY
128   }
129   
130   syslog_constants = %w{
131     LOG_PID
132     LOG_EMERG
133     LOG_ALERT
134     LOG_ERR
135     LOG_CRIT
136     LOG_WARNING
137     LOG_NOTICE
138     LOG_INFO
139     LOG_DEBUG
140     LOG_CONS
141     LOG_ODELAY
142     LOG_NODELAY
143     LOG_NOWAIT
144     LOG_PERROR
145     LOG_AUTH
146     LOG_AUTHPRIV
147     LOG_CONSOLE
148     LOG_CRON
149     LOG_DAEMON
150     LOG_FTP
151     LOG_KERN
152     LOG_LPR
153     LOG_MAIL
154     LOG_NEWS
155     LOG_NTP
156     LOG_SECURITY
157     LOG_SYSLOG
158     LOG_USER
159     LOG_UUCP
160     LOG_LOCAL0
161     LOG_LOCAL1
162     LOG_LOCAL2
163     LOG_LOCAL3
164     LOG_LOCAL4
165     LOG_LOCAL5
166     LOG_LOCAL6
167     LOG_LOCAL7
168   }
170   file_constants = %w{
171     O_RDONLY
172     O_WRONLY
173     O_RDWR
174     O_CREAT
175     O_EXCL
176     O_NOCTTY
177     O_TRUNC
178     O_APPEND
179     O_NONBLOCK
180     O_SYNC
181     S_IRUSR
182     S_IWUSR
183     S_IXUSR
184     S_IRGRP
185     S_IWGRP
186     S_IXGRP
187     S_IROTH
188     S_IWOTH
189     S_IXOTH
190     S_IFMT
191     S_IFIFO
192     S_IFCHR
193     S_IFDIR
194     S_IFBLK
195     S_IFREG
196     S_IFLNK
197     S_IFSOCK
198     S_IFWHT
199     S_ISUID
200     S_ISGID
201   }
203   io_constants = %w{
204     SEEK_SET
205     SEEK_CUR
206     SEEK_END
207   }
209   fcntl_constants = %w{
210     F_DUPFD
211     F_GETFD
212     F_GETLK
213     F_SETFD
214     F_GETFL
215     F_SETFL
216     F_SETLK
217     F_SETLKW
218     FD_CLOEXEC
219     F_RDLCK
220     F_UNLCK
221     F_WRLCK
222     O_CREAT
223     O_EXCL
224     O_NOCTTY
225     O_TRUNC
226     O_APPEND
227     O_NONBLOCK
228     O_NDELAY
229     O_RDONLY
230     O_RDWR
231     O_WRONLY
232     O_ACCMODE
233   }
235   socket_constants = %w[
236     AF_APPLETALK
237     AF_ATM
238     AF_AX25
239     AF_CCITT
240     AF_CHAOS
241     AF_CNT
242     AF_COIP
243     AF_DATAKIT
244     AF_DEC
245     AF_DLI
246     AF_E164
247     AF_ECMA
248     AF_HYLINK
249     AF_IMPLINK
250     AF_INET
251     AF_INET6
252     AF_IPX
253     AF_ISDN
254     AF_ISO
255     AF_LAT
256     AF_LINK
257     AF_LOCAL
258     AF_MAX
259     AF_NATM
260     AF_NDRV
261     AF_NETBIOS
262     AF_NETGRAPH
263     AF_NS
264     AF_OSI
265     AF_PPP
266     AF_PUP
267     AF_ROUTE
268     AF_SIP
269     AF_SNA
270     AF_SYSTEM
271     AF_UNIX
272     AF_UNSPEC
274     AI_ADDRCONFIG
275     AI_ALL
276     AI_CANONNAME
277     AI_DEFAULT
278     AI_MASK
279     AI_NUMERICHOST
280     AI_PASSIVE
281     AI_V4MAPPED
282     AI_V4MAPPED_CFG
284     EAI_ADDRFAMILY
285     EAI_AGAIN
286     EAI_BADFLAGS
287     EAI_BADHINTS
288     EAI_FAIL
289     EAI_FAMILY
290     EAI_MAX
291     EAI_MEMORY
292     EAI_NODATA
293     EAI_NONAME
294     EAI_PROTOCOL
295     EAI_SERVICE
296     EAI_SOCKTYPE
297     EAI_SYSTEM
299     INADDR_ALLHOSTS_GROUP
300     INADDR_ANY
301     INADDR_BROADCAST
302     INADDR_LOOPBACK
303     INADDR_MAX_LOCAL_GROUP
304     INADDR_NONE
305     INADDR_UNSPEC_GROUP
307     IPPORT_RESERVED
308     IPPORT_USERRESERVED
310     IPPROTO_BIP
311     IPPROTO_EGP
312     IPPROTO_EON
313     IPPROTO_GGP
314     IPPROTO_HELLO
315     IPPROTO_ICMP
316     IPPROTO_IDP
317     IPPROTO_IGMP
318     IPPROTO_IP
319     IPPROTO_MAX
320     IPPROTO_ND
321     IPPROTO_PUP
322     IPPROTO_RAW
323     IPPROTO_TCP
324     IPPROTO_TP
325     IPPROTO_UDP
326     IPPROTO_XTP
328     IPX_TYPE
330     IP_ADD_MEMBERSHIP
331     IP_DEFAULT_MULTICAST_LOOP
332     IP_DEFAULT_MULTICAST_TTL
333     IP_DROP_MEMBERSHIP
334     IP_HDRINCL
335     IP_MAX_MEMBERSHIPS
336     IP_MULTICAST_IF
337     IP_MULTICAST_LOOP
338     IP_MULTICAST_TTL
339     IP_OPTIONS
340     IP_RECVDSTADDR
341     IP_RECVOPTS
342     IP_RECVRETOPTS
343     IP_RETOPTS
344     IP_TOS
345     IP_TTL
347     MSG_COMPAT
348     MSG_CTRUNC
349     MSG_DONTROUTE
350     MSG_DONTWAIT
351     MSG_EOF
352     MSG_EOR
353     MSG_FLUSH
354     MSG_HAVEMORE
355     MSG_HOLD
356     MSG_OOB
357     MSG_PEEK
358     MSG_RCVMORE
359     MSG_SEND
360     MSG_TRUNC
361     MSG_WAITALL
363     NI_DGRAM
364     NI_MAXHOST
365     NI_MAXSERV
366     NI_NAMEREQD
367     NI_NOFQDN
368     NI_NUMERICHOST
369     NI_NUMERICSERV
371     PF_APPLETALK
372     PF_AX25
373     PF_CCITT
374     PF_CHAOS
375     PF_CNT
376     PF_COIP
377     PF_DATAKIT
378     PF_DLI
379     PF_ECMA
380     PF_HYLINK
381     PF_IMPLINK
382     PF_INET
383     PF_INET6
384     PF_IPX
385     PF_ISDN
386     PF_ISO
387     PF_KEY
388     PF_LAT
389     PF_LINK
390     PF_LOCAL
391     PF_MAX
392     PF_NATM
393     PF_NDRV
394     PF_NETBIOS
395     PF_NETGRAPH
396     PF_NS
397     PF_OSI
398     PF_PIP
399     PF_PPP
400     PF_PUP
401     PF_ROUTE
402     PF_RTIP
403     PF_SIP
404     PF_SNA
405     PF_SYSTEM
406     PF_UNIX
407     PF_UNSPEC
408     PF_XTP
410     SHUT_RD
411     SHUT_RDWR
412     SHUT_WR
414     SOCK_DGRAM
415     SOCK_PACKET
416     SOCK_RAW
417     SOCK_RDM
418     SOCK_SEQPACKET
419     SOCK_STREAM
421     SOL_ATALK
422     SOL_AX25
423     SOL_IP
424     SOL_IPX
425     SOL_SOCKET
426     SOL_TCP
427     SOL_UDP
429     SOPRI_BACKGROUND
430     SOPRI_INTERACTIVE
431     SOPRI_NORMAL
433     SO_ACCEPTCONN
434     SO_ACCEPTFILTER
435     SO_ATTACH_FILTER
436     SO_BINDTODEVICE
437     SO_BROADCAST
438     SO_DEBUG
439     SO_DETACH_FILTER
440     SO_DONTROUTE
441     SO_DONTTRUNC
442     SO_ERROR
443     SO_KEEPALIVE
444     SO_LINGER
445     SO_NKE
446     SO_NOSIGPIPE
447     SO_NO_CHECK
448     SO_NREAD
449     SO_OOBINLINE
450     SO_PASSCRED
451     SO_PEERCRED
452     SO_PEERNAME
453     SO_PRIORITY
454     SO_RCVBUF
455     SO_RCVLOWAT
456     SO_RCVTIMEO
457     SO_REUSEADDR
458     SO_REUSEPORT
459     SO_SECURITY_AUTHENTICATION
460     SO_SECURITY_ENCRYPTION_NETWORK
461     SO_SECURITY_ENCRYPTION_TRANSPORT
462     SO_SNDBUF
463     SO_SNDLOWAT
464     SO_SNDTIMEO
465     SO_TIMESTAMP
466     SO_TYPE
467     SO_USELOOPBACK
468     SO_WANTMORE
469     SO_WANTOOBFLAG
471     TCP_MAXSEG
472     TCP_NODELAY
473   ]
475   process_constants = %w{
476     WNOHANG
477     WUNTRACED
478     PRIO_PROCESS
479     PRIO_PGRP
480     PRIO_USER
481     RLIMIT_CPU
482     RLIMIT_FSIZE
483     RLIMIT_DATA
484     RLIMIT_STACK
485     RLIMIT_CORE
486     RLIMIT_RSS
487     RLIMIT_NPROC
488     RLIMIT_NOFILE
489     RLIMIT_MEMLOCK
490     RLIMIT_AS
491     RLIMIT_SBSIZE
492   }
494   long_process_constants = %w{
495     RLIM_INFINITY
496     RLIM_SAVED_MAX
497     RLIM_SAVED_CUR
498   }
500   # The constants come from MRI's signal.c. This means that some of them might
501   # be missing.
502   signal_constants = %w{
503     SIGHUP
504     SIGINT
505     SIGQUIT
506     SIGILL
507     SIGTRAP
508     SIGIOT
509     SIGABRT
510     SIGEMT
511     SIGFPE
512     SIGKILL
513     SIGBUS
514     SIGSEGV
515     SIGSYS
516     SIGPIPE
517     SIGALRM
518     SIGTERM
519     SIGURG
520     SIGSTOP
521     SIGTSTP
522     SIGCONT
523     SIGCHLD
524     SIGCLD
525     SIGCHLD
526     SIGTTIN
527     SIGTTOU
528     SIGIO
529     SIGXCPU
530     SIGXFSZ
531     SIGVTALRM
532     SIGPROF
533     SIGWINCH
534     SIGUSR1
535     SIGUSR2
536     SIGLOST
537     SIGMSG
538     SIGPWR
539     SIGPOLL
540     SIGDANGER
541     SIGMIGRATE
542     SIGPRE
543     SIGGRANT
544     SIGRETRACT
545     SIGSOUND
546     SIGINFO
547   }
549   cg = ConstGenerator.new
550   cg.include "stdio.h"
551   cg.include "fcntl.h"
552   cg.include "sys/types.h"
553   cg.include "sys/socket.h"
554   cg.include "netdb.h"
555   cg.include "sys/stat.h"
556   cg.include "sys/resource.h"
557   cg.include "netinet/tcp.h"
558   cg.include "signal.h"
559   cg.include "netinet/in.h"
560   cg.include "syslog.h"
562   file_constants.each { |c| cg.const c }
563   io_constants.each { |c| cg.const c }
564   fcntl_constants.each {|c| cg.const c }
565   socket_constants.each { |c| cg.const c }
566   process_constants.each { |c| cg.const c }
567   long_process_constants.each { |c|
568     cg.const c, "%llu", "(unsigned long long)"
569   }
570   signal_constants.each { |c| cg.const c }
571   fcntl_constants.each { |c| cg.const c }
572   syslog_constants.each { |c| cg.const c }
574   cg.calculate
576   puts "Generating #{task.name}..."
578   File.open task.name, "w" do |f|
579     f.puts addrinfo.generate_config('addrinfo')
580     f.puts dirent.generate_config('dirent')
581     f.puts timeval.generate_config('timeval')
582     f.puts sockaddr_in.generate_config('sockaddr_in')
583     f.puts sockaddr_un.generate_config('sockaddr_un') if sockaddr_un.found?
584     f.puts servent.generate_config('servent')
585     f.puts stat.generate_config('stat')
586     f.puts rlimit.generate_config('rlimit')
587     f.puts evp_md.generate_config('evp_md')
588     f.puts evp_md_ctx.generate_config('evp_md_ctx')
590     file_constants.each do | name |
591       const = cg.constants[name]
592       f.puts "rbx.platform.file.#{name} = #{const.converted_value}"
593     end
595     io_constants.each do |name|
596       const = cg.constants[name]
597       f.puts "rbx.platform.io.#{name} = #{const.converted_value}"
598     end
600     fcntl_constants.each do |name|
601       const = cg.constants[name]
602       next if const.converted_value.nil?
603       f.puts "rbx.platform.fcntl.#{name} = #{const.converted_value}"
604     end
606     socket_constants.each do |name|
607       const = cg.constants[name]
608       next if const.converted_value.nil?
609       f.puts "rbx.platform.socket.#{name} = #{const.converted_value}"
610     end
612     (process_constants + long_process_constants).each do |name|
613       const = cg.constants[name]
614       next if const.converted_value.nil?
615       f.puts "rbx.platform.process.#{name} = #{const.converted_value}"
616     end
618     signal_constants.each do |name|
619       const = cg.constants[name]
620       next if const.converted_value.nil?
621       f.puts "rbx.platform.signal.#{name} = #{const.converted_value}"
622     end
624     syslog_constants.each do |name|
625       const = cg.constants[name]
626       f.puts "rbx.platform.syslog.#{name} = #{const.converted_value}"
627     end
629     f.puts TypesGenerator.generate
630   end