| all: install | 
 |  | 
 | TOPSRC := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) | 
 | SRC := $(TOPSRC)/src | 
 | TARBALLS := $(TOPSRC)/tarballs | 
 | VPATH := $(TARBALLS) | 
 | PREFIX = $(TOPSRC)/local | 
 | PREFIX := $(abspath $(PREFIX)) | 
 |  | 
 | PKGS_ALL := $(patsubst $(SRC)/%/Makefile,%,$(wildcard $(SRC)/*/Makefile)) | 
 |  | 
 | # Common download locations | 
 | NGINX := https://nginx.org/download | 
 | CONTRIB_NGINX := https://packages.nginx.org/contrib | 
 | GITHUB := https://github.com | 
 |  | 
 | # | 
 | # Tools | 
 | # | 
 | NPROC := $(shell getconf _NPROCESSORS_ONLN) | 
 | _SMP_MFLAGS := -j$(NPROC) | 
 |  | 
 | ifndef GIT | 
 | ifeq ($(shell git --version >/dev/null 2>&1 || echo FAIL),) | 
 | GIT = git | 
 | endif | 
 | endif | 
 | GIT ?= $(error git not found) | 
 |  | 
 | ifeq ($(shell curl --version >/dev/null 2>&1 || echo FAIL),) | 
 | download = curl -f -L -- "$(1)" > "$@" | 
 | else ifeq ($(shell wget --version >/dev/null 2>&1 || echo FAIL),) | 
 | download = (rm -f $@.tmp && \ | 
 | 	wget --passive -c -p -O $@.tmp "$(1)" && \ | 
 | 	touch $@.tmp && \ | 
 | 	mv $@.tmp $@ ) | 
 | else ifeq ($(which fetch >/dev/null 2>&1 || echo FAIL),) | 
 | download = (rm -f $@.tmp && \ | 
 | 	fetch -p -o $@.tmp "$(1)" && \ | 
 | 	touch $@.tmp && \ | 
 | 	mv $@.tmp $@) | 
 | else | 
 | download = $(error Neither curl nor wget found) | 
 | endif | 
 |  | 
 | download_pkg = $(call download,$(CONTRIB_NGINX)/$(2)/$(lastword $(subst /, ,$(@)))) || \ | 
 | 	( $(call download,$(1)) && echo "Please upload $(lastword $(subst /, ,$(@))) to $(CONTRIB_NGINX)" ) | 
 |  | 
 | ifeq ($(shell which xz >/dev/null 2>&1 || echo FAIL),) | 
 | XZ = xz | 
 | else | 
 | XZ ?= $(error XZ (LZMA) compressor not found) | 
 | endif | 
 |  | 
 | ifeq ($(shell sha512sum --version >/dev/null 2>&1 || echo FAIL),) | 
 | SHA512SUM = sha512sum --check | 
 | else ifeq ($(shell shasum --version >/dev/null 2>&1 || echo FAIL),) | 
 | SHA512SUM = shasum -a 512 --check | 
 | else ifeq ($(shell openssl version >/dev/null 2>&1 || echo FAIL),) | 
 | SHA512SUM = openssl dgst -sha512 | 
 | else | 
 | SHA512SUM = $(error SHA-512 checksumming not found) | 
 | endif | 
 |  | 
 | CMAKE_MIN_VERSION = 3.1 | 
 | ifndef CMAKE | 
 | _CMAKE_VERSION := $(shell cmake --version 2>/dev/null | head -1 | cut -d ' ' -f 3) | 
 | _CMAKE3_VERSION := $(shell cmake3 --version 2>/dev/null | head -1 | cut -d ' ' -f 3) | 
 | ifeq ($(shell test "$(_CMAKE_VERSION)" = "`echo -e "$(_CMAKE_VERSION)\n$(CMAKE_MIN_VERSION)" | sort -V | tail -1`" || echo FAIL),) | 
 | CMAKE = cmake | 
 | else ifeq ($(shell test "$(_CMAKE3_VERSION)" = "`echo -e "$(_CMAKE3_VERSION)\n$(CMAKE_MIN_VERSION)" | sort -V | tail -1`" || echo FAIL),) | 
 | CMAKE = cmake3 | 
 | endif | 
 | endif | 
 | CMAKE ?= $(error cmake >= $(CMAKE_MIN_VERSION) not found) | 
 |  | 
 | # | 
 | # Common helpers | 
 | # | 
 | download_git = \ | 
 | 	rm -Rf -- "$(@:.tar.xz=)" && \ | 
 | 	$(GIT) init --bare "$(@:.tar.xz=)" && \ | 
 | 	(cd "$(@:.tar.xz=)" && \ | 
 | 	$(GIT) remote add origin "$(1)" && \ | 
 | 	$(GIT) fetch origin "$(2)") && \ | 
 | 	(cd "$(@:.tar.xz=)" && \ | 
 | 	$(GIT) archive --prefix="$(notdir $(@:.tar.xz=))/" \ | 
 | 		--format=tar "$(3)") > "$(@:.xz=)" && \ | 
 | 	echo "$(3) $(@)" > "$(@:.tar.xz=.githash)" && \ | 
 | 	rm -Rf -- "$(@:.tar.xz=)" && \ | 
 | 	$(XZ) --stdout "$(@:.xz=)" > "$@.tmp" && \ | 
 | 	rm -f "$(@:.xz=)" && \ | 
 | 	mv -f -- "$@.tmp" "$@" | 
 | check_githash = \ | 
 | 	h=`sed -e "s,^\([0-9a-fA-F]\{40\}\) .*/$(notdir $<),\1,g" \ | 
 | 		< "$(<:.tar.xz=.githash)"` && \ | 
 | 	test "$$h" = "$1" | 
 |  | 
 | checksum = \ | 
 | 	$(foreach f,$(filter $(TARBALLS)/%,$^), \ | 
 | 		grep -- " $(f:$(TARBALLS)/%=%)$$" \ | 
 | 			"$(SRC)/$(patsubst $(3)%,%,$@)/$(2)SUMS" |) \ | 
 | 		(cd $(TARBALLS) && $(1)) | 
 | CHECK_SHA512 = $(call checksum,$(SHA512SUM),SHA512,.sum-) | 
 | UNPACK = $(RM) -R $@ \ | 
 | 	$(foreach f,$(filter %.tar.gz %.tgz,$^), && tar xvzfo $(f)) \ | 
 | 	$(foreach f,$(filter %.tar.bz2,$^), && tar xvjfo $(f)) \ | 
 | 	$(foreach f,$(filter %.tar.xz,$^), && tar xvJfo $(f)) \ | 
 | 	$(foreach f,$(filter %.zip,$^), && unzip $(f)) | 
 | UNPACK_DIR = $(patsubst %.tar,%,$(basename $(notdir $<))) | 
 | APPLY = (cd $(UNPACK_DIR) && patch -fp1) < | 
 | MOVE = mv $(UNPACK_DIR) $@ && touch $@ | 
 |  | 
 | # Per-package build rules | 
 | include $(SRC)/*/Makefile | 
 |  | 
 | # Targets | 
 | PKGS_DEPS := $(sort $(foreach p,$(PKGS),$(DEPS_$(p)))) | 
 |  | 
 | fetch: $(PKGS:%=.sum-%) | 
 | install: $(PKGS:%=.%) | 
 |  | 
 | clean: | 
 | 	-$(RM) $(foreach p,$(PKGS),.$(p) .sum-$(p) .dep-$(p)) | 
 | 	-$(RM) -R $(foreach p,$(PKGS),$(p)) | 
 | 	-$(RM) -R "$(PREFIX)" | 
 | 	-$(RM) $(TARBALLS)/*.* | 
 |  | 
 | list: | 
 | 	@echo Packages: | 
 | 	@echo '  $(PKGS)' | tr " " "\n" | sort | tr "\n" " " |fmt | 
 | 	@echo Depended-on packages: | 
 | 	@echo '  $(PKGS_DEPS)' | tr " " "\n" | sort | tr "\n" " " |fmt | 
 |  | 
 | .PHONY: all fetch install clean list | 
 |  | 
 | # Default pattern rules | 
 | .sum-%: $(SRC)/%/SHA512SUMS | 
 | 	$(CHECK_SHA512) | 
 | 	touch $@ | 
 |  | 
 | .sum-%: | 
 | 	$(error Download and check target not defined for $*) | 
 |  | 
 | # Real dependency on missing packages | 
 | $(patsubst %,.dep-%,$(PKGS)): .dep-%: .% | 
 | 	touch -r $< $@ | 
 |  | 
 | .SECONDEXPANSION: | 
 |  | 
 | # Dependency propagation (convert 'DEPS_foo = bar' to '.foo: .bar') | 
 | $(foreach p,$(PKGS),.$(p)): .%: $$(foreach d,$$(DEPS_$$*),.dep-$$(d)) | 
 |  | 
 | .DELETE_ON_ERROR: |