7186c2d7be0ffe1cfc54a4fa9616afa0988360e2
[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$)' | 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 opteron 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 '  opteron         compile for AMD Opteron'
53   echo '  smp             support for SMP, multithreaded charm on each node'
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     echo $str $opts
134   done
135   exit 1
136 }
137
138 CheckDir() {
139   for dir in $*
140   do
141     if test ! -d $dir
142     then
143       echo Error: cannot find $1!
144       exit 1
145     fi
146   done
147 }
148
149 TestIfCompiler() {
150   for dir in $OPT_DIRS
151   do
152     [ -f $dir/cc-$1.sh ] && return 1
153   done  
154   return 0
155 }
156
157 TestIfOption() {
158   for dir in $OPT_DIRS
159   do
160     [ -f $dir/conv-mach-$1.h ] && return 1 
161   done
162   
163   echo "Error> option: $1 is not supported in this version!"; 
164   printOption
165 }
166
167
168 # start
169
170 MAKEOPTS=""
171 OPTS=""
172 BOPTS=""
173 MORE=""
174 COMPILER=""
175 BASEDIR=
176 LIBDIR=
177 INCDIR=
178 ARCH=
179 BUILD_SHARED=
180 WITH_ROMIO=
181
182 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | more && exit 1
183 [ $# -lt 2 ] && syntax && exit 1
184 PROGRAM=$1
185 shift
186 VERSION=$1; BASEVERSION=$1; ARCH=`echo $1 | sed -e 's@-.*@@'`
187 shift
188
189 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
190
191 while [ ! $# -eq 0 ]
192 do
193   case "$1" in
194             "--basedir")
195                 shift; CheckDir $1/include $1/lib
196                 LIBDIR="$LIBDIR -L$1/lib";
197                 INCDIR="$INCDIR -I$1/include"; shift
198                 ;;
199             --basedir=*)
200                 basedir=`echo $1 | awk -F= '{print $2}'`
201                 CheckDir $basedir/include $basedir/lib
202                 LIBDIR="$LIBDIR -L$basedir/lib";
203                 INCDIR="$INCDIR -I$basedir/include"; shift
204                 ;;
205             "--libdir")
206                 shift; CheckDir $1
207                 LIBDIR="$LIBDIR -L$1"; shift
208                 ;;
209             --libdir=*)
210                 libdir=`echo $1 | awk -F= '{print $2}'`
211                 CheckDir $libdir
212                 LIBDIR="$LIBDIR -L$libdir"; shift
213                 ;;
214             "--incdir")
215                 shift; CheckDir $1
216                 INCDIR="$INCDIR -I$1"; shift
217                 ;;
218             --incdir=*)
219                 incdir=`echo $1 | awk -F= '{print $2}'`
220                 CheckDir $incdir
221                 INCDIR="$INCDIR -I$incdir"; shift
222                 ;;
223             --no-build-shared|-nobs|--no-shared)
224                 BUILD_SHARED="-nobs"; shift
225                 ;;
226             --with-romio)
227                 WITH_ROMIO="true"; shift
228                 ;;
229             --build-shared|-bs)
230                 # obsolete, do nothing
231                 shift
232                 ;;
233             -j*)
234                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
235                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
236                 shift;
237                 ;;
238     -*) 
239 # We hit a real compiler option (like -g, or -Dfoo),
240 # so just copy over all remaining options
241           while [ ! $# -eq 0 ]
242           do
243             OPTS="$OPTS $1"; shift
244           done
245           ;;
246     "help")
247         printOption
248         ;;
249     *)
250 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
251         TestIfCompiler $1
252         if [ $? -eq 1 ] 
253         then
254 # It specifies a compiler:
255           if [ ! -z "$COMPILER" ] 
256           then
257               echo "Error> Tried to specify two compilers: $COMPILER and $1"
258               printOption
259           fi
260           COMPILER=$1
261         else
262 # It specifies some other option:
263           TestIfOption $1
264           BOPTS="$BOPTS $1"
265         fi
266         shift
267         ;;
268   esac
269 done
270
271 [ "x$VERSION" = "x" ] && syntax && exit 1
272
273 [ -z "$MAKE" ] && MAKE='make'
274
275 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
276 then
277   echo "Error> build can not find arch: $BASEVERSION!" 
278   exit 1
279 fi
280
281 #generate VERSION name combining all the build-time options.
282 if [ -n "$BOPTS" -o -n "$COMPILER" ]
283 then
284   echo "Selected Compiler: $COMPILER"
285   echo "Selected Options: $BOPTS"
286   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
287   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
288   for i in $BOPTS_WITHCOMPILER
289   do
290     VERSION=$VERSION-$i
291   done
292 fi
293
294 [ -d $VERSION ] || echo "Creating dir: $VERSION" 
295 [ -d $VERSION ] || mkdir $VERSION
296 [ -d $VERSION/tmp ] || echo "Creating dir: $VERSION/tmp" 
297 [ -d $VERSION/tmp ] || mkdir $VERSION/tmp
298
299 echo "Copying src/scripts/Makefile to $VERSION/tmp"
300 rm -f $VERSION/tmp/Makefile
301 rm -f $VERSION/tmp/Make.depends
302 rm -f $VERSION/tmp/Make.lb
303
304
305 # Create the bin, lib, include, etc. links:
306 if [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win32" ]
307 then
308 #Win32 version needs special compilers and *copied* (not linked)
309 # source files.
310         echo "Copying compilers for win32 into cygwin /bin directory"
311         cp $src/win32/unix2nt* /bin
312         cp $src/win32/system_ln $VERSION/tmp
313         cp $src/win32/unistd.h $VERSION/tmp
314   chmod +x $VERSION/tmp/system_ln
315 else
316         cat > $VERSION/tmp/system_ln <<EOF
317 #!/bin/sh
318 ln -f -s \$@
319 EOF
320   chmod +x $VERSION/tmp/system_ln
321   for newdir in `echo bin lib lib_so include tmp`
322   do
323     echo "Soft-linking over $newdir"
324     if [ -r $newdir ]
325     then
326       rm -fr $newdir || exit 1
327     fi
328     $VERSION/tmp/system_ln $VERSION/$newdir $newdir
329   done
330 fi
331
332 $VERSION/tmp/system_ln "../../src/scripts/Make.depends" $VERSION/tmp/Make.depends
333 $VERSION/tmp/system_ln "../../src/ck-ldb/Make.lb" $VERSION/tmp/Make.lb
334 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
335
336 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
337 echo "Generating $ConvUsr"
338 echo > $ConvUsr
339 test -n "$LIBDIR" && echo "CMK_LIBDIR=\"$LIBDIR\"" >> $ConvUsr
340 test -n "$INCDIR" && echo "CMK_INCDIR=\"$INCDIR\"" >> $ConvUsr
341 chmod +x $ConvUsr
342
343 # Create conv-mach-opt headers with special build-time options
344 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
345 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
346 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
347 then
348   echo "Generating $ConvHeader, conv-mach-opt.sh"
349   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
350   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
351   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
352 fi
353 if test -n "$COMPILER"
354 then
355       i="$COMPILER"
356       echo '#include "'cc-$i.h'"' >> $ConvHeader
357       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
358 fi
359 if test -n "$BOPTS"
360 then
361     for i in $BOPTS
362     do
363       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
364       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
365     done
366 fi
367
368 if test  -n "$BUILD_SHARED" 
369 then
370     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
371 fi
372
373 if test  -n "$WITH_ROMIO" 
374 then
375     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
376 fi
377
378 echo $BASEVERSION > $VERSION/tmp/.vdir
379
380 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
381 cd $VERSION/tmp 
382 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
383
384 MAKEEXIT=$?
385 if [ $MAKEEXIT -eq 0 ]
386 then
387         echo "-------------------------------------------------"
388         echo "$PROGRAM built successfully."
389         echo "Next, try out a sample program like" \
390              "pgms/charm++/simplearrayhello"
391 else
392         echo "-------------------------------------------------"
393         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
394         echo "to resolve the problems yourself, visit"
395         echo "    http://charm.cs.uiuc.edu/"
396         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
397         exit $MAKEEXIT
398 fi