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