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