added syncft option in help page
[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'
31   echo '--incdir --libdir --basedir --build-shared --no-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 ''
63   echo "Charm++ dynamic libraries:"
64   echo "  --build-shared  build Charm++ dynamic libraries (.so), this is on by default"
65   echo "  --no-shared     disable the compilation for Charm++'s shared libraries"
66   echo ''
67   echo 'Miscellaneous options:'
68   echo '  --incdir=DIR    specify additional include path for compiler'
69   echo '  --libdir=DIR    specify additional lib path for compiler'
70   echo '  --basedir=DIR   shortcut for the above two - DIR/include and DIR/lib'
71   echo '  -j[N]           parallel make, N is the number of paralle make jobs'
72   fi
73   echo ''
74   echo '<charmc-options>: normal compiler options e.g. -g -O -save -verbose'
75   if test $more = 1
76   then
77   echo ''
78   echo 'Examples:'
79   echo "1. display all supported options for net-linux using 'help':"
80   echo '  ./build charm++ net-linux help'
81   echo '2. compile Charm++ on Linux with optimizations:'
82   echo '  ./build charm++ net-linux -O -DCMK_OPTIMIZE'
83   echo '3. compile Charm++ for Linux clustermatic Beowulf cluster with Intel compiler:'
84   echo '  ./build charm++ net-linux clustermatic icc -O'
85   echo '4. compile Charm++ for IA64 Linux cluster with MPICH-GM:'
86   echo '  ./build charm++ mpi-linux-ia64 gm -O'
87   echo '5. compile Charm++ for Windows with VC++ (Cygwin required):'
88   echo '  ./build charm++ net-win32 -O'
89   echo '6. compile on IBM SP with MPI using parallel gmake, 4 jobs simultaneously:'
90   echo '  MAKE=gmake  ./build charm++ mpi-sp -j4 -O            # sh'
91   echo '  setenv MAKE gmake;  ./build charm++ mpi-sp -j4 -O    # csh'
92   echo ''
93   echo 'Note: This script:'
94   echo ' 1. Creates directories <version> and <version>/tmp';
95   echo ' 2. Copies src/scripts/Makefile into <version>/tmp';
96   echo ' 3. Does a "make <target> <version> OPTS=<charmc-options>" in <version>/tmp.'
97   echo "That's all build does.  The rest is handled by the Makefile."
98   echo ''
99   echo 'Thank you for using Charm++, please send questions or comments to Parallel Programming Lab at University of Illinois at Urbana-Champaign(email: ppl@cs.uiuc.edu).'
100   else
101   echo ''
102   echo "To get more detailed help, run ./build --help"
103   fi
104 }
105
106 printOption() {
107   for prefix in cc conv-mach
108   do
109     str="Supported compilers:"
110     [ "$prefix" = "conv-mach" ] && str="Supported options:"
111     opts=""
112     for dir in $OPT_DIRS
113     do
114 #         echo "Checking for $prefix in $dir"
115           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
116           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
117     done 
118     echo $str $opts
119   done
120   exit 1
121 }
122
123 CheckDir() {
124   for dir in $*
125   do
126     if test ! -d $dir
127     then
128       echo Error: cannot find $1!
129       exit 1
130     fi
131   done
132 }
133
134 TestIfCompiler() {
135   for dir in $OPT_DIRS
136   do
137     [ -f $dir/cc-$1.sh ] && return 1
138   done  
139   return 0
140 }
141
142 TestIfOption() {
143   for dir in $OPT_DIRS
144   do
145     [ -f $dir/conv-mach-$1.h ] && return 1 
146   done
147   
148   echo "Error> option: $1 is not supported in this version!"; 
149   printOption
150 }
151
152
153 # start
154
155 MAKEOPTS=""
156 OPTS=""
157 BOPTS=""
158 MORE=""
159 COMPILER=""
160 BASEDIR=
161 LIBDIR=
162 INCDIR=
163 ARCH=
164 BUILD_SHARED="-build-shared"
165
166 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | more && exit 1
167 [ $# -lt 2 ] && syntax && exit 1
168 PROGRAM=$1
169 shift
170 VERSION=$1; BASEVERSION=$1; ARCH=`echo $1 | sed -e 's@-.*@@'`
171 shift
172
173 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
174
175 while [ ! $# -eq 0 ]
176 do
177   case "$1" in
178             "--basedir")
179                 shift; CheckDir $1/include $1/lib
180                 LIBDIR="$LIBDIR -L$1/lib";
181                 INCDIR="$INCDIR -I$1/include"; shift
182                 ;;
183             --basedir=*)
184                 basedir=`echo $1 | awk -F= '{print $2}'`
185                 CheckDir $basedir/include $basedir/lib
186                 LIBDIR="$LIBDIR -L$basedir/lib";
187                 INCDIR="$INCDIR -I$basedir/include"; shift
188                 ;;
189             "--libdir")
190                 shift; CheckDir $1
191                 LIBDIR="$LIBDIR -L$1"; shift
192                 ;;
193             --libdir=*)
194                 libdir=`echo $1 | awk -F= '{print $2}'`
195                 CheckDir $libdir
196                 LIBDIR="$LIBDIR -L$libdir"; shift
197                 ;;
198             "--incdir")
199                 shift; CheckDir $1
200                 INCDIR="$INCDIR -I$1"; shift
201                 ;;
202             --incdir=*)
203                 incdir=`echo $1 | awk -F= '{print $2}'`
204                 CheckDir $incdir
205                 INCDIR="$INCDIR -I$incdir"; shift
206                 ;;
207             --no-shared)
208                 BUILD_SHARED=""; shift
209                 ;;
210             -j*)
211                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
212                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
213                 shift;
214                 ;;
215     -*) 
216 # We hit a real compiler option (like -g, or -Dfoo),
217 # so just copy over all remaining options
218           while [ ! $# -eq 0 ]
219           do
220             OPTS="$OPTS $1"; shift
221           done
222           ;;
223     "help")
224         printOption
225         ;;
226     *)
227 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
228         TestIfCompiler $1
229         if [ $? -eq 1 ] 
230         then
231 # It specifies a compiler:
232           if [ ! -z "$COMPILER" ] 
233           then
234               echo "Error> Tried to specify two compilers: $COMPILER and $1"
235               printOption
236           fi
237           COMPILER=$1
238         else
239 # It specifies some other option:
240           TestIfOption $1
241           BOPTS="$BOPTS $1"
242         fi
243         shift
244         ;;
245   esac
246 done
247
248 [ "x$VERSION" = "x" ] && syntax && exit 1
249
250 [ -z "$MAKE" ] && MAKE='make'
251
252 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
253 then
254   echo "Error> build can not find arch: $BASEVERSION!" 
255   exit 1
256 fi
257
258 #generate VERSION name combining all the build-time options.
259 if [ -n "$BOPTS" -o -n "$COMPILER" ]
260 then
261   echo "Selected Compiler: $COMPILER"
262   echo "Selected Options: $BOPTS"
263   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
264   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
265   for i in $BOPTS_WITHCOMPILER
266   do
267     VERSION=$VERSION-$i
268   done
269 fi
270
271 [ -d $VERSION ] || echo "Creating dir: $VERSION" 
272 [ -d $VERSION ] || mkdir $VERSION
273 [ -d $VERSION/tmp ] || echo "Creating dir: $VERSION/tmp" 
274 [ -d $VERSION/tmp ] || mkdir $VERSION/tmp
275
276 echo "Copying src/scripts/Makefile to $VERSION/tmp"
277 rm -f $VERSION/tmp/Makefile
278 rm -f $VERSION/tmp/Make.depends
279
280 if [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win32" ]
281 then
282 #Win32 version needs special compilers and *copied* (not linked)
283 # source files.
284         echo "Copying compilers for win32 into cygwin /bin directory"
285         cp $src/win32/unix2nt* /bin
286         cp $src/win32/system_ln $VERSION/tmp
287         cp $src/win32/unistd.h $VERSION/tmp
288   chmod +x $VERSION/tmp/system_ln
289 else
290         cat > $VERSION/tmp/system_ln <<EOF
291 #!/bin/sh
292 ln -f -s \$@
293 EOF
294   chmod +x $VERSION/tmp/system_ln
295         for newdir in `echo bin lib lib_so include tmp`
296         do
297                 echo "Soft-linking over $newdir"
298     if [ -r $newdir ]
299     then
300       rm -f $newdir
301     fi
302                 $VERSION/tmp/system_ln $VERSION/$newdir $newdir
303         done
304 fi
305
306 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
307 $VERSION/tmp/system_ln "../../src/scripts/Make.depends" $VERSION/tmp/Make.depends
308
309 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
310 echo "Generating $ConvUsr"
311 echo > $ConvUsr
312 test -n "$LIBDIR" && echo "CMK_LIBDIR=\"$LIBDIR\"" >> $ConvUsr
313 test -n "$INCDIR" && echo "CMK_INCDIR=\"$INCDIR\"" >> $ConvUsr
314 chmod +x $ConvUsr
315
316 # Create conv-mach-opt headers with special build-time options
317 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
318 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
319 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
320 then
321   echo "Generating $ConvHeader, conv-mach-opt.sh"
322   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
323   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
324   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
325 fi
326 if test -n "$COMPILER"
327 then
328       i="$COMPILER"
329       echo '#include "'cc-$i.h'"' >> $ConvHeader
330       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
331 fi
332 if test -n "$BOPTS"
333 then
334     for i in $BOPTS
335     do
336       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
337       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
338     done
339 fi
340
341
342 echo $BASEVERSION > $VERSION/tmp/.vdir
343
344 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
345 cd $VERSION/tmp 
346 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
347
348 MAKEEXIT=$?
349 if [ $MAKEEXIT -eq 0 ]
350 then
351         echo "-------------------------------------------------"
352         echo "$PROGRAM built successfully."
353         echo "Next, try out a sample program like" \
354              "pgms/charm++/simplearrayhello"
355 else
356         echo "-------------------------------------------------"
357         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
358         echo "to resolve the problems yourself, visit"
359         echo "    http://charm.cs.uiuc.edu/"
360         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
361         exit $MAKEEXIT
362 fi