Re-enable spec/library for full CI runs.
[rbx.git] / rakelib / platform.rake
blobf121b9d86390e1af7ca847fe34ad3aebee813e98
1 require 'lib/ffi/struct_generator'
2 require 'lib/ffi/const_generator'
3 require 'lib/ffi/types_generator'
5 deps = %w[Rakefile] + Dir['lib/ffi/*rb']
7 file 'runtime/platform.conf' => deps do |task|
8   addrinfo = FFI::StructGenerator.new 'addrinfo' do |s|
9     s.include 'sys/socket.h'
10     s.include 'netdb.h'
11     s.name 'struct addrinfo'
12     s.field :ai_flags, :int
13     s.field :ai_family, :int
14     s.field :ai_socktype, :int
15     s.field :ai_protocol, :int
16     s.field :ai_addrlen, :int
17     s.field :ai_addr, :pointer
18     s.field :ai_canonname, :string
19     s.field :ai_next, :pointer
20   end
22   dirent = FFI::StructGenerator.new 'dirent' do |s|
23     s.include "sys/types.h"
24     s.include "dirent.h"
25     s.name 'struct dirent'
26     s.field :d_ino, :ino_t
27     s.field :d_reclen, :ushort
28     s.field :d_name, :char_array
29   end
31   timeval = FFI::StructGenerator.new 'timeval' do |s|
32     s.include "sys/time.h"
33     s.name 'struct timeval'
34     s.field :tv_sec, :time_t
35     s.field :tv_usec, :suseconds_t
36   end
38   sockaddr_in = FFI::StructGenerator.new 'sockaddr_in' do |s|
39     s.include "netinet/in.h"
40     s.include "fcntl.h"
41     s.include "sys/socket.h"
42     s.include "sys/stat.h"
43     s.name 'struct sockaddr_in'
44     s.field :sin_family, :sa_family_t
45     s.field :sin_port, :ushort
46     s.field :sin_addr
47     s.field :sin_zero, :char_array
48   end
50   sockaddr_un = FFI::StructGenerator.new 'sockaddr_un' do |s|
51     s.include "sys/un.h"
52     s.name 'struct sockaddr_un'
53     s.field :sun_family, :sa_family_t
54     s.field :sun_path, :char_array
55   end
57   servent = FFI::StructGenerator.new 'servent' do |s|
58     s.include "netdb.h"
59     s.name 'struct servent'
60     s.field :s_name, :pointer
61     s.field :s_aliases, :pointer
62     s.field :s_port, :int
63     s.field :s_proto, :pointer
64   end
66   stat = FFI::StructGenerator.new 'stat' do |s|
67     s.include "sys/types.h"
68     s.include "sys/stat.h"
69     s.name 'struct stat'
70     s.field :st_dev, :dev_t
71     s.field :st_ino, :ino_t
72     s.field :st_mode, :mode_t
73     s.field :st_nlink, :nlink_t
74     s.field :st_uid, :uid_t
75     s.field :st_gid, :gid_t
76     s.field :st_rdev, :dev_t
77     s.field :st_size, :off_t
78     s.field :st_blksize
79     s.field :st_blocks
80     s.field :st_atime, :time_t
81     s.field :st_mtime, :time_t
82     s.field :st_ctime, :time_t
83   end
85   rlimit = FFI::StructGenerator.new 'rlimit' do |s|
86     s.include "sys/types.h"
87     s.include "sys/time.h"
88     s.include "sys/resource.h"
89     s.name 'struct rlimit'
90     s.field :rlim_cur, :rlim_t
91     s.field :rlim_max, :rlim_t
92   end
94   # FIXME these constants don't have standard names.  LOCK_SH == Linux,
95   # O_SHLOCK on Bsd/Darwin, etc.  Binary doesn't exist at all in many non-Unix
96   # variants.  This should come out of something like config.h
98   fixme_constants = %w{
99     LOCK_SH
100     LOCK_EX
101     LOCK_NB
102     LOCK_UN
103     BINARY
104   }
106   file_cg = FFI::ConstGenerator.new 'rbx.platform.file' do |cg|
107     cg.include 'stdio.h'
108     cg.include 'fcntl.h'
109     cg.include 'sys/stat.h'
111     file_constants = %w[
112       O_RDONLY
113       O_WRONLY
114       O_RDWR
115       O_CREAT
116       O_EXCL
117       O_NOCTTY
118       O_TRUNC
119       O_APPEND
120       O_NONBLOCK
121       O_SYNC
122       S_IRUSR
123       S_IWUSR
124       S_IXUSR
125       S_IRGRP
126       S_IWGRP
127       S_IXGRP
128       S_IROTH
129       S_IWOTH
130       S_IXOTH
131       S_IFMT
132       S_IFIFO
133       S_IFCHR
134       S_IFDIR
135       S_IFBLK
136       S_IFREG
137       S_IFLNK
138       S_IFSOCK
139       S_IFWHT
140       S_ISUID
141       S_ISGID
142     ]
144     file_constants.each { |c| cg.const c }
145   end
147   io_cg = FFI::ConstGenerator.new 'rbx.platform.io' do |cg|
148     cg.include 'stdio.h'
150     io_constants = %w[
151       SEEK_SET
152       SEEK_CUR
153       SEEK_END
154     ]
156     io_constants.each { |c| cg.const c }
157   end
159   # Only constants needed by core are added here
160   fcntl_cg = FFI::ConstGenerator.new 'rbx.platform.fcntl' do |cg|
161     cg.include 'fcntl.h'
163     fcntl_constants = %w[
164       F_GETFL
165       F_SETFL
166       O_ACCMODE
167     ]
169     fcntl_constants.each { |c| cg.const c }
170   end
172   socket_cg = FFI::ConstGenerator.new 'rbx.platform.socket' do |cg|
173     cg.include 'sys/types.h'
174     cg.include 'sys/socket.h'
175     cg.include 'netdb.h'
176     cg.include 'netinet/tcp.h'
177     cg.include 'netinet/in.h'
179     socket_constants = %w[
180       AF_APPLETALK
181       AF_ATM
182       AF_AX25
183       AF_CCITT
184       AF_CHAOS
185       AF_CNT
186       AF_COIP
187       AF_DATAKIT
188       AF_DEC
189       AF_DLI
190       AF_E164
191       AF_ECMA
192       AF_HYLINK
193       AF_IMPLINK
194       AF_INET
195       AF_INET6
196       AF_IPX
197       AF_ISDN
198       AF_ISO
199       AF_LAT
200       AF_LINK
201       AF_LOCAL
202       AF_MAX
203       AF_NATM
204       AF_NDRV
205       AF_NETBIOS
206       AF_NETGRAPH
207       AF_NS
208       AF_OSI
209       AF_PPP
210       AF_PUP
211       AF_ROUTE
212       AF_SIP
213       AF_SNA
214       AF_SYSTEM
215       AF_UNIX
216       AF_UNSPEC
218       AI_ADDRCONFIG
219       AI_ALL
220       AI_CANONNAME
221       AI_DEFAULT
222       AI_MASK
223       AI_NUMERICHOST
224       AI_PASSIVE
225       AI_V4MAPPED
226       AI_V4MAPPED_CFG
228       EAI_ADDRFAMILY
229       EAI_AGAIN
230       EAI_BADFLAGS
231       EAI_BADHINTS
232       EAI_FAIL
233       EAI_FAMILY
234       EAI_MAX
235       EAI_MEMORY
236       EAI_NODATA
237       EAI_NONAME
238       EAI_PROTOCOL
239       EAI_SERVICE
240       EAI_SOCKTYPE
241       EAI_SYSTEM
243       INADDR_ALLHOSTS_GROUP
244       INADDR_ANY
245       INADDR_BROADCAST
246       INADDR_LOOPBACK
247       INADDR_MAX_LOCAL_GROUP
248       INADDR_NONE
249       INADDR_UNSPEC_GROUP
251       IPPORT_RESERVED
252       IPPORT_USERRESERVED
254       IPPROTO_BIP
255       IPPROTO_EGP
256       IPPROTO_EON
257       IPPROTO_GGP
258       IPPROTO_HELLO
259       IPPROTO_ICMP
260       IPPROTO_IDP
261       IPPROTO_IGMP
262       IPPROTO_IP
263       IPPROTO_MAX
264       IPPROTO_ND
265       IPPROTO_PUP
266       IPPROTO_RAW
267       IPPROTO_TCP
268       IPPROTO_TP
269       IPPROTO_UDP
270       IPPROTO_XTP
272       IPX_TYPE
274       IP_ADD_MEMBERSHIP
275       IP_DEFAULT_MULTICAST_LOOP
276       IP_DEFAULT_MULTICAST_TTL
277       IP_DROP_MEMBERSHIP
278       IP_HDRINCL
279       IP_MAX_MEMBERSHIPS
280       IP_MULTICAST_IF
281       IP_MULTICAST_LOOP
282       IP_MULTICAST_TTL
283       IP_OPTIONS
284       IP_RECVDSTADDR
285       IP_RECVOPTS
286       IP_RECVRETOPTS
287       IP_RETOPTS
288       IP_TOS
289       IP_TTL
291       MSG_COMPAT
292       MSG_CTRUNC
293       MSG_DONTROUTE
294       MSG_DONTWAIT
295       MSG_EOF
296       MSG_EOR
297       MSG_FLUSH
298       MSG_HAVEMORE
299       MSG_HOLD
300       MSG_OOB
301       MSG_PEEK
302       MSG_RCVMORE
303       MSG_SEND
304       MSG_TRUNC
305       MSG_WAITALL
307       NI_DGRAM
308       NI_MAXHOST
309       NI_MAXSERV
310       NI_NAMEREQD
311       NI_NOFQDN
312       NI_NUMERICHOST
313       NI_NUMERICSERV
315       PF_APPLETALK
316       PF_AX25
317       PF_CCITT
318       PF_CHAOS
319       PF_CNT
320       PF_COIP
321       PF_DATAKIT
322       PF_DLI
323       PF_ECMA
324       PF_HYLINK
325       PF_IMPLINK
326       PF_INET
327       PF_INET6
328       PF_IPX
329       PF_ISDN
330       PF_ISO
331       PF_KEY
332       PF_LAT
333       PF_LINK
334       PF_LOCAL
335       PF_MAX
336       PF_NATM
337       PF_NDRV
338       PF_NETBIOS
339       PF_NETGRAPH
340       PF_NS
341       PF_OSI
342       PF_PIP
343       PF_PPP
344       PF_PUP
345       PF_ROUTE
346       PF_RTIP
347       PF_SIP
348       PF_SNA
349       PF_SYSTEM
350       PF_UNIX
351       PF_UNSPEC
352       PF_XTP
354       SHUT_RD
355       SHUT_RDWR
356       SHUT_WR
358       SOCK_DGRAM
359       SOCK_PACKET
360       SOCK_RAW
361       SOCK_RDM
362       SOCK_SEQPACKET
363       SOCK_STREAM
365       SOL_ATALK
366       SOL_AX25
367       SOL_IP
368       SOL_IPX
369       SOL_SOCKET
370       SOL_TCP
371       SOL_UDP
373       SOPRI_BACKGROUND
374       SOPRI_INTERACTIVE
375       SOPRI_NORMAL
377       SO_ACCEPTCONN
378       SO_ACCEPTFILTER
379       SO_ATTACH_FILTER
380       SO_BINDTODEVICE
381       SO_BROADCAST
382       SO_DEBUG
383       SO_DETACH_FILTER
384       SO_DONTROUTE
385       SO_DONTTRUNC
386       SO_ERROR
387       SO_KEEPALIVE
388       SO_LINGER
389       SO_NKE
390       SO_NOSIGPIPE
391       SO_NO_CHECK
392       SO_NREAD
393       SO_OOBINLINE
394       SO_PASSCRED
395       SO_PEERCRED
396       SO_PEERNAME
397       SO_PRIORITY
398       SO_RCVBUF
399       SO_RCVLOWAT
400       SO_RCVTIMEO
401       SO_REUSEADDR
402       SO_REUSEPORT
403       SO_SECURITY_AUTHENTICATION
404       SO_SECURITY_ENCRYPTION_NETWORK
405       SO_SECURITY_ENCRYPTION_TRANSPORT
406       SO_SNDBUF
407       SO_SNDLOWAT
408       SO_SNDTIMEO
409       SO_TIMESTAMP
410       SO_TYPE
411       SO_USELOOPBACK
412       SO_WANTMORE
413       SO_WANTOOBFLAG
415       TCP_MAXSEG
416       TCP_NODELAY
417     ]
419     socket_constants.each { |c| cg.const c }
420   end
422   process_cg = FFI::ConstGenerator.new 'rbx.platform.process' do |cg|
423     cg.include 'sys/wait.h'
424     cg.include 'sys/resource.h'
426     process_constants = %w{
427       WNOHANG
428       WUNTRACED
429       PRIO_PROCESS
430       PRIO_PGRP
431       PRIO_USER
432       RLIMIT_CPU
433       RLIMIT_FSIZE
434       RLIMIT_DATA
435       RLIMIT_STACK
436       RLIMIT_CORE
437       RLIMIT_RSS
438       RLIMIT_NPROC
439       RLIMIT_NOFILE
440       RLIMIT_MEMLOCK
441       RLIMIT_AS
442       RLIMIT_SBSIZE
443     }
445     process_constants.each { |c| cg.const c }
447     long_process_constants = %w[
448       RLIM_INFINITY
449       RLIM_SAVED_MAX
450       RLIM_SAVED_CUR
451     ]
453     long_process_constants.each { |c|
454       cg.const c, "%llu", "(unsigned long long)"
455     }
456   end
458   # The constants come from MRI's signal.c. This means that some of them might
459   # be missing.
461   signal_cg = FFI::ConstGenerator.new 'rbx.platform.signal' do |cg|
462     cg.include 'signal.h'
463     cg.include 'sys/signal.h'
465     signal_constants = %w{
466       SIGHUP
467       SIGINT
468       SIGQUIT
469       SIGILL
470       SIGTRAP
471       SIGIOT
472       SIGABRT
473       SIGEMT
474       SIGFPE
475       SIGKILL
476       SIGBUS
477       SIGSEGV
478       SIGSYS
479       SIGPIPE
480       SIGALRM
481       SIGTERM
482       SIGURG
483       SIGSTOP
484       SIGTSTP
485       SIGCONT
486       SIGCHLD
487       SIGCLD
488       SIGCHLD
489       SIGTTIN
490       SIGTTOU
491       SIGIO
492       SIGXCPU
493       SIGXFSZ
494       SIGVTALRM
495       SIGPROF
496       SIGWINCH
497       SIGUSR1
498       SIGUSR2
499       SIGLOST
500       SIGMSG
501       SIGPWR
502       SIGPOLL
503       SIGDANGER
504       SIGMIGRATE
505       SIGPRE
506       SIGGRANT
507       SIGRETRACT
508       SIGSOUND
509       SIGINFO
510     }
512     signal_constants.each { |c| cg.const c }
513   end
515   zlib_cg = FFI::ConstGenerator.new 'rbx.platform.zlib' do |cg|
516     cg.include 'zlib.h'
518     zlib_constants = %w[ZLIB_VERSION]
520     zlib_constants.each { |c| cg.const c, "%s", "(char *)" }
521   end
523   puts "Generating #{task.name}..." if $verbose
525   File.open task.name, "w" do |f|
526     addrinfo.dump_config f
527     dirent.dump_config f
528     timeval.dump_config f
529     sockaddr_in.dump_config f
530     sockaddr_un.dump_config f if sockaddr_un.found?
531     servent.dump_config f
532     stat.dump_config f
533     rlimit.dump_config f
535     file_cg.dump_constants f
536     io_cg.dump_constants f
537     fcntl_cg.dump_constants f
538     socket_cg.dump_constants f
539     process_cg.dump_constants f
540     signal_cg.dump_constants f
541     zlib_cg.dump_constants f
543     f.puts FFI::TypesGenerator.generate
544   end