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