#
# Copyright 2015 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.
#
# This file supports wrapping of out of tree builds by enabling
# the injection of paths into a shadowed build tree.  See create-shadow-bdk for
# more details on what this file does, and wrap-product.mk for usage.
#
# This file should only be included from other .mk files in tools/bdk/build.

# Require bash use for now.
SHELL := /bin/bash

R :=
ifneq ($(DRY_RUN),)
  R := echo
endif

# Quiet prefix
Q ?= @
# Must not be passed in implicitly from the environment.
ifeq "$(origin Q)" "environment"
Q := @
endif

# Create a symlink farm from the BDK tree.
#
# Creating a symlink farm enables "in-tree" builds from an Android build
# perspective but without modifying the BDK tree at all. This allows for
# side-by-side hermetic builds for different out of tree products.
#
# A full shadow is expensive in both developer time and inodes.  A shallow
# shadow doesn't allow effective injection.  This macro creates a shallow farm
# for all the source code that should not be easily overriden during BDK use.
# For other pieces, the farm depth varies.
#
# The product and device trees are shadowed to the <vendor>/ path.
# The hardware builds paths down to bsp/<...> to allow injection underneath.
# Additionally, hardware/bsp/kernel allows link injection as well.
#
# TODO(wad)(b/25952676): Enable mapping in a product tree so that products can
#            cross-inherit.
# Usage:
#  $(call create-shadow-bdk,$(BDK_PATH),$(PRODUCT_BDK))
define create-shadow-bdk
  $(Q)echo "Building a shadow BDK v$(shell cat $(1)/tools/bdk/VERSION) . . ."
  $(Q)# Build the initial shallow farm (ignoring dot files)
  $(Q)$(R) mkdir -p "$(2)"
  $(Q)$(R) ln -s "$(1)"/* "$(2)"
  $(Q)# Remove any errant 'out's.
  $(Q)$(R) rm -f "$(2)"/out
  $(Q)# TODO(wad)(b/25952641) figure out the best way to get the BSP brand.
  $(Q)# TODO(wad)(b/25952916) Alternatively, should this always mkdir
  $(Q)#   down to the vendor level? find-/ln
  $(Q)for p in \
      hardware \
      $$(find "$(1)/product" "$(1)/device" \
              "$(1)/hardware/bsp" "$(1)/hardware/bsp/kernel" \
              -maxdepth 1 -type d); do \
     p="$${p#$(1)/}"; \
     if test -L "$(2)/$$p"; then \
       $(R) rm  "$(2)/$$p"; \
       $(R) mkdir "$(2)/$$p"; \
       test -d "$(1)/$$p" && $(R) ln -s "$(1)/$$p/"* "$(2)/$$p/"; \
     fi; \
   done
   $(Q)# Always remove the examples so they can be used as demos.
   $(Q)$(R) rm "$(2)/product/google/example-"*
endef

# Usage:
# $(call fake-java,$(PRODUCT_BDK))
define fake-java
  $(Q)# Create a fake java to remove it as a build prereq.
  $(Q)mkdir -p "$(1)/java/bin"
  $(Q)echo 'echo javac not openjdk version "1.8.0"' > "$(1)/java/bin/javac"
  $(Q)echo 'echo java not openjdk version "1.8.0"' > "$(1)/java/bin/java"
  $(Q)chmod a+x "$(1)/java/bin/java" "$(1)/java/bin/javac"
  $(Q)mkdir -p "$(1)/java/lib"
  $(Q)touch "$(1)/java/lib/tools.jar"
endef

# Inject the product into the shadow BDK.
# Usage:
#  $(call inject-product,$(PRODUCT_DIR),$(PRODUCT_BDK),$(PRODUCT_OUT),$(PRODUCT_MANUFACTURER),$(PRODUCT_NAME))
define inject-product
  $(Q)# Shallow link the product dir.
  $(Q)$(R) mkdir -p "$(2)/product/$(4)/$(5)"
  $(Q)$(R) ln -sf "$(1)/"* \
        "$(2)/product/$(4)/$(5)/"
  $(Q)# Remove 'out' if it is under the product dir to avoid cycles.
  $(Q)find "$(2)/product/$(4)/$(5)" -lname "$(3)"'*' \
        -exec bash -c '$(R) rm {}' \;
endef

# TODO(wad)(b/25952646) define inject-bsp

# Calls the android build in the shadow BDK
#
# Note: Kati's find emulation support is disabled to ensure findleaves.py
#       properly traverses symlinks.
#       https://github.com/google/kati/issues/30
# Usage:
#  $(call build-product,$(BDK_PATH),$(PRODUCT_BDK),$(PRODUCT_NAME),$(PRODUCT_DEVICE),$(PRODUCT_OUT),$(BUILDTYPE))
# TODO(wad)(b/25952919) Make tee optional
define build-product
 $(Q)(cd "$(2)" && \
  unset MAKEFLAGS MAKEOVERRIDES MAKECMDGOALS MAKELEVEL && \
  . build/envsetup.sh && \
  add_lunch_combo "$(3)-$(6)" && \
  lunch "$(3)-$(6)" && \
  MAKEFLAGS="$(MAKEFLAGS)" PATH=$(2)/java/bin:$$PATH $(MAKE) $(MAKECMDGOALS) "OUT_DIR=$(5)/out-$(4)" KATI_EMULATE_FIND=false || \
  exit $?) 2>&1 | tee "$(5)/last_build.log"
endef

# Calls the android build in the current directory mapped under the shadow BDK
#
# Usage:
#  $(call build-product-here,$(BDK_PATH),$(PRODUCT_BDK),$(PRODUCT_NAME),$(PRODUCT_DEVICE),$(PRODUCT_OUT),$(BUILDTYPE),$(HERE),$(CMD))
# TODO(wad)(b/25952920) split mm and mma.
define build-product-here
 $(Q)echo "Building in subtree $(7) . . ."
 $(Q)(cd "$(2)" && \
  unset MAKEFLAGS MAKEOVERRIDES MAKECMDGOALS MAKELEVEL && \
  . build/envsetup.sh && \
  add_lunch_combo "$(3)-$(6)" && \
  lunch "$(3)-$(6)" && \
  cd "product/$(PRODUCT_MANUFACTURER)/$(PRODUCT_NAME)/$(subst $(PRODUCT_DIR),,$(7))" && \
  PATH=$(2)/java/bin:$$PATH \
  MAKEFLAGS="$(MAKEFLAGS)" OUT_DIR="$(5)/out-$(4)" \
    KATI_EMULATE_FIND=false $(8) || \
  exit $?) 2>&1 | tee "$(5)/last_build.log"
endef

# Calls gdbclient.py using the shadow BDK build.
#
# Always returns true to avoid make printing a build error.
#
# Usage:
#  $(call run-gdbclient,$(PRODUCT_BDK),$(PRODUCT_NAME),$(BUILDTYPE),$(ADB_PATH),$(GDBCLIENT_ARGS))
define run-gdbclient
 $(Q)(cd "$(1)" && \
  . build/envsetup.sh >/dev/null && \
  add_lunch_combo "$(2)-$(3)" >/dev/null && \
  lunch "$(2)-$(3)" >/dev/null && \
  tools/bdk/debugging/gdbclient.py --adb $(4) $(5) || \
  true)
endef
