| # 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. |
| |
| include version.mk |
| |
| REBAR?=$(shell echo `pwd`/bin/rebar) |
| IN_RELEASE = $(shell if [ ! -d .git ]; then echo true; fi) |
| COUCHDB_VERSION_SUFFIX = $(shell if [ -d .git ]; then echo '-`git rev-parse --short --verify HEAD`'; fi) |
| COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch)$(COUCHDB_VERSION_SUFFIX) |
| |
| DESTDIR= |
| |
| # Rebar options |
| apps= |
| skip_deps=folsom,meck,mochiweb,proper,snappy |
| suites= |
| tests= |
| |
| EUNIT_OPTS=$(shell echo "\ |
| apps=$(apps) \ |
| skip_deps=$(skip_deps) \ |
| suites=$(suites) \ |
| tests=$(tests) \ |
| " | sed -e 's/[a-z]\+= / /g') |
| DIALYZE_OPTS=$(shell echo "\ |
| apps=$(apps) \ |
| skip_deps=$(skip_deps) \ |
| " | sed -e 's/[a-z]\+= / /g') |
| |
| |
| ################################################################################ |
| # Main commands |
| ################################################################################ |
| |
| |
| .PHONY: all |
| # target: all - Build everything |
| all: couch fauxton docs |
| |
| |
| .PHONY: help |
| # target: help - Print this help |
| help: |
| @egrep "^# target: " Makefile \ |
| | sed -e 's/^# target: //g' \ |
| | sort \ |
| | awk '{printf(" %-20s", $$1); $$1=$$2=""; print "-" $$0}' |
| |
| |
| ################################################################################ |
| # Building |
| ################################################################################ |
| |
| |
| .PHONY: couch |
| # target: couch - Build CouchDB core |
| couch: config.erl |
| @COUCHDB_VERSION=$(COUCHDB_VERSION) $(REBAR) compile |
| @cp src/couch/priv/couchjs bin/ |
| |
| |
| .PHONY: docs |
| # target: docs - Build documentation |
| ifeq ($(IN_RELEASE), true) |
| docs: share/docs/html |
| else |
| docs: src/docs/build |
| endif |
| |
| .PHONY: fauxton |
| # target: fauxton - Build Fauxton web UI |
| fauxton: share/www |
| |
| |
| ################################################################################ |
| # Testing |
| ################################################################################ |
| |
| |
| .PHONY: check |
| # target: check - Test everything |
| check: all |
| @$(MAKE) eunit |
| @$(MAKE) javascript |
| @$(MAKE) mango-test |
| # @$(MAKE) build-test |
| |
| |
| .PHONY: eunit |
| # target: eunit - Run EUnit tests, use EUNIT_OPTS to provide custom options |
| eunit: export BUILDDIR = $(shell pwd) |
| eunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config |
| eunit: couch |
| @$(REBAR) setup_eunit 2> /dev/null |
| @$(REBAR) -r eunit $(EUNIT_OPTS) |
| |
| .PHONY: soak-eunit |
| soak-eunit: export BUILDDIR = $(shell pwd) |
| soak-eunit: export ERL_AFLAGS = -config $(shell pwd)/rel/files/eunit.config |
| soak-eunit: couch |
| @$(REBAR) setup_eunit 2> /dev/null |
| while [ $$? -eq 0 ] ; do $(REBAR) -r eunit $(EUNIT_OPTS) ; done |
| |
| .PHONY: javascript |
| # target: javascript - Run JavaScript test suites or specific ones defined by suites option |
| javascript: |
| @mkdir -p share/www/script/test |
| ifeq ($(IN_RELEASE), true) |
| @cp test/javascript/tests/lorem*.txt share/www/script/test/ |
| else |
| @mkdir -p src/fauxton/dist/release/test |
| @cp test/javascript/tests/lorem*.txt src/fauxton/dist/release/test/ |
| endif |
| @rm -rf dev/lib |
| @dev/run -n 1 -q --with-admin-party-please \ |
| -c 'startup_jitter=0' \ |
| test/javascript/run $(suites) |
| |
| .PHONY: soak-javascript |
| soak-javascript: |
| @mkdir -p share/www/script/test |
| ifeq ($(IN_RELEASE), true) |
| @cp test/javascript/tests/lorem*.txt share/www/script.test/ |
| else |
| @mkdir -p src/fauxton/dist/release/test |
| @cp test/javascript/tests/lorem*.txt src/fauxton/dist/release/test/ |
| endif |
| @rm -rf dev/lib |
| while [ $$? -eq 0 ]; do \ |
| dev/run -n 1 -q --with-admin-party-please \ |
| -c 'startup_jitter=0' \ |
| test/javascript/run $(suites); \ |
| done |
| |
| .PHONY: check-qs |
| # target: check-qs - Run query server tests (ruby and rspec required!) |
| check-qs: |
| @QS_LANG=js rspec test/view_server/query_server_spec.rb |
| |
| |
| .PHONY: list-eunit-apps |
| # target: list-eunit-apps - List EUnit target apps |
| list-eunit-apps: |
| @find ./src/ -type f -name *_test.erl -o -name *_tests.erl \ |
| | cut -d '/' -f 3 \ |
| | sort -u |
| |
| |
| .PHONY: list-eunit-suites |
| # target: list-eunit-suites - List EUnit target test suites |
| list-eunit-suites: |
| @find ./src/ -type f -name *_test.erl -o -name *_tests.erl -printf "%f\n" \ |
| | cut -d '.' -f -1 \ |
| | sort |
| |
| |
| .PHONY: list-js-suites |
| # target: list-js-suites - List JavaScript test suites |
| list-js-suites: |
| @find ./test/javascript/tests/ -type f -name *.js -printf "%f\n" \ |
| | cut -d '.' -f -1 \ |
| | sort |
| |
| |
| .PHONY: build-test |
| # target: build-test - Test build script |
| build-test: |
| @test/build/test-configure.sh |
| |
| |
| .PHONY: mango-test |
| # target: mango-test - Run Mango tests |
| mango-test: all |
| ./test/build/test-run-couch-for-mango.sh \ |
| |
| |
| ################################################################################ |
| # Developing |
| ################################################################################ |
| |
| |
| .PHONY: build-plt |
| # target: build-plt - Build project-specific PLT |
| build-plt: |
| @$(REBAR) -r build-plt $(DIALYZE_OPTS) |
| |
| |
| .PHONY: check-plt |
| # target: check-plt - Check the PLT for consistency and rebuild it if it is not up-to-date |
| check-plt: |
| @$(REBAR) -r check-plt $(DIALYZE_OPTS) |
| |
| |
| .PHONY: dialyze |
| # target: dialyze - Analyze the code for discrepancies |
| dialyze: .rebar |
| @$(REBAR) -r dialyze $(DIALYZE_OPTS) |
| |
| |
| .PHONY: docker-image |
| # target: docker-image - Build Docker image |
| docker-image: |
| @docker build --rm -t couchdb/dev-cluster . |
| |
| |
| .PHONY: docker-start |
| # target: docker-start - Start CouchDB in Docker container |
| docker-start: |
| @docker run -d -P -t couchdb/dev-cluster > .docker-id |
| |
| |
| .PHONY: docker-stop |
| # target: docker-stop - Stop Docker container |
| docker-stop: |
| @docker stop `cat .docker-id` |
| |
| |
| .PHONY: introspect |
| # target: introspect - Check for commits difference between rebar.config and repository |
| introspect: |
| @$(REBAR) -r update-deps |
| @./introspect |
| |
| ################################################################################ |
| # Distributing |
| ################################################################################ |
| |
| |
| .PHONY: dist |
| # target: dist - Make release tarball |
| dist: all |
| @./build-aux/couchdb-build-release.sh $(COUCHDB_VERSION) |
| |
| @cp -r share/www apache-couchdb-$(COUCHDB_VERSION)/share/ |
| @mkdir -p apache-couchdb-$(COUCHDB_VERSION)/share/docs/html |
| @cp -r src/docs/build/html apache-couchdb-$(COUCHDB_VERSION)/share/docs/ |
| |
| @mkdir -p apache-couchdb-$(COUCHDB_VERSION)/share/docs/man |
| @cp src/docs/build/man/apachecouchdb.1 apache-couchdb-$(COUCHDB_VERSION)/share/docs/man/ |
| |
| @tar czf apache-couchdb-$(COUCHDB_VERSION).tar.gz apache-couchdb-$(COUCHDB_VERSION) |
| @echo "Done: apache-couchdb-$(COUCHDB_VERSION).tar.gz" |
| |
| |
| .PHONY: release |
| # target: release - Create an Erlang release including CouchDB! |
| -include install.mk |
| release: all |
| @echo "Installing CouchDB into rel/couchdb/ ..." |
| @rm -rf rel/couchdb |
| @$(REBAR) generate # make full erlang release |
| |
| ifeq ($(with_fauxton), 1) |
| @mkdir -p rel/couchdb/share/ |
| @cp -R share/www rel/couchdb/share/ |
| endif |
| |
| ifeq ($(with_docs), 1) |
| ifeq ($(IN_RELEASE), true) |
| @mkdir -p rel/couchdb/share/www/docs/ |
| @mkdir -p rel/couchdb/share/docs/ |
| @cp -R share/docs/html/* rel/couchdb/share/www/docs/ |
| @cp share/docs/man/apachecouchdb.1 rel/couchdb/share/docs/couchdb.1 |
| else |
| @mkdir -p rel/couchdb/share/docs/ |
| @cp -R src/docs/build/html/ rel/couchdb/share/www/docs |
| @cp src/docs/build/man/apachecouchdb.1 rel/couchdb/share/docs/couchdb.1 |
| endif |
| endif |
| |
| @echo "... done" |
| @echo |
| @echo " You can now copy the rel/couchdb directory anywhere on your system." |
| @echo " Start CouchDB with ./bin/couchdb from within that directory." |
| @echo |
| |
| .PHONY: install |
| # target: install- install CouchDB :) |
| install: |
| @echo |
| @echo "Notice: There is no 'make install' command for CouchDB 2.x." |
| @echo |
| @echo " To install CouchDB into your system, copy the rel/couchdb" |
| @echo " to your desired installation location. For example:" |
| @echo " cp -r rel/couchdb /usr/local/lib" |
| @echo |
| |
| ################################################################################ |
| # Cleaning |
| ################################################################################ |
| |
| |
| .PHONY: clean |
| # target: clean - Remove build artifacts |
| clean: |
| @$(REBAR) -r clean |
| @rm -rf .rebar/ |
| @rm -f bin/couchjs |
| @rm -rf src/*/ebin |
| @rm -rf src/*/.rebar |
| @rm -rf src/*/priv/*.so |
| @rm -rf src/couch/priv/{couchspawnkillable,couchjs} |
| @rm -rf share/server/main.js share/server/main-coffee.js |
| @rm -rf tmp dev/data dev/lib dev/logs |
| @rm -f src/couch/priv/couchspawnkillable |
| @rm -f src/couch/priv/couch_js/config.h |
| @rm -f dev/boot_node.beam dev/pbkdf2.pyc log/crash.log |
| |
| |
| .PHONY: distclean |
| # target: distclean - Remove build and release artifacts |
| distclean: clean |
| @rm -f install.mk |
| @rm -f config.erl |
| @rm -f rel/couchdb.config |
| ifneq ($(IN_RELEASE), true) |
| # when we are in a release, don’t delete the |
| # copied sources, generated docs, or fauxton |
| @rm -rf rel/couchdb |
| @rm -rf share/www |
| @rm -rf src/docs |
| endif |
| |
| |
| .PHONY: devclean |
| # target: devclean - Remove dev cluster artifacts |
| devclean: |
| @rm -rf dev/lib/*/data |
| |
| |
| .PHONY: uninstall |
| # target: uninstall - Uninstall CouchDB :-( |
| uninstall: |
| @rm -rf $(DESTDIR)/$(install_dir) |
| @rm -f $(DESTDIR)/$(bin_dir)/couchdb |
| @rm -f $(DESTDIR)/$(libexec_dir) |
| @rm -rf $(DESTDIR)/$(sysconf_dir) |
| @rm -rf $(DESTDIR)/$(data_dir) |
| @rm -rf $(DESTDIR)/$(doc_dir) |
| @rm -rf $(DESTDIR)/$(html_dir) |
| @rm -rf $(DESTDIR)/$(man_dir) |
| |
| .PHONY: rc |
| rc: |
| ifeq ($(strip $(COUCH_RC)),) |
| @echo "COUCH_RC environment variable not set. Run as 'COUCH_RC=X make rc'" |
| else |
| @rm -rf apache-couchdb-* |
| @$(MAKE) dist 2>&1 > /dev/null |
| @rm apache-couchdb-*.tar.gz |
| @mv apache-couchdb-* apache-couchdb-2.1.0-RC$(COUCH_RC) |
| @tar czf apache-couchdb-2.1.0-RC$(COUCH_RC).tar.gz apache-couchdb-2.1.0-RC$(COUCH_RC) |
| @echo "Done apache-couchdb-2.1.0-RC$(COUCH_RC).tar.gz" |
| @echo "Here is the list of commits since the last RC" |
| @git log --left-right --graph --cherry-pick --oneline 2.1.0-RC$(shell echo $(COUCH_RC)-1 | bc)...master |
| @echo "Done!" |
| endif |
| |
| ################################################################################ |
| # Misc |
| ################################################################################ |
| |
| |
| .rebar: build-plt |
| |
| config.erl: |
| @echo "Apache CouchDB has not been configured." |
| @echo "Try \"./configure -h\" for help." |
| @echo |
| @false |
| |
| |
| src/docs/build: |
| ifeq ($(with_docs), 1) |
| @cd src/docs; $(MAKE) |
| endif |
| |
| |
| share/www: |
| ifeq ($(with_fauxton), 1) |
| @echo "Building Fauxton" |
| @cd src/fauxton && npm install --production && ./node_modules/grunt-cli/bin/grunt couchdb |
| endif |