# Just The Linux
#

# Override these on the command line if need be (use JTL_ARCH=i386 to be safe)
# X, for reasons best known to itself, barfs if you omit the quotes on -march
PREFIX:=/usr
JTL_ROOT:=$(shell pwd)
ARCHIVE:=$(shell pwd)/archive
BUILD:=$(JTL_ROOT)/build
MADE:=$(JTL_ROOT)/made
JTL_ARCH:=$(shell uname -m)

SUB_ROOT:=$(JTL_ROOT)/$(JTL_ARCH)-root
ARM_ROOT:=$(JTL_ROOT)/arm-root
JTL_SUBLIBS=-L$(SUB_ROOT)/lib -L$(SUB_ROOT)/usr/lib
JTL_ARMLIBS=-L$(ARM_ROOT)/lib -L$(ARM_ROOT)/usr/lib
JTL_ARCHFLAGS:=-march="$(JTL_ARCH)" -mcpu="$(JTL_ARCH)"

# You shouldn't need to alter anything below here

ifeq ($(PREFIX),/usr)
JTL_SYSCONFDIR:=/etc
else
JTL_SYSCONFDIR:=$(PREFIX)/etc
endif
JTL_CFLAGS:=-O2 -O9 $(JTL_ARCHFLAGS) -pipe
JTL_CXXFLAGS:=-O2 -O9 $(JTL_ARCHFLAGS) -pipe
JTL_CROSSCFLAGS:=-O2 -O9 $(JTL_ARCHFLAGS) -pipe
JTL_CROSSCXXFLAGS:=-O2 -O9 $(JTL_ARCHFLAGS) -pipe
JTL_CONFIG:=--enable-shared --disable-static

ifneq ($(wildcard $(JTL_SYSCONFDIR)/jtl.conf),)
-include $(JTL_SYSCONFDIR)/jtl.conf
endif

COMPONENTS:=$(filter-out %~,$(wildcard Make.*))
TARGETS:=$(COMPONENTS:Make.%=%)

.SUFFIXES:

vpath % $(MADE)

