# Copyright 2019 Google LLC
#
# 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
#
#     https://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.
MAKEFILE_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
TEST_DATA_URL := https://github.com/google-coral/edgetpu/raw/master/test_data

.PHONY: wasm download zip server dfu-util

COMPILATION_MODE ?= dbg
ifeq ($(filter $(COMPILATION_MODE),opt dbg),)
$(error COMPILATION_MODE must be opt or dbg)
endif

ifneq (,$(wildcard /.dockerenv))
  BAZEL_OPTIONS += --output_base=/output/base --output_user_root=/output/user_root
endif

wasm:
	bazel $(BAZEL_OPTIONS) build \
  --distdir=$(MAKEFILE_DIR)/.distdir \
  --verbose_failures \
  --sandbox_debug \
  --subcommands \
  --experimental_repo_remote_exec \
  --compilation_mode=$(COMPILATION_MODE) \
  --define darwinn_portable=1 \
  --action_env PYTHON_BIN_PATH=$(shell which python3) \
  --features=use_pthreads \
  --linkopt=-sPTHREAD_POOL_SIZE=8 \
  --linkopt=-sINITIAL_MEMORY=67108864 \
  --linkopt="-sEXTRA_EXPORTED_RUNTIME_METHODS=['cwrap']" \
  --linkopt=-sASYNCIFY \
  --linkopt=-sASYNCIFY_STACK_SIZE=16384 \
  --linkopt="-sASYNCIFY_IMPORTS=['emscripten_receive_on_main_thread_js','emscripten_asm_const_int_sync_on_main_thread']" \
  //tflite:interpreter-wasm && \
  cp -f "$(MAKEFILE_DIR)/bazel-bin/tflite/interpreter-wasm/interpreter.data" \
        "$(MAKEFILE_DIR)/bazel-bin/tflite/interpreter-wasm/interpreter.js" \
        "$(MAKEFILE_DIR)/bazel-bin/tflite/interpreter-wasm/interpreter.wasm" \
        "$(MAKEFILE_DIR)/bazel-bin/tflite/interpreter-wasm/interpreter.worker.js" \
        "$(MAKEFILE_DIR)/site"

%.tflite:
	cd $(dir $@) && wget "$(TEST_DATA_URL)/$(notdir $@)"

download: site/mobilenet_v1_1.0_224_quant.tflite \
          site/mobilenet_v1_1.0_224_quant_edgetpu.tflite \
          site/ssd_mobilenet_v2_coco_quant_postprocess.tflite \
          site/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite \
          site/ssd_mobilenet_v2_face_quant_postprocess.tflite \
          site/ssd_mobilenet_v2_face_quant_postprocess_edgetpu.tflite

dfu-util:
	git clone git://git.code.sf.net/p/dfu-util/dfu-util || true
	cd $(MAKEFILE_DIR)/dfu-util && ./autogen.sh && ./configure && make

reset:
	$(MAKEFILE_DIR)/dfu-util/src/dfu-util -D $(MAKEFILE_DIR)/libedgetpu/driver/usb/apex_latest_single_ep.bin -d 1a6e:089a -R || true

zip:
	zip -r site.zip site

server:
	cd "$(MAKEFILE_DIR)/site" && python3 -m http.server

clean:
	rm -f $(MAKEFILE_DIR)/site/interpreter.* \
        $(MAKEFILE_DIR)/site/*.tflite

################################################################################
# Docker commands
################################################################################
DOCKER_CONTEXT_DIR := $(MAKEFILE_DIR)/docker
DOCKER_WORKSPACE := $(MAKEFILE_DIR)
DOCKER_CONTAINER_WORKSPACE := /workspace
DOCKER_CPUS ?= k8 armv7a armv6 aarch64
DOCKER_TARGETS ?=
DOCKER_IMAGE ?= debian:buster
DOCKER_TAG_BASE ?= webcoral
DOCKER_TAG := "$(DOCKER_TAG_BASE)-$(subst :,-,$(DOCKER_IMAGE))"
DOCKER_SHELL_COMMAND ?=

DOCKER_MAKE_COMMAND := \
for cpu in $(DOCKER_CPUS); do \
    make CPU=\$${cpu} -C $(DOCKER_CONTAINER_WORKSPACE) $(DOCKER_TARGETS) || exit 1; \
done

define docker_run_command
chmod a+w /; \
groupadd --gid $(shell id -g) $(shell id -g -n); \
useradd -m -e '' -s /bin/bash --gid $(shell id -g) --uid $(shell id -u) $(shell id -u -n); \
echo '$(shell id -u -n) ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers; \
su $(shell id -u -n) $(if $(1),-c '$(1)',)
endef

docker-image:
	docker build $(DOCKER_IMAGE_OPTIONS) -t $(DOCKER_TAG) \
      --build-arg IMAGE=$(DOCKER_IMAGE) $(DOCKER_CONTEXT_DIR)

docker-shell: docker-image
	docker run --rm -i --tty --workdir $(DOCKER_CONTAINER_WORKSPACE) \
      --tmpfs /output:rw,exec,nr_inodes=0,size=20G \
      -v $(DOCKER_WORKSPACE):$(DOCKER_CONTAINER_WORKSPACE) \
      $(DOCKER_TAG) /bin/bash -c "$(call docker_run_command,$(DOCKER_SHELL_COMMAND))"

docker-build: docker-image
	docker run --rm -i $(shell tty -s && echo --tty) \
      -v $(DOCKER_WORKSPACE):$(DOCKER_CONTAINER_WORKSPACE) \
      $(DOCKER_TAG) /bin/bash -c "$(call docker_run_command,$(DOCKER_MAKE_COMMAND))"
