Append results to smart-build.log.
[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-12]
94          1) Infiniband (using OSU MPI)
95          2) Infiniband (native layer 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
101          8) Bluegene/L MPI
102          9) Bluegene/P Native
103         10) Bluegene/P MPI
104         11) MPI
105         12) VMI
106
107 EOF
108         
109         while($line = <>){
110                 chomp $line;
111                 if($line eq "1"){
112                         $converse_network_type = "mpi";
113                         last;
114                 } elsif($line eq "2"){
115                         $converse_network_type = "net";
116                         $network_option_string = $network_option_string . "ibverbs ";
117                         last;
118                 } elsif($line eq "3"){
119                         $converse_network_type = "net";
120                         $network_option_string = $network_option_string . "gm ";
121                         last;
122                 } elsif($line eq "4"){
123                         $converse_network_type = "net";
124                         $network_option_string = $network_option_string . "mx ";
125                         last;
126                 } elsif($line eq "5"){
127                         $arch = "ammasso";
128                         last;
129                 } elsif($line eq "6"){
130                         $arch = "mpi-crayxt3";
131                         last;
132                 } elsif($line eq "7"){
133                         $arch = "bluegenel";
134                         $compiler = "xlc";
135                         $nobs = "--no-build-shared";
136                         last;
137                 } elsif($line eq "8"){
138                     $arch = "mpi-bluegenel";
139                         $compiler = "xlc";
140                         $nobs = "--no-build-shared";
141                         last;
142                 } elsif($line eq "9"){
143                     $arch = "bluegenep";
144                         $compiler = "xlc";
145                         last;
146                 } elsif($line eq "10"){
147                     $arch = "mpi-bluegenep";
148                         $compiler = "xlc";
149                         last;
150                 } elsif($line eq "11"){
151                         $converse_network_type = "mpi";
152                         last;
153                 } elsif($line eq "12"){
154                         $converse_network_type = "vmi";
155                         last;
156                 } else {
157                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
158                 }
159         }       
160 }
161
162
163 if($arch eq ""){
164           $arch = "${converse_network_type}-${arch_os}";
165           if($amd64) {
166                 $arch = $arch . "-amd64";
167           } elsif($ia64){
168                 $arch = $arch . "-ia64";
169           } elsif($ppc){
170                 $arch = $arch . "-ppc";
171           } elsif($alpha){
172                 $arch = $arch . "-axp";
173           }
174 }
175   
176 #Cleanup the architectures to match the horrible real world inconsistent src/archs
177
178 if($arch eq "net-darwin"){
179         $arch = "net-darwin-x86";
180 } elsif($arch eq "net-darwin-ppc"){
181         $arch = "net-ppc-darwin";
182 } elsif($arch eq "mpi-darwin-ppc"){
183         $arch = "mpi-ppc-darwin";
184
185
186
187 if($compiler ne ""){
188         print "We determined that you should use the compiler $compiler\n Do you want to use a different compiler?[y/N]";
189 } else {
190         print "Do you want to specify a compiler? [y/N]";
191 }
192 $special_compiler = "false";
193 while($line = <>){
194         chomp $line;
195         if(lc($line) eq "y" || lc($line) eq "yes" ){
196                 $special_compiler = "true";
197                 last;
198         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq ""){
199                 last;
200         } else {
201                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
202         }
203 }
204
205
206
207
208 # Choose compiler
209 if($special_compiler eq "true"){
210         #select type of interconnect here
211         print << "EOF";
212         
213 Choose a compiler from below: [1-14]
214         1) cc
215         2) cc64
216         3) cxx
217         4) kcc
218         5) pgcc
219         6) acc
220         7) icc
221         8) ecc
222         9) gcc3
223         10) gcc4
224         11) mpcc
225         12) pathscale
226         13) xlc
227         14) xlc64
228
229 EOF
230
231         while($line = <>){
232                 chomp $line;
233                 if($line eq "1"){
234                         $compiler = "cc";
235                         last;
236                 } elsif($line eq "2"){
237                         $compiler = "cc64";
238                         last;
239                 } elsif($line eq "3"){
240                         $compiler = "cxx";
241                         last;
242                 } elsif($line eq "4"){
243                         $compiler = "kcc";
244                         last;
245                 } elsif($line eq "5"){
246                         $compiler = "pgcc";
247                         last;
248                 } elsif($line eq "6"){
249                         $compiler = "acc";
250                         last;
251                 } elsif($line eq "7"){
252                         $compiler = "icc";
253                         last;
254                 } elsif($line eq "8"){
255                         $compiler = "ecc";
256                         last;
257                 } elsif($line eq "9"){
258                         $compiler = "gcc3";
259                         last;
260                 } elsif($line eq "10"){
261                         $compiler = "gcc4";
262                         last;
263                 } elsif($line eq "11"){
264                         $compiler = "mpcc";
265                         last;
266                 } elsif($line eq "12"){
267                         $compiler = "pathscale";
268                         last;
269                 } elsif($line eq "13"){
270                         $compiler = "xlc";
271                         last;
272                 } elsif($line eq "14"){
273                         $compiler = "xlc64";
274                         last;
275                 } else {
276                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
277                 }
278         }
279 }
280
281
282 # Determine whether to support SMP / Multicore
283 print "Do you want SMP or multicore support? [y/N]";
284 $smp = "";
285 while($line = <>){
286         chomp $line;
287         if(lc($line) eq "y" || lc($line) eq "yes" ){
288                 $smp = "smp";
289                 last;
290         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq ""){
291                 last;
292         } else {
293                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
294         }
295 }
296
297
298 # Choose compiler flags
299 print << "EOF";
300         
301 Choose a set of compiler flags [1-4]
302         1) none
303         2) debug
304         3) optimized [default]
305         4) custom
306         
307 EOF
308
309 $compiler_flags = "";
310
311 while($line = <>){
312         chomp $line;
313         if($line eq "1"){
314                 last;
315         } elsif($line eq "2"){
316                 $compiler_flags = "-g -O0";
317                 last;
318         } elsif($line eq "3" || $line eq ""){
319                 $compiler_flags = "-O2 -DCMK_OPTIMIZE";
320                 last;
321         } elsif($line eq "4"){
322
323                 print "Enter compiler options: ";
324                 $input_line = <>;
325                 chomp($input_line);
326                 $compiler_flags = $input_line;
327                 
328                 last;
329         } else {
330                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
331         }
332 }
333
334
335
336
337 # Determine the target to build.
338 # We want this simple so we just give 2 options
339 $target = "";
340
341 print << "EOF";
342
343 What do you want to build?
344         1) Charm++ [default] (choose this if you are building NAMD)
345         2) Charm++, AMPI, ParFUM, FEM and other libraries
346
347 EOF
348
349 while($line = <>){
350         chomp $line;
351         if($line eq "1" || $line eq ""){
352                 $target = "charm++";
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 # Determine whether to use a -j4 flag for faster building
364 # Currently LIBS cannot be safely built with -j4
365 if($target eq "charm++"){
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                         $j = "-j4";
371                   last;
372                 } elsif(lc($line) eq "n" || lc($line) eq "no" ){
373                         $j = "";
374                         last;
375                 } else {
376                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
377                 }
378         }
379 }
380
381
382 # Compose the build line
383 $build_line = "./build $target $arch ${network_option_string} $compiler $smp $j ${compiler_flags}\n";
384
385
386 # Save the build line in the log
387 open(BUILDLINE, ">>smart-build.log");
388 print BUILDLINE `date`;
389 print BUILDLINE "Using the following build command:\n";
390 print BUILDLINE "$build_line\n";
391 close(BUILDLINE);
392
393
394 # Execute the build line if the appriate architecture directory exists
395 if(-e "src/arch/$arch"){
396         print "Building with: ${build_line}\n"; 
397         # Execute the build line
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