# 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