Smart-build interactive script, initial version
[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 }
51
52
53
54 # Determine converse architecture
55 # net, mpi, ...
56
57 print "Do you have a special network interconnect? [y/N]";
58 $special_network = "false";
59 while($line = <>){
60         chomp $line;
61         if(lc($line) eq "y" || lc($line) eq "yes" ){
62                 $special_network = "true";
63                 last;
64         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq "" ){
65                 last;
66         }
67 }
68
69         
70 $converse_network_type = "net";
71         
72 if($special_network eq "true"){
73         #select type of interconnect here
74         print << "EOF";
75         
76 Choose an interconnect from below: [1-10]
77         1) Infiniband (using OSU MPI)
78         2) Infiniband (native layer alpha version)
79         3) Myrinet GM
80         4) Myrinet MX
81         5) Amasso
82         6) Cray XT3, XT4 (not yet tested on CNL)
83         7) Bluegene/L Native
84         8) Bluegene/L MPI
85         9) Other Vendor MPI
86         10) VMI
87
88 Note: Some other less common options can be found by calling "./build --help"
89
90 EOF
91         
92         while($line = <>){
93                 chomp $line;
94                 if($line eq "1"){
95                         $converse_network_type = "mpi";
96                         last;
97                 } elsif($line eq "2"){
98                         $converse_network_type = "net";
99                         $network_option_string += "ibverbs ";
100                         last;
101                 } elsif($line eq "3"){
102                         $converse_network_type = "net";
103                         $network_option_string += "gm ";
104                         last;
105                 } elsif($line eq "4"){
106                         $converse_network_type = "net";
107                         $network_option_string += "mx ";
108                         last;
109                 } elsif($line eq "5"){
110                         $converse_network_type = "ammasso";
111                         last;
112                 } elsif($line eq "6"){
113                         $converse_network_type = "mpi-crayxt3";
114                         last;
115                 } elsif($line eq "7"){
116                         $arch = "bluegenel";
117                         $compiler = "xlc";
118                         $nobs = "--no-build-shared";
119                         last;
120                 } elsif($line eq "8"){
121                         $converse_network_type = "mpi-bluegenel";
122                         $compiler = "xlc";
123                         $nobs = "--no-build-shared";
124                         last;
125                 } elsif($line eq "9"){
126                         $converse_network_type = "mpi";
127                         last;
128                 } elsif($line eq "10"){
129                         $converse_network_type = "vmi";
130                         last;
131                 } else {
132                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
133                 }
134                 
135         }       
136         
137 }
138
139
140 $target = "LIBS";
141 $arch = "";
142
143 if($converse_network_type eq "ammasso" || 
144    $converse_network_type eq "bluegenel" ||
145    $converse_network_type eq "mpi-bluegenel"||
146    $converse_network_type eq "mpi-crayxt3" ) 
147    {    
148       $arch = $converse_network_type;
149    }
150 else 
151    {
152           $arch = "${converse_network_type}-${arch_os}";
153           if($amd64) {
154                 $arch += "-amd64";
155           } elsif($ia64){
156                 $arch += "-ia64";
157           } elsif($ppc){
158                 $arch += "-ppc";
159           }
160           
161    }
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 if(-e "src/arch/$arch"){
376         print "Building with: ${build_line}\n"; 
377         system($build_line);
378 } else {
379         print "We could not figure out how to build charm with those options on this platform, please manually build\n";
380         print "Try something similar to: ${build_line}\n";
381 }
382
383