#!/bin/bash # # Copyright (c) 2022, The OpenThread Authors. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the copyright holder nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # set -euxo pipefail POSIX_DIR="$(cd "$(dirname "$0")" && pwd)" OT_DIR="${POSIX_DIR}/../../.." ETC_DIR="${POSIX_DIR}/etc" SNIFFER_DIR="${POSIX_DIR}/sniffer_sim" PACKAGES=( "docker.io" "git" "jq" "socat" "tshark" ) sudo apt install -y "${PACKAGES[@]}" pip3 install -r "${POSIX_DIR}/requirements.txt" python3 -m grpc_tools.protoc -I"${SNIFFER_DIR}" --python_out="${SNIFFER_DIR}" --grpc_python_out="${SNIFFER_DIR}" proto/sniffer.proto CONFIG_NAME=${1:-"${POSIX_DIR}/config.yml"} # convert YAML to JSON CONFIG=$(python3 -c 'import json, sys, yaml; print(json.dumps(yaml.safe_load(open(sys.argv[1]))))' "$CONFIG_NAME") MAX_NETWORK_SIZE=$(jq -r '.ot_build.max_number' <<<"$CONFIG") build_ot() { # SC2155: Declare and assign separately to avoid masking return values local target build_dir cflags version options target="ot-cli-ftd" build_dir=$(jq -r '.subpath' <<<"$1") cflags=$(jq -r '.cflags | join(" ")' <<<"$1") version=$(jq -r '.version' <<<"$1") options=$(jq -r '.options | join(" ")' <<<"$1") # Intended splitting of options read -ra options <<<"$options" ( cd "$OT_DIR" OT_CMAKE_NINJA_TARGET="$target" \ OT_CMAKE_BUILD_DIR="$build_dir" \ CFLAGS="$cflags" \ CXXFLAGS="$cflags" \ script/cmake-build \ simulation \ "${options[@]}" \ -DOT_THREAD_VERSION="$version" \ -DOT_SIMULATION_MAX_NETWORK_SIZE="$MAX_NETWORK_SIZE" ) } build_otbr() { # SC2155: Declare and assign separately to avoid masking return values local target build_dir version rcp_options target="ot-rcp" build_dir=$(jq -r '.rcp_subpath' <<<"$1") version=$(jq -r '.version' <<<"$1") rcp_options=$(jq -r '.rcp_options | join(" ")' <<<"$1") # Intended splitting of rcp_options read -ra rcp_options <<<"$rcp_options" ( cd "$OT_DIR" OT_CMAKE_NINJA_TARGET="$target" \ OT_CMAKE_BUILD_DIR="$build_dir" \ script/cmake-build \ simulation \ "${rcp_options[@]}" \ -DOT_THREAD_VERSION="$version" \ -DOT_SIMULATION_MAX_NETWORK_SIZE="$MAX_NETWORK_SIZE" ) # SC2155: Declare and assign separately to avoid masking return values local otbr_docker_image build_args options otbr_docker_image=$(jq -r '.docker_image' <<<"$1") build_args=$(jq -r '.build_args | map("--build-arg " + .) | join(" ")' <<<"$1") # Intended splitting of build_args read -ra build_args <<<"$build_args" options=$(jq -r '.options | join(" ")' <<<"$1") local otbr_options=( "$options" "-DOT_THREAD_VERSION=$version" "-DOT_SIMULATION_MAX_NETWORK_SIZE=$MAX_NETWORK_SIZE" ) docker build . \ -t "${otbr_docker_image}" \ -f "${ETC_DIR}/Dockerfile" \ "${build_args[@]}" \ --build-arg OTBR_OPTIONS="${otbr_options[*]}" } for item in $(jq -c '.ot_build.ot | .[]' <<<"$CONFIG"); do build_ot "$item" done git clone https://github.com/openthread/ot-br-posix.git --recurse-submodules --shallow-submodules --depth=1 ( cd ot-br-posix # Use system V `service` command instead mkdir -p root/etc/init.d cp "${ETC_DIR}/commissionerd" root/etc/init.d/commissionerd sudo chown root:root root/etc/init.d/commissionerd sudo chmod +x root/etc/init.d/commissionerd cp "${ETC_DIR}/server.patch" script/server.patch patch script/server script/server.patch mkdir -p root/tmp cp "${ETC_DIR}/requirements.txt" root/tmp/requirements.txt for item in $(jq -c '.ot_build.otbr | .[]' <<<"$CONFIG"); do build_otbr "$item" done ) rm -rf ot-br-posix