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