xref: /aosp_15_r20/external/executorch/build/install_flatc.sh (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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