Include ckvector3d.h so that the user doesn't have to.
[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 pathscale'
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 '  pathscale       use pathscale compiler suite'
51   echo ''
52   echo 'Platform specific options (choose multiple if apply):'
53   echo '  smp             support for SMP, multithreaded charm on each node'
54   echo '  mpt             use SGI Message Passing Toolkit (only for mpi version)'
55   echo '  gm              use Myrinet for communication'
56   echo '  tcp             use TCP sockets for communication (ony for net version)'
57   echo "  vmi             use NCSA's VMI for communication (only for mpi version)"
58   echo '  scyld           compile for Scyld Beowulf cluster based on bproc'
59   echo '  clustermatic    compile for Clustermatic (support version 3 and 4) '
60   echo ''
61   echo 'Advanced options:'
62   echo '  bluegene        compile for BigSim (Blue Gene) simulator'
63   echo '  ooc             compile with out of core support'
64   echo '  syncft          compile with Charm++ fault tolerance support'
65   echo '  papi            compile with PAPI performance counter support (if any)'
66   echo ''
67   echo "Charm++ dynamic libraries:"
68   echo "  --build-shared     build Charm++ dynamic libraries (.so) (default)"
69   echo "  --no-build-shared  don't build Charm++'s shared libraries"
70   echo ''
71   echo 'Miscellaneous options:'
72   echo '  --incdir=DIR    specify additional include path for compiler'
73   echo '  --libdir=DIR    specify additional lib path for compiler'
74   echo '  --basedir=DIR   shortcut for the above two - DIR/include and DIR/lib'
75   echo '  -j[N]           parallel make, N is the number of paralle make jobs'
76   echo "  --with-romio    build AMPI with ROMIO library"
77   fi
78   echo ''
79   echo '<charmc-options>: normal compiler options e.g. -g -O -save -verbose'
80   if test $more = 1
81   then
82   echo ''
83   echo 'Examples:'
84   echo "1. display all supported options for net-linux using 'help':"
85   echo '  ./build charm++ net-linux help'
86   echo '2. compile Charm++ on Linux with optimizations:'
87   echo '  ./build charm++ net-linux -O -DCMK_OPTIMIZE'
88   echo '3. compile Charm++ for Linux clustermatic Beowulf cluster with Intel compiler:'
89   echo '  ./build charm++ net-linux clustermatic icc -O'
90   echo '4. compile Charm++ for IA64 Linux cluster with MPICH-GM:'
91   echo '  ./build charm++ mpi-linux-ia64 gm -O'
92   echo '5. compile Charm++ for Windows with VC++ (Cygwin required):'
93   echo '  ./build charm++ net-win32 -O'
94   echo '6. compile on IBM SP with MPI using parallel gmake, 4 jobs simultaneously:'
95   echo '  MAKE=gmake  ./build charm++ mpi-sp -j4 -O            # sh'
96   echo '  setenv MAKE gmake;  ./build charm++ mpi-sp -j4 -O    # csh'
97   echo '7. compile Charm++ with MPI that is installed at /usr/local/mpich:'
98   echo '  ./build charm++ mpi-linux --incdir /usr/local/mpich/include --libdir /usr/local/mpich/lib -O'
99   echo '   or in short,'
100   echo '  ./build charm++ mpi-linux --basedir /usr/local/mpich -O'
101   echo ''
102   echo 'Note: This script:'
103   echo ' 1. Creates directories <version> and <version>/tmp';
104   echo ' 2. Copies src/scripts/Makefile into <version>/tmp';
105   echo ' 3. Does a "make <target> <version> OPTS=<charmc-options>" in <version>/tmp.'
106   echo "That's all build does.  The rest is handled by the Makefile."
107   echo ''
108   echo 'You should register your copy of Charm++ with us by sending email'
109   echo 'to tms@charm.cs.uiuc.edu containing the message "subscribe charm-users"'
110   echo 'This will allow us to notify you of new releases of Charm++.'
111   echo ''
112   echo 'Thank you for using Charm++, please send questions or comments to '
113   echo 'Parallel Programming Lab at University of Illinois at Urbana-Champaign'
114   echo '(email: ppl@cs.uiuc.edu).'
115
116   else
117   echo ''
118   echo "To get more detailed help, run ./build --help"
119   fi
120 }
121
122 printOption() {
123   for prefix in cc conv-mach
124   do
125     str="Supported compilers:"
126     [ "$prefix" = "conv-mach" ] && str="Supported options:"
127     opts=""
128     for dir in $OPT_DIRS
129     do
130 #         echo "Checking for $prefix in $dir"
131           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
132           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
133     done 
134     tmp=.tmp.$$
135     rm -f $tmp; touch $tmp
136     for o in $opts
137     do
138       echo $o >> $tmp
139     done
140     opts=`sort $tmp | uniq`
141     rm -f $tmp
142     echo $str $opts
143   done
144   exit 1
145 }
146
147 CheckDir() {
148   for d in $*
149   do
150     if test ! -d $d
151     then
152       echo Error: cannot find $d!
153       exit 1
154     fi
155   done
156 }
157
158 TestIfCompiler() {
159   for dir in $OPT_DIRS
160   do
161     [ -f $dir/cc-$1.sh ] && return 1
162   done  
163   return 0
164 }
165
166 TestIfOption() {
167   for dir in $OPT_DIRS
168   do
169     [ -f $dir/conv-mach-$1.h ] && return 1 
170   done
171   
172   echo "Error> option: $1 is not supported in this version!"; 
173   printOption
174 }
175
176
177 # start
178
179 MAKEOPTS=""
180 OPTS=""
181 BOPTS=""
182 MORE=""
183 COMPILER=""
184 BASEDIR=
185 LIBDIR=
186 INCDIR=
187 ARCH=
188 BUILD_SHARED=
189 WITH_ROMIO=
190
191 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | more && exit 1
192 [ $# -lt 2 ] && syntax && exit 1
193 PROGRAM=$1
194 shift
195 VERSION=$1; BASEVERSION=$1; ARCH=`echo $1 | sed -e 's@-.*@@'`
196 shift
197
198 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
199
200 while [ ! $# -eq 0 ]
201 do
202   case "$1" in
203             "--basedir")
204                 shift; 
205                 for dir in $1
206                 do
207                   CheckDir $dir/include $dir/lib
208                   LIBDIR="$LIBDIR -L$dir/lib";
209                   INCDIR="$INCDIR -I$dir/include"
210                 done
211                 shift
212                 ;;
213             --basedir=*)
214                 basedir=`echo $1 | awk -F= '{print $2}'`
215                 for dir in $basedir
216                 do
217                   CheckDir $dir/include $dir/lib
218                   LIBDIR="$LIBDIR -L$dir/lib";
219                   INCDIR="$INCDIR -I$dir/include"
220                 done
221                 shift
222                 ;;
223             "--libdir")
224                 shift; CheckDir $1
225                 for dir in $1
226                 do
227                   LIBDIR="$LIBDIR -L$dir"; 
228                 done
229                 shift
230                 ;;
231             --libdir=*)
232                 libdir=`echo $1 | awk -F= '{print $2}'`
233                 CheckDir $libdir
234                 for dir in $libdir
235                 do
236                   LIBDIR="$LIBDIR -L$dir"; 
237                 done
238                 shift
239                 ;;
240             "--incdir")
241                 shift; CheckDir $1
242                 for dir in $1
243                 do
244                   INCDIR="$INCDIR -I$dir"; 
245                 done
246                 shift
247                 ;;
248             --incdir=*)
249                 incdir=`echo $1 | awk -F= '{print $2}'`
250                 CheckDir $incdir
251                 for dir in $incdir
252                 do
253                   INCDIR="$INCDIR -I$dir"; 
254                 done
255                 shift
256                 ;;
257             --no-build-shared|-nobs|--no-shared)
258                 BUILD_SHARED="-nobs"; shift
259                 ;;
260             --with-romio)
261                 WITH_ROMIO="true"; shift
262                 ;;
263             --build-shared|-bs)
264                 # obsolete, do nothing
265                 shift
266                 ;;
267             -j*)
268                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
269                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
270                 shift;
271                 ;;
272     -*) 
273 # We hit a real compiler option (like -g, or -Dfoo),
274 # so just copy over all remaining options
275           while [ ! $# -eq 0 ]
276           do
277             OPTS="$OPTS $1"; shift
278           done
279           ;;
280     "help")
281         printOption
282         ;;
283     *)
284 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
285         TestIfCompiler $1
286         if [ $? -eq 1 ] 
287         then
288 # It specifies a compiler:
289           if [ ! -z "$COMPILER" ] 
290           then
291               echo "Error> Tried to specify two compilers: $COMPILER and $1"
292               printOption
293           fi
294           COMPILER=$1
295         else
296 # It specifies some other option:
297           TestIfOption $1
298           BOPTS="$BOPTS $1"
299         fi
300         shift
301         ;;
302   esac
303 done
304
305 [ "x$VERSION" = "x" ] && syntax && exit 1
306
307 [ -z "$MAKE" ] && MAKE='make'
308
309 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
310 then
311   echo "Error> build can not find arch: $BASEVERSION!" 
312   exit 1
313 fi
314
315 #generate VERSION name combining all the build-time options.
316 if [ -n "$BOPTS" -o -n "$COMPILER" ]
317 then
318   echo "Selected Compiler: $COMPILER"
319   echo "Selected Options: $BOPTS"
320   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
321   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
322   for i in $BOPTS_WITHCOMPILER
323   do
324     VERSION=$VERSION-$i
325   done
326 fi
327
328 [ -d $VERSION ] || echo "Creating dir: $VERSION" 
329 [ -d $VERSION ] || mkdir $VERSION
330 [ -d $VERSION/tmp ] || echo "Creating dir: $VERSION/tmp" 
331 [ -d $VERSION/tmp ] || mkdir $VERSION/tmp
332
333 echo "Copying src/scripts/Makefile to $VERSION/tmp"
334 rm -f $VERSION/tmp/Makefile
335 rm -f $VERSION/tmp/Make.depends
336 rm -f $VERSION/tmp/Make.lb
337
338
339 # Create the bin, lib, include, etc. links:
340 if [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win32" ]
341 then
342 #Win32 version needs special compilers and *copied* (not linked)
343 # source files.
344         echo "Copying compilers for win32 into cygwin /bin directory"
345         cp $src/win32/unix2nt* /bin
346         cp $src/win32/system_ln $VERSION/tmp
347         cp $src/win32/unistd.h $VERSION/tmp
348         cp $src/win32/createlink.exe /bin
349   chmod +x $VERSION/tmp/system_ln
350 else
351         cat > $VERSION/tmp/system_ln <<EOF
352 #!/bin/sh
353 ln -f -s \$@
354 EOF
355   chmod +x $VERSION/tmp/system_ln
356   for newdir in `echo bin lib lib_so include tmp`
357   do
358     echo "Soft-linking over $newdir"
359     if [ -r $newdir ]
360     then
361       rm -fr $newdir || exit 1
362     fi
363     $VERSION/tmp/system_ln $VERSION/$newdir $newdir
364   done
365   rm -f VERSION
366   $VERSION/tmp/system_ln $VERSION/include/VERSION VERSION
367 fi
368
369 $VERSION/tmp/system_ln "../../src/scripts/Make.depends" $VERSION/tmp/Make.depends
370 $VERSION/tmp/system_ln "../../src/ck-ldb/Make.lb" $VERSION/tmp/Make.lb
371 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
372
373 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
374 echo "Generating $ConvUsr"
375 echo > $ConvUsr
376 if test -n "$LIBDIR" 
377 then
378   echo 'USER_OPTS_LD="$USER_OPTS_LD '$LIBDIR'"' >> $ConvUsr
379   echo 'USER_OPTS_LDXX="$USER_OPTS_LDXX '$LIBDIR'"' >> $ConvUsr
380 fi
381 if test -n "$INCDIR" 
382 then
383   echo 'USER_OPTS_CC="$USER_OPTS_CC '$INCDIR'"' >> $ConvUsr
384   echo 'USER_OPTS_CXX="$USER_OPTS_CXX '$INCDIR'"' >> $ConvUsr
385 fi
386 chmod +x $ConvUsr
387
388 # Create conv-mach-opt headers with special build-time options
389 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
390 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
391 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
392 then
393   echo "Generating $ConvHeader, conv-mach-opt.sh"
394   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
395   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
396   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
397 fi
398 if test -n "$COMPILER"
399 then
400       i="$COMPILER"
401       echo '#include "'cc-$i.h'"' >> $ConvHeader
402       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
403 fi
404 if test -n "$BOPTS"
405 then
406     for i in $BOPTS
407     do
408       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
409       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
410     done
411 fi
412
413 if test  -n "$BUILD_SHARED" 
414 then
415     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
416 fi
417
418 if test  -n "$WITH_ROMIO" 
419 then
420     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
421 fi
422
423 echo $BASEVERSION > $VERSION/tmp/.vdir
424
425 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
426 cd $VERSION/tmp 
427 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
428
429 MAKEEXIT=$?
430 if [ $MAKEEXIT -eq 0 ]
431 then
432         echo "-------------------------------------------------"
433         echo "$PROGRAM built successfully."
434         echo "Next, try out a sample program like" \
435              "tests/charm++/simplearrayhello"
436 else
437         echo "-------------------------------------------------"
438         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
439         echo "to resolve the problems yourself, visit"
440         echo "    http://charm.cs.uiuc.edu/"
441         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
442         exit $MAKEEXIT
443 fi