added clustermatic 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 IDL TSM SM PVM bluegene'
13   echo '<targets>: doc ps-doc pdf-doc html-doc'
14   echo '<versions>: ' 
15   ( cd $src ; ls -1 | egrep -v '(^CVS)|(^shmem$)|(^mpi$)|(^sim$)|(^net$)|(^elan$)|(^util$)|(^common$)|(^uth$)|(^conv-mach-fix.sh$)|(^win32$)|(^paragon$)|(^vmi$)' | pr -3 -t )
16   echo ''
17   echo '<options>: help cc cc64 cxx kcc pgcc acc icc ecc gcc3 mpcc smp gm tcp vmi scyld clustermatic opteron bluegene --incdir --libdir --basedir --no-shared'
18   if test $more = 1
19   then
20   echo ''
21   echo 'Not all these options are supported by one version, use version based help:'
22   echo '  help          version based help message, e.g. ./build charm++ net-linux help'
23   echo ''
24   echo 'Choose a compiler (only one option is allowed from this section):'
25   echo '  cc, cc64      For Sun WorkShop C++ 32/64 bit compilers'
26   echo '  cxx           DIGITAL C++ compiler (DEC Alpha)'
27   echo '  kcc           KAI C++ compiler'
28   echo "  pgcc          Portland Group's C++ compiler"
29   echo '  acc           HP aCC compiler'
30   echo '  icc           Intel C/C++ compiler for Linux IA32'
31   echo '  ecc           Intel C/C++ compiler for Linux IA64'
32   echo '  gcc3          to use gcc3 - GNU GCC/G++ version 3'
33   echo '  mpcc          SUN Solaris C++ compiler for MPI'
34   echo ''
35   echo 'Platform specific options (choose multiple if apply):'
36   echo '  opteron       compile for AMD Opteron'
37   echo '  smp           support for SMP, multithreaded charm on each node'
38   echo '  gm            use Myrinet for communication'
39   echo '  tcp           use TCP sockets for communication (ony for net version)'
40   echo "  vmi           use NCSA's VMI for communication"
41   echo '  scyld         compile for Scyld Beowulf cluster based on bproc'
42   echo '  clustermatic  compile for Clustermatic Beowulf cluster based on bproc'
43   echo ''
44   echo 'Advanced options:'
45   echo '  bluegene      compile for BigSim (Blue Gene) simulator'
46   echo '  occ           compile with out of core support'
47   echo ''
48   echo 'Miscellaneous options:'
49   echo '  --incdir=DIR  specify additional include path for compilers'
50   echo '  --libdir=DIR  specify additional lib path for compilers'
51   echo '  --basedir=DIR specify additional path at once - DIR/include and DIR/lib'
52   echo "  --no-shared   disable the compilation for Charm++'s shared libraries"
53   fi
54   echo ''
55   echo '<charmc-options>: normal compiler options e.g. -g -O -save -verbose'
56   echo 'Note: This script:'
57   echo ' 1. Creates directories <version> and <version>/tmp';
58 #  echo ' 2. Copies src/Common/scripts/Makefile into <version>/tmp';
59   echo ' 2. Does a "make <target> <version> OPTS=<charmc-options>" in <version>/tmp.'
60 #  echo "That's all build does.  The rest is handled by the Makefile."
61   [ $more = 0 ] && echo "To get more detailed help, run ./build --help"
62 }
63
64 printOption() {
65   for prefix in cc conv-mach
66   do
67     str="Supported compilers:"
68     [ "$prefix" = "conv-mach" ] && str="Supported options:"
69     opts=""
70     for dir in $OPT_DIRS
71     do
72 #         echo "Checking for $prefix in $dir"
73           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
74           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
75     done 
76     echo $str $opts
77   done
78   exit 1
79 }
80
81 CheckDir() {
82   for dir in $*
83   do
84     if test ! -d $dir
85     then
86       echo Error: cannot find $1!
87       exit 1
88     fi
89   done
90 }
91
92 TestIfCompiler() {
93   for dir in $OPT_DIRS
94   do
95     [ -f $dir/cc-$1.sh ] && return 1
96   done  
97   return 0
98 }
99
100 TestIfOption() {
101   for dir in $OPT_DIRS
102   do
103     [ -f $dir/conv-mach-$1.h ] && return 1 
104   done
105   
106   echo "Error> option: $1 is not supported in this version!"; 
107   printOption
108 }
109
110
111 # start
112
113 MAKEOPTS=""
114 OPTS=""
115 BOPTS=""
116 MORE=""
117 COMPILER=""
118 BASEDIR=
119 LIBDIR=
120 INCDIR=
121 ARCH=
122 BUILD_SHARED="-build-shared"
123
124 [ "$1" = '--help' -o "$1" = '-h' ] && more=1 && syntax | more && exit 1
125 [ $# -lt 2 ] && syntax && exit 1
126 PROGRAM=$1
127 shift
128 VERSION=$1; BASEVERSION=$1; ARCH=`echo $1 | sed -e 's@-.*@@'`
129 shift
130
131 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
132
133 while [ ! $# -eq 0 ]
134 do
135   case "$1" in
136             "--basedir")
137                 shift; CheckDir $1/include $1/lib
138                 LIBDIR="$LIBDIR -L$1/lib";
139                 INCDIR="$INCDIR -I$1/include"; shift
140                 ;;
141             --basedir=*)
142                 basedir=`echo $1 | awk -F= '{print $2}'`
143                 CheckDir $basedir/include $basedir/lib
144                 LIBDIR="$LIBDIR -L$basedir/lib";
145                 INCDIR="$INCDIR -I$basedir/include"; shift
146                 ;;
147             "--libdir")
148                 shift; CheckDir $1
149                 LIBDIR="$LIBDIR -L$1"; shift
150                 ;;
151             --libdir=*)
152                 libdir=`echo $1 | awk -F= '{print $2}'`
153                 CheckDir $libdir
154                 LIBDIR="$LIBDIR -L$libdir"; shift
155                 ;;
156             "--incdir")
157                 shift; CheckDir $1
158                 INCDIR="$INCDIR -I$1"; shift
159                 ;;
160             --incdir=*)
161                 incdir=`echo $1 | awk -F= '{print $2}'`
162                 CheckDir $incdir
163                 INCDIR="$INCDIR -I$incdir"; shift
164                 ;;
165             --no-shared)
166                 BUILD_SHARED=""; shift
167                 ;;
168     -*) 
169 # We hit a real compiler option (like -g, or -Dfoo),
170 # so just copy over all remaining options
171           while [ ! $# -eq 0 ]
172           do
173             OPTS="$OPTS $1"; shift
174           done
175           ;;
176     "help")
177         printOption
178         ;;
179     *)
180 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
181         TestIfCompiler $1
182         if [ $? -eq 1 ] 
183         then
184 # It specifies a compiler:
185           if [ ! -z "$COMPILER" ] 
186           then
187               echo "Error> Tried to specify two compilers: $COMPILER and $1"
188               printOption
189           fi
190           COMPILER=$1
191         else
192 # It specifies some other option:
193           TestIfOption $1
194           BOPTS="$BOPTS $1"
195         fi
196         shift
197         ;;
198   esac
199 done
200
201 [ "x$VERSION" = "x" ] && syntax
202
203 [ -f $src/$BASEVERSION/conv-mach.h ] || syntax
204
205 #generate VERSION name combining all the build-time options.
206 if [ -n "$BOPTS" -o -n "$COMPILER" ]
207 then
208   echo "Selected Compiler: $COMPILER"
209   echo "Selected Options: $BOPTS"
210   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
211   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
212   for i in $BOPTS_WITHCOMPILER
213   do
214     VERSION=$VERSION-$i
215   done
216 fi
217
218 [ -d $VERSION ] || echo "Creating dir: $VERSION" 
219 [ -d $VERSION ] || mkdir $VERSION
220 [ -d $VERSION/tmp ] || echo "Creating dir: $VERSION/tmp" 
221 [ -d $VERSION/tmp ] || mkdir $VERSION/tmp
222
223 echo "Copying src/scripts/Makefile to $VERSION/tmp"
224 rm -f $VERSION/tmp/Makefile
225
226 if [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win32" ]
227 then
228 #Win32 version needs special compilers and *copied* (not linked)
229 # source files.
230         echo "Copying compilers for win32 into cygwin /bin directory"
231         cp $src/win32/unix2nt* /bin
232         cp $src/win32/system_ln $VERSION/tmp
233         cp $src/win32/unistd.h $VERSION/tmp
234   chmod +x $VERSION/tmp/system_ln
235 else
236         cat > $VERSION/tmp/system_ln <<EOF
237 #!/bin/sh
238 ln -f -s \$@
239 EOF
240   chmod +x $VERSION/tmp/system_ln
241         for newdir in `echo bin lib lib_so include tmp`
242         do
243                 echo "Soft-linking over $newdir"
244     if [ -r $newdir ]
245     then
246       rm -f $newdir
247     fi
248                 $VERSION/tmp/system_ln $VERSION/$newdir $newdir
249         done
250 fi
251
252 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
253
254 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
255 echo "Generating $ConvUsr"
256 echo > $ConvUsr
257 test -n "$LIBDIR" && echo "CMK_LIBDIR=\"$LIBDIR\"" >> $ConvUsr
258 test -n "$INCDIR" && echo "CMK_INCDIR=\"$INCDIR\"" >> $ConvUsr
259 chmod +x $ConvUsr
260
261 # Create conv-mach-opt headers with special build-time options
262 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
263 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
264 if [ ! -f $ConvSh -o ! -f $ConvHeader ]
265 then
266   echo "Generating $ConvHeader, conv-mach-opt.sh"
267   echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
268   echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
269   echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
270 fi
271 if test -n "$COMPILER"
272 then
273       i="$COMPILER"
274       echo '#include "'cc-$i.h'"' >> $ConvHeader
275       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
276 fi
277 if test -n "$BOPTS"
278 then
279     for i in $BOPTS
280     do
281       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
282       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
283     done
284 fi
285
286
287 echo $BASEVERSION > $VERSION/tmp/.vdir
288
289 echo "Performing 'make $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
290 cd $VERSION/tmp 
291 make $MAKEOPTS $PROGRAM OPTS="$OPTS $BUILD_SHARED"
292
293 MAKEEXIT=$?
294 if [ $MAKEEXIT -eq 0 ]
295 then
296         echo "-------------------------------------------------"
297         echo "$PROGRAM built successfully."
298         echo "Next, try out a sample program like" \
299              "pgms/charm++/simplearrayhello"
300 else
301         echo "-------------------------------------------------"
302         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
303         echo "to resolve the problems yourself, visit"
304         echo "    http://charm.cs.uiuc.edu/"
305         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
306         exit $MAKEEXIT
307 fi