msgQ: Move into namespace conv
[charm.git] / smart-build.pl
index ac27ccda91fc0aaae54b4c99535014878bdc4014..86ef4e9953ce837339e60b3f044357b7ebf36670 100755 (executable)
@@ -34,20 +34,6 @@ print "If you are a poweruser expecting a list of options, please use ./build --
 print "\n============================================================\n\n\n";
 
 
-
-# check for MPI. 
-
-$mpi_found = "false";
-$m = system("which mpicc mpiCC > /dev/null 2>/dev/null") / 256;
-if($m == 0){
-  $mpi_found = "true";
-}
-$m = system("which mpicc mpicxx > /dev/null 2>/dev/null") / 256;
-if($m == 0){
-  $mpi_found = "true";
-}
-
-
 # Use uname to get the cpu type and OS information
 $os = `uname -s`;
 $cpu = `uname -m`;
@@ -95,33 +81,42 @@ if($cpu =~ m/i[0-9]86/){
   $ppc = 1;
 } elsif($cpu =~ m/Power Mac/){
   $ppc = 1;
+} elsif($cpu =~ m/ppc*/){
+  $ppc = 1;
 } elsif($cpu =~ m/alpha/){
   $alpha = 1;
 }
 
 
 
-# Determine converse architecture (net, mpi, ...)
-print "Do you want to specify a multi-core version that runs only on a single multi-core node? [y/N]";
-$multicore = promptUserYN();
+# default to net
+$converse_network_type = "net";
+
 
-if($multicore eq "true"){
-    $converse_network_type = "multicore";
-}
-else {
+# check for MPI
 
 $skip_choosing = "false";
 
-# default to net
-$converse_network_type = "net";
+$mpi_found = "false";
+$m = system("which mpicc mpiCC > /dev/null 2>/dev/null") / 256;
+if($m == 0){
+    $mpi_found = "true";
+    $mpioption = "";
+}
+$m = system("which mpicc mpicxx > /dev/null 2>/dev/null") / 256;
+if($m == 0){
+    $mpi_found = "true";
+    $mpioption = "mpicxx";
+}
 
 # Give option of just using the mpi version if mpicc and mpiCC are found
 if($mpi_found eq "true"){
-  print "\nI found that you have an mpicc available in your path.\nDo you want to build Charm++ on this MPI? [Y/n]: ";
+  print "\nI found that you have an mpicc available in your path.\nDo you want to build Charm++ on this MPI? [y/N]: ";
   $p = promptUserYN();
-  if($p eq "yes" || $p eq "default"){
+  if($p eq "yes"){
        $converse_network_type = "mpi";
        $skip_choosing = "true";
+       $options = "$options $mpioption";
   }    
 }
 
@@ -138,12 +133,14 @@ Choose an interconnect from below: [1-11]
         3) Myrinet GM
         4) Myrinet MX
         5) LAPI
-        6) Cray XT3, XT4 (not yet tested on CNL)
-        7) Bluegene/L Native (only at T. J. Watson)
-        8) Bluegene/L MPI
-        9) Bluegene/P Native (only at T. J. Watson)
-       10) Bluegene/P MPI
-       11) VMI
+        6) Cray XT3, XT4
+         7) Cray XT5
+         8) Cray XE, XK
+        9) Bluegene/L Native (only at T. J. Watson)
+       10) Bluegene/L MPI
+        11) Bluegene/P Native
+       12) Bluegene/P MPI
+       13) VMI
 
 EOF
        
@@ -171,24 +168,30 @@ EOF
                $arch = "mpi-crayxt3";
                last;
          } elsif($line eq "7"){
+               $arch = "mpi-crayxt";
+               last;
+         } elsif($line eq "8"){
+               $arch = "gemini_gni-crayxe";
+               last;
+         } elsif($line eq "9"){
                $arch = "bluegenel";
                $compilers = "xlc ";
                $nobs = "--no-build-shared";
                last;
-         } elsif($line eq "8"){
+         } elsif($line eq "10"){
                $arch = "mpi-bluegenel";
                $compilers = "xlc ";
                $nobs = "--no-build-shared";
                last;
-         } elsif($line eq "9"){
+         } elsif($line eq "11"){
                $arch = "bluegenep";
                $compilers = "xlc ";
                last;
-         } elsif($line eq "10"){
+         } elsif($line eq "12"){
                $arch = "mpi-bluegenep";
                $compilers = "xlc ";
                last;
-         } elsif($line eq "11"){
+         } elsif($line eq "13"){
                $converse_network_type = "vmi";
                last;
          } else {
@@ -201,9 +204,9 @@ EOF
 
 # construct an $arch string if we did not explicitly set one above
 if($arch eq ""){
-         $arch = "${converse_network_type}-${arch_os}";
+  $arch = "${converse_network_type}-${arch_os}";
          if($amd64) {
-               $arch = $arch . "-amd64";
+               $arch = $arch . "-x86_64";
          } elsif($ia64){
                $arch = $arch . "-ia64";
          } elsif($ppc){
@@ -213,28 +216,74 @@ if($arch eq ""){
          }
 }
   
-# Fixup $arch to match the horrible
-# inconsistent directories in src/archs
+# Fixup $arch to match the inconsistent directories in src/archs
 
 if($arch eq "net-darwin"){
        $arch = "net-darwin-x86";
-} elsif($arch eq "net-darwin-ppc"){
-       $arch = "net-ppc-darwin";
-} elsif($arch eq "mpi-darwin-ppc"){
-       $arch = "mpi-ppc-darwin";
+} elsif($arch eq "net-ppc-darwin"){
+       $arch = "net-darwin-ppc";
+} elsif($arch eq "mpi-ppc-darwin"){
+       $arch = "mpi-darwin-ppc";
+} elsif($arch eq "multicore-linux-x86_64"){
+       $arch = "multicore-linux64";
 } 
 
 
 
-# Determine whether to support SMP / Multicore
-print "\nDo you want SMP support? [y/N]";
-$p = promptUserYN();
-if($p eq "yes" ){
-  $options = "$options smp ";
+
+
+#================ Choose SMP/PXSHM =================================
+
+# find what options are available
+$opts = `./build charm++ $arch help 2>&1 | grep "Supported options"`;
+$opts =~ m/Supported options: (.*)/;
+$opts = $1;
+
+
+#always provide multicore and single-threaded versions
+print << "EOF";
+How do you want to handle SMP/Multicore: [1-4]
+         1) single-threaded [default]
+         2) multicore(single node only)
+EOF
+
+# only add the smp or pxshm options if they are available
+$counter = 3; # the next index used in the list
+
+$smpIndex = -1;
+if($opts =~ m/smp/){
+  print "         $counter) SMP\n";
+  $smpIndex = $counter; 
+  $counter ++;
 }
 
+$pxshmIndex = -1;
+if($opts =~ m/pxshm/){
+  print "         $counter) POSIX Shared Memory\n";
+  $pxshmIndex = $counter; 
+  $counter ++;
+}
+
+while($line = <>){
+       chomp $line;
+       if($line eq "1" || $line eq ""){
+           last;
+       } elsif($line eq "2"){
+           $converse_network_type = "multicore";
+           last;
+       } elsif($line eq $smpIndex){
+           $options = "$options smp ";
+           last;
+       } elsif($line eq $pxshmIndex){
+           $options = "$options pxshm ";
+           last;
+       }
+}
+
+
+
+
 
-}  # end of if multicore
 
 
 #================ Choose Compiler =================================
