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