| #!/bin/bash |
| # |
| # Copyright (c) 2020, 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. |
| # |
| |
| # |
| # This script calls cmake and ninja to compile OpenThread for the given platform. |
| # |
| # Compile with default build options: |
| # |
| # script/cmake-build ${platform} |
| # |
| # Compile with the specified build option enabled: |
| # |
| # script/cmake-build ${platform} -D${option}=ON |
| # |
| # Compile with the specified build option disabled that already enabled by default: |
| # |
| # script/cmake-build ${platform} -D${option}=OFF |
| # |
| # Compile with the specified ninja build target: |
| # |
| # OT_CMAKE_NINJA_TARGET="ot-cli-ftd" script/cmake-build ${platform} |
| # OT_CMAKE_NINJA_TARGET="ot-cli-ftd ot-cli-mtd" script/cmake-build ${platform} |
| # |
| # Compile with the specified build directory: |
| # |
| # OT_CMAKE_BUILD_DIR="./build/temp" script/cmake-build ${platform} |
| # |
| # Examples: |
| # |
| # script/cmake-build simulation |
| # |
| # script/cmake-build simulation -DOT_FULL_LOGS=ON -DOT_CHANNEL_MANAGER=OFF |
| # |
| # OT_CMAKE_NINJA_TARGET="ot-cli-mtd" OT_CMAKE_BUILD_DIR="./build/temp" script/cmake-build simulation -DOT_FULL_LOGS=ON -DOT_CHANNEL_MANAGER=OFF |
| # |
| |
| set -euxo pipefail |
| |
| OT_CMAKE_NINJA_TARGET=${OT_CMAKE_NINJA_TARGET-} |
| |
| OT_SRCDIR="$(cd "$(dirname "$0")"/.. && pwd)" |
| readonly OT_SRCDIR |
| |
| OT_PLATFORMS=(simulation posix android-ndk) |
| readonly OT_PLATFORMS |
| |
| OT_POSIX_SIM_COMMON_OPTIONS=( |
| "-DOT_ANYCAST_LOCATOR=ON" |
| "-DOT_BORDER_AGENT=ON" |
| "-DOT_BORDER_AGENT_ID=ON" |
| "-DOT_BORDER_ROUTER=ON" |
| "-DOT_CHANNEL_MANAGER=ON" |
| "-DOT_CHANNEL_MONITOR=ON" |
| "-DOT_COAP=ON" |
| "-DOT_COAPS=ON" |
| "-DOT_COAP_BLOCK=ON" |
| "-DOT_COAP_OBSERVE=ON" |
| "-DOT_COMMISSIONER=ON" |
| "-DOT_COMPILE_WARNING_AS_ERROR=ON" |
| "-DOT_COVERAGE=ON" |
| "-DOT_DATASET_UPDATER=ON" |
| "-DOT_DHCP6_CLIENT=ON" |
| "-DOT_DHCP6_SERVER=ON" |
| "-DOT_DIAGNOSTIC=ON" |
| "-DOT_DNSSD_SERVER=ON" |
| "-DOT_DNS_CLIENT=ON" |
| "-DOT_ECDSA=ON" |
| "-DOT_HISTORY_TRACKER=ON" |
| "-DOT_IP6_FRAGM=ON" |
| "-DOT_JAM_DETECTION=ON" |
| "-DOT_JOINER=ON" |
| "-DOT_LOG_LEVEL_DYNAMIC=ON" |
| "-DOT_MAC_FILTER=ON" |
| "-DOT_NEIGHBOR_DISCOVERY_AGENT=ON" |
| "-DOT_NETDATA_PUBLISHER=ON" |
| "-DOT_NETDIAG_CLIENT=ON" |
| "-DOT_PING_SENDER=ON" |
| "-DOT_RCP_RESTORATION_MAX_COUNT=2" |
| "-DOT_RCP_TX_WAIT_TIME_SECS=5" |
| "-DOT_REFERENCE_DEVICE=ON" |
| "-DOT_SERVICE=ON" |
| "-DOT_SNTP_CLIENT=ON" |
| "-DOT_SRP_CLIENT=ON" |
| "-DOT_SRP_SERVER=ON" |
| "-DOT_UPTIME=ON" |
| "-DOT_BLE_TCAT=ON" |
| ) |
| readonly OT_POSIX_SIM_COMMON_OPTIONS |
| |
| die() |
| { |
| echo " ** ERROR: Openthread CMake doesn't support platform \"$1\"" |
| exit 1 |
| } |
| |
| build() |
| { |
| local platform=$1 |
| local builddir="${OT_CMAKE_BUILD_DIR:-build/${platform}}" |
| shift |
| |
| mkdir -p "${builddir}" |
| cd "${builddir}" |
| |
| cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DOT_COMPILE_WARNING_AS_ERROR=ON "$@" "${OT_SRCDIR}" |
| if [[ -z ${OT_CMAKE_NINJA_TARGET// /} ]]; then |
| ninja |
| else |
| IFS=' ' read -r -a OT_CMAKE_NINJA_TARGET <<<"${OT_CMAKE_NINJA_TARGET}" |
| ninja "${OT_CMAKE_NINJA_TARGET[@]}" |
| fi |
| |
| cd "${OT_SRCDIR}" |
| } |
| |
| main() |
| { |
| if [[ $# == 0 ]]; then |
| echo "Please specify a platform: ${OT_PLATFORMS[*]}" |
| exit 1 |
| fi |
| |
| local platform="$1" |
| # Check if the platform supports cmake. |
| echo "${OT_PLATFORMS[@]}" | grep -wq "${platform}" || die "${platform}" |
| |
| shift |
| local local_options=() |
| local options=( |
| "-DOT_SLAAC=ON" |
| ) |
| |
| case "${platform}" in |
| android-ndk) |
| if [ -z "${NDK-}" ]; then |
| echo " |
| The 'NDK' environment variable needs to point to the Android NDK toolchain. |
| Please ensure the NDK is downloaded and extracted then try to run this script again |
| |
| For example: |
| NDK=/opt/android-ndk-r25c ./script/cmake-build-android |
| |
| You can download the NDK at https://developer.android.com/ndk/downloads |
| |
| " |
| exit 1 |
| fi |
| |
| NDK_CMAKE_TOOLCHAIN_FILE="${NDK?}/build/cmake/android.toolchain.cmake" |
| if [ ! -f "${NDK_CMAKE_TOOLCHAIN_FILE}" ]; then |
| echo " |
| Could not fild the Android NDK CMake toolchain file |
| - NDK=${NDK} |
| - NDK_CMAKE_TOOLCHAIN_FILE=${NDK_CMAKE_TOOLCHAIN_FILE} |
| |
| " |
| exit 2 |
| fi |
| local_options+=( |
| "-DOT_LOG_OUTPUT=PLATFORM_DEFINED" |
| |
| # Add Android NDK flags |
| "-DOT_ANDROID_NDK=1" |
| "-DCMAKE_TOOLCHAIN_FILE=${NDK?}/build/cmake/android.toolchain.cmake" |
| |
| # Android API needs to be >= android-24 for `getifsaddrs()` |
| "-DANDROID_PLATFORM=android-24" |
| |
| # Store thread settings in the CWD when executing ot-cli or ot-daemon |
| '-DOT_POSIX_SETTINGS_PATH="./thread"' |
| ) |
| |
| # Rewrite platform to posix |
| platform="posix" |
| |
| # Check if OT_DAEMON or OT_APP_CLI flags are needed |
| if [[ ${OT_CMAKE_NINJA_TARGET[*]} =~ "ot-daemon" ]] || [[ ${OT_CMAKE_NINJA_TARGET[*]} =~ "ot-ctl" ]]; then |
| local_options+=("-DOT_DAEMON=ON") |
| elif [[ ${OT_CMAKE_NINJA_TARGET[*]} =~ "ot-cli" ]]; then |
| local_options+=("-DOT_APP_CLI=ON") |
| fi |
| |
| options+=("${local_options[@]}") |
| ;; |
| |
| posix) |
| local_options+=( |
| "-DOT_TCP=OFF" |
| "-DOT_LOG_OUTPUT=PLATFORM_DEFINED" |
| "-DOT_POSIX_MAX_POWER_TABLE=ON" |
| ) |
| options+=("${OT_POSIX_SIM_COMMON_OPTIONS[@]}" "${local_options[@]}") |
| ;; |
| simulation) |
| local_options+=( |
| "-DOT_LINK_RAW=ON" |
| "-DOT_DNS_DSO=ON" |
| "-DOT_DNS_CLIENT_OVER_TCP=ON" |
| "-DOT_UDP_FORWARD=ON" |
| ) |
| options+=("${OT_POSIX_SIM_COMMON_OPTIONS[@]}" "${local_options[@]}") |
| ;; |
| *) |
| options+=("-DCMAKE_TOOLCHAIN_FILE=examples/platforms/${platform}/arm-none-eabi.cmake") |
| ;; |
| esac |
| |
| options+=( |
| "-DOT_PLATFORM=${platform}" |
| ) |
| options+=("$@") |
| build "${platform}" "${options[@]}" |
| } |
| |
| main "$@" |