1 ifeq ($(.DEFAULT_GOAL),)
2 # Define default goal to `all` because this file defines some targets
3 # before the inclusion of erlang.mk leading to the wrong target becoming
8 # PROJECT_VERSION defaults to:
9 # 1. the version exported by rabbitmq-server-release;
10 # 2. the version stored in `git-revisions.txt`, if it exists;
11 # 3. a version based on git-describe(1), if it is a Git clone;
14 PROJECT_VERSION := $(RABBITMQ_VERSION)
16 ifeq ($(PROJECT_VERSION),)
17 PROJECT_VERSION := $(shell \
18 if test -f git-revisions.txt; then \
19 head -n1 git-revisions.txt | \
20 awk '{print $$$(words $(PROJECT_DESCRIPTION) version);}'; \
22 (git describe --dirty --abbrev=7 --tags --always --first-parent \
23 2>/dev/null || echo rabbitmq_v0_0_0) | \
24 sed -e 's/^rabbitmq_v//' -e 's/^v//' -e 's/_/./g' -e 's/-/+/' \
29 # --------------------------------------------------------------------
30 # RabbitMQ components.
31 # --------------------------------------------------------------------
33 # For RabbitMQ repositories, we want to checkout branches which match
34 # the parent project. For instance, if the parent project is on a
35 # release tag, dependencies must be on the same release tag. If the
36 # parent project is on a topic branch, dependencies must be on the same
37 # topic branch or fallback to `stable` or `master` whichever was the
38 # base of the topic branch.
40 dep_amqp_client = git_rmq rabbitmq-erlang-client $(current_rmq_ref) $(base_rmq_ref) master
41 dep_amqp10_client = git_rmq rabbitmq-amqp1.0-client $(current_rmq_ref) $(base_rmq_ref) master
42 dep_amqp10_common = git_rmq rabbitmq-amqp1.0-common $(current_rmq_ref) $(base_rmq_ref) master
43 dep_rabbit = git_rmq rabbitmq-server $(current_rmq_ref) $(base_rmq_ref) master
44 dep_rabbit_common = git_rmq rabbitmq-common $(current_rmq_ref) $(base_rmq_ref) master
45 dep_rabbitmq_amqp1_0 = git_rmq rabbitmq-amqp1.0 $(current_rmq_ref) $(base_rmq_ref) master
46 dep_rabbitmq_auth_backend_amqp = git_rmq rabbitmq-auth-backend-amqp $(current_rmq_ref) $(base_rmq_ref) master
47 dep_rabbitmq_auth_backend_cache = git_rmq rabbitmq-auth-backend-cache $(current_rmq_ref) $(base_rmq_ref) master
48 dep_rabbitmq_auth_backend_http = git_rmq rabbitmq-auth-backend-http $(current_rmq_ref) $(base_rmq_ref) master
49 dep_rabbitmq_auth_backend_ldap = git_rmq rabbitmq-auth-backend-ldap $(current_rmq_ref) $(base_rmq_ref) master
50 dep_rabbitmq_auth_mechanism_ssl = git_rmq rabbitmq-auth-mechanism-ssl $(current_rmq_ref) $(base_rmq_ref) master
51 dep_rabbitmq_aws = git_rmq rabbitmq-aws $(current_rmq_ref) $(base_rmq_ref) master
52 dep_rabbitmq_boot_steps_visualiser = git_rmq rabbitmq-boot-steps-visualiser $(current_rmq_ref) $(base_rmq_ref) master
53 dep_rabbitmq_clusterer = git_rmq rabbitmq-clusterer $(current_rmq_ref) $(base_rmq_ref) master
54 dep_rabbitmq_cli = git_rmq rabbitmq-cli $(current_rmq_ref) $(base_rmq_ref) master
55 dep_rabbitmq_codegen = git_rmq rabbitmq-codegen $(current_rmq_ref) $(base_rmq_ref) master
56 dep_rabbitmq_consistent_hash_exchange = git_rmq rabbitmq-consistent-hash-exchange $(current_rmq_ref) $(base_rmq_ref) master
57 dep_rabbitmq_ct_client_helpers = git_rmq rabbitmq-ct-client-helpers $(current_rmq_ref) $(base_rmq_ref) master
58 dep_rabbitmq_ct_helpers = git_rmq rabbitmq-ct-helpers $(current_rmq_ref) $(base_rmq_ref) master
59 dep_rabbitmq_delayed_message_exchange = git_rmq rabbitmq-delayed-message-exchange $(current_rmq_ref) $(base_rmq_ref) master
60 dep_rabbitmq_dotnet_client = git_rmq rabbitmq-dotnet-client $(current_rmq_ref) $(base_rmq_ref) master
61 dep_rabbitmq_event_exchange = git_rmq rabbitmq-event-exchange $(current_rmq_ref) $(base_rmq_ref) master
62 dep_rabbitmq_federation = git_rmq rabbitmq-federation $(current_rmq_ref) $(base_rmq_ref) master
63 dep_rabbitmq_federation_management = git_rmq rabbitmq-federation-management $(current_rmq_ref) $(base_rmq_ref) master
64 dep_rabbitmq_java_client = git_rmq rabbitmq-java-client $(current_rmq_ref) $(base_rmq_ref) master
65 dep_rabbitmq_jms_client = git_rmq rabbitmq-jms-client $(current_rmq_ref) $(base_rmq_ref) master
66 dep_rabbitmq_jms_cts = git_rmq rabbitmq-jms-cts $(current_rmq_ref) $(base_rmq_ref) master
67 dep_rabbitmq_jms_topic_exchange = git_rmq rabbitmq-jms-topic-exchange $(current_rmq_ref) $(base_rmq_ref) master
68 dep_rabbitmq_lvc_exchange = git_rmq rabbitmq-lvc-exchange $(current_rmq_ref) $(base_rmq_ref) master
69 dep_rabbitmq_management = git_rmq rabbitmq-management $(current_rmq_ref) $(base_rmq_ref) master
70 dep_rabbitmq_management_agent = git_rmq rabbitmq-management-agent $(current_rmq_ref) $(base_rmq_ref) master
71 dep_rabbitmq_management_exchange = git_rmq rabbitmq-management-exchange $(current_rmq_ref) $(base_rmq_ref) master
72 dep_rabbitmq_management_themes = git_rmq rabbitmq-management-themes $(current_rmq_ref) $(base_rmq_ref) master
73 dep_rabbitmq_management_visualiser = git_rmq rabbitmq-management-visualiser $(current_rmq_ref) $(base_rmq_ref) master
74 dep_rabbitmq_message_timestamp = git_rmq rabbitmq-message-timestamp $(current_rmq_ref) $(base_rmq_ref) master
75 dep_rabbitmq_metronome = git_rmq rabbitmq-metronome $(current_rmq_ref) $(base_rmq_ref) master
76 dep_rabbitmq_mqtt = git_rmq rabbitmq-mqtt $(current_rmq_ref) $(base_rmq_ref) master
77 dep_rabbitmq_objc_client = git_rmq rabbitmq-objc-client $(current_rmq_ref) $(base_rmq_ref) master
78 dep_rabbitmq_peer_discovery_aws = git_rmq rabbitmq-peer-discovery-aws $(current_rmq_ref) $(base_rmq_ref) master
79 dep_rabbitmq_peer_discovery_common = git_rmq rabbitmq-peer-discovery-common $(current_rmq_ref) $(base_rmq_ref) master
80 dep_rabbitmq_peer_discovery_consul = git_rmq rabbitmq-peer-discovery-consul $(current_rmq_ref) $(base_rmq_ref) master
81 dep_rabbitmq_peer_discovery_etcd = git_rmq rabbitmq-peer-discovery-etcd $(current_rmq_ref) $(base_rmq_ref) master
82 dep_rabbitmq_peer_discovery_k8s = git_rmq rabbitmq-peer-discovery-k8s $(current_rmq_ref) $(base_rmq_ref) master
83 dep_rabbitmq_random_exchange = git_rmq rabbitmq-random-exchange $(current_rmq_ref) $(base_rmq_ref) master
84 dep_rabbitmq_recent_history_exchange = git_rmq rabbitmq-recent-history-exchange $(current_rmq_ref) $(base_rmq_ref) master
85 dep_rabbitmq_routing_node_stamp = git_rmq rabbitmq-routing-node-stamp $(current_rmq_ref) $(base_rmq_ref) master
86 dep_rabbitmq_rtopic_exchange = git_rmq rabbitmq-rtopic-exchange $(current_rmq_ref) $(base_rmq_ref) master
87 dep_rabbitmq_server_release = git_rmq rabbitmq-server-release $(current_rmq_ref) $(base_rmq_ref) master
88 dep_rabbitmq_sharding = git_rmq rabbitmq-sharding $(current_rmq_ref) $(base_rmq_ref) master
89 dep_rabbitmq_shovel = git_rmq rabbitmq-shovel $(current_rmq_ref) $(base_rmq_ref) master
90 dep_rabbitmq_shovel_management = git_rmq rabbitmq-shovel-management $(current_rmq_ref) $(base_rmq_ref) master
91 dep_rabbitmq_stomp = git_rmq rabbitmq-stomp $(current_rmq_ref) $(base_rmq_ref) master
92 dep_rabbitmq_toke = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
93 dep_rabbitmq_top = git_rmq rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
94 dep_rabbitmq_tracing = git_rmq rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
95 dep_rabbitmq_trust_store = git_rmq rabbitmq-trust-store $(current_rmq_ref) $(base_rmq_ref) master
96 dep_rabbitmq_test = git_rmq rabbitmq-test $(current_rmq_ref) $(base_rmq_ref) master
97 dep_rabbitmq_web_dispatch = git_rmq rabbitmq-web-dispatch $(current_rmq_ref) $(base_rmq_ref) master
98 dep_rabbitmq_web_stomp = git_rmq rabbitmq-web-stomp $(current_rmq_ref) $(base_rmq_ref) master
99 dep_rabbitmq_web_stomp_examples = git_rmq rabbitmq-web-stomp-examples $(current_rmq_ref) $(base_rmq_ref) master
100 dep_rabbitmq_web_mqtt = git_rmq rabbitmq-web-mqtt $(current_rmq_ref) $(base_rmq_ref) master
101 dep_rabbitmq_web_mqtt_examples = git_rmq rabbitmq-web-mqtt-examples $(current_rmq_ref) $(base_rmq_ref) master
102 dep_rabbitmq_website = git_rmq rabbitmq-website $(current_rmq_ref) $(base_rmq_ref) live master
103 dep_toke = git_rmq toke $(current_rmq_ref) $(base_rmq_ref) master
105 dep_rabbitmq_public_umbrella = git_rmq rabbitmq-public-umbrella $(current_rmq_ref) $(base_rmq_ref) master
107 # Third-party dependencies version pinning.
109 # We do that in this file, which is copied in all projects, to ensure
110 # all projects use the same versions. It avoids conflicts and makes it
111 # possible to work with rabbitmq-public-umbrella.
113 dep_cowboy = hex 1.0.4
114 dep_ranch = hex 1.3.2
115 dep_recon = hex 2.3.2
117 # Last commit of PropEr supporting Erlang R16B03.
118 dep_proper_commit = 735d972758d8bd85b12483626fe1b66450d6a6fe
119 # Last commit of sockjs support Erlang R16B03 and 17.x.
120 dep_sockjs = git https://github.com/rabbitmq/sockjs-erlang.git 5af2b588c812c318b19bc105b577a759c71c3e0a
122 RABBITMQ_COMPONENTS = amqp_client \
128 rabbitmq_auth_backend_amqp \
129 rabbitmq_auth_backend_cache \
130 rabbitmq_auth_backend_http \
131 rabbitmq_auth_backend_ldap \
132 rabbitmq_auth_mechanism_ssl \
134 rabbitmq_boot_steps_visualiser \
138 rabbitmq_consistent_hash_exchange \
139 rabbitmq_ct_client_helpers \
140 rabbitmq_ct_helpers \
141 rabbitmq_delayed_message_exchange \
142 rabbitmq_dotnet_client \
143 rabbitmq_event_exchange \
144 rabbitmq_federation \
145 rabbitmq_federation_management \
146 rabbitmq_java_client \
147 rabbitmq_jms_client \
149 rabbitmq_jms_topic_exchange \
150 rabbitmq_lvc_exchange \
151 rabbitmq_management \
152 rabbitmq_management_agent \
153 rabbitmq_management_exchange \
154 rabbitmq_management_themes \
155 rabbitmq_management_visualiser \
156 rabbitmq_message_timestamp \
159 rabbitmq_objc_client \
160 rabbitmq_peer_discovery_aws \
161 rabbitmq_peer_discovery_common \
162 rabbitmq_peer_discovery_consul \
163 rabbitmq_peer_discovery_etcd \
164 rabbitmq_peer_discovery_k8s \
165 rabbitmq_random_exchange \
166 rabbitmq_recent_history_exchange \
167 rabbitmq_routing_node_stamp \
168 rabbitmq_rtopic_exchange \
169 rabbitmq_server_release \
172 rabbitmq_shovel_management \
177 rabbitmq_trust_store \
178 rabbitmq_web_dispatch \
180 rabbitmq_web_mqtt_examples \
182 rabbitmq_web_stomp_examples \
185 # Several components have a custom erlang.mk/build.config, mainly
186 # to disable eunit. Therefore, we can't use the top-level project's
188 NO_AUTOPATCH += $(RABBITMQ_COMPONENTS)
190 ifeq ($(origin current_rmq_ref),undefined)
191 ifneq ($(wildcard .git),)
192 current_rmq_ref := $(shell (\
193 ref=$$(LANG=C git branch --list | awk '/^\* \(.*detached / {ref=$$0; sub(/.*detached [^ ]+ /, "", ref); sub(/\)$$/, "", ref); print ref; exit;} /^\* / {ref=$$0; sub(/^\* /, "", ref); print ref; exit}');\
194 if test "$$(git rev-parse --short HEAD)" != "$$ref"; then echo "$$ref"; fi))
196 current_rmq_ref := master
199 export current_rmq_ref
201 ifeq ($(origin base_rmq_ref),undefined)
202 ifneq ($(wildcard .git),)
203 possible_base_rmq_ref := v3.6.x
204 ifeq ($(possible_base_rmq_ref),$(current_rmq_ref))
205 base_rmq_ref := $(current_rmq_ref)
207 base_rmq_ref := $(shell \
208 (git rev-parse --verify -q master >/dev/null && \
209 git rev-parse --verify -q $(possible_base_rmq_ref) >/dev/null && \
210 git merge-base --is-ancestor $$(git merge-base master HEAD) $(possible_base_rmq_ref) && \
211 echo $(possible_base_rmq_ref)) || \
215 base_rmq_ref := master
220 # Repository URL selection.
222 # First, we infer other components' location from the current project
223 # repository URL, if it's a Git repository:
224 # - We take the "origin" remote URL as the base
225 # - The current project name and repository name is replaced by the
226 # target's properties:
227 # eg. rabbitmq-common is replaced by rabbitmq-codegen
228 # eg. rabbit_common is replaced by rabbitmq_codegen
230 # If cloning from this computed location fails, we fallback to RabbitMQ
231 # upstream which is GitHub.
233 # Maccro to transform eg. "rabbit_common" to "rabbitmq-common".
234 rmq_cmp_repo_name = $(word 2,$(dep_$(1)))
236 # Upstream URL for the current project.
237 RABBITMQ_COMPONENT_REPO_NAME := $(call rmq_cmp_repo_name,$(PROJECT))
238 RABBITMQ_UPSTREAM_FETCH_URL ?= https://github.com/rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
239 RABBITMQ_UPSTREAM_PUSH_URL ?= git@github.com:rabbitmq/$(RABBITMQ_COMPONENT_REPO_NAME).git
241 # Current URL for the current project. If this is not a Git clone,
242 # default to the upstream Git repository.
243 ifneq ($(wildcard .git),)
244 git_origin_fetch_url := $(shell git config remote.origin.url)
245 git_origin_push_url := $(shell git config remote.origin.pushurl || git config remote.origin.url)
246 RABBITMQ_CURRENT_FETCH_URL ?= $(git_origin_fetch_url)
247 RABBITMQ_CURRENT_PUSH_URL ?= $(git_origin_push_url)
249 RABBITMQ_CURRENT_FETCH_URL ?= $(RABBITMQ_UPSTREAM_FETCH_URL)
250 RABBITMQ_CURRENT_PUSH_URL ?= $(RABBITMQ_UPSTREAM_PUSH_URL)
253 # Macro to replace the following pattern:
254 # 1. /foo.git -> /bar.git
257 subst_repo_name = $(patsubst %/$(1)/%,%/$(2)/%,$(patsubst %/$(1),%/$(2),$(patsubst %/$(1).git,%/$(2).git,$(3))))
259 # Macro to replace both the project's name (eg. "rabbit_common") and
260 # repository name (eg. "rabbitmq-common") by the target's equivalent.
262 # This macro is kept on one line because we don't want whitespaces in
263 # the returned value, as it's used in $(dep_fetch_git_rmq) in a shell
264 # single-quoted string.
265 dep_rmq_repo = $(if $(dep_$(2)),$(call subst_repo_name,$(PROJECT),$(2),$(call subst_repo_name,$(RABBITMQ_COMPONENT_REPO_NAME),$(call rmq_cmp_repo_name,$(2)),$(1))),$(pkg_$(1)_repo))
267 dep_rmq_commits = $(if $(dep_$(1)), \
268 $(wordlist 3,$(words $(dep_$(1))),$(dep_$(1))), \
271 define dep_fetch_git_rmq
272 fetch_url1='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_FETCH_URL),$(1))'; \
273 fetch_url2='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_FETCH_URL),$(1))'; \
274 if test "$$$$fetch_url1" != '$(RABBITMQ_CURRENT_FETCH_URL)' && \
275 git clone -q -n -- "$$$$fetch_url1" $(DEPS_DIR)/$(call dep_name,$(1)); then \
276 fetch_url="$$$$fetch_url1"; \
277 push_url='$(call dep_rmq_repo,$(RABBITMQ_CURRENT_PUSH_URL),$(1))'; \
278 elif git clone -q -n -- "$$$$fetch_url2" $(DEPS_DIR)/$(call dep_name,$(1)); then \
279 fetch_url="$$$$fetch_url2"; \
280 push_url='$(call dep_rmq_repo,$(RABBITMQ_UPSTREAM_PUSH_URL),$(1))'; \
282 cd $(DEPS_DIR)/$(call dep_name,$(1)) && ( \
283 $(foreach ref,$(call dep_rmq_commits,$(1)), \
284 git checkout -q $(ref) >/dev/null 2>&1 || \
286 (echo "error: no valid pathspec among: $(call dep_rmq_commits,$(1))" \
287 1>&2 && false) ) && \
288 (test "$$$$fetch_url" = "$$$$push_url" || \
289 git remote set-url --push origin "$$$$push_url")
292 # --------------------------------------------------------------------
293 # Component distribution.
294 # --------------------------------------------------------------------
302 # --------------------------------------------------------------------
303 # rabbitmq-components.mk checks.
304 # --------------------------------------------------------------------
306 # If this project is under the Umbrella project, we override $(DEPS_DIR)
307 # to point to the Umbrella's one. We also disable `make distclean` so
308 # $(DEPS_DIR) is not accidentally removed.
310 ifneq ($(wildcard ../../UMBRELLA.md),)
312 else ifneq ($(wildcard UMBRELLA.md),)
316 ifeq ($(UNDER_UMBRELLA),1)
317 ifneq ($(PROJECT),rabbitmq_public_umbrella)
318 DEPS_DIR ?= $(abspath ..)
321 ifneq ($(filter distclean distclean-deps,$(MAKECMDGOALS)),)
326 UPSTREAM_RMQ_COMPONENTS_MK = $(DEPS_DIR)/rabbit_common/mk/rabbitmq-components.mk
328 ifeq ($(PROJECT),rabbit_common)
329 check-rabbitmq-components.mk:
332 check-rabbitmq-components.mk:
333 $(verbose) cmp -s rabbitmq-components.mk \
334 $(UPSTREAM_RMQ_COMPONENTS_MK) || \
335 (echo "error: rabbitmq-components.mk must be updated!" 1>&2; \
339 ifeq ($(PROJECT),rabbit_common)
340 rabbitmq-components-mk:
343 rabbitmq-components-mk:
344 $(gen_verbose) cp -a $(UPSTREAM_RMQ_COMPONENTS_MK) .
345 ifeq ($(DO_COMMIT),yes)
346 $(verbose) git diff --quiet rabbitmq-components.mk \
347 || git commit -m 'Update rabbitmq-components.mk' rabbitmq-components.mk