# to just letting configure generate epaths.h from epaths.in in a
# similar way to how Makefile is made from Makefile.in.
epaths-force:
+ @for dir in '$(abs_srcdir)' '$(lispdir)' '$(archlibdir)'; do \
+ case $$dir in \
+ *:*) \
+ echo >&2 "Build or installation directory '$$dir'"; \
+ echo >&2 "cannot contain ':'."; \
+ exit 1;; \
+ esac; \
+ done
@(standardlisppath=`echo "${standardlisppath}" | ${removenullpaths}` ; \
locallisppath=`echo "${locallisppath}" | ${removenullpaths}` ; \
buildlisppath=`echo "${buildlisppath}" | ${removenullpaths}` ; \
# These targets should be "${SUBDIR} without `src'".
lib lib-src lisp nt: Makefile
- cd $@ && $(MAKE) all
-
-# Pass to src/Makefile.in an additional BOOTSTRAPEMACS variable which
-# is either set to bootstrap-emacs (in case bootstrap-emacs has not been
-# constructed yet) or the empty string (otherwise).
-# src/Makefile.in uses it to implement conditional dependencies, so that
-# files that need bootstrap-emacs to be built do not additionally need
-# to be kept fresher than bootstrap-emacs. Otherwise changing a single
-# file src/foo.c forces dumping a new bootstrap-emacs, then re-byte-compiling
-# all preloaded elisp files, and only then dump the actual src/emacs, which
-# is not wrong, but is overkill in 99.99% of the cases.
-#
+ $(MAKE) -C $@ all
+
# Note the use of single quotes in the value of vcswitness.
# This passes an unexpanded $srcdir to src's Makefile, which then
# expands it using its own value of srcdir (which points to the
dirstate='.bzr/checkout/dirstate'; \
vcswitness='$$(srcdir)/../'$$dirstate; \
[ -r "$(srcdir)/$$dirstate" ] || vcswitness=''; \
- cd $@ || exit; \
- boot=bootstrap-emacs$(EXEEXT); \
- [ ! -x "$$boot" ] || boot=''; \
- $(MAKE) all BOOTSTRAPEMACS="$$boot" VCSWITNESS="$$vcswitness"
+ $(MAKE) -C $@ all VCSWITNESS="$$vcswitness"
blessmail: Makefile src
- cd lib-src && $(MAKE) maybe-blessmail
+ $(MAKE) -C lib-src maybe-blessmail
# We used to have one rule per */Makefile.in, but that leads to race
# conditions with parallel makes, so let's assume that the time stamp on
### Lisp files and DOC file to work properly.
install-arch-dep: src install-arch-indep install-etcdoc install-$(NTDIR)
umask 022; ${MKDIR_P} "$(DESTDIR)${bindir}"
- cd lib-src && $(MAKE) install
+ $(MAKE) -C lib-src install
if test "${ns_self_contained}" = "no"; then \
${INSTALL_PROGRAM} $(INSTALL_STRIP) src/emacs${EXEEXT} "$(DESTDIR)${bindir}/$(EMACSFULL)" || exit 1 ; \
chmod 1755 "$(DESTDIR)${bindir}/$(EMACSFULL)" || true; \
### in nt/, and its Posix do-nothing shadow.
install-:
install-nt:
- cd $(NTDIR) && $(MAKE) install
+ $(MAKE) -C $(NTDIR) install
## In the share directory, we are deleting:
## applications (with emacs.desktop, also found in etc/)
[ -f "$(DESTDIR)${infodir}/dir" ] || \
[ ! -f ${srcdir}/info/dir ] || \
${INSTALL_DATA} ${srcdir}/info/dir "$(DESTDIR)${infodir}/dir"; \
- info_misc=`cd doc/misc && $(QUIET_SUBMAKE) $(MAKE) -s echo-info`; \
+ info_misc=`$(QUIET_SUBMAKE) $(MAKE) -s -C doc/misc echo-info`; \
cd ${srcdir}/info ; \
for elt in ${INFO_NONMISC} $${info_misc}; do \
test "$(HAVE_MAKEINFO)" = "no" && test ! -f $$elt && continue; \
###
### Don't delete the lisp and etc directories if they're in the source tree.
uninstall: uninstall-$(NTDIR) uninstall-doc
- cd lib-src && $(MAKE) uninstall
+ $(MAKE) -C lib-src uninstall
-unset CDPATH; \
for dir in "$(DESTDIR)${lispdir}" "$(DESTDIR)${etcdir}" ; do \
if [ -d "$${dir}" ]; then \
done
-rm -rf "$(DESTDIR)${libexecdir}/emacs/${version}"
thisdir=`/bin/pwd`; \
- (info_misc=`cd doc/misc && $(QUIET_SUBMAKE) $(MAKE) -s echo-info`; \
+ (info_misc=`$(QUIET_SUBMAKE) $(MAKE) -s -C doc/misc echo-info`; \
if cd "$(DESTDIR)${infodir}"; then \
for elt in ${INFO_NONMISC} $${info_misc}; do \
(cd "$${thisdir}"; \
### in nt/, and its Posix do-nothing shadow.
uninstall-:
uninstall-nt:
- cd $(NTDIR) && $(MAKE) uninstall
+ $(MAKE) -C $(NTDIR) uninstall
# ==================== Cleaning up and miscellanea ====================
.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean extraclean
+## Eg:
+## src_clean:
+## make -C src clean
+define submake_template
+.PHONY: $(1)_$(2)
+$(1)_$(2):
+ $$(MAKE) -C $(1) $(2)
+endef
+
### `mostlyclean'
### Like `clean', but may refrain from deleting a few files that people
### normally don't want to recompile. For example, the `mostlyclean'
### target for GCC does not delete `libgcc.a', because recompiling it
### is rarely necessary and takes a lot of time.
-mostlyclean:
- cd src && $(MAKE) mostlyclean
- cd oldXMenu && $(MAKE) mostlyclean
- cd lwlib && $(MAKE) mostlyclean
- cd lib && $(MAKE) mostlyclean
- cd lib-src && $(MAKE) mostlyclean
- cd nt && $(MAKE) mostlyclean
- -cd doc/emacs && $(MAKE) mostlyclean
- -cd doc/misc && $(MAKE) mostlyclean
- -cd doc/lispref && $(MAKE) mostlyclean
- -cd doc/lispintro && $(MAKE) mostlyclean
+mostlyclean_dirs = src oldXMenu lwlib lib lib-src nt doc/emacs doc/misc \
+ doc/lispref doc/lispintro
+
+$(foreach dir,$(mostlyclean_dirs),$(eval $(call submake_template,$(dir),mostlyclean)))
+
+mostlyclean: $(mostlyclean_dirs:=_mostlyclean)
+ for dir in test/automated; do \
+ [ ! -d $$dir ] || $(MAKE) -C $$dir mostlyclean; \
+ done
### `clean'
### Delete all files from the current directory that are normally
### with them.
###
### Delete `.dvi' files here if they are not part of the distribution.
-clean:
+clean_dirs = $(mostlyclean_dirs) nextstep
+
+$(foreach dir,$(clean_dirs),$(eval $(call submake_template,$(dir),clean)))
+
+clean: $(clean_dirs:=_clean)
+ for dir in test/automated; do \
+ [ ! -d $$dir ] || $(MAKE) -C $$dir clean; \
+ done
-rm -f etc/emacs.tmpdesktop
- cd src && $(MAKE) clean
- cd oldXMenu && $(MAKE) clean
- cd lwlib && $(MAKE) clean
- cd lib && $(MAKE) clean
- cd lib-src && $(MAKE) clean
- cd nt && $(MAKE) clean
- -cd doc/emacs && $(MAKE) clean
- -cd doc/misc && $(MAKE) clean
- -cd doc/lispref && $(MAKE) clean
- -cd doc/lispintro && $(MAKE) clean
- cd nextstep && $(MAKE) clean
### `bootclean'
### Delete all files that need to be remade for a clean bootstrap.
top_bootclean=\
rm -f config.cache config.log
+
### `distclean'
### Delete all files from the current directory that are created by
### configuring or building the program. If you have unpacked the
top_distclean=\
${top_bootclean}; \
rm -f config.status config.log~ Makefile stamp-h1 ${SUBDIR_MAKEFILES}
-distclean:
- cd src && $(MAKE) distclean
- cd oldXMenu && $(MAKE) distclean
- cd lwlib && $(MAKE) distclean
- cd lib && $(MAKE) distclean
- cd lib-src && $(MAKE) distclean
- cd nt && $(MAKE) distclean
- cd doc/emacs && $(MAKE) distclean
- cd doc/misc && $(MAKE) distclean
- cd doc/lispref && $(MAKE) distclean
- cd doc/lispintro && $(MAKE) distclean
- cd leim && $(MAKE) distclean
- cd lisp && $(MAKE) distclean
- cd nextstep && $(MAKE) distclean
+
+distclean_dirs = $(clean_dirs) leim lisp
+
+$(foreach dir,$(distclean_dirs),$(eval $(call submake_template,$(dir),distclean)))
+
+distclean: $(distclean_dirs:=_distclean)
for dir in test/automated admin/grammars admin/unidata; do \
- [ ! -d $$dir ] || (cd $$dir && $(MAKE) distclean); \
+ [ ! -d $$dir ] || $(MAKE) -C $$dir distclean; \
done
${top_distclean}
### `bootstrap-clean'
### Delete everything that can be reconstructed by `make' and that
### needs to be deleted in order to force a bootstrap from a clean state.
-bootstrap-clean:
- cd src && $(MAKE) bootstrap-clean
- cd oldXMenu && $(MAKE) maintainer-clean
- cd lwlib && $(MAKE) maintainer-clean
- cd lib && $(MAKE) maintainer-clean
- cd lib-src && $(MAKE) maintainer-clean
- cd nt && $(MAKE) maintainer-clean
- -cd doc/emacs && $(MAKE) maintainer-clean
- -cd doc/misc && $(MAKE) maintainer-clean
- -cd doc/lispref && $(MAKE) maintainer-clean
- -cd doc/lispintro && $(MAKE) maintainer-clean
- cd leim && $(MAKE) bootstrap-clean
- cd lisp && $(MAKE) bootstrap-clean
- cd nextstep && $(MAKE) maintainer-clean
+$(foreach dir,$(distclean_dirs),$(eval $(call submake_template,$(dir),bootstrap-clean)))
+
+bootstrap-clean: $(distclean_dirs:=_bootstrap-clean)
for dir in test/automated admin/grammars admin/unidata; do \
- [ ! -d $$dir ] || (cd $$dir && $(MAKE) bootstrap-clean); \
+ [ ! -d $$dir ] || $(MAKE) -C $$dir bootstrap-clean; \
done
[ ! -f config.log ] || mv -f config.log config.log~
rm -rf ${srcdir}/info
top_maintainer_clean=\
${top_distclean}; \
rm -fr autom4te.cache
-maintainer-clean: bootstrap-clean
- cd src && $(MAKE) maintainer-clean
- cd leim && $(MAKE) maintainer-clean
- cd lisp && $(MAKE) maintainer-clean
+
+maintainer_clean_dirs = src leim lisp
+
+$(foreach dir,$(maintainer_clean_dirs),$(eval $(call submake_template,$(dir),maintainer-clean)))
+
+maintainer-clean: bootstrap-clean $(maintainer_clean_dirs:=_maintainer-clean)
for dir in test/automated admin/grammars admin/unidata; do \
- [ ! -d $$dir ] || (cd $$dir && $(MAKE) maintainer-clean); \
+ [ ! -d $$dir ] || $(MAKE) -C $$dir maintainer-clean; \
done
${top_maintainer_clean}
### says GCC supports it, and that's where the configuration part of
### the coding standards seem to come from. It's like distclean, but
### it deletes backup and autosave files too.
-extraclean:
- for i in ${SUBDIR}; do (cd $$i; $(MAKE) extraclean); done
+### Note that we abuse this in some subdirectories (eg leim),
+### to delete some generated files that are slow to rebuild.
+$(foreach dir,$(SUBDIR),$(eval $(call submake_template,$(dir),extraclean)))
+
+## FIXME this is busted because most of these do not have extraclean rules.
+extraclean: $(SUBDIR:=_extraclean)
${top_maintainer_clean}
-rm -f config-tmp-*
-rm -f *~ \#*
# even when the build directory and source dir are different.
.PHONY: TAGS tags
TAGS tags: lib lib-src src
- cd src && $(MAKE) tags
+ $(MAKE) -C src tags
check: all
@if test ! -d test/automated; then \
echo "You do not seem to have the test/ directory."; \
echo "Maybe you are using a release tarfile, rather than a repository checkout."; \
else \
- cd test/automated && $(MAKE) check; \
+ $(MAKE) -C test/automated check; \
fi
dist:
DOCS = $(DVIS) $(HTMLS) $(INFOS) $(PDFS) $(PSS)
$(DOCS):
- t=$@; IFS=-; set $$t; IFS=; cd doc/$$1 && $(MAKE) $$2
+ t=$@; IFS=-; set $$t; IFS=; $(MAKE) -C doc/$$1 $$2
.PHONY: $(DOCS) docs pdf ps
.PHONY: info dvi dist check html info-real info-dir check-info
## Install non .info forms of the documentation.
## TODO add etc/refcards.
$(INSTALL_DOC):
- t=$@; IFS=-; set $$t; IFS=; cd doc/$$2 && $(MAKE) $$1-$$3
+ t=$@; IFS=-; set $$t; IFS=; $(MAKE) -C doc/$$2 $$1-$$3
.PHONY: $(INSTALL_DOC) install-doc
.PHONY: install-dvi install-html install-pdf install-ps
UNINSTALL_DOC = $(UNINSTALL_DVI) $(UNINSTALL_HTML) $(UNINSTALL_PDF) $(UNINSTALL_PS)
$(UNINSTALL_DOC):
- t=$@; IFS=-; set $$t; IFS=; cd doc/$$2 && $(MAKE) $$1-$$3
+ t=$@; IFS=-; set $$t; IFS=; $(MAKE) -C doc/$$2 $$1-$$3
.PHONY: $(UNINSTALL_DOC) uninstall-doc
.PHONY: uninstall-dvi uninstall-html uninstall-pdf uninstall-ps
echo "You must build Emacs to use this command"; \
exit 1; \
fi
- cd lisp && $(MAKE) $@
+ $(MAKE) -C lisp $@