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