deleting comment regarding subscription (never worked)
[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 -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   fi
90   echo ''
91   echo '<charmc-options>: normal compiler options e.g. -g -O -save -verbose'
92   if test $more = 1
93   then
94   echo ''
95   echo 'Examples:'
96   echo "1. display all supported options for net-linux using 'help':"
97   echo '  ./build charm++ net-linux help'
98   echo '2. compile Charm++ on Linux with optimizations:'
99   echo '  ./build charm++ net-linux -O -DCMK_OPTIMIZE'
100   echo '3. compile Charm++ for Linux clustermatic Beowulf cluster with Intel compiler:'
101   echo '  ./build charm++ net-linux clustermatic icc -O'
102   echo '4. compile Charm++ for IA64 Linux cluster with MPICH-GM:'
103   echo '  ./build charm++ mpi-linux-ia64 gm -O'
104   echo '5. compile Charm++ for Windows with VC++ (Cygwin required):'
105   echo '  ./build charm++ net-win32 -O'
106   echo '6. compile on IBM SP with MPI using parallel gmake, 4 jobs simultaneously:'
107   echo '  MAKE=gmake  ./build charm++ mpi-sp -j4 -O            # sh'
108   echo '  setenv MAKE gmake;  ./build charm++ mpi-sp -j4 -O    # csh'
109   echo '7. compile Charm++ with MPI that is installed at /usr/local/mpich:'
110   echo '  ./build charm++ mpi-linux --incdir /usr/local/mpich/include --libdir /usr/local/mpich/lib -O'
111   echo '   or in short,'
112   echo '  ./build charm++ mpi-linux --basedir /usr/local/mpich -O'
113   echo ''
114   echo 'Note: This script:'
115   echo ' 1. Creates directories <version> and <version>/tmp';
116   echo ' 2. Copies src/scripts/Makefile into <version>/tmp';
117   echo ' 3. Does a "make <target> <version> OPTS=<charmc-options>" in <version>/tmp.'
118   echo "That's all build does.  The rest is handled by the Makefile."
119   echo ''
120   echo 'Thank you for using Charm++, please send questions or comments to '
121   echo 'Parallel Programming Lab at University of Illinois at Urbana-Champaign'
122   echo '(email: ppl@cs.uiuc.edu).'
123
124   else
125   echo ''
126   echo "To get more detailed help, run ./build --help"
127   fi
128 }
129
130 printOption() {
131   for prefix in cc conv-mach
132   do
133     str="Supported compilers:"
134     [ "$prefix" = "conv-mach" ] && str="Supported options:"
135     opts=""
136     for dir in $OPT_DIRS
137     do
138 #         echo "Checking for $prefix in $dir"
139           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
140           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
141     done 
142     tmp=.tmp.$$
143     rm -f $tmp; touch $tmp
144     for o in $opts
145     do
146       echo $o >> $tmp
147     done
148     opts=`sort $tmp | uniq`
149     rm -f $tmp
150     echo $str $opts
151   done
152   exit 1
153 }
154
155 CheckDir() {
156   for d in $*
157   do
158     if test ! -d $d
159     then
160       echo Error: cannot find $d!
161       exit 1
162     fi
163   done
164 }
165
166 TestIfCompiler() {
167   for dir in $OPT_DIRS
168   do
169     [ -f $dir/cc-$1.sh ] && return 1
170   done  
171   return 0
172 }
173
174 TestIfOption() {
175   for dir in $OPT_DIRS
176   do
177     [ -f $dir/conv-mach-$1.h ] && return 1 
178   done
179   
180   echo "Error> option: $1 is not supported in this version!"; 
181   printOption
182 }
183
184
185 # start
186
187 MAKEOPTS=""
188 OPTS=""
189 BOPTS=""
190 MORE=""
191 COMPILER=""
192 BASEDIR=
193 LIBDIR=
194 INCDIR=
195 ARCH=
196 BUILD_SHARED=
197 WITH_ROMIO=
198 BUILD_EMULATOR=0
199
200 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | more && exit 1
201 [ $# -lt 2 ] && ./smart-build.pl && exit 1
202 PROGRAM=$1
203 shift
204 VERSION=$1; BASEVERSION=$1; 
205 if test -f $src/$BASEVERSION/vdir_link
206 then
207   BASEVERSION=`cat $src/$BASEVERSION/vdir_link`
208 fi
209 ARCH=`echo $1 | sed -e 's@-.*@@'`
210 shift
211
212 #echo $src
213 #echo $BASEVERSION
214 #echo $ARCH
215
216 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
217
218 while [ ! $# -eq 0 ]
219 do
220   case "$1" in
221     "--basedir")
222                 shift; 
223                 for dir in $1
224                 do
225                   CheckDir $dir/include $dir/lib
226                   LIBDIR="$LIBDIR -L$dir/lib";
227                   INCDIR="$INCDIR -I$dir/include"
228                 done
229                 shift
230                 ;;
231     --basedir=*)
232                 basedir=`echo $1 | awk -F= '{print $2}'`
233                 for dir in $basedir
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     "--libdir")
242                 shift; CheckDir $1
243                 for dir in $1
244                 do
245                   LIBDIR="$LIBDIR -L$dir"; 
246                 done
247                 shift
248                 ;;
249     --libdir=*)
250                 libdir=`echo $1 | awk -F= '{print $2}'`
251                 CheckDir $libdir
252                 for dir in $libdir
253                 do
254                   LIBDIR="$LIBDIR -L$dir"; 
255                 done
256                 shift
257                 ;;
258     "--incdir")
259                 shift; CheckDir $1
260                 for dir in $1
261                 do
262                   INCDIR="$INCDIR -I$dir"; 
263                 done
264                 shift
265                 ;;
266     --incdir=*)
267                 incdir=`echo $1 | awk -F= '{print $2}'`
268                 CheckDir $incdir
269                 for dir in $incdir
270                 do
271                   INCDIR="$INCDIR -I$dir"; 
272                 done
273                 shift
274                 ;;
275     --no-build-shared|-nobs|--no-shared)
276                 BUILD_SHARED="-nobs"; shift
277                 ;;
278     --with-romio)
279                 WITH_ROMIO="true"; shift
280                 ;;
281     --build-shared|-bs)
282                 # obsolete, do nothing
283                 shift
284                 ;;
285     -j*)
286                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
287                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
288                 shift;
289                 ;;
290     -*) 
291 # We hit a real compiler option (like -g, or -Dfoo),
292 # so just copy over all remaining options
293           while [ ! $# -eq 0 ]
294           do
295             OPTS="$OPTS $1"; shift
296           done
297           ;;
298     "help")
299         printOption
300         ;;
301     *)
302 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
303         TestIfCompiler $1
304         if [ $? -eq 1 ] 
305         then
306 # It specifies a compiler:
307           if [ ! -z "$COMPILER" ] 
308           then
309               echo "Error> Tried to specify two compilers: $COMPILER and $1"
310               printOption
311           fi
312           COMPILER=$1
313         else
314 # It specifies some other option:
315           TestIfOption $1
316           BOPTS="$BOPTS $1"
317           [ $1 =  "bigemulator" ] && BUILD_EMULATOR=1
318         fi
319         shift
320         ;;
321   esac
322 done
323
324 [ "x$VERSION" = "x" ] && syntax && exit 1
325
326 if [ -z "$MAKE" ] 
327 then
328   # prefer gmake
329   MAKE=`which gmake 2>/dev/null`
330   [ -z "$MAKE" -o ! -x "$MAKE" ] && MAKE='make'
331 fi
332
333 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
334 then
335   echo "Error> build can not find arch: $BASEVERSION!" 
336   exit 1
337 fi
338
339 #generate VERSION name combining all the build-time options.
340 if [ -n "$BOPTS" -o -n "$COMPILER" ]
341 then
342   echo "Selected Compiler: $COMPILER"
343   echo "Selected Options: $BOPTS"
344   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
345   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
346   for i in $BOPTS_WITHCOMPILER
347   do
348     VERSION=$VERSION-$i
349   done
350 fi
351
352 [ -d $VERSION ] || echo "Creating dir: $VERSION" 
353 [ -d $VERSION ] || mkdir $VERSION
354 [ -d $VERSION/tmp ] || echo "Creating dir: $VERSION/tmp" 
355 [ -d $VERSION/tmp ] || mkdir $VERSION/tmp
356
357 echo "Copying src/scripts/Makefile to $VERSION/tmp"
358 rm -f $VERSION/tmp/Makefile
359 rm -f $VERSION/tmp/Make.depends
360 rm -f $VERSION/tmp/Make.lb
361 rm -f $VERSION/tmp/Make.machine
362
363
364 # Create the bin, lib, include, etc. links:
365 if [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win32" ]
366 then
367 #Win32 version needs special compilers and *copied* (not linked)
368 # source files.
369         echo "Copying compilers for win32 into cygwin /bin directory"
370         cp $src/win32/unix2nt* /bin
371         cp $src/win32/system_ln $VERSION/tmp
372         cp $src/win32/unistd.h $VERSION/tmp
373         cp $src/win32/createlink.exe /bin
374   chmod +x $VERSION/tmp/system_ln
375 elif [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win64" ]
376 then
377 #Win64 version needs special compilers and *copied* (not linked)
378 # source files.
379         echo "Copying compilers for win64 into cygwin /bin directory"
380         cp $src/win64/unix2nt* /bin
381         cp $src/win32/system_ln $VERSION/tmp
382         cp $src/win32/unistd.h $VERSION/tmp
383         cp $src/win32/unistd.h $VERSION/include
384         cp $src/win32/createlink.exe /bin
385   chmod +x $VERSION/tmp/system_ln
386 else
387         cat > $VERSION/tmp/system_ln <<EOF
388 #!/bin/sh
389 ln -f -s \$@
390 EOF
391   chmod +x $VERSION/tmp/system_ln
392   for newdir in `echo bin lib lib_so include tmp`
393   do
394     echo "Soft-linking over $newdir"
395     if [ -r $newdir ]
396     then
397       rm -fr $newdir || exit 1
398     fi
399     $VERSION/tmp/system_ln $VERSION/$newdir $newdir
400   done
401   rm -f VERSION
402   $VERSION/tmp/system_ln $VERSION/include/VERSION VERSION
403 fi
404
405 $VERSION/tmp/system_ln "../../src/scripts/Make.depends" $VERSION/tmp/Make.depends
406 $VERSION/tmp/system_ln "../../src/ck-ldb/Make.lb" $VERSION/tmp/Make.lb
407 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
408 touch $VERSION/tmp/Makefile.machine
409
410 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
411 echo "Generating $ConvUsr"
412 echo > $ConvUsr
413 if test -n "$LIBDIR" 
414 then
415   echo 'USER_OPTS_LD="$USER_OPTS_LD '$LIBDIR'"' >> $ConvUsr
416   echo 'USER_OPTS_LDXX="$USER_OPTS_LDXX '$LIBDIR'"' >> $ConvUsr
417 fi
418 if test -n "$INCDIR" 
419 then
420   echo 'USER_OPTS_CC="$USER_OPTS_CC '$INCDIR'"' >> $ConvUsr
421   echo 'USER_OPTS_CXX="$USER_OPTS_CXX '$INCDIR'"' >> $ConvUsr
422 fi
423 chmod +x $ConvUsr
424
425 # Create conv-mach-opt headers with special build-time options
426 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
427 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
428 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
429 then
430   echo "Generating $ConvHeader, conv-mach-opt.sh"
431   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
432   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
433   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
434 fi
435 if test -n "$COMPILER"
436 then
437       i="$COMPILER"
438       echo '#include "'cc-$i.h'"' >> $ConvHeader
439       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
440 fi
441 if test -n "$BOPTS"
442 then
443     for i in $BOPTS
444     do
445       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
446       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
447     done
448 fi
449
450 if test  -n "$BUILD_SHARED" 
451 then
452     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
453 fi
454
455 if test  -n "$WITH_ROMIO" 
456 then
457     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
458 fi
459
460 echo $BASEVERSION > $VERSION/tmp/.vdir
461
462 if test $BUILD_EMULATOR = 1
463 then
464   PROGRAM="$PROGRAM bigsim"
465 fi
466
467 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
468 cd $VERSION/tmp 
469 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
470
471 MAKEEXIT=$?
472 if [ $MAKEEXIT -eq 0 ]
473 then
474         echo "-------------------------------------------------"
475         echo "$PROGRAM built successfully."
476         echo "Next, try out a sample program like" \
477              "tests/charm++/simplearrayhello"
478 else
479         echo "-------------------------------------------------"
480         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
481         echo "to resolve the problems yourself, visit"
482         echo "    http://charm.cs.uiuc.edu/"
483         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
484         exit $MAKEEXIT
485 fi