Added a note to the help for infiniband mentioning that it is for net-linux-amd64...
[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$)|(^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 '  ibverbs         use the Infiniband OpenIB layer for communication (only for net-linux-amd64 currently)'
67   echo '  tcp             use TCP sockets for communication (ony for net version)'
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 ] && syntax && exit 1
206 PROGRAM=$1
207 shift
208 VERSION=$1; BASEVERSION=$1; ARCH=`echo $1 | sed -e 's@-.*@@'`
209 shift
210
211 echo $src
212 echo $BASEVERSION
213 echo $ARCH
214
215 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
216
217 while [ ! $# -eq 0 ]
218 do
219   case "$1" in
220     "--basedir")
221                 shift; 
222                 for dir in $1
223                 do
224                   CheckDir $dir/include $dir/lib
225                   LIBDIR="$LIBDIR -L$dir/lib";
226                   INCDIR="$INCDIR -I$dir/include"
227                 done
228                 shift
229                 ;;
230     --basedir=*)
231                 basedir=`echo $1 | awk -F= '{print $2}'`
232                 for dir in $basedir
233                 do
234                   CheckDir $dir/include $dir/lib
235                   LIBDIR="$LIBDIR -L$dir/lib";
236                   INCDIR="$INCDIR -I$dir/include"
237                 done
238                 shift
239                 ;;
240     "--libdir")
241                 shift; CheckDir $1
242                 for dir in $1
243                 do
244                   LIBDIR="$LIBDIR -L$dir"; 
245                 done
246                 shift
247                 ;;
248     --libdir=*)
249                 libdir=`echo $1 | awk -F= '{print $2}'`
250                 CheckDir $libdir
251                 for dir in $libdir
252                 do
253                   LIBDIR="$LIBDIR -L$dir"; 
254                 done
255                 shift
256                 ;;
257     "--incdir")
258                 shift; CheckDir $1
259                 for dir in $1
260                 do
261                   INCDIR="$INCDIR -I$dir"; 
262                 done
263                 shift
264                 ;;
265     --incdir=*)
266                 incdir=`echo $1 | awk -F= '{print $2}'`
267                 CheckDir $incdir
268                 for dir in $incdir
269                 do
270                   INCDIR="$INCDIR -I$dir"; 
271                 done
272                 shift
273                 ;;
274     --no-build-shared|-nobs|--no-shared)
275                 BUILD_SHARED="-nobs"; shift
276                 ;;
277     --with-romio)
278                 WITH_ROMIO="true"; shift
279                 ;;
280     --build-shared|-bs)
281                 # obsolete, do nothing
282                 shift
283                 ;;
284     -j*)
285                 PMAKENUM=`echo $1 | awk -Fj '{print $2}'`
286                 MAKEOPTS="$MAKEOPTS -j $PMAKENUM"
287                 shift;
288                 ;;
289     -*) 
290 # We hit a real compiler option (like -g, or -Dfoo),
291 # so just copy over all remaining options
292           while [ ! $# -eq 0 ]
293           do
294             OPTS="$OPTS $1"; shift
295           done
296           ;;
297     "help")
298         printOption
299         ;;
300     *)
301 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
302         TestIfCompiler $1
303         if [ $? -eq 1 ] 
304         then
305 # It specifies a compiler:
306           if [ ! -z "$COMPILER" ] 
307           then
308               echo "Error> Tried to specify two compilers: $COMPILER and $1"
309               printOption
310           fi
311           COMPILER=$1
312         else
313 # It specifies some other option:
314           TestIfOption $1
315           BOPTS="$BOPTS $1"
316           [ $1 =  "bigemulator" ] && BUILD_EMULATOR=1
317         fi
318         shift
319         ;;
320   esac
321 done
322
323 [ "x$VERSION" = "x" ] && syntax && exit 1
324
325 if [ -z "$MAKE" ] 
326 then
327   # prefer gmake
328   MAKE=`which gmake 2>/dev/null`
329   [ -z "$MAKE" -o ! -x "$MAKE" ] && MAKE='make'
330 fi
331
332 if [ ! -f $src/$BASEVERSION/conv-mach.h ] 
333 then
334   echo "Error> build can not find arch: $BASEVERSION!" 
335   exit 1
336 fi
337
338 #generate VERSION name combining all the build-time options.
339 if [ -n "$BOPTS" -o -n "$COMPILER" ]
340 then
341   echo "Selected Compiler: $COMPILER"
342   echo "Selected Options: $BOPTS"
343   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
344   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
345   for i in $BOPTS_WITHCOMPILER
346   do
347     VERSION=$VERSION-$i
348   done
349 fi
350
351 [ -d $VERSION ] || echo "Creating dir: $VERSION" 
352 [ -d $VERSION ] || mkdir $VERSION
353 [ -d $VERSION/tmp ] || echo "Creating dir: $VERSION/tmp" 
354 [ -d $VERSION/tmp ] || mkdir $VERSION/tmp
355
356 echo "Copying src/scripts/Makefile to $VERSION/tmp"
357 rm -f $VERSION/tmp/Makefile
358 rm -f $VERSION/tmp/Make.depends
359 rm -f $VERSION/tmp/Make.lb
360 rm -f $VERSION/tmp/Make.machine
361
362
363 # Create the bin, lib, include, etc. links:
364 if [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win32" ]
365 then
366 #Win32 version needs special compilers and *copied* (not linked)
367 # source files.
368         echo "Copying compilers for win32 into cygwin /bin directory"
369         cp $src/win32/unix2nt* /bin
370         cp $src/win32/system_ln $VERSION/tmp
371         cp $src/win32/unistd.h $VERSION/tmp
372         cp $src/win32/createlink.exe /bin
373   chmod +x $VERSION/tmp/system_ln
374 elif [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win64" ]
375 then
376 #Win64 version needs special compilers and *copied* (not linked)
377 # source files.
378         echo "Copying compilers for win64 into cygwin /bin directory"
379         cp $src/win64/unix2nt* /bin
380         cp $src/win64/system_ln $VERSION/tmp
381         cp $src/win64/unistd.h $VERSION/tmp
382         cp $src/win64/unistd.h $VERSION/include
383         cp $src/win64/createlink.exe /bin
384   chmod +x $VERSION/tmp/system_ln
385 else
386         cat > $VERSION/tmp/system_ln <<EOF
387 #!/bin/sh
388 ln -f -s \$@
389 EOF
390   chmod +x $VERSION/tmp/system_ln
391   for newdir in `echo bin lib lib_so include tmp`
392   do
393     echo "Soft-linking over $newdir"
394     if [ -r $newdir ]
395     then
396       rm -fr $newdir || exit 1
397     fi
398     $VERSION/tmp/system_ln $VERSION/$newdir $newdir
399   done
400   rm -f VERSION
401   $VERSION/tmp/system_ln $VERSION/include/VERSION VERSION
402 fi
403
404 $VERSION/tmp/system_ln "../../src/scripts/Make.depends" $VERSION/tmp/Make.depends
405 $VERSION/tmp/system_ln "../../src/ck-ldb/Make.lb" $VERSION/tmp/Make.lb
406 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
407 touch $VERSION/tmp/Makefile.machine
408
409 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
410 echo "Generating $ConvUsr"
411 echo > $ConvUsr
412 if test -n "$LIBDIR" 
413 then
414   echo 'USER_OPTS_LD="$USER_OPTS_LD '$LIBDIR'"' >> $ConvUsr
415   echo 'USER_OPTS_LDXX="$USER_OPTS_LDXX '$LIBDIR'"' >> $ConvUsr
416 fi
417 if test -n "$INCDIR" 
418 then
419   echo 'USER_OPTS_CC="$USER_OPTS_CC '$INCDIR'"' >> $ConvUsr
420   echo 'USER_OPTS_CXX="$USER_OPTS_CXX '$INCDIR'"' >> $ConvUsr
421 fi
422 chmod +x $ConvUsr
423
424 # Create conv-mach-opt headers with special build-time options
425 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
426 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
427 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
428 then
429   echo "Generating $ConvHeader, conv-mach-opt.sh"
430   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
431   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
432   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
433 fi
434 if test -n "$COMPILER"
435 then
436       i="$COMPILER"
437       echo '#include "'cc-$i.h'"' >> $ConvHeader
438       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
439 fi
440 if test -n "$BOPTS"
441 then
442     for i in $BOPTS
443     do
444       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
445       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
446     done
447 fi
448
449 if test  -n "$BUILD_SHARED" 
450 then
451     echo "CMK_NO_BUILD_SHARED=true" >> $ConvSh
452 fi
453
454 if test  -n "$WITH_ROMIO" 
455 then
456     echo "CMK_AMPI_WITH_ROMIO=\"true\"" >> $ConvSh
457 fi
458
459 echo $BASEVERSION > $VERSION/tmp/.vdir
460
461 if test $BUILD_EMULATOR = 1
462 then
463   PROGRAM="$PROGRAM bigsim"
464 fi
465
466 echo "Performing '$MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
467 cd $VERSION/tmp 
468 $MAKE $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
469
470 MAKEEXIT=$?
471 if [ $MAKEEXIT -eq 0 ]
472 then
473         echo "-------------------------------------------------"
474         echo "$PROGRAM built successfully."
475         echo "Next, try out a sample program like" \
476              "tests/charm++/simplearrayhello"
477 else
478         echo "-------------------------------------------------"
479         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
480         echo "to resolve the problems yourself, visit"
481         echo "    http://charm.cs.uiuc.edu/"
482         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
483         exit $MAKEEXIT
484 fi