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