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