#!/bin/sh
# LLVM LOCAL file B&I

set -x

# Build LLVM the "Apple way".
# Parameters:

# 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.
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
# shell script named 'configure' in this directory. This script makes a copy...
ORIG_SRC_DIR="$3"

# The fourth parameter is the location where the LLVM will be installed. You can
# move it once it's built, so this mostly controls the layout of $DEST_DIR.
DEST_ROOT="$4"

# The fifth parameter is the place where the compiler will be copied once it's
# built.
DEST_DIR="$5"

# The sixth parameter is a directory in which to place information (like
# unstripped executables and generated source files) helpful in debugging the
# resulting compiler.
SYM_DIR="$6"

# 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 a yes/no that indicates whether this is an optimized
# build.
LLVM_OPTIMIZED="$8"

# 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
# will continue where it left off.
DIR=`pwd`

DARWIN_VERS=`uname -r | sed 's/\..*//'`
echo DARWIN_VERS = $DARWIN_VERS

################################################################################
# Run the build.

# Create the source tree we'll actually use to build, deleting
# tcl since it doesn't actually build properly in a cross environment
# and we don't really need it.
SRC_DIR=$DIR/src
rm -rf $SRC_DIR || exit 1
mkdir $SRC_DIR || exit 1
ln -s $ORIG_SRC_DIR/* $SRC_DIR/ || 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

# 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 \
  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}' "$@"' >> $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 \
    --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 

else
# not $ARM_HOSTED_BUILD

  export CC=`xcrun -find clang`
  export CXX=`xcrun -find clang++`

  if [ "$IOS_SIM_BUILD" = yes ]; then
    # 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
    configure_opts="--enable-targets=arm,x86"
    if [ -n "$MACOSX_DEPLOYMENT_TARGET" ]; then
      COMMON_MAKEFLAGS="$COMMON_MAKEFLAGS \
        DEPLOYMENT_TARGET=-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
    fi
  fi

  if [ $SDKROOT ]; then
    CPPFLAGS="$CPPFLAGS -isysroot $SDKROOT"
  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 

################################################################################
# Construct the actual destination root, by copying stuff from $DIR/dst-* to
# $DEST_DIR, with occasional 'lipo' commands.

cd $DEST_DIR || exit 1

# Clean out DEST_DIR in case -noclean was passed to buildit.
rm -rf * || exit 1

cd $DIR/obj-llvm || exit 1

# Install the tree into the destination directory.
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
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

# 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 [ "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
rm -f bin/.dir etc/llvm/.dir lib/.dir

# 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

# Compress manpages
MDIR=$DEST_DIR$DEST_ROOT/share/man/man1
gzip -f $MDIR/*

################################################################################
# Create SYM_DIR with information required for debugging.

# Figure out how many make processes to run.
SYSCTL=`sysctl -n hw.activecpu`

# hw.activecpu only available in 10.2.6 and later
if [ -z "$SYSCTL" ]; then
  SYSCTL=`sysctl -n hw.ncpu`
fi

# 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

cd $SYM_DIR || exit 1

# Clean out SYM_DIR in case -noclean was passed to buildit.
rm -rf * || exit 1

# Generate .dSYM files
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 . \( -path \*.dSYM/\* -or -name \*.a \) -print \
    | cpio -pdml $SYM_DIR || exit 1

# Save source files.
mkdir $SYM_DIR/src || exit 1
cd $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!

exit 0
