# GNU make syntax reigns in this file.
all_cflags += -Werror
all_cppflags += -MD -MP -MF .deps/$(subst .._,,$(subst /,_,$<)).d
A2X = a2x
ASCIIDOC = asciidoc
CPPCHECK = cppcheck
CPPCHECK_SUPPRESSIONS = misc/cppcheck-suppressions.txt
SCAN_BUILD = scan-build
DOCKER = docker
GPERF = gperf
TEST = test
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 = \
LICENSE.html \
doc/AUTHORS.html \
doc/MANUAL.html \
doc/NEWS.html \
doc/ccache.1
built_dist_files = $(generated_sources) $(generated_docs)
headers = \
src/ccache.h \
src/compopt.h \
src/conf.h \
src/counters.h \
src/getopt_long.h \
src/hashtable.h \
src/hashtable_itr.h \
src/hashtable_private.h \
src/hashutil.h \
src/language.h \
src/macroskip.h \
src/manifest.h \
src/mdfour.h \
src/murmurhashneutral2.h \
src/system.h \
unittest/framework.h \
unittest/util.h
generated_headers = \
unittest/suites.h
files_to_clean += *.tar.bz2 *.tar.gz *.tar.xz *.xml .deps/* perfdir.*
files_to_distclean += $(built_dist_files) src/version.c unittest/suites.h
files_to_distclean += .deps dev.mk
source_dist_files = \
$(non_3pp_sources) \
$(3pp_sources) \
$(headers) \
$(test_sources) \
CONTRIBUTING.md \
GPL-3.0.txt \
LICENSE.adoc \
Makefile.in \
README.md \
autogen.sh \
config.guess \
config.h.in \
config.sub \
configure \
configure.ac \
dev.mk.in \
doc/AUTHORS.adoc \
doc/MANUAL.adoc \
doc/NEWS.adoc \
install-sh \
m4 \
src/confitems.gperf \
src/confitems_lookup.c \
src/envtoconfitems.gperf \
src/envtoconfitems_lookup.c \
src/main.c \
src/zlib/*.c \
src/zlib/*.h \
test/run \
test/suites/*
dist_files = \
$(addprefix $(srcdir)/, $(source_dist_files)) \
$(built_dist_files)
uncrustify_exclude_files = \
src/getopt_long.c \
src/hashtable.c \
src/hashtable_itr.c \
src/snprintf.c
ifneq ($(shell sed 's/.*"\(.*\)".*/\1/' src/version.c 2>/dev/null),$(version))
$(shell echo 'const char CCACHE_VERSION[] = "$(version)";' >src/version.c)
endif
src/version.o: src/version.c
%_lookup.c: %.gperf
$(GPERF) $< | awk '/#ifdef __GNUC__/ { ++i; if (i == 2) { print "static"; }} {print}' >$@
echo "static const size_t $$(echo $(notdir $*) | 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)/doc/INSTALL-from-release-archive.md $$dir/INSTALL.md && \
(cd $(builddir) && \
rsync -r --relative $(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 xf $(CURDIR)/$< && \
mkdir -p $(dist_dir)/build && \
chmod -R a-w $(dist_dir) && \
chmod u+w $(dist_dir)/build && \
cd $(dist_dir)/build && \
../configure --prefix=$$tmpdir/root && \
$(MAKE) install && \
$(MAKE) installcheck) && \
chmod -R u+w $$tmpdir/$(dist_dir) && \
rm -rf $$tmpdir
tmpdir=$$(mktemp -d /tmp/tmp-ccache-distcheck.XXXXXX) && \
(cd $$tmpdir && \
tar xf $(CURDIR)/$< && \
mkdir -p $(dist_dir)/build && \
chmod -R a-w $(dist_dir) && \
chmod u+w $(dist_dir)/build && \
cd $(dist_dir)/build && \
../configure --prefix=$$tmpdir/root --with-bundled-zlib && \
$(MAKE) install && \
$(MAKE) installcheck) && \
chmod -R u+w $$tmpdir/$(dist_dir) && \
rm -rf $$tmpdir
.PHONY: docs
docs: $(generated_docs)
%.html: %.adoc
@mkdir -p $(@D)
$(ASCIIDOC) -o $@ -a revnumber=$(version) -a toc -b xhtml11 $<
%.xml: %.adoc
@mkdir -p $(@D)
# Make literals stand out as bold in the man page:
$(ASCIIDOC) -a revnumber=$(version) -d manpage -b docbook -o - $< | \
perl -pe 's!(.*?)!\1!g' >$@
doc/ccache.1: doc/MANUAL.xml
$(A2X) --doctype manpage --format manpage $<
.PHONY: update-authors
update-authors:
git log --pretty=format:"* %aN <%aE>" \
| sort -u \
| perl -00 -p -i -e 's/^\*.*/ . "\n"/es' doc/AUTHORS.adoc
.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 --force \
$(non_3pp_sources) src/main.c $(test_sources)
.PHONY: uncrustify
uncrustify:
uncrustify -c misc/uncrustify.cfg --no-backup --replace $(filter-out $(uncrustify_exclude_files), $(base_sources)) $(test_sources)
.PHONY: analyze
analyze:
$(SCAN_BUILD) --use-cc=$(CC) $(srcdir)/configure
$(SCAN_BUILD) --use-cc=$(CC) --status-bugs $(MAKE) -B
.PHONY: docker
docker: misc/Dockerfile
$(DOCKER) build -f $< $(srcdir)
.PHONY: travis
travis: .travis/Dockerfile
$(DOCKER) inspect travis-build >/dev/null || $(DOCKER) build -t travis-build .travis
$(DOCKER) run --rm --volume $(PWD):/src --tmpfs /dst:rw,exec --env ASAN_OPTIONS='$(ASAN_OPTIONS)' travis-build \
sh -c "cd /src && ./autogen.sh && cd /dst && CC=$(CC) CFLAGS='$(CFLAGS)' /src/configure $(HOST) && make && make $(TEST)"
-include .deps/*.d