1*523fa7a6SAndroid Build Coastguard Worker#!/bin/bash 2*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates. 3*523fa7a6SAndroid Build Coastguard Worker# All rights reserved. 4*523fa7a6SAndroid Build Coastguard Worker# 5*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 6*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 7*523fa7a6SAndroid Build Coastguard Worker 8*523fa7a6SAndroid Build Coastguard Worker# This file builds the `flatc` commandline tool from the 9*523fa7a6SAndroid Build Coastguard Worker# `third-party/flatbuffers` directory and help users install it correctly. 10*523fa7a6SAndroid Build Coastguard Worker 11*523fa7a6SAndroid Build Coastguard Workerset -o errexit 12*523fa7a6SAndroid Build Coastguard Workerset -o nounset 13*523fa7a6SAndroid Build Coastguard Workerset -o pipefail 14*523fa7a6SAndroid Build Coastguard Worker 15*523fa7a6SAndroid Build Coastguard WorkerEXECUTORCH_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" 16*523fa7a6SAndroid Build Coastguard Workerreadonly EXECUTORCH_ROOT 17*523fa7a6SAndroid Build Coastguard Worker 18*523fa7a6SAndroid Build Coastguard Workerreadonly FLATBUFFERS_PATH="${EXECUTORCH_ROOT}/third-party/flatbuffers" 19*523fa7a6SAndroid Build Coastguard Workerreadonly BUILD_DIR="${FLATBUFFERS_PATH}/cmake-out" 20*523fa7a6SAndroid Build Coastguard Workerreadonly BUILT_FLATC="${BUILD_DIR}/flatc" 21*523fa7a6SAndroid Build Coastguard Worker 22*523fa7a6SAndroid Build Coastguard Worker# Must use "echo -e" to expand these escape sequences. 23*523fa7a6SAndroid Build Coastguard Workerreadonly GREEN="\033[0;32m" # GREEN Color 24*523fa7a6SAndroid Build Coastguard Workerreadonly RED="\033[0;31m" # Red Color 25*523fa7a6SAndroid Build Coastguard Workerreadonly NC="\033[0m" # No Color 26*523fa7a6SAndroid Build Coastguard Worker 27*523fa7a6SAndroid Build Coastguard Worker# Prints the flatbuffers version of the git submodule. 28*523fa7a6SAndroid Build Coastguard Workerprint_flatbuffers_version(){ 29*523fa7a6SAndroid Build Coastguard Worker local version_file="${FLATBUFFERS_PATH}/package.json" 30*523fa7a6SAndroid Build Coastguard Worker local version 31*523fa7a6SAndroid Build Coastguard Worker # Extract the version from the first line like `"version": "23.5.26",` 32*523fa7a6SAndroid Build Coastguard Worker # First remove the final double quote, then remove everything 33*523fa7a6SAndroid Build Coastguard Worker # before the now-final double quote. 34*523fa7a6SAndroid Build Coastguard Worker version="$( 35*523fa7a6SAndroid Build Coastguard Worker grep '"version"\s*:' "${version_file}" \ 36*523fa7a6SAndroid Build Coastguard Worker | head -1 \ 37*523fa7a6SAndroid Build Coastguard Worker | sed -e 's/"[^"]*$//' \ 38*523fa7a6SAndroid Build Coastguard Worker | sed -e 's/.*"//' 39*523fa7a6SAndroid Build Coastguard Worker )" 40*523fa7a6SAndroid Build Coastguard Worker if [[ ${version} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 41*523fa7a6SAndroid Build Coastguard Worker echo "${version}" 42*523fa7a6SAndroid Build Coastguard Worker else 43*523fa7a6SAndroid Build Coastguard Worker echo "ERROR: Bad version '${version}'; could not find version in ${version_file}" >&2 44*523fa7a6SAndroid Build Coastguard Worker exit 1 45*523fa7a6SAndroid Build Coastguard Worker fi 46*523fa7a6SAndroid Build Coastguard Worker} 47*523fa7a6SAndroid Build Coastguard Worker 48*523fa7a6SAndroid Build Coastguard Workermain() { 49*523fa7a6SAndroid Build Coastguard Worker local flatbuffers_version 50*523fa7a6SAndroid Build Coastguard Worker flatbuffers_version="$(print_flatbuffers_version)" 51*523fa7a6SAndroid Build Coastguard Worker echo "Version of ${FLATBUFFERS_PATH} is ${flatbuffers_version}" 52*523fa7a6SAndroid Build Coastguard Worker 53*523fa7a6SAndroid Build Coastguard Worker local flatc_path 54*523fa7a6SAndroid Build Coastguard Worker flatc_path="$(which flatc 2>/dev/null || echo '')" 55*523fa7a6SAndroid Build Coastguard Worker if [[ -f "${flatc_path}" ]]; then 56*523fa7a6SAndroid Build Coastguard Worker # A flatc is already on the PATH. 57*523fa7a6SAndroid Build Coastguard Worker if { "${flatc_path}" --version | grep -q "${flatbuffers_version}"; }; then 58*523fa7a6SAndroid Build Coastguard Worker echo -e "${GREEN}A compatible version of flatc is on the PATH" \ 59*523fa7a6SAndroid Build Coastguard Worker "and ready to use.${NC}" 60*523fa7a6SAndroid Build Coastguard Worker return 0 61*523fa7a6SAndroid Build Coastguard Worker else 62*523fa7a6SAndroid Build Coastguard Worker echo -e "${RED}WARNING: An incompatible version of flatc" \ 63*523fa7a6SAndroid Build Coastguard Worker "is on the PATH at ${flatc_path}." 64*523fa7a6SAndroid Build Coastguard Worker echo -e " Required version: flatc version ${flatbuffers_version}" 65*523fa7a6SAndroid Build Coastguard Worker echo -e " Actual version: $("${flatc_path}" --version)${NC}" 66*523fa7a6SAndroid Build Coastguard Worker 67*523fa7a6SAndroid Build Coastguard Worker if [[ "${flatc_path}" == *miniconda* ]]; then 68*523fa7a6SAndroid Build Coastguard Worker echo -e "${RED}ERROR: ${flatc_path} appears to be installed" \ 69*523fa7a6SAndroid Build Coastguard Worker "with conda, which can cause consistency problems." 70*523fa7a6SAndroid Build Coastguard Worker echo -e "Please run the following command to remove it: " 71*523fa7a6SAndroid Build Coastguard Worker echo -e " conda uninstall flatbuffers${NC}" 72*523fa7a6SAndroid Build Coastguard Worker return 1 73*523fa7a6SAndroid Build Coastguard Worker fi 74*523fa7a6SAndroid Build Coastguard Worker 75*523fa7a6SAndroid Build Coastguard Worker # Continue to build a compatible version. 76*523fa7a6SAndroid Build Coastguard Worker fi 77*523fa7a6SAndroid Build Coastguard Worker fi 78*523fa7a6SAndroid Build Coastguard Worker 79*523fa7a6SAndroid Build Coastguard Worker if [[ -f "${BUILT_FLATC}" ]]; then 80*523fa7a6SAndroid Build Coastguard Worker echo -e "${BUILT_FLATC} is already built." 81*523fa7a6SAndroid Build Coastguard Worker else 82*523fa7a6SAndroid Build Coastguard Worker # Build the tool if not already built. 83*523fa7a6SAndroid Build Coastguard Worker echo "Building flatc under ${FLATBUFFERS_PATH}..." 84*523fa7a6SAndroid Build Coastguard Worker # Generate cache. 85*523fa7a6SAndroid Build Coastguard Worker (rm -rf "${BUILD_DIR}" && mkdir "${BUILD_DIR}" && cd "${BUILD_DIR}" && cmake -DCMAKE_BUILD_TYPE=Release ..) 86*523fa7a6SAndroid Build Coastguard Worker # Build. 87*523fa7a6SAndroid Build Coastguard Worker (cd "${FLATBUFFERS_PATH}" && cmake --build "${BUILD_DIR}" --target flatc -j9) 88*523fa7a6SAndroid Build Coastguard Worker 89*523fa7a6SAndroid Build Coastguard Worker echo -e "Finished building ${BUILT_FLATC}." 90*523fa7a6SAndroid Build Coastguard Worker fi 91*523fa7a6SAndroid Build Coastguard Worker 92*523fa7a6SAndroid Build Coastguard Worker echo -e "" 93*523fa7a6SAndroid Build Coastguard Worker echo -e "***** Run the following commands to add a compatible flatc"\ 94*523fa7a6SAndroid Build Coastguard Worker "to the PATH and re-run this script:" 95*523fa7a6SAndroid Build Coastguard Worker echo -e " ${RED}export PATH=\"${BUILD_DIR}:\${PATH}\"" 96*523fa7a6SAndroid Build Coastguard Worker echo -e " bash ${EXECUTORCH_ROOT}/build/install_flatc.sh${NC}" 97*523fa7a6SAndroid Build Coastguard Worker} 98*523fa7a6SAndroid Build Coastguard Worker 99*523fa7a6SAndroid Build Coastguard Workermain "$@" 100