summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorMichael Klishin <michael@novemberain.com>2015-10-23 22:17:35 +0300
committerMichael Klishin <michael@novemberain.com>2015-10-23 22:17:35 +0300
commit644b9b26232d04f8ee3d2091a14a08cca59692a8 (patch)
treebfc8e731a93633639118ed12ef410086b9b75bde /Makefile
parentb7092c79837da3d89a6a11044fdb31c402590e7a (diff)
parent6b93fa3a65d74c72d2b9d6de1dada0515e19e28f (diff)
downloadrabbitmq-server-git-644b9b26232d04f8ee3d2091a14a08cca59692a8.tar.gz
Merge pull request #385 from rabbitmq/erlang.mk
Switch to Erlang.mk
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile734
1 files changed, 366 insertions, 368 deletions
diff --git a/Makefile b/Makefile
index a5cfe034a5..921f0098f8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,422 +1,420 @@
-TMPDIR ?= /tmp
-
-RABBITMQ_NODENAME ?= rabbit
-RABBITMQ_SERVER_START_ARGS ?=
-RABBITMQ_MNESIA_DIR ?= $(TMPDIR)/rabbitmq-$(RABBITMQ_NODENAME)-mnesia
-RABBITMQ_PLUGINS_EXPAND_DIR ?= $(TMPDIR)/rabbitmq-$(RABBITMQ_NODENAME)-plugins-scratch
-RABBITMQ_LOG_BASE ?= $(TMPDIR)
-
-DEPS_FILE=deps.mk
-SOURCE_DIR=src
-TEST_DIR=test/src
-EBIN_DIR=ebin
-TEST_EBIN_DIR=test/ebin
-INCLUDE_DIR=include
-DOCS_DIR=docs
-INCLUDES=$(wildcard $(INCLUDE_DIR)/*.hrl) $(INCLUDE_DIR)/rabbit_framing.hrl
-SOURCES=$(wildcard $(SOURCE_DIR)/*.erl) $(SOURCE_DIR)/rabbit_framing_amqp_0_9_1.erl $(SOURCE_DIR)/rabbit_framing_amqp_0_8.erl $(USAGES_ERL)
-TEST_SOURCES=$(wildcard $(TEST_DIR)/*.erl)
-BEAM_TARGETS=$(patsubst $(SOURCE_DIR)/%.erl, $(EBIN_DIR)/%.beam, $(SOURCES))
-TEST_BEAM_TARGETS=$(patsubst $(TEST_DIR)/%.erl, $(TEST_EBIN_DIR)/%.beam, $(TEST_SOURCES))
-TARGETS=$(EBIN_DIR)/rabbit.app $(INCLUDE_DIR)/rabbit_framing.hrl $(BEAM_TARGETS) plugins
-TEST_TARGETS=$(TEST_BEAM_TARGETS)
-WEB_URL=http://www.rabbitmq.com/
-MANPAGES=$(patsubst %.xml, %.gz, $(wildcard $(DOCS_DIR)/*.[0-9].xml))
-WEB_MANPAGES=$(patsubst %.xml, %.man.xml, $(wildcard $(DOCS_DIR)/*.[0-9].xml) $(DOCS_DIR)/rabbitmq-service.xml $(DOCS_DIR)/rabbitmq-echopid.xml)
-USAGES_XML=$(DOCS_DIR)/rabbitmqctl.1.xml $(DOCS_DIR)/rabbitmq-plugins.1.xml
-USAGES_ERL=$(foreach XML, $(USAGES_XML), $(call usage_xml_to_erl, $(XML)))
-
-BASIC_PLT=basic.plt
-RABBIT_PLT=rabbit.plt
+PROJECT = rabbit
+VERSION ?= $(call get_app_version,src/$(PROJECT).app.src)
-ifndef USE_PROPER_QC
-# PropEr needs to be installed for property checking
-# http://proper.softlab.ntua.gr/
-USE_PROPER_QC=$(shell erl -noshell -eval 'io:format({module, proper} =:= code:ensure_loaded(proper)), halt().')
-endif
+DEPS = $(PLUGINS)
-#other args: +native +"{hipe,[o3,verbose]}" -Ddebug=true +debug_info +no_strict_record_tests
-ERLC_OPTS=-I $(INCLUDE_DIR) -Wall +warn_export_vars -v +debug_info $(call boolean_macro,$(USE_SPECS),use_specs) $(call boolean_macro,$(USE_PROPER_QC),use_proper_qc)
-
-# Our type specs rely on dict:dict/0 etc, which are only available in
-# 17.0 upwards.
-define compare_version
-$(shell awk 'BEGIN {
- split("$(1)", v1, "\.");
- version1 = v1[1] * 1000000 + v1[2] * 10000 + v1[3] * 100 + v1[4];
-
- split("$(2)", v2, "\.");
- version2 = v2[1] * 1000000 + v2[2] * 10000 + v2[3] * 100 + v2[4];
-
- if (version1 $(3) version2) {
- print "true";
- } else {
- print "false";
- }
-}')
-endef
+SRCDIST_DEPS ?= rabbitmq_shovel
-ERTS_VER = $(shell erl -version 2>&1 | sed -E 's/.* version //')
-USE_SPECS_MIN_ERTS_VER = 5.11
-ifeq ($(call compare_version,$(ERTS_VER),$(USE_SPECS_MIN_ERTS_VER),>=),true)
-ERLC_OPTS += -Duse_specs
+ifneq ($(IS_DEP),1)
+ifneq ($(filter source-dist packages package-%,$(MAKECMDGOALS)),)
+DEPS += $(SRCDIST_DEPS)
endif
-
-ifdef INSTRUMENT_FOR_QC
-ERLC_OPTS += -DINSTR_MOD=gm_qc
-else
-ERLC_OPTS += -DINSTR_MOD=gm
+ifneq ($(wildcard git-revisions.txt),)
+DEPS += $(SRCDIST_DEPS)
endif
-
-ifdef CREDIT_FLOW_TRACING
-ERLC_OPTS += -DCREDIT_FLOW_TRACING=true
endif
-include version.mk
-
-PLUGINS_SRC_DIR?=$(shell [ -d "plugins-src" ] && echo "plugins-src" || echo )
-PLUGINS_DIR=plugins
-TARBALL_NAME=rabbitmq-server-$(VERSION)
-TARGET_SRC_DIR=dist/$(TARBALL_NAME)
-
-SIBLING_CODEGEN_DIR=../rabbitmq-codegen/
-AMQP_CODEGEN_DIR=$(shell [ -d $(SIBLING_CODEGEN_DIR) ] && echo $(SIBLING_CODEGEN_DIR) || echo codegen)
-AMQP_SPEC_JSON_FILES_0_9_1=$(AMQP_CODEGEN_DIR)/amqp-rabbitmq-0.9.1.json $(AMQP_CODEGEN_DIR)/credit_extension.json
-AMQP_SPEC_JSON_FILES_0_8=$(AMQP_CODEGEN_DIR)/amqp-rabbitmq-0.8.json
-
-ERL_CALL=erl_call -sname $(RABBITMQ_NODENAME) -e
-
-ERL_EBIN=erl -noinput -pa $(EBIN_DIR)
-
define usage_xml_to_erl
- $(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, $(SOURCE_DIR)/rabbit_%_usage.erl, $(subst -,_,$(1))))
+$(subst __,_,$(patsubst $(DOCS_DIR)/rabbitmq%.1.xml, src/rabbit_%_usage.erl, $(subst -,_,$(1))))
endef
define usage_dep
- $(call usage_xml_to_erl, $(1)): $(1) $(DOCS_DIR)/usage.xsl
+$(call usage_xml_to_erl, $(1)):: $(1) $(DOCS_DIR)/usage.xsl
endef
-define boolean_macro
-$(if $(filter true,$(1)),-D$(2))
-endef
+DOCS_DIR = docs
+MANPAGES = $(patsubst %.xml, %, $(wildcard $(DOCS_DIR)/*.[0-9].xml))
+WEB_MANPAGES = $(patsubst %.xml, %.man.xml, $(wildcard $(DOCS_DIR)/*.[0-9].xml) $(DOCS_DIR)/rabbitmq-service.xml $(DOCS_DIR)/rabbitmq-echopid.xml)
+USAGES_XML = $(DOCS_DIR)/rabbitmqctl.1.xml $(DOCS_DIR)/rabbitmq-plugins.1.xml
+USAGES_ERL = $(foreach XML, $(USAGES_XML), $(call usage_xml_to_erl, $(XML)))
-ifneq "$(SBIN_DIR)" ""
-ifneq "$(TARGET_DIR)" ""
-SCRIPTS_REL_PATH=$(shell ./calculate-relative $(TARGET_DIR)/sbin $(SBIN_DIR))
-endif
-endif
+.DEFAULT_GOAL = all
-# Versions prior to this are not supported
-NEED_MAKE := 3.80
-ifneq "$(NEED_MAKE)" "$(firstword $(sort $(NEED_MAKE) $(MAKE_VERSION)))"
-$(error Versions of make prior to $(NEED_MAKE) are not supported)
-endif
+EXTRA_SOURCES += $(USAGES_ERL)
-# .DEFAULT_GOAL introduced in 3.81
-DEFAULT_GOAL_MAKE := 3.81
-ifneq "$(DEFAULT_GOAL_MAKE)" "$(firstword $(sort $(DEFAULT_GOAL_MAKE) $(MAKE_VERSION)))"
-.DEFAULT_GOAL=all
-endif
+$(PROJECT).d:: $(EXTRA_SOURCES)
+
+DEP_PLUGINS = rabbit_common/mk/rabbitmq-run.mk \
+ rabbit_common/mk/rabbitmq-dist.mk
+
+# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
+# reviewed and merged.
+
+ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
+ERLANG_MK_COMMIT = rabbitmq-tmp
-all: $(TARGETS) $(TEST_TARGETS)
+include rabbitmq-components.mk
+include erlang.mk
-.PHONY: plugins check-xref
-ifneq "$(PLUGINS_SRC_DIR)" ""
-plugins:
- [ -d "$(PLUGINS_SRC_DIR)/rabbitmq-server" ] || ln -s "$(CURDIR)" "$(PLUGINS_SRC_DIR)/rabbitmq-server"
- mkdir -p $(PLUGINS_DIR)
- PLUGINS_SRC_DIR="" $(MAKE) -C "$(PLUGINS_SRC_DIR)" plugins-dist PLUGINS_DIST_DIR="$(CURDIR)/$(PLUGINS_DIR)" VERSION=$(VERSION)
- echo "Put your EZs here and use rabbitmq-plugins to enable them." > $(PLUGINS_DIR)/README
- rm -f $(PLUGINS_DIR)/rabbit_common*.ez
+# --------------------------------------------------------------------
+# Compilation.
+# --------------------------------------------------------------------
-# add -q to remove printout of warnings....
-check-xref: $(BEAM_TARGETS) $(PLUGINS_DIR)
- rm -rf lib
- ./check_xref $(PLUGINS_DIR) -q
+RMQ_ERLC_OPTS += -I $(DEPS_DIR)/rabbit_common/include
+ifdef INSTRUMENT_FOR_QC
+RMQ_ERLC_OPTS += -DINSTR_MOD=gm_qc
else
-plugins:
-# Not building plugins
+RMQ_ERLC_OPTS += -DINSTR_MOD=gm
+endif
-check-xref:
- $(info xref checks are disabled as there is no plugins-src directory)
+ifdef CREDIT_FLOW_TRACING
+RMQ_ERLC_OPTS += -DCREDIT_FLOW_TRACING=true
+endif
+ERTS_VER = $(shell erl -version 2>&1 | sed -E 's/.* version //')
+USE_SPECS_MIN_ERTS_VER = 5.11
+ifeq ($(call compare_version,$(ERTS_VER),$(USE_SPECS_MIN_ERTS_VER),>=),true)
+RMQ_ERLC_OPTS += -Duse_specs
endif
-$(DEPS_FILE): $(SOURCES) $(INCLUDES)
- rm -f $@
- echo $(subst : ,:,$(foreach FILE,$^,$(FILE):)) | escript generate_deps $@ $(EBIN_DIR)
-
-$(EBIN_DIR)/rabbit.app: $(EBIN_DIR)/rabbit_app.in $(SOURCES) generate_app
- escript generate_app $< $@ $(SOURCE_DIR)
-
-$(EBIN_DIR)/%.beam: $(SOURCE_DIR)/%.erl | $(DEPS_FILE)
- erlc -o $(EBIN_DIR) $(ERLC_OPTS) -pa $(EBIN_DIR) $<
-
-$(TEST_EBIN_DIR)/%.beam: $(TEST_DIR)/%.erl | $(TEST_EBIN_DIR)
- erlc -o $(TEST_EBIN_DIR) $(ERLC_OPTS) -pa $(EBIN_DIR) -pa $(TEST_EBIN_DIR) $<
-
-$(TEST_EBIN_DIR):
- mkdir -p $(TEST_EBIN_DIR)
-
-$(INCLUDE_DIR)/rabbit_framing.hrl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_FILES_0_9_1) $(AMQP_SPEC_JSON_FILES_0_8)
- ./codegen.py --ignore-conflicts header $(AMQP_SPEC_JSON_FILES_0_9_1) $(AMQP_SPEC_JSON_FILES_0_8) $@
-
-$(SOURCE_DIR)/rabbit_framing_amqp_0_9_1.erl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_FILES_0_9_1)
- ./codegen.py body $(AMQP_SPEC_JSON_FILES_0_9_1) $@
-
-$(SOURCE_DIR)/rabbit_framing_amqp_0_8.erl: codegen.py $(AMQP_CODEGEN_DIR)/amqp_codegen.py $(AMQP_SPEC_JSON_FILES_0_8)
- ./codegen.py body $(AMQP_SPEC_JSON_FILES_0_8) $@
-
-dialyze: $(BEAM_TARGETS) $(BASIC_PLT)
- dialyzer --plt $(BASIC_PLT) --no_native --fullpath \
- $(BEAM_TARGETS)
-
-# rabbit.plt is used by rabbitmq-erlang-client's dialyze make target
-create-plt: $(RABBIT_PLT)
-
-$(RABBIT_PLT): $(BEAM_TARGETS) $(BASIC_PLT)
- dialyzer --plt $(BASIC_PLT) --output_plt $@ --no_native \
- --add_to_plt $(BEAM_TARGETS)
-
-$(BASIC_PLT): $(BEAM_TARGETS)
- if [ -f $@ ]; then \
- touch $@; \
- else \
- dialyzer --output_plt $@ --build_plt \
- --apps erts kernel stdlib compiler sasl os_mon mnesia tools \
- public_key crypto ssl xmerl; \
- fi
-
-clean:
- rm -f $(EBIN_DIR)/*.beam
- rm -f $(EBIN_DIR)/rabbit.app $(EBIN_DIR)/rabbit.boot $(EBIN_DIR)/rabbit.script $(EBIN_DIR)/rabbit.rel
- rm -rf $(TEST_EBIN_DIR)
- rm -f $(PLUGINS_DIR)/*.ez
- [ -d "$(PLUGINS_SRC_DIR)" ] && PLUGINS_SRC_DIR="" PRESERVE_CLONE_DIR=1 make -C $(PLUGINS_SRC_DIR) clean || true
- rm -f $(INCLUDE_DIR)/rabbit_framing.hrl $(SOURCE_DIR)/rabbit_framing_amqp_*.erl codegen.pyc
- rm -f $(DOCS_DIR)/*.[0-9].gz $(DOCS_DIR)/*.man.xml $(DOCS_DIR)/*.erl $(USAGES_ERL)
- rm -f $(RABBIT_PLT)
- rm -f $(DEPS_FILE)
-
-cleandb:
- rm -rf $(RABBITMQ_MNESIA_DIR)/*
-
-############ various tasks to interact with RabbitMQ ###################
-
-BASIC_SCRIPT_ENVIRONMENT_SETTINGS=\
- RABBITMQ_NODE_IP_ADDRESS="$(RABBITMQ_NODE_IP_ADDRESS)" \
- RABBITMQ_NODE_PORT="$(RABBITMQ_NODE_PORT)" \
- RABBITMQ_LOG_BASE="$(RABBITMQ_LOG_BASE)" \
- RABBITMQ_MNESIA_DIR="$(RABBITMQ_MNESIA_DIR)" \
- RABBITMQ_PLUGINS_EXPAND_DIR="$(RABBITMQ_PLUGINS_EXPAND_DIR)"
-
-run: all
- $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \
- RABBITMQ_ALLOW_INPUT=true \
- RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS)" \
- ./scripts/rabbitmq-server
-
-run-background: all
- $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \
- RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS)" \
- ./scripts/rabbitmq-server -detached
-
-run-node: all
- $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \
- RABBITMQ_NODE_ONLY=true \
- RABBITMQ_ALLOW_INPUT=true \
- RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS)" \
- ./scripts/rabbitmq-server
-
-run-background-node: all
- $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \
- RABBITMQ_NODE_ONLY=true \
- RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS)" \
- ./scripts/rabbitmq-server -detached
-
-run-tests: all
- echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL)
- echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL) -n hare || true
- OUT=$$(echo "rabbit_tests:all_tests()." | $(ERL_CALL)) ; \
- echo $$OUT ; echo $$OUT | grep '^{ok, passed}$$' > /dev/null
-
-run-qc: all
- echo 'code:add_path("$(TEST_EBIN_DIR)").' | $(ERL_CALL)
- ./quickcheck $(RABBITMQ_NODENAME) rabbit_backing_queue_qc 100 40
- ./quickcheck $(RABBITMQ_NODENAME) gm_qc 1000 200
-
-start-background-node: all
- -rm -f $(RABBITMQ_MNESIA_DIR).pid
- mkdir -p $(RABBITMQ_MNESIA_DIR)
- $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \
- RABBITMQ_NODE_ONLY=true \
- RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS)" \
- ./scripts/rabbitmq-server \
- > $(RABBITMQ_MNESIA_DIR)/startup_log \
- 2> $(RABBITMQ_MNESIA_DIR)/startup_err &
- ./scripts/rabbitmqctl -n $(RABBITMQ_NODENAME) wait $(RABBITMQ_MNESIA_DIR).pid kernel
-
-start-rabbit-on-node: all
- echo "rabbit:start()." | $(ERL_CALL)
- ./scripts/rabbitmqctl -n $(RABBITMQ_NODENAME) wait $(RABBITMQ_MNESIA_DIR).pid
-
-stop-rabbit-on-node: all
- echo "rabbit:stop()." | $(ERL_CALL)
-
-set-resource-alarm: all
- echo "rabbit_alarm:set_alarm({{resource_limit, $(SOURCE), node()}, []})." | \
- $(ERL_CALL)
-
-clear-resource-alarm: all
- echo "rabbit_alarm:clear_alarm({resource_limit, $(SOURCE), node()})." | \
- $(ERL_CALL)
-
-stop-node:
- -( \
- pid=$$(./scripts/rabbitmqctl -n $(RABBITMQ_NODENAME) eval 'os:getpid().') && \
- $(ERL_CALL) -q && \
- while ps -p $$pid >/dev/null 2>&1; do sleep 1; done \
- )
-
-# code coverage will be created for subdirectory "ebin" of COVER_DIR
-COVER_DIR=.
-
-start-cover: all
- echo "rabbit_misc:start_cover([\"rabbit\", \"hare\"])." | $(ERL_CALL)
- echo "rabbit_misc:enable_cover([\"$(COVER_DIR)\"])." | $(ERL_CALL)
-
-stop-cover: all
- echo "rabbit_misc:report_cover(), cover:stop()." | $(ERL_CALL)
- cat cover/summary.txt
-
-########################################################################
-
-srcdist: distclean
- mkdir -p $(TARGET_SRC_DIR)/codegen
- cp -r ebin src include LICENSE LICENSE-MPL-RabbitMQ INSTALL README $(TARGET_SRC_DIR)
- sed 's/%%VSN%%/$(VERSION)/' $(TARGET_SRC_DIR)/ebin/rabbit_app.in > $(TARGET_SRC_DIR)/ebin/rabbit_app.in.tmp && \
- mv $(TARGET_SRC_DIR)/ebin/rabbit_app.in.tmp $(TARGET_SRC_DIR)/ebin/rabbit_app.in
-
- cp -r $(AMQP_CODEGEN_DIR)/* $(TARGET_SRC_DIR)/codegen/
- cp codegen.py Makefile generate_app generate_deps calculate-relative $(TARGET_SRC_DIR)
-
- echo "VERSION?=${VERSION}" > $(TARGET_SRC_DIR)/version.mk
-
- cp -r scripts $(TARGET_SRC_DIR)
- cp -r $(DOCS_DIR) $(TARGET_SRC_DIR)
- chmod 0755 $(TARGET_SRC_DIR)/scripts/*
-
-ifneq "$(PLUGINS_SRC_DIR)" ""
- cp -r $(PLUGINS_SRC_DIR) $(TARGET_SRC_DIR)/plugins-src
- rm $(TARGET_SRC_DIR)/LICENSE
- cat packaging/common/LICENSE.head >> $(TARGET_SRC_DIR)/LICENSE
- cat $(AMQP_CODEGEN_DIR)/license_info >> $(TARGET_SRC_DIR)/LICENSE
- find $(PLUGINS_SRC_DIR)/licensing -name "license_info_*" -exec cat '{}' >> $(TARGET_SRC_DIR)/LICENSE \;
- cat packaging/common/LICENSE.tail >> $(TARGET_SRC_DIR)/LICENSE
- find $(PLUGINS_SRC_DIR)/licensing -name "LICENSE-*" -exec cp '{}' $(TARGET_SRC_DIR) \;
- rm -rf $(TARGET_SRC_DIR)/licensing
-else
- @echo No plugins source distribution found
+ifndef USE_PROPER_QC
+# PropEr needs to be installed for property checking
+# http://proper.softlab.ntua.gr/
+USE_PROPER_QC = $(shell $(ERL) -eval 'io:format({module, proper} =:= code:ensure_loaded(proper)), halt().')
+RMQ_ERLC_OPTS += $(if $(filter true,$(USE_PROPER_QC)),-Duse_proper_qc)
endif
- (cd dist; tar -zchf $(TARBALL_NAME).tar.gz $(TARBALL_NAME))
- (cd dist; zip -q -r $(TARBALL_NAME).zip $(TARBALL_NAME))
- rm -rf $(TARGET_SRC_DIR)
+ERLC_OPTS += $(RMQ_ERLC_OPTS)
+
+clean:: clean-extra-sources
+
+clean-extra-sources:
+ $(gen_verbose) rm -f $(EXTRA_SOURCES)
-distclean: clean
- $(MAKE) -C $(AMQP_CODEGEN_DIR) distclean
- rm -rf dist
- find . -regex '.*\(~\|#\|\.swp\|\.dump\)' -exec rm {} \;
+# --------------------------------------------------------------------
+# Tests.
+# --------------------------------------------------------------------
+
+TEST_ERLC_OPTS += $(RMQ_ERLC_OPTS)
+
+# --------------------------------------------------------------------
+# Documentation.
+# --------------------------------------------------------------------
# xmlto can not read from standard input, so we mess with a tmp file.
-%.gz: %.xml $(DOCS_DIR)/examples-to-end.xsl
- xmlto --version | grep -E '^xmlto version 0\.0\.([0-9]|1[1-8])$$' >/dev/null || opt='--stringparam man.indent.verbatims=0' ; \
- xsltproc --novalid $(DOCS_DIR)/examples-to-end.xsl $< > $<.tmp && \
- xmlto -o $(DOCS_DIR) $$opt man $<.tmp && \
- gzip -f $(DOCS_DIR)/`basename $< .xml`
- rm -f $<.tmp
+%: %.xml $(DOCS_DIR)/examples-to-end.xsl
+ $(gen_verbose) xmlto --version | \
+ grep -E '^xmlto version 0\.0\.([0-9]|1[1-8])$$' >/dev/null || \
+ opt='--stringparam man.indent.verbatims=0' ; \
+ xsltproc --novalid $(DOCS_DIR)/examples-to-end.xsl $< > $<.tmp && \
+ (xmlto -o $(DOCS_DIR) $$opt man $< 2>&1 | (grep -qv '^Note: Writing' || :)) && \
+ rm $<.tmp
# Use tmp files rather than a pipeline so that we get meaningful errors
# Do not fold the cp into previous line, it's there to stop the file being
# generated but empty if we fail
-$(SOURCE_DIR)/%_usage.erl:
- xsltproc --novalid --stringparam modulename "`basename $@ .erl`" \
- $(DOCS_DIR)/usage.xsl $< > $@.tmp
- sed -e 's/"/\\"/g' -e 's/%QUOTE%/"/g' $@.tmp > $@.tmp2
- fold -s $@.tmp2 > $@.tmp3
- mv $@.tmp3 $@
+src/%_usage.erl::
+ $(gen_verbose) xsltproc --novalid --stringparam modulename "`basename $@ .erl`" \
+ $(DOCS_DIR)/usage.xsl $< > $@.tmp && \
+ sed -e 's/"/\\"/g' -e 's/%QUOTE%/"/g' $@.tmp > $@.tmp2 && \
+ fold -s $@.tmp2 > $@.tmp3 && \
+ mv $@.tmp3 $@ && \
rm $@.tmp $@.tmp2
# We rename the file before xmlto sees it since xmlto will use the name of
# the file to make internal links.
%.man.xml: %.xml $(DOCS_DIR)/html-to-website-xml.xsl
- cp $< `basename $< .xml`.xml && \
- xmlto xhtml-nochunks `basename $< .xml`.xml ; rm `basename $< .xml`.xml
+ $(gen_verbose) cp $< `basename $< .xml`.xml && \
+ xmlto xhtml-nochunks `basename $< .xml`.xml ; \
+ rm `basename $< .xml`.xml && \
cat `basename $< .xml`.html | \
xsltproc --novalid $(DOCS_DIR)/remove-namespaces.xsl - | \
- xsltproc --novalid --stringparam original `basename $<` $(DOCS_DIR)/html-to-website-xml.xsl - | \
- xmllint --format - > $@
+ xsltproc --novalid --stringparam original `basename $<` $(DOCS_DIR)/html-to-website-xml.xsl - | \
+ xmllint --format - > $@ && \
rm `basename $< .xml`.html
-docs_all: $(MANPAGES) $(WEB_MANPAGES)
+$(foreach XML,$(USAGES_XML),$(eval $(call usage_dep, $(XML))))
-install: install_bin install_docs
+.PHONY: manpages web-manpages distclean-manpages
+
+docs:: manpages web-manpages
+
+manpages: $(MANPAGES)
+ @:
+
+web-manpages: $(WEB_MANPAGES)
+ @:
+
+distclean:: distclean-manpages
+
+distclean-manpages::
+ $(gen_verbose) rm -f $(MANPAGES) $(WEB_MANPAGES)
+
+# --------------------------------------------------------------------
+# Distribution.
+# --------------------------------------------------------------------
+
+.PHONY: source-dist
+
+SOURCE_DIST_BASE ?= rabbitmq-server
+SOURCE_DIST_SUFFIXES ?= tar.xz zip
+SOURCE_DIST ?= $(SOURCE_DIST_BASE)-$(VERSION)
+
+# The first source distribution file is used by packages: if the archive
+# type changes, you must update all packages' Makefile.
+SOURCE_DIST_FILES = $(addprefix $(SOURCE_DIST).,$(SOURCE_DIST_SUFFIXES))
+
+.PHONY: $(SOURCE_DIST_FILES)
+
+source-dist: $(SOURCE_DIST_FILES)
+ @:
+
+RSYNC ?= rsync
+RSYNC_V_0 =
+RSYNC_V_1 = -v
+RSYNC_V = $(RSYNC_V_$(V))
+RSYNC_FLAGS += -a $(RSYNC_V) \
+ --exclude '.sw?' --exclude '.*.sw?' \
+ --exclude '*.beam' \
+ --exclude '*.pyc' \
+ --exclude '.git*' \
+ --exclude '$(notdir $(ERLANG_MK_TMP))' \
+ --exclude 'ebin' \
+ --exclude 'packaging' \
+ --exclude 'erl_crash.dump' \
+ --exclude 'deps' \
+ --exclude '/$(SOURCE_DIST_BASE)-*' \
+ --delete \
+ --delete-excluded
+
+TAR ?= tar
+TAR_V_0 =
+TAR_V_1 = -v
+TAR_V = $(TAR_V_$(V))
+
+GZIP ?= gzip
+BZIP2 ?= bzip2
+XZ ?= xz
+
+ZIP ?= zip
+ZIP_V_0 = -q
+ZIP_V_1 =
+ZIP_V = $(ZIP_V_$(V))
+
+.PHONY: $(SOURCE_DIST)
+
+$(SOURCE_DIST): $(ERLANG_MK_RECURSIVE_DEPS_LIST)
+ $(gen_verbose) $(RSYNC) $(RSYNC_FLAGS) ./ $(SOURCE_DIST)/
+ $(verbose) cat packaging/common/LICENSE.head > $(SOURCE_DIST)/LICENSE
+ $(verbose) mkdir -p $(SOURCE_DIST)/deps
+ $(verbose) for dep in $$(cat $(ERLANG_MK_RECURSIVE_DEPS_LIST)); do \
+ $(RSYNC) $(RSYNC_FLAGS) \
+ $$dep \
+ $(SOURCE_DIST)/deps; \
+ if test -f $(SOURCE_DIST)/deps/$$(basename $$dep)/erlang.mk; then \
+ sed -E -i.bak -e 's,^include[[:blank:]]+$(abspath erlang.mk),include ../../erlang.mk,' \
+ $(SOURCE_DIST)/deps/$$(basename $$dep)/erlang.mk; \
+ rm $(SOURCE_DIST)/deps/$$(basename $$dep)/erlang.mk.bak; \
+ fi; \
+ if test -f "$$dep/license_info"; then \
+ cat "$$dep/license_info" >> $(SOURCE_DIST)/LICENSE; \
+ fi; \
+ done
+ $(verbose) cat packaging/common/LICENSE.tail >> $(SOURCE_DIST)/LICENSE
+ $(verbose) for file in $$(find $(SOURCE_DIST) -name '*.app.src'); do \
+ sed -E -i.bak -e 's/[{]vsn[[:blank:]]*,[^}]+}/{vsn, "$(VERSION)"}/' $$file; \
+ rm $$file.bak; \
+ done
+ $(verbose) echo "rabbit $$(git rev-parse HEAD) $$(git describe --tags --exact-match 2>/dev/null || git symbolic-ref -q --short HEAD)" > $(SOURCE_DIST)/git-revisions.txt
+ $(verbose) for dep in $$(cat $(ERLANG_MK_RECURSIVE_DEPS_LIST)); do \
+ (cd $$dep; echo "$$(basename "$$dep") $$(git rev-parse HEAD) $$(git describe --tags --exact-match 2>/dev/null || git symbolic-ref -q --short HEAD)") >> $(SOURCE_DIST)/git-revisions.txt; \
+ done
-install_bin: all install_dirs
- cp -r ebin include LICENSE* INSTALL $(TARGET_DIR)
+$(SOURCE_DIST).tar.gz: $(SOURCE_DIST)
+ $(gen_verbose) $(TAR) -cf - $(TAR_V) $(SOURCE_DIST) | $(GZIP) --best > $@
- chmod 0755 scripts/*
- for script in rabbitmq-env rabbitmq-server rabbitmqctl rabbitmq-plugins rabbitmq-defaults; do \
- cp scripts/$$script $(TARGET_DIR)/sbin; \
- [ -e $(SBIN_DIR)/$$script ] || ln -s $(SCRIPTS_REL_PATH)/$$script $(SBIN_DIR)/$$script; \
- done
+$(SOURCE_DIST).tar.bz2: $(SOURCE_DIST)
+ $(gen_verbose) $(TAR) -cf - $(TAR_V) $(SOURCE_DIST) | $(BZIP2) > $@
- mkdir -p $(TARGET_DIR)/$(PLUGINS_DIR)
- [ -d "$(PLUGINS_DIR)" ] && cp $(PLUGINS_DIR)/*.ez $(PLUGINS_DIR)/README $(TARGET_DIR)/$(PLUGINS_DIR) || true
+$(SOURCE_DIST).tar.xz: $(SOURCE_DIST)
+ $(gen_verbose) $(TAR) -cf - $(TAR_V) $(SOURCE_DIST) | $(XZ) > $@
-install_docs: docs_all install_dirs
- for section in 1 5; do \
- mkdir -p $(MAN_DIR)/man$$section; \
- for manpage in $(DOCS_DIR)/*.$$section.gz; do \
- cp $$manpage $(MAN_DIR)/man$$section; \
- done; \
- done
- if test "$(DOC_INSTALL_DIR)"; then \
- cp $(DOCS_DIR)/rabbitmq.config.example $(DOC_INSTALL_DIR)/rabbitmq.config.example; \
- fi
-
-install_dirs:
- @ OK=true && \
- { [ -n "$(TARGET_DIR)" ] || { echo "Please set TARGET_DIR."; OK=false; }; } && \
- { [ -n "$(SBIN_DIR)" ] || { echo "Please set SBIN_DIR."; OK=false; }; } && \
- { [ -n "$(MAN_DIR)" ] || { echo "Please set MAN_DIR."; OK=false; }; } && $$OK
-
- mkdir -p $(TARGET_DIR)/sbin
- mkdir -p $(SBIN_DIR)
- mkdir -p $(MAN_DIR)
- if test "$(DOC_INSTALL_DIR)"; then \
- mkdir -p $(DOC_INSTALL_DIR); \
- fi
+$(SOURCE_DIST).zip: $(SOURCE_DIST)
+ $(verbose) rm -f $@
+ $(gen_verbose) $(ZIP) -r $(ZIP_V) $@ $(SOURCE_DIST)
-$(foreach XML,$(USAGES_XML),$(eval $(call usage_dep, $(XML))))
+clean:: clean-source-dist
-# Note that all targets which depend on clean must have clean in their
-# name. Also any target that doesn't depend on clean should not have
-# clean in its name, unless you know that you don't need any of the
-# automatic dependency generation for that target (e.g. cleandb).
+clean-source-dist:
+ $(gen_verbose) rm -rf -- $(SOURCE_DIST_BASE)-*
-# We want to load the dep file if *any* target *doesn't* contain
-# "clean" - i.e. if removing all clean-like targets leaves something.
+# --------------------------------------------------------------------
+# Installation.
+# --------------------------------------------------------------------
-ifeq "$(MAKECMDGOALS)" ""
-TESTABLEGOALS:=$(.DEFAULT_GOAL)
-else
-TESTABLEGOALS:=$(MAKECMDGOALS)
-endif
+.PHONY: install install-erlapp install-scripts install-bin install-man
+.PHONY: install-windows install-windows-erlapp install-windows-scripts install-windows-docs
-ifneq "$(strip $(patsubst clean%,,$(patsubst %clean,,$(TESTABLEGOALS))))" ""
-include $(DEPS_FILE)
-endif
+DESTDIR ?=
+
+PREFIX ?= /usr/local
+WINDOWS_PREFIX ?= rabbitmq-server-windows-$(VERSION)
+
+MANDIR ?= $(PREFIX)/share/man
+RMQ_ROOTDIR ?= $(PREFIX)/lib/erlang
+RMQ_BINDIR ?= $(RMQ_ROOTDIR)/bin
+RMQ_LIBDIR ?= $(RMQ_ROOTDIR)/lib
+RMQ_ERLAPP_DIR ?= $(RMQ_LIBDIR)/rabbitmq_server-$(VERSION)
+
+SCRIPTS = rabbitmq-defaults \
+ rabbitmq-env \
+ rabbitmq-server \
+ rabbitmqctl \
+ rabbitmq-plugins
+
+WINDOWS_SCRIPTS = rabbitmq-defaults.bat \
+ rabbitmq-echopid.bat \
+ rabbitmq-env.bat \
+ rabbitmq-plugins.bat \
+ rabbitmq-server.bat \
+ rabbitmq-service.bat \
+ rabbitmqctl.bat
+
+UNIX_TO_DOS ?= todos
+
+inst_verbose_0 = @echo " INST " $@;
+inst_verbose = $(inst_verbose_$(V))
+
+install: install-erlapp install-scripts
+
+install-erlapp: dist
+ $(verbose) mkdir -p $(DESTDIR)$(RMQ_ERLAPP_DIR)
+ $(inst_verbose) cp -a include ebin plugins LICENSE* INSTALL \
+ $(DESTDIR)$(RMQ_ERLAPP_DIR)
+ $(verbose) echo "Put your EZs here and use rabbitmq-plugins to enable them." \
+ > $(DESTDIR)$(RMQ_ERLAPP_DIR)/plugins/README
+
+ @# rabbitmq-common provides headers too: copy them to
+ @# rabbitmq_server/include.
+ $(verbose) cp -a $(DEPS_DIR)/rabbit_common/include $(DESTDIR)$(RMQ_ERLAPP_DIR)
+
+install-scripts:
+ $(verbose) mkdir -p $(DESTDIR)$(RMQ_ERLAPP_DIR)/sbin
+ $(inst_verbose) for script in $(SCRIPTS); do \
+ cp -a "scripts/$$script" "$(DESTDIR)$(RMQ_ERLAPP_DIR)/sbin"; \
+ chmod 0755 "$(DESTDIR)$(RMQ_ERLAPP_DIR)/sbin/$$script"; \
+ done
+
+# FIXME: We do symlinks to scripts in $(RMQ_ERLAPP_DIR))/sbin but this
+# code assumes a certain hierarchy to make relative symlinks.
+install-bin: install-scripts
+ $(verbose) mkdir -p $(DESTDIR)$(RMQ_BINDIR)
+ $(inst_verbose) for script in $(SCRIPTS); do \
+ test -e $(DESTDIR)$(RMQ_BINDIR)/$$script || \
+ ln -sf ../lib/$(notdir $(RMQ_ERLAPP_DIR))/sbin/$$script \
+ $(DESTDIR)$(RMQ_BINDIR)/$$script; \
+ done
+
+install-man: manpages
+ $(inst_verbose) sections=$$(ls -1 docs/*.[1-9] \
+ | sed -E 's/.*\.([1-9])$$/\1/' | uniq | sort); \
+ for section in $$sections; do \
+ mkdir -p $(DESTDIR)$(MANDIR)/man$$section; \
+ for manpage in $(DOCS_DIR)/*.$$section; do \
+ gzip < $$manpage \
+ > $(DESTDIR)$(MANDIR)/man$$section/$$(basename $$manpage).gz; \
+ done; \
+ done
+
+install-windows: install-windows-erlapp install-windows-scripts install-windows-docs
+
+install-windows-erlapp: dist
+ $(verbose) mkdir -p $(DESTDIR)$(WINDOWS_PREFIX)
+ $(inst_verbose) cp -a include ebin plugins LICENSE* INSTALL \
+ $(DESTDIR)$(WINDOWS_PREFIX)
+ $(verbose) echo "Put your EZs here and use rabbitmq-plugins.bat to enable them." \
+ > $(DESTDIR)$(WINDOWS_PREFIX)/plugins/README.txt
+ $(verbose) $(UNIX_TO_DOS) $(DESTDIR)$(WINDOWS_PREFIX)/plugins/README.txt
+
+# rabbitmq-common provides headers too: copy them to
+# rabbitmq_server/include.
+ $(verbose) cp -a $(DEPS_DIR)/rabbit_common/include $(DESTDIR)$(WINDOWS_PREFIX)
+
+install-windows-scripts:
+ $(verbose) mkdir -p $(DESTDIR)$(WINDOWS_PREFIX)/sbin
+ $(inst_verbose) for script in $(WINDOWS_SCRIPTS); do \
+ cp -a "scripts/$$script" "$(DESTDIR)$(WINDOWS_PREFIX)/sbin"; \
+ chmod 0755 "$(DESTDIR)$(WINDOWS_PREFIX)/sbin/$$script"; \
+ done
+
+install-windows-docs: install-windows-erlapp
+ $(verbose) mkdir -p $(DESTDIR)$(WINDOWS_PREFIX)/etc
+ $(inst_verbose) xmlto -o . xhtml-nochunks docs/rabbitmq-service.xml
+ $(verbose) elinks -dump -no-references -no-numbering rabbitmq-service.html \
+ > $(DESTDIR)$(WINDOWS_PREFIX)/readme-service.txt
+ $(verbose) rm rabbitmq-service.html
+ $(verbose) cp -a docs/rabbitmq.config.example $(DESTDIR)$(WINDOWS_PREFIX)/etc
+ $(verbose) for file in $(DESTDIR)$(WINDOWS_PREFIX)/readme-service.txt \
+ $(DESTDIR)$(WINDOWS_PREFIX)/LICENSE* $(DESTDIR)$(WINDOWS_PREFIX)/INSTALL \
+ $(DESTDIR)$(WINDOWS_PREFIX)/etc/rabbitmq.config.example; do \
+ $(UNIX_TO_DOS) "$$file"; \
+ case "$$file" in \
+ *.txt) ;; \
+ *.example) ;; \
+ *) mv "$$file" "$$file.txt" ;; \
+ esac; \
+ done
-.PHONY: run-qc
+# --------------------------------------------------------------------
+# Packaging.
+# --------------------------------------------------------------------
+
+.PHONY: packages package-deb \
+ package-rpm package-rpm-fedora package-rpm-suse \
+ package-windows package-standalone-macosx \
+ package-generic-unix
+
+PACKAGES_DIR ?= $(abspath PACKAGES)
+
+# This variable is exported so sub-make instances know where to find the
+# archive.
+PACKAGES_SOURCE_DIST_FILE ?= $(firstword $(SOURCE_DIST_FILES))
+
+packages: package-deb package-rpm package-windows package-standalone-macosx \
+ package-generic-unix
+ @:
+
+package-deb: $(PACKAGES_SOURCE_DIST_FILE)
+ $(gen_verbose) $(MAKE) -C packaging/debs/Debian \
+ SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE)) \
+ PACKAGES_DIR=$(PACKAGES_DIR) \
+ all clean
+
+package-rpm: package-rpm-fedora package-rpm-suse
+ @:
+
+package-rpm-fedora: $(PACKAGES_SOURCE_DIST_FILE)
+ $(gen_verbose) $(MAKE) -C packaging/RPMS/Fedora \
+ SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE)) \
+ PACKAGES_DIR=$(PACKAGES_DIR) \
+ all clean
+
+package-rpm-suse: $(PACKAGES_SOURCE_DIST_FILE)
+ $(gen_verbose) $(MAKE) -C packaging/RPMS/Fedora \
+ SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE)) \
+ PACKAGES_DIR=$(PACKAGES_DIR) \
+ RPM_OS=suse \
+ all clean
+
+package-windows: $(PACKAGES_SOURCE_DIST_FILE)
+ $(gen_verbose) $(MAKE) -C packaging/windows \
+ SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE)) \
+ PACKAGES_DIR=$(PACKAGES_DIR) \
+ all clean
+ $(verbose) $(MAKE) -C packaging/windows-exe \
+ SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE)) \
+ PACKAGES_DIR=$(PACKAGES_DIR) \
+ all clean
+
+package-standalone-macosx: $(PACKAGES_SOURCE_DIST_FILE)
+ $(gen_verbose) $(MAKE) -C packaging/standalone OS=mac \
+ SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE)) \
+ PACKAGES_DIR=$(PACKAGES_DIR) \
+ all clean
+
+package-generic-unix: $(PACKAGES_SOURCE_DIST_FILE)
+ $(gen_verbose) $(MAKE) -C packaging/generic-unix \
+ SOURCE_DIST_FILE=$(abspath $(PACKAGES_SOURCE_DIST_FILE)) \
+ PACKAGES_DIR=$(PACKAGES_DIR) \
+ all clean