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