build_llvm revision bf1075cbe764b7b1ee514d755757c6e4784f994d
1#!/bin/sh 2# LLVM LOCAL file B&I 3 4set -x 5 6# Build LLVM the "Apple way". 7# Parameters: 8 9# The first parameter is a space-separated list of the architectures the 10# compilers will run on. For instance, "ppc i386". If the current machine 11# isn't in the list, it will (effectively) be added. 12HOSTS="$1" 13 14# The second parameter is a space-separated list of the architectures the 15# compilers will generate code for. If the current machine isn't in the list, a 16# compiler for it will get built anyway, but won't be installed. 17# FIXME: The list of targets is currently hard-coded and TARGETS is not used. 18TARGETS="$2" 19 20# The third parameter is the path to the compiler sources. There should be a 21# shell script named 'configure' in this directory. This script makes a copy... 22ORIG_SRC_DIR="$3" 23 24# The fourth parameter is the location where the LLVM will be installed. You can 25# move it once it's built, so this mostly controls the layout of $DEST_DIR. 26DEST_ROOT="$4" 27 28# The fifth parameter is the place where the compiler will be copied once it's 29# built. 30DEST_DIR="$5" 31 32# The sixth parameter is a directory in which to place information (like 33# unstripped executables and generated source files) helpful in debugging the 34# resulting compiler. 35SYM_DIR="$6" 36 37# The seventh parameter is a yes/no that indicates whether assertions should be 38# enabled in the LLVM libs/tools. 39LLVM_ASSERTIONS="$7" 40 41# The eighth parameter is a yes/no that indicates whether this is an optimized 42# build. 43LLVM_OPTIMIZED="$8" 44 45# The ninth parameter is a yes/no that indicates whether libLTO.dylib 46# should be installed. 47INSTALL_LIBLTO="$9" 48 49# A yes/no parameter that controls whether to cross-build for an ARM host. 50ARM_HOSTED_BUILD="${10}" 51 52# The version number of the submission, e.g. 1007. 53LLVM_SUBMIT_VERSION="${11}" 54 55# The subversion number of the submission, e.g. 03. 56LLVM_SUBMIT_SUBVERSION="${12}" 57 58# The current working directory is where the build will happen. It may already 59# contain a partial result of an interrupted build, in which case this script 60# will continue where it left off. 61DIR=`pwd` 62 63DARWIN_VERS=`uname -r | sed 's/\..*//'` 64echo DARWIN_VERS = $DARWIN_VERS 65 66DEVELOPER_DIR="${DEVELOPER_DIR-Developer}" 67if [ "$ARM_HOSTED_BUILD" = yes ]; then 68 DT_HOME="$DEST_DIR/usr" 69else 70 DT_HOME="$DEST_DIR/$DEVELOPER_DIR/usr" 71fi 72 73DEST_ROOT="/$DEVELOPER_DIR$DEST_ROOT" 74 75################################################################################ 76# Run the build. 77 78# Create the source tree we'll actually use to build, deleting 79# tcl since it doesn't actually build properly in a cross environment 80# and we don't really need it. 81SRC_DIR=$DIR/src 82rm -rf $SRC_DIR || exit 1 83mkdir $SRC_DIR || exit 1 84ln -s $ORIG_SRC_DIR/* $SRC_DIR/ || exit 1 85# We can't use the top-level Makefile as-is. Remove the soft link: 86rm $SRC_DIR/Makefile || exit 1 87# Now create our own by editing the top-level Makefile, deleting every line marked "Apple-style": 88sed -e '/[Aa]pple-style/d' -e '/include.*GNUmakefile/d' $ORIG_SRC_DIR/Makefile > $SRC_DIR/Makefile || exit 1 89 90# Build the LLVM tree universal. 91mkdir -p $DIR/obj-llvm || exit 1 92cd $DIR/obj-llvm || exit 1 93 94if [ "$ARM_HOSTED_BUILD" = yes ]; then 95 # The cross-tools' build process expects to find an existing cross toolchain 96 # under names like 'arm-apple-darwin$DARWIN_VERS-as'; so make them. 97 rm -rf $DIR/bin || exit 1 98 mkdir $DIR/bin || exit 1 99 for prog in ar nm ranlib strip lipo ld as ; do 100 P=$DIR/bin/arm-apple-darwin$DARWIN_VERS-${prog} 101 T=`xcrun -sdk $SDKROOT -find ${prog}` 102 echo '#!/bin/sh' > $P || exit 1 103 echo 'exec '$T' "$@"' >> $P || exit 1 104 chmod a+x $P || exit 1 105 done 106 # Try to use the platform llvm-gcc. Fall back to gcc if it's not available. 107 for prog in gcc g++ ; do 108 P=$DIR/bin/arm-apple-darwin$DARWIN_VERS-${prog} 109 T=`xcrun -find llvm-${prog}` 110 if [ "x$T" = "x" ] ; then 111 T=`xcrun -sdk $SDKROOT -find ${prog}` 112 fi 113 echo '#!/bin/sh' > $P || exit 1 114 echo 'exec '$T' -arch armv6 -isysroot '${SDKROOT}' "$@"' >> $P || exit 1 115 chmod a+x $P || exit 1 116 done 117 118 PATH=$DIR/bin:$PATH 119# otherwise, try to use llvm-gcc if it's available 120elif [ $DARWIN_VERS -gt 9 ]; then 121 # If the user has set CC or CXX, respect their wishes. If not, 122 # compile with LLVM-GCC/LLVM-G++ if available; if LLVM is not 123 # available, fall back to usual GCC/G++ default. 124 savedPATH=$PATH ; PATH="/Developer/usr/bin:$PATH" 125 XTMPCC=$(which llvm-gcc) 126 if [ x$CC = x -a x$XTMPCC != x ] ; then export CC=$XTMPCC ; fi 127 XTMPCC=$(which llvm-g++) 128 if [ x$CXX = x -a x$XTMPCC != x ] ; then export CXX=$XTMPCC ; fi 129 PATH=$savedPATH 130 unset XTMPCC savedPATH 131fi 132 133if [ "$ARM_HOSTED_BUILD" = yes ]; then 134 configure_prefix=$DT_HOME 135 configure_opts="--enable-targets=arm --host=arm-apple-darwin10 \ 136 --target=arm-apple-darwin10 --build=i686-apple-darwin10" 137else 138 configure_prefix=$DT_HOME/local 139 configure_opts="--enable-targets=arm,x86,powerpc,cbe" 140fi 141 142if [ \! -f Makefile.config ]; then 143 $SRC_DIR/configure --prefix=$configure_prefix $configure_opts \ 144 --enable-assertions=$LLVM_ASSERTIONS \ 145 --enable-optimized=$LLVM_OPTIMIZED \ 146 --disable-bindings \ 147 || exit 1 148fi 149 150SUBVERSION=`echo $RC_ProjectSourceVersion | sed -e 's/[^.]*\.\([0-9]*\).*/\1/'` 151 152if [ "x$SUBVERSION" != "x$RC_ProjectSourceVersion" ]; then 153 LLVM_SUBMIT_SUBVERSION=`printf "%02d" $SUBVERSION` 154 RC_ProjectSourceVersion=`echo $RC_ProjectSourceVersion | sed -e 's/\..*//'` 155 LLVM_SUBMIT_VERSION=$RC_ProjectSourceVersion 156fi 157 158if [ "x$LLVM_SUBMIT_SUBVERSION" = "x00" -o "x$LLVM_SUBMIT_SUBVERSION" = "x0" ]; then 159 LLVM_VERSION="$LLVM_SUBMIT_VERSION" 160else 161 LLVM_VERSION="$LLVM_SUBMIT_VERSION-$LLVM_SUBMIT_SUBVERSION" 162fi 163 164GCC_VER=`cc --version 2>/dev/null | sed 1q` 165 166if echo "$GCC_VER" | grep GCC > /dev/null; then 167 GCC_VER=`echo $GCC_VER | sed -e 's/.*(GCC) \([0-9.][0-9.]*\).*/\1/'` 168 MAJ_VER=`echo $GCC_VER | sed 's/\..*//'` 169 MIN_VER=`echo $GCC_VER | sed 's/[^.]*\.\([0-9]*\).*/\1/'` 170fi 171 172JOBS_FLAG="" 173 174# Note: If compiling with GCC 4.0, don't pass the -jN flag. Building universal 175# already has parallelism and we don't want to make the builders hit swap by 176# firing off too many gccs at the same time. 177if [ "x$MAJ_VER" != "x4" -o "x$MIN_VER" != "x0" ]; then 178 # Figure out how many make processes to run. 179 SYSCTL=`sysctl -n hw.activecpu` 180 181 # hw.activecpu only available in 10.2.6 and later 182 if [ -z "$SYSCTL" ]; then 183 SYSCTL=`sysctl -n hw.ncpu` 184 fi 185 186 # sysctl -n hw.* does not work when invoked via B&I chroot /BuildRoot. 187 # Builders can default to 2, since even if they are single processor, 188 # nothing else is running on the machine. 189 if [ -z "$SYSCTL" ]; then 190 SYSCTL=2 191 fi 192 193 JOBS_FLAG="-j $SYSCTL" 194fi 195 196make $JOBS_FLAG $OPTIMIZE_OPTS UNIVERSAL=1 UNIVERSAL_ARCH="$HOSTS" \ 197 UNIVERSAL_SDK_PATH=$SDKROOT \ 198 NO_RUNTIME_LIBS=1 \ 199 DISABLE_EDIS=1 \ 200 LLVM_SUBMIT_VERSION=$LLVM_SUBMIT_VERSION \ 201 LLVM_SUBMIT_SUBVERSION=$LLVM_SUBMIT_SUBVERSION \ 202 CXXFLAGS="-DLLVM_VERSION_INFO='\" Apple Build #$LLVM_VERSION\"'" \ 203 VERBOSE=1 204 205if [ $? != 0 ] ; then 206 echo "error: LLVM 'make' failed!" 207 exit 1 208fi 209 210################################################################################ 211# Construct the actual destination root, by copying stuff from $DIR/dst-* to 212# $DEST_DIR, with occasional 'lipo' commands. 213 214cd $DEST_DIR || exit 1 215 216# Clean out DEST_DIR in case -noclean was passed to buildit. 217rm -rf * || exit 1 218 219cd $DIR/obj-llvm || exit 1 220 221# Install the tree into the destination directory. 222make $LOCAL_MAKEFLAGS $OPTIMIZE_OPTS UNIVERSAL=1 UNIVERSAL_ARCH="$HOSTS" \ 223 NO_RUNTIME_LIBS=1 \ 224 DISABLE_EDIS=1 \ 225 LLVM_SUBMIT_VERSION=$LLVM_SUBMIT_VERSION \ 226 LLVM_SUBMIT_SUBVERSION=$LLVM_SUBMIT_SUBVERSION \ 227 OPTIMIZE_OPTION='-O3' VERBOSE=1 install 228 229if ! test $? == 0 ; then 230 echo "error: LLVM 'make install' failed!" 231 exit 1 232fi 233 234# Install Version.h 235LLVM_MINOR_VERSION=`echo $LLVM_SUBMIT_SUBVERSION | sed -e 's,0*\([1-9][0-9]*\),\1,'` 236if [ "x$LLVM_MINOR_VERSION" = "x" ]; then 237 LLVM_MINOR_VERSION=0 238fi 239RC_ProjectSourceSubversion=`printf "%d" $LLVM_MINOR_VERSION` 240echo "#define LLVM_VERSION ${RC_ProjectSourceVersion}" > $DEST_DIR$DEST_ROOT/include/llvm/Version.h 241echo "#define LLVM_MINOR_VERSION ${RC_ProjectSourceSubversion}" >> $DEST_DIR$DEST_ROOT/include/llvm/Version.h 242 243if [ "x$LLVM_DEBUG" != "x1" ]; then 244 # Strip local symbols from llvm libraries. 245 strip -S $DEST_DIR$DEST_ROOT/lib/*.[oa] 246 for f in `ls $DEST_DIR$DEST_ROOT/lib/*.so`; do 247 strip -Sx $f 248 done 249fi 250 251# Copy over the tblgen utility. 252cp `find $DIR -name tblgen` $DT_HOME/local/bin 253 254# Remove .dir files 255cd $DEST_DIR$DEST_ROOT 256rm -f bin/.dir etc/llvm/.dir lib/.dir 257 258# Remove PPC64 fat slices. 259cd $DEST_DIR$DEST_ROOT/bin 260if [ $MACOSX_DEPLOYMENT_TARGET = "10.4" ]; then 261 find . -perm 755 -type f \! \( -name '*gccas' -o -name '*gccld' -o -name llvm-config \) \ 262 -exec lipo -extract ppc -extract i386 {} -output {} \; 263elif [ $MACOSX_DEPLOYMENT_TARGET = "10.5" ]; then 264 find . -perm 755 -type f \! \( -name '*gccas' -o -name '*gccld' -o -name llvm-config \) \ 265 -exec lipo -extract ppc7400 -extract i386 {} -output {} \; 266else 267 find . -perm 755 -type f \! \( -name '*gccas' -o -name '*gccld' -o -name llvm-config \) \ 268 -exec lipo -extract ppc7400 -extract i386 -extract x86_64 {} -output {} \; 269fi 270 271cd $DEST_DIR$DEST_ROOT 272if [ "$INSTALL_LIBLTO" == yes ]; then 273 mkdir -p $DT_HOME/lib 274 mv lib/libLTO.dylib $DT_HOME/lib/libLTO.dylib 275 strip -S $DT_HOME/lib/libLTO.dylib 276fi 277rm -f lib/libLTO.a lib/libLTO.la 278 279# The Hello dylib is an example of how to build a pass. No need to install it. 280rm lib/libLLVMHello.dylib 281 282# Compress manpages 283MDIR=$DEST_DIR$DEST_ROOT/share/man/man1 284gzip -f $MDIR/* 285 286################################################################################ 287# Create SYM_DIR with information required for debugging. 288 289# Figure out how many make processes to run. 290SYSCTL=`sysctl -n hw.activecpu` 291 292# hw.activecpu only available in 10.2.6 and later 293if [ -z "$SYSCTL" ]; then 294 SYSCTL=`sysctl -n hw.ncpu` 295fi 296 297# sysctl -n hw.* does not work when invoked via B&I chroot /BuildRoot. Builders 298# can default to 2, since even if they are single processor, nothing else is 299# running on the machine. 300if [ -z "$SYSCTL" ]; then 301 SYSCTL=2 302fi 303 304cd $SYM_DIR || exit 1 305 306# Clean out SYM_DIR in case -noclean was passed to buildit. 307rm -rf * || exit 1 308 309# Generate .dSYM files 310find $DEST_DIR -perm -0111 -type f \ 311 ! \( -name '*.la' -o -name gccas -o -name gccld -o -name llvm-config -o -name '*.a' \) \ 312 -print | xargs -n 1 -P ${SYSCTL} dsymutil 313 314# Save .dSYM files and .a archives 315cd $DEST_DIR || exit 1 316find . \( -path \*.dSYM/\* -or -name \*.a \) -print \ 317 | cpio -pdml $SYM_DIR || exit 1 318 319# Save source files. 320mkdir $SYM_DIR/src || exit 1 321cd $DIR || exit 1 322find obj-* -name \*.\[chy\] -o -name \*.cpp -print \ 323 | cpio -pdml $SYM_DIR/src || exit 1 324 325################################################################################ 326# Remove debugging information from DEST_DIR. 327 328find $DEST_DIR -name \*.a -print | xargs ranlib || exit 1 329find $DEST_DIR -name \*.dSYM -print | xargs rm -r || exit 1 330chgrp -h -R wheel $DEST_DIR 331chgrp -R wheel $DEST_DIR 332 333################################################################################ 334# Remove tar ball from docs directory 335 336find $DEST_DIR -name html.tar.gz -exec rm {} \; 337 338################################################################################ 339# symlinks so that B&I can find things 340 341if [ "$INSTALL_LIBLTO" == yes ]; then 342 mkdir -p $DEST_DIR/usr/lib/ 343 cd $DEST_DIR/usr/lib && \ 344 ln -s ../../$DEVELOPER_DIR/usr/lib/libLTO.dylib ./libLTO.dylib 345fi 346 347################################################################################ 348# w00t! Done! 349 350exit 0 351