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