#!/bin/sh set -e # Build dependencies beyond compilers and make: # OpenMandriva: urpmi cmake 'pkgconfig(libedit)' go lib64gmp-devel lib64mpfr-devel lib64mpc-devel gettext-devel autoconf automake libtool flex byacc # Fedora: dnf install cmake libedit-devel golang autoconf automake libtool flex byacc # Some settings... export OPTFLAGS="-O2" # Set to "true" or "false" -- used in the context of "${WITH_TESTS} && doSomething" export WITH_TESTS=true NINJA_VERSION=1.7.2 LLVM_REV=tags/RELEASE_401/final CLANG_VERSION=4.0.1 GO_VERSION=1.8 BINUTILS_VERSION=2.28 GCC_VERSION=linaro-snapshot-6.3-2017.05 GLIBC_VERSION=2.25 BISON_VERSION=3.0.4 FLEX_VERSION=2.5.39 ARCH=`uname -m` [ "$ARCH" = "aarch64" ] && ARCH=arm64 OS="`uname -s |tr A-Z a-z`" MYDIR="$(realpath $(dirname $0))" # Enough settings - let's get to work MFLAGS="-j$(getconf _NPROCESSORS_ONLN)" GCC_V=$(echo ${GCC_VERSION} |sed -e 's,^[a-z-]*,,;s,-.*,,') mkdir -p prebuilts-tmp cd prebuilts-tmp export TOPDIR="$(pwd)" export OUTDIR="${TOPDIR}/out" export PATH=${OUTDIR}/prebuilts/build-tools/${OS}-${ARCH}/bin:${OUTDIR}/prebuilts/clang/host/${OS}-${ARCH}/clang-${CLANG_VERSION}/bin:${OUTDIR}/prebuilts/go/${OS}-${ARCH}/bin:${OUTDIR}/prebuilts/gcc/${OS}-${ARCH}/host/$(uname -m)-${OS}-glibc${GLIBC_VERSION}-${GCC_V}/bin:${PATH} status() { echo -e "\e[44m$@\e[49m" } ############################################################################## ### Build ninja first (so we can use it for building llvm too) ### ############################################################################## status Building ninja [ -d ninja ] || git clone -b v${NINJA_VERSION} git://github.com/ninja-build/ninja.git cd ninja export CFLAGS="${OPTFLAGS}" export LDFLAGS="${OPTFLAGS}" ./configure.py --bootstrap ./ninja if ${WITH_TESTS}; then ./ninja ninja_test ./ninja_test fi cd .. mkdir -p ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ cp ninja/ninja ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ ############################################################################## ### Build llvm, clang and friends ### ############################################################################## status Building LLVM mkdir -p llvm cd llvm if [ -z "USE_AOSP_CLANG" ]; then repo init -u https://android.googlesource.com/platform/manifest -b llvm repo sync cd build/soong patch -p1 <${MYDIR}/build_soong-aarch64-host.patch cd ../.. else if [ -d llvm ]; then cd llvm svn up cd tools/clang svn up cd ../polly svn up cd ../clang/tools/extra svn up cd ../../../../projects/compiler-rt svn up cd ../libunwind svn up cd ../../tools/lldb svn up cd ../lld svn up cd ../../projects/openmp svn up cd ../libcxx svn up cd ../libcxxabi svn up cd ../../.. else svn co http://llvm.org/svn/llvm-project/llvm/$LLVM_REV llvm svn co http://llvm.org/svn/llvm-project/cfe/$LLVM_REV llvm/tools/clang svn co http://llvm.org/svn/llvm-project/polly/$LLVM_REV llvm/tools/polly svn co http://llvm.org/svn/llvm-project/clang-tools-extra/$LLVM_REV llvm/tools/clang/tools/extra svn co http://llvm.org/svn/llvm-project/compiler-rt/$LLVM_REV llvm/projects/compiler-rt svn co http://llvm.org/svn/llvm-project/libunwind/$LLVM_REV llvm/projects/libunwind svn co http://llvm.org/svn/llvm-project/lldb/$LLVM_REV llvm/tools/lldb svn co http://llvm.org/svn/llvm-project/lld/$LLVM_REV llvm/tools/lld svn co http://llvm.org/svn/llvm-project/openmp/$LLVM_REV llvm/projects/openmp svn co http://llvm.org/svn/llvm-project/libcxx/$LLVM_REV llvm/projects/libcxx svn co http://llvm.org/svn/llvm-project/libcxxabi/$LLVM_REV llvm/projects/libcxxabi cd llvm patch -p1 <$MYDIR/llvm-4.0-libc++-libc++abi-dependency.patch cd .. fi fi # Needed for std::bind in some versions of libstdc++ grep -q '' llvm/tools/lldb/include/lldb/Utility/TaskPool.h || sed -i -e '/#include /i#include ' llvm/tools/lldb/include/lldb/Utility/TaskPool.h cd llvm mkdir -p build/clang-${CLANG_VERSION} build/lib/python2.7 cd build cmake -G Ninja ../ \ -DCMAKE_BUILD_TYPE=Release \ -DPYTHON_EXECUTABLE=/usr/bin/python2 \ -DLLVM_ENABLE_CXX1Y:BOOL=ON \ -DLLVM_ENABLE_RTTI:BOOL=ON \ -DLLVM_ENABLE_EH:BOOL=ON \ -DLIBCXX_CXX_ABI=libcxxabi \ -DLIBCXX_ENABLE_CXX1Y:BOOL=ON \ -DLIBCXXABI_LIBCXX_INCLUDES=$(pwd)/../projects/libcxx/include \ -DLIBCXX_CXX_ABI_INCLUDE_PATHS=$(pwd)/../projects/libcxxabi/include \ -DCMAKE_SHARED_LINKER_FLAGS="-L$(pwd)/lib" \ -DLIBCXXABI_USE_LLVM_UNWINDER:BOOL=ON \ -DCMAKE_INSTALL_PREFIX=./clang-${CLANG_VERSION} \ -DLLVM_TARGETS_TO_BUILD="ARM;X86;AArch64;Mips" \ -DLLVM_ENABLE_LIBCXX:BOOL=ON \ -DLLVM_ENABLE_LIBCXXABI:BOOL=ON \ -DCMAKE_C_COMPILER=gcc \ -DCMAKE_CXX_COMPILER=g++ ${TOPDIR}/ninja/ninja install cd ../../.. # Headers for cross-compiling libFuzzer if [ -d development ]; then cd development git pull cd .. else git clone https://android.googlesource.com/platform/development.git fi if [ -d ndk ]; then cd ndk git pull cd .. else git clone https://android.googlesource.com/platform/prebuilts/ndk.git cd ndk patch -p1 <${MYDIR}/ndk-libc++-bionic.patch cd .. fi cd llvm/llvm/lib/Fuzzer # FIXME should also build mips64 variant once we have the right binutils for i in host arm aarch64 i386 x86_64 mips; do case $i in aarch64) NDKARCH=arm64 ;; i386) NDKARCH=x86 ;; *) NDKARCH=$i ;; esac target="" case $i in host) ;; arm) target="-target arm-linux-androideabi -isystem ${TOPDIR}/ndk/r11/platforms/android-24/arch-$NDKARCH/usr/include -isystem ${TOPDIR}/development/ndk/platforms/android-21/include -isystem ${TOPDIR}/development/ndk/platforms/android-21/arch-${NDKARCH}/include -isystem ${TOPDIR}/ndk/r13/sources/cxx-stl/llvm-libc++/include" ;; *) target="-target $i-linux-android -isystem ${TOPDIR}/ndk/r11/platforms/android-24/arch-$NDKARCH/usr/include -isystem ${TOPDIR}/development/ndk/platforms/android-21/include -isystem ${TOPDIR}/development/ndk/platforms/android-21/arch-${NDKARCH}/include -isystem ${TOPDIR}/ndk/r13/sources/cxx-stl/llvm-libc++/include" ;; esac mkdir -p $i cd $i set -x for j in ../*.cpp; do clang $target -std=c++11 -g -O2 -fno-omit-frame-pointer -o $(basename $j |sed -e 's,\.cpp,.o,') -c $j done ar ru libFuzzer.a *.o ranlib libFuzzer.a mkdir -p ${OUTDIR}/prebuilts/clang/host/$OS-$ARCH/clang-${CLANG_VERSION}/lib64/clang/$(echo ${CLANG_VERSION} |cut -d. -f1-2)/lib/$OS/$i cp -f libFuzzer.a ${OUTDIR}/prebuilts/clang/host/$OS-$ARCH/clang-${CLANG_VERSION}/lib64/clang/$(echo ${CLANG_VERSION} |cut -d. -f1-2)/lib/$OS/$i/ set +x cd .. done cd ../../../.. cp -a llvm/llvm/build/clang-${CLANG_VERSION}/* ${OUTDIR}/prebuilts/clang/host/$OS-$ARCH/clang-${CLANG_VERSION} mkdir -p ${OUTDIR}/prebuilts/clang/host/$OS-$ARCH/clang-${CLANG_VERSION}/prebuilt_include/llvm/lib/Fuzzer/ cp -af llvm/llvm/lib/Fuzzer/*.h ${OUTDIR}/prebuilts/clang/host/$OS-$ARCH/clang-${CLANG_VERSION}/prebuilt_include/llvm/lib/Fuzzer/ EVIL_WORKAROUND=true if $EVIL_WORKAROUND; then # FIXME this is WRONG, but somehow soong doesn't pick up libFuzzer in the right place. # Probably there's still a linux-x86 hardcode somewhere. for i in host arm aarch64 i386 x86_64 mips; do mkdir -p ${OUTDIR}/prebuilts/clang/host/linux-x86/clang-${CLANG_VERSION}/lib64/clang/$(echo ${CLANG_VERSION} |cut -d. -f1-2)/lib/$OS/$i/ cp -a ${OUTDIR}/prebuilts/clang/host/$OS-$ARCH/clang-${CLANG_VERSION}/lib64/clang/$(echo ${CLANG_VERSION} |cut -d. -f1-2)/lib/$OS/$i/libFuzzer.a ${OUTDIR}/prebuilts/clang/host/linux-x86/clang-${CLANG_VERSION}/lib64/clang/$(echo ${CLANG_VERSION} |cut -d. -f1-2)/lib/$OS/$i/ done mkdir -p ${OUTDIR}/prebuilts/clang/host/linux-x86/clang-${CLANG_VERSION}/prebuilt_include/llvm/lib/Fuzzer cp -af llvm/llvm/lib/Fuzzer/*.h ${OUTDIR}/prebuilts/clang/host/linux-x86/clang-${CLANG_VERSION}/prebuilt_include/llvm/lib/Fuzzer/ fi ############################################################################## ### Build go ### ############################################################################## status Building go [ -d go ] || git clone https://go.googlesource.com/go -b go${GO_VERSION} cd go unset GOROOT || : unset GOBIN || : export GOROOT_BOOTSTRAP=$(/usr/bin/go env |grep ^GOROOT= |cut -d= -f2 |sed -e 's,",,g') export GOHOSTOS="$(uname |tr A-Z a-z)" export GOHOSTARCH="$(uname -m)" case "${GOHOSTARCH}" in aarch64) export GOHOSTARCH=arm64 ;; x86_64) export GOHOSTARCH=amd64 ;; esac cd src CFLAGS="${OPTFLAGS}" LDFLAGS="${OPTFLAGS}" CC_FOR_TARGET=clang CXX_FOR_TARGET=clang++ GOOS=${GOHOSTOS} GOARCH=${GOHOSTARCH} ./make.bash echo "make.bash finished" unset GOROOT unset GOBIN unset GOROOT_BOOTSTRAP unset GOHOSTOS unset GOHOSTARCH cd ../.. mkdir -p ${OUTDIR}/prebuilts/go/$OS-$ARCH cp -a go/* ${OUTDIR}/prebuilts/go/$OS-$ARCH/ export GOROOT=${OUTDIR}/prebuilts/go/${OS}-${ARCH} ############################################################################## ### Build kati and ckati ### ############################################################################## [ -d kati ] || git clone https://android.googlesource.com/platform/build/kati cd kati status Building ckati make ${MFLAGS} -f Makefile.ckati status Building kati make ${MFLAGS} -f Makefile.kati # FIXME ckati_stamp_dump is supposed to be built through Android.bp once we have soong status building ckati_stamp_dump clang++ -O2 -std=c++14 -o ckati_stamp_dump regen_dump.cc affinity.cc command.cc dep.cc eval.cc exec.cc expr.cc file.cc file_cache.cc fileutil.cc find.cc flags.cc func.cc io.cc log.cc ninja.cc parser.cc regen.cc rule.cc stats.cc stmt.cc string_piece.cc stringprintf.cc strutil.cc symtab.cc thread_pool.cc timeutil.cc var.cc version_unknown.cc -lpthread mkdir -p ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ cp -a ckati ckati_stamp_dump ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ # We also build out/bin/kati, but for now that's not needed in prebuilts cd .. ############################################################################## ### Build makeparallel, ijar, ziptime, acp ### ############################################################################## [ -d build ] || git clone https://android.googlesource.com/platform/build/ status Building makeparallel cd build/tools/makeparallel make ${MFLAGS} cp makeparallel ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ status Building ijar cd ../ijar clang++ -std=c++14 -O2 -o ijar {classfile,ijar,zip}.cc -lz cp ijar ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ status Building ziptime cd ../ziptime clang++ -std=c++14 -O2 -o ziptime *.cpp cp ziptime ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ status Building acp cd ../acp clang -O2 -o acp *.c ${TOPDIR}/build/tools/libhost/*.c -I${TOPDIR}/build/tools/libhost/include cp acp ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ cd ../../.. ############################################################################## ### Build bpfmt ### ############################################################################## status Building bpfmt cd build [ -d blueprint ] || git clone https://android.googlesource.com/platform/build/blueprint [ -d blueprint-bin ] || mkdir blueprint-bin cd blueprint-bin status Building bpfmt bash ../blueprint/bootstrap.bash bash blueprint.bash ninja -f .minibootstrap/build.ninja ninja -f .bootstrap/build.ninja cd ../blueprint GOROOT=${OUTDIR}/prebuilts/go/$OS-$ARCH go get github.com/google/blueprint/parser cd bpfmt go build bpfmt.go cp bpfmt ${OUTDIR}/prebuilts/build-tools/$OS-$ARCH/bin/ cd ../../.. ############################################################################## ### Binutils/gcc based toolchains ### ############################################################################## status Downloading binutils and gcc if ! [ -d binutils-${BINUTILS_VERSION} ]; then wget http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.bz2 tar xf binutils-${BINUTILS_VERSION}.tar.bz2 fi if ! [ -d gcc-${GCC_VERSION} ]; then if echo ${GCC_VERSION} |grep -q linaro; then V=$(echo ${GCC_VERSION} |sed -e 's,^[a-z-]*,,') wget http://snapshots.linaro.org/components/toolchain/gcc-linaro/${V}/gcc-${GCC_VERSION}.tar.xz tar xf gcc-${GCC_VERSION}.tar.xz else wget http://ftp.gnu.org/pub/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.bz2 tar xf gcc-${GCC_VERSION}.tar.bz2 fi fi for target in $(uname -m)-${OS}; do status Building $target binutils mkdir -p binutils-build-${BINUTILS_VERSION}-$target cd binutils-build-${BINUTILS_VERSION}-$target ../binutils-${BINUTILS_VERSION}/configure --target=$target --prefix=/prebuilts/gcc/${OS}-${ARCH}/host/${target}-glibc${GLIBC_VERSION}-${GCC_V} make ${MFLAGS} make ${MFLAGS} install DESTDIR="${OUTDIR}" cd .. status Building $target gcc mkdir -p gcc-build-${GCC_VERSION}-$target cd gcc-build-${GCC_VERSION}-$target ../gcc-${GCC_VERSION}/configure --target=$target --prefix=/prebuilts/gcc/${OS}-${ARCH}/host/${target}-glibc${GLIBC_VERSION}-${GCC_V} --enable-languages=c,c++ make ${MFLAGS} make ${MFLAGS} install DESTDIR="${OUTDIR}" cd .. done ############################################################################## ### Build bison ### ############################################################################## status Building bison if ! [ -d bison-${BISON_VERSION} ]; then wget http://ftp.gnu.org/gnu/bison/bison-${BISON_VERSION}.tar.xz tar xf bison-${BISON_VERSION}.tar.xz fi mkdir -p bison-build-${BISON_VERSION} cd bison-build-${BISON_VERSION} ../bison-${BISON_VERSION}/configure --prefix=/prebuilts/misc/${OS}-${ARCH}/bison make ${MFLAGS} mkdir -p "${OUTDIR}"/prebuilts/misc/${OS}-${ARCH}/bison/ cp -a src/bison "${OUTDIR}"/prebuilts/misc/${OS}-${ARCH}/bison/ cd .. ############################################################################## ### Build flex ### ############################################################################## status Building flex [ -d flex ] || git clone -b flex-${FLEX_VERSION} https://github.com/westes/flex cd flex # We don't ship docs and don't want to deal with the slew of dependencies # needed to build them... # sed -i -e '/doc \\/d' Makefile.am ./autogen.sh # As of 2.5.39, flex doesn't like out-of-source builds ./configure --prefix=/prebuilts/misc/${OS}-${ARCH}/flex make ${MFLAGS} TEXI2DVI=true mkdir -p "${OUTDIR}"/prebuilts/misc/${OS}-${ARCH}/flex/ cp -a flex "${OUTDIR}"/prebuilts/misc/${OS}-${ARCH}/flex/flex-${FLEX_VERSION} cd ..