#!/bin/bash # Copyright 2020 The Marl Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -e # Fail on any error. function show_cmds { set -x; } function hide_cmds { { set +x; } 2>/dev/null; } function status { echo "" echo "*****************************************************************" echo "* $@" echo "*****************************************************************" echo "" } . /bin/using.sh # Declare the bash `using` function for configuring toolchains. status "Fetching submodules" git submodule update --init status "Setting up environment" using gcc-9 # Always update gcc so we get a newer standard library. if [ "$BUILD_SYSTEM" == "cmake" ]; then using cmake-3.17.2 SRC_DIR=$(pwd) BUILD_DIR=/tmp/marl-build INSTALL_DIR=${BUILD_DIR}/install COMMON_CMAKE_FLAGS="" COMMON_CMAKE_FLAGS+=" -DCMAKE_BUILD_TYPE=${BUILD_TYPE}" COMMON_CMAKE_FLAGS+=" -DMARL_BUILD_EXAMPLES=1" COMMON_CMAKE_FLAGS+=" -DMARL_BUILD_TESTS=1" COMMON_CMAKE_FLAGS+=" -DMARL_BUILD_BENCHMARKS=1" COMMON_CMAKE_FLAGS+=" -DMARL_WARNINGS_AS_ERRORS=1" COMMON_CMAKE_FLAGS+=" -DMARL_DEBUG_ENABLED=1" COMMON_CMAKE_FLAGS+=" -DMARL_BUILD_SHARED=${BUILD_SHARED:-0}" COMMON_CMAKE_FLAGS+=" -DBENCHMARK_ENABLE_INSTALL=0" COMMON_CMAKE_FLAGS+=" -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}" if [ "$BUILD_TOOLCHAIN" == "ndk" ]; then using ndk-r21d COMMON_CMAKE_FLAGS+=" -DANDROID_ABI=$BUILD_TARGET_ARCH" COMMON_CMAKE_FLAGS+=" -DANDROID_NATIVE_API_LEVEL=18" COMMON_CMAKE_FLAGS+=" -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake" else # !ndk if [ "$BUILD_TOOLCHAIN" == "clang" ]; then using clang-10.0.0 fi if [ "$BUILD_TARGET_ARCH" == "x86" ]; then COMMON_CMAKE_FLAGS+=" -DCMAKE_CXX_FLAGS=-m32" COMMON_CMAKE_FLAGS+=" -DCMAKE_C_FLAGS=-m32" COMMON_CMAKE_FLAGS+=" -DCMAKE_ASM_FLAGS=-m32" fi fi if [ "$BUILD_SANITIZER" == "asan" ]; then COMMON_CMAKE_FLAGS+=" -DMARL_ASAN=1" elif [ "$BUILD_SANITIZER" == "msan" ]; then COMMON_CMAKE_FLAGS+=" -DMARL_MSAN=1" elif [ "$BUILD_SANITIZER" == "tsan" ]; then COMMON_CMAKE_FLAGS+=" -DMARL_TSAN=1" fi # clean # Ensures BUILD_DIR is empty. function clean { if [ -d ${BUILD_DIR} ]; then rm -fr ${BUILD_DIR} fi mkdir ${BUILD_DIR} } # build # Cleans build directory and performs a build using the provided CMake flags. function build { DESCRIPTION=$1 CMAKE_FLAGS=$2 status "Building ${DESCRIPTION}" clean cd ${BUILD_DIR} show_cmds cmake ${SRC_DIR} ${CMAKE_FLAGS} ${COMMON_CMAKE_FLAGS} make --jobs=$(nproc) hide_cmds } # test # Runs the pre-built unit tests (if not an NDK build). function test { DESCRIPTION=$1 status "Testing ${DESCRIPTION}" cd ${BUILD_DIR} show_cmds if [ "$BUILD_TOOLCHAIN" != "ndk" ]; then ./marl-unittests ./fractal ./hello_task ./primes > /dev/null ./tasks_in_tasks fi hide_cmds } # install # Installs the pre-built library to ${INSTALL_DIR}. function install { DESCRIPTION=$1 status "Installing ${DESCRIPTION}" cd ${BUILD_DIR} show_cmds make install hide_cmds } # build # Cleans build directory and performs a build using the provided CMake # flags, then runs tests. function buildAndTest { DESCRIPTION=$1 CMAKE_FLAGS=$2 build "$DESCRIPTION" "$CMAKE_FLAGS" test "$DESCRIPTION" } # build # Cleans build directory and performs a build using the provided CMake # flags, then installs the library to ${INSTALL_DIR}. function buildAndInstall { DESCRIPTION=$1 CMAKE_FLAGS=$2 build "$DESCRIPTION" "$CMAKE_FLAGS" install "$DESCRIPTION" } if [ -n "$RUN_TESTS" ]; then buildAndTest "marl with ucontext fibers" "-DMARL_FIBERS_USE_UCONTEXT=1" buildAndTest "marl with assembly fibers" "-DMARL_FIBERS_USE_UCONTEXT=0" fi buildAndInstall "marl for install" "-DMARL_INSTALL=1" if [ -n "$BUILD_ARTIFACTS" ]; then status "Copying build artifacts" show_cmds tar -czvf "$BUILD_ARTIFACTS/build.tar.gz" -C "$INSTALL_DIR" . hide_cmds fi elif [ "$BUILD_SYSTEM" == "bazel" ]; then using bazel-3.1.0 show_cmds bazel test //:tests --test_output=all bazel run //examples:fractal bazel run //examples:hello_task bazel run //examples:primes > /dev/null bazel run //examples:tasks_in_tasks hide_cmds else status "Unknown build system: $BUILD_SYSTEM" exit 1 fi status "Done"