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