ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/Makefile.PL
Revision: 1.60
Committed: Mon Nov 3 15:25:12 2008 UTC (15 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.59: +5 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 use 5.005;
2
3 use strict;
4 use ExtUtils::MakeMaker;
5 use Config;
6
7 $|=1;
8
9 my $DEFINE;
10 my @LIBS = [];
11
12 # check for completely broken platforms (such as netbsd)
13 if ($Config{usethreads} && $^O eq "netbsd") {
14 print <<EOF;
15
16 ***
17 *** Your platform is BROKEN - netbsd pthreads are known to be completely broken.
18 *** There is *no* way to implement coroutines on this platform until the bugs
19 *** are fixed (this has been true for at least netbsd version 4.0).
20 ***
21 *** This affects many modules currently, so the recommended build option
22 *** for perl is to DISABLE THREAD support - it serves no practical purpose
23 *** on POSIX systems anyways, except that it slows down your programs a lot
24 *** and uses a lot more memory than fork (perl threads do not give you threads,
25 *** they are only windows-process emulation ported to unix).
26 ***
27 *** If you really want to try building Coro on your broken platform, enter
28 *** "yes" at the prompt - report back if the bugs is fixed please. (Oh,
29 *** and try out BDB or IO::AIO which suffer from other threading bugs on
30 *** netbsd that never seem to get fixed).
31 ***
32
33 EOF
34
35 print "prompt> "; <STDIN> =~ /^yes/ or exit 1;
36 }
37
38 print <<EOF;
39
40 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
41
42 Coro has a number of configuration options. Due to its maturity, the
43 defaults that Coro chooses are usually fine, so you can decide to skip
44 these questions. Only if something went wrong you should select 'n'
45 here and manually configure Coro, and, of course, report this to the
46 maintainer :)
47
48 EOF
49
50 if (prompt ("Skip further questions and use defaults (y/n)?", "y") =~ /[yY]/) {
51 $ENV{PERL_MM_USE_DEFAULT} = 1;
52 }
53
54
55 $DEFINE .= " -DHAVE_MMAP" if $Config{d_mmap} eq "define" && $Config{d_munmap} eq "define";
56
57 my $iface;
58
59 if (exists $ENV{CORO_INTERFACE}) {
60 $iface = $ENV{CORO_INTERFACE};
61
62 } elsif ($^O =~ /win32/i or $^O =~ /cygwin/ or $^O =~ /mswin/) {
63 $iface = 'w';
64
65 } elsif ($^O =~ /irix/) {
66 $iface = "i";
67
68 } elsif ($^O =~ /linux/) {
69 # default to assembly on x86 and x86_64, and setjmp on others
70 $iface = $Config{archname} =~ /^(i[3456]86|amd64|x86_64)-/ && $Config{optimize} =~ /-O/ ? "a" : "s";
71
72 } elsif ($^O =~ /(free|net|open)bsd/) {
73 # FreeBSD 4.x has ucontext.h but no makecontext et al. (see BUGS section of
74 # man context). Assume the same problem for all other BSDs.
75
76 # netbsd is totally broken (pthreads are incomaptible with ucontext or other stack switchign mechanisms)
77
78 # therefore, default to setjmp
79 $iface = "s";
80
81 } elsif ($^O =~ /solaris/) {
82 $iface = "s";
83
84 } elsif ($^O =~ /darwin/) {
85 $iface = "s";
86
87 } elsif ($^O =~ /dragonfly/) {
88 # ucontext is totally broken on dragonfly bsd:
89 # Fatal error 'siglongjmp()ing between thread contexts is undefined by POSIX 1003.1
90 $iface = "s";
91
92 } elsif (-e "/usr/include/ucontext.h") { # shame on this heuristic
93 $iface = "u";
94
95 } else {
96 $iface = "s";
97 }
98
99 print <<EOF;
100
101 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
102
103 Coro can use a number of methods to implement coroutines at the C
104 level. The default chosen is based on your current confguration and is
105 correct in most cases, but you still can chose between these alternatives:
106
107 u The unix 'ucontext.h' functions are relatively new and not implemented
108 or well-tested in older unices. They allow very fast coroutine creation
109 and reasonably fast switching, and, most importantly, are very stable.
110 They are, however, usually slower than the other alternatives due to an
111 extra syscall done by swapcontext.
112
113 s If the ucontext functions are not working or you don't want
114 to use them for other reasons you can try a workaround using
115 setjmp/longjmp/sigaltstack (also standard unix functions). Coroutine
116 creation is rather slow, but switching is very fast (often much faster
117 than with the ucontext functions). Unfortunately, glibc-2.1 and
118 below don't even feature a working sigaltstack. You cannot use this
119 implementation if some other code uses SIGUSR2 or you plan to
120 create coroutines from an alternative signal stack, as both are being
121 used for coroutine creation.
122
123 a Handcoded assembly. This is the fastest and most compatible method
124 with the least side effects, if it works, that is. It has been tested
125 on GNU/Linux x86 and x86_64 systems and should work on all x86/x86_64
126 systems using the SVR ELF ABI (it is also reported to be working on
127 Strawberry Perl for Windows using MinGW). This is the recommended
128 method on supported platforms. Note that you usually have to compile
129 this module with optimisation enabled for this method to work. When in
130 doubt, use another method, such as (s)etjmp/longjmp.
131
132 l GNU/Linux. Very old GNU/Linux systems (glibc-2.1 and below) need
133 this hack. Since it is very linux-specific it is also quite fast and
134 recommended even for newer versions; when it works, that is (currently
135 x86 and a few others only. If it compiles, it's usually ok). Newer
136 glibc versions (>= 2.5) stop working with this implementation again.
137
138 i IRIX. For some reason, SGI really does not like to follow the single
139 unix specification (does that surprise you?), so this workaround might
140 be needed (it's fast), although [s] and [u] should also work now.
141
142 w Microsoft Windows. Try this on Microsoft Windows when using Cygwin or
143 the MSVC compilers (e.g. ActiveState Perl, but see "a" for Strawberry
144 Perl), although, as there is no standard on how to do this under
145 windows, different environments might work differently. Doh.
146
147 p Use pthread API. Try to avoid this option, it was only created to make
148 a point about the programming language shootout and might leak threads.
149 It might work fine as a last resort, however.
150
151 For most systems, the default chosen should be OK. If you experience
152 problems then you should experiment with this setting and/or turn
153 optimisations on or off (make OPTIMIZE=-O or -O0).
154
155 EOF
156
157 retry:
158
159 my $r = prompt "Use which implementation,\n" .
160 "<s>et/longjump, <u>context, <a>ssembly, <i>rix, <l>inux or <w>indows?",
161 $iface;
162 $iface = lc $1 if $r =~ /(\S)/;
163
164 if ($iface eq "u") {
165 $DEFINE .= " -DCORO_UCONTEXT";
166 print "\nUsing ucontext implementation\n\n";
167 conftest ("TEST_makecontext");
168 } elsif ($iface eq "s") {
169 $DEFINE .= " -DCORO_SJLJ";
170 print "\nUsing setjmp/longjmp/sigaltstack implementation\n\n";
171 conftest ("TEST_sigaltstack");
172 } elsif ($iface eq "l") {
173 $DEFINE .= " -DCORO_LINUX";
174 print "\nUsing linux-specific implementation\n\n";
175 } elsif ($iface eq "i") {
176 $DEFINE .= " -DCORO_IRIX";
177 print "\nUsing irix-specific implementation\n\n";
178 } elsif ($iface eq "w") {
179 $DEFINE .= " -DCORO_LOSER";
180 print "\nUsing windows-specific implementation\n\n";
181 } elsif ($iface eq "a") {
182 $DEFINE .= " -DCORO_ASM";
183 print "\nUsing handcoded assembly implementation\n\n";
184 } elsif ($iface eq "p") {
185 $DEFINE .= " -DCORO_PTHREAD";
186 @LIBS = ["-lpthread"];
187 print "\nUsing pthread implementation\n\n";
188 } else {
189 print "\nUnknown implementation \"$iface\"\n";
190 goto retry;
191 }
192
193 print <<EOF;
194
195 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
196
197 Per-context stack size factor: Depending on your settings, Coro tries to
198 share the C stacks is creates as much as possible, but sometimes it needs
199 to allocate a new one. This setting controls the maximum size that gets
200 allocated, and should not be set too high, as memory and address space
201 still is wasted even if it's not fully used. The value entered will be
202 multiplied by sizeof(long), which is usually 4 on 32-bit systems, and 8 on
203 64-bit systems.
204
205 A setting of 16384 (the default) therefore corresponds to a 64k..128k
206 stack, which usually is ample space (you might even want to try 8192 or
207 lower if your program creates many coroutines).
208
209 On systems supporting mmap and dynamic memory management, the actual
210 memory usually gets allocated on demand, but with many large stacks you
211 can still run out of address space on your typical 32 bit platform (not to
212 forget the pagetables).
213
214 Some perls (mostly threaded ones and perl compiled under linux 2.6) and
215 some programs (inefficient regexes can use a lot of stack space) may
216 need much, much more: If Coro segfaults with weird backtraces (e.g. in a
217 function prologue) or in t/10_bugs.t, you might want to increase this to
218 65536 or more.
219
220 The default should be fine, and can be changed at runtime with
221 Coro::State::cctx_stacksize.
222
223 EOF
224
225 my $stacksize = prompt ("C stack size factor?", "16384");
226 $DEFINE .= " -DCORO_STACKSIZE=$stacksize";
227
228 print "using a stacksize of $stacksize * sizeof(long)\n";
229
230 print <<EOF;
231
232 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
233
234 Coro can optionally put a guard area before each stack segment: When the
235 stack is too small and the access is not too far outside the stack (i.e.
236 within the guard area), then the program will safely segfault instead of
237 running into other data. The cost is some additional overhead with is
238 usually negligible, and extra use of address space.
239
240 The guard area size currently needs to be specified in pages (typical
241 pagesizes are 4k and 8k). The guard area is only enabled on a few
242 hardcoded architectures and is ignored on others. The actual preprocessor
243 expression disables this feature if:
244
245 !__i386 && !__x86_64 && !__powerpc && !__m68k \
246 && !__alpha && !__mips && !__sparc64
247
248 The default, as usual, should be just fine.
249
250 EOF
251
252 my $stackguard = prompt ("Number of guard pages (0 disables)?", "4");
253 $DEFINE .= " -DCORO_STACKGUARD=$stackguard";
254
255 print <<EOF;
256
257 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
258
259 Coro can tell valgrind about its stacks and so reduce spurious warnings
260 where valgrind would otherwise complain about possible stack switches.
261
262 Enabling this does not incur noticable runtime or memory overhead, but it
263 requires that you have the <valgrind/valgrind.h> header file available.
264
265 Valgrind support is completely optional, so disabling it is the safe
266 choice.
267
268 EOF
269
270 my $valgrind = prompt ("Enable valgrind support (y/n)?",
271 -r "/usr/include/valgrind/valgrind.h" ? "y" : "n");
272 $DEFINE .= " -DCORO_USE_VALGRIND=1" if $valgrind =~ /[yY]/;
273
274
275 print <<EOF;
276
277 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
278
279 Coro can use (or even trick) some perl functions into doing what it needs
280 instead of relying on (some) of its own functions. This might increase
281 chances that it compiles and works, but it could just as well result in
282 memory leaks, crashes or silent data corruption. It certainly does result
283 in slightly slower speed and higher memory consumption, though, so YOU
284 SHOULD ENABLE THIS OPTION ONLY AS A LAST RESORT.
285
286 EOF
287
288 my $use_internals = prompt ("Prefer perl functions over coro functions (y/n)?", "n");
289 $DEFINE .= " -DCORO_PREFER_PERL_FUNCTIONS=1" if $use_internals =~ /[yY]/;
290
291 print <<EOF;
292
293 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
294
295 EOF
296
297 WriteMakefile(
298 NAME => "Coro::State",
299 VERSION_FROM => "State.pm",
300 DEFINE => $DEFINE,
301 LIBS => @LIBS,
302 DIR => [],
303 );
304
305 sub conftest {
306 my $type = shift;
307
308 print "\nTrying to detect stack growth direction (for $type)\n";
309 print "You might see some warnings, this should not concern you.\n\n";
310 system "$Config{cc} $Config{ccflags} -D$type libcoro/conftest.c";
311
312 my $res = qx<./a.out>;
313 $res =~ s/\s+$//;
314 my ($sp, $ss) = split /,/, $res;
315
316 print "\n\n*****************************************************************************\n";
317 print "If the testsuite fails PLEASE provide the following information\n";
318 print "to Marc Lehmann <schmorp\@schmorp.de>: operating system name, version,\n";
319 print "architecture name and this string '$sp|$ss'. Thanks a lot!\n";#d#
320 print "*****************************************************************************\n\n";
321
322 unlink "a.out";
323 unlink "conftestval";
324 }
325