# The first parameter is a space-separated list of the architectures the
# compilers will run on. For instance, "ppc i386". If the current machine
# isn't in the list, it will (effectively) be added.
-# FIXME: HOSTS is not used in this script. Use it or Remove it.
HOSTS="$1"
# The second parameter is a space-separated list of the architectures the
# compilers will generate code for. If the current machine isn't in the list, a
# compiler for it will get built anyway, but won't be installed.
+# FIXME: The list of targets is currently hard-coded and TARGETS is not used.
TARGETS="$2"
# The third parameter is the path to the compiler sources. There should be a
# resulting compiler.
SYM_DIR="$6"
-# The seventh parameter is the version number of the submission, e.g. 1007.
-LLVM_SUBMIT_VERSION="$7"
+# The seventh parameter is a yes/no that indicates whether assertions should be
+# enabled in the LLVM libs/tools.
+LLVM_ASSERTIONS="$7"
-# The eighth parameter is the subversion number of the submission, e.g. 03.
-LLVM_SUBMIT_SUBVERSION="$8"
+# The eighth parameter is a yes/no that indicates whether this is an optimized
+# build.
+LLVM_OPTIMIZED="$8"
-# The nineth parameter is a yes/no that indicates whether assertions should be
-# enabled in the LLVM libs/tools.
-LLVM_ASSERTIONS="$9"
+# A yes/no parameter that controls whether to cross-build for an ARM host.
+ARM_HOSTED_BUILD="$9"
+
+# A yes/no parameter that controls whether to cross-build for the iOS simulator
+IOS_SIM_BUILD="${10}"
+
+# The version number of the submission, e.g. 1007.
+LLVM_SUBMIT_VERSION="${11}"
+
+# The subversion number of the submission, e.g. 03.
+LLVM_SUBMIT_SUBVERSION="${12}"
# The current working directory is where the build will happen. It may already
# contain a partial result of an interrupted build, in which case this script
DARWIN_VERS=`uname -r | sed 's/\..*//'`
echo DARWIN_VERS = $DARWIN_VERS
-# If the user has CC set in their environment unset it now
-unset CC
-
-# The B&I build srcript (~rc/bin/buildit) accepts an '-othercflags' command-line
-# flag, and captures the argument to that flag in $RC_NONARCH_CFLAGS (and
-# mysteriously prepends '-pipe' thereto). We will allow this to override the
-# default $CFLAGS and $CXXFLAGS.
-
-if [ "x$LLVM_DEBUG" == "x" ]; then
- CFLAGS="-g -O2 ${RC_NONARCH_CFLAGS/-pipe/}"
- OPTIMIZE_OPTS="ENABLE_OPTIMIZED=1"
-else
- CFLAGS="-g"
- OPTIMIZE_OPTS=
-fi
-
################################################################################
# Run the build.
rm -rf $SRC_DIR || exit 1
mkdir $SRC_DIR || exit 1
ln -s $ORIG_SRC_DIR/* $SRC_DIR/ || exit 1
-
-# Build the LLVM tree universal.
-mkdir -p $DIR/obj-llvm || exit 1
-cd $DIR/obj-llvm || exit 1
-
-if [ \! -f Makefile.config ]; then
- $SRC_DIR/llvm/configure --prefix=$DEST_DIR$DEST_ROOT \
- --enable-targets=x86,powerpc,cbe --enable-assertions=$LLVM_ASSERTIONS \
- || exit 1
+# We can't use the top-level Makefile as-is. Remove the soft link:
+rm $SRC_DIR/Makefile || exit 1
+# Now create our own by editing the top-level Makefile, deleting every line marked "Apple-style":
+sed -e '/[Aa]pple-style/d' -e '/include.*GNUmakefile/d' $ORIG_SRC_DIR/Makefile > $SRC_DIR/Makefile || exit 1
+
+SUBVERSION=`echo $RC_ProjectSourceVersion | sed -e 's/.*\.\([0-9]*\).*/\1/'`
+if [ "x$SUBVERSION" != "x$RC_ProjectSourceVersion" ]; then
+ LLVM_SUBMIT_SUBVERSION=`printf "%02d" $SUBVERSION`
+ RC_ProjectSourceVersion=`echo $RC_ProjectSourceVersion | sed -e 's/\..*//'`
+ LLVM_SUBMIT_VERSION=$RC_ProjectSourceVersion
fi
-
if [ "x$LLVM_SUBMIT_SUBVERSION" = "x00" -o "x$LLVM_SUBMIT_SUBVERSION" = "x0" ]; then
LLVM_VERSION="$LLVM_SUBMIT_VERSION"
else
LLVM_VERSION="$LLVM_SUBMIT_VERSION-$LLVM_SUBMIT_SUBVERSION"
fi
-# Note: Don't pass -jN here. Building universal already has parallelism and we
-# don't want to make the builders hit swap by firing off too many gcc's at the
-# same time.
-make $OPTIMIZE_OPTS UNIVERSAL=1 UNIVERSAL_ARCH="$TARGETS" \
+SDKROOT_PATH=`xcodebuild -version -sdk $SDKROOT Path`
+
+# Figure out how many make processes to run.
+SYSCTL=`sysctl -n hw.activecpu`
+# sysctl -n hw.* does not work when invoked via B&I chroot /BuildRoot.
+# Builders can default to 2, since even if they are single processor,
+# nothing else is running on the machine.
+if [ -z "$SYSCTL" ]; then
+ SYSCTL=2
+fi
+JOBS_FLAG="-j $SYSCTL"
+
+COMMON_CONFIGURE_OPTS="\
+ --prefix=$DEST_DIR$DEST_ROOT \
+ --enable-assertions=$LLVM_ASSERTIONS \
+ --enable-optimized=$LLVM_OPTIMIZED \
+ --disable-bindings \
+ --disable-zlib \
+ --enable-terminfo=no"
+
+COMMON_MAKEFLAGS="\
+ UNIVERSAL=1 \
+ UNIVERSAL_SDK_PATH=$SDKROOT_PATH \
+ NO_RUNTIME_LIBS=1 \
+ DISABLE_EDIS=1 \
+ REQUIRES_RTTI=1 \
+ DEBUG_SYMBOLS=1 \
+ LLVM_SUBMIT_VERSION=$LLVM_SUBMIT_VERSION \
+ LLVM_SUBMIT_SUBVERSION=$LLVM_SUBMIT_SUBVERSION \
+ VERBOSE=1"
+
+# Build the LLVM tree universal.
+mkdir -p $DIR/obj-llvm || exit 1
+cd $DIR/obj-llvm || exit 1
+
+if [ "$ARM_HOSTED_BUILD" = yes ]; then
+ # The cross-tools' build process expects to find an existing cross toolchain
+ # under names like 'arm-apple-darwin$DARWIN_VERS-as'; so make them.
+ rm -rf $DIR/bin || exit 1
+ mkdir $DIR/bin || exit 1
+ for prog in ar nm ranlib strip lipo ld as ; do
+ P=$DIR/bin/arm-apple-darwin$DARWIN_VERS-${prog}
+ T=`xcrun -sdk $SDKROOT -find ${prog}`
+ ln -s $T $DIR/bin/$prog
+ echo '#!/bin/sh' > $P || exit 1
+ echo 'exec '$T' "$@"' >> $P || exit 1
+ chmod a+x $P || exit 1
+ done
+ # Set up the links for clang.
+ for prog in clang clang++ ; do
+ P=$DIR/bin/arm-apple-darwin$DARWIN_VERS-${prog}
+ T=`xcrun -sdk $SDKROOT -find ${prog}`
+ ln -s $T $DIR/bin/$prog
+ echo '#!/bin/sh' > $P || exit 1
+ echo 'exec '$T' -arch armv7 -isysroot '${SDKROOT_PATH}' "$@"' >> $P || exit 1
+ chmod a+x $P || exit 1
+ done
+
+ PATH=$DIR/bin:$PATH
+
+ unset SDKROOT && \
+ $SRC_DIR/configure $COMMON_CONFIGURE_OPTS \
+ --enable-targets=arm,arm64 \
+ --host=arm-apple-darwin10 \
+ --target=arm-apple-darwin10 \
+ --build=i686-apple-darwin10 \
+ --program-prefix="" \
+ || exit 1
+
+ if [ -n "$IPHONEOS_DEPLOYMENT_TARGET" ]; then
+ COMMON_MAKEFLAGS="$COMMON_MAKEFLAGS \
+ DEPLOYMENT_TARGET=-mios-version-min=$IPHONEOS_DEPLOYMENT_TARGET"
+ fi
+
+ make $JOBS_FLAG $COMMON_MAKEFLAGS SDKROOT= UNIVERSAL_ARCH="$HOSTS" \
CXXFLAGS="-DLLVM_VERSION_INFO='\" Apple Build #$LLVM_VERSION\"'"
+ if [ $? != 0 ] ; then
+ echo "error: LLVM 'make' failed!"
+ exit 1
+ fi
-if ! test $? == 0 ; then
+else
+# not $ARM_HOSTED_BUILD
+
+ if [ "$IOS_SIM_BUILD" = yes ]; then
+ export CC=`xcrun -sdk iphonesimulator -find clang`
+ export CXX=`xcrun -sdk iphonesimulator -find clang++`
+
+ # Use a non-standard "darwin_sim" host triple to trigger a cross-build.
+ configure_opts="--enable-targets=x86 --host=i686-apple-darwin_sim \
+ --build=i686-apple-darwin10"
+ if [ -n "$IPHONEOS_DEPLOYMENT_TARGET" ]; then
+ COMMON_MAKEFLAGS="$COMMON_MAKEFLAGS \
+ DEPLOYMENT_TARGET=-mios-simulator-version-min=$IPHONEOS_DEPLOYMENT_TARGET"
+ fi
+ else
+ export CC=`xcrun -sdk macosx -find clang`
+ export CXX=`xcrun -sdk macosx -find clang++`
+
+ configure_opts="--enable-targets=arm,arm64,x86"
+ if [ -n "$MACOSX_DEPLOYMENT_TARGET" ]; then
+ COMMON_MAKEFLAGS="$COMMON_MAKEFLAGS \
+ DEPLOYMENT_TARGET=-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
+ fi
+ fi
+
+ if [ $SDKROOT_PATH ]; then
+ CPPFLAGS="$CPPFLAGS -isysroot $SDKROOT_PATH"
+ fi
+ for host in $HOSTS; do :; done
+ CPPFLAGS="$CPPFLAGS -arch $host"
+
+ $SRC_DIR/configure $COMMON_CONFIGURE_OPTS $configure_opts \
+ --program-prefix="" \
+ CPPFLAGS="$CPPFLAGS" \
+ || exit 1
+
+ make $JOBS_FLAG $COMMON_MAKEFLAGS UNIVERSAL_ARCH="$HOSTS" \
+ CXXFLAGS="-DLLVM_VERSION_INFO='\" Apple Build #$LLVM_VERSION\"'"
+ if [ $? != 0 ] ; then
echo "error: LLVM 'make' failed!"
exit 1
+ fi
fi
################################################################################
cd $DIR/obj-llvm || exit 1
# Install the tree into the destination directory.
-make $LOCAL_MAKEFLAGS $OPTIMIZE_OPTS UNIVERSAL=1 OPTIMIZE_OPTION='-O2' install
-
+make $JOBS_FLAG $COMMON_MAKEFLAGS UNIVERSAL_ARCH="$HOSTS" install
if ! test $? == 0 ; then
echo "error: LLVM 'make install' failed!"
exit 1
fi
# Install Version.h
-if [ "x$LLVM_SUBMIT_SUBVERSION" = "x00" -o "x$LLVM_SUBMIT_SUBVERSION" = "x0" ]; then
- RC_ProjectSourceSubversion=0
-else
- case "$LLVM_SUBMIT_SUBVERSION" in
- 01) RC_ProjectSourceSubversion=1 ;;
- 02) RC_ProjectSourceSubversion=2 ;;
- 03) RC_ProjectSourceSubversion=3 ;;
- 04) RC_ProjectSourceSubversion=4 ;;
- 05) RC_ProjectSourceSubversion=5 ;;
- 06) RC_ProjectSourceSubversion=6 ;;
- 07) RC_ProjectSourceSubversion=7 ;;
- 08) RC_ProjectSourceSubversion=8 ;;
- 09) RC_ProjectSourceSubversion=9 ;;
- *) RC_ProjectSourceSubversion=$LLVM_SUBMIT_SUBVERSION ;;
- esac
+LLVM_MINOR_VERSION=`echo $LLVM_SUBMIT_SUBVERSION | sed -e 's,0*\([1-9][0-9]*\),\1,'`
+if [ "x$LLVM_MINOR_VERSION" = "x" ]; then
+ LLVM_MINOR_VERSION=0
fi
-
+RC_ProjectSourceSubversion=`printf "%d" $LLVM_MINOR_VERSION`
echo "#define LLVM_VERSION ${RC_ProjectSourceVersion}" > $DEST_DIR$DEST_ROOT/include/llvm/Version.h
echo "#define LLVM_MINOR_VERSION ${RC_ProjectSourceSubversion}" >> $DEST_DIR$DEST_ROOT/include/llvm/Version.h
-# Strip local symbols from llvm libraries.
-strip -S $DEST_DIR$DEST_ROOT/lib/*.[oa]
-strip -Sx $DEST_DIR$DEST_ROOT/lib/*.so
-
-# Remove .dir files
-cd $DEST_DIR$DEST_ROOT
-rm bin/.dir etc/llvm/.dir lib/.dir
-
-# Remove PPC64 fat slices.
-cd $DEST_DIR$DEST_ROOT/bin
+# Run unifdef to preprocess the installed headers to reflect whether this
+# was a debug or release build.
+for file in `find $DEST_DIR$DEST_ROOT/include -type f -print`; do
+ if [ "$LLVM_ASSERTIONS" = yes ]; then
+ unifdef -UNDEBUG -D_DEBUG -o $file $file
+ else
+ unifdef -DNDEBUG -U_DEBUG -ULLVM_ENABLE_DUMP -o $file $file
+ fi
+done
+
+# Find the right version of strip to use.
+STRIP=strip
+if [ -n "$SDKROOT" ]; then
+ STRIP=`xcrun -sdk $SDKROOT -find strip`
+fi
-if [ $MACOSX_DEPLOYMENT_TARGET = "10.4" ]; then
- find . -perm 755 -type f -exec lipo -extract ppc -extract i386 {} -output {} \;
-else
- find . -perm 755 -type f -exec lipo -extract ppc7400 -extract i386 {} -output {} \;
+if [ "x$LLVM_DEBUG" != "x1" ]; then
+ # Strip local symbols from llvm libraries.
+ #
+ # Use '-l' to strip i386 modules. N.B. that flag doesn't work with kext or
+ # PPC objects!
+ $STRIP -Sl $DEST_DIR$DEST_ROOT/lib/*.[oa]
+ for f in `ls $DEST_DIR$DEST_ROOT/lib/*.so`; do
+ $STRIP -Sxl $f
+ done
fi
+# Remove .dir files
cd $DEST_DIR$DEST_ROOT
-lipo -extract ppc -extract i386 lib/LLVMlto.0.0.0.so -output lib/LLVMlto.0.0.0.so
+rm -f bin/.dir etc/llvm/.dir lib/.dir
-# LTO is part of developer tools
-LTO_HOME=$DEST_DIR//Developer/usr
-if [ "x$DEVELOPER_BIN" != "x" ]; then
-LTO_HOME=$DEST_DIR/$DEVELOPER_DIR/usr
-fi
+# The Hello dylib is an example of how to build a pass.
+# The BugpointPasses module is only used to test bugpoint.
+# These unversioned dylibs cause verification failures, so do not install them.
+# (The wildcards are used to match a "lib" prefix if it is present.)
+rm $DEST_DIR$DEST_ROOT/lib/*LLVMHello.dylib
+rm $DEST_DIR$DEST_ROOT/lib/*BugpointPasses.dylib
-mkdir -p $LTO_HOME/lib
-mv lib/LLVMlto* $LTO_HOME/lib/.
-mkdir -p $LTO_HOME/include/llvm
-mv $DEST_DIR/usr/local/include/llvm/LinkTimeOptimizer.h $LTO_HOME/include/llvm/.
+# Compress manpages
+MDIR=$DEST_DIR$DEST_ROOT/share/man/man1
+gzip -f $MDIR/*
################################################################################
# Create SYM_DIR with information required for debugging.
rm -rf * || exit 1
# Generate .dSYM files
-find $DEST_DIR -perm -0111 -type f ! \( -name '*.la' -o -name gccas -o -name gccld -o -name llvm-config \) -print \
- | xargs -n 1 -P ${SYSCTL} dsymutil
+DSYMUTIL=`xcrun -find dsymutil`
+find $DEST_DIR -perm -0111 -type f \
+ ! \( -name '*.la' -o -name gccas -o -name gccld -o -name llvm-config -o -name '*.a' \) \
+ -print | xargs -n 1 -P ${SYSCTL} ${DSYMUTIL}
# Save .dSYM files and .a archives
cd $DEST_DIR || exit 1
find obj-* -name \*.\[chy\] -o -name \*.cpp -print \
| cpio -pdml $SYM_DIR/src || exit 1
+################################################################################
+# Remove libLTO.dylib and lto.h. Those are installed by clang.
+
+cd $DEST_DIR$DEST_ROOT
+rm -f lib/libLTO.dylib
+rm -f lib/libLTO.a lib/libLTO.la
+find $DEST_DIR$DEST_ROOT -name lto.h -delete
+
################################################################################
# Remove debugging information from DEST_DIR.
+cd $DIR || exit 1
+
find $DEST_DIR -name \*.a -print | xargs ranlib || exit 1
find $DEST_DIR -name \*.dSYM -print | xargs rm -r || exit 1
+
+# Strip debugging information from files
+#
+# Use '-l' to strip i386 modules. N.B. that flag doesn't work with kext or
+# PPC objects!
+find $DEST_DIR -perm -0111 -type f \
+ ! \( -name '*.la' -o -name gccas -o -name gccld -o -name llvm-config \) \
+ -print | xargs -n 1 -P ${SYSCTL} $STRIP -arch all -Sl
+
chgrp -h -R wheel $DEST_DIR
chgrp -R wheel $DEST_DIR
+################################################################################
+# Remove the docs directory
+
+rm -rf $DEST_DIR$DEST_ROOT/docs
+
################################################################################
# w00t! Done!