#!/bin/sh # Copyright (c) 2017-2021 Petr Vorel # Script for CI builds. set -e CFLAGS="${CFLAGS:--Wformat -Werror=format-security -Werror=implicit-function-declaration -Werror=return-type -fno-common}" CC="${CC:-gcc}" DEFAULT_PREFIX="$HOME/ltp-install" DEFAULT_BUILD="native" DEFAULT_TREE="in" CONFIGURE_OPTS_IN_TREE="--with-open-posix-testsuite --with-realtime-testsuite $CONFIGURE_OPT_EXTRA" # TODO: open posix testsuite is currently broken in out-tree-build. Enable it once it's fixed. CONFIGURE_OPTS_OUT_TREE="--with-realtime-testsuite $CONFIGURE_OPT_EXTRA" SRC_DIR="$(cd $(dirname $0); pwd)" BUILD_DIR="$SRC_DIR/../ltp-build" MAKE_OPTS="-j$(getconf _NPROCESSORS_ONLN)" MAKE_OPTS_OUT_TREE="$MAKE_OPTS -C $BUILD_DIR -f $SRC_DIR/Makefile top_srcdir=$SRC_DIR top_builddir=$BUILD_DIR" run_configure() { local configure="$1" shift export CC CFLAGS LDFLAGS PKG_CONFIG_LIBDIR echo "CC='$CC' CFLAGS='$CFLAGS' LDFLAGS='$LDFLAGS' PKG_CONFIG_LIBDIR='$PKG_CONFIG_LIBDIR'" echo "=== configure $configure $@ ===" if ! $configure $@; then echo "== ERROR: configure failed, config.log ==" cat config.log exit 1 fi echo "== include/config.h ==" cat include/config.h } configure_in_tree() { run_configure ./configure $CONFIGURE_OPTS_IN_TREE --prefix=$prefix $@ } configure_out_tree() { mkdir -p $BUILD_DIR cd $BUILD_DIR run_configure $SRC_DIR/configure $CONFIGURE_OPTS_OUT_TREE $@ } configure_32() { local tree="$1" local prefix="$2" local arch="$(uname -m)" local dir echo "===== 32-bit ${tree}-tree build into $prefix =====" if [ -z "$PKG_CONFIG_LIBDIR" ]; then if [ "$arch" != "x86_64" ]; then echo "ERROR: auto-detection not supported platform $arch, export PKG_CONFIG_LIBDIR!" exit 1 fi for dir in /usr/lib/i386-linux-gnu/pkgconfig \ /usr/lib32/pkgconfig /usr/lib/pkgconfig; do if [ -d "$dir" ]; then PKG_CONFIG_LIBDIR="$dir" break fi done if [ -z "$PKG_CONFIG_LIBDIR" ]; then echo "WARNING: PKG_CONFIG_LIBDIR not found, build might fail" fi fi CFLAGS="-m32 $CFLAGS" LDFLAGS="-m32 $LDFLAGS" eval configure_${tree}_tree } configure_native() { local tree="$1" local prefix="$2" echo "===== native ${tree}-tree build into $prefix =====" eval configure_${tree}_tree } configure_cross() { local tree="$1" local prefix="$2" local host=$(basename "${CC%-gcc}") if [ "$host" = "gcc" ]; then echo "Invalid CC variable for cross compilation: $CC (clang not supported)" >&2 exit 1 fi echo "===== cross-compile ${host} ${1}-tree build into $prefix =====" eval configure_${tree}_tree "--host=$host" } build_in_tree() { make $MAKE_OPTS } build_out_tree() { cd $BUILD_DIR make $MAKE_OPTS_OUT_TREE } test_in_tree() { make $1 } test_out_tree() { cd $BUILD_DIR make $MAKE_OPTS_OUT_TREE $1 } install_in_tree() { make $MAKE_OPTS install } install_out_tree() { cd $BUILD_DIR make $MAKE_OPTS_OUT_TREE DESTDIR="$prefix" SKIP_IDCHECK=1 install } usage() { cat << EOF Usage: $0 [ -c CC ] [ -i ] [ -o TREE ] [ -p DIR ] [-r RUN ] [ -t TYPE ] $0 -h Options: -h Print this help -c CC Define compiler (\$CC variable), needed only for configure step -i Run 'make install', needed only for install step -o TREE Specify build tree, default: $DEFAULT_TREE -p DIR Change installation directory. For in-tree build is this value passed to --prefix option of configure script. For out-of-tree build is this value passed to DESTDIR variable (i.e. sysroot) of make install target, which means that LTP will be actually installed into DIR/PREFIX (i.e. DIR/opt/ltp). Default for in-tree build: '$DEFAULT_PREFIX' Default for out-of-tree build: '$DEFAULT_PREFIX/opt/ltp' -r RUN Run only certain step (usable for CI), default: all -t TYPE Specify build type, default: $DEFAULT_BUILD, only for configure step TREE: in in-tree build out out-of-tree build TYPES: 32 32-bit build (PKG_CONFIG_LIBDIR auto-detection for x86_64) cross cross-compile build (requires set compiler via -c switch) native native build RUN: autotools run only 'make autotools' configure run only 'configure' build run only 'make' test run only 'make test' (not supported for cross-compile build) test-c run only 'make test-c' (not supported for cross-compile build) test-shell run only 'make test-shell' (not supported for cross-compile build) install run only 'make install' Default configure options: in-tree: $CONFIGURE_OPTS_IN_TREE out-of-tree $CONFIGURE_OPTS_OUT_TREE configure options can extend the default with \$CONFIGURE_OPT_EXTRA environment variable EOF } prefix="$DEFAULT_PREFIX" build="$DEFAULT_BUILD" tree="$DEFAULT_TREE" install= run= while getopts "c:hio:p:r:t:" opt; do case "$opt" in c) CC="$OPTARG";; h) usage; exit 0;; i) install=1;; o) case "$OPTARG" in in|out) tree="$OPTARG";; *) echo "Wrong build tree '$OPTARG'" >&2; usage; exit 1;; esac;; p) prefix="$OPTARG";; r) case "$OPTARG" in autotools|configure|build|test|test-c|test-shell|install) run="$OPTARG";; *) echo "Wrong run type '$OPTARG'" >&2; usage; exit 1;; esac;; t) case "$OPTARG" in 32|cross|native) build="$OPTARG";; *) echo "Wrong build type '$OPTARG'" >&2; usage; exit 1;; esac;; ?) usage; exit 1;; esac done cd $SRC_DIR if [ -z "$run" -o "$run" = "autotools" ]; then make autotools fi if [ -z "$run" -o "$run" = "configure" ]; then eval configure_$build $tree $prefix fi if [ -z "$run" -o "$run" = "build" ]; then echo "=== build ===" eval build_${tree}_tree fi if [ -z "$run" -o "$run" = "test" -o "$run" = "test-c" -o "$run" = "test-shell" ]; then if [ "$build" = "cross" ]; then echo "cross-compile build, skipping running tests" >&2 else eval test_${tree}_tree $run fi fi if [ -z "$run" -o "$run" = "install" ]; then if [ "$install" = 1 ]; then eval install_${tree}_tree else echo "make install skipped, use -i to run it" fi fi exit $?