ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV/Makefile.PL
Revision: 1.56
Committed: Sat Sep 6 19:03:28 2014 UTC (9 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.55: +5 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 use 5.008002;
2
3 use strict qw(vars subs);
4 use Config;
5 use ExtUtils::MakeMaker;
6
7 sub have_inc($) {
8 scalar grep -r "$_/$_[0]", $Config{usrinc}, split / /, $Config{incpth}
9 }
10
11 my $DEFINE;
12
13 unless (-e "libev/ev_epoll.c") {
14 print <<EOF;
15
16 ***
17 *** ERROR: libev is missing or damaged. If you used a CVS check-out of EV,
18 *** you also have to check-out the "libev" module from the same CVS
19 *** repository into the EV dir (i.e. EV/libev from outside).
20 ***
21
22 EOF
23 exit 1;
24 }
25
26 print <<EOF;
27
28 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
29
30
31 Welcome to EV configuration. If you are in a hurry, just press return here
32 and hope for the best. The defaults should usually do.
33
34 EOF
35
36 if (prompt ("Skip further questions and use defaults (y/n)?", "y") =~ /[yY]/) {
37 $ENV{PERL_MM_USE_DEFAULT} = 1;
38 }
39
40 print <<EOF;
41
42 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
43
44
45 POSIX optionally offers support for a monotonic clock source. EV
46 can take advantage of this clock source to detect time jumps more
47 reliably. Unfortunately, some systems are bound to be broken, so you can
48 disable this here: you can completely disable the detection and use of
49 the monotonic clock by answering 'n' here. Support for this clock type
50 will otherwise be autodetected at both compile- and runtime. (this setting
51 currently affects the use of nanosleep over select as well).
52
53 EOF
54
55 unless (prompt ("Enable optional support for CLOCK_MONOTONIC (y/n)?", "y") =~ /[yY]/) {
56 $DEFINE .= " -DEV_USE_MONOTONIC=0";
57 }
58
59 print <<EOF;
60
61 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
62
63
64 POSIX optionally offers support for a (potentially) high-resolution
65 realtime clock interface. In a good implementation, using it is faster
66 than the normal method of using gettimeofday. Unfortunately, this option
67 is also bound to be broken on some systems, and current EV versions do not
68 actually call gettimeofday very often, so it defaults to no.
69
70 EOF
71
72 $DEFINE .= " -DEV_USE_REALTIME=" . (0 + (prompt ("Prefer clock_gettime (CLOCK_REALTIME) over gettimeofday (y/n)?", "n") =~ /[yY]/));
73
74 print <<EOF;
75
76 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
77
78
79 EV can use various backends with various portability issues. The select
80 backend is the most portable and makes for a good fallback, but it can be
81 limited to a low number of file descriptors and/or might not compile. If
82 you have problems with compiling ev_select.c, you might try to play around
83 with disabling it here, or forcing it to use the fd_set provided by your
84 OS, via the next question. I highly recommend keeping it in.
85
86 EOF
87
88 if (prompt ("Enable select backend (y/n)?", "y") =~ /[yY]/) {
89 $DEFINE .= " -DEV_USE_SELECT=1";
90
91 print <<EOF;
92
93 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
94
95
96 The select backend can operate in two modes. One uses the system-provided
97 fd_set and is usually limited to 1024 file descriptors (64 on windows),
98 the other requires your header files to define NFDBITS and declare a
99 suitable fd_mask type. If you run into problems compiling ev_select.c, you
100 can try forcing the use of the system fd_set here.
101
102 EOF
103
104 if (prompt ("Force use of system fd_set for select backend (y/n)?", "n") =~ /[yY]/) {
105 $DEFINE .= " -DEV_SELECT_USE_FD_SET";
106 }
107 } else {
108 $DEFINE .= " -DEV_USE_SELECT=0";
109 }
110
111 print <<EOF;
112
113 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
114
115
116 The second very portable backend is poll(2). It does not exist on windows
117 and various versions of Mac OS X (and on the other versions it simply
118 doesn't work), but works basically everywhere else. It is recommended to use
119 the default here unless you run into compile problems in ev_poll.c.
120
121 EOF
122
123 $DEFINE .= " -DEV_USE_POLL=" . (0 + (prompt ("Enable poll backend (y/n)?", (have_inc "poll.h") ? "y" : "n") =~ /[yY]/));
124
125 print <<EOF;
126
127 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
128
129
130 Select and poll make it hard to write efficient servers, especially if the
131 number of active connections is much lower than the watched ones. GNU/Linux
132 systems have a more scalable method called "epoll", which EV can use. For
133 this to work, both your kernel and glibc have to support epoll, but if you
134 can compile it, the detection will be done at runtime, and EV will safely
135 fall back to using select when epoll isn't available. If unsure, accept
136 the default.
137
138 EOF
139
140 my $can_epoll = have_inc "sys/epoll.h";
141 $can_epoll = $ENV{EV_EPOLL} if exists $ENV{EV_EPOLL};
142 $DEFINE .= " -DEV_USE_EPOLL=" . (0 + (prompt ("Enable epoll backend (y/n)?", $can_epoll ? "y" : "n") =~ /[yY]/));
143
144 print <<EOF;
145
146 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
147
148
149 Similarly to the epoll backend above, EV can take advantage of kqueue on
150 many BSD systems. Support for kqueue will be detected at runtime, with a
151 safe fallback to other methods when it cannot be used.
152
153 Note that kqueue is broken on most operating systems, so by default it
154 won't be used on many platforms, but you can still create your own event
155 loop with kqueue backend if you ask specifically for it.
156
157 Here is what we know:
158
159 NetBSD: partially working in at least 3.1 and later. Yeah! :)
160 FreeBSD: broken on at least 6.2-STABLE, spotty in later versions,
161 sockets *likely* work, ptys definitely don't.
162 OpenBSD: reports indicate that it likely doesn't work
163 (similar problems as on FreeBSD).
164 OS X: completely, utterly broken on at least <= 10.6.
165
166 EOF
167
168 my $can_kqueue = have_inc "sys/event.h";
169 $can_kqueue = $ENV{EV_KQUEUE} if exists $ENV{EV_KQUEUE};
170 $DEFINE .= " -DEV_USE_KQUEUE=" . (0 + (prompt ("Enable kqueue backend (y/n)?", $can_kqueue ? "y" : "n") =~ /[yY]/));
171
172 print <<EOF;
173
174 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
175
176
177 Similarly to the kqueue backend above, EV can take advantage of the
178 solaris 10 event port interface. Support for event ports will be detected
179 at runtime, with a safe fallback to other methods when it cannot be used.
180
181 EOF
182
183 $DEFINE .= " -DEV_USE_PORT=" . (0 + (prompt ("Enable event port backend (y/n)?", (have_inc "sys/port.h") ? "y" : "n") =~ /[yY]/));
184
185 print <<EOF;
186
187 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
188
189
190 EV needs the functions pthread_atfork and clock_gettime. On most systems
191 you need some special libraries for this (such as -lrt and -lpthread). You
192 can specify additional libraries to provide these calls (and any other
193 required by EV) now, or accept the default.
194
195 On GNU/Linux systems, EV uses the LSB 3.1 __register_atfork function
196 to avoid the dependency on libpthread, and directly uses the clock_gettime
197 syscall to avoid a dependency on librt.
198
199 EOF
200
201 my $solaris_libs = $^O =~ /solaris/i ? "-lsocket -lnsl" : "";
202 my $librt = $^O =~ /linux/i ? "" : "-lpthread -lrt";
203 my $LIBS = exists $ENV{EV_LIBS} ? $ENV{EV_LIBS} : "$librt $solaris_libs";
204 $LIBS = prompt "Extra libraries for pthread_atfork and clock_gettime?", $LIBS;
205
206
207 print <<EOF;
208
209 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
210
211
212 A backend of a different kind is the Linux inotify(7) interface, which can
213 be used to speed up (and reduce resource consumption) of stat watchers. If
214 you have the include file and libc support for it, it is usually a good
215 idea to enable it, as kernel availability is detected at runtime.
216
217 EOF
218
219 my $can_inotify = have_inc "sys/inotify.h";
220 $can_inotify = $ENV{EV_INOTIFY} if exists $ENV{EV_INOTIFY};
221 $DEFINE .= " -DEV_USE_INOTIFY=" . (0 + (prompt ("Enable inotify support (y/n)?", $can_inotify ? "y" : "n") =~ /[yY]/));
222
223 print <<EOF;
224
225 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
226
227
228 Another useful bit of functionality is the Linux eventfd, which is useful
229 for faster signal handling (don't care) and intra-thread communications
230 (more relevant). Kernel support for this will be probed at runtime, but
231 your libc must contain the necessary wrapper. Glibc 2.7 and later should
232 have this wrapper.
233
234 EOF
235
236 my $can_eventfd = have_inc "sys/eventfd.h";
237 $can_eventfd = $ENV{EV_EVENTFD} if exists $ENV{EV_EVENTFD};
238 $DEFINE .= " -DEV_USE_EVENTFD=" . (0 + (prompt ("Enable linux eventfd support (y/n)?", $can_eventfd ? "y" : "n") =~ /[yY]/));
239
240 print <<EOF;
241
242 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
243
244
245 Another sometimes useful bit of functionality is the Linux signalfd, which
246 is useful for faster signal handling (don't care). Kernel support for
247 this will be probed at runtime, but your libc must contain the necessary
248 wrapper. Glibc 2.7 and later should have this wrapper.
249
250 EOF
251
252 my $can_signalfd = have_inc "sys/signalfd.h";
253 $can_signalfd = $ENV{EV_SIGNALFD} if exists $ENV{EV_SIGNALFD};
254 $DEFINE .= " -DEV_USE_SIGNALFD=" . (0 + (prompt ("Enable linux signalfd support (y/n)?", $can_signalfd ? "y" : "n") =~ /[yY]/));
255
256 print <<EOF;
257
258 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
259
260
261 Very rarely, people want to tweak EV even more, e.g. to exclude
262 or include certain watcher types or backends. This can be done by adding
263 extra -D options here, or via the EV_EXTRA_DEFS environment variable.
264
265 For example, if you run into compile problems because of missing memory
266 fences (or you just want extra performance), you can tell EV to not support
267 smp and threads via -DEV_NO_THREADS.
268
269 Normal persons just press enter.
270
271 EOF
272
273 $DEFINE .= " " . prompt "Any extra -D options?", "$ENV{EV_EXTRA_DEFS}";
274
275 print <<EOF;
276
277 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
278
279
280 EOF
281
282 my @anyevent = eval { require AnyEvent; $AnyEvent::VERSION < 5.29 } ? (AnyEvent => 5.29) : ();
283
284 WriteMakefile(
285 dist => {
286 PREOP => 'pod2text EV.pm | tee README >$(DISTVNAME)/README; chmod -R u=rwX,go=rX . ;',
287 COMPRESS => 'gzip -9v',
288 SUFFIX => '.gz',
289 },
290 depend => {
291 "EV.c" => "EV/EVAPI.h "
292 . "libev/ev.c libev/ev.h libev/ev_epoll.c libev/ev_select.c libev/ev_kqueue.c libev/ev_poll.c "
293 . "libev/ev_vars.h libev/ev_wrap.h",
294 },
295 INC => "-Ilibev",
296 DEFINE => "$DEFINE",
297 NAME => "EV",
298 LIBS => [$LIBS],
299 PREREQ_PM => {
300 @anyevent,
301 "common::sense" => 0,
302 },
303 VERSION_FROM => "EV.pm",
304 PM => {
305 'EV.pm' => '$(INST_LIB)/EV.pm',
306 'EV/EVAPI.h' => '$(INST_LIB)/EV/EVAPI.h',
307 'EV/MakeMaker.pm' => '$(INST_LIB)/EV/MakeMaker.pm',
308 'libev/ev.h' => '$(INST_LIB)/EV/ev.h',
309 'libev/ev.pod' => '$(INST_LIB)/EV/libev.pod',
310 },
311 MAN3PODS => {
312 'EV.pm' => '$(INST_MAN3DIR)/EV.$(MAN3EXT)',
313 'EV/MakeMaker.pm' => '$(INST_MAN3DIR)/EV::MakeMaker.$(MAN3EXT)',
314 'libev/ev.pod' => '$(INST_MAN3DIR)/EV::libev.$(MAN3EXT)',
315 },
316 );
317
318