don't display "template"
[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 fi
339
340 $VERSION/tmp/system_ln "../../src/scripts/Make.depends" $VERSION/tmp/Make.depends
341 $VERSION/tmp/system_ln "../../src/ck-ldb/Make.lb" $VERSION/tmp/Make.lb
342 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
343
344 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
345 echo "Generating $ConvUsr"
346 echo > $ConvUsr
347 if test -n "$LIBDIR" 
348 then
349   echo 'OPTS_LD="$OPTS_LD '$LIBDIR'"' >> $ConvUsr
350   echo 'OPTS_LDXX="$OPTS_LDXX '$LIBDIR'"' >> $ConvUsr
351 fi
352 if test -n "$INCDIR" 
353 then
354   echo 'OPTS_CC="$OPTS_CC '$INCDIR'"' >> $ConvUsr
355   echo 'OPTS_CXX="$OPTS_CXX '$INCDIR'"' >> $ConvUsr
356 fi
357 chmod +x $ConvUsr
358
359 # Create conv-mach-opt headers with special build-time options
360 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
361 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
362 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
363 then
364   echo "Generating $ConvHeader, conv-mach-opt.sh"
365   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
366   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
367   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
368 fi
369 if test -n "$COMPILER"
370 then
371       i="$COMPILER"
372       echo '#include "'cc-$i.h'"' >> $ConvHeader
373       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
374 fi
375 if test -n "$BOPTS"
376 then
377     for i in $BOPTS
378     do
379       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
380       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
381     done
382 fi
383
384 if test  -n "$BUILD_SHARED" 
385 then
386     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
387 fi
388
389 if test  -n "$WITH_ROMIO" 
390 then
391     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
392 fi
393
394 echo $BASEVERSION > $VERSION/tmp/.vdir
395
396 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
397 cd $VERSION/tmp 
398 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
399
400 MAKEEXIT=$?
401 if [ $MAKEEXIT -eq 0 ]
402 then
403         echo "-------------------------------------------------"
404         echo "$PROGRAM built successfully."
405         echo "Next, try out a sample program like" \
406              "tests/charm++/simplearrayhello"
407 else
408         echo "-------------------------------------------------"
409         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
410         echo "to resolve the problems yourself, visit"
411         echo "    http://charm.cs.uiuc.edu/"
412         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
413         exit $MAKEEXIT
414 fi