## Licensed under the Apache License, Version 2.0 (the "License"); you may not
## use this file except in compliance with the License. You may obtain a copy of
## the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
## WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
## License for the specific language governing permissions and limitations under
## the License.

SUBDIRS = bin etc src share test var utils

ACLOCAL_AMFLAGS = -I m4

localdoc_DATA = \
    AUTHORS.gz \
    BUGS.gz \
    CHANGES.gz \
    DEVELOPERS.gz \
    INSTALL.gz \
    INSTALL.Unix.gz \
    INSTALL.Windows.gz \
    LICENSE.gz \
    NEWS.gz \
    NOTICE.gz \
    README.gz \
    THANKS.gz

DISTCLEANFILES = $(localdoc_DATA)

EXTRA_DIST = \
    AUTHORS \
    BUGS \
    CHANGES \
    DEVELOPERS \
    INSTALL \
    INSTALL.Unix \
    INSTALL.Windows \
    LICENSE \
    NEWS \
    NOTICE \
    README.rst \
    THANKS \
    build-aux/dist-error \
    build-aux/sphinx-build \
    build-aux/sphinx-touch \
    license.skip

AUTHORS.gz: AUTHORS
	gzip -9 < $< > $@

BUGS.gz: BUGS
	gzip -9 < $< > $@

CHANGES.gz: CHANGES
	gzip -9 < $< > $@

DEVELOPERS.gz: DEVELOPERS
	gzip -9 < $< > $@

INSTALL.gz: INSTALL
	gzip -9 < $< > $@

INSTALL.Unix.gz: INSTALL.Unix
	gzip -9 < $< > $@

INSTALL.Windows.gz: INSTALL.Windows
	gzip -9 < $< > $@

LICENSE.gz: LICENSE
	gzip -9 < $< > $@

NEWS.gz: NEWS
	gzip -9 < $< > $@

NOTICE.gz: NOTICE
	gzip -9 < $< > $@

README.gz: README.rst
	gzip -9 < $< > $@

THANKS.gz: THANKS
	gzip -9 < $< > $@

check: dev check-js
if TESTS
	$(top_builddir)/test/etap/run $(top_srcdir)/test/etap
endif

check-js: dev
if TESTS
if USE_CURL
	MAKE=$(MAKE) $(top_builddir)/test/javascript/run
endif
endif

check-etap: dev
if TESTS
	$(top_builddir)/test/etap/run $(top_srcdir)/test/etap
endif

cover: dev
if TESTS
	rm -f cover/*.coverdata
	COVER=1 COVER_BIN=./src/couchdb/ $(top_builddir)/test/etap/run
	SRC=./src/couchdb/ \
	    $(ERL) -noshell \
	    -pa src/etap \
	    -eval 'etap_report:create()' \
	    -s init stop > /dev/null 2>&1
endif

dev: all
if TESTS
	@echo "This command is intended for developers to use;"
	@echo "it creates development ini files as well as a"
	@echo "$(top_builddir)/tmp structure for development runtime files."
	@echo "Use ./utils/run to launch CouchDB from the source tree."
	mkdir -p $(top_builddir)/etc/couchdb/default.d
	mkdir -p $(top_builddir)/etc/couchdb/local.d
	mkdir -p $(top_builddir)/tmp/lib
	mkdir -p $(top_builddir)/tmp/log
	mkdir -p $(top_builddir)/tmp/run/couchdb
endif

install-data-hook:
	@echo
	@echo "You have installed Apache CouchDB, time to relax."

distclean-local:
	rm -fr $(top_builddir)/etc/couchdb/default.d
	rm -fr $(top_builddir)/etc/couchdb/local.d
	rm -fr $(top_builddir)/tmp
	rm -f  $(top_builddir)/couchdb.stdout
	rm -f  $(top_builddir)/couchdb.stderr

.PHONY: local-clean
local-clean: maintainer-clean
	@echo "This command is intended for maintainers to use;"
	@echo "it deletes files that may need special tools to rebuild."
	rm -f $(top_srcdir)/INSTALL
	rm -f $(top_srcdir)/acinclude.m4
	rm -f $(top_srcdir)/aclocal.m4
	rm -f $(top_srcdir)/config.h.in
	rm -f $(top_srcdir)/configure
	rm -f $(top_srcdir)/test/etap/temp.*
	rm -f $(top_srcdir)/*.tar.gz
	rm -f $(top_srcdir)/*.tar.gz.*
	find $(top_srcdir) -name Makefile.in -exec rm -f {} \;

dist-hook:
	find $(top_srcdir) -type f -name "._*" -exec rm -f {} \;
	find $(top_builddir) -type f -name "._*" -exec rm -f {} \;

distcheck-hook:
	$(MAKE) -C bin distcheck-hook
	$(MAKE) -C src/couchdb/priv distcheck-hook
	$(MAKE) -C share/doc/build distcheck-hook
	grep -rL 'http://www.apache.org/licenses/LICENSE-2.0' * \
	    | grep --include= -vEf $(top_srcdir)/license.skip; \
	    test "$$?" -eq 1
