#!/bin/bash
#
# Copyright 2015 Google 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.
#
# A wrapper for kati which generates build.ninja mainly for Android.
#

set -e

kati_dir=$(cd $(dirname $0) && pwd)
extra_flags=
goma_flag=

while [ x"$1" != x"" ]; do
  case "$1" in
    --help)
      cat - <<EOF
Usage:
  m2n         # for full-build
  m2n --goma  # use goma. \$HOME/goma must exist
  m2n bionic  # works like mmm
EOF
      exit 1
      ;;

    --goma)
      if [ ! -e $HOME/goma/goma_ctl.py ]; then
        echo "$HOME/goma/goma_ctl.py should exist to use goma"
        exit 1
      fi
      $HOME/goma/goma_ctl.py ensure_start
      goma_flag=--goma_dir=$HOME/goma
      shift
      ;;

    --*)
      extra_flags+=" $1"
      shift
      ;;

    *)
      target=$1
      shift
      ;;
  esac
done

kati=${kati_dir}/kati

if [ x"${target}" != x"" ]; then
  export ONE_SHOT_MAKEFILE=${target}/Android.mk
  echo ONE_SHOT_MAKEFILE=${ONE_SHOT_MAKEFILE}
fi

${kati} --ninja --ignore_optional_include=out/%.P ${goma_flag} ${extra_flags}

echo ninja.sh and build.ninja were generated, please run ./ninja.sh
