ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/Makefile.PL
Revision: 1.54
Committed: Sun Mar 2 16:10:21 2008 UTC (16 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-4_45
Changes since 1.53: +0 -11 lines
Log Message:
*** empty log message ***

File Contents

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