|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +PHASES=(${@:-SETUP RUN RUN_ASAN CLEANUP}) |
| 4 | +DEBIAN_RELEASE="${DEBIAN_RELEASE:-testing}" |
| 5 | +CONT_NAME="${CONT_NAME:-libbpf-debian-$DEBIAN_RELEASE}" |
| 6 | +ENV_VARS="${ENV_VARS:-}" |
| 7 | +DOCKER_RUN="${DOCKER_RUN:-docker run}" |
| 8 | +REPO_ROOT="${REPO_ROOT:-$PWD}" |
| 9 | +ADDITIONAL_DEPS=(clang pkg-config gcc-8) |
| 10 | +CFLAGS="-g -O2 -Werror -Wall" |
| 11 | + |
| 12 | +function info() { |
| 13 | + echo -e "\033[33;1m$1\033[0m" |
| 14 | +} |
| 15 | + |
| 16 | +function error() { |
| 17 | + echo -e "\033[31;1m$1\033[0m" |
| 18 | +} |
| 19 | + |
| 20 | +function docker_exec() { |
| 21 | + docker exec $ENV_VARS -it $CONT_NAME "$@" |
| 22 | +} |
| 23 | + |
| 24 | +set -e |
| 25 | + |
| 26 | +source "$(dirname $0)/travis_wait.bash" |
| 27 | + |
| 28 | +for phase in "${PHASES[@]}"; do |
| 29 | + case $phase in |
| 30 | + SETUP) |
| 31 | + info "Setup phase" |
| 32 | + info "Using Debian $DEBIAN_RELEASE" |
| 33 | + |
| 34 | + sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce |
| 35 | + docker --version |
| 36 | + |
| 37 | + docker pull debian:$DEBIAN_RELEASE |
| 38 | + info "Starting container $CONT_NAME" |
| 39 | + $DOCKER_RUN -v $REPO_ROOT:/build:rw \ |
| 40 | + -w /build --privileged=true --name $CONT_NAME \ |
| 41 | + -dit --net=host debian:$DEBIAN_RELEASE /bin/bash |
| 42 | + docker_exec bash -c "echo deb-src http://deb.debian.org/debian $DEBIAN_RELEASE main >>/etc/apt/sources.list" |
| 43 | + docker_exec apt-get -y update |
| 44 | + docker_exec apt-get -y build-dep libelf-dev |
| 45 | + docker_exec apt-get -y install libelf-dev |
| 46 | + docker_exec apt-get -y install "${ADDITIONAL_DEPS[@]}" |
| 47 | + ;; |
| 48 | + RUN|RUN_CLANG|RUN_GCC8|RUN_ASAN|RUN_CLANG_ASAN|RUN_GCC8_ASAN) |
| 49 | + if [[ "$phase" = *"CLANG"* ]]; then |
| 50 | + ENV_VARS="-e CC=clang -e CXX=clang++" |
| 51 | + CC="clang" |
| 52 | + elif [[ "$phase" = *"GCC8"* ]]; then |
| 53 | + ENV_VARS="-e CC=gcc-8 -e CXX=g++-8" |
| 54 | + CC="gcc-8" |
| 55 | + else |
| 56 | + CFLAGS="${CFLAGS} -Wno-stringop-truncation" |
| 57 | + fi |
| 58 | + if [[ "$phase" = *"ASAN"* ]]; then |
| 59 | + CFLAGS="${CFLAGS} -fsanitize=address,undefined" |
| 60 | + fi |
| 61 | + docker_exec mkdir build install |
| 62 | + docker_exec ${CC:-cc} --version |
| 63 | + info "build" |
| 64 | + docker_exec make -j$((4*$(nproc))) CFLAGS="${CFLAGS}" -C ./src -B OBJDIR=../build |
| 65 | + info "ldd build/libbpf.so:" |
| 66 | + docker_exec ldd build/libbpf.so |
| 67 | + if ! docker_exec ldd build/libbpf.so | grep -q libelf; then |
| 68 | + error "No reference to libelf.so in libbpf.so!" |
| 69 | + exit 1 |
| 70 | + fi |
| 71 | + info "install" |
| 72 | + docker_exec make -j$((4*$(nproc))) -C src OBJDIR=../build DESTDIR=../install install |
| 73 | + docker_exec rm -rf build install |
| 74 | + ;; |
| 75 | + CLEANUP) |
| 76 | + info "Cleanup phase" |
| 77 | + docker stop $CONT_NAME |
| 78 | + docker rm -f $CONT_NAME |
| 79 | + ;; |
| 80 | + *) |
| 81 | + echo >&2 "Unknown phase '$phase'" |
| 82 | + exit 1 |
| 83 | + esac |
| 84 | +done |
0 commit comments