# GNU make syntax reigns in this file.

all_cflags += -Werror
all_cppflags += -MD -MP -MF .deps/$(subst .._,,$(subst /,_,$<)).d

ASCIIDOC = asciidoc
CPPCHECK = cppcheck
CPPCHECK_SUPPRESSIONS = cppcheck-suppressions.txt
GPERF = gperf
XSLTPROC = xsltproc
MANPAGE_XSL = $(shell if [ -e /usr/local/etc/asciidoc/docbook-xsl/manpage.xsl ]; \
                then echo /usr/local/etc/asciidoc/docbook-xsl/manpage.xsl; \
                else echo /etc/asciidoc/docbook-xsl/manpage.xsl; fi)


version := \
    $(shell (git --git-dir=$(srcdir)/.git describe --dirty || git --git-dir=$(srcdir)/.git describe || echo vunknown) \
            2>/dev/null | sed -e 's/v//' -e 's/-/+/' -e 's/-/_/g')

dist_dir = ccache-$(version)
dist_archives = \
    ccache-$(version).tar.bz2 \
    ccache-$(version).tar.gz
ifneq ($(shell uname), Darwin)
    dist_archives += ccache-$(version).tar.xz
endif

generated_docs = ccache.1 AUTHORS.html LICENSE.html MANUAL.html NEWS.html
built_dist_files = $(generated_docs)

headers = \
    ccache.h \
    compopt.h \
    conf.h \
    counters.h \
    getopt_long.h \
    hashtable.h \
    hashtable_itr.h \
    hashtable_private.h \
    hashutil.h \
    language.h \
    macroskip.h \
    manifest.h \
    mdfour.h \
    murmurhashneutral2.h \
    system.h \
    test/framework.h \
    test/suites.h \
    test/util.h

files_to_clean += *.tar.bz2 *.tar.gz *.tar.xz *.xml .deps/* perfdir.*
files_to_distclean += $(built_dist_files) version.c test/suites.h
files_to_distclean += .deps version.c dev.mk

source_dist_files = \
    $(base_sources) \
    $(headers) \
    $(test_sources) \
    AUTHORS.txt \
    GPL-3.0.txt \
    HACKING.txt \
    LICENSE.txt \
    MANUAL.txt \
    Makefile.in \
    NEWS.txt \
    README.md \
    autogen.sh \
    config.guess \
    config.h.in \
    config.sub \
    configure \
    configure.ac \
    confitems.gperf \
    confitems_lookup.c \
    dev.mk.in \
    envtoconfitems.gperf \
    envtoconfitems_lookup.c \
    install-sh \
    m4 \
    main.c \
    test.sh \
    zlib/*.c \
    zlib/*.h

dist_files = \
    $(addprefix $(srcdir)/, $(source_dist_files)) \
    $(built_dist_files)

uncrustify_exclude_files = \
    getopt_long.c \
    hashtable.c \
    hashtable_itr.c \
    snprintf.c

ifneq ($(shell sed 's/.*"\(.*\)".*/\1/' version.c 2>/dev/null),$(version))
  $(shell echo 'const char CCACHE_VERSION[] = "$(version)";' >version.c)
endif
version.o: version.c

%_lookup.c: %.gperf
	$(GPERF) $< | awk '/#ifdef __GNUC__/ { ++i; if (i == 2) { print "static"; }} {print}' >$@
	echo "static const size_t `echo $* | tr a-z A-Z`_TOTAL_KEYWORDS = `sed -nr 's/.*TOTAL_KEYWORDS = ([0-9]+).*/\1/p' $@`;" >>$@

.PHONY: dist
dist: $(dist_archives)

$(dist_archives): $(dist_files)
	tmpdir=$$(mktemp -d /tmp/tmp-ccache-dist.XXXXXX) && \
	dir=$$tmpdir/$(dist_dir) && \
	mkdir $$dir && \
	(cd $(srcdir) && \
	 rsync -r --relative $(source_dist_files) $$dir) && \
	cp $(srcdir)/INSTALL-from-release-archive.md $$dir/INSTALL.md && \
	cp $(built_dist_files) $$dir && \
	echo "Remove this file to enable developer mode." >$$dir/dev_mode_disabled && \
	(cd $$tmpdir && \
	 tarcompression= && \
	 case $@ in \
	     *.bz2) tarcompression=-j ;; \
	     *.gz) tarcompression=-z ;; \
	     *.xz) tarcompression=-J ;; \
	 esac && \
	 tar -c $$tarcompression -f $(CURDIR)/$@ $(dist_dir)) && \
	rm -rf $$tmpdir

.PHONY: distcheck
distcheck: $(firstword $(dist_archives))
	tmpdir=$$(mktemp -d /tmp/tmp-ccache-distcheck.XXXXXX) && \
	(cd $$tmpdir && \
	 tar xjf $(CURDIR)/$< && \
	 mkdir -p $(dist_dir)/build && \
	 cd $(dist_dir)/build && \
	 ../configure --prefix=$$tmpdir/root && \
	 $(MAKE) install && \
	 $(MAKE) installcheck) && \
	rm -rf $$tmpdir

.PHONY: docs
docs: $(generated_docs)

%.html: %.txt
	$(ASCIIDOC) -a revnumber=$(version) -a toc -b xhtml11 $<

%.xml: %.txt
	$(ASCIIDOC) -a revnumber=$(version) -d manpage -b docbook $<

ccache.1: MANUAL.xml
	$(XSLTPROC) --nonet $(MANPAGE_XSL) $<

.PHONY: check-syntax
check-syntax:
	$(CC) $(all_cppflags) -I. $(all_cflags) -S -o /dev/null $(CHK_SOURCES)

.PHONY: cppcheck
cppcheck:
	$(CPPCHECK) --suppressions-list=$(CPPCHECK_SUPPRESSIONS) \
	  --inline-suppr -q --enable=all \
	  $(non_3pp_sources) main.c $(test_sources)

.PHONY: uncrustify
uncrustify:
	uncrustify -c uncrustify.cfg --no-backup --replace $(filter-out $(uncrustify_exclude_files), $(base_sources)) $(test_sources)

-include .deps/*.d
