added empty macro when CMK_OPTIMIZE defined.
[charm.git] / build
1 #!/bin/sh
2
3 # Silly shorthand, used for source reorganization
4 src="src/arch"
5
6 syntax() {
7   echo ''
8   echo 'Usage: build <target> <version> <options> [charmc-options ...]'
9   echo ''
10   echo '<targets>: converse, charm++ libs AMPI IDL tsm sm pvm sdag bluegene'
11   echo '<targets>: doc ps-doc pdf-doc html-doc'
12   echo '<versions>: ' 
13   ( cd $src ; ls -1 | egrep -v '(^CVS)' | pr -3 -t )
14   echo ''
15   echo '<options>: help cc cc64 cxx kcc pgcc acc icc ecc gcc3 mpcc smp gm tcp vmi scyld bluegene'
16   echo ''
17   echo '<charmc-options>: e.g. -g -save -verbose'
18   echo 'Note: This script:'
19   echo ' 1. Creates directories <version> and <version>/tmp';
20 #  echo ' 2. Copies src/Common/scripts/Makefile into <version>/tmp';
21   echo ' 2. Does a "make <target> <version> OPTS=<charmc-options>" in <version>/tmp.'
22 #  echo "That's all build does.  The rest is handled by the Makefile."
23   exit 1
24 }
25
26 printOption() {
27   for prefix in cc conv-mach
28   do
29     str="Supported compilers:"
30     [ "$prefix" = "conv-mach" ] && str="Supported options:"
31     opts=""
32     for dir in $OPT_DIRS
33     do
34 #         echo "Checking for $prefix in $dir"
35           files=`cd $dir; ls $prefix-*.h 2>/dev/null`
36           opts="$opts "`echo $files | sed 's/'$prefix'-\([^.]*\).h/\1/g'`
37     done 
38     echo $str $opts
39   done
40   exit 1
41 }
42
43 CheckDir() {
44   for dir in $*
45   do
46     if test ! -d $dir
47     then
48       echo Error: cannot find $1!
49       exit 1
50     fi
51   done
52 }
53
54 TestIfCompiler() {
55   for dir in $OPT_DIRS
56   do
57     [ -f $dir/cc-$1.sh ] && return 1
58   done  
59   return 0
60 }
61
62 TestIfOption() {
63   for dir in $OPT_DIRS
64   do
65     [ -f $dir/conv-mach-$1.h ] && return 1 
66   done
67   
68   echo "Error> option: $1 is not supported in this version!"; 
69   printOption
70 }
71
72
73 # start
74
75 MAKEOPTS=""
76 OPTS=""
77 BOPTS=""
78 MORE=""
79 COMPILER=""
80 BASEDIR=
81 LIBDIR=
82 INCDIR=
83 ARCH=
84
85 [ $# -lt 2 ] && syntax
86 PROGRAM=$1
87 shift
88 VERSION=$1; BASEVERSION=$1; ARCH=`echo $1 | sed -e 's@-.*@@'`
89 shift
90
91 OPT_DIRS="$src/$BASEVERSION $src/$ARCH $src/common"
92
93 while [ ! $# -eq 0 ]
94 do
95   case "$1" in
96             "--basedir")
97                 shift; CheckDir $1/include $1/lib
98                 LIBDIR="$LIBDIR -L$1/lib";
99                 INCDIR="$INCDIR -I$1/include"; shift
100                 ;;
101             --basedir=*)
102                 dir=`echo $1 | awk -F= '{print $2}'`
103                 CheckDir $dir/include $dir/lib
104                 LIBDIR="$LIBDIR -L$dir/lib";
105                 INCDIR="$INCDIR -I$dir/include"; shift
106                 ;;
107             "--libdir")
108                 shift; CheckDir $1
109                 LIBDIR="$LIBDIR -L$1"; shift
110                 ;;
111             --libdir=*)
112                 dir=`echo $1 | awk -F= '{print $2}'`
113                 CheckDir $dir
114                 LIBDIR="$LIBDIR -L$dir"; shift
115                 ;;
116             "--incdir")
117                 shift; CheckDir $1
118                 INCDIR="$INCDIR -I$1"; shift
119                 ;;
120             --incdir=*)
121                 dir=`echo $1 | awk -F= '{print $2}'`
122                 CheckDir $dir
123                 INCDIR="$INCDIR -I$dir"; shift
124                 ;;
125     -*) 
126 # We hit a real compiler option (like -g, or -Dfoo),
127 # so just copy over all remaining options
128           while [ ! $# -eq 0 ]
129           do
130             OPTS="$OPTS $1"; shift
131           done
132           ;;
133     "help")
134         printOption
135         ;;
136     *)
137 # This has to be a build-time option (like "smp", "gcc3", or "kcc")
138         TestIfCompiler $1
139         if [ $? -eq 1 ] 
140         then
141 # It specifies a compiler:
142           if [ ! -z "$COMPILER" ] 
143           then
144               echo "Error> Tried to specify two compilers: $COMPILER and $1"
145               printOption
146           fi
147           COMPILER=$1
148         else
149 # It specifies some other option:
150           TestIfOption $1
151           BOPTS="$BOPTS $1"
152         fi
153         shift
154         ;;
155   esac
156 done
157
158 [ "x$VERSION" = "x" ] && syntax
159
160 [ -f $src/$BASEVERSION/conv-mach.h ] || syntax
161
162 #generate VERSION name combining all the build-time options.
163 if [ -n "$BOPTS" -o -n "$COMPILER" ]
164 then
165   echo "Selected Compiler: $COMPILER"
166   echo "Selected Options: $BOPTS"
167   SORTED=`echo $BOPTS | awk  '{ for (i = 1; i <= NF; ++i) print $i }' | sort`
168   BOPTS_WITHCOMPILER=`echo $SORTED $COMPILER`
169   for i in $BOPTS_WITHCOMPILER
170   do
171     VERSION=$VERSION-$i
172   done
173 fi
174
175 [ -d $VERSION ] || echo "Creating dir: $VERSION" 
176 [ -d $VERSION ] || mkdir $VERSION
177 [ -d $VERSION/tmp ] || echo "Creating dir: $VERSION/tmp" 
178 [ -d $VERSION/tmp ] || mkdir $VERSION/tmp
179
180 echo "Copying src/scripts/Makefile to $VERSION/tmp"
181 rm -f $VERSION/tmp/Makefile
182
183 if [ "x_`echo $VERSION | awk -F- '{print $2}'`" = "x_win32" ]
184 then
185 #Win32 version needs special compilers and *copied* (not linked)
186 # source files.
187         echo "Copying compilers for win32 into cygwin /bin directory"
188         cp $src/win32/unix2nt* /bin
189         cp $src/win32/system_ln $VERSION/tmp
190         cp $src/win32/unistd.h $VERSION/tmp
191   chmod +x $VERSION/tmp/system_ln
192 else
193         cat > $VERSION/tmp/system_ln <<EOF
194 #!/bin/sh
195 ln -f -s \$@
196 EOF
197   chmod +x $VERSION/tmp/system_ln
198         for newdir in `echo bin lib include tmp`
199         do
200                 echo "Soft-linking over $newdir"
201     if [ -r $newdir ]
202     then
203       rm -f $newdir
204     fi
205                 $VERSION/tmp/system_ln $VERSION/$newdir $newdir
206         done
207 fi
208
209 $VERSION/tmp/system_ln "../../src/scripts/Makefile" $VERSION/tmp/Makefile
210
211 ConvUsr="$VERSION/tmp/conv-mach-pre.sh"
212 echo "Generating $ConvUsr"
213 echo > $ConvUsr
214 test -n "$LIBDIR" && echo "CMK_LIBDIR=\"$LIBDIR\"" >> $ConvUsr
215 test -n "$INCDIR" && echo "CMK_INCDIR=\"$INCDIR\"" >> $ConvUsr
216 chmod +x $ConvUsr
217
218 # Create conv-mach-opt headers with special build-time options
219 ConvHeader="$VERSION/tmp/conv-mach-opt.h"
220 ConvSh="$VERSION/tmp/conv-mach-opt.sh"
221 echo "Generating $ConvHeader, conv-mach-opt.sh"
222 echo '/* Build-time options header, automatically generated by charm/build*/'> $ConvHeader
223 echo '# Built-time options header, automatically generated by charm/build'> $ConvSh
224 echo '[ -z "$CHARMINC" ] && CHARMINC="."' >> $ConvSh
225 if test -n "$COMPILER"
226 then
227       i="$COMPILER"
228       echo '#include "'cc-$i.h'"' >> $ConvHeader
229       echo '. $CHARMINC/'"cc-$i.sh" >> $ConvSh
230 fi
231 if test -n "$BOPTS"
232 then
233     for i in $BOPTS
234     do
235       echo '#include "'conv-mach-$i.h'"' >> $ConvHeader
236       echo '. $CHARMINC/'"conv-mach-$i.sh" >> $ConvSh
237     done
238 fi
239
240
241 echo $BASEVERSION > $VERSION/tmp/.vdir
242
243 echo "Performing 'make $MAKEOPTS $PROGRAM OPTS="$OPTS"' in $VERSION/tmp"
244 cd $VERSION/tmp 
245 make $MAKEOPTS $PROGRAM OPTS="$OPTS"
246
247 MAKEEXIT=$?
248 if [ $MAKEEXIT -eq 0 ]
249 then
250         echo "-------------------------------------------------"
251         echo "$PROGRAM built successfully."
252         echo "Next, try out a sample program like" \
253              "pgms/charm++/simplearrayhello"
254 else
255         echo "-------------------------------------------------"
256         echo "Charm++ NOT BUILT. Either cd into $VERSION/tmp and try"
257         echo "to resolve the problems yourself, visit"
258         echo "    http://charm.cs.uiuc.edu/"
259         echo "for more information. Otherwise, email the developers at ppl@cs.uiuc.edu"
260         exit $MAKEEXIT
261 fi