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