blob: 4e065bf8341980792fffb81aeb2b25a6ad04f09a [file] [log] [blame]
#!/bin/bash
# Expected arguments:
# $1 = out_dir
# $2 = dest_dir
# $3 = build_number
# exit on error
set -e
# calculate the root directory from the script path
# this script lives two directories down from the root
# external/lldb-utils/build-linux.sh
ROOT_DIR="$(readlink -f "$(dirname "$0")/../..")"
cd "$ROOT_DIR"
function die() {
echo "$*" > /dev/stderr
echo "Usage: $0 <out_dir> <dest_dir> <build_number>" > /dev/stderr
exit 1
}
(($# > 3)) && die "[$0] Unknown parameter: $4"
OUT="$1"
DEST="$2"
BNUM="$3"
[ ! "$OUT" ] && die "## Error: Missing out folder"
[ ! "$DEST" ] && die "## Error: Missing destination folder"
[ ! "$BNUM" ] && die "## Error: Missing build number"
OUT="$(readlink -f "$OUT")"
DEST="$(readlink -f "$DEST")"
cat <<END_INFO
## Building android-studio ##
## Out Dir : $OUT
## Dest Dir : $DEST
## Build Num: $BNUM
END_INFO
LLVM="$ROOT_DIR/external/llvm"
LLDB="$ROOT_DIR/external/lldb"
ln -fns ../../clang "$LLVM/tools/clang"
ln -fns ../../lldb "$LLVM/tools/lldb"
PRE="$ROOT_DIR/prebuilts"
CMAKE="$PRE/cmake/linux-x86/bin/cmake"
NINJA="$PRE/ninja/linux-x86/ninja"
export PATH="$(dirname "$NINJA"):/usr/bin:/bin"
export SWIG_LIB="$PRE/swig/linux-x86/share/swig/2.0.11"
INSTALL="$OUT/lldb/install"
rm -rf "$INSTALL"
#######################
##### Linux build #####
#######################
CONFIG=Release
BUILD="$OUT/lldb/host"
rm -rf "$BUILD"
mkdir -p "$BUILD"
unset LLDB_FLAGS
unset CMAKE_OPTIONS
CLANG="$PRE/clang/linux-x86/host/3.6/bin/clang"
TOOLCHAIN="$PRE/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8"
LLDB_FLAGS+=(-fuse-ld=gold)
LLDB_FLAGS+=(-target x86_64-unknown-linux)
LLDB_FLAGS+=(-Qunused-arguments)
# Necessary because clang recognizes x86_64-linux-gnu
# as a valid gcc toolchain but not x86_64-linux.
find "$TOOLCHAIN" -name x86_64-linux -exec ln -fns {} {}-gnu \;
LLDB_FLAGS+=(--gcc-toolchain="$TOOLCHAIN")
LLDB_FLAGS+=(--sysroot="$TOOLCHAIN/sysroot")
# Prefix for gcc, ld, etc.
LLDB_FLAGS+=(-B"$TOOLCHAIN/bin/x86_64-linux-")
LLDB_FLAGS+=(-I"$PRE/libedit/linux-x86/include")
LLDB_FLAGS+=(-L"$PRE/libedit/linux-x86/lib")
CMAKE_OPTIONS+=(-GNinja)
CMAKE_OPTIONS+=("$LLVM")
CMAKE_OPTIONS+=(-Wno-dev)
CMAKE_OPTIONS+=(-DCMAKE_BUILD_TYPE=$CONFIG)
CMAKE_OPTIONS+=(-DCMAKE_C_COMPILER="$CLANG")
CMAKE_OPTIONS+=(-DCMAKE_CXX_COMPILER="$CLANG++")
CMAKE_OPTIONS+=(-DCMAKE_AR="$TOOLCHAIN/bin/x86_64-linux-ar")
CMAKE_OPTIONS+=(-DCMAKE_C_FLAGS="${LLDB_FLAGS[*]}")
CMAKE_OPTIONS+=(-DCMAKE_CXX_FLAGS="${LLDB_FLAGS[*]}")
CMAKE_OPTIONS+=(-DLLDB_DISABLE_CURSES=1)
CMAKE_OPTIONS+=(-DSWIG_EXECUTABLE="$PRE/swig/linux-x86/bin/swig")
CMAKE_OPTIONS+=(-DPYTHON_EXECUTABLE="$PRE/python/linux-x86/bin/python")
CMAKE_OPTIONS+=(-DPYTHON_LIBRARY="$PRE/python/linux-x86/lib/libpython2.7.so")
CMAKE_OPTIONS+=(-DPYTHON_INCLUDE_DIR="$PRE/python/linux-x86/include/python2.7")
CMAKE_OPTIONS+=(-DLLVM_TARGETS_TO_BUILD="ARM;X86;AArch64;Mips")
CMAKE_OPTIONS+=(-DCMAKE_INSTALL_PREFIX="$INSTALL/host")
(cd "$BUILD" && "$CMAKE" "${CMAKE_OPTIONS[@]}")
"$NINJA" -C "$BUILD" lldb lldb-server finish_swig lib/readline.so
# install target builds/installs 5G of stuff we don't need
#"$NINJA" -C "$BUILD" install
mkdir -p "$INSTALL/host/bin" "$INSTALL/host/lib" "$INSTALL/host/include/lldb"
cp -a "$BUILD/bin/"lldb* "$INSTALL/host/bin/"
cp -a "$BUILD/lib/"{liblldb.so*,python2.7,readline.so} "$INSTALL/host/lib/"
cp -a "$PRE/libedit/linux-x86/lib/"libedit.so* "$INSTALL/host/lib/"
cp -a "$PRE/python/linux-x86/lib/"libpython2.7.so* "$INSTALL/host/lib/"
cp -a "$TOOLCHAIN/sysroot/usr/lib/"libtinfo.so* "$INSTALL/host/lib/"
cp -a "$LLDB/include/lldb/API" "$INSTALL/host/include/lldb/"
#########################
##### Android build #####
#########################
CONFIG=MinSizeRel
HOST="$OUT/lldb/host"
for ARCH in x86 x86_64 arm aarch64 mips mips64; do
BUILD="$OUT/lldb/$ARCH"
rm -rf "$BUILD"
mkdir -p "$BUILD"
unset LLDB_FLAGS
unset LLDB_LIBS
unset CMAKE_OPTIONS
ABI=$ARCH
TRIPLE_ARCH=$ARCH
SYSROOT_ARCH=$ARCH
STL_ARCH=$ARCH
case $ARCH in
x86)
TOOLCHAIN="$PRE/gcc/linux-x86/x86/x86_64-linux-android-4.9"
LLVM_ARCH=X86 TRIPLE_ARCH=i386 ABI=x86_64
LLDB_FLAGS+=(-m32)
;;
x86_64)
TOOLCHAIN="$PRE/gcc/linux-x86/x86/x86_64-linux-android-4.9"
LLVM_ARCH=X86
;;
arm)
TOOLCHAIN="$PRE/gcc/linux-x86/arm/arm-linux-androideabi-4.9"
LLVM_ARCH=ARM STL_ARCH=armeabi-v7a ABI=armeabi
;;
aarch64)
TOOLCHAIN="$PRE/gcc/linux-x86/aarch64/aarch64-linux-android-4.9"
LLVM_ARCH=AArch64 SYSROOT_ARCH=arm64 STL_ARCH=arm64-v8a
;;
mips)
TOOLCHAIN="$PRE/gcc/linux-x86/mips/mips64el-linux-android-4.9"
LLVM_ARCH=Mips ABI=mips64
LLDB_FLAGS+=(-mips32)
;;
mips64)
TOOLCHAIN="$PRE/gcc/linux-x86/mips/mips64el-linux-android-4.9"
LLVM_ARCH=Mips
;;
esac
SYSROOT="$PRE/ndk/current/platforms/android-21/arch-$SYSROOT_ARCH"
# Necessary because mips64el-gcc searches paths relative to lib64.
[ $ARCH == mips ] && mkdir -p "$SYSROOT/usr/lib64"
STL="$PRE/ndk/current/sources/cxx-stl/gnu-libstdc++/4.9"
LLDB_FLAGS+=(-s) # stripped
LLDB_FLAGS+=(-I"$STL/include")
LLDB_FLAGS+=(-I"$STL/libs/$STL_ARCH/include")
LLDB_FLAGS+=(-L"$STL/libs/$STL_ARCH")
LLDB_LIBS="gnustl_static"
# http://b.android.com/182094
[ $ARCH == mips ] && LLDB_LIBS+=";atomic"
TOOLCHAIN_FILE="$LLDB/cmake/platforms/Android.cmake"
CMAKE_OPTIONS+=(-GNinja)
CMAKE_OPTIONS+=("$LLVM")
CMAKE_OPTIONS+=(-Wno-dev)
CMAKE_OPTIONS+=(-DCMAKE_BUILD_TYPE=$CONFIG)
CMAKE_OPTIONS+=(-DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE")
CMAKE_OPTIONS+=(-DANDROID_TOOLCHAIN_DIR="$TOOLCHAIN")
CMAKE_OPTIONS+=(-DCMAKE_CXX_COMPILER_VERSION=4.9)
CMAKE_OPTIONS+=(-DANDROID_ABI=$ABI)
CMAKE_OPTIONS+=(-DLLVM_TARGET_ARCH=$LLVM_ARCH)
CMAKE_OPTIONS+=(-DLLVM_TARGETS_TO_BUILD=$LLVM_ARCH)
CMAKE_OPTIONS+=(-DLLVM_HOST_TRIPLE=$TRIPLE_ARCH-unknown-linux-android)
CMAKE_OPTIONS+=(-DLLVM_TABLEGEN="$HOST/bin/llvm-tblgen")
CMAKE_OPTIONS+=(-DCLANG_TABLEGEN="$HOST/bin/clang-tblgen")
CMAKE_OPTIONS+=(-DCMAKE_C_FLAGS="${LLDB_FLAGS[*]}")
CMAKE_OPTIONS+=(-DCMAKE_CXX_FLAGS="${LLDB_FLAGS[*]}")
CMAKE_OPTIONS+=(-DANDROID_SYSROOT="$SYSROOT")
CMAKE_OPTIONS+=(-DPYTHON_EXECUTABLE="$PRE/python/linux-x86/bin/python")
CMAKE_OPTIONS+=(-DLLDB_SYSTEM_LIBS="$LLDB_LIBS")
(cd "$BUILD" && "$CMAKE" "${CMAKE_OPTIONS[@]}")
"$NINJA" -C "$BUILD" lldb-server
mkdir -p "$INSTALL/android/$TRIPLE_ARCH"
cp -aL "$BUILD/bin/lldb-server" "$INSTALL/android/$TRIPLE_ARCH/"
done # for ARCH
###############
##### ZIP #####
###############
mkdir -p "$DEST"
(cd "$LLDB" && zip --symlinks -r "$DEST/lldb-tests-${BNUM}.zip" test)
(cd "$INSTALL/host" && zip --symlinks -r "$DEST/lldb-linux-${BNUM}.zip" .)
(cd "$INSTALL/android" && zip --symlinks -r "$DEST/lldb-android-${BNUM}.zip" .)