# in: PROJECT_ROOT
# in: PKGNAME
# in: FEATURES (optional)
# in: BUILD_INFO (optional)
# in: OPENSSL (optional)
# in: OPENSSL_FOUND (optional)
# in: SOURCE_DATE_EPOCH (optional)

ifndef PROJECT_ROOT
$(error PROJECT_ROOT not defined)
endif

ifndef PKGNAME
$(error PKGNAME not defined)
endif

ifndef OPENSSL
ifdef OPENSSL_FOUND
OPENSSL=	$(OPENSSL_FOUND)/bin/openssl
else
OPENSSL=	openssl
endif
endif

BASENAME?=	basename
CUT?=		cut
DATE?=		date
DIFF?=		diff
GIT?=		git
GREP?=		grep
RM?=		rm
SED?=		sed
SORT?=		sort
TR?=		tr
WC?=		wc

GITDIR:=	$(wildcard $(PROJECT_ROOT)/.git)
VERSION_FILE:=	$(wildcard $(PROJECT_ROOT)/VERSION)
HASHES_FILE:=	$(wildcard $(PROJECT_ROOT)/HASHES)
NEWS_FILE:=	$(firstword $(wildcard $(PROJECT_ROOT)/NEWS*))

ifdef GITDIR
BUILD_VERSION:=	$(shell cd $(PROJECT_ROOT) && $(GIT) describe --tags --dirty --always)
BUILD_INFO+=	V:GIT
else
ifdef VERSION_FILE
BUILD_VERSION:=	$(shell $(CAT) $(VERSION_FILE))
BUILD_INFO+=	V:FILE
else
BUILD_VERSION:=	$(shell cd $(PROJECT_ROOT) && $(BASENAME) $(PWD)|\
			$(GREP) $(PKGNAME)-|\
			$(SED) 's/.*$(PKGNAME)-\(.*\)/\1/g')
BUILD_INFO+=	V:DIR
endif
ifdef HASHES_FILE
BUILD_INFO+=	HDIFF:$(shell $(OPENSSL) dgst -sha1 -r *.[hc]|\
		$(SORT) -k 2 >HASHES~;\
		$(DIFF) -u HASHES HASHES~|\
		$(GREP) '^-[^-]'|$(WC) -l|$(TR) -d ' ';\
		$(RM) HASHES~)
endif
ifdef NEWS_FILE
NEWS_SHA:=	$(shell $(OPENSSL) dgst -sha1 -r $(NEWS_FILE) |\
			$(CUT) -c -7)
BUILD_INFO+=	N:$(NEWS_SHA)
endif
endif # GITDIR

ifdef SOURCE_DATE_EPOCH
BUILD_DATE:=	$(shell \
		$(DATE) -u -d "@$(SOURCE_DATE_EPOCH)" "+%Y-%m-%d" 2>/dev/null||\
		$(DATE) -u -r "$(SOURCE_DATE_EPOCH)" "+%Y-%m-%d" 2>/dev/null||\
		$(DATE) -u "+%Y-%m-%d")
else
BUILD_DATE:=	$(shell date +%Y-%m-%d)
endif
BUILD_CPPFLAGS+=-D"BUILD_PKGNAME=\"$(PKGNAME)\"" \
		-D"BUILD_VERSION=\"$(BUILD_VERSION)\"" \
		-D"BUILD_DATE=\"$(BUILD_DATE)\"" \
		-D"BUILD_INFO=\"$(BUILD_INFO)\"" \
		-D"BUILD_FEATURES=\"$(FEATURES)\""

# out: NEWS_FILE
# out: NEWS_SHA
# out: VERSION_FILE
# out: GITDIR
# out: BUILD_VERSION
# out: BUILD_DATE
# out: BUILD_INFO
# out: BUILD_CPPFLAGS
