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