#!/bin/bash # Copyright (c) 2019-2020 by Robert Bosch GmbH. All rights reserved. # Copyright (c) 2020-2021 by Apex.AI Inc. All rights reserved. # # 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 # # http://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. # # SPDX-License-Identifier: Apache-2.0 # This script builds iceoryx_hoofs und iceoryx_posh and executes all tests set -e #==================================================================================================== #==== Step 0 : Setup ================================================================================ #==================================================================================================== # the absolute path of the directory assigned to the build WORKSPACE=$(git rev-parse --show-toplevel) BUILD_DIR=$WORKSPACE/build NUM_JOBS="" PACKAGE="OFF" CLEAN_BUILD=false NO_BUILD=false BUILD_TYPE="" BUILD_DOC="OFF" STRICT_FLAG="OFF" TEST_FLAG="OFF" COV_FLAG="OFF" TEST_SCOPE="all" #possible values for test scope: 'all', 'unit', 'integration' RUN_TEST=false DDS_GATEWAY_FLAG="OFF" BINDING_C_FLAG="ON" ONE_TO_MANY_ONLY_FLAG="OFF" SANITIZE_FLAG="OFF" ROUDI_ENV_FLAG="OFF" TEST_ADD_USER="OFF" OUT_OF_TREE_FLAG="OFF" EXAMPLE_FLAG="OFF" BUILD_ALL_FLAG="OFF" BUILD_SHARED="OFF" TOML_FLAG="ON" COMPONENTS="iceoryx_posh iceoryx_hoofs iceoryx_introspection iceoryx_binding_c iceoryx_component iceoryx_dds" TOOLCHAIN_FILE="" CMAKE_CXX_FLAGS="" while (( "$#" )); do case "$1" in -b|--build-dir) BUILD_DIR=$(realpath "$2") shift 2 ;; -t|--toolchain-file) TOOLCHAIN_FILE="-DCMAKE_TOOLCHAIN_FILE=$2" echo "$TOOLCHAIN_FILE" shift 2 ;; -c|--coverage) BUILD_TYPE="Debug" RUN_TEST=true COV_FLAG="ON" BUILD_SHARED="OFF" if [ -z "$2" ] then shift 1 else TEST_SCOPE="$2" shift 2 fi echo "$TEST_SCOPE" ;; "clean") CLEAN_BUILD=true shift 1 ;; "no-build") NO_BUILD=true shift 1 ;; "release") BUILD_TYPE="Release" shift 1 ;; "relwithdebinfo") BUILD_TYPE="RelWithDebInfo" shift 1 ;; "debug") BUILD_TYPE="Debug" shift 1 ;; "build-strict") STRICT_FLAG="ON" shift 1 ;; "test") RUN_TEST=true TEST_FLAG="ON" shift 1 ;; "test-add-user") TEST_ADD_USER="ON" "$WORKSPACE"/tools/scripts/add_test_users.sh check shift 1 ;; "dds-gateway") echo " [i] Including DDS gateway in build" DDS_GATEWAY_FLAG="ON" shift 1 ;; "binding-c") echo " [i] Including DDS gateway in build" BINDING_C_FLAG="ON" shift 1 ;; "build-test") echo " [i] Building tests" TEST_FLAG="ON" shift 1 ;; "package") PACKAGE="ON" shift 1 ;; "roudi-env") echo " [i] Building RouDi Environment" ROUDI_ENV_FLAG="ON" shift 1 ;; "build-all") echo " [i] Build complete iceoryx with all extensions and all examples" BUILD_ALL_FLAG="ON" shift 1 ;; "build-shared") echo " [i] Build iceoryx as shared lib" BUILD_SHARED="ON" shift 1 ;; "examples") echo " [i] Build iceoryx with all examples" EXAMPLE_FLAG="ON" shift 1 ;; "out-of-tree") echo " [i] Out-of-tree build" OUT_OF_TREE_FLAG="ON" shift 1 ;; "one-to-many-only") echo " [i] Using 1:n communication only" ONE_TO_MANY_ONLY_FLAG="ON" shift 1 ;; "toml-config-off") echo " [i] Build without TOML Support" TOML_FLAG="OFF" shift 1 ;; "sanitize") echo " [i] Build with sanitizers" BUILD_TYPE="Debug" SANITIZE_FLAG="ON" BUILD_SHARED="OFF" shift 1 ;; "clang") echo " [i] Build with clang compiler" export CC=$(which clang) export CXX=$(which clang++) shift 1 ;; "libcxx") echo " [i] Build with libc++ library" CMAKE_CXX_FLAGS="-stdlib=libc++" shift 1 ;; "doc") echo " [i] Build and generate doxygen" BUILD_DOC="ON" shift 1 ;; "help") echo "Build script for iceoryx." echo "By default, iceoryx with C-Binding and TOML-config is built." echo "" echo "Usage:" echo " iceoryx_build_test.sh [--build-dir ] []" echo "Options:" echo " -b --build-dir Specify a non-default build directory" echo " -c --coverage Build with gcov and generate a html/xml report." echo " Possible arguments: 'all', 'unit', 'integration', 'only-timing-tests'" echo " -t --toolchain-file Specify an absolute path to a toolchain file for cross-compiling e.g. (-t $(pwd)/tools/qnx/qnx710.nto.toolchain.aarch64.cmake)" echo "Args:" echo " binding-c Build the iceoryx C-Binding" echo " build-all Build all extensions and all examples" echo " build-shared Build shared libs (iceoryx is built as static lib per default)" echo " build-strict Build is performed with '-Werror'" echo " build-test Build all tests (doesn't run)" echo " clang Build with clang compiler (should be installed already)" echo " no-build Does not trigger a build, can be used in combination with 'clean' to remove the build dir" echo " clean Delete the build/ directory before build-step" echo " dds-gateway Build the iceoryx dds gateway" echo " debug Build debug configuration -g" echo " doc Build and generate doxygen" echo " help Print this help" echo " examples Build all examples" echo " one-to-many-only Restrict to 1:n communication only" echo " out-of-tree Out-of-tree build for CI" echo " package Create a debian package from clean build in build_package" echo " sanitize Build with sanitizers" echo " release Build with -O3" echo " relwithdebinfo Build with -O2 -DNDEBUG" echo " test Build and run all tests in all iceoryx components" echo " test-add-user Create additional useraccounts in system for testing access control (default off)" echo " toml-config-off Build without TOML File support" echo " roudi-env Build the roudi environment" echo "" echo "e.g. iceoryx_build_test.sh -b ./build-scripted clean test" echo "for gcov report: iceoryx_build_test.sh clean -c unit" exit 0 ;; *) echo "Invalid argument '$1'. Try 'help' for options." exit 1 ;; esac done # define directories dependent on the build directory ICEORYX_INSTALL_PREFIX=$BUILD_DIR/install/prefix/ echo " [i] Building in $BUILD_DIR" #==================================================================================================== #==== Step 1 : Build =============================================================================== #==================================================================================================== # set number of cores for building if [[ "$OSTYPE" == "linux-gnu"* ]] || [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]]; then NUM_JOBS=$(nproc) elif [[ "$OSTYPE" == "darwin"* ]]; then NUM_JOBS=$(sysctl -n hw.ncpu) else NUM_JOBS=1 fi echo " [i] Building with $NUM_JOBS jobs" if [ "$PACKAGE" == "ON" ]; then BUILD_DIR=$WORKSPACE/build_package fi # clean build folders if [ "$CLEAN_BUILD" == true ] && [ -d "$BUILD_DIR" ]; then echo " [i] Cleaning build directory" cd "$WORKSPACE" rm -rf "${BUILD_DIR:?}/"* fi if [ "$NO_BUILD" == false ]; then # create a new build directory and change the current working directory echo " [i] Preparing build directory" cd "$WORKSPACE" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" echo " [i] Current working directory: $(pwd)" echo ">>>>>> Start building iceoryx package <<<<<<" cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DBUILD_ALL=$BUILD_ALL_FLAG \ -DBUILD_STRICT=$STRICT_FLAG \ -DCMAKE_INSTALL_PREFIX="$ICEORYX_INSTALL_PREFIX" \ -DBUILD_TEST=$TEST_FLAG \ -DCOVERAGE=$COV_FLAG \ -DROUDI_ENVIRONMENT=$ROUDI_ENV_FLAG \ -DEXAMPLES=$EXAMPLE_FLAG \ -DTOML_CONFIG=$TOML_FLAG \ -DBUILD_DOC=$BUILD_DOC \ -DDDS_GATEWAY=$DDS_GATEWAY_FLAG \ -DBINDING_C=$BINDING_C_FLAG \ -DONE_TO_MANY_ONLY=$ONE_TO_MANY_ONLY_FLAG \ -DBUILD_SHARED_LIBS=$BUILD_SHARED \ -DSANITIZE=$SANITIZE_FLAG \ -DTEST_WITH_ADDITIONAL_USER=$TEST_ADD_USER "$TOOLCHAIN_FILE" \ -DCMAKE_CXX_FLAGS=$CMAKE_CXX_FLAGS \ "$WORKSPACE"/iceoryx_meta cmake --build . --target install -- -j$NUM_JOBS echo ">>>>>> Finished building iceoryx <<<<<<" if [ "$PACKAGE" == "ON" ]; then echo ">>>>>> Start building iceoryx package <<<<<<" cpack echo ">>>>>> Finished building iceoryx package <<<<<<" fi cd "$BUILD_DIR" mkdir -p tools cp "$WORKSPACE"/tools/run_tests.sh "$BUILD_DIR"/tools/run_tests.sh fi #==================================================================================================== #==== Step : Out-of-tree build ===================================================================== #==================================================================================================== if [ "$OUT_OF_TREE_FLAG" == "ON" ]; then rm -rf "$WORKSPACE"/build_out_of_tree cd "$WORKSPACE" EXAMPLES=$(cd iceoryx_examples; find * -maxdepth 1 -type d) # Exclude directories without CMake file from the out-of-tree build EXAMPLES=${EXAMPLES/iceensemble/""} EXAMPLES=${EXAMPLES/icecrystal/""} EXAMPLES=${EXAMPLES/icedocker/""} EXAMPLES=${EXAMPLES/icediscovery\/src/""} EXAMPLES=${EXAMPLES/icediscovery\/include/""} echo ">>>>>> Start Out-of-tree build <<<<<<" echo "${EXAMPLES}" mkdir -p build_out_of_tree && cd build_out_of_tree for ex in ${EXAMPLES} ; do mkdir -p "$ex" && cd "$ex" cmake -DCMAKE_INSTALL_PREFIX="$ICEORYX_INSTALL_PREFIX" \ -DTOML_CONFIG=$TOML_FLAG \ -DBINDING_C=$BINDING_C_FLAG \ "$WORKSPACE"/iceoryx_examples/"$ex" if ! cmake --build . --target install -- -j$NUM_JOBS; then echo "Out of tree build failed" exit 1 fi cd .. done echo ">>>>>> Finished Out-of-tree build<<<<<<" fi if [ "$COV_FLAG" == "ON" ]; then #make an initial scan to cover also files with no coverage "$WORKSPACE"/tools/scripts/lcov_generate.sh "$WORKSPACE" initial "$TEST_SCOPE" fi #==================================================================================================== #==== Step : Run all Tests ========================================================================= #==================================================================================================== # the absolute path of the directory assigned to the build if [ $RUN_TEST == true ]; then echo " [i] Running all tests" "$BUILD_DIR"/tools/run_tests.sh "$TEST_SCOPE" fi for COMPONENT in $COMPONENTS; do case "$1" in "unit") if [ ! -f testresults/"$COMPONENT"_ModuleTestResults.xml ]; then echo "xml:${COMPONENT}_ModuletestTestResults.xml not found!" exit 1 fi ;; "integration" | "all") if [ ! -f testresults/"$COMPONENT"_IntegrationTestResults.xml ]; then echo "xml:${COMPONENT}_IntegrationTestResults.xml not found!" exit 1 fi ;; esac done #==================================================================================================== #==== Step : Coverage =============================================================================== #==================================================================================================== if [ "$COV_FLAG" == "ON" ]; then echo ">>>>>> Generate Gcov Report <<<<<<" cd "$WORKSPACE" #scan all files after test execution "$WORKSPACE"/tools/scripts/lcov_generate.sh "$WORKSPACE" scan "$TEST_SCOPE" echo ">>>>>> Report Generation complete <<<<<<" fi #==================================================================================================== #==== Step : Doxygen PDF Generation ================================================================= #==================================================================================================== if [ "$BUILD_DOC" == "ON" ]; then echo ">>>>>> Doxygen PDF Generation <<<<<<" cd "$BUILD_DIR" for cmp in $COMPONENTS; do make doxygen_"$cmp" cd doc/"$cmp"/latex make cd ../../.. mv -v doc/"$cmp"/latex/refman.pdf doc/"$cmp"_doxygen.pdf done echo ">>>>>> Doxygen PDF Generation complete <<<<<<" fi