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