#!/bin/bash
#
# Copyright (C) 2008 The Android Open Source Project
#
# 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.

# Stop if something fails.
set -e

# Set default values for directories.
if [ -d smali ]; then
  HAS_SMALI=true
else
  HAS_SMALI=false
fi

if [ -d src ]; then
  HAS_SRC=true
else
  HAS_SRC=false
fi

if [ -d src2 ]; then
  HAS_SRC2=true
else
  HAS_SRC2=false
fi

if [ -d src-multidex ]; then
  HAS_SRC_MULTIDEX=true
else
  HAS_SRC_MULTIDEX=false
fi

if [ -d smali-multidex ]; then
  HAS_SMALI_MULTIDEX=true
else
  HAS_SMALI_MULTIDEX=false
fi

if [ -d src-ex ]; then
  HAS_SRC_EX=true
else
  HAS_SRC_EX=false
fi

DX_FLAGS=""
SKIP_DX_MERGER="false"
EXPERIMENTAL=""

# Setup experimental flag mappings in a bash associative array.
declare -A JACK_EXPERIMENTAL_ARGS
JACK_EXPERIMENTAL_ARGS["default-methods"]="-D jack.java.source.version=1.8"
JACK_EXPERIMENTAL_ARGS["lambdas"]="-D jack.java.source.version=1.8"

while true; do
  if [ "x$1" = "x--dx-option" ]; then
    shift
    option="$1"
    DX_FLAGS="${DX_FLAGS} $option"
    shift
  elif [ "x$1" = "x--jvm" ]; then
    shift
  elif [ "x$1" = "x--no-src" ]; then
    HAS_SRC=false
    shift
  elif [ "x$1" = "x--no-src2" ]; then
    HAS_SRC2=false
    shift
  elif [ "x$1" = "x--no-src-multidex" ]; then
    HAS_SRC_MULTIDEX=false
    shift
  elif [ "x$1" = "x--no-smali-multidex" ]; then
    HAS_SMALI_MULTIDEX=false
    shift
  elif [ "x$1" = "x--no-src-ex" ]; then
    HAS_SRC_EX=false
    shift
  elif [ "x$1" = "x--no-smali" ]; then
    HAS_SMALI=false
    shift
  elif [ "x$1" = "x--experimental" ]; then
    shift
    EXPERIMENTAL="${EXPERIMENTAL} $1"
    shift
  elif expr "x$1" : "x--" >/dev/null 2>&1; then
    echo "unknown $0 option: $1" 1>&2
    exit 1
  else
    break
  fi
done

# Add args from the experimental mappings.
for experiment in ${EXPERIMENTAL}; do
  JACK_ARGS="${JACK_ARGS} ${JACK_EXPERIMENTAL_ARGS[${experiment}]}"
done

if [ -e classes.dex ]; then
  zip $TEST_NAME.jar classes.dex
  exit 0
fi

if ! [ "${HAS_SRC}" = "true" ] && ! [ "${HAS_SRC2}" = "true" ]; then
  # No src directory? Then forget about trying to run dx.
  SKIP_DX_MERGER="true"
fi

if [ ${USE_JACK} = "true" ]; then
  # Jack toolchain
  if [ "${HAS_SRC}" = "true" ]; then
    if [ "${HAS_SRC_MULTIDEX}" = "true" ]; then
      # Compile src and src-multidex in the same .jack file. We will apply multidex partitioning
      # when creating the output .dex file.
      ${JACK} ${JACK_ARGS} --output-jack src.jack src src src-multidex
      jack_extra_args="${jack_extra_args} -D jack.dex.output.policy=minimal-multidex"
      jack_extra_args="${jack_extra_args} -D jack.preprocessor=true"
      jack_extra_args="${jack_extra_args} -D jack.preprocessor.file=multidex.jpp"
    else
      ${JACK} ${JACK_ARGS} --output-jack src.jack src
    fi
    jack_extra_args="${jack_extra_args} --import src.jack"
  fi

  if [ "${HAS_SRC2}" = "true" ]; then
    ${JACK} ${JACK_ARGS} --output-jack src2.jack src2
    # In case of duplicate classes, we want to take into account the classes from src2. Therefore
    # we apply the 'keep-first' policy and import src2.jack file *before* the src.jack file.
    jack_extra_args="${jack_extra_args} -D jack.import.type.policy=keep-first"
    jack_extra_args="--import src2.jack ${jack_extra_args}"
  fi

  # Compile jack files into a DEX file.
  if [ "${HAS_SRC}" = "true" ] || [ "${HAS_SRC2}" = "true" ]; then
    ${JACK} ${JACK_ARGS} ${jack_extra_args} --output-dex .
  fi
