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