MADE_BEFORE:=$(wildcard $(MADE)/*)
MADE_BEFORE1:=$(MADE_BEFORE:$(MADE)/%=%)
MADE_BEFORE2:=$(filter $(TARGETS),$(MADE_BEFORE1))

ifeq ($(MAKECMDGOALS),)

.DEFAULT:
	@echo Possible targets are 
	@echo "  " $(TARGETS) | fmt
	@echo Or \'world\'
ifneq ($(MADE_BEFORE2),)
	@echo \'make all\' makes
	@echo "  " $(MADE_BEFORE2) | fmt
endif

world: .DEFAULT

else

include $(COMPONENTS)

world: $(TARGETS)

all: $(MADE_BEFORE2)

clean::
	$(RM) -rf $(BUILD)/* $(TARGETS:%=$(MADE)/%)

RELEASE:=$(shell date +"%Y-%b-%d")

dist: files
	rm -rf $(BUILD)/jtl-$(RELEASE)
	mkdir -p $(BUILD)/jtl-$(RELEASE)/{build,etc,archive}
	cp -dpR README TODO FILES Make* etc patches $(BUILD)/jtl-$(RELEASE)
	find $(BUILD)/jtl-$(RELEASE) -name CVS -o -name '*~' | xargs rm -rf
	tar cf - -C $(BUILD) jtl-$(RELEASE) | gzip -9 > jtl-$(RELEASE).tar.gz
	rm -rf $(BUILD)/jtl-$(RELEASE)

check:
	@echo "Checking contents of $(ARCHIVE)"
	@(ARCFILES=`find $(ARCHIVE) -follow -type f | sort | sed -e 's|$(ARCHIVE)/||'` ; FILES=`cat FILES` ; \
		MISSING= export MISSING ; \
		SPARE= export SPARE ; \
		for i in $$FILES ; do \
			{ echo $$ARCFILES | fgrep -q $$i || MISSING="$$MISSING $$i" ; } ; \
		done ; \
		for i in $$ARCFILES ; do \
			{ echo $$FILES | fgrep -q $$i || SPARE="$$SPARE $$i" ; } ; \
		done ; \
		[ -z "$$MISSING" ] || (echo -e "**\n\tMissing:$$MISSING" | fmt -t ) ; \
		[ -z "$$SPARE" ] || (echo -e "**\n\tSpare:$$SPARE" | fmt -t ) ; \
		[ -z "$$MISSING$$SPARE" ] || (echo ; exit 1) ; \
	)
	@echo "OK"

files:
	find $(ARCHIVE) -follow -type f | sort | sed -e 's|$(ARCHIVE)/||' > FILES

graph: graph.dot
	dot -Tgif -Gconcentrate=true -Gbgcolor="#ffffe0" -Nfillcolor="#ffffff" -Gfillcolor="#ffffff" -Nfontname=luxirr -Nfontsize=12 graph.dot -o graph.gif

graph.dot:
	echo "digraph G {" > graph.dot
	for i in Make.* ; do \
		FROM=`grep ^[a-z] $$i | sed -e 's/:.*//g' | tr '+-' 'p_'` ; \
		TO=`grep ^[a-z] $$i | sed -e 's/.*://g' -e 's/\\\//g' | tr '+-' 'p_'` ; \
		for j in $$TO ; do \
			echo $$j '->' $$FROM ' ;' >> graph.dot ; \
		done ; \
	done
	echo "}" >> graph.dot

#		grep ^[a-z] $$i | grep -v :$$ | sed -e 's/-/_/g' -e 's/:/ ->/g' -e 's/$$/;/g' >> graph.dot  ; \

ifeq ($(JTL_TOUCH),)
JTL_TOUCH:=$(PROG)
endif
ifeq ($(JTL_INSTALL),)
JTL_INSTALL:=install
endif

_gnu:
	@echo Making GNU $(PROG)
	rm -rf $(BUILD)/$(PROG)
	mkdir -p $(BUILD)/$(PROG)
	tar xzf $(ARCHIVE)/$(PROG)-*gz -C $(BUILD)/$(PROG) \
		|| tar xf $(ARCHIVE)/$(PROG)-*bz2 -C $(BUILD)/$(PROG) --use-compress-program bzip2 \
		|| ( echo No archive found for $(PROG) ; exit 1 )
	( cd $(BUILD)/$(PROG)/* \
		&& rm -f config.cache \
		&& chmod a+x configure \
		&& CFLAGS="$(JTL_CFLAGS)" CXXFLAGS="$(JTL_CXXFLAGS)" \
			./configure --prefix=$(PREFIX) $(JTL_CONFIG) \
		&& $(MAKE) $(JTL_MAKE) \
		&& $(REALLY) $(MAKE) $(JTL_INSTALL) )
	du -hs $(BUILD)/$(PROG) > $(MADE)/$(JTL_TOUCH)
	rm -rf $(BUILD)/$(PROG)

_xstyle: x
	@echo Making X-style $(PROG)
	@echo Compiling $(PROG)
	rm -rf $(BUILD)/$(PROG)
	mkdir -p $(BUILD)/$(PROG)
	tar xzf $(ARCHIVE)/$(PROG)-* -C $(BUILD)/$(PROG)
	( cd $(BUILD)/$(PROG)/* \
		&& xmkmf \
		&& $(MAKE) Makefiles \
		&& $(MAKE) \
		&& $(REALLY) $(MAKE) install )
	du -hs $(BUILD)/$(PROG) > $(MADE)/$(PROG)
	rm -rf $(BUILD)/$(PROG)

_gnu-strip:
	@echo Making GNU $(PROG)
	rm -rf $(BUILD)/$(PROG)
	mkdir -p $(BUILD)/$(PROG)
	tar xzf $(ARCHIVE)/$(PROG)-*gz -C $(BUILD)/$(PROG) \
		|| tar xf $(ARCHIVE)/$(PROG)-*bz2 -C $(BUILD)/$(PROG) --use-compress-program bzip2 \
		|| ( echo No archive found for $(PROG) ; exit 1 )
	( cd $(BUILD)/$(PROG)/* \
		&& CFLAGS="$(JTL_CFLAGS)" CXXFLAGS="$(JTL_CXXFLAGS)" ./configure --prefix=$(PREFIX) $(JTL_CONFIG) \
		&& $(MAKE) $(JTL_MAKE) \
		&& $(REALLY) $(MAKE) install-strip )
	du -hs $(BUILD)/$(PROG) > $(MADE)/$(PROG)
	rm -rf $(BUILD)/$(PROG)

endif
