Merge branch 'charm' of charmgit:charm into charm
[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 "  --destination=DIR  build Charm++ inside DIR, by default the destination is <version>"
93   echo "  --suffix=DIR       append DIR to the destination directory of the Charm++ build"
94   echo "  --tau-makefile=FILE Specify which TAU stub makefile to use"
95   fi
96   echo ''
97   echo '<charmc-options>: normal compiler options e.g. -g -O -save -verbose'
98   if test $more = 1
99   then
100   echo ''
101   echo 'Examples:'
102   echo "1. display all supported options for net-linux using 'help':"
103   echo '  ./build charm++ net-linux help'
104   echo '2. compile Charm++ on Linux with optimizations:'
105   echo '  ./build charm++ net-linux -O -DCMK_OPTIMIZE'
106   echo '3. compile Charm++ for Linux clustermatic Beowulf cluster with Intel compiler:'
107   echo '  ./build charm++ net-linux clustermatic icc -O'
108   echo '4. compile Charm++ for IA64 Linux cluster with MPICH-GM:'
109   echo '  ./build charm++ mpi-linux-ia64 gm -O'
110   echo '5. compile Charm++ for Windows with VC++ (Cygwin required):'
111   echo '  ./build charm++ net-win32 -O'
112   echo '6. compile on IBM SP with MPI using parallel gmake, 4 jobs simultaneously:'
113   echo '  MAKE=gmake  ./build charm++ mpi-sp -j4 -O            # sh'
114   echo '  setenv MAKE gmake;  ./build charm++ mpi-sp -j4 -O    # csh'
115   echo '7. compile Charm++ with MPI that is installed at /usr/local/mpich:'
116   echo '  ./build charm++ mpi-linux --incdir /usr/local/mpich/include --libdir /usr/local/mpich/lib -O'
117   echo '   or in short,'
118   echo '  ./build charm++ mpi-linux --basedir /usr/local/mpich -O'
119   echo '  ./build Tau --tau-makefile=/usr/local/packages/TAU/x86_64/lib/Makefile.tau-mpi'
120   echo ''
121   echo 'Note: This script:'
122   echo ' 1. Creates directories <destination> and <destination>/tmp'
123   echo ' 2. Copies src/scripts/Makefile into <destination>/tmp'
124   echo ' 3. Does a "make basics" in <destination>/tmp.'
125   echo ' 3. Does a "make -jN <target> <version> OPTS=<charmc-options>" in <destination>/tmp.'
126   echo "That's all build does.  The rest is handled by the Makefile."
127   echo ''
128   echo 'Thank you for using Charm++, please send questions or comments to '
129   echo 'Parallel Programming Lab at University of Illinois at Urbana-Champaign'
130   echo '(email: charm@cs.uiuc.edu).'
131
132   else
133   echo ''
134   echo "To get more detailed help, run ./build --help"
135   fi
136 }
137
138 printOption() {
139   for prefix in cc conv-mach
140   do
141     str="Supported compilers:"
142     [ "$prefix" = "conv-mach" ] && str="Supported options:"
143     opts=""
144     for dir in $OPT_DIRS
145     do
146 #         echo "Checking for $prefix in $dir"
147           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
148           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
149     done 
150     tmp=.tmp.$$
151     rm -f $tmp; touch $tmp
152     for o in $opts
153     do
154       echo $o >> $tmp
155     done
156     opts=`sort $tmp | uniq`
157     rm -f $tmp
158     echo $str $opts
159   done
160   exit 1
161 }
162
163 CheckDir() {
164   for d in $*
165   do
166     if test ! -d $d
167     then
168       echo Error: cannot find $d!
169       exit 1
170     fi
171   done
172 }
173
174 TestIfCompiler() {
175   for dir in $OPT_DIRS
176   do
177     [ -f $dir/cc-$1.sh ] && return 1
178   done  
179   return 0
180 }
181
182 TestIfOption() {
183   for dir in $OPT_DIRS
184   do
185     [ -f $dir/conv-mach-$1.h ] && return 1 
186   done
187   
188   echo "Error> option: $1 is not supported in this version!"; 
189   printOption
190 }
191
192
193 # start
194
195 MAKEOPTS=""
196 OPTS=""
197 BOPTS=""
198 MORE=""
199 COMPILER=""
200 BASEDIR=
201 LIBDIR=
202 INCDIR=
203 ARCH=
204 BUILD_SHARED=
205 WITH_ROMIO=
206 BUILD_EMULATOR=0
207 DESTINATION=""
208 DESTINATION_SUFFIX=""
209 TAU_MAKEFILE=""
210
211 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | more && exit 1
212 [ $# -lt 2 ] && ./smart-build.pl && exit 1
213 PROGRAM=$1
214 shift
215 VERSION=$1; BASEVERSION=$1; 
216 if test -f $src/$BASEVERSION/vdir_link
217 then
218   BASEVERSION=`cat $src/$BASEVERSION/vdir_link`
219 fi
220 ARCH=`echo $1 | sed -e 's@-.*@@'`
221 shift
222
223 #echo $src
224 #echo $BASEVERSION
225 #echo $ARCH
226
227 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
228
229 while [ ! $# -eq 0 ]
230 do
231   case "$1" in
232     "--basedir")
233                 shift; 
234                 for dir in $1
235                 do
236                   CheckDir $dir/include $dir/lib
237                   LIBDIR="$LIBDIR -L$dir/lib";
238                   INCDIR="$INCDIR -I$dir/include"
239                 done
240                 shift
241                 ;;
242     --basedir=*)
243                 basedir=`echo $1 | awk -F= '{print $2}'`
244                 for dir in $basedir
245                 do
246                   CheckDir $dir/include $dir/lib
247                   LIBDIR="$LIBDIR -L$dir/lib";
248                   INCDIR="$INCDIR -I$dir/include"
249                 done
250                 shift
251                 ;;
252     "--libdir")
253                 shift; CheckDir $1
254                 for dir in $1
255                 do
256                   LIBDIR="$LIBDIR -L$dir"; 
257                 done
258                 shift
259                 ;;
260     --libdir=*)
261                 libdir=`echo $1 | awk -F= '{print $2}'`
262                 CheckDir $libdir
263                 for dir in $libdir
264                 do
265                   LIBDIR="$LIBDIR -L$dir"; 
266                 done
267                 shift
268                 ;;
269     "--incdir")
270                 shift; CheckDir $1
271                 for dir in $1
272                 do
273                   INCDIR="$INCDIR -I$dir"; 
274                 done
275                 shift
276                 ;;
277     --incdir=*)
278                 incdir=`echo $1 | awk -F= '{print $2}'`
279                 CheckDir $incdir
280                 for dir in $incdir
281                 do
282                   INCDIR="$INCDIR -I$dir"; 
283                 done
284                 shift
285                 ;;
286     --no-build-shared|-nobs|--no-shared)
287                 BUILD_SHARED="-nobs"; shift
288                 ;;
289     --with-romio)
290                 WITH_ROMIO="true"; shift
291                 ;;
292     --build-shared|-bs)
293                 # obsolete, do nothing
294                 shift
295                 ;;
296     --destination)
297                 shift
298                 DESTINATION="$1"
299                 shift
300                 ;;
301     --destination=*)
302                 DESTINATION="`echo $1 | awk -F= '{print $2}'`"
303                 shift
304                 ;;
305     --suffix)
306                 shift
307                 DESTINATION_SUFFIX="$1"
308                 shift
309                 ;;
310     --suffix=*)
311                 DESTINATION_SUFFIX="`echo $1 | awk -F= '{print $2}'`"
312                 shift
313                 ;;
314     --tau-makefile)
315                 TAU_MAKEFILE=$1
316                 shift
317                 ;;
318     --tau-makefile=*)
319                 TAU_MAKEFILE=`echo $1 | awk -F= '{print $2}'`
320                 shift
321                 ;;
322     --quiet)
323                 MAKEOPTS="$MAKEOPTS --quiet"
324                 shift;
325                 ;;
326     -j*)
327                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
328                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
329                 shift;
330                 ;;
331     -*) 
332 # We hit a real compiler option (like -g, or -Dfoo),
333 # so just copy over all remaining options
334           while [ ! $# -eq 0 ]
335           do
336             OPTS="$OPTS $1"; shift
337           done
338           ;;
339     "help")
340         printOption
341         ;;
342     *)
343 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
344         TestIfCompiler $1
345         if [ $? -eq 1 ] 
346         then
347 # It specifies a compiler:
348           if [ ! -z "$COMPILER" ] 
349           then
350               echo "Error> Tried to specify two compilers: $COMPILER and $1"
351               printOption
352           fi
353           COMPILER=$1
354         else
355 # It specifies some other option:
356           TestIfOption $1
357           BOPTS="$BOPTS $1"
358           [ $1 =  "bigemulator" ] && BUILD_EMULATOR=1
359         fi
360         shift
361         ;;
362   esac
363 done
364
365 [ "x$VERSION" = "x" ] && syntax && exit 1
366
367 if [ -z "$MAKE" ] 
368 then
369   # prefer gmake
370   MAKE=`which gmake 2>/dev/null`
371   [ -z "$MAKE" -o ! -x "$MAKE" ] && MAKE='make'
372 fi
373
374 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
375 then
376   if [ "x_$BASEVERSION" = "x_net-rs6k" ]
377   then
378     echo "Error> build net-aix-ppc instead of net-rs6k!" 
379   else
380     echo "Error> build can not find arch: $BASEVERSION!" 
381   fi
382   exit 1
383 fi
384
385 #generate VERSION name combining all the build-time options.
386 if [ -n "$BOPTS" -o -n "$COMPILER" ]
387 then
388   echo "Selected Compiler: $COMPILER"
389   echo "Selected Options: $BOPTS"
390   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
391   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
392   for i in $BOPTS_WITHCOMPILER
393   do
394     VERSION=$VERSION-$i
395   done
396 fi
397
398 #echo "|$DESTINATION|$DESTINATION_SUFFIX|"
399
400 if [ -z "$DESTINATION" ]
401 then
402   DESTINATION="$VERSION"
403 fi
404
405 if [ -n "$DESTINATION_SUFFIX" ]
406 then
407   DESTINATION="$DESTINATION-$DESTINATION_SUFFIX"
408 fi
409
410 [ -d $DESTINATION ] || echo "Creating dir: $DESTINATION" 
411 [ -d $DESTINATION ] || mkdir $DESTINATION
412 [ -d $DESTINATION/tmp ] || echo "Creating dir: $DESTINATION/tmp" 
413 [ -d $DESTINATION/tmp ] || mkdir $DESTINATION/tmp
414
415 echo "Copying src/scripts/Makefile to $DESTINATION/tmp"
416 rm -f $DESTINATION/tmp/Makefile
417 rm -f $DESTINATION/tmp/Make.depends
418 rm -f $DESTINATION/tmp/Make.lb
419 rm -f $DESTINATION/tmp/Make.machine
420
421
422 # Create the bin, lib, include, etc. links:
423 WINNAME=`echo $VERSION | awk -F- '{print $2}'`
424 if [ "x_$WINNAME" = "x_win32" -o "x_$WINNAME" = "x_win64" ]
425 then
426 #Win32/64 version needs special compilers and *copied* (not linked)
427 # source files.
428         echo "Copying compilers for $WINNAME into cygwin /bin directory"
429         cp -f $src/$WINNAME/unix2nt* /bin
430         cp $src/win32/system_ln $DESTINATION/tmp
431         cp $src/win32/unistd.h $DESTINATION/tmp
432         echo "Compiling createlink.cpp ..."
433         (cd $src/win32; unix2nt_cc  -c createlink.cpp -o createlink.o -D_WIN32_WINNT=0x0500; unix2nt_cc createlink.o)
434         if test ! -x $src/win32/createlink.exe
435         then
436                 echo "VC++ is not properly installed!"
437                 exit 1
438         fi
439         echo "Copying $src/win32/createlink.exe to /bin directory"
440         cp $src/win32/createlink.exe /bin
441         chmod +x $DESTINATION/tmp/system_ln
442 else
443         cat > $DESTINATION/tmp/system_ln <<EOF
444 #!/bin/sh
445 ln -f -s \$@
446 EOF
447   chmod +x $DESTINATION/tmp/system_ln
448   for newdir in `echo bin lib lib_so include tmp`
449   do
450     echo "Soft-linking over $newdir"
451     if [ -r $newdir ]
452     then
453       rm -fr $newdir || exit 1
454     fi
455     $DESTINATION/tmp/system_ln $DESTINATION/$newdir $newdir
456   done
457   rm -f VERSION
458   $DESTINATION/tmp/system_ln $DESTINATION/include/VERSION VERSION
459 fi
460
461 $DESTINATION/tmp/system_ln "../../src/scripts/Make.depends" $DESTINATION/tmp/Make.depends
462 $DESTINATION/tmp/system_ln "../../src/ck-ldb/Make.lb" $DESTINATION/tmp/Make.lb
463 $DESTINATION/tmp/system_ln "../../src/scripts/Makefile" $DESTINATION/tmp/Makefile
464 $DESTINATION/tmp/system_ln "../../src/scripts/Make.tau" $DESTINATION/tmp/Make.tau
465 touch $DESTINATION/tmp/Makefile.machine
466
467 ConvUsr="$DESTINATION/tmp/conv-mach-pre.sh"
468 echo "Generating $ConvUsr"
469 echo > $ConvUsr
470 if test -n "$LIBDIR" 
471 then
472   echo 'USER_OPTS_LD="$USER_OPTS_LD '$LIBDIR'"' >> $ConvUsr
473   echo 'USER_OPTS_LDXX="$USER_OPTS_LDXX '$LIBDIR'"' >> $ConvUsr
474 fi
475 if test -n "$INCDIR" 
476 then
477   echo 'USER_OPTS_CC="$USER_OPTS_CC '$INCDIR'"' >> $ConvUsr
478   echo 'USER_OPTS_CXX="$USER_OPTS_CXX '$INCDIR'"' >> $ConvUsr
479 fi
480 chmod +x $ConvUsr
481
482 # Create conv-mach-opt headers with special build-time options
483 ConvHeader="$DESTINATION/tmp/conv-mach-opt.h"
484 ConvSh="$DESTINATION/tmp/conv-mach-opt.sh"
485 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
486 then
487   echo "Generating $ConvHeader, conv-mach-opt.sh"
488   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
489   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
490   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
491 fi
492 if test -n "$COMPILER"
493 then
494       i="$COMPILER"
495       echo '#include "'cc-$i.h'"' >> $ConvHeader
496       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
497 fi
498 if test -n "$BOPTS"
499 then
500     for i in $BOPTS
501     do
502       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
503       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
504     done
505 fi
506
507 if test  -n "$BUILD_SHARED" 
508 then
509     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
510 fi
511
512 if test  -n "$WITH_ROMIO" 
513 then
514     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
515 fi
516
517
518 # build with Tau
519 WITH_TAU=0
520 if [ "$PROGRAM" = "Tau" ]
521 then
522         echo "TAU>>>> makefile config option: $TAU_MAKEFILE"
523         if [ -n "$TAU_MAKEFILE" -a -f $TAU_MAKEFILE ]
524         then
525           #Setting up TAU trace library:
526           echo "TAU>>>> configuring with this TAU makefile: $TAU_MAKEFILE"
527
528           WITH_TAU=1
529         else
530           echo "TAU>>>> ERROR could not find Makefile: $TAU_MAKEFILE, ignored"
531           TAU_MAKEFILE=""
532         fi
533 fi
534 [ -z "$TAU_MAKEFILE" ] && TAU_MAKEFILE="Make.tau"
535 SED_CHARMC="s@TAU_MAKEFILE=\(.*\)@TAU_MAKEFILE=$TAU_MAKEFILE@"
536
537 sed -e $SED_CHARMC src/scripts/Makefile > .Makefile.$$ && cp .Makefile.$$ src/scripts/Makefile && rm -f  .Makefile.$$
538 sed -e $SED_CHARMC src/scripts/charmc > .charmc.$$ && cp .charmc.$$ src/scripts/charmc && rm -f .charmc.$$
539
540 if test $WITH_TAU -eq 1
541 then
542     echo "#define CMK_WITH_TAU               1" >> $ConvHeader
543     echo "#define pthread_create             tau_pthread_create" >> $ConvHeader
544     echo "#define pthread_exit               tau_pthread_exit" >> $ConvHeader
545
546     echo "CMK_WITH_TAU=\"true\"" >> $ConvSh
547 fi
548
549
550 echo $BASEVERSION > $DESTINATION/tmp/.vdir
551 echo $VERSION | sed -e 's@-.*@@' > $DESTINATION/tmp/.gdir
552
553 if test $BUILD_EMULATOR = 1
554 then
555   PROGRAM="$PROGRAM bigsim"
556 fi
557
558 printError()
559 {
560         echo "-------------------------------------------------"
561         echo "Charm++ NOT BUILT. Either cd into $DESTINATION/tmp and try"
562         echo "to resolve the problems yourself, visit"
563         echo "    http://charm.cs.uiuc.edu/"
564         echo "for more information. Otherwise, email the developers at charm@cs.uiuc.edu"
565         exit $MAKEEXIT
566 }
567
568 echo "Performing '$MAKE $MAKEOPTS basics OPTS="$OPTS"' in $VERSION/tmp"
569 cd $DESTINATION/tmp 
570 $MAKE $MAKEOPTS basics OPTS="$OPTS $BUILD_SHARED"
571 MAKEEXIT=$?
572 [ $MAKEEXIT -ne 0 ] && printError
573
574 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
575 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
576 MAKEEXIT=$?
577 if [ $MAKEEXIT -eq 0 ]
578 then
579         echo "-------------------------------------------------"
580         echo "$PROGRAM built successfully."
581         echo "Next, try out a sample program like" \
582              "tests/charm++/simplearrayhello"
583 else
584         printError
585 fi