added more +bgstacksize
[charm.git] / smart-build.pl
1 #!/usr/bin/perl
2
3 $| = 1;
4
5 print "Begin interactive charm configuration\n\n";
6
7
8 $os = `uname -s`;
9 $cpu = `uname -m`;
10
11 $nobs = "";
12
13 #$cpu = "x86_64\n";
14
15 chomp($os);
16 chomp ($cpu);
17
18 $network_option_string = "";
19 $compiler = "";
20
21 # Determine kernel
22 # linux, darwin, ...
23 if($os eq "Linux"){
24         print "Detected a linux kernel\n";
25         $arch_os = "linux";
26 } elsif($os eq "Darwin"){
27         print "Detected a darwin kernel\n";
28         $arch_os = "darwin";
29 } elsif($os =~ m/BSD/ ){
30         print "Detected a BSD kernel\n";
31         $arch_os = "linux";
32 }
33
34
35 # Determine architecture
36 # x86, ppc, ia64, amd64
37 if($cpu =~ m/i[0-9]86/){
38         print "Detected architecture x86\n";
39         $x86 = 1;
40 } elsif($cpu =~ m/x86\_64/){
41         print "Detected architecture x86_64\n";
42         $amd64 = 1;
43 } elsif($cpu =~ m/ia64/){
44         print "Detected architecture ia64\n";
45         $ia64 = 1;
46         $nobs = "--no-build-shared";
47 } elsif($cpu =~ m/powerpc/){
48         print "Detected architecture ppc\n";
49         $ppc = 1;
50 } elsif($cpu =~ m/Power Mac/){
51   print "Detected architecture ppc\n";
52   $ppc = 1;
53 }
54
55
56
57
58 # Determine converse architecture
59 # net, mpi, ...
60
61 print "Do you have a special network interconnect? [y/N]";
62 $special_network = "false";
63 while($line = <>){
64         chomp $line;
65         if(lc($line) eq "y" || lc($line) eq "yes" ){
66                 $special_network = "true";
67                 last;
68         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq "" ){
69                 last;
70         }
71 }
72
73         
74 $converse_network_type = "net";
75         
76 if($special_network eq "true"){
77         #select type of interconnect here
78         print << "EOF";
79         
80 Choose an interconnect from below: [1-10]
81         1) Infiniband (using OSU MPI)
82         2) Infiniband (native layer alpha version)
83         3) Myrinet GM
84         4) Myrinet MX
85         5) Amasso
86         6) Cray XT3, XT4 (not yet tested on CNL)
87         7) Bluegene/L Native
88         8) Bluegene/L MPI
89         9) Other Vendor MPI
90         10) VMI
91
92 Note: Some other less common options can be found by calling "./build --help"
93
94 EOF
95         
96         while($line = <>){
97                 chomp $line;
98                 if($line eq "1"){
99                         $converse_network_type = "mpi";
100                         last;
101                 } elsif($line eq "2"){
102                         $converse_network_type = "net";
103                         $network_option_string = $network_option_string . "ibverbs ";
104                         last;
105                 } elsif($line eq "3"){
106                         $converse_network_type = "net";
107                         $network_option_string = $network_option_string . "gm ";
108                         last;
109                 } elsif($line eq "4"){
110                         $converse_network_type = "net";
111                         $network_option_string = $network_option_string . "mx ";
112                         last;
113                 } elsif($line eq "5"){
114                         $converse_network_type = "ammasso";
115                         last;
116                 } elsif($line eq "6"){
117                         $converse_network_type = "mpi-crayxt3";
118                         last;
119                 } elsif($line eq "7"){
120                         $arch = "bluegenel";
121                         $compiler = "xlc";
122                         $nobs = "--no-build-shared";
123                         last;
124                 } elsif($line eq "8"){
125                         $converse_network_type = "mpi-bluegenel";
126                         $compiler = "xlc";
127                         $nobs = "--no-build-shared";
128                         last;
129                 } elsif($line eq "9"){
130                         $converse_network_type = "mpi";
131                         last;
132                 } elsif($line eq "10"){
133                         $converse_network_type = "vmi";
134                         last;
135                 } else {
136                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
137                 }
138                 
139         }       
140         
141 }
142
143
144 $target = "LIBS";
145 $arch = "";
146
147 print "arch_os: $arch_os\n";
148 print "converse_network_type: $converse_network_type\n";
149
150 if($converse_network_type eq "ammasso" || 
151    $converse_network_type eq "bluegenel" ||
152    $converse_network_type eq "mpi-bluegenel"||
153    $converse_network_type eq "mpi-crayxt3" ) 
154    {    
155       $arch = $converse_network_type;
156    }
157 else 
158    {
159           $arch = "${converse_network_type}-${arch_os}";
160           print "arch: $arch\n";
161           if($amd64) {
162                 $arch = $arch . "-amd64";
163           } elsif($ia64){
164                 $arch = $arch . "-ia64";
165           } elsif($ppc){
166                 $arch = $arch . "-ppc";
167           }
168           
169    }
170 print "arch: $arch\n";
171
172
173
174 #Cleanup the architectures to match the horrible real world inconsistent src/archs
175
176 if($arch eq "net-darwin"){
177         $arch = "net-darwin-x86";
178 } elsif($arch eq "net-darwin-ppc"){
179         $arch = "net-ppc-darwin";
180 } elsif($arch eq "mpi-darwin-ppc"){
181         $arch = "mpi-ppc-darwin";
182
183
184
185 if($compiler ne ""){
186         print "We determined that you should use the compiler $compiler\n Do you want to use a different compiler?[Y/N]";
187 } else {
188         print "Do you want to specify a compiler? [y/N]";
189 }
190 $special_compiler = "false";
191 while($line = <>){
192         chomp $line;
193         if(lc($line) eq "y" || lc($line) eq "yes" ){
194                 $special_compiler = "true";
195                 last;
196         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq ""){
197                 last;
198         } else {
199                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
200         }
201 }
202
203
204
205
206 # Choose compiler
207 if($special_compiler eq "true"){
208         #select type of interconnect here
209         print << "EOF";
210         
211 Choose a compiler from below: [1-14]
212         1) cc
213         2) cc64
214         3) cxx
215         4) kcc
216         5) pgcc
217         6) acc
218         7) icc
219         8) ecc
220         9) gcc3
221         10) gcc4
222         11) mpcc
223         12) pathscale
224         13) xlc
225         14) xlc64
226
227 EOF
228
229         while($line = <>){
230                 chomp $line;
231                 if($line eq "1"){
232                         $compiler = "cc";
233                         last;
234                 } elsif($line eq "2"){
235                         $compiler = "cc64";
236                         last;
237                 } elsif($line eq "3"){
238                         $compiler = "cxx";
239                         last;
240                 } elsif($line eq "4"){
241                         $compiler = "kcc";
242                         last;
243                 } elsif($line eq "5"){
244                         $compiler = "pgcc";
245                         last;
246                 } elsif($line eq "6"){
247                         $compiler = "acc";
248                         last;
249                 } elsif($line eq "7"){
250                         $compiler = "icc";
251                         last;
252                 } elsif($line eq "8"){
253                         $compiler = "ecc";
254                         last;
255                 } elsif($line eq "9"){
256                         $compiler = "gcc3";
257                         last;
258                 } elsif($line eq "10"){
259                         $compiler = "gcc4";
260                         last;
261                 } elsif($line eq "11"){
262                         $compiler = "mpcc";
263                         last;
264                 } elsif($line eq "12"){
265                         $compiler = "pathscale";
266                         last;
267                 } elsif($line eq "13"){
268                         $compiler = "xlc";
269                         last;
270                 } elsif($line eq "14"){
271                         $compiler = "xlc64";
272                         last;
273                 } else {
274                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
275                 }
276         }
277 }
278
279 # SMP / Multicore
280
281 print "Do you want SMP or multicore support? [y/N]";
282 $smp = "";
283 while($line = <>){
284         chomp $line;
285         if(lc($line) eq "y" || lc($line) eq "yes" ){
286                 $smp = "smp";
287                 last;
288         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq ""){
289                 last;
290         } else {
291                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
292         }
293 }
294
295
296
297
298
299
300
301 # Choose compiler flags
302 print << "EOF";
303         
304 Choose a set of compiler flags [1-4]
305         1) none
306         2) debug
307         3) optimized [default]
308         4) custom
309         
310 EOF
311
312 $compiler_flags = "";
313
314 while($line = <>){
315         chomp $line;
316         if($line eq "1"){
317                 last;
318         } elsif($line eq "2"){
319                 $compiler_flags = "-g -O0";
320                 last;
321         } elsif($line eq "3" || $line eq ""){
322                 $compiler_flags = "-O2 -DCMK_OPTIMIZE";
323                 last;
324         } elsif($line eq "4"){
325
326                 print "Enter compiler options: ";
327                 $input_line = <>;
328                 chomp($input_line);
329                 $compiler_flags = $input_line;
330                 
331                 last;
332         } else {
333                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
334         }
335 }
336
337
338
339
340 print << "EOF";
341
342 What do you want to build?
343         1) Charm++ [default] (choose this if you are building NAMD)
344         2) Charm++, AMPI, ParFUM, FEM and other libraries
345
346 EOF
347
348 while($line = <>){
349         chomp $line;
350         if($line eq "1" || $line eq ""){
351                 $target = "charm++";
352                 $j = "-j4";
353                 last;
354         } elsif($line eq "2"){
355                 $target = "LIBS";
356                 last;
357         } else {
358                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
359         }
360         
361 }
362
363
364
365 if($j ne ""){
366         print "Do you want to do a parallel build (-j4)?[Y/n]";
367         while($line = <>){
368                 chomp $line;
369                 if(lc($line) eq "y" || lc($line) eq "yes" || $line eq ""){
370                         last;
371                 } elsif(lc($line) eq "n" || lc($line) eq "no" ){
372                         $j = "";
373                         last;
374                 } else {
375                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
376                 }
377         }
378 }
379
380
381
382 $build_line = "./build $target $arch ${network_option_string} $compiler $smp $j ${compiler_flags}\n";
383
384 open(BUILDLINE, ">smart-build.log");
385 print BUILDLINE "Using the following build command:\n$build_line\n";
386 close(BUILDLINE);
387
388 if(-e "src/arch/$arch"){
389         print "Building with: ${build_line}\n"; 
390         system($build_line);
391 } else {
392         print "We could not figure out how to build charm with those options on this platform, please manually build\n";
393         print "Try something similar to: ${build_line}\n";
394 }
395
396