1#!/bin/bash
2
3set -ex
4
5EPHEMERAL="\
6         autoconf \
7         rdfind \
8         unzip \
9         "
10
11apt-get install -y --no-remove $EPHEMERAL
12
13# Fetch the NDK and extract just the toolchain we want.
14ndk=android-ndk-r21d
15wget -O $ndk.zip https://dl.google.com/android/repository/$ndk-linux-x86_64.zip
16unzip -d / $ndk.zip "$ndk/toolchains/llvm/*"
17rm $ndk.zip
18# Since it was packed as a zip file, symlinks/hardlinks got turned into
19# duplicate files.  Turn them into hardlinks to save on container space.
20rdfind -makehardlinks true -makeresultsfile false /android-ndk-r21d/
21# Drop some large tools we won't use in this build.
22find /android-ndk-r21d/ -type f | egrep -i "clang-check|clang-tidy|lldb" | xargs rm -f
23
24sh .gitlab-ci/container/create-android-ndk-pc.sh /$ndk zlib.pc "" "-lz" "1.2.3"
25
26sh .gitlab-ci/container/create-android-cross-file.sh /$ndk x86_64-linux-android x86_64 x86_64
27sh .gitlab-ci/container/create-android-cross-file.sh /$ndk i686-linux-android x86 x86
28sh .gitlab-ci/container/create-android-cross-file.sh /$ndk aarch64-linux-android arm armv8
29sh .gitlab-ci/container/create-android-cross-file.sh /$ndk arm-linux-androideabi arm armv7hl armv7a-linux-androideabi
30
31# Not using build-libdrm.sh because we don't want its cleanup after building
32# each arch.  Fetch and extract now.
33export LIBDRM_VERSION=libdrm-2.4.110
34wget https://dri.freedesktop.org/libdrm/$LIBDRM_VERSION.tar.xz
35tar -xf $LIBDRM_VERSION.tar.xz && rm $LIBDRM_VERSION.tar.xz
36
37for arch in \
38        x86_64-linux-android \
39        i686-linux-android \
40        aarch64-linux-android \
41        arm-linux-androideabi ; do
42
43    cd $LIBDRM_VERSION
44    rm -rf build-$arch
45    meson build-$arch \
46          --cross-file=/cross_file-$arch.txt \
47          --libdir=lib/$arch \
48          -Dlibkms=false \
49          -Dnouveau=false \
50          -Dvc4=false \
51          -Detnaviv=false \
52          -Dfreedreno=false \
53          -Dintel=false \
54          -Dcairo-tests=false \
55          -Dvalgrind=false
56    ninja -C build-$arch install
57    cd ..
58done
59
60rm -rf $LIBDRM_VERSION
61
62export LIBELF_VERSION=libelf-0.8.13
63wget https://fossies.org/linux/misc/old/$LIBELF_VERSION.tar.gz
64
65# Not 100% sure who runs the mirror above so be extra careful
66if ! echo "4136d7b4c04df68b686570afa26988ac ${LIBELF_VERSION}.tar.gz" | md5sum -c -; then
67    echo "Checksum failed"
68    exit 1
69fi
70
71tar -xf ${LIBELF_VERSION}.tar.gz
72cd $LIBELF_VERSION
73
74# Work around a bug in the original configure not enabling __LIBELF64.
75autoreconf
76
77for arch in \
78        x86_64-linux-android \
79        i686-linux-android \
80        aarch64-linux-android \
81        arm-linux-androideabi ; do
82
83    ccarch=${arch}
84    if [ "${arch}" ==  'arm-linux-androideabi' ]
85    then
86       ccarch=armv7a-linux-androideabi
87    fi
88
89    export CC=/android-ndk-r21d/toolchains/llvm/prebuilt/linux-x86_64/bin/${arch}-ar
90    export CC=/android-ndk-r21d/toolchains/llvm/prebuilt/linux-x86_64/bin/${ccarch}29-clang
91    export CXX=/android-ndk-r21d/toolchains/llvm/prebuilt/linux-x86_64/bin/${ccarch}29-clang++
92    export LD=/android-ndk-r21d/toolchains/llvm/prebuilt/linux-x86_64/bin/${arch}-ld
93    export RANLIB=/android-ndk-r21d/toolchains/llvm/prebuilt/linux-x86_64/bin/${arch}-ranlib
94
95    # The configure script doesn't know about android, but doesn't really use the host anyway it
96    # seems
97    ./configure --host=x86_64-linux-gnu  --disable-nls --disable-shared \
98                --libdir=/usr/local/lib/${arch}
99    make install
100    make distclean
101done
102
103cd ..
104rm -rf $LIBELF_VERSION
105
106apt-get purge -y $EPHEMERAL
107