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