else
  # Legacy toolchain with javac+dx
  if [ "${HAS_SRC}" = "true" ]; then
    mkdir classes
    ${JAVAC} ${JAVAC_ARGS} -implicit:none -classpath src-multidex -d classes `find src -name '*.java'`
  fi

  if [ "${HAS_SRC_MULTIDEX}" = "true" ]; then
    mkdir classes2
    ${JAVAC} -implicit:none -classpath src -d classes2 `find src-multidex -name '*.java'`
    if [ ${NEED_DEX} = "true" ]; then
      ${DX} -JXmx256m --debug --dex --dump-to=classes2.lst --output=classes2.dex \
        --dump-width=1000 ${DX_FLAGS} classes2
    fi
  fi

  if [ "${HAS_SRC2}" = "true" ]; then
    mkdir -p classes
    ${JAVAC} ${JAVAC_ARGS} -d classes `find src2 -name '*.java'`
  fi

  if [ "${HAS_SRC}" = "true" ] || [ "${HAS_SRC2}" = "true" ]; then
    if [ ${NEED_DEX} = "true" -a ${SKIP_DX_MERGER} = "false" ]; then
      ${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex \
        --dump-width=1000 ${DX_FLAGS} classes
    fi
  fi
fi

if [ "${HAS_SMALI}" = "true" ]; then
  # Compile Smali classes
  ${SMALI} -JXmx512m ${SMALI_ARGS} --output smali_classes.dex `find smali -name '*.smali'`

  # Don't bother with dexmerger if we provide our own main function in a smali file.
  if [ ${SKIP_DX_MERGER} = "false" ]; then
    ${DXMERGER} classes.dex classes.dex smali_classes.dex
  else
    mv smali_classes.dex classes.dex
  fi
fi

if [ "${HAS_SMALI_MULTIDEX}" = "true" ]; then
  # Compile Smali classes
  ${SMALI} -JXmx512m ${SMALI_ARGS} --output smali_classes2.dex `find smali-multidex -name '*.smali'`

  # Don't bother with dexmerger if we provide our own main function in a smali file.
  if [ ${HAS_SRC_MULTIDEX} = "true" ]; then
    ${DXMERGER} classes2.dex classes2.dex smali_classes2.dex
  else
    mv smali_classes2.dex classes2.dex
  fi
fi


if [ ${HAS_SRC_EX} = "true" ]; then
  if [ ${USE_JACK} = "true" ]; then
      # Rename previous "classes.dex" so it is not overwritten.
      mv classes.dex classes-1.dex
      #TODO find another way to append src.jack to the jack classpath
      ${JACK}:src.jack ${JACK_ARGS} --output-dex . src-ex
      zip $TEST_NAME-ex.jar classes.dex
      # Restore previous "classes.dex" so it can be zipped.
      mv classes-1.dex classes.dex
  else
    mkdir classes-ex
    ${JAVAC} ${JAVAC_ARGS} -d classes-ex -cp classes `find src-ex -name '*.java'`
    if [ ${NEED_DEX} = "true" ]; then
      ${DX} -JXmx256m --debug --dex --dump-to=classes-ex.lst --output=classes-ex.dex \
        --dump-width=1000 ${DX_FLAGS} classes-ex

      # quick shuffle so that the stored name is "classes.dex"
      mv classes.dex classes-1.dex
      mv classes-ex.dex classes.dex
      zip $TEST_NAME-ex.jar classes.dex
      mv classes.dex classes-ex.dex
      mv classes-1.dex classes.dex
    fi
  fi
fi

# Create a single jar with two dex files for multidex.
if [ ${HAS_SRC_MULTIDEX} = "true" ] || [ ${HAS_SMALI_MULTIDEX} = "true" ]; then
  zip $TEST_NAME.jar classes.dex classes2.dex
elif [ ${NEED_DEX} = "true" ]; then
  zip $TEST_NAME.jar classes.dex
fi
