diff options
| author | Michael Klishin <michael@novemberain.com> | 2015-10-23 22:17:35 +0300 |
|---|---|---|
| committer | Michael Klishin <michael@novemberain.com> | 2015-10-23 22:17:35 +0300 |
| commit | 644b9b26232d04f8ee3d2091a14a08cca59692a8 (patch) | |
| tree | bfc8e731a93633639118ed12ef410086b9b75bde /Makefile | |
| parent | b7092c79837da3d89a6a11044fdb31c402590e7a (diff) | |
| parent | 6b93fa3a65d74c72d2b9d6de1dada0515e19e28f (diff) | |
| download | rabbitmq-server-git-644b9b26232d04f8ee3d2091a14a08cca59692a8.tar.gz | |
Merge pull request #385 from rabbitmq/erlang.mk
Switch to Erlang.mk
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 734 |
1 files changed, 366 insertions, 368 deletions
@@ -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 |
