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