1841beed8afab03b9a5a1d129e4f9bc34517e8e4
[charm.git] / build
1 #!/bin/sh
2
3 # Silly shorthand, used for source reorganization
4 src="src/arch"
5
6 more=0
7
8 syntax() {
9   echo ''
10   echo 'Usage: build <target> <version> <options> [charmc-options ...]'
11   echo ''
12   echo '<targets>: converse charm++ LIBS AMPI FEM bigemulator pose jade msa'
13   echo '<targets>: doc ps-doc pdf-doc html-doc'
14   if test $more = 1
15   then
16   echo ''
17   echo '  charm++         compile Charm++ core only'
18   echo '  AMPI            compile Adaptive MPI on top of Charm++'
19   echo '  FEM             compile FEM framework'
20   echo '  LIBS            compile additional parallel libraries with Charm++ core'
21   echo '  bigemulator     build additional BigSim libraries'
22   echo '  pose            build POSE parallel discrete event simulator'
23   echo '  jade            build Jade compiler (auto-builds charm++, msa)'
24   echo '  msa             build Multiphase Shared Arrays(MSA) library'
25   echo '  Tau             build the TAU tracing library for generating TAU performance data' 
26   echo '  ChaNGa          compile Charm++ core and necessary libraries for ChaNGa'
27   echo ''
28   fi
29   echo '<versions>: ' 
30   ( cd $src ; ls -1 | egrep -v '(^CVS)|(^shmem$)|(^mpi$)|(^sim$)|(^net$)|(^multicore$)|(^elan$)|(^util$)|(^common$)|(^uth$)|(^conv-mach-fix.sh$)|(^win32$)|(^win64$)|(^paragon$)|(^vmi$)|(^lapi$)|(^cell$)|(^template$)|(^cuda$)' | pr -3 -t )
31   echo ''
32   echo '<options>: compiler and platform specific options'
33   echo 'cc cc64 cxx kcc pgcc acc icc ecc gcc3 gcc4 mpcc pathscale'
34   echo 'help smp gm tcp vmi scyld clustermatic bigemulator ooc syncft mlogft papi'
35   echo 'pthreads lam'
36   echo '--incdir --libdir --basedir --no-build-shared --destination --suffix -j'
37   if test $more = 1
38   then
39   echo ''
40   echo 'For platform specific options, use help option:'
41   echo '  help            platform specific help, e.g. ./build charm++ net-linux help'
42   echo ''
43   echo 'Choose a compiler (only one option is allowed from this section):'
44   echo '  cc, cc64        For Sun WorkShop C++ 32/64 bit compilers'
45   echo '  cxx             DIGITAL C++ compiler (DEC Alpha)'
46   echo '  kcc             KAI C++ compiler'
47   echo "  pgcc            Portland Group's C++ compiler"
48   echo '  acc             HP aCC compiler'
49   echo '  icc             Intel C/C++ compiler for Linux IA32'
50   echo '  ecc             Intel C/C++ compiler for Linux IA64'
51   echo '  gcc3            use gcc3 - GNU GCC/G++ version 3'
52   echo '  gcc4            use gcc4 - GNU GCC/G++ version 4 (only mpi-crayxt3)'
53   echo '  mpcc            SUN Solaris C++ compiler for MPI'
54   echo '  pathscale       use pathscale compiler suite'
55   echo ''
56   echo 'Choose a fortran compile (only one option is allowed from this section):'
57   echo '  g95             G95 at http://ww.g95.org'
58   echo '  absoft          Absoft fortran compiler'
59   echo "  pgf90           Portland Group\'s Fortran compiler"
60   echo '  ifc             Intel Fortran compiler (older versions)'
61   echo '  ifort           Intel Fortran compiler (newer versions)'
62   echo ''
63   echo 'Platform specific options (choose multiple if apply):'
64   echo '  lam             Use LAM MPI'
65   echo '  smp             support for SMP, multithreaded charm on each node'
66   echo '  mpt             use SGI Message Passing Toolkit (only for mpi version)'
67   echo '  gm              use Myrinet for communication'
68   echo '  tcp             use TCP sockets for communication (only for net version)'
69   echo '  ibverbs         use the Infiniband OpenIB layer for communication (only for net-linux-amd64 currently)'
70   echo "  vmi             use NCSA's VMI for communication (only for mpi version)"
71   echo '  scyld           compile for Scyld Beowulf cluster based on bproc'
72   echo '  clustermatic    compile for Clustermatic (support version 3 and 4) '
73   echo '  pthreads        compile with pthreads Converse threads'
74   echo ''
75   echo 'Advanced options:'
76   echo '  bigemulator     compile for BigSim simulator'
77   echo '  ooc             compile with out of core support'
78   echo '  syncft          compile with Charm++ fault tolerance support'
79   echo '  mlogft          compile with Charm++ message logging fault tolerance support'
80   echo '  papi            compile with PAPI performance counter support (if any)'
81   echo ''
82   echo "Charm++ dynamic libraries:"
83   echo "  --build-shared     build Charm++ dynamic libraries (.so) (default)"
84   echo "  --no-build-shared  don't build Charm++'s shared libraries"
85   echo ''
86   echo 'Miscellaneous options:'
87   echo '  --incdir=DIR       specify additional include path for compiler'
88   echo '  --libdir=DIR       specify additional lib path for compiler'
89   echo '  --basedir=DIR      shortcut for the above two - DIR/include and DIR/lib'
90   echo '  -j[N]              parallel make, N is the number of paralle make jobs'
91   echo "  --with-romio       build AMPI with ROMIO library"
92   echo "  --with-production  build Charm++ with all optimizations for maximum performance"
93   echo "  --destination=DIR  build Charm++ inside DIR, by default the destination is <version>"
94   echo "  --suffix=DIR       append DIR to the destination directory of the Charm++ build"
95   echo "  --tau-makefile=FILE Specify which TAU stub makefile to use"
96   fi
97   echo ''
98   echo '<charmc-options>: normal compiler options e.g. -g -O -save -verbose'
99   if test $more = 1
100   then
101   echo ''
102   echo 'Examples:'
103   echo "1. display all supported options for net-linux using 'help':"
104   echo '  ./build charm++ net-linux help'
105   echo '2. compile Charm++ on Linux with optimizations:'
106   echo '  ./build charm++ net-linux -O -DCMK_OPTIMIZE'
107   echo '3. compile Charm++ for Linux clustermatic Beowulf cluster with Intel compiler:'
108   echo '  ./build charm++ net-linux clustermatic icc -O'
109   echo '4. compile Charm++ for IA64 Linux cluster with MPICH-GM:'
110   echo '  ./build charm++ mpi-linux-ia64 gm -O'
111   echo '5. compile Charm++ for Windows with VC++ (Cygwin required):'
112   echo '  ./build charm++ net-win32 -O'
113   echo '6. compile on IBM SP with MPI using parallel gmake, 4 jobs simultaneously:'
114   echo '  MAKE=gmake  ./build charm++ mpi-sp -j4 -O            # sh'
115   echo '  setenv MAKE gmake;  ./build charm++ mpi-sp -j4 -O    # csh'
116   echo '7. compile Charm++ with MPI that is installed at /usr/local/mpich:'
117   echo '  ./build charm++ mpi-linux --incdir /usr/local/mpich/include --libdir /usr/local/mpich/lib -O'
118   echo '   or in short,'
119   echo '  ./build charm++ mpi-linux --basedir /usr/local/mpich -O'
120   echo '  ./build Tau --tau-makefile=/usr/local/packages/TAU/x86_64/lib/Makefile.tau-mpi'
121   echo ''
122   echo 'Note: This script:'
123   echo ' 1. Creates directories <destination> and <destination>/tmp'
124   echo ' 2. Copies src/scripts/Makefile into <destination>/tmp'
125   echo ' 3. Does a "make basics" in <destination>/tmp.'
126   echo ' 3. Does a "make -jN <target> <version> OPTS=<charmc-options>" in <destination>/tmp.'
127   echo "That's all build does.  The rest is handled by the Makefile."
128   echo ''
129   echo 'Thank you for using Charm++, please send questions or comments to '
130   echo 'Parallel Programming Lab at University of Illinois at Urbana-Champaign'
131   echo '(email: charm@cs.uiuc.edu).'
132
133   else
134   echo ''
135   echo "To get more detailed help, run ./build --help"
136   fi
137 }
138
139 Echo() {
140     [ "x$QUIET" = "x--quiet" ] || echo $*
141 }
142
143 printOption() {
144   for prefix in cc conv-mach
145   do
146     str="Supported compilers:"
147     [ "$prefix" = "conv-mach" ] && str="Supported options:"
148     opts=""
149     for dir in $OPT_DIRS
150     do
151 #         echo "Checking for $prefix in $dir"
152           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
153           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
154     done 
155     tmp=.tmp.$$
156     rm -f $tmp; touch $tmp
157     for o in $opts
158     do
159       echo $o >> $tmp
160     done
161     opts=`sort $tmp | uniq`
162     rm -f $tmp
163     echo $str $opts
164   done
165   exit 1
166 }
167
168 CheckDir() {
169   for d in $*
170   do
171     if test ! -d $d
172     then
173       echo Error: cannot find $d!
174       exit 1
175     fi
176   done
177 }
178
179 TestIfCompiler() {
180   for dir in $OPT_DIRS
181   do
182     [ -f $dir/cc-$1.sh ] && return 1
183   done  
184   return 0
185 }
186
187 TestIfOption() {
188   for dir in $OPT_DIRS
189   do
190     [ -f $dir/conv-mach-$1.h ] && return 1 
191   done
192   
193   echo "Error> option: $1 is not supported in this version!"; 
194   printOption
195 }
196
197
198 # start
199
200 MAKEOPTS=""
201 OPTS=""
202 BOPTS=""
203 MORE=""
204 COMPILER=""
205 BASEDIR=
206 LIBDIR=
207 INCDIR=
208 ARCH=
209 BUILD_SHARED=
210 WITH_ROMIO=
211 WITH_PRODUCTION=
212 BUILD_EMULATOR=0
213 DESTINATION=""
214 DESTINATION_SUFFIX=""
215 TAU_MAKEFILE=""
216 QUIET=""
217
218 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | more && exit 1
219 [ $# -lt 2 ] && ./smart-build.pl && exit 1
220 PROGRAM=$1
221 shift
222 VERSION=$1; BASEVERSION=$1; 
223 if test -f $src/$BASEVERSION/vdir_link
224 then
225   BASEVERSION=`cat $src/$BASEVERSION/vdir_link`
226 fi
227 ARCH=`echo $1 | sed -e 's@-.*@@'`
228 shift
229
230 #echo $src
231 #echo $BASEVERSION
232 #echo $ARCH
233
234 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
235
236 while [ ! $# -eq 0 ]
237 do
238   case "$1" in
239     "--basedir")
240                 shift; 
241                 for dir in $1
242                 do
243                   CheckDir $dir/include $dir/lib
244                   LIBDIR="$LIBDIR -L$dir/lib";
245                   INCDIR="$INCDIR -I$dir/include"
246                 done
247                 shift
248                 ;;
249     --basedir=*)
250                 basedir=`echo $1 | awk -F= '{print $2}'`
251                 for dir in $basedir
252                 do
253                   CheckDir $dir/include $dir/lib
254                   LIBDIR="$LIBDIR -L$dir/lib";
255                   INCDIR="$INCDIR -I$dir/include"
256                 done
257                 shift
258                 ;;
259     "--libdir")
260                 shift; CheckDir $1
261                 for dir in $1
262                 do
263                   LIBDIR="$LIBDIR -L$dir"; 
264                 done
265                 shift
266                 ;;
267     --libdir=*)
268                 libdir=`echo $1 | awk -F= '{print $2}'`
269                 CheckDir $libdir
270                 for dir in $libdir
271                 do
272                   LIBDIR="$LIBDIR -L$dir"; 
273                 done
274                 shift
275                 ;;
276     "--incdir")
277                 shift; CheckDir $1
278                 for dir in $1
279                 do
280                   INCDIR="$INCDIR -I$dir"; 
281                 done
282                 shift
283                 ;;
284     --incdir=*)
285                 incdir=`echo $1 | awk -F= '{print $2}'`
286                 CheckDir $incdir
287                 for dir in $incdir
288                 do
289                   INCDIR="$INCDIR -I$dir"; 
290                 done
291                 shift
292                 ;;
293     --no-build-shared|-nobs|--no-shared)
294                 BUILD_SHARED="-nobs"; shift
295                 ;;
296     --with-romio)
297                 WITH_ROMIO="true"; shift
298                 ;;
299     --with-production)
300                 WITH_PRODUCTION="true" 
301                 shift
302                 ;;
303     --build-shared|-bs)
304                 # obsolete, do nothing
305                 shift
306                 ;;
307     --destination)
308                 shift
309                 DESTINATION="$1"
310                 shift
311                 ;;
312     --destination=*)
313                 DESTINATION="`echo $1 | awk -F= '{print $2}'`"
314                 shift
315                 ;;
316     --suffix)
317                 shift
318                 DESTINATION_SUFFIX="$1"
319                 shift
320                 ;;
321     --suffix=*)
322                 DESTINATION_SUFFIX="`echo $1 | awk -F= '{print $2}'`"
323                 shift
324                 ;;
325     --tau-makefile)
326                 TAU_MAKEFILE=$1
327                 shift
328                 ;;
329     --tau-makefile=*)
330                 TAU_MAKEFILE=`echo $1 | awk -F= '{print $2}'`
331                 shift
332                 ;;
333     --quiet)
334                 MAKEOPTS="$MAKEOPTS --quiet"
335                 QUIET="--quiet"
336                 shift;
337                 ;;
338     -j*)
339                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
340                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
341                 shift;
342                 ;;
343     -*) 
344 # We hit a real compiler option (like -g, or -Dfoo),
345 # so just copy over all remaining options
346           while [ ! $# -eq 0 ]
347           do
348             OPTS="$OPTS $1"; shift
349           done
350           ;;
351     "help")
352         printOption
353         ;;
354     *)
355 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
356         TestIfCompiler $1
357         if [ $? -eq 1 ] 
358         then
359 # It specifies a compiler:
360           if [ ! -z "$COMPILER" ] 
361           then
362               echo "Error> Tried to specify two compilers: $COMPILER and $1"
363               printOption
364           fi
365           COMPILER=$1
366         else
367 # It specifies some other option:
368           TestIfOption $1
369           BOPTS="$BOPTS $1"
370           [ $1 =  "bigemulator" ] && BUILD_EMULATOR=1
371         fi
372         shift
373         ;;
374   esac
375 done
376
377 [ "x$VERSION" = "x" ] && syntax && exit 1
378
379 if [ -z "$MAKE" ] 
380 then
381   # prefer gmake
382   MAKE=`which gmake 2>/dev/null`
383   [ -z "$MAKE" -o ! -x "$MAKE" ] && MAKE='make'
384 fi
385
386 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
387 then
388   if [ "x_$BASEVERSION" = "x_net-rs6k" ]
389   then
390     echo "Error> build net-aix-ppc instead of net-rs6k!" 
391   else
392     echo "Error> build can not find arch: $BASEVERSION!" 
393   fi
394   exit 1
395 fi
396
397 #generate VERSION name combining all the build-time options.
398 if [ -n "$BOPTS" -o -n "$COMPILER" ]
399 then
400   echo "Selected Compiler: $COMPILER"
401   echo "Selected Options: $BOPTS"
402   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
403   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
404   for i in $BOPTS_WITHCOMPILER
405   do
406     VERSION=$VERSION-$i
407   done
408 fi
409
410 #echo "|$DESTINATION|$DESTINATION_SUFFIX|"
411
412 if [ -z "$DESTINATION" ]
413 then
414   DESTINATION="$VERSION"
415 fi
416
417 if [ -n "$DESTINATION_SUFFIX" ]
418 then
419   DESTINATION="$DESTINATION-$DESTINATION_SUFFIX"
420 fi
421
422 [ -d $DESTINATION ] || Echo "Creating dir: $DESTINATION"
423 [ -d $DESTINATION ] || mkdir $DESTINATION
424 [ -d $DESTINATION/tmp ] || Echo "Creating dir: $DESTINATION/tmp"
425 [ -d $DESTINATION/tmp ] || mkdir $DESTINATION/tmp
426
427 Echo "Copying src/scripts/Makefile to $DESTINATION/tmp"
428 rm -f $DESTINATION/tmp/Makefile
429 rm -f $DESTINATION/tmp/Make.depends
430 rm -f $DESTINATION/tmp/Make.lb
431 rm -f $DESTINATION/tmp/Make.machine
432
433
434 # Create the bin, lib, include, etc. links:
435 WINNAME=`echo $VERSION | awk -F- '{print $2}'`
436 if [ "x_$WINNAME" = "x_win32" -o "x_$WINNAME" = "x_win64" ]
437 then
438 #Win32/64 version needs special compilers and *copied* (not linked)
439 # source files.
440         echo "Copying compilers for $WINNAME into cygwin /bin directory"
441         cp -f $src/$WINNAME/unix2nt* /bin
442         cp $src/win32/system_ln $DESTINATION/tmp
443         cp $src/win32/unistd.h $DESTINATION/tmp
444         echo "Compiling createlink.cpp ..."
445         (cd $src/win32; unix2nt_cc  -c createlink.cpp -o createlink.o -D_WIN32_WINNT=0x0500; unix2nt_cc createlink.o)
446         if test ! -x $src/win32/createlink.exe
447         then
448                 echo "VC++ is not properly installed!"
449                 exit 1
450         fi
451         echo "Copying $src/win32/createlink.exe to /bin directory"
452         cp $src/win32/createlink.exe /bin
453         chmod +x $DESTINATION/tmp/system_ln
454 else
455         cat > $DESTINATION/tmp/system_ln <<EOF
456 #!/bin/sh
457 ln -f -s \$@
458 EOF
459   chmod +x $DESTINATION/tmp/system_ln
460   for newdir in `echo bin lib lib_so include tmp`
461   do
462     Echo "Soft-linking over $newdir"
463     if [ -r $newdir ]
464     then
465       rm -fr $newdir || exit 1
466     fi
467     $DESTINATION/tmp/system_ln $DESTINATION/$newdir $newdir
468   done
469   rm -f VERSION
470   $DESTINATION/tmp/system_ln $DESTINATION/include/VERSION VERSION
471 fi
472
473 $DESTINATION/tmp/system_ln "../../src/scripts/Make.depends" $DESTINATION/tmp/Make.depends
474 $DESTINATION/tmp/system_ln "../../src/ck-ldb/Make.lb" $DESTINATION/tmp/Make.lb
475 $DESTINATION/tmp/system_ln "../../src/scripts/Makefile" $DESTINATION/tmp/Makefile
476 $DESTINATION/tmp/system_ln "../../src/scripts/Make.tau" $DESTINATION/tmp/Make.tau
477 touch $DESTINATION/tmp/Makefile.machine
478
479 ConvUsr="$DESTINATION/tmp/conv-mach-pre.sh"
480 Echo "Generating $ConvUsr"
481 echo > $ConvUsr
482 if test -n "$LIBDIR" 
483 then
484   echo 'USER_OPTS_LD="$USER_OPTS_LD '$LIBDIR'"' >> $ConvUsr
485   echo 'USER_OPTS_LDXX="$USER_OPTS_LDXX '$LIBDIR'"' >> $ConvUsr
486 fi
487 if test -n "$INCDIR" 
488 then
489   echo 'USER_OPTS_CC="$USER_OPTS_CC '$INCDIR'"' >> $ConvUsr
490   echo 'USER_OPTS_CXX="$USER_OPTS_CXX '$INCDIR'"' >> $ConvUsr
491 fi
492 chmod +x $ConvUsr
493
494 # Create conv-mach-opt headers with special build-time options
495 ConvHeader="$DESTINATION/tmp/conv-mach-opt.h"
496 ConvSh="$DESTINATION/tmp/conv-mach-opt.sh"
497 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
498 then
499   Echo "Generating $ConvHeader, conv-mach-opt.sh"
500   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
501   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
502   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
503 fi
504 if test -n "$COMPILER"
505 then
506       i="$COMPILER"
507       echo '#include "'cc-$i.h'"' >> $ConvHeader
508       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
509 fi
510 if test -n "$BOPTS"
511 then
512     for i in $BOPTS
513     do
514       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
515       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
516     done
517 fi
518
519 if test  -n "$BUILD_SHARED" 
520 then
521     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
522 fi
523
524 if test  -n "$WITH_ROMIO" 
525 then
526     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
527 fi
528
529 if test -n "$WITH_PRODUCTION"
530 then
531     echo '#define CMK_OPTIMIZE' >> $ConvHeader
532     echo '#define CMK_REPLAYSYSTEM  0' >> $ConvHeader
533 fi
534
535 # build with Tau
536 WITH_TAU=0
537 if [ "$PROGRAM" = "Tau" ]
538 then
539         Echo "TAU>>>> makefile config option: $TAU_MAKEFILE"
540         if [ -n "$TAU_MAKEFILE" -a -f $TAU_MAKEFILE ]
541         then
542           #Setting up TAU trace library:
543           Echo "TAU>>>> configuring with this TAU makefile: $TAU_MAKEFILE"
544
545           WITH_TAU=1
546         else
547           Echo "TAU>>>> ERROR could not find Makefile: $TAU_MAKEFILE, ignored"
548           TAU_MAKEFILE=""
549         fi
550 fi
551 [ -z "$TAU_MAKEFILE" ] && TAU_MAKEFILE="Make.tau"
552 SED_CHARMC="s@TAU_MAKEFILE=\(.*\)@TAU_MAKEFILE=$TAU_MAKEFILE@"
553
554 sed -e $SED_CHARMC src/scripts/Makefile > .Makefile.$$ && cp .Makefile.$$ src/scripts/Makefile && rm -f  .Makefile.$$
555 sed -e $SED_CHARMC src/scripts/charmc > .charmc.$$ && cp .charmc.$$ src/scripts/charmc && rm -f .charmc.$$
556
557 if test $WITH_TAU -eq 1
558 then
559     echo "#define CMK_WITH_TAU               1" >> $ConvHeader
560     echo "#define pthread_create             tau_pthread_create" >> $ConvHeader
561     echo "#define pthread_exit               tau_pthread_exit" >> $ConvHeader
562
563     echo "CMK_WITH_TAU=\"true\"" >> $ConvSh
564 fi
565
566
567 echo $BASEVERSION > $DESTINATION/tmp/.vdir
568 echo $VERSION | sed -e 's@-.*@@' > $DESTINATION/tmp/.gdir
569
570 if test $BUILD_EMULATOR = 1
571 then
572   PROGRAM="$PROGRAM bigsim"
573 fi
574
575 printError()
576 {
577         Echo "-------------------------------------------------"
578         Echo "Charm++ NOT BUILT. Either cd into $DESTINATION/tmp and try"
579         Echo "to resolve the problems yourself, visit"
580         Echo "    http://charm.cs.uiuc.edu/"
581         Echo "for more information. Otherwise, email the developers at charm@cs.uiuc.edu"
582         exit $MAKEEXIT
583 }
584
585 echo 'BUILDOPTS="'$OPTS'"'  >> $ConvSh
586
587 Echo "Performing '$MAKE $MAKEOPTS basics OPTS="$OPTS" QUIET="$QUIET"' in $VERSION/tmp"
588 cd $DESTINATION/tmp 
589 $MAKE $MAKEOPTS basics OPTS="$OPTS $BUILD_SHARED" QUIET="$QUIET"
590 MAKEEXIT=$?
591 [ $MAKEEXIT -ne 0 ] && printError
592
593 Echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS" QUIET="$QUIET"' in $VERSION/tmp"
594 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED" QUIET="$QUIET"
595 MAKEEXIT=$?
596 if [ $MAKEEXIT -eq 0 ]
597 then
598         Echo "-------------------------------------------------"
599         Echo "$PROGRAM built successfully."
600         Echo "Next, try out a sample program like" \
601              "$DESTINATION/tests/charm++/simplearrayhello"
602 else
603         printError
604 fi