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