clean up for building charm shared libs.
[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 --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 ''
63   echo "Charm++ dynamic libraries:"
64   echo "  --build-shared     build Charm++ dynamic libraries (.so) (default)"
65   echo "  --no-build-shared  don't build 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=
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-build-shared|-nobs|--build-shared|-bs)
215                 # obsolete
216                 BUILD_SHARED="$1"; shift
217                 ;;
218             --no-shared)
219                 # obsolete
220                 BUILD_SHARED="-nobs"; 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
353 echo $BASEVERSION > $VERSION/tmp/.vdir
354
355 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
356 cd $VERSION/tmp 
357 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
358
359 MAKEEXIT=$?
360 if [ $MAKEEXIT -eq 0 ]
361 then
362         echo "-------------------------------------------------"
363         echo "$PROGRAM built successfully."
364         echo "Next, try out a sample program like" \
365              "pgms/charm++/simplearrayhello"
366 else
367         echo "-------------------------------------------------"
368         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
369         echo "to resolve the problems yourself, visit"
370         echo "    http://charm.cs.uiuc.edu/"
371         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
372         exit $MAKEEXIT
373 fi