@@ -277,6 +326,7 @@ if ($numc > 0) {
 
 
 
+
 #================ Choose Options =================================
 
 #Create a hash table containing descriptions of various options
@@ -291,6 +341,8 @@ $explanations{"pgf90"} = "Use Portland Group's pgf90 fortran compiler";
 $explanations{"ifc"} = "Use Intel's ifc compiler";
 $explanations{"ammasso"} = "Use native RDMA support on Ammasso interconnect";
 $explanations{"syncft"} = "Use initial fault tolerance support";
+$explanations{"mlogft"} = "Use message logging fault tolerance support";
+$explanations{"causalft"} = "Use causal message logging fault tolerance support";
 
 
 
@@ -372,14 +424,20 @@ $explanations{"syncft"} = "Use initial fault tolerance support";
 
 
 
+
+
+
+
+
+
 # Choose compiler flags
 print << "EOF";
        
 Choose a set of compiler flags [1-5]
        1) none
-       2) debug
-       3) optimized [default]
-       4) optimized + projections
+       2) debug mode                        -g -O0
+       3) production build [default]        --with-production
+       4) production build w/ projections   --with-production --enable-tracing
        5) custom
        
 EOF
@@ -393,11 +451,11 @@ while($line = <>){
        } elsif($line eq "2"){
                $compiler_flags = "-g -O0";
                last;
-       } elsif($line eq "3" || $line eq ""){
-               $compiler_flags = "-O2 -DCMK_OPTIMIZE";
+       } elsif($line eq "4" ){
+               $compiler_flags = "--with-production --enable-tracing";
                last;
-       } elsif($line eq "4"){ 
-                $compiler_flags = "-O2"; 
+       } elsif($line eq "3" || $line eq ""){ 
+                $compiler_flags = "--with-production";
                 last; 
         }  elsif($line eq "5"){
 
@@ -441,20 +499,52 @@ while($line = <>){
        
 }
 
-# Determine whether to use a -j4 flag for faster building
-# Currently LIBS cannot be safely built with -j4
+# Determine whether to use a -j flag for faster building
 $j = "";
-if($target eq "charm++"){
-       print "\nDo you want to do a parallel build (-j4)?[Y/n]";
-       $p = promptUserYN();
-       if($p eq "yes" || $p eq "default"){
-         $j = "-j4";
+    print << "EOF";
+    
+Do you want to compile in parallel?
+        1) No
+        2) Build with -j2
+        3) Build with -j4
+        4) Build with -j8 
+        5) Build with -j16 [default]
+        6) Build with -j32
+        7) Build with -j
+
+EOF
+
+    while($line = <>) {
+        chomp $line;
+        if($line eq "1"){
+           $j = "";
+           last;
+        } elsif($line eq "2") {
+           $j = "-j2";
+           last; 
+       } elsif($line eq "3") {
+           $j = "-j4";
+           last;
+       }  elsif($line eq "4") {
+           $j = "-j8";
+           last;
+       }  elsif($line eq "5" || $line eq "") {
+           $j = "-j16";
+           last;
+       }  elsif($line eq "6") {
+            $j = "-j32";
+            last;
+        }  elsif($line eq "7") {
+            $j = "-j";
+            last;
+        }   else {
+           print "Invalid option, please try again :P\n";
        }
 }
 
 
 # Compose the build line
-$build_line = "./build $target $arch $compilers $options $smp $j ${compiler_flags}\n";
+$build_line = "./build $target $arch $compilers $options $smp $j $nobs ${compiler_flags}\n";
 
 
 # Save the build line in the log