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

# User Rev Content
1 root 1.55 use strict;
2     use ExtUtils::MakeMaker;
3 root 1.2 use Config;
4    
5 root 1.6 $|=1;
6    
7 root 1.55 my $DEFINE;
8     my @LIBS = [];
9 root 1.2
10 root 1.69 my $threads = $Config{usethreads};
11 root 1.57
12 root 1.75 use Config;
13    
14 root 1.44 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 root 1.45 if (prompt ("Skip further questions and use defaults (y/n)?", "y") =~ /[yY]/) {
27 root 1.44 $ENV{PERL_MM_USE_DEFAULT} = 1;
28     }
29    
30    
31 root 1.2 $DEFINE .= " -DHAVE_MMAP" if $Config{d_mmap} eq "define" && $Config{d_munmap} eq "define";
32    
33 root 1.55 my $iface;
34    
35 root 1.65 # 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 root 1.83 # 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 root 1.49 if (exists $ENV{CORO_INTERFACE}) {
46     $iface = $ENV{CORO_INTERFACE};
47 root 1.50
48 root 1.49 } elsif ($^O =~ /win32/i or $^O =~ /cygwin/ or $^O =~ /mswin/) {
49 root 1.69 # nothing works, really, without deep hacks
50 root 1.34 $iface = 'w';
51 root 1.50
52 root 1.14 } elsif ($^O =~ /irix/) {
53 root 1.69 # sigaltstack works like sigstack, i.e. expects stack pointer, not stack base
54     # but wikipeida lists it as 100% posix compliant. geeeee.
55 root 1.14 $iface = "i";
56 root 1.50
57 root 1.4 } elsif ($^O =~ /linux/) {
58 root 1.69 # everything "just works", as expected
59 root 1.65 $iface = $iface_asm || "s";
60 root 1.48
61 root 1.65 } elsif ($^O =~ /freebsd/) {
62 root 1.40 # FreeBSD 4.x has ucontext.h but no makecontext et al. (see BUGS section of
63 root 1.69 # man context).
64 root 1.65 #
65 root 1.69 # FreeBSD 6.2 has marginally working ucontext, setjmp and asm, but
66 root 1.68 # some 5.8.8's barf when threaded due to broken threading.
67 root 1.65
68     $iface = $iface_asm || "s";
69 root 1.50
70 root 1.65 } elsif ($^O =~ /netbsd/) {
71 root 1.75 # netbsd is totally broken (pthreads are incompatible with ucontext or
72 root 1.69 # other stack switching mechanisms) therefore, default to pthread -
73 root 1.75 # hey, it might actually work, with some hacks.
74 root 1.62 $iface = "p";
75 root 1.50
76 root 1.83 if (!$pthread) {
77 root 1.75 # 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 root 1.73 } elsif ($^O =~ /(openbsd|mirbsd)/) {
97 root 1.81 # mirbsd seems to be bug-to-bug compatible openbsd fork,
98 root 1.73 # with the name change being the biggest difference.
99 root 1.83 if (!$pthread) {
100 root 1.82 # asm seems to work, setjmp might, ucontext is missing,
101     # threads lets not talk about
102 root 1.81 # 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 root 1.71
113 root 1.8 } elsif ($^O =~ /solaris/) {
114 root 1.66 # setjmp, ucontext seem to work, as well as asm
115     $iface = $iface_asm || "s";
116 root 1.50
117 root 1.25 } elsif ($^O =~ /darwin/) {
118 root 1.69 # assembler doesn't support .type
119     # ucontext is of course totally broken (it just crashes)
120     # surprisingly, pthreads seem to work
121 root 1.25 $iface = "s";
122 root 1.50
123 root 1.60 } 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 root 1.40 } elsif (-e "/usr/include/ucontext.h") { # shame on this heuristic
129 root 1.3 $iface = "u";
130 root 1.50
131 root 1.2 } else {
132 root 1.3 $iface = "s";
133 root 1.2 }
134    
135 root 1.44 print <<EOF;
136 root 1.2
137 root 1.38 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
138    
139 root 1.40 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 root 1.34
143     u The unix 'ucontext.h' functions are relatively new and not implemented
144 root 1.48 or well-tested in older unices. They allow very fast coroutine creation
145 root 1.78 and reasonably fast switching. They are, however, usually slower than
146 root 1.63 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 root 1.4
151     s If the ucontext functions are not working or you don't want
152 root 1.48 to use them for other reasons you can try a workaround using
153     setjmp/longjmp/sigaltstack (also standard unix functions). Coroutine
154 root 1.49 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 root 1.63 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 root 1.49
161 root 1.63 a Handcoded assembly. This is the fastest and most compatible method,
162 root 1.53 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 root 1.56 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 root 1.63 method on supported platforms. When it doesn't work, use another
167     method, such as (s)etjmp/longjmp.
168 root 1.4
169 root 1.38 l GNU/Linux. Very old GNU/Linux systems (glibc-2.1 and below) need
170 root 1.48 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 root 1.63 glibc versions (>= 2.5) stop working with this implementation however.
174 root 1.14
175 root 1.63 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 root 1.2
179 root 1.56 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 root 1.58 windows, different environments might work differently. Doh.
183 root 1.34
184 root 1.64 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 root 1.63
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 root 1.28
198 root 1.2 EOF
199 root 1.3
200     retry:
201 root 1.14
202 root 1.44 my $r = prompt "Use which implementation,\n" .
203 root 1.75 "<s>etjmp, <u>ctx, <a>sm, <i>rix, <l>inux, <w>indows or <p>threads?",
204 root 1.44 $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 root 1.58 conftest ("TEST_makecontext");
211 root 1.44 } elsif ($iface eq "s") {
212     $DEFINE .= " -DCORO_SJLJ";
213     print "\nUsing setjmp/longjmp/sigaltstack implementation\n\n";
214 root 1.58 conftest ("TEST_sigaltstack");
215 root 1.44 } 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 root 1.49 } elsif ($iface eq "a") {
225     $DEFINE .= " -DCORO_ASM";
226 root 1.75 print "\nUsing handcoded assembler implementation\n\n";
227 root 1.55 } elsif ($iface eq "p") {
228     $DEFINE .= " -DCORO_PTHREAD";
229     @LIBS = ["-lpthread"];
230     print "\nUsing pthread implementation\n\n";
231 root 1.3 } else {
232 root 1.44 print "\nUnknown implementation \"$iface\"\n";
233     goto retry;
234 root 1.3 }
235 root 1.2
236 root 1.36 print <<EOF;
237    
238 root 1.38 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
239    
240     Per-context stack size factor: Depending on your settings, Coro tries to
241 root 1.58 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 root 1.37
248 root 1.38 A setting of 16384 (the default) therefore corresponds to a 64k..128k
249 root 1.40 stack, which usually is ample space (you might even want to try 8192 or
250 root 1.38 lower if your program creates many coroutines).
251 root 1.37
252 root 1.41 On systems supporting mmap and dynamic memory management, the actual
253     memory usually gets allocated on demand, but with many large stacks you
254 root 1.58 can still run out of address space on your typical 32 bit platform (not to
255     forget the pagetables).
256 root 1.41
257 root 1.40 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 root 1.36
263 root 1.47 The default should be fine, and can be changed at runtime with
264     Coro::State::cctx_stacksize.
265 root 1.41
266 root 1.36 EOF
267    
268 root 1.67 my $stacksize = $^O eq "linux" && $] < 5.008008 ? 128 * 1024 : 16384;
269    
270     $stacksize = prompt ("C stack size factor?", $stacksize);
271 root 1.46 $DEFINE .= " -DCORO_STACKSIZE=$stacksize";
272 root 1.36
273     print "using a stacksize of $stacksize * sizeof(long)\n";
274    
275 root 1.38 print <<EOF;
276    
277     *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
278    
279 root 1.58 Coro can optionally put a guard area before each stack segment: When the
280 root 1.41 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 root 1.45 my $stackguard = prompt ("Number of guard pages (0 disables)?", "4");
298 root 1.46 $DEFINE .= " -DCORO_STACKGUARD=$stackguard";
299 root 1.41
300     print <<EOF;
301    
302     *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
303    
304 root 1.43 Coro can tell valgrind about its stacks and so reduce spurious warnings
305     where valgrind would otherwise complain about possible stack switches.
306    
307 root 1.58 Enabling this does not incur noticable runtime or memory overhead, but it
308 root 1.43 requires that you have the <valgrind/valgrind.h> header file available.
309    
310 root 1.58 Valgrind support is completely optional, so disabling it is the safe
311     choice.
312 root 1.43
313     EOF
314    
315 root 1.45 my $valgrind = prompt ("Enable valgrind support (y/n)?",
316 root 1.44 -r "/usr/include/valgrind/valgrind.h" ? "y" : "n");
317 root 1.46 $DEFINE .= " -DCORO_USE_VALGRIND=1" if $valgrind =~ /[yY]/;
318 root 1.43
319 root 1.44
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 root 1.51 in slightly slower speed and higher memory consumption, though, so YOU
329 root 1.58 SHOULD ENABLE THIS OPTION ONLY AS A LAST RESORT.
330 root 1.44
331     EOF
332    
333 root 1.45 my $use_internals = prompt ("Prefer perl functions over coro functions (y/n)?", "n");
334 root 1.46 $DEFINE .= " -DCORO_PREFER_PERL_FUNCTIONS=1" if $use_internals =~ /[yY]/;
335 root 1.44
336 root 1.43 print <<EOF;
337    
338     *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
339    
340 root 1.78 Coro can use a simple JIT compiler to compile a part of the thread switch
341 root 1.79 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 root 1.80 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 root 1.78
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 root 1.70 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 root 1.76 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 root 1.70
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 root 1.38 EOF
378 root 1.36
379 root 1.1 WriteMakefile(
380 root 1.2 NAME => "Coro::State",
381     VERSION_FROM => "State.pm",
382     DEFINE => $DEFINE,
383 root 1.55 LIBS => @LIBS,
384 root 1.2 DIR => [],
385 root 1.62 depend => {
386 root 1.78 "State.c" => "state.h clone.c ecb.h libcoro/coro.h libcoro/coro.c",
387 root 1.62 },
388 root 1.1 );
389 root 1.2
390 root 1.15 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 root 1.32 print "to Marc Lehmann <schmorp\@schmorp.de>: operating system name, version,\n";
404 root 1.15 print "architecture name and this string '$sp|$ss'. Thanks a lot!\n";#d#
405     print "*****************************************************************************\n\n";
406    
407     unlink "a.out";
408 root 1.17 unlink "conftestval";
409 root 1.15 }
410 root 1.2