Adding mpicxx as compiler option.
[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 = "vmi";
151                         last;
152                 } else {
153                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
154                 }
155         }       
156 }
157
158
159 if($arch eq ""){
160           $arch = "${converse_network_type}-${arch_os}";
161           if($amd64) {
162                 $arch = $arch . "-amd64";
163           } elsif($ia64){
164                 $arch = $arch . "-ia64";
165           } elsif($ppc){
166                 $arch = $arch . "-ppc";
167           } elsif($alpha){
168                 $arch = $arch . "-axp";
169           }
170 }
171   
172 #Cleanup the architectures to match the horrible real world inconsistent src/archs
173
174 if($arch eq "net-darwin"){
175         $arch = "net-darwin-x86";
176 } elsif($arch eq "net-darwin-ppc"){
177         $arch = "net-ppc-darwin";
178 } elsif($arch eq "mpi-darwin-ppc"){
179         $arch = "mpi-ppc-darwin";
180
181
182
183 if($compiler ne ""){
184         print "We determined that you should use the compiler $compiler\n Do you want to use a different compiler?[y/N]";
185 } else {
186         print "Do you want to specify a compiler? [y/N]";
187 }
188 $special_compiler = "false";
189 while($line = <>){
190         chomp $line;
191         if(lc($line) eq "y" || lc($line) eq "yes" ){
192                 $special_compiler = "true";
193                 last;
194         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq ""){
195                 last;
196         } else {
197                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
198         }
199 }
200
201
202
203
204 # Choose compiler
205 if($special_compiler eq "true"){
206         #select type of interconnect here
207         print << "EOF";
208         
209 Choose a compiler from below: [1-15]
210
211         1) cc
212         2) cc64
213         3) cxx
214         4) kcc
215         5) pgcc
216         6) acc
217         7) icc
218         8) ecc
219         9) gcc3
220         10) gcc4
221         11) mpcc
222         12) pathscale
223         13) xlc
224         14) xlc64
225     15) mpicxx
226
227 EOF
228
229         while($line = <>){
230                 chomp $line;
231                 if($line eq "1"){
232                         $compiler = "cc";
233                         last;
234                 } elsif($line eq "2"){
235                         $compiler = "cc64";
236                         last;
237                 } elsif($line eq "3"){
238                         $compiler = "cxx";
239                         last;
240                 } elsif($line eq "4"){
241                         $compiler = "kcc";
242                         last;
243                 } elsif($line eq "5"){
244                         $compiler = "pgcc";
245                         last;
246                 } elsif($line eq "6"){
247                         $compiler = "acc";
248                         last;
249                 } elsif($line eq "7"){
250                         $compiler = "icc";
251                         last;
252                 } elsif($line eq "8"){
253                         $compiler = "ecc";
254                         last;
255                 } elsif($line eq "9"){
256                         $compiler = "gcc3";
257                         last;
258                 } elsif($line eq "10"){
259                         $compiler = "gcc4";
260                         last;
261                 } elsif($line eq "11"){
262                         $compiler = "mpcc";
263                         last;
264                 } elsif($line eq "12"){
265                         $compiler = "pathscale";
266                         last;
267                 } elsif($line eq "13"){
268                         $compiler = "xlc";
269                         last;
270                 } elsif($line eq "14"){
271                         $compiler = "xlc64";
272                         last;
273                 } elsif($line eq "15"){
274                         $compiler = "mpicxx";
275                         last;
276                 } else {
277                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
278                 }
279         }
280 }
281
282
283 # Determine whether to support SMP / Multicore
284 print "Do you want SMP or multicore support? [y/N]";
285 $smp = "";
286 while($line = <>){
287         chomp $line;
288         if(lc($line) eq "y" || lc($line) eq "yes" ){
289                 $smp = "smp";
290                 last;
291         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq ""){
292                 last;
293         } else {
294                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
295         }
296 }
297
298
299 # Choose compiler flags
300 print << "EOF";
301         
302 Choose a set of compiler flags [1-4]
303         1) none
304         2) debug
305         3) optimized [default]
306         4) custom
307         
308 EOF
309
310 $compiler_flags = "";
311
312 while($line = <>){
313         chomp $line;
314         if($line eq "1"){
315                 last;
316         } elsif($line eq "2"){
317                 $compiler_flags = "-g -O0";
318                 last;
319         } elsif($line eq "3" || $line eq ""){
320                 $compiler_flags = "-O2 -DCMK_OPTIMIZE";
321                 last;
322         } elsif($line eq "4"){
323
324                 print "Enter compiler options: ";
325                 $input_line = <>;
326                 chomp($input_line);
327                 $compiler_flags = $input_line;
328                 
329                 last;
330         } else {
331                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
332         }
333 }
334
335
336
337
338 # Determine the target to build.
339 # We want this simple so we just give 2 options
340 $target = "";
341
342 print << "EOF";
343
344 What do you want to build?
345         1) Charm++ [default] (choose this if you are building NAMD)
346         2) Charm++, AMPI, ParFUM, FEM and other libraries
347
348 EOF
349
350 while($line = <>){
351         chomp $line;
352         if($line eq "1" || $line eq ""){
353                 $target = "charm++";
354                 last;
355         } elsif($line eq "2"){
356                 $target = "LIBS";
357                 last;
358         } else {
359                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
360         }
361         
362 }
363
364 # Determine whether to use a -j4 flag for faster building
365 # Currently LIBS cannot be safely built with -j4
366 if($target eq "charm++"){
367         print "Do you want to do a parallel build (-j4)?[Y/n]";
368         while($line = <>){
369                 chomp $line;
370                 if(lc($line) eq "y" || lc($line) eq "yes" || $line eq ""){
371                         $j = "-j4";
372                   last;
373                 } elsif(lc($line) eq "n" || lc($line) eq "no" ){
374                         $j = "";
375                         last;
376                 } else {
377                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
378                 }
379         }
380 }
381
382
383 # Compose the build line
384 $build_line = "./build $target $arch ${network_option_string} $compiler $smp $j ${compiler_flags}\n";
385
386
387 # Save the build line in the log
388 open(BUILDLINE, ">>smart-build.log");
389 print BUILDLINE `date`;
390 print BUILDLINE "Using the following build command:\n";
391 print BUILDLINE "$build_line\n";
392 close(BUILDLINE);
393
394
395 # Execute the build line if the appriate architecture directory exists
396 if(-e "src/arch/$arch"){
397         print "Building with: ${build_line}\n"; 
398         # Execute the build line
399         system($build_line);
400 } else {
401         print "We could not figure out how to build charm with those options on this platform, please manually build\n";
402         print "Try something similar to: ${build_line}\n";
403 }
404
405