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