| 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: |