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