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