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