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