ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV/Makefile.PL
Revision: 1.68
Committed: Tue Feb 18 18:26:47 2020 UTC (4 years, 2 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: EV-rel-4_33, EV-rel-4_34, HEAD
Changes since 1.67: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 use strict qw(vars subs);
2 use Canary::Stability EV => 1, 5.008002;
3 use Config;
4 use ExtUtils::MakeMaker;
5
6 sub have_inc($) {
7 scalar grep -r "$_/$_[0]", $Config{usrinc}, split / /, $Config{incpth}
8 }
9
10 my $DEFINE;
11
12 unless (-e "libev/ev_iouring.c") {
13 print <<EOF;
14
15 ***
16 *** ERROR: libev is missing or damaged. If you used a CVS check-out of EV,
17 *** you also have to check-out the "libev" module from the same CVS
18 *** repository into the EV dir (i.e. EV/libev from outside).
19 ***
20
21 EOF
22 exit 1;
23 }
24
25 print <<EOF;
26
27 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
28
29
30 Welcome to EV configuration. If you are in a hurry, just press return here
31 and hope for the best. The defaults should usually do.
32
33 EOF
34
35 if (prompt ("Skip further questions and use defaults (y/n)?", "y") =~ /[yY]/) {
36 $ENV{PERL_MM_USE_DEFAULT} = 1;
37 }
38
39 print <<EOF;
40
41 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
42
43
44 POSIX optionally offers support for a monotonic clock source. EV
45 can take advantage of this clock source to detect time jumps more
46 reliably. Unfortunately, some systems are bound to be broken, so you can
47 disable this here: you can completely disable the detection and use of
48 the monotonic clock by answering 'n' here. Support for this clock type
49 will otherwise be autodetected at both compile- and runtime. (this setting
50 currently affects the use of nanosleep over select as well).
51
52 EOF
53
54 unless (prompt ("Enable optional support for CLOCK_MONOTONIC (y/n)?", "y") =~ /[yY]/) {
55 $DEFINE .= " -DEV_USE_MONOTONIC=0";
56 }
57
58 print <<EOF;
59
60 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
61
62
63 POSIX optionally offers support for a (potentially) high-resolution
64 realtime clock interface. In a good implementation, using it is faster
65 than the normal method of using gettimeofday. Unfortunately, this option
66 is also bound to be broken on some systems, and current EV versions do not
67 actually call gettimeofday very often, so it defaults to no.
68
69 EOF
70
71 $DEFINE .= " -DEV_USE_REALTIME=" . (0 + (prompt ("Prefer clock_gettime (CLOCK_REALTIME) over gettimeofday (y/n)?", "n") =~ /[yY]/));
72
73 print <<EOF;
74
75 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
76
77
78 EV can use various backends with various portability issues. The select
79 backend is the most portable and makes for a good fallback, but it can be
80 limited to a low number of file descriptors and/or might not compile. If
81 you have problems with compiling ev_select.c, you might try to play around
82 with disabling it here, or forcing it to use the fd_set provided by your
83 OS, via the next question. I highly recommend keeping it in.
84
85 EOF
86
87 if (prompt ("Enable select backend (y/n)?", "y") =~ /[yY]/) {
88 $DEFINE .= " -DEV_USE_SELECT=1";
89
90 print <<EOF;
91
92 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
93
94
95 The select backend can operate in two modes. One uses the system-provided
96 fd_set and is usually limited to 1024 file descriptors (64 on windows),
97 the other requires your header files to define NFDBITS and declare a
98 suitable fd_mask type. If you run into problems compiling ev_select.c, you
99 can try forcing the use of the system fd_set here.
100
101 EOF
102
103 if (prompt ("Force use of system fd_set for select backend (y/n)?", "n") =~ /[yY]/) {
104 $DEFINE .= " -DEV_SELECT_USE_FD_SET";
105 }
106 } else {
107 $DEFINE .= " -DEV_USE_SELECT=0";
108 }
109
110 print <<EOF;
111
112 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
113
114
115 The second very portable backend is poll(2). It does not exist on windows
116 and various versions of Mac OS X (and on the other versions it simply
117 doesn't work), but works basically everywhere else. It is recommended to use
118 the default here unless you run into compilation problems in ev_poll.c.
119
120 EOF
121
122 $DEFINE .= " -DEV_USE_POLL=" . (0 + (prompt ("Enable poll backend (y/n)?", (have_inc "poll.h") ? "y" : "n") =~ /[yY]/));
123
124 print <<EOF;
125
126 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
127
128
129 Select and poll make it hard to write efficient servers, especially if the
130 number of active connections is much lower than the watched ones. GNU/Linux
131 systems have a more scalable method called "epoll", which EV can use. For
132 this to work, both your kernel and glibc have to support epoll, but if you
133 can compile it, the detection will be done at runtime, and EV will safely
134 fall back to using select when epoll isn't available. If unsure, accept
135 the default.
136
137 EOF
138
139 my $can_epoll = have_inc "sys/epoll.h";
140 $can_epoll = $ENV{EV_EPOLL} if exists $ENV{EV_EPOLL};
141 $DEFINE .= " -DEV_USE_EPOLL=" . (0 + (prompt ("Enable epoll backend (y/n)?", $can_epoll ? "y" : "n") =~ /[yY]/));
142
143 print <<EOF;
144
145 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
146
147
148 Linux 4.18 introduced another event polling interface, this time using
149 the Linux AIO API. While this API is far superior to epoll and almost
150 rivals kqueue, it also suffers from the same issues as kqueue typically
151 does: only a subset of file types are supported (as of 4.19, I have seen
152 eventfd, pipes, sockets files and some devices, but no ttys). It also
153 is subject arbitrary system-wide limits imposed on it. Therefore, this
154 backend is not used by default, even when it is compiled in, and you have
155 to request it explicitly, e.g. with LIBEV_FLAGS=64. If unsure, accept the
156 default.
157
158 EOF
159
160 my $can_linuxaio = have_inc "linux/aio_abi.h";
161 $can_linuxaio = $ENV{EV_LINUXAIO} if exists $ENV{EV_LINUXAIO};
162 $can_linuxaio = 0 + (prompt ("Enable linux aio backend (y/n)?", $can_linuxaio ? "y" : "n") =~ /[yY]/);
163 $DEFINE .= " -DEV_USE_LINUXAIO=$can_linuxaio";
164
165 if ($can_linuxaio) {
166 print <<EOF;
167
168 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
169
170
171 The previously mentioned Linux AIO backend is experimental and will not
172 be used unless requested explicitly. You can, howeer, choose to make ti a
173 recommended basckend, which means it will be chosen if available even when
174 not explicitly asked for, in preference to epoll on GNU/Linux. This option
175 is likely temporary. When unsure, accept the default.
176
177 EOF
178
179 my $recommend_linuxaio = 0;
180 $recommend_linuxaio = $ENV{EV_RECOMMEND_LINUXAIO} if exists $ENV{EV_RECOMMEND_LINUXAIO};
181 $recommend_linuxaio = 0 + (prompt ("Treat linux aio as a recommended backend (y/n)?", $recommend_linuxaio ? "y" : "n") =~ /[yY]/);
182 $DEFINE .= " -DEV_RECOMMEND_LINUXAIO=$recommend_linuxaio";
183 }
184
185 print <<EOF;
186
187 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
188
189
190 Linux 4.19 introduced another event polling interface, "io_uring". While
191 this API is far superior to epoll and almost rivals linuxaio, it also
192 suffers from the same issues as kqueue typically does: only a subset of
193 file types are supported (as of 5.2). It is also very buggy still, and
194 most importantly, very very slow for most workloads. Therefore, this
195 backend is not used by default, even when it is compiled in, and you have
196 to request it explicitly, e.g. with LIBEV_FLAGS=128. If unsure, accept the
197 default.
198
199 EOF
200
201 my $can_iouring = have_inc "linux/fs.h";
202 $can_iouring = $ENV{EV_IOURING} if exists $ENV{EV_IOURING};
203 $can_iouring = 0 + (prompt ("Enable linux io_uring backend (y/n)?", $can_iouring ? "y" : "n") =~ /[yY]/);
204 $DEFINE .= " -DEV_USE_IOURING=$can_iouring";
205
206 if ($can_iouring) {
207 print <<EOF;
208
209 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
210
211
212 The previously mentioned Linux io_uring is experimental and will not be
213 used unless requested explicitly. You can, howeer, choose to make ti a
214 recommended basckend, which means it will be chosen if available even when
215 not explicitly asked for, in preference to epoll on GNU/Linux. This option
216 is likely temporary. When unsure, accept the default.
217
218 EOF
219
220 my $recommend_iouring = 0;
221 $recommend_iouring = $ENV{EV_RECOMMEND_IOURING} if exists $ENV{EV_RECOMMEND_IOURING};
222 $recommend_iouring = 0 + (prompt ("Treat io_uring as a recommended backend (y/n)?", $recommend_iouring ? "y" : "n") =~ /[yY]/);
223 $DEFINE .= " -DEV_RECOMMEND_IOURING=$recommend_iouring";
224 }
225
226 print <<EOF;
227
228 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
229
230
231 EV can take advantage of kqueue on many BSD systems. Support for kqueue
232 will be detected at runtime, with a safe fallback to other methods when it
233 cannot be used.
234
235 Note that kqueue is subtly broken on most operating systems, so by default
236 it won't be used on many platforms, but you can still create your own
237 event loop with kqueue backend if you ask specifically for it.
238
239 Here is what we know:
240
241 NetBSD: partially working in at least 3.1 and later. Yeah! :)
242 FreeBSD: broken on at least 6.2-STABLE, spotty in later versions,
243 sockets *likely* work, ptys definitely don't.
244 OpenBSD: reports indicate that it likely doesn't work
245 (similar problems as on FreeBSD).
246 OS X: completely, utterly broken on at least <= 10.6.
247
248 EOF
249
250 # minix has all the header files, but no implementation. won-der-ful.
251 my $can_kqueue = have_inc "sys/event.h" && $^O ne "minix";
252 $can_kqueue = $ENV{EV_KQUEUE} if exists $ENV{EV_KQUEUE};
253 $DEFINE .= " -DEV_USE_KQUEUE=" . (0 + (prompt ("Enable kqueue backend (y/n)?", $can_kqueue ? "y" : "n") =~ /[yY]/));
254
255 print <<EOF;
256
257 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
258
259
260 Similarly to the kqueue backend above, EV can take advantage of the
261 solaris 10 event port interface. Support for event ports will be detected
262 at runtime, with a safe fallback to other methods when it cannot be used.
263
264 EOF
265
266 $DEFINE .= " -DEV_USE_PORT=" . (0 + (prompt ("Enable event port backend (y/n)?", (have_inc "sys/port.h") ? "y" : "n") =~ /[yY]/));
267
268 print <<EOF;
269
270 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
271
272
273 EV needs the functions pthread_atfork and clock_gettime. On most systems
274 you need some special libraries for this (such as -lrt and -lpthread). You
275 can specify additional libraries to provide these calls (and any other
276 required by EV) now, or accept the default.
277
278 On GNU/Linux systems, EV uses the LSB 3.1 __register_atfork function
279 to avoid the dependency on libpthread, and directly uses the clock_gettime
280 syscall to avoid a dependency on librt.
281
282 EOF
283
284 my $solaris_libs = $^O =~ /solaris/i ? "-lsocket -lnsl" : "";
285 my $librt = $^O =~ /linux/i ? "" : "-lpthread -lrt";
286 my $LIBS = exists $ENV{EV_LIBS} ? $ENV{EV_LIBS} : "$librt $solaris_libs";
287 $LIBS = prompt "Extra libraries for pthread_atfork and clock_gettime?", $LIBS;
288
289
290 print <<EOF;
291
292 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
293
294
295 A backend of a different kind is the Linux inotify(7) interface, which can
296 be used to speed up (and reduce resource consumption) of stat watchers. If
297 you have the include file and libc support for it, it is usually a good
298 idea to enable it, as kernel availability is detected at runtime.
299
300 EOF
301
302 my $can_inotify = have_inc "sys/inotify.h";
303 $can_inotify = $ENV{EV_INOTIFY} if exists $ENV{EV_INOTIFY};
304 $DEFINE .= " -DEV_USE_INOTIFY=" . (0 + (prompt ("Enable inotify support (y/n)?", $can_inotify ? "y" : "n") =~ /[yY]/));
305
306 print <<EOF;
307
308 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
309
310
311 Another useful bit of functionality is the Linux eventfd, which is useful
312 for faster signal handling (don't care) and intra-thread communications
313 (more relevant). Kernel support for this will be probed at runtime, but
314 your libc must contain the necessary wrapper. Glibc 2.7 and later should
315 have this wrapper.
316
317 EOF
318
319 my $can_eventfd = have_inc "sys/eventfd.h";
320 $can_eventfd = $ENV{EV_EVENTFD} if exists $ENV{EV_EVENTFD};
321 $DEFINE .= " -DEV_USE_EVENTFD=" . (0 + (prompt ("Enable linux eventfd support (y/n)?", $can_eventfd ? "y" : "n") =~ /[yY]/));
322
323 print <<EOF;
324
325 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
326
327
328 Another sometimes useful bit of functionality is the Linux signalfd, which
329 is useful for faster signal handling (don't care). Kernel support for
330 this will be probed at runtime, but your libc must contain the necessary
331 wrapper. Glibc 2.7 and later should have this wrapper.
332
333 EOF
334
335 my $can_signalfd = have_inc "sys/signalfd.h";
336 $can_signalfd = $ENV{EV_SIGNALFD} if exists $ENV{EV_SIGNALFD};
337 $DEFINE .= " -DEV_USE_SIGNALFD=" . (0 + (prompt ("Enable linux signalfd support (y/n)?", $can_signalfd ? "y" : "n") =~ /[yY]/));
338
339 print <<EOF;
340
341 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
342
343
344 Linux kernels can notify userspace about realtime clock timejumps
345 using timerfd. Libev by default will try to take advantage of this if
346 possible. You can completely disable the detection and use of timerfd for
347 this purpose by answering 'n' here. Support for timerfd will otherwise be
348 autodetected at both compile- and runtime.
349
350 EOF
351
352 unless (prompt ("Enable optional support for timerfd to detect timejumps (y/n)?", "y") =~ /[yY]/) {
353 $DEFINE .= " -DEV_USE_TIMERFD=0";
354 }
355
356 print <<EOF;
357
358 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
359
360
361 Libev contains numerous internal assert() invocations to check for
362 consistency and user errors. These are normally enabled, but most
363 perl builds disable this error reporting mechanism by default. You
364 can re-enable these asserts here. Enabling them might help you catch
365 programming bugs earlier, but might cause a small slowdown. Also, failures
366 will be reported by aboritng your program, instead of throwing a perl
367 exception.
368
369 If unsure, enable this if you only use this perl installation for
370 development, and leave it off for use in production environments.
371
372 EOF
373
374 my $enable_assertions = 0;
375 $enable_assertions = 0 + (prompt ("Make sure assertions are enabled? (y/n)?", $enable_assertions ? "y" : "n") =~ /[yY]/);
376 $DEFINE .= " -DEV_ENABLE_ASSERTIONS=1" if $enable_assertions;
377
378 print <<EOF;
379
380 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
381
382
383 Very rarely, people want to tweak EV even more, e.g. to exclude
384 or include certain watcher types or backends. This can be done by adding
385 extra -D options here, or via the EV_EXTRA_DEFS environment variable.
386
387 For example, if you run into compilation problems because of missing memory
388 fences (or you just want extra performance), you can tell EV to not support
389 smp and threads via -DEV_NO_THREADS.
390
391 Most people would just press enter.
392
393 EOF
394
395 $DEFINE .= " " . prompt "Any extra -D options?", "$ENV{EV_EXTRA_DEFS}";
396
397 print <<EOF;
398
399 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
400
401
402 EOF
403
404 my @anyevent = eval { require AnyEvent; $AnyEvent::VERSION < 5.29 } ? (AnyEvent => 5.29) : ();
405
406 WriteMakefile(
407 dist => {
408 PREOP => 'pod2text EV.pm | tee README >$(DISTVNAME)/README; chmod -R u=rwX,go=rX . ;',
409 COMPRESS => 'gzip -9v',
410 SUFFIX => '.gz',
411 },
412 depend => {
413 "EV.c" => "EV/EVAPI.h "
414 . "libev/ev.c libev/ev.h libev/ev_epoll.c libev/ev_select.c libev/ev_kqueue.c libev/ev_poll.c libev/ev_linuxaio.c "
415 . "libev/ev_vars.h libev/ev_wrap.h",
416 },
417 INC => "-Ilibev",
418 DEFINE => "$DEFINE",
419 NAME => "EV",
420 LIBS => [$LIBS],
421 PREREQ_PM => {
422 @anyevent,
423 "common::sense" => 0,
424 },
425 CONFIGURE_REQUIRES => { "ExtUtils::MakeMaker" => 6.52, "Canary::Stability" => 0 },
426 VERSION_FROM => "EV.pm",
427 PM => {
428 'EV.pm' => '$(INST_LIB)/EV.pm',
429 'EV/EVAPI.h' => '$(INST_LIB)/EV/EVAPI.h',
430 'EV/MakeMaker.pm' => '$(INST_LIB)/EV/MakeMaker.pm',
431 'libev/ev.h' => '$(INST_LIB)/EV/ev.h',
432 'libev/ev.pod' => '$(INST_LIB)/EV/libev.pod',
433 },
434 MAN3PODS => {
435 'EV.pm' => '$(INST_MAN3DIR)/EV.$(MAN3EXT)',
436 'EV/MakeMaker.pm' => '$(INST_MAN3DIR)/EV::MakeMaker.$(MAN3EXT)',
437 'libev/ev.pod' => '$(INST_MAN3DIR)/EV::libev.$(MAN3EXT)',
438 },
439 );
440