# Some simple testing tasks (sorry, UNIX only). to-hash-one = $(dir $1).hash/$(addsuffix .hash,$(notdir $1)) to-hash = $(foreach fname,$1,$(call to-hash-one,$(fname))) CYS := $(wildcard aiohttp/*.pyx) $(wildcard aiohttp/*.pyi) $(wildcard aiohttp/*.pxd) PYXS := $(wildcard aiohttp/*.pyx) CS := $(wildcard aiohttp/*.c) PYS := $(wildcard aiohttp/*.py) IN := doc-spelling lint cython dev ALLS := $(sort $(CYS) $(CS) $(PYS) $(REQS)) .PHONY: all all: test tst: @echo $(call to-hash,requirements/cython.txt) @echo $(call to-hash,aiohttp/%.pyx) # Recipe from https://www.cmcrossroads.com/article/rebuilding-when-files-checksum-changes FORCE: # check_sum.py works perfectly fine but slow when called for every file from $(ALLS) # (perhaps even several times for each file). # That is why much less readable but faster solution exists ifneq (, $(shell which sha256sum)) %.hash: FORCE $(eval $@_ABS := $(abspath $@)) $(eval $@_NAME := $($@_ABS)) $(eval $@_HASHDIR := $(dir $($@_ABS))) $(eval $@_TMP := $($@_HASHDIR)../$(notdir $($@_ABS))) $(eval $@_ORIG := $(subst /.hash/../,/,$(basename $($@_TMP)))) @#echo ==== $($@_ABS) $($@_HASHDIR) $($@_NAME) $($@_TMP) $($@_ORIG) @if ! (sha256sum --check $($@_ABS) 1>/dev/null 2>/dev/null); then \ mkdir -p $($@_HASHDIR); \ echo re-hash $($@_ORIG); \ sha256sum $($@_ORIG) > $($@_ABS); \ fi else %.hash: FORCE @./tools/check_sum.py $@ # --debug endif # Enumerate intermediate files to don't remove them automatically. .SECONDARY: $(call to-hash,$(ALLS)) .update-pip: @python -m pip install --upgrade pip .install-cython: .update-pip $(call to-hash,requirements/cython.txt) @python -m pip install -r requirements/cython.txt -c requirements/constraints.txt @touch .install-cython aiohttp/_find_header.c: $(call to-hash,aiohttp/hdrs.py ./tools/gen.py) ./tools/gen.py # _find_headers generator creates _headers.pyi as well aiohttp/%.c: aiohttp/%.pyx $(call to-hash,$(CYS)) aiohttp/_find_header.c cython -3 -o $@ $< -I aiohttp vendor/llhttp/node_modules: vendor/llhttp/package.json cd vendor/llhttp; npm install .llhttp-gen: vendor/llhttp/node_modules $(MAKE) -C vendor/llhttp generate @touch .llhttp-gen .PHONY: generate-llhttp generate-llhttp: .llhttp-gen .PHONY: cythonize cythonize: .install-cython $(PYXS:.pyx=.c) .install-deps: .install-cython $(PYXS:.pyx=.c) $(call to-hash,$(CYS) $(REQS)) @python -m pip install -r requirements/dev.txt -c requirements/constraints.txt @touch .install-deps .PHONY: lint lint: fmt mypy .PHONY: fmt format fmt format: python -m pre_commit run --all-files --show-diff-on-failure .PHONY: mypy mypy: mypy .develop: .install-deps generate-llhttp $(call to-hash,$(PYS) $(CYS) $(CS)) python -m pip install -e . -c requirements/constraints.txt @touch .develop .PHONY: test test: .develop @pytest -q .PHONY: vtest vtest: .develop @pytest -s -v .PHONY: vvtest vvtest: .develop @pytest -vv define run_tests_in_docker DOCKER_BUILDKIT=1 docker build --build-arg PYTHON_VERSION=$(1) --build-arg AIOHTTP_NO_EXTENSIONS=$(2) -t "aiohttp-test-$(1)-$(2)" -f tools/testing/Dockerfile . docker run --rm -ti -v `pwd`:/src -w /src "aiohttp-test-$(1)-$(2)" $(TEST_SPEC) endef .PHONY: test-3.7-no-extensions test-3.7 test-3.8-no-extensions test-3.8 test-3.9-no-extensions test-3.9 test-3.10-no-extensions test-3.10 test-3.7-no-extensions: $(call run_tests_in_docker,3.7,y) test-3.7: $(call run_tests_in_docker,3.7,n) test-3.8-no-extensions: $(call run_tests_in_docker,3.8,y) test-3.8: $(call run_tests_in_docker,3.8,n) test-3.9-no-extensions: $(call run_tests_in_docker,3.9,y) test-3.9: $(call run_tests_in_docker,3.9,n) test-3.10-no-extensions: $(call run_tests_in_docker,3.10,y) test-3.10: $(call run_tests_in_docker,3.10,n) .PHONY: clean clean: @rm -rf `find . -name __pycache__` @rm -rf `find . -name .hash` @rm -rf `find . -name .md5` # old styling @rm -f `find . -type f -name '*.py[co]' ` @rm -f `find . -type f -name '*~' ` @rm -f `find . -type f -name '.*~' ` @rm -f `find . -type f -name '@*' ` @rm -f `find . -type f -name '#*#' ` @rm -f `find . -type f -name '*.orig' ` @rm -f `find . -type f -name '*.rej' ` @rm -f `find . -type f -name '*.md5' ` # old styling @rm -f .coverage @rm -rf htmlcov @rm -rf build @rm -rf cover @make -C docs clean @python setup.py clean @rm -f aiohttp/*.so @rm -f aiohttp/*.pyd @rm -f aiohttp/*.html @rm -f aiohttp/_frozenlist.c @rm -f aiohttp/_find_header.c @rm -f aiohttp/_http_parser.c @rm -f aiohttp/_http_writer.c @rm -f aiohttp/_websocket.c @rm -rf .tox @rm -f .develop @rm -f .flake @rm -rf aiohttp.egg-info @rm -f .install-deps @rm -f .install-cython @rm -rf vendor/llhttp/node_modules @rm -f .llhttp-gen @$(MAKE) -C vendor/llhttp clean .PHONY: doc doc: @make -C docs html SPHINXOPTS="-W --keep-going -n -E" @echo "open file://`pwd`/docs/_build/html/index.html" .PHONY: doc-spelling doc-spelling: @make -C docs spelling SPHINXOPTS="-W --keep-going -n -E" .PHONY: compile-deps compile-deps: .update-pip $(REQS) pip-compile --no-header --allow-unsafe -q --strip-extras \ -o requirements/constraints.txt \ requirements/constraints.in .PHONY: install install: .update-pip @python -m pip install -r requirements/dev.txt -c requirements/constraints.txt .PHONY: install-dev install-dev: .develop