1 REBAR = @ESCRIPT@ rebar
7 exec_prefix = @exec_prefix@
12 ETCDIR = $(DESTDIR)@sysconfdir@/ejabberd
15 BINDIR = $(DESTDIR)@bindir@
18 SBINDIR = $(DESTDIR)@sbindir@
21 LIBDIR = $(DESTDIR)@libdir@
24 EJABBERDDIR = $(DESTDIR)@libdir@/ejabberd
27 PACKAGE_TARNAME = @PACKAGE_TARNAME@
28 datarootdir = @datarootdir@
29 DOCDIR = $(DESTDIR)@docdir@
31 # /usr/lib/ejabberd/ebin/
32 BEAMDIR = $(EJABBERDDIR)/ebin
34 # /usr/lib/ejabberd/include/
35 INCLUDEDIR = $(EJABBERDDIR)/include
37 # /usr/lib/ejabberd/priv/
38 PRIVDIR = $(EJABBERDDIR)/priv
40 # /usr/lib/ejabberd/priv/bin
41 PBINDIR = $(PRIVDIR)/bin
43 # /usr/lib/ejabberd/priv/lib
44 SODIR = $(PRIVDIR)/lib
46 # /usr/lib/ejabberd/priv/msgs
47 MSGSDIR = $(PRIVDIR)/msgs
49 # /usr/lib/ejabberd/priv/css
50 CSSDIR = $(PRIVDIR)/css
52 # /usr/lib/ejabberd/priv/img
53 IMGDIR = $(PRIVDIR)/img
55 # /usr/lib/ejabberd/priv/js
58 # /usr/lib/ejabberd/priv/sql
59 SQLDIR = $(PRIVDIR)/sql
61 # /usr/lib/ejabberd/priv/lua
62 LUADIR = $(PRIVDIR)/lua
65 SPOOLDIR = $(DESTDIR)@localstatedir@/lib/ejabberd
67 # /var/lock/ejabberdctl
68 CTLLOCKDIR = $(DESTDIR)@localstatedir@/lock/ejabberdctl
70 # /var/lib/ejabberd/.erlang.cookie
71 COOKIEFILE = $(SPOOLDIR)/.erlang.cookie
74 LOGDIR = $(DESTDIR)@localstatedir@/log/ejabberd
76 INSTALLUSER=@INSTALLUSER@
77 # if no user was enabled, don't set privileges or ownership
78 ifeq ($(INSTALLUSER),)
82 CHOWN_OUTPUT=/dev/null
85 O_USER=-o $(INSTALLUSER)
86 G_USER=-g $(INSTALLUSER)
89 INIT_USER=$(INSTALLUSER)
91 # if no group was enabled, don't set privileges or ownership
92 INSTALLGROUP=@INSTALLGROUP@
93 ifneq ($(INSTALLGROUP),)
94 G_USER=-g $(INSTALLGROUP)
105 $(REBAR) get-deps && :> deps/.got
107 deps/.built: deps/.got
108 $(REBAR) configure-deps
109 $(REBAR) compile && :> deps/.built
112 $(REBAR) skip_deps=true compile
117 $(REBAR) update-deps && :> deps/.got
120 $(REBAR) skip_deps=true xref
123 tools/hook_deps.sh ebin
126 tools/opt_types.sh ejabberd_option ebin
132 $(ERL) -noinput +B -eval \
133 'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.'
135 JOIN_PATHS=$(if $(wordlist 2,1000,$(1)),$(firstword $(1))/$(call JOIN_PATHS,$(wordlist 2,1000,$(1))),$(1))
137 VERSIONED_DEP=$(if $(DEP_$(1)_VERSION),$(DEP_$(1)_VERSION),$(1))
139 ELIXIR_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 5,1000,$(1))
140 DEPS_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,$(word 2,$(1))) $(wordlist 3,1000,$(1))
141 MAIN_TO_DEST=$(LIBDIR) $(call VERSIONED_DEP,ejabberd) $(1)
142 TO_DEST_SINGLE=$(if $(subst XdepsX,,X$(word 1,$(1))X),$(call MAIN_TO_DEST,$(1)),$(if $(subst XlibX,,X$(word 3,$(1))X),$(call DEPS_TO_DEST,$(1)),$(call ELIXIR_TO_DEST,$(1))))
143 TO_DEST=$(foreach path,$(1),$(call JOIN_PATHS,$(call TO_DEST_SINGLE,$(subst /, ,$(path)))))
145 FILTER_DIRS=$(foreach path,$(1),$(if $(wildcard $(path)/*),,$(path)))
146 FILES_WILDCARD=$(call FILTER_DIRS,$(foreach w,$(1),$(wildcard $(w))))
148 ifeq ($(MAKECMDGOALS),copy-files-sub)
150 DEPS:=$(sort $(shell $(REBAR) -q list-deps|$(SED) -ne '/ TAG / s/ .*// p; / REV / s/ .*// p; / BRANCH / s/ .*// p'))
152 DEPS_FILES=$(call FILES_WILDCARD,$(foreach DEP,$(DEPS),deps/$(DEP)/ebin/*.beam deps/$(DEP)/ebin/*.app deps/$(DEP)/priv/* deps/$(DEP)/priv/lib/* deps/$(DEP)/priv/bin/* deps/$(DEP)/include/*.hrl deps/$(DEP)/COPY* deps/$(DEP)/LICENSE* deps/$(DEP)/lib/*/ebin/*.beam deps/$(DEP)/lib/*/ebin/*.app))
154 BINARIES=deps/epam/priv/bin/epam deps/eimp/priv/bin/eimp deps/fs/priv/mac_listener
156 DEPS_FILES_FILTERED=$(filter-out $(BINARIES) deps/elixir/ebin/elixir.app,$(DEPS_FILES))
157 DEPS_DIRS=$(sort deps/ $(foreach DEP,$(DEPS),deps/$(DEP)/) $(dir $(DEPS_FILES)))
159 MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,ebin/*.beam ebin/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* include/*.hrl COPYING))
160 MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql priv/lua)
162 define DEP_VERSION_template
163 DEP_$(1)_VERSION:=$(shell $(SED) -e '/vsn/!d;s/.*, *"/$(1)-/;s/".*//' $(2) 2>/dev/null)
166 DELETE_TARGET_SO=$(if $(subst X.soX,,X$(suffix $(1))X),,rm -f $(call TO_DEST,$(1));)
168 $(foreach DEP,$(DEPS),$(eval $(call DEP_VERSION_template,$(DEP),deps/$(DEP)/ebin/$(DEP).app)))
169 $(eval $(call DEP_VERSION_template,ejabberd,ebin/ejabberd.app))
172 $(call TO_DEST,$(1)): $(1) $(call TO_DEST,$(dir $(1))) ; $(call DELETE_TARGET_SO, $(1)) $$(INSTALL) -m 644 $(1) $(call TO_DEST,$(1))
175 define COPY_BINARY_template
176 $(call TO_DEST,$(1)): $(1) $(call TO_DEST,$(dir $(1))) ; rm -f $(call TO_DEST,$(1)); $$(INSTALL) -m 755 $$(O_USER) $(1) $(call TO_DEST,$(1))
179 $(foreach file,$(DEPS_FILES_FILTERED) $(MAIN_FILES),$(eval $(call COPY_template,$(file))))
181 $(foreach file,$(BINARIES),$(eval $(call COPY_BINARY_template,$(file))))
183 $(sort $(call TO_DEST,$(MAIN_DIRS) $(DEPS_DIRS))):
186 $(call TO_DEST,priv/sql/lite.sql): sql/lite.sql $(call TO_DEST,priv/sql)
187 $(INSTALL) -m 644 $< $@
189 $(call TO_DEST,priv/bin/captcha.sh): tools/captcha.sh $(call TO_DEST,priv/bin)
190 $(INSTALL) -m 755 $(O_USER) $< $@
192 $(call TO_DEST,priv/lua/redis_sm.lua): priv/lua/redis_sm.lua $(call TO_DEST,priv/lua)
193 $(INSTALL) -m 644 $< $@
195 copy-files-sub2: $(call TO_DEST,$(DEPS_FILES) $(MAIN_FILES) priv/bin/captcha.sh priv/sql/lite.sql priv/lua/redis_sm.lua)
197 .PHONY: $(call TO_DEST,$(DEPS_FILES) $(MAIN_DIRS) $(DEPS_DIRS))
202 $(MAKE) copy-files-sub
204 copy-files-sub: copy-files-sub2
206 install: all copy-files
208 # Configuration files
209 $(INSTALL) -d -m 750 $(G_USER) $(ETCDIR)
210 [ -f $(ETCDIR)/ejabberd.yml ] \
211 && $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml-new \
212 || $(INSTALL) -b -m 640 $(G_USER) ejabberd.yml.example $(ETCDIR)/ejabberd.yml
213 $(SED) -e "s*{{rootdir}}*@prefix@*g" \
214 -e "s*{{installuser}}*@INSTALLUSER@*g" \
215 -e "s*{{bindir}}*@bindir@*g" \
216 -e "s*{{libdir}}*@libdir@*g" \
217 -e "s*{{sysconfdir}}*@sysconfdir@*g" \
218 -e "s*{{localstatedir}}*@localstatedir@*g" \
219 -e "s*{{docdir}}*@docdir@*g" \
220 -e "s*{{erl}}*@ERL@*g" \
221 -e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
222 > ejabberdctl.example
223 [ -f $(ETCDIR)/ejabberdctl.cfg ] \
224 && $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg-new \
225 || $(INSTALL) -b -m 640 $(G_USER) ejabberdctl.cfg.example $(ETCDIR)/ejabberdctl.cfg
226 $(INSTALL) -b -m 644 $(G_USER) inetrc $(ETCDIR)/inetrc
228 # Administration script
229 [ -d $(SBINDIR) ] || $(INSTALL) -d -m 755 $(SBINDIR)
230 $(INSTALL) -m 550 $(G_USER) ejabberdctl.example $(SBINDIR)/ejabberdctl
232 [ -d $(BINDIR) ] || $(INSTALL) -d -m 755 $(BINDIR)
233 [ -f deps/elixir/bin/iex ] && $(INSTALL) -m 550 $(G_USER) deps/elixir/bin/iex $(BINDIR)/iex || true
234 [ -f deps/elixir/bin/elixir ] && $(INSTALL) -m 550 $(G_USER) deps/elixir/bin/elixir $(BINDIR)/elixir || true
235 [ -f deps/elixir/bin/mix ] && $(INSTALL) -m 550 $(G_USER) deps/elixir/bin/mix $(BINDIR)/mix || true
238 $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" \
239 -e "s*@installuser@*$(INIT_USER)*g" ejabberd.init.template \
241 chmod 755 ejabberd.init
244 $(SED) -e "s*@ctlscriptpath@*$(SBINDIR)*g" ejabberd.service.template \
246 chmod 644 ejabberd.service
249 $(INSTALL) -d -m 750 $(O_USER) $(SPOOLDIR)
250 $(CHOWN_COMMAND) -R @INSTALLUSER@ $(SPOOLDIR) >$(CHOWN_OUTPUT)
251 chmod -R 750 $(SPOOLDIR)
252 [ ! -f $(COOKIEFILE) ] || { $(CHOWN_COMMAND) @INSTALLUSER@ $(COOKIEFILE) >$(CHOWN_OUTPUT) ; chmod 400 $(COOKIEFILE) ; }
254 # ejabberdctl lock directory
255 $(INSTALL) -d -m 750 $(O_USER) $(CTLLOCKDIR)
256 $(CHOWN_COMMAND) -R @INSTALLUSER@ $(CTLLOCKDIR) >$(CHOWN_OUTPUT)
257 chmod -R 750 $(CTLLOCKDIR)
260 $(INSTALL) -d -m 750 $(O_USER) $(LOGDIR)
261 $(CHOWN_COMMAND) -R @INSTALLUSER@ $(LOGDIR) >$(CHOWN_OUTPUT)
262 chmod -R 750 $(LOGDIR)
265 $(INSTALL) -d $(DOCDIR)
266 [ -f doc/guide.html ] \
267 && $(INSTALL) -m 644 doc/guide.html $(DOCDIR) \
268 || echo "Documentation not included in sources"
269 $(INSTALL) -m 644 COPYING $(DOCDIR)
271 uninstall: uninstall-binary
274 rm -f $(SBINDIR)/ejabberdctl
276 rm -f $(BINDIR)/elixir
279 rm -f $(BEAMDIR)/*.beam
280 rm -f $(BEAMDIR)/*.app
282 rm -f $(INCLUDEDIR)/*.hrl
287 rm -f $(MSGSDIR)/*.msg
289 rm -f $(CSSDIR)/*.css
291 rm -f $(IMGDIR)/*.png
295 rm -f $(SQLDIR)/*.sql
297 rm -fr $(LUADIR)/*.lua
300 rm -fr $(EJABBERDDIR)
302 uninstall-all: uninstall-binary
304 rm -rf $(EJABBERDDIR)
318 distclean: clean clean-rel
321 rm -rf autom4te.cache
326 rm -f src/ejabberd.app.src
327 [ ! -f ../ChangeLog ] || rm -f ../ChangeLog
335 Makefile: Makefile.in
337 deps := $(wildcard deps/*/ebin)
341 @dialyzer --build_plt --output_plt dialyzer/erlang.plt \
342 -o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
343 public_key ssl mnesia inets odbc compiler erts \
344 os_mon asn1 syntax_tools; \
345 status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
349 @dialyzer --build_plt --output_plt dialyzer/deps.plt \
350 -o dialyzer/deps.log $(deps); \
351 status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
353 dialyzer/ejabberd.plt:
355 @dialyzer --build_plt --output_plt dialyzer/ejabberd.plt \
356 -o dialyzer/ejabberd.log ebin; \
357 status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
359 erlang_plt: dialyzer/erlang.plt
360 @dialyzer --plt dialyzer/erlang.plt --check_plt -o dialyzer/erlang.log; \
361 status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
363 deps_plt: dialyzer/deps.plt
364 @dialyzer --plt dialyzer/deps.plt --check_plt -o dialyzer/deps.log; \
365 status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
367 ejabberd_plt: dialyzer/ejabberd.plt
368 @dialyzer --plt dialyzer/ejabberd.plt --check_plt -o dialyzer/ejabberd.log; \
369 status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
371 dialyzer: erlang_plt deps_plt ejabberd_plt
372 @dialyzer --plts dialyzer/*.plt --no_check_plt \
373 --get_warnings -o dialyzer/error.log ebin; \
374 status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
377 @echo "************************** NOTICE ***************************************"
379 @echo "*************************************************************************"
380 @cd priv && ln -sf ../sql
381 $(REBAR) skip_deps=true ct
383 .PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean rel \
384 install uninstall uninstall-binary uninstall-all translations deps test \
385 quicktest erlang_plt deps_plt ejabberd_plt xref hooks options