3249a7e6800a9dc45acf3c04723dc4d691cc1019
[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 = "mpi-sp";
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 # Determine converse architecture
66 # net, mpi, ...
67
68 print "Do you have a special network interconnect? [y/N]";
69 $special_network = "false";
70 while($line = <>){
71         chomp $line;
72         if(lc($line) eq "y" || lc($line) eq "yes" ){
73                 $special_network = "true";
74                 last;
75         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq "" ){
76                 last;
77         }
78 }
79
80         
81 $converse_network_type = "net";
82         
83 if($special_network eq "true"){
84         #select type of interconnect here
85         print << "EOF";
86         
87 Choose an interconnect from below: [1-12]
88         1) Infiniband (using OSU MPI)
89         2) Infiniband (native layer alpha version)
90         3) Myrinet GM
91         4) Myrinet MX
92         5) Amasso
93         6) Cray XT3, XT4 (not yet tested on CNL)
94         7) Bluegene/L Native
95         8) Bluegene/L MPI
96     9) Bluegene/P Native
97     10) Bluegene/P MPI
98         11) MPI
99         12) 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                     $arch = "bluegenep";
140                         $compiler = "xlc";
141                         last;
142                 } elsif($line eq "10"){
143                     $arch = "mpi-bluegenep";
144                         $compiler = "xlc";
145                         last;
146                 } elsif($line eq "11"){
147                         $converse_network_type = "mpi";
148                         last;
149                 } elsif($line eq "12"){
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
160
161 $target = "LIBS";
162
163
164 if($arch eq ""){
165           $arch = "${converse_network_type}-${arch_os}";
166           if($amd64) {
167                 $arch = $arch . "-amd64";
168           } elsif($ia64){
169                 $arch = $arch . "-ia64";
170           } elsif($ppc){
171                 $arch = $arch . "-ppc";
172           } elsif($alpha){
173                 $arch = $arch . "-axp";
174           }
175 }
176   
177 #Cleanup the architectures to match the horrible real world inconsistent src/archs
178
179 if($arch eq "net-darwin"){
180         $arch = "net-darwin-x86";
181 } elsif($arch eq "net-darwin-ppc"){
182         $arch = "net-ppc-darwin";
183 } elsif($arch eq "mpi-darwin-ppc"){
184         $arch = "mpi-ppc-darwin";
185
186
187
188 if($compiler ne ""){
189         print "We determined that you should use the compiler $compiler\n Do you want to use a different compiler?[y/N]";
190 } else {
191         print "Do you want to specify a compiler? [y/N]";
192 }
193 $special_compiler = "false";
194 while($line = <>){
195         chomp $line;
196         if(lc($line) eq "y" || lc($line) eq "yes" ){
197                 $special_compiler = "true";
198                 last;
199         } elsif(lc($line) eq "n" || lc($line) eq "no" || $line eq ""){
200                 last;
201         } else {
202                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
203         }
204 }
205
206
207
208
209 # Choose compiler
210 if($special_compiler eq "true"){
211         #select type of interconnect here
212         print << "EOF";
213         
214 Choose a compiler from below: [1-14]
215         1) cc
216         2) cc64
217         3) cxx
218         4) kcc
219         5) pgcc
220         6) acc
221         7) icc
222         8) ecc
223         9) gcc3
224         10) gcc4
225         11) mpcc
226         12) pathscale
227         13) xlc
228         14) xlc64
229
230 EOF
231
232         while($line = <>){
233                 chomp $line;
234                 if($line eq "1"){
235                         $compiler = "cc";
236                         last;
237                 } elsif($line eq "2"){
238                         $compiler = "cc64";
239                         last;
240                 } elsif($line eq "3"){
241                         $compiler = "cxx";
242                         last;
243                 } elsif($line eq "4"){
244                         $compiler = "kcc";
245                         last;
246                 } elsif($line eq "5"){
247                         $compiler = "pgcc";
248                         last;
249                 } elsif($line eq "6"){
250                         $compiler = "acc";
251                         last;
252                 } elsif($line eq "7"){
253                         $compiler = "icc";
254                         last;
255                 } elsif($line eq "8"){
256                         $compiler = "ecc";
257                         last;
258                 } elsif($line eq "9"){
259                         $compiler = "gcc3";
260                         last;
261                 } elsif($line eq "10"){
262                         $compiler = "gcc4";
263                         last;
264                 } elsif($line eq "11"){
265                         $compiler = "mpcc";
266                         last;
267                 } elsif($line eq "12"){
268                         $compiler = "pathscale";
269                         last;
270                 } elsif($line eq "13"){
271                         $compiler = "xlc";
272                         last;
273                 } elsif($line eq "14"){
274                         $compiler = "xlc64";
275                         last;
276                 } else {
277                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
278                 }
279         }
280 }
281
282 # SMP / Multicore
283
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
300
301
302
303
304 # Choose compiler flags
305 print << "EOF";
306         
307 Choose a set of compiler flags [1-4]
308         1) none
309         2) debug
310         3) optimized [default]
311         4) custom
312         
313 EOF
314
315 $compiler_flags = "";
316
317 while($line = <>){
318         chomp $line;
319         if($line eq "1"){
320                 last;
321         } elsif($line eq "2"){
322                 $compiler_flags = "-g -O0";
323                 last;
324         } elsif($line eq "3" || $line eq ""){
325                 $compiler_flags = "-O2 -DCMK_OPTIMIZE";
326                 last;
327         } elsif($line eq "4"){
328
329                 print "Enter compiler options: ";
330                 $input_line = <>;
331                 chomp($input_line);
332                 $compiler_flags = $input_line;
333                 
334                 last;
335         } else {
336                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
337         }
338 }
339
340
341
342
343 print << "EOF";
344
345 What do you want to build?
346         1) Charm++ [default] (choose this if you are building NAMD)
347         2) Charm++, AMPI, ParFUM, FEM and other libraries
348
349 EOF
350
351 while($line = <>){
352         chomp $line;
353         if($line eq "1" || $line eq ""){
354                 $target = "charm++";
355                 $j = "-j4";
356                 last;
357         } elsif($line eq "2"){
358                 $target = "LIBS";
359                 last;
360         } else {
361                 print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
362         }
363         
364 }
365
366
367
368 if($j ne ""){
369         print "Do you want to do a parallel build (-j4)?[Y/n]";
370         while($line = <>){
371                 chomp $line;
372                 if(lc($line) eq "y" || lc($line) eq "yes" || $line eq ""){
373                         last;
374                 } elsif(lc($line) eq "n" || lc($line) eq "no" ){
375                         $j = "";
376                         last;
377                 } else {
378                         print "Invalid option, DOES NOT COMPUTE, please try again :P\n"
379                 }
380         }
381 }
382
383
384
385 $build_line = "./build $target $arch ${network_option_string} $compiler $smp $j ${compiler_flags}\n";
386
387 open(BUILDLINE, ">smart-build.log");
388 print BUILDLINE "Using the following build command:\n$build_line\n";
389 close(BUILDLINE);
390
391 if(-e "src/arch/$arch"){
392         print "Building with: ${build_line}\n"; 
393         system($build_line);
394 } else {
395         print "We could not figure out how to build charm with those options on this platform, please manually build\n";
396         print "Try something similar to: ${build_line}\n";
397 }
398
399