X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=Makefile.local;h=9505b7fee70b43b281bf5e6b428dfb7c522b14c2;hp=1c3d5f5b6e9f435f7b02bb45f84f9752afdfaf41;hb=040c3236afcf95bead0324a48c2e0b9cd7934993;hpb=1d1ad74db9b85804fdec7e3311223caa7a591c82 diff --git a/Makefile.local b/Makefile.local index 1c3d5f5b..9505b7fe 100644 --- a/Makefile.local +++ b/Makefile.local @@ -1,52 +1,9 @@ # -*- makefile -*- -# Here's the (hopefully simple) versioning scheme. -# -# Releases of notmuch have a two-digit version (0.1, 0.2, etc.). We -# increment the second digit for each release and increment the first -# digit when we reach particularly major milestones of usability. -# -# Between releases, (such as when compiling notmuch from the git -# repository), we add a third digit, (0.1.1, 0.1.2, etc.), and -# increment it occasionally, (such as after a big batch of commits are -# merged. -PACKAGE=notmuch -VERSION=0.1 - -RELEASE_HOST=notmuchmail.org -RELEASE_DIR=/srv/notmuchmail.org/www/releases -TAR_FILE=$(PACKAGE)-$(VERSION).tar.gz -SHA1_FILE=$(TAR_FILE).sha1 -GPG_FILE=$(SHA1_FILE).asc - -# Get settings from the output of configure by running it to generate -# Makefile.config if it doesn't exist yet. And add Makefile.config to -# our global dependency list. -include Makefile.config -global_deps += Makefile.config -Makefile.config: configure - @echo "" - @echo "Note: Calling ./configure with no command-line arguments. This is often fine," - @echo " but if you want to specify any arguments (such as an alternate prefix" - @echo " into which to install), call ./configure explicitly and then make again." - @echo " See \"./configure --help\" for more details." - @echo "" - ./configure - -# Sub-directory Makefile.local fragments can append to these variables -# to have directory-specific cflags as necessary. -extra_cflags := -extra_cxxflags := - -# Smash together user's values with our extra values -FINAL_CFLAGS = -DNOTMUCH_VERSION=$(VERSION) $(CFLAGS) $(WARN_CFLAGS) $(CONFIGURE_CFLAGS) $(extra_cflags) -FINAL_CXXFLAGS = $(CXXFLAGS) $(WARN_CXXFLAGS) $(CONFIGURE_CXXFLAGS) $(extra_cflags) $(extra_cxxflags) -FINAL_LDFLAGS = $(LDFLAGS) $(CONFIGURE_LDFLAGS) - .PHONY: all -all: notmuch notmuch-shared notmuch.1.gz +all: notmuch notmuch-shared build-man ruby-bindings ifeq ($(MAKECMDGOALS),) -ifeq ($(shell cat .first-build-message),) +ifeq ($(shell cat .first-build-message 2>/dev/null),) @NOTMUCH_FIRST_BUILD=1 $(MAKE) --no-print-directory all @echo "" @echo "Compilation of notmuch is now complete. You can install notmuch with:" @@ -60,137 +17,292 @@ ifeq ($(shell cat .first-build-message),) endif endif +# Depend (also) on the file 'version'. In case of ifeq ($(IS_GIT),yes) +# this file may already have been updated. +version.stamp: $(srcdir)/version + echo $(VERSION) > $@ + $(TAR_FILE): - git archive --format=tar --prefix=$(PACKAGE)-$(VERSION)/ HEAD | gzip > $(TAR_FILE) + if git tag -v $(UPSTREAM_TAG) >/dev/null 2>&1; then \ + ref=$(UPSTREAM_TAG); \ + else \ + ref="HEAD" ; \ + echo "Warning: No signed tag for $(VERSION)"; \ + fi ; \ + git archive --format=tar --prefix=$(PACKAGE)-$(VERSION)/ $$ref > $(TAR_FILE).tmp + echo $(VERSION) > version.tmp + tar --owner root --group root --append -f $(TAR_FILE).tmp \ + --transform s_^_$(PACKAGE)-$(VERSION)/_ \ + --transform 's_.tmp$$__' version.tmp + rm version.tmp + gzip < $(TAR_FILE).tmp > $(TAR_FILE) @echo "Source is ready for release in $(TAR_FILE)" -$(SHA1_FILE): $(TAR_FILE) - sha1sum $^ > $@ +$(SHA256_FILE): $(TAR_FILE) + sha256sum $^ > $@ -$(GPG_FILE): $(SHA1_FILE) - @echo "Please enter your GPG password to sign the checksum." - gpg --armor --sign $^ +$(GPG_FILE): $(SHA256_FILE) + gpg --armor --sign $^ .PHONY: dist dist: $(TAR_FILE) +.PHONY: update-versions + +update-versions: + sed -i -e "s/^__VERSION__[[:blank:]]*=.*$$/__VERSION__ = \'${VERSION}\'/" \ + -e "s/^SOVERSION[[:blank:]]*=.*$$/SOVERSION = \'${LIBNOTMUCH_VERSION_MAJOR}\'/" \ + ${PV_FILE} + +# We invoke make recursively only to force ordering of our phony +# targets in the case of parallel invocation of make (-j). +# +# We carefully ensure that our VERSION variable is passed down to any +# sub-ordinate make invocations (which won't otherwise know that they +# are part of the release and need to take the version from the +# version file). .PHONY: release -release: release-verify-newer $(TAR_FILE) $(SHA1_FILE) $(GPG_FILE) +release: verify-source-tree-and-version + $(MAKE) VERSION=$(VERSION) verify-newer + $(MAKE) VERSION=$(VERSION) clean + $(MAKE) VERSION=$(VERSION) test + git tag -s -m "$(PACKAGE) $(VERSION) release" $(UPSTREAM_TAG) + $(MAKE) VERSION=$(VERSION) $(GPG_FILE) + ln -sf $(TAR_FILE) $(DEB_TAR_FILE) + pristine-tar commit $(DEB_TAR_FILE) $(UPSTREAM_TAG) + git tag -s -m "$(PACKAGE) Debian $(VERSION)-1 upload (same as $(VERSION))" $(DEB_TAG) + mkdir -p releases + mv $(TAR_FILE) $(SHA256_FILE) $(GPG_FILE) releases + $(MAKE) VERSION=$(VERSION) release-message > $(PACKAGE)-$(VERSION).announce +ifeq ($(REALLY_UPLOAD),yes) + git push origin $(VERSION) + cd releases && scp $(TAR_FILE) $(SHA256_FILE) $(GPG_FILE) $(RELEASE_HOST):$(RELEASE_DIR) + ssh $(RELEASE_HOST) "rm -f $(RELEASE_DIR)/LATEST-$(PACKAGE)-* ; ln -s $(TAR_FILE) $(RELEASE_DIR)/LATEST-$(TAR_FILE)" +endif + @echo "Please send a release announcement using $(PACKAGE)-$(VERSION).announce as a template." + +.PHONY: pre-release +pre-release: + $(MAKE) VERSION=$(VERSION) clean + $(MAKE) VERSION=$(VERSION) test + git tag -s -m "$(PACKAGE) $(VERSION) release" $(UPSTREAM_TAG) + git tag -s -m "$(PACKAGE) Debian $(VERSION)-1 upload (same as $(VERSION))" $(DEB_TAG) + $(MAKE) VERSION=$(VERSION) $(TAR_FILE) + ln -sf $(TAR_FILE) $(DEB_TAR_FILE) + pristine-tar commit $(DEB_TAR_FILE) $(UPSTREAM_TAG) mkdir -p releases - scp $(TAR_FILE) $(SHA1_FILE) $(GPG_FILE) $(RELEASE_HOST):$(RELEASE_DIR) - mv $(TAR_FILE) $(SHA1_FILE) $(GPG_FILE) releases - ssh $(RELEASE_HOST) "rm -f $(RELEASE_DIR)/LATEST-$(PACKAGE)-[0-9]* && ln -s $(TAR_FILE) $(RELEASE_DIR)/LATEST-$(PACKAGE)-$(VERSION)" - git tag -s -m "$(PACKAGE) $(VERSION) release" $(VERSION) - -.PHONY: release-verify-version -release-verify-version: - @echo -n "Checking that $(VERSION) is a two-component version..." - @if echo $(VERSION) | grep -q -v -x '[0-9]*\.[0-9]*'; then \ - (echo "Ouch." && \ - echo "Before releasing the notmuch version should be a two-component value." && false);\ - else :; fi - @echo "Good." - -.PHONY: release-verify-newer -release-verify-newer: release-verify-version + mv $(TAR_FILE) $(DEB_TAR_FILE) releases + +.PHONY: debian-snapshot +debian-snapshot: + make VERSION=$(VERSION) clean + TMPFILE=$$(mktemp /tmp/notmuch.XXXXXX); \ + cp debian/changelog $${TMPFILE}; \ + EDITOR=/bin/true dch -b -v $(VERSION)+1 \ + -D UNRELEASED 'test build, not for upload'; \ + echo '3.0 (native)' > debian/source/format; \ + debuild -us -uc; \ + mv -f $${TMPFILE} debian/changelog; \ + echo '3.0 (quilt)' > debian/source/format + +.PHONY: release-message +release-message: + @echo "To: notmuch@notmuchmail.org" + @echo "Subject: $(PACKAGE) release $(VERSION) now available" + @echo "" + @echo "Where to obtain notmuch $(VERSION)" + @echo "===========================" + @echo " $(RELEASE_URL)/$(TAR_FILE)" + @echo "" + @echo "Which can be verified with:" + @echo "" + @echo " $(RELEASE_URL)/$(SHA256_FILE)" + @echo -n " " + @cat releases/$(SHA256_FILE) + @echo "" + @echo " $(RELEASE_URL)/$(GPG_FILE)" + @echo " (signed by `getent passwd "$$USER" | cut -d: -f 5 | cut -d, -f 1`)" + @echo "" + @echo "What's new in notmuch $(VERSION)" + @echo "=========================" + @sed -ne '/^[Nn]otmuch $(VERSION)/{n;n;b NEWS}; d; :NEWS /^===/q; {p;n;b NEWS}' < NEWS | head -n -2 + @echo "" + @echo "What is notmuch" + @echo "===============" + @echo "Notmuch is a system for indexing, searching, reading, and tagging" + @echo "large collections of email messages in maildir or mh format. It uses" + @echo "the Xapian library to provide fast, full-text search with a convenient" + @echo "search syntax." + @echo "" + @echo "For more about notmuch, see https://notmuchmail.org" + +# This is a chain of dependencies rather than a simple list simply to +# avoid the messages getting interleaved in the case of a parallel +# make invocation. +.PHONY: verify-source-tree-and-version +verify-source-tree-and-version: verify-no-dirty-code + +.PHONY: verify-no-dirty-code +verify-no-dirty-code: release-checks +ifeq ($(IS_GIT),yes) + @printf "Checking that source tree is clean..." +ifneq ($(shell git --git-dir=${srcdir}/.git ls-files -m),) + @echo "No" + @echo "The following files have been modified since the most recent git commit:" + @echo "" + @git --git-dir=${srcdir}/.git ls-files -m + @echo "" + @echo "The release will be made from the committed state, but perhaps you meant" + @echo "to commit this code first? Please clean this up to make it more clear." + @false +else + @echo "Good" +endif +endif + +.PHONY: release-checks +release-checks: + devel/release-checks.sh + +.PHONY: verify-newer +verify-newer: @echo -n "Checking that no $(VERSION) release already exists..." - @ssh $(RELEASE_HOST) test ! -e $(RELEASE_DIR)/$(TAR_FILE) \ - || (echo "Ouch." && echo "Found: $(RELEASE_HOST):$(RELEASE_DIR)/$(TAR_FILE)" \ - && echo "Refusing to replace an existing release." && false) - @echo "Good." + @wget -q --no-check-certificate -O /dev/null $(RELEASE_URL)/$(TAR_FILE) ; \ + case $$? in \ + 8) echo "Good." ;; \ + 0) echo "Ouch."; \ + echo "Found: $(RELEASE_URL)/$(TAR_FILE)"; \ + echo "Refusing to replace an existing release."; \ + echo "Don't forget to update \"version\" as described in RELEASING before release." ; \ + false ;; \ + *) echo "An unexpected error occured"; \ + false;; esac # The user has not set any verbosity, default to quiet mode and inform the # user how to enable verbose compiles. ifeq ($(V),) quiet_DOC := "Use \"$(MAKE) V=1\" to see the verbose compile lines.\n" -quiet = @printf $(quiet_DOC)$(eval quiet_DOC:=)"$1 $@\n"; $($(shell echo $1 | sed -e s'/ .*//')) +quiet = @printf $(quiet_DOC)$(eval quiet_DOC:=)"$(1) $(or $(2),$@)\n"; $($(word 1, $(1))) endif # The user has explicitly enabled quiet compilation. ifeq ($(V),0) -quiet = @printf "$1 $@\n"; $($(shell echo $1 | sed -e s'/ .*//')) +quiet = @printf "$(1) $(or $(2),$@)\n"; $($(word 1, $(1))) endif # Otherwise, print the full command line. -quiet ?= $($(shell echo $1 | sed -e s'/ .*//')) +quiet ?= $($(word 1, $(1))) %.o: %.cc $(global_deps) - $(call quiet,CXX $(CXXFLAGS)) -c $(FINAL_CXXFLAGS) $< -o $@ + @mkdir -p $(patsubst %/.,%,.deps/$(@D)) + $(call quiet,CXX $(CPPFLAGS) $(CXXFLAGS)) -c $(FINAL_CXXFLAGS) $< -o $@ -MD -MP -MF .deps/$*.d %.o: %.c $(global_deps) - $(call quiet,CC $(CFLAGS)) -c $(FINAL_CFLAGS) $< -o $@ + @mkdir -p $(patsubst %/.,%,.deps/$(@D)) + $(call quiet,CC $(CPPFLAGS) $(CFLAGS)) -c $(FINAL_CFLAGS) $< -o $@ -MD -MP -MF .deps/$*.d -.deps/%.d: %.c $(global_deps) - @set -e; rm -f $@; mkdir -p $$(dirname $@) ; \ - $(CC) -M $(CPPFLAGS) $(FINAL_CFLAGS) $< > $@.$$$$ 2>/dev/null ; \ - sed 's,'$$(basename $*)'\.o[ :]*,$*.o $@ : ,g' < $@.$$$$ > $@; \ - rm -f $@.$$$$ +CPPCHECK=cppcheck +.stamps/cppcheck/%: % + @mkdir -p $(@D) + $(call quiet,CPPCHECK,$<) --template=gcc --error-exitcode=1 --quiet $< + @touch $@ -.deps/%.d: %.cc $(global_deps) - @set -e; rm -f $@; mkdir -p $$(dirname $@) ; \ - $(CXX) -M $(CPPFLAGS) $(FINAL_CXXFLAGS) $< > $@.$$$$ 2>/dev/null ; \ - sed 's,'$$(basename $*)'\.o[ :]*,$*.o $@ : ,g' < $@.$$$$ > $@; \ - rm -f $@.$$$$ - -DEPS := $(SRCS:%.c=.deps/%.d) -DEPS := $(DEPS:%.cc=.deps/%.d) --include $(DEPS) +CLEAN := $(CLEAN) .stamps .PHONY : clean clean: - rm -f $(CLEAN); rm -rf .deps + rm -rf $(CLEAN) + +.PHONY: distclean +distclean: clean + rm -rf $(DISTCLEAN) + +.PHONY: dataclean +dataclean: distclean + rm -rf $(DATACLEAN) notmuch_client_srcs = \ $(notmuch_compat_srcs) \ + command-line-arguments.c\ debugger.c \ + status.c \ gmime-filter-reply.c \ + hooks.c \ notmuch.c \ + notmuch-compact.c \ notmuch-config.c \ notmuch-count.c \ notmuch-dump.c \ + notmuch-insert.c \ notmuch-new.c \ + notmuch-reindex.c \ notmuch-reply.c \ notmuch-restore.c \ notmuch-search.c \ - notmuch-search-tags.c \ notmuch-setup.c \ notmuch-show.c \ notmuch-tag.c \ notmuch-time.c \ + sprinter-json.c \ + sprinter-sexp.c \ + sprinter-text.c \ query-string.c \ - show-message.c \ - json.c + mime-node.c \ + tag-util.c notmuch_client_modules = $(notmuch_client_srcs:.c=.o) -notmuch: $(notmuch_client_modules) lib/libnotmuch.a - $(call quiet,CC $(CFLAGS)) $^ $(FINAL_LDFLAGS) -o $@ +notmuch.o: version.stamp -notmuch-shared: $(notmuch_client_modules) lib/libnotmuch.so - $(call quiet,CC $(CFLAGS)) -Llib -lnotmuch $(notmuch_client_modules) $(FINAL_LDFLAGS) -o $@ +notmuch: $(notmuch_client_modules) lib/libnotmuch.a util/libnotmuch_util.a parse-time-string/libparse-time-string.a + $(call quiet,CXX $(CFLAGS)) $^ $(FINAL_LIBNOTMUCH_LDFLAGS) -o $@ -notmuch.1.gz: notmuch.1 - gzip --stdout $^ > $@ +notmuch-shared: $(notmuch_client_modules) lib/$(LINKER_NAME) + $(call quiet,$(FINAL_NOTMUCH_LINKER) $(CFLAGS)) $(notmuch_client_modules) $(FINAL_NOTMUCH_LDFLAGS) -o $@ .PHONY: install -install: all notmuch.1.gz - mkdir -p $(DESTDIR)$(mandir)/man1 - install -m0644 notmuch.1.gz $(DESTDIR)$(mandir)/man1/ - mkdir -p $(DESTDIR)$(prefix)/bin/ - install notmuch-shared $(DESTDIR)$(prefix)/bin/notmuch +install: all install-man + mkdir -p "$(DESTDIR)$(prefix)/bin/" + install notmuch-shared "$(DESTDIR)$(prefix)/bin/notmuch" ifeq ($(MAKECMDGOALS), install) @echo "" @echo "Notmuch is now installed to $(DESTDIR)$(prefix)" @echo "" - @echo "To run notmuch from emacs, each user should add the following line to ~/.emacs:" + @echo "New users should simply run \"notmuch\" to be guided" + @echo "through the process of configuring notmuch and creating" + @echo "a database of existing email messages. The \"notmuch\"" + @echo "command will also offer some sample search commands." +ifeq ($(WITH_EMACS), 1) + @echo "" + @echo "Beyond the command-line interface, notmuch also offers" + @echo "a full-featured interface for reading and writing mail" + @echo "within emacs. To use this, each user should add the" + @echo "following line to the ~/.emacs file:" @echo "" @echo " (require 'notmuch)" @echo "" - @echo "And should then run \"M-x notmuch\" from within emacs or run \"emacs -f notmuch\"" + @echo "And then run emacs as \"emacs -f notmuch\" or invoke" + @echo "the command \"M-x notmuch\" from within emacs." +endif endif - -.PHONY: install-desktop -install-desktop: - mkdir -p $(DESTDIR)$(desktop_dir) - desktop-file-install --mode 0644 --dir $(DESTDIR)$(desktop_dir) notmuch.desktop SRCS := $(SRCS) $(notmuch_client_srcs) -CLEAN := $(CLEAN) notmuch notmuch-shared $(notmuch_client_modules) notmuch.elc notmuch.1.gz +CLEAN := $(CLEAN) notmuch notmuch-shared $(notmuch_client_modules) +CLEAN := $(CLEAN) version.stamp notmuch-*.tar.gz.tmp +CLEAN := $(CLEAN) .deps + +DISTCLEAN := $(DISTCLEAN) .first-build-message Makefile.config sh.config + +CPPCHECK_STAMPS := $(SRCS:%=.stamps/cppcheck/%) +.PHONY: cppcheck +ifeq ($(HAVE_CPPCHECK),1) +cppcheck: ${CPPCHECK_STAMPS} +else +cppcheck: + @echo "No cppcheck found during configure; skipping static checking" +endif + + +DEPS := $(SRCS:%.c=.deps/%.d) +DEPS := $(DEPS:%.cc=.deps/%.d) +-include $(DEPS) + +.SUFFIXES: # Delete the default suffixes. Old-Fashioned Suffix Rules not used.