# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

SHELL := bash
VERSION := 0.0.2
CC := armv7a-cros-linux-gnueabihf-gcc
CFLAGS := -g -Wall -O2
ifeq ($(PLATFORM), x86-generic)
	CC := gcc
endif
INCLUDES := -Iinclude
DESTDIR := /usr/bin
BINDIR := ./bin
SRCDIR := ./src
DISTDIR := ./dist
CONFDIR := /etc/init
INITDIR := ./deploy/init
EGGDIR := ./chameleond.egg-info
STREAM_SRCS = $(wildcard $(SRCDIR)/stream_server/*.c)
STREAM_OBJS = $(patsubst $(SRCDIR)/stream_server/*.c,$(BINDIR)/%.o,$(STREAM_SRCS))
CONFFILES = chameleond.conf
IDENTITY_FILE := ~/trunk/src/scripts/mod_for_test_scripts/ssh_keys/testing_rsa
COMMIT_FILE := $(DISTDIR)/commit
PY_VERSION_FILE := $(DISTDIR)/py_version

# Set python3 as default after all teams using chameleon finish switching
# to python3.
PY_VERSION := python2

TARGETS = check_git_tree_clean directories chameleond

COMMIT = $(shell git log HEAD^..HEAD --pretty=format:"%h")

.PHONY: all
all: $(TARGETS)

.PHONY: check_git_tree_clean
check_git_tree_clean:
	@if [ -n "$(shell git status --porcelain)" ]; then \
	    echo "Git work tree should be clean."; \
	    echo "Please commit your changes and make chameleon in order to" \
	         "keep a record in the commit history on chameleon hosts."; \
	    exit 1; \
	fi

.PHONY: check_git_commit_HEAD
check_git_commit_HEAD:
	@if [ $(COMMIT) != $(shell cat $(COMMIT_FILE))  ]; then \
	    echo "Your commit HEAD is different from that in the" \
	         "chameleon bundle."; \
	    echo "Please re-make chameleon again."; \
	    exit 1; \
	fi

.PHONY: directories
directories:
	@mkdir -p $(BINDIR)
	@mkdir -p $(DISTDIR)

BINARIES = $(BINDIR)/histogram $(BINDIR)/hpd_control $(BINDIR)/pixeldump \
	  $(BINDIR)/avsync $(BINDIR)/stream_server $(BINDIR)/printer

.PHONY: binaries
binaries: $(BINARIES)

.PHONY: chameleond
chameleond: binaries
	@echo $(COMMIT) > $(COMMIT_FILE)
	@echo $(PY_VERSION) > $(PY_VERSION_FILE)

ifeq ($(PY_VERSION), python3)
	@echo PY_VERSION: $(PY_VERSION)
	@echo python3 setup.py sdist
	@python3 setup.py sdist
else
	@echo PY_VERSION: $(PY_VERSION)
	@echo python2 setup.py sdist
	@python setup.py sdist
endif

$(BINDIR)/%.o: $(SRCDIR)/%.c
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

$(BINDIR)/%: $(BINDIR)/%.o
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $^

$(BINDIR)/stream_server.o: $(SRCDIR)/stream_server/%.c
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

$(BINDIR)/stream_server: $(STREAM_OBJS)
	$(CC) $(CFLAGS) -lpthread $(INCLUDES) -o $@ $^


BUNDLE_VERSION ?= '9999'
CHAMELEON_BOARD ?= 'fpga_tio'
# Get current time from the host.
HOST_NOW := `date "+%Y-%m-%d %H:%M:%S"`

# If this is a Chrome OS platform, PLATFORM would be 'Chrome OS'.
#     The '$' symbol in awk has to be doubled in Makefile.
# else if this is a raspberry pi, PLATFORM would be 'raspberrypi'.
PLATFORM = $(shell awk -F= '/CHROMEOS_RELEASE_NAME/ {print $$2}' \
	     /etc/lsb-release 2>/dev/null || cat /etc/hostname)

.PHONY: install
install:
	@mkdir -p $(DESTDIR)
	@cp -f $(BINARIES) "$(DESTDIR)"
ifeq ($(REMOTE_INSTALL), TRUE)
	@echo sync time with host...
	@NOW="$(HOST_NOW)" PY_VERSION="$(PY_VERSION)" PLATFORM="$(PLATFORM)" \
		sh deploy/deploy_pip
else
	@echo sync time with the chameleon mirror server...
	@NOW="`chameleond/utils/server_time`" PY_VERSION="$(PY_VERSION)" \
		PLATFORM="$(PLATFORM)" sh deploy/deploy_pip
endif

ifeq ($(PY_VERSION), python3)
	@echo python3 setup.py install -f
	@python3 setup.py install -f
else
	@echo python2 setup.py install -f
	@python setup.py install -f
endif

ifeq ($(PLATFORM), Chrome OS)
	@cp -f $(INITDIR)/$(CONFFILES) $(CONFDIR)
	@echo Installing chameleon package on chrome os platform is completed.
	@echo Please do \"\$ start chameleond\" or \"\$ restart chameleond\".
else
	@BUNDLE_VERSION=$(BUNDLE_VERSION) CHAMELEON_BOARD=$(CHAMELEON_BOARD) \
	deploy/deploy $(PLATFORM) $(PY_VERSION)
	@echo Installing chameleon package on $(PLATFORM) platform is completed.
endif

CHAMELEON_USER ?= root
# Allow users to override the SSH port to allow remote installs to devices
# that use a non-standard SSH port. This includes devices forwarded using SSH
# port forwarding, or for devices exposed to the internet using router port
# forwarding.
CHAMELEON_SSH_PORT ?= 22
BUNDLE = chameleond-$(VERSION).tar.gz
BUNDLEDIR = chameleond-$(VERSION)

define get_chameleon_hostname
$(shell ssh -o StrictHostKeyChecking=no \
      -o UserKnownHostsFile=/dev/null \
      -i $(IDENTITY_FILE) -p $(CHAMELEON_SSH_PORT) \
      $(CHAMELEON_USER)@$(CHAMELEON_HOST) \
      "cat /etc/hostname")
endef

.PHONY: check_pi_make
check_pi_make:
	$(eval CHAMELEON_HOSTNAME := $(call get_chameleon_hostname))
	@if [ $(CHAMELEON_HOSTNAME) == raspberrypi ]; then \
	    $(eval PY_VERSION := python3) \
	    if [ $(shell cat $(PY_VERSION_FILE)) != $(PY_VERSION) ]; then \
		echo "Raspberry Pi has switched to python3."; \
		echo "You need to explicitly make with python3 for Raspberry" \
		 "Pi now until all other platforms have switched to python3" \
		 "as well."; \
		echo; \
		echo "Please make with python3 and then install as"; \
		echo "(cr) $$ make PY_VERSION=python3"; \
		echo '(cr) $$ make remote-install' \
		    'CHAMELEON_HOST=$$RASPBERRY_IP'; \
		echo; \
		exit 1; \
	    fi; \
	fi

.PHONY: remote-install
remote-install: check_git_tree_clean check_git_commit_HEAD check_pi_make
	@echo "Set bundle version to $(BUNDLE_VERSION)"
	@echo "Set bundle commit to $(COMMIT)"
	@echo "Set board to $(CHAMELEON_BOARD)"
	@echo "Current host time: $(HOST_NOW)"
	@echo "Python version: $(PY_VERSION)"
ifdef CHAMELEON_HOST
	@scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
	    -i $(IDENTITY_FILE) -P $(CHAMELEON_SSH_PORT) \
	    $(DISTDIR)/$(BUNDLE) $(CHAMELEON_USER)@$(CHAMELEON_HOST):/tmp
	@ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
	    -i $(IDENTITY_FILE) -p $(CHAMELEON_SSH_PORT) \
	    $(CHAMELEON_USER)@$(CHAMELEON_HOST) \
	    "cd /tmp && rm -rf $(BUNDLEDIR) && tar zxf $(BUNDLE) &&" \
	    "cd $(BUNDLEDIR) && find -exec touch -c {} \; &&" \
	    "make install " \
	        "REMOTE_INSTALL=TRUE" \
	        "HOST_NOW=\"$(HOST_NOW)\"" \
	        "BUNDLE_VERSION=$(BUNDLE_VERSION) " \
	        "CHAMELEON_BOARD=$(CHAMELEON_BOARD)"\
	        "PY_VERSION=$(PY_VERSION)"
else
	$(error CHAMELEON_HOST is undefined)
endif

.PHONY: clean
clean:
	@rm -rf $(BINDIR) $(DISTDIR) $(EGGDIR)

PYLINTRC = $(CROS_WORKON_SRCROOT)/chromite/pylintrc
PYLINT_OPTIONS = \
	--rcfile=$(PYLINTRC) \
	--disable=R0921,R0922,R0923,R9100,cros-logging-import

LINT_FILES = $(shell find -name '*.py' -type f | sort)
LINT_BLOCKLIST =
LINT_ALLOWLIST = $(filter-out $(LINT_BLOCKLIST),$(LINT_FILES))

lint:
	@set -e -o pipefail; \
	out=$$(mktemp); \
	echo Linting $(shell echo $(LINT_ALLOWLIST) | wc -w) files...; \
	if [ -n "$(LINT_ALLOWLIST)" ] && \
	    ! env \
	    PYTHONPATH=.:chameleond:../chameleon-private:../video-chameleon \
	    pylint $(PYLINT_OPTIONS) $(LINT_ALLOWLIST) \
	    |& tee $$out; then \
	  echo; \
	  echo To re-lint failed files, run:; \
	  echo make lint LINT_ALLOWLIST=\""$$( \
	    grep '^\*' $$out | cut -c22- | tr . / | \
	    sed 's/$$/.py/' | tr '\n' ' ' | sed -e 's/ $$//')"\"; \
	  echo; \
	  rm -f $$out; \
	  exit 1; \
	fi; \
	echo ...no lint errors! You are awesome!; \
	rm -f $$out

PRESUBMIT_FILES := $(if $(PRESUBMIT_FILES),\
	             $(shell realpath --relative-to=. $$PRESUBMIT_FILES))

lint-presubmit:
	$(MAKE) lint \
	    LINT_FILES="$(filter %.py,$(PRESUBMIT_FILES))" \
	    2>/dev/null

chroot-presubmit:
	if [ ! -e /etc/debian_chroot ]; then \
	    echo "This script must be run inside the chroot. Run this first:"; \
	    echo "    cros_sdk"; \
	    exit 1; \
	fi
