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