sonixlabs-eventmachine-java 1.0.0.rc.4-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. data/.gitignore +22 -0
  2. data/.yardopts +7 -0
  3. data/GNU +281 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +60 -0
  6. data/README.md +109 -0
  7. data/Rakefile +20 -0
  8. data/docs/DocumentationGuidesIndex.md +27 -0
  9. data/docs/GettingStarted.md +521 -0
  10. data/docs/old/ChangeLog +211 -0
  11. data/docs/old/DEFERRABLES +246 -0
  12. data/docs/old/EPOLL +141 -0
  13. data/docs/old/INSTALL +13 -0
  14. data/docs/old/KEYBOARD +42 -0
  15. data/docs/old/LEGAL +25 -0
  16. data/docs/old/LIGHTWEIGHT_CONCURRENCY +130 -0
  17. data/docs/old/PURE_RUBY +75 -0
  18. data/docs/old/RELEASE_NOTES +94 -0
  19. data/docs/old/SMTP +4 -0
  20. data/docs/old/SPAWNED_PROCESSES +148 -0
  21. data/docs/old/TODO +8 -0
  22. data/eventmachine.gemspec +34 -0
  23. data/examples/guides/getting_started/01_eventmachine_echo_server.rb +18 -0
  24. data/examples/guides/getting_started/02_eventmachine_echo_server_that_recognizes_exit_command.rb +22 -0
  25. data/examples/guides/getting_started/03_simple_chat_server.rb +149 -0
  26. data/examples/guides/getting_started/04_simple_chat_server_step_one.rb +27 -0
  27. data/examples/guides/getting_started/05_simple_chat_server_step_two.rb +43 -0
  28. data/examples/guides/getting_started/06_simple_chat_server_step_three.rb +98 -0
  29. data/examples/guides/getting_started/07_simple_chat_server_step_four.rb +121 -0
  30. data/examples/guides/getting_started/08_simple_chat_server_step_five.rb +141 -0
  31. data/examples/old/ex_channel.rb +43 -0
  32. data/examples/old/ex_queue.rb +2 -0
  33. data/examples/old/ex_tick_loop_array.rb +15 -0
  34. data/examples/old/ex_tick_loop_counter.rb +32 -0
  35. data/examples/old/helper.rb +2 -0
  36. data/ext/binder.cpp +124 -0
  37. data/ext/binder.h +46 -0
  38. data/ext/cmain.cpp +876 -0
  39. data/ext/ed.cpp +1973 -0
  40. data/ext/ed.h +422 -0
  41. data/ext/em.cpp +2353 -0
  42. data/ext/em.h +239 -0
  43. data/ext/eventmachine.h +127 -0
  44. data/ext/extconf.rb +176 -0
  45. data/ext/fastfilereader/extconf.rb +103 -0
  46. data/ext/fastfilereader/mapper.cpp +214 -0
  47. data/ext/fastfilereader/mapper.h +59 -0
  48. data/ext/fastfilereader/rubymain.cpp +127 -0
  49. data/ext/kb.cpp +79 -0
  50. data/ext/page.cpp +107 -0
  51. data/ext/page.h +51 -0
  52. data/ext/pipe.cpp +347 -0
  53. data/ext/project.h +156 -0
  54. data/ext/rubymain.cpp +1297 -0
  55. data/ext/ssl.cpp +468 -0
  56. data/ext/ssl.h +94 -0
  57. data/java/.classpath +8 -0
  58. data/java/.project +17 -0
  59. data/java/src/com/rubyeventmachine/EmReactor.java +588 -0
  60. data/java/src/com/rubyeventmachine/EmReactorException.java +40 -0
  61. data/java/src/com/rubyeventmachine/EventableChannel.java +70 -0
  62. data/java/src/com/rubyeventmachine/EventableDatagramChannel.java +195 -0
  63. data/java/src/com/rubyeventmachine/EventableSocketChannel.java +364 -0
  64. data/lib/em/buftok.rb +110 -0
  65. data/lib/em/callback.rb +58 -0
  66. data/lib/em/channel.rb +64 -0
  67. data/lib/em/completion.rb +304 -0
  68. data/lib/em/connection.rb +712 -0
  69. data/lib/em/deferrable.rb +210 -0
  70. data/lib/em/deferrable/pool.rb +2 -0
  71. data/lib/em/file_watch.rb +73 -0
  72. data/lib/em/future.rb +61 -0
  73. data/lib/em/iterator.rb +270 -0
  74. data/lib/em/messages.rb +66 -0
  75. data/lib/em/pool.rb +151 -0
  76. data/lib/em/process_watch.rb +45 -0
  77. data/lib/em/processes.rb +123 -0
  78. data/lib/em/protocols.rb +36 -0
  79. data/lib/em/protocols/header_and_content.rb +138 -0
  80. data/lib/em/protocols/httpclient.rb +279 -0
  81. data/lib/em/protocols/httpclient2.rb +600 -0
  82. data/lib/em/protocols/line_and_text.rb +125 -0
  83. data/lib/em/protocols/line_protocol.rb +29 -0
  84. data/lib/em/protocols/linetext2.rb +161 -0
  85. data/lib/em/protocols/memcache.rb +331 -0
  86. data/lib/em/protocols/object_protocol.rb +46 -0
  87. data/lib/em/protocols/postgres3.rb +246 -0
  88. data/lib/em/protocols/saslauth.rb +175 -0
  89. data/lib/em/protocols/smtpclient.rb +365 -0
  90. data/lib/em/protocols/smtpserver.rb +640 -0
  91. data/lib/em/protocols/socks4.rb +66 -0
  92. data/lib/em/protocols/stomp.rb +202 -0
  93. data/lib/em/protocols/tcptest.rb +54 -0
  94. data/lib/em/pure_ruby.rb +1017 -0
  95. data/lib/em/queue.rb +71 -0
  96. data/lib/em/resolver.rb +192 -0
  97. data/lib/em/spawnable.rb +84 -0
  98. data/lib/em/streamer.rb +118 -0
  99. data/lib/em/threaded_resource.rb +90 -0
  100. data/lib/em/tick_loop.rb +85 -0
  101. data/lib/em/timers.rb +61 -0
  102. data/lib/em/version.rb +3 -0
  103. data/lib/eventmachine.rb +1532 -0
  104. data/lib/jeventmachine.rb +284 -0
  105. data/lib/sonixlabs-eventmachine-java.rb +1 -0
  106. data/rakelib/cpp.rake_example +77 -0
  107. data/rakelib/package.rake +98 -0
  108. data/rakelib/test.rake +8 -0
  109. data/tests/client.crt +31 -0
  110. data/tests/client.key +51 -0
  111. data/tests/em_test_helper.rb +64 -0
  112. data/tests/test_attach.rb +126 -0
  113. data/tests/test_basic.rb +294 -0
  114. data/tests/test_channel.rb +62 -0
  115. data/tests/test_completion.rb +177 -0
  116. data/tests/test_connection_count.rb +33 -0
  117. data/tests/test_defer.rb +18 -0
  118. data/tests/test_deferrable.rb +35 -0
  119. data/tests/test_epoll.rb +130 -0
  120. data/tests/test_error_handler.rb +38 -0
  121. data/tests/test_exc.rb +28 -0
  122. data/tests/test_file_watch.rb +65 -0
  123. data/tests/test_futures.rb +170 -0
  124. data/tests/test_get_sock_opt.rb +37 -0
  125. data/tests/test_handler_check.rb +35 -0
  126. data/tests/test_hc.rb +155 -0
  127. data/tests/test_httpclient.rb +190 -0
  128. data/tests/test_httpclient2.rb +128 -0
  129. data/tests/test_idle_connection.rb +23 -0
  130. data/tests/test_inactivity_timeout.rb +54 -0
  131. data/tests/test_kb.rb +34 -0
  132. data/tests/test_ltp.rb +138 -0
  133. data/tests/test_ltp2.rb +288 -0
  134. data/tests/test_next_tick.rb +104 -0
  135. data/tests/test_object_protocol.rb +36 -0
  136. data/tests/test_pause.rb +78 -0
  137. data/tests/test_pending_connect_timeout.rb +52 -0
  138. data/tests/test_pool.rb +194 -0
  139. data/tests/test_process_watch.rb +48 -0
  140. data/tests/test_processes.rb +128 -0
  141. data/tests/test_proxy_connection.rb +180 -0
  142. data/tests/test_pure.rb +88 -0
  143. data/tests/test_queue.rb +50 -0
  144. data/tests/test_resolver.rb +55 -0
  145. data/tests/test_running.rb +14 -0
  146. data/tests/test_sasl.rb +47 -0
  147. data/tests/test_send_file.rb +217 -0
  148. data/tests/test_servers.rb +33 -0
  149. data/tests/test_set_sock_opt.rb +37 -0
  150. data/tests/test_shutdown_hooks.rb +23 -0
  151. data/tests/test_smtpclient.rb +55 -0
  152. data/tests/test_smtpserver.rb +57 -0
  153. data/tests/test_spawn.rb +293 -0
  154. data/tests/test_ssl_args.rb +78 -0
  155. data/tests/test_ssl_methods.rb +48 -0
  156. data/tests/test_ssl_verify.rb +82 -0
  157. data/tests/test_threaded_resource.rb +53 -0
  158. data/tests/test_tick_loop.rb +59 -0
  159. data/tests/test_timers.rb +123 -0
  160. data/tests/test_ud.rb +8 -0
  161. data/tests/test_unbind_reason.rb +48 -0
  162. metadata +301 -0
@@ -0,0 +1,239 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: em.h
6
+ Date: 06Apr06
7
+
8
+ Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: blackhedd
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+ #ifndef __EventMachine__H_
21
+ #define __EventMachine__H_
22
+
23
+ #ifdef BUILD_FOR_RUBY
24
+ #include <ruby.h>
25
+ #define EmSelect rb_thread_select
26
+
27
+ #if defined(HAVE_RBTRAP)
28
+ #include <rubysig.h>
29
+ #elif defined(HAVE_RB_THREAD_CHECK_INTS)
30
+ extern "C" {
31
+ void rb_enable_interrupt(void);
32
+ void rb_disable_interrupt(void);
33
+ }
34
+
35
+ #define TRAP_BEG rb_enable_interrupt()
36
+ #define TRAP_END do { rb_disable_interrupt(); rb_thread_check_ints(); } while(0)
37
+ #else
38
+ #define TRAP_BEG
39
+ #define TRAP_END
40
+ #endif
41
+
42
+ // 1.9.0 compat
43
+ #ifndef RUBY_UBF_IO
44
+ #define RUBY_UBF_IO RB_UBF_DFL
45
+ #endif
46
+ #ifndef RSTRING_PTR
47
+ #define RSTRING_PTR(str) RSTRING(str)->ptr
48
+ #endif
49
+ #ifndef RSTRING_LEN
50
+ #define RSTRING_LEN(str) RSTRING(str)->len
51
+ #endif
52
+ #ifndef RSTRING_LENINT
53
+ #define RSTRING_LENINT(str) RSTRING_LEN(str)
54
+ #endif
55
+ #else
56
+ #define EmSelect select
57
+ #endif
58
+
59
+ class EventableDescriptor;
60
+ class InotifyDescriptor;
61
+
62
+
63
+ /********************
64
+ class EventMachine_t
65
+ ********************/
66
+
67
+ class EventMachine_t
68
+ {
69
+ public:
70
+ static int GetMaxTimerCount();
71
+ static void SetMaxTimerCount (int);
72
+
73
+ public:
74
+ EventMachine_t (EMCallback);
75
+ virtual ~EventMachine_t();
76
+
77
+ void Run();
78
+ void ScheduleHalt();
79
+ void SignalLoopBreaker();
80
+ const unsigned long InstallOneshotTimer (int);
81
+ const unsigned long ConnectToServer (const char *, int, const char *, int);
82
+ const unsigned long ConnectToUnixServer (const char *);
83
+
84
+ const unsigned long CreateTcpServer (const char *, int);
85
+ const unsigned long OpenDatagramSocket (const char *, int);
86
+ const unsigned long CreateUnixDomainServer (const char*);
87
+ const unsigned long OpenKeyboard();
88
+ //const char *Popen (const char*, const char*);
89
+ const unsigned long Socketpair (char* const*);
90
+
91
+ void Add (EventableDescriptor*);
92
+ void Modify (EventableDescriptor*);
93
+ void Deregister (EventableDescriptor*);
94
+
95
+ const unsigned long AttachFD (int, bool);
96
+ int DetachFD (EventableDescriptor*);
97
+
98
+ void ArmKqueueWriter (EventableDescriptor*);
99
+ void ArmKqueueReader (EventableDescriptor*);
100
+
101
+ void SetTimerQuantum (int);
102
+ static void SetuidString (const char*);
103
+ static int SetRlimitNofile (int);
104
+
105
+ pid_t SubprocessPid;
106
+ int SubprocessExitStatus;
107
+
108
+ int GetConnectionCount();
109
+ float GetHeartbeatInterval();
110
+ int SetHeartbeatInterval(float);
111
+
112
+ const unsigned long WatchFile (const char*);
113
+ void UnwatchFile (int);
114
+ void UnwatchFile (const unsigned long);
115
+
116
+ #ifdef HAVE_KQUEUE
117
+ void _HandleKqueueFileEvent (struct kevent*);
118
+ void _RegisterKqueueFileEvent(int);
119
+ #endif
120
+
121
+ const unsigned long WatchPid (int);
122
+ void UnwatchPid (int);
123
+ void UnwatchPid (const unsigned long);
124
+
125
+ #ifdef HAVE_KQUEUE
126
+ void _HandleKqueuePidEvent (struct kevent*);
127
+ #endif
128
+
129
+ uint64_t GetCurrentLoopTime() { return MyCurrentLoopTime; }
130
+
131
+ // Temporary:
132
+ void _UseEpoll();
133
+ void _UseKqueue();
134
+
135
+ bool UsingKqueue() { return bKqueue; }
136
+ bool UsingEpoll() { return bEpoll; }
137
+
138
+ void QueueHeartbeat(EventableDescriptor*);
139
+ void ClearHeartbeat(uint64_t, EventableDescriptor*);
140
+
141
+ uint64_t GetRealTime();
142
+
143
+ private:
144
+ bool _RunOnce();
145
+ void _RunTimers();
146
+ void _UpdateTime();
147
+ void _AddNewDescriptors();
148
+ void _ModifyDescriptors();
149
+ void _InitializeLoopBreaker();
150
+ void _CleanupSockets();
151
+
152
+ bool _RunSelectOnce();
153
+ bool _RunEpollOnce();
154
+ bool _RunKqueueOnce();
155
+
156
+ void _ModifyEpollEvent (EventableDescriptor*);
157
+ void _DispatchHeartbeats();
158
+ timeval _TimeTilNextEvent();
159
+ void _CleanBadDescriptors();
160
+
161
+ public:
162
+ void _ReadLoopBreaker();
163
+ void _ReadInotifyEvents();
164
+ int NumCloseScheduled;
165
+
166
+ private:
167
+ enum {
168
+ MaxEpollDescriptors = 64*1024,
169
+ MaxEvents = 4096
170
+ };
171
+ int HeartbeatInterval;
172
+ EMCallback EventCallback;
173
+
174
+ class Timer_t: public Bindable_t {
175
+ };
176
+
177
+ multimap<uint64_t, Timer_t> Timers;
178
+ multimap<uint64_t, EventableDescriptor*> Heartbeats;
179
+ map<int, Bindable_t*> Files;
180
+ map<int, Bindable_t*> Pids;
181
+ vector<EventableDescriptor*> Descriptors;
182
+ vector<EventableDescriptor*> NewDescriptors;
183
+ set<EventableDescriptor*> ModifiedDescriptors;
184
+
185
+ uint64_t NextHeartbeatTime;
186
+
187
+ int LoopBreakerReader;
188
+ int LoopBreakerWriter;
189
+ #ifdef OS_WIN32
190
+ struct sockaddr_in LoopBreakerTarget;
191
+ #endif
192
+
193
+ timeval Quantum;
194
+
195
+ uint64_t MyCurrentLoopTime;
196
+
197
+ #ifdef OS_WIN32
198
+ unsigned TickCountTickover;
199
+ unsigned LastTickCount;
200
+ #endif
201
+
202
+ private:
203
+ bool bTerminateSignalReceived;
204
+
205
+ bool bEpoll;
206
+ int epfd; // Epoll file-descriptor
207
+ #ifdef HAVE_EPOLL
208
+ struct epoll_event epoll_events [MaxEvents];
209
+ #endif
210
+
211
+ bool bKqueue;
212
+ int kqfd; // Kqueue file-descriptor
213
+ #ifdef HAVE_KQUEUE
214
+ struct kevent Karray [MaxEvents];
215
+ #endif
216
+
217
+ InotifyDescriptor *inotify; // pollable descriptor for our inotify instance
218
+ };
219
+
220
+
221
+ /*******************
222
+ struct SelectData_t
223
+ *******************/
224
+
225
+ struct SelectData_t
226
+ {
227
+ SelectData_t();
228
+
229
+ int _Select();
230
+
231
+ int maxsocket;
232
+ fd_set fdreads;
233
+ fd_set fdwrites;
234
+ fd_set fderrors;
235
+ timeval tv;
236
+ int nSockets;
237
+ };
238
+
239
+ #endif // __EventMachine__H_
@@ -0,0 +1,127 @@
1
+ /*****************************************************************************
2
+
3
+ $Id$
4
+
5
+ File: eventmachine.h
6
+ Date: 15Apr06
7
+
8
+ Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
9
+ Gmail: blackhedd
10
+
11
+ This program is free software; you can redistribute it and/or modify
12
+ it under the terms of either: 1) the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2 of the
14
+ License, or (at your option) any later version; or 2) Ruby's License.
15
+
16
+ See the file COPYING for complete licensing information.
17
+
18
+ *****************************************************************************/
19
+
20
+ #ifndef __EVMA_EventMachine__H_
21
+ #define __EVMA_EventMachine__H_
22
+
23
+ #if __cplusplus
24
+ extern "C" {
25
+ #endif
26
+
27
+ enum { // Event names
28
+ EM_TIMER_FIRED = 100,
29
+ EM_CONNECTION_READ = 101,
30
+ EM_CONNECTION_UNBOUND = 102,
31
+ EM_CONNECTION_ACCEPTED = 103,
32
+ EM_CONNECTION_COMPLETED = 104,
33
+ EM_LOOPBREAK_SIGNAL = 105,
34
+ EM_CONNECTION_NOTIFY_READABLE = 106,
35
+ EM_CONNECTION_NOTIFY_WRITABLE = 107,
36
+ EM_SSL_HANDSHAKE_COMPLETED = 108,
37
+ EM_SSL_VERIFY = 109,
38
+ EM_PROXY_TARGET_UNBOUND = 110,
39
+ EM_PROXY_COMPLETED = 111
40
+
41
+ };
42
+
43
+ void evma_initialize_library (EMCallback);
44
+ void evma_run_machine();
45
+ void evma_release_library();
46
+ const unsigned long evma_install_oneshot_timer (int seconds);
47
+ const unsigned long evma_connect_to_server (const char *bind_addr, int bind_port, const char *server, int port);
48
+ const unsigned long evma_connect_to_unix_server (const char *server);
49
+
50
+ const unsigned long evma_attach_fd (int file_descriptor, int watch_mode);
51
+ int evma_detach_fd (const unsigned long binding);
52
+ int evma_get_file_descriptor (const unsigned long binding);
53
+ int evma_is_notify_readable (const unsigned long binding);
54
+ void evma_set_notify_readable (const unsigned long binding, int mode);
55
+ int evma_is_notify_writable (const unsigned long binding);
56
+ void evma_set_notify_writable (const unsigned long binding, int mode);
57
+
58
+ int evma_pause(const unsigned long binding);
59
+ int evma_is_paused(const unsigned long binding);
60
+ int evma_resume(const unsigned long binding);
61
+
62
+ int evma_num_close_scheduled();
63
+
64
+ void evma_stop_tcp_server (const unsigned long signature);
65
+ const unsigned long evma_create_tcp_server (const char *address, int port);
66
+ const unsigned long evma_create_unix_domain_server (const char *filename);
67
+ const unsigned long evma_open_datagram_socket (const char *server, int port);
68
+ const unsigned long evma_open_keyboard();
69
+ void evma_set_tls_parms (const unsigned long binding, const char *privatekey_filename, const char *certchain_filenane, int verify_peer);
70
+ void evma_start_tls (const unsigned long binding);
71
+
72
+ #ifdef WITH_SSL
73
+ X509 *evma_get_peer_cert (const unsigned long binding);
74
+ void evma_accept_ssl_peer (const unsigned long binding);
75
+ #endif
76
+
77
+ int evma_get_peername (const unsigned long binding, struct sockaddr*, socklen_t*);
78
+ int evma_get_sockname (const unsigned long binding, struct sockaddr*, socklen_t*);
79
+ int evma_get_subprocess_pid (const unsigned long binding, pid_t*);
80
+ int evma_get_subprocess_status (const unsigned long binding, int*);
81
+ int evma_get_connection_count();
82
+ int evma_send_data_to_connection (const unsigned long binding, const char *data, int data_length);
83
+ int evma_send_datagram (const unsigned long binding, const char *data, int data_length, const char *address, int port);
84
+ float evma_get_comm_inactivity_timeout (const unsigned long binding);
85
+ int evma_set_comm_inactivity_timeout (const unsigned long binding, float value);
86
+ float evma_get_pending_connect_timeout (const unsigned long binding);
87
+ int evma_set_pending_connect_timeout (const unsigned long binding, float value);
88
+ int evma_get_outbound_data_size (const unsigned long binding);
89
+ uint64_t evma_get_last_activity_time (const unsigned long);
90
+ int evma_send_file_data_to_connection (const unsigned long binding, const char *filename);
91
+
92
+ void evma_close_connection (const unsigned long binding, int after_writing);
93
+ int evma_report_connection_error_status (const unsigned long binding);
94
+ void evma_signal_loopbreak();
95
+ void evma_set_timer_quantum (int);
96
+ int evma_get_max_timer_count();
97
+ void evma_set_max_timer_count (int);
98
+ void evma_setuid_string (const char *username);
99
+ void evma_stop_machine();
100
+ float evma_get_heartbeat_interval();
101
+ int evma_set_heartbeat_interval(float);
102
+
103
+ const unsigned long evma_popen (char * const*cmd_strings);
104
+
105
+ const unsigned long evma_watch_filename (const char *fname);
106
+ void evma_unwatch_filename (const unsigned long);
107
+
108
+ const unsigned long evma_watch_pid (int);
109
+ void evma_unwatch_pid (const unsigned long);
110
+
111
+ void evma_start_proxy(const unsigned long, const unsigned long, const unsigned long, const unsigned long);
112
+ void evma_stop_proxy(const unsigned long);
113
+ unsigned long evma_proxied_bytes(const unsigned long);
114
+
115
+ int evma_set_rlimit_nofile (int n_files);
116
+
117
+ void evma_set_epoll (int use);
118
+ void evma_set_kqueue (int use);
119
+
120
+ uint64_t evma_get_current_loop_time();
121
+ #if __cplusplus
122
+ }
123
+ #endif
124
+
125
+
126
+ #endif // __EventMachine__H_
127
+
@@ -0,0 +1,176 @@
1
+ require 'fileutils'
2
+ require 'mkmf'
3
+
4
+ def check_libs libs = [], fatal = false
5
+ libs.all? { |lib| have_library(lib) || (abort("could not find library: #{lib}") if fatal) }
6
+ end
7
+
8
+ def check_heads heads = [], fatal = false
9
+ heads.all? { |head| have_header(head) || (abort("could not find header: #{head}") if fatal)}
10
+ end
11
+
12
+ def add_define(name)
13
+ $defs.push("-D#{name}")
14
+ end
15
+
16
+ ##
17
+ # OpenSSL:
18
+
19
+ # override append_library, so it actually appends (instead of prepending)
20
+ # this fixes issues with linking ssl, since libcrypto depends on symbols in libssl
21
+ def append_library(libs, lib)
22
+ libs + " " + format(LIBARG, lib)
23
+ end
24
+
25
+ def manual_ssl_config
26
+ ssl_libs_heads_args = {
27
+ :unix => [%w[ssl crypto], %w[openssl/ssl.h openssl/err.h]],
28
+ :mswin => [%w[ssleay32 eay32], %w[openssl/ssl.h openssl/err.h]],
29
+ }
30
+
31
+ dc_flags = ['ssl']
32
+ dc_flags += ["#{ENV['OPENSSL']}/include", ENV['OPENSSL']] if /linux/ =~ RUBY_PLATFORM and ENV['OPENSSL']
33
+
34
+ libs, heads = case RUBY_PLATFORM
35
+ when /mswin/ ; ssl_libs_heads_args[:mswin]
36
+ else ssl_libs_heads_args[:unix]
37
+ end
38
+ dir_config(*dc_flags)
39
+ check_libs(libs) and check_heads(heads)
40
+ end
41
+
42
+ if ENV['CROSS_COMPILING']
43
+ openssl_version = ENV.fetch("OPENSSL_VERSION", "1.0.0j")
44
+ openssl_dir = File.expand_path("~/.rake-compiler/builds/openssl-#{openssl_version}/")
45
+ if File.exists?(openssl_dir)
46
+ FileUtils.mkdir_p Dir.pwd+"/openssl/"
47
+ FileUtils.cp Dir[openssl_dir+"/include/openssl/*.h"], Dir.pwd+"/openssl/", :verbose => true
48
+ FileUtils.cp Dir[openssl_dir+"/lib*.a"], Dir.pwd, :verbose => true
49
+ $INCFLAGS << " -I#{Dir.pwd}" # for the openssl headers
50
+ else
51
+ STDERR.puts
52
+ STDERR.puts "**************************************************************************************"
53
+ STDERR.puts "**** Cross-compiled OpenSSL not found"
54
+ STDERR.puts "**** Run: hg clone http://bitbucket.org/ged/ruby-pg && cd ruby-pg && rake openssl_libs"
55
+ STDERR.puts "**************************************************************************************"
56
+ STDERR.puts
57
+ end
58
+ end
59
+
60
+ # Try to use pkg_config first, fixes #73
61
+ if (!ENV['CROSS_COMPILING'] and pkg_config('openssl')) || manual_ssl_config
62
+ add_define "WITH_SSL"
63
+ else
64
+ add_define "WITHOUT_SSL"
65
+ end
66
+
67
+ add_define 'BUILD_FOR_RUBY'
68
+ add_define 'HAVE_RBTRAP' if have_var('rb_trap_immediate', ['ruby.h', 'rubysig.h'])
69
+ add_define "HAVE_TBR" if have_func('rb_thread_blocking_region')# and have_macro('RUBY_UBF_IO', 'ruby.h')
70
+ add_define "HAVE_INOTIFY" if inotify = have_func('inotify_init', 'sys/inotify.h')
71
+ add_define "HAVE_OLD_INOTIFY" if !inotify && have_macro('__NR_inotify_init', 'sys/syscall.h')
72
+ add_define 'HAVE_WRITEV' if have_func('writev', 'sys/uio.h')
73
+
74
+ have_func('rb_thread_check_ints')
75
+ have_func('rb_time_new')
76
+
77
+ # Minor platform details between *nix and Windows:
78
+
79
+ if RUBY_PLATFORM =~ /(mswin|mingw|bccwin)/
80
+ GNU_CHAIN = ENV['CROSS_COMPILING'] or $1 == 'mingw'
81
+ OS_WIN32 = true
82
+ add_define "OS_WIN32"
83
+ else
84
+ GNU_CHAIN = true
85
+ OS_UNIX = true
86
+ add_define 'OS_UNIX'
87
+
88
+ add_define "HAVE_KQUEUE" if have_header("sys/event.h") and have_header("sys/queue.h")
89
+ end
90
+
91
+ # Adjust number of file descriptors (FD) on Windows
92
+
93
+ if RbConfig::CONFIG["host_os"] =~ /mingw/
94
+ found = RbConfig::CONFIG.values_at("CFLAGS", "CPPFLAGS").
95
+ any? { |v| v.include?("FD_SETSIZE") }
96
+
97
+ add_define "FD_SETSIZE=32767" unless found
98
+ end
99
+
100
+ # Main platform invariances:
101
+
102
+ case RUBY_PLATFORM
103
+ when /mswin32/, /mingw32/, /bccwin32/
104
+ check_heads(%w[windows.h winsock.h], true)
105
+ check_libs(%w[kernel32 rpcrt4 gdi32], true)
106
+
107
+ if GNU_CHAIN
108
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++"
109
+ else
110
+ $defs.push "-EHs"
111
+ $defs.push "-GR"
112
+ end
113
+
114
+ when /solaris/
115
+ add_define 'OS_SOLARIS8'
116
+ check_libs(%w[nsl socket], true)
117
+
118
+ if CONFIG['CC'] == 'cc' and `cc -flags 2>&1` =~ /Sun/ # detect SUNWspro compiler
119
+ # SUN CHAIN
120
+ add_define 'CC_SUNWspro'
121
+ $preload = ["\nCXX = CC"] # hack a CXX= line into the makefile
122
+ $CFLAGS = CONFIG['CFLAGS'] = "-KPIC"
123
+ CONFIG['CCDLFLAGS'] = "-KPIC"
124
+ CONFIG['LDSHARED'] = "$(CXX) -G -KPIC -lCstd"
125
+ else
126
+ # GNU CHAIN
127
+ # on Unix we need a g++ link, not gcc.
128
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
129
+ end
130
+
131
+ when /openbsd/
132
+ # OpenBSD branch contributed by Guillaume Sellier.
133
+
134
+ # on Unix we need a g++ link, not gcc. On OpenBSD, linking against libstdc++ have to be explicitly done for shared libs
135
+ CONFIG['LDSHARED'] = "$(CXX) -shared -lstdc++ -fPIC"
136
+ CONFIG['LDSHAREDXX'] = "$(CXX) -shared -lstdc++ -fPIC"
137
+
138
+ when /darwin/
139
+ # on Unix we need a g++ link, not gcc.
140
+ # Ff line contributed by Daniel Harple.
141
+ CONFIG['LDSHARED'] = "$(CXX) " + CONFIG['LDSHARED'].split[1..-1].join(' ')
142
+
143
+ when /linux/
144
+ add_define 'HAVE_EPOLL' if have_func('epoll_create', 'sys/epoll.h')
145
+
146
+ # on Unix we need a g++ link, not gcc.
147
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
148
+
149
+ when /aix/
150
+ CONFIG['LDSHARED'] = "$(CXX) -shared -Wl,-G -Wl,-brtl"
151
+
152
+ when /cygwin/
153
+ # For rubies built with Cygwin, CXX may be set to CC, which is just
154
+ # a wrapper for gcc.
155
+ # This will compile, but it will not link to the C++ std library.
156
+ # Explicitly set CXX to use g++.
157
+ CONFIG['CXX'] = "g++"
158
+ # on Unix we need a g++ link, not gcc.
159
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
160
+
161
+ else
162
+ # on Unix we need a g++ link, not gcc.
163
+ CONFIG['LDSHARED'] = "$(CXX) -shared"
164
+ end
165
+
166
+
167
+ # solaris c++ compiler doesn't have make_pair()
168
+ TRY_LINK.sub!('$(CC)', '$(CXX)')
169
+ add_define 'HAVE_MAKE_PAIR' if try_link(<<SRC, '-lstdc++')
170
+ #include <utility>
171
+ using namespace std;
172
+ int main(){ pair<int,int> tuple = make_pair(1,2); }
173
+ SRC
174
+ TRY_LINK.sub!('$(CXX)', '$(CC)')
175
+
176
+ create_makefile "rubyeventmachine"