#!/usr/bin/make -f

include /usr/share/cdbs/1/rules/debhelper.mk

APT_CACHE = $(CURDIR)/debian/apt-cache
APT_FILE_CACHE = $(CURDIR)/debian/apt-file-cache
TMPEXTRACT = $(CURDIR)/debian/tmpextract
TMPCONTROL = $(CURDIR)/debian/tmpcontrol

APTITUDE_LOCKFILE = $(CURDIR)/debian/aptitude-lockfile
APTITUDE_STATE = $(CURDIR)/debian/aptitude-state
APTITUDE = aptitude -o 'Aptitude::LockFile=$(APTITUDE_LOCKFILE)' -o 'Dir::Cache=$(APT_CACHE)' -o 'Dir::Aptitude::state=$(APTITUDE_STATE)' -o "Debug::NoLocking=yes"

ATHENA_SHLIBS = $(shell ATHENA_SYS=$$(machtype -S) ATHENA_SYS_COMPAT=$$(machtype -C) athdir . shlibs)

LIBDIRS := $(patsubst %/,%,$(strip \
	    $(shell strings /lib*/ld-linux*.so.2 | grep '^/.*lib') \
	    $(shell grep -h '^/' /etc/ld.so.conf /etc/ld.so.conf.d/*.conf) \
	))

$(APT_FILE_CACHE):
	mkdir -p $@
	apt-file -c $@ update

empty =

$(APT_CACHE): $(ATHENA_SHLIBS) $(APT_FILE_CACHE) $(APTITUDE_STATE)
	mkdir -p $@ $@/archives $@/archives/partial
	apt-file --verbose -y -c $(APT_FILE_CACHE) -F -l -x search "^(?:$(subst $(empty) /,|, $(LIBDIRS)))/(?:$$( \
	    perl -0pe 's/ .*//mg; s/(\W)/\\$$1/g; s/\\\n$$//; s/\\\n/|/g' < $< \
	))" | \
	    sort -u | \
	    perl -pe 'chomp; s/(\W)/\\$$1/g; s/^(.*)$$/~n^$$1\$$!~Rconflicts:(~Dreplaces:(~n^$$1\$$~VCANDIDATE)~Dconflicts:(~n^$$1\$$~VCANDIDATE))/; s/$$/\0/' | \
	    xargs -0 -r -t $(APTITUDE) -F '%p' search | \
	    (cd $@/archives; xargs -r -t $(APTITUDE) download)

$(APTITUDE_STATE):
	mkdir -p $@

debian/libs: $(ATHENA_SHLIBS) $(APT_CACHE)
	: >| $@
	for pkg in $(APT_CACHE)/archives/*.deb; do \
	    echo "$$(basename $$pkg)" >&2; \
	    rm -rf $(TMPCONTROL) $(TMPEXTRACT); \
	    mkdir -p $(TMPCONTROL) $(TMPEXTRACT); \
	    dpkg-deb -e "$$pkg" $(TMPCONTROL)/; \
	    [ -e $(TMPCONTROL)/shlibs ] || continue; \
	    dpkg-deb -x "$$pkg" $(TMPEXTRACT)/; \
	    perl -pe 's/^((\S+)\.so\.(\S+))\s+(\S+)$$/$$1 $$4 $$2 $$3/ or s/^((\S+)-(\S+)\.so)\s+(\S+)$$/$$1 $$4 $$2 $$3/ or $$_ = ""' < $< | \
		while read lib format libname soname; do \
		    for dir in $(LIBDIRS); do \
			if [ -e "$(TMPEXTRACT)/$$dir/$$lib" ] && \
			    [ "$$(objdump -a -- "$(TMPEXTRACT)/$$dir/$$lib" | \
				sed -n 's/^.*file format *\(.*\)$$/\1/ p')" = "$$format" ]; then \
			    if grep -q "^\\($$libname\\)[[:space:]]\\+\\($$soname\)[[:space:]]\\+" $(TMPCONTROL)/shlibs; then \
				sed -n "s/^\\($$libname\\)[[:space:]]\\+\\($$soname\)[[:space:]]\\+/\\1 \\2 / p" $(TMPCONTROL)/shlibs; \
			    else \
				echo "Warning: fabricating shlibs line for $$libname $$soname" >&2; \
				echo "$$libname $$soname $$(sed -n 's/^Package:[[:space:]]*// p' $(TMPCONTROL)/control)"; \
			    fi | \
				sed -e 's/ BROKEN_DEP_ON_OBSOLETE_DB2$$/ libdb2 (>= 2:2.7.7.0-1)/' \
				    -e 's/ libgl1.*$$/ libgl1/' >> $@; \
			    break; \
			fi \
		    done \
		done; \
	    rm -rf $(TMPCONTROL) $(TMPEXTRACT); \
	done

common-build-arch:: debian/libs

debathena-athena-libraries-substvars: debian/libs
	( \
	    echo -n "debathena-athena-libraries:Recommends="; \
	    cat $< | sed 's/^[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+//' | sort -u | tr '\n' ','; \
	    echo; \
	) >> debian/debathena-athena-libraries.substvars

binary-predeb/debathena-athena-libraries:: debathena-athena-libraries-substvars

clean::
	rm -f debian/libs $(APTITUDE_LOCKFILE)
	rm -rf $(APT_CACHE) $(APT_FILE_CACHE) $(TMPCONTROL) $(TMPEXTRACT) $(APTITUDE_STATE)
