ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/Makefile.PL
Revision: 1.83
Committed: Sun Jul 3 10:51:41 2011 UTC (12 years, 11 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-6_05, rel-6_04, rel-6_03, rel-6_02, rel-6_01
Changes since 1.82: +9 -2 lines
Log Message:
6.01

File Contents

# Content
1 use strict;
2 use ExtUtils::MakeMaker;
3 use Config;
4
5 $|=1;
6
7 my $DEFINE;
8 my @LIBS = [];
9
10 my $threads = $Config{usethreads};
11
12 use Config;
13
14 print <<EOF;
15
16 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
17
18 Coro has a number of configuration options. Due to its maturity, the
19 defaults that Coro chooses are usually fine, so you can decide to skip
20 these questions. Only if something went wrong you should select 'n'
21 here and manually configure Coro, and, of course, report this to the
22 maintainer :)
23
24 EOF
25
26 if (prompt ("Skip further questions and use defaults (y/n)?", "y") =~ /[yY]/) {
27 $ENV{PERL_MM_USE_DEFAULT} = 1;
28 }
29
30
31 $DEFINE .= " -DHAVE_MMAP" if $Config{d_mmap} eq "define" && $Config{d_munmap} eq "define";
32
33 my $iface;
34
35 # default to assembly on x86 and x86_64 sometimes
36 my $iface_asm = $Config{archname} =~ /^(i[3456]86|amd64|x86_64)-/ ? "a" : undef;
37
38 # detect whether this perl is threaded, for those broken operating
39 # systems that need it.
40
41 my $pthread = $Config{libs} =~ /-lpthread/
42 || $Config{ldflags} =~ /-pthread/
43 || $Config{archname} =~ /-thread/;
44
45 if (exists $ENV{CORO_INTERFACE}) {
46 $iface = $ENV{CORO_INTERFACE};
47
48 } elsif ($^O =~ /win32/i or $^O =~ /cygwin/ or $^O =~ /mswin/) {
49 # nothing works, really, without deep hacks
50 $iface = 'w';
51
52 } elsif ($^O =~ /irix/) {
53 # sigaltstack works like sigstack, i.e. expects stack pointer, not stack base
54 # but wikipeida lists it as 100% posix compliant. geeeee.
55 $iface = "i";
56
57 } elsif ($^O =~ /linux/) {
58 # everything "just works", as expected
59 $iface = $iface_asm || "s";
60
61 } elsif ($^O =~ /freebsd/) {
62 # FreeBSD 4.x has ucontext.h but no makecontext et al. (see BUGS section of
63 # man context).
64 #
65 # FreeBSD 6.2 has marginally working ucontext, setjmp and asm, but
66 # some 5.8.8's barf when threaded due to broken threading.
67
68 $iface = $iface_asm || "s";
69
70 } elsif ($^O =~ /netbsd/) {
71 # netbsd is totally broken (pthreads are incompatible with ucontext or
72 # other stack switching mechanisms) therefore, default to pthread -
73 # hey, it might actually work, with some hacks.
74 $iface = "p";
75
76 if (!$pthread) {
77 # uh-oh
78 print <<EOF;
79
80 ***
81 *** WARNING: Your platform is known to have broken pthreads, which are
82 *** required for Coro because your platform is known to have broken
83 *** ucontext and setjmp/longjmp functions as well, which are broken
84 *** because your pthread library is broken. D'oh.
85 ***
86 *** Coro will try to fight this vicious circle of breakage, but YMMV. If
87 *** Coro fails, try to recompile your perl with -lpthread, which will work
88 *** around some of the pthread bugs. (You do not have to enable ithreads).
89 ***
90
91 EOF
92 # ugh, pthreads need to be linked into the main program :/
93 $iface = $iface_asm || "s";
94 }
95
96 } elsif ($^O =~ /(openbsd|mirbsd)/) {
97 # mirbsd seems to be bug-to-bug compatible openbsd fork,
98 # with the name change being the biggest difference.
99 if (!$pthread) {
100 # asm seems to work, setjmp might, ucontext is missing,
101 # threads lets not talk about
102 # try setjmp/longjmp on 4.4, but pthread on earlier
103 $iface = $iface_asm || ($Config{osvers} >= 4.4 ? "s" : "p");
104 } else {
105 # seems newer openbsd platforms have marginally working pthreads, but
106 # their pthreads break sigaltstack - reading the sigaltstack sources
107 # again shows how fundamentally clueless those people are (if no thread
108 # has ever been created, then the program is bound to a kernel-scheduled
109 # entity. get that? GET THAT?)
110 $iface = "p";
111 }
112
113 } elsif ($^O =~ /solaris/) {
114 # setjmp, ucontext seem to work, as well as asm
115 $iface = $iface_asm || "s";
116
117 } elsif ($^O =~ /darwin/) {
118 # assembler doesn't support .type
119 # ucontext is of course totally broken (it just crashes)
120 # surprisingly, pthreads seem to work
121 $iface = "s";
122
123 } elsif ($^O =~ /dragonfly/) {
124 # ucontext is totally broken on dragonfly bsd:
125 # Fatal error 'siglongjmp()ing between thread contexts is undefined by POSIX 1003.1
126 $iface = "s";
127
128 } elsif (-e "/usr/include/ucontext.h") { # shame on this heuristic
129 $iface = "u";
130
131 } else {
132 $iface = "s";
133 }
134
135 print <<EOF;
136
137 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
138
139 Coro can use a number of methods to implement coroutines at the C
140 level. The default chosen is based on your current confguration and is
141 correct in most cases, but you still can chose between these alternatives:
142
143 u The unix 'ucontext.h' functions are relatively new and not implemented
144 or well-tested in older unices. They allow very fast coroutine creation
145 and reasonably fast switching. They are, however, usually slower than
146 the other alternatives due to an extra syscall done by swapcontext. And
147 while nominally most portable (it's the only POSIX-standardised
148 interface for coroutines), ucontext functions are, as usual, broken on
149 most/all BSDs.
150
151 s If the ucontext functions are not working or you don't want
152 to use them for other reasons you can try a workaround using
153 setjmp/longjmp/sigaltstack (also standard unix functions). Coroutine
154 creation is rather slow, but switching is very fast (often much faster
155 than with the ucontext functions). Unfortunately, glibc-2.1 and
156 below don't even feature a working sigaltstack. You cannot use this
157 implementation if some other code uses SIGUSR2 or you plan to create
158 coroutines from an alternative signal stack, as both are being used for
159 coroutine creation.
160
161 a Handcoded assembly. This is the fastest and most compatible method,
162 with the least side effects, if it works, that is. It has been tested
163 on GNU/Linux x86 and x86_64 systems and should work on all x86/x86_64
164 systems using the SVR ELF ABI (it is also reported to be working on
165 Strawberry Perl for Windows using MinGW). This is the recommended
166 method on supported platforms. When it doesn't work, use another
167 method, such as (s)etjmp/longjmp.
168
169 l GNU/Linux. Very old GNU/Linux systems (glibc-2.1 and below) need
170 this hack. Since it is very linux-specific it is also quite fast and
171 recommended even for newer versions; when it works, that is (currently
172 x86 and a few others only. If it compiles, it's usually ok). Newer
173 glibc versions (>= 2.5) stop working with this implementation however.
174
175 i IRIX. For some reason, SGI really does not like to follow POSIX (does
176 that surprise you?), so this workaround might be needed (it's fast),
177 although [s] and [u] should also work now.
178
179 w Microsoft Windows. Try this on Microsoft Windows when using Cygwin or
180 the MSVC compilers (e.g. ActiveState Perl, but see "a" for Strawberry
181 Perl), although, as there is no standard on how to do this under
182 windows, different environments might work differently. Doh.
183
184 p Use pthread API. Try to avoid this option, it was only created to
185 make a point about the programming language shootout. It is unlikely
186 to work with perls that have windows process emulation enabled ("perl
187 threads"). It is also likely the slowest method of implementing
188 coroutines. It might work fine as a last resort, however, as the
189 pthread API is slightly better tested than ucontext functions for
190 example. Of course, not on BSDs, who usually have very broken pthread
191 implementations.
192
193 Coro tries hard to come up with a suitable default for most systems,
194 so pressing return at the prompt usually does the right thing. If you
195 experience problems (e.g. make test fails) then you should experiment with
196 this setting.
197
198 EOF
199
200 retry:
201
202 my $r = prompt "Use which implementation,\n" .
203 "<s>etjmp, <u>ctx, <a>sm, <i>rix, <l>inux, <w>indows or <p>threads?",
204 $iface;
205 $iface = lc $1 if $r =~ /(\S)/;
206
207 if ($iface eq "u") {
208 $DEFINE .= " -DCORO_UCONTEXT";
209 print "\nUsing ucontext implementation\n\n";
210 conftest ("TEST_makecontext");
211 } elsif ($iface eq "s") {
212 $DEFINE .= " -DCORO_SJLJ";
213 print "\nUsing setjmp/longjmp/sigaltstack implementation\n\n";
214 conftest ("TEST_sigaltstack");
215 } elsif ($iface eq "l") {
216 $DEFINE .= " -DCORO_LINUX";
217 print "\nUsing linux-specific implementation\n\n";
218 } elsif ($iface eq "i") {
219 $DEFINE .= " -DCORO_IRIX";
220 print "\nUsing irix-specific implementation\n\n";
221 } elsif ($iface eq "w") {
222 $DEFINE .= " -DCORO_LOSER";
223 print "\nUsing windows-specific implementation\n\n";
224 } elsif ($iface eq "a") {
225 $DEFINE .= " -DCORO_ASM";
226 print "\nUsing handcoded assembler implementation\n\n";
227 } elsif ($iface eq "p") {
228 $DEFINE .= " -DCORO_PTHREAD";
229 @LIBS = ["-lpthread"];
230 print "\nUsing pthread implementation\n\n";
231 } else {
232 print "\nUnknown implementation \"$iface\"\n";
233 goto retry;
234 }
235
236 print <<EOF;
237
238 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
239
240 Per-context stack size factor: Depending on your settings, Coro tries to
241 share the C stacks is creates as much as possible, but sometimes it needs
242 to allocate a new one. This setting controls the maximum size that gets
243 allocated, and should not be set too high, as memory and address space
244 still is wasted even if it's not fully used. The value entered will be
245 multiplied by sizeof(long), which is usually 4 on 32-bit systems, and 8 on
246 64-bit systems.
247
248 A setting of 16384 (the default) therefore corresponds to a 64k..128k
249 stack, which usually is ample space (you might even want to try 8192 or
250 lower if your program creates many coroutines).
251
252 On systems supporting mmap and dynamic memory management, the actual
253 memory usually gets allocated on demand, but with many large stacks you
254 can still run out of address space on your typical 32 bit platform (not to
255 forget the pagetables).
256
257 Some perls (mostly threaded ones and perl compiled under linux 2.6) and
258 some programs (inefficient regexes can use a lot of stack space) may
259 need much, much more: If Coro segfaults with weird backtraces (e.g. in a
260 function prologue) or in t/10_bugs.t, you might want to increase this to
261 65536 or more.
262
263 The default should be fine, and can be changed at runtime with
264 Coro::State::cctx_stacksize.
265
266 EOF
267
268 my $stacksize = $^O eq "linux" && $] < 5.008008 ? 128 * 1024 : 16384;
269
270 $stacksize = prompt ("C stack size factor?", $stacksize);
271 $DEFINE .= " -DCORO_STACKSIZE=$stacksize";
272
273 print "using a stacksize of $stacksize * sizeof(long)\n";
274
275 print <<EOF;
276
277 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
278
279 Coro can optionally put a guard area before each stack segment: When the
280 stack is too small and the access is not too far outside the stack (i.e.
281 within the guard area), then the program will safely segfault instead of
282 running into other data. The cost is some additional overhead with is
283 usually negligible, and extra use of address space.
284
285 The guard area size currently needs to be specified in pages (typical
286 pagesizes are 4k and 8k). The guard area is only enabled on a few
287 hardcoded architectures and is ignored on others. The actual preprocessor
288 expression disables this feature if:
289
290 !__i386 && !__x86_64 && !__powerpc && !__m68k \
291 && !__alpha && !__mips && !__sparc64
292
293 The default, as usual, should be just fine.
294
295 EOF
296
297 my $stackguard = prompt ("Number of guard pages (0 disables)?", "4");
298 $DEFINE .= " -DCORO_STACKGUARD=$stackguard";
299
300 print <<EOF;
301
302 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
303
304 Coro can tell valgrind about its stacks and so reduce spurious warnings
305 where valgrind would otherwise complain about possible stack switches.
306
307 Enabling this does not incur noticable runtime or memory overhead, but it
308 requires that you have the <valgrind/valgrind.h> header file available.
309
310 Valgrind support is completely optional, so disabling it is the safe
311 choice.
312
313 EOF
314
315 my $valgrind = prompt ("Enable valgrind support (y/n)?",
316 -r "/usr/include/valgrind/valgrind.h" ? "y" : "n");
317 $DEFINE .= " -DCORO_USE_VALGRIND=1" if $valgrind =~ /[yY]/;
318
319
320 print <<EOF;
321
322 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
323
324 Coro can use (or even trick) some perl functions into doing what it needs
325 instead of relying on (some) of its own functions. This might increase
326 chances that it compiles and works, but it could just as well result in
327 memory leaks, crashes or silent data corruption. It certainly does result
328 in slightly slower speed and higher memory consumption, though, so YOU
329 SHOULD ENABLE THIS OPTION ONLY AS A LAST RESORT.
330
331 EOF
332
333 my $use_internals = prompt ("Prefer perl functions over coro functions (y/n)?", "n");
334 $DEFINE .= " -DCORO_PREFER_PERL_FUNCTIONS=1" if $use_internals =~ /[yY]/;
335
336 print <<EOF;
337
338 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
339
340 Coro can use a simple JIT compiler to compile a part of the thread switch
341 function at runtime. On perls with windows process emulation (most!),
342 this results in a 50% speed improvement. On sane perls, the gain is much
343 less, usually around 5%. If you enable this option, then the JIT will
344 be enabled, on compatible operating systems and CPUs (currently only
345 x86/amd64 on certain unix clones). Otherwise, it will be disabled. It
346 should be safe to leave on - this setting is only here so you can switch
347 it off in case of problems.
348
349 EOF
350
351 my $orgasm = $ENV{CORO_JIT} || "y";
352 $orgasm = prompt ("Try to use the JIT compiler, if available?", $orgasm);
353 $DEFINE .= " -DCORO_JIT=1" if $orgasm =~ /[yY]/;
354
355 print <<EOF;
356
357 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
358
359 Coro has experimental support for cloning states. This can be used
360 to implement a scheme-like call/cc. However, this doesn't add to the
361 expressiveness in general, and is likely perl-version specific (and perl
362 5.12 deliberately removed support for it). As such, it is disabled by
363 default. Enable it when you want to play around with it, but note that it
364 isn't supported, and unlikely ever will be. It exists mainly to prove that
365 it could be done - if only it were useful for something.
366
367 EOF
368
369 my $masturbate = $ENV{CORO_CLONE} || "n";
370 $masturbate = prompt ("Implement Coro::State->clone method (y/n)?", $masturbate);
371 $DEFINE .= " -DCORO_CLONE=1" if $masturbate =~ /[yY]/;
372
373 print <<EOF;
374
375 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
376
377 EOF
378
379 WriteMakefile(
380 NAME => "Coro::State",
381 VERSION_FROM => "State.pm",
382 DEFINE => $DEFINE,
383 LIBS => @LIBS,
384 DIR => [],
385 depend => {
386 "State.c" => "state.h clone.c ecb.h libcoro/coro.h libcoro/coro.c",
387 },
388 );
389
390 sub conftest {
391 my $type = shift;
392
393 print "\nTrying to detect stack growth direction (for $type)\n";
394 print "You might see some warnings, this should not concern you.\n\n";
395 system "$Config{cc} $Config{ccflags} -D$type libcoro/conftest.c";
396
397 my $res = qx<./a.out>;
398 $res =~ s/\s+$//;
399 my ($sp, $ss) = split /,/, $res;
400
401 print "\n\n*****************************************************************************\n";
402 print "If the testsuite fails PLEASE provide the following information\n";
403 print "to Marc Lehmann <schmorp\@schmorp.de>: operating system name, version,\n";
404 print "architecture name and this string '$sp|$ss'. Thanks a lot!\n";#d#
405 print "*****************************************************************************\n\n";
406
407 unlink "a.out";
408 unlink "conftestval";
409 }
410