blob: 2ce993e51b4bebf5c73f9006998b0873106d0a54 [file] [log] [blame]
# 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