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