blob: 7c6c9bb3cb5b045ee27189b64f2d62a9136d2902 [file] [log] [blame]
# Copyright (c) 2012 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
BUILD_DIR=build
PAR_BUILD_DIR=$(BUILD_DIR)/par
DESTDIR=$(BUILD_DIR)/image
TARGET_DIR=/usr/local/factory
PYTHON_SITEDIR=$(shell echo \
'from distutils.sysconfig import get_python_lib; ' \
'print(get_python_lib())' | python)
PYTHON=python
# Directory in which to install symlinks to certain factory binaries.
SYMLINK_INSTALL_DIR=/usr/local/bin
# Relative path from $(SYMLINK_INSTALL_DIR) to $(TARGET_DIR)
SYMLINK_TARGET_RELPATH=../factory
# Binaries that should have symlinks.
SYMLINK_BINS=\
edid factory_bug factory_restart \
gooftool goofy goofy_control goofy_remote goofy_rpc \
hwid_tool make_par merge_logs mount_partition run_pytest
TEST_RUNNER=py/tools/run_tests.py
# Maximum number of parallel tests to run.
MAX_TESTS=32
FACTORY=$(DESTDIR)/$(TARGET_DIR)
FACTORY_BUNDLE=$(FACTORY)/bundle
PYLINTRC=../../../chromite/pylintrc
# TODO(shik): Re-enable R0801 once flash_firmware.py and
# setup_netboot.py are fixed.
PYLINT_OPTIONS=\
--rcfile=$(PYLINTRC) \
--ignored-classes=Event,Obj \
--disable=R0921,R0801,R0922 \
--generated-members=test_info,AndReturn,AndRaise,args
LINT_BLACKLIST=\
py/argparse.py \
py/gooftool/vblock.py \
py/goofy/invocation.py \
py/goofy/prespawner.py \
py/goofy/test_environment.py \
py/goofy/updater.py \
py/goofy/web_socket_manager.py \
py/shopfloor/shopfloor_standalone_unittest.py \
py/shopfloor/template.py \
py/system/charge_manager_unittest.py \
py/test/event.py \
py/test/gooftools.py \
py/test/leds.py \
py/test/line_item_check.py \
py/test/media_util.py \
py/test/media_util_unittest.py \
py/test/pytests/execpython.py \
py/test/state_machine.py \
py/test/state.py \
py/test/state_unittest.py \
py/test/task.py \
py/test/ui.py \
py/test/unicode_to_string.py \
py/test/unicode_to_string_unittest.py \
py/test/utils.py \
py/test/utils_unittest.py
LINT_FILES=$(shell find py -name '*.py' -type f | sort)
LINT_WHITELIST=$(filter-out $(LINT_BLACKLIST),$(LINT_FILES))
UNITTESTS=$(shell find py -name '*_unittest.py' | sort)
# TODO(sheckylin): Get py/test/media_util_unittest.py working.
UNITTESTS_BLACKLIST=\
py/test/media_util_unittest.py
UNITTESTS_WHITELIST=$(filter-out $(UNITTESTS_BLACKLIST),$(UNITTESTS))
# Tests need to run in isolate mode.
UNITTESTS_ISOLATE_LIST=
# TODO(jsalz): remove the hard-coded path once the icedtea6-bin
# package is fixed and /usr/bin/java works
# (https://bugs.gentoo.org/416341)
default:
env PATH=/opt/icedtea6-bin-1.6.2/bin:$(PATH) \
$(MAKE) -C py/goofy/static \
$(if $(CLOSURE_LIB_ARCHIVE), \
CLOSURE_LIB_ARCHIVE="$(CLOSURE_LIB_ARCHIVE)",)
par:
# Build par (Python archive) file containing all py and pyc files.
rm -rf $(PAR_BUILD_DIR)
mkdir -p $(PAR_BUILD_DIR)/cros
rsync -a \
--exclude '*_unittest.py' \
--exclude 'factory_common.py*' \
--include '*.py' \
--include '*.csv' \
--include '*/' --exclude '*' \
py/ $(PAR_BUILD_DIR)/cros/factory/
# Copy necessary third-party packages.
rsync -a \
$(PYTHON_SITEDIR)/argparse.py \
third_party/jsonrpclib/jsonrpclib \
$(PYTHON_SITEDIR)/yaml \
$(PAR_BUILD_DIR)
# Add empty __init__.py files so Python realizes these directories are
# modules.
touch $(PAR_BUILD_DIR)/cros/__init__.py
touch $(PAR_BUILD_DIR)/cros/factory/__init__.py
# Add an empty factory_common file (since many scripts import factory_common).
touch $(PAR_BUILD_DIR)/factory_common.py
cd $(PAR_BUILD_DIR) && zip -qr factory.par *
# Sanity check: make sure we can import event_log using only the par file.
PYTHONPATH=$(PAR_BUILD_DIR)/factory.par $(PYTHON) -c \
'import cros.factory.test.state'
$(if $(PAR_DEST_DIR),cp $(PAR_BUILD_DIR)/factory.par $(PAR_DEST_DIR))
install: par
mkdir -p $(FACTORY)
rsync -a --exclude '*.pyc' bin misc py py_pkg sh test_lists $(FACTORY)
ln -sf bin/gooftool bin/edid bin/hwid_tool ${FACTORY}
mkdir -m755 -p ${DESTDIR}/var/log
mkdir -m755 -p $(addprefix ${DESTDIR}/var/factory/,log state tests)
ln -sf $(addprefix ../factory/log/,factory.log console.log) ${DESTDIR}/var/log
# Make factory bundle overlay
mkdir -p $(FACTORY_BUNDLE)/factory_setup/
rsync -a --exclude testdata --exclude README.txt \
setup/ $(FACTORY_BUNDLE)/factory_setup/
mkdir -p $(FACTORY_BUNDLE)/shopfloor
cp -a $(PAR_BUILD_DIR)/factory.par $(FACTORY_BUNDLE)/shopfloor
cp sh/shopfloor_server.sh $(FACTORY_BUNDLE)/shopfloor
# Install cgpt, used by factory_setup. TODO(jsalz/hungte): Find a better way
# to do this.
mkdir -p $(FACTORY_BUNDLE)/factory_setup/bin
cp /usr/bin/cgpt $(FACTORY_BUNDLE)/factory_setup/bin
# Add symlinks to certain binaries from /usr/local/bin to
# /usr/local/factory/bin.
mkdir -p "$(DESTDIR)$(SYMLINK_INSTALL_DIR)"
cd "$(DESTDIR)$(SYMLINK_INSTALL_DIR)" && \
ln -sf $(addprefix $(SYMLINK_TARGET_RELPATH)/bin/,$(SYMLINK_BINS)) .
# Make sure all the symlinked binaries actually exist.
stat -L "$(DESTDIR)$(SYMLINK_INSTALL_DIR)"/* > /dev/null
lint:
@set -e -o pipefail; \
out=$$(mktemp); \
echo Linting $(shell echo $(LINT_WHITELIST) | wc -w) files...; \
if [ -n "$(LINT_WHITELIST)" ] && \
! env PYTHONPATH=py_pkg pylint $(PYLINT_OPTIONS) $(LINT_WHITELIST) \
|& tee $$out; then \
echo; \
echo To re-lint failed files, run:; \
echo make lint LINT_WHITELIST=\""$$( \
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
test-presubmit:
if [ ! -e .tests-passed ]; then \
echo 'Unit tests have not passed. Please run "make test".'; \
exit 1; \
fi
changed=$$(find $(PRESUBMIT_FILES) -newer .tests-passed); \
if [ -n "$$changed" ]; then \
echo "Files have changed since last time unit tests passed:"; \
echo "$$changed" | sed -e 's/^/ /'; \
echo 'Please run "make test".'; \
exit 1; \
fi
clean:
rm -rf $(BUILD_DIR)
test:
@logdir=/tmp/test.logs.$$(date +%Y%m%d_%H%M%S); \
mkdir $$logdir; \
echo "Test logs will be written to $$logdir"; \
echo; \
$(TEST_RUNNER) $(UNITTESTS_WHITELIST) -i $(UNITTESTS_ISOLATE_LIST) \
-j $(MAX_TESTS) -l $$logdir $(EXTRA_TEST_FLAGS)
testall:
@make --no-print-directory test EXTRA_TEST_FLAGS=--nofilter