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