lib/rapi \
man \
qa \
- scripts \
test \
test/data \
tools
BUILDTIME_DIRS = \
+ scripts \
doc/api \
doc/coverage \
doc/html
ganeti-[0-9]*.[0-9]*.[0-9]* \
doc/html/_*
+all_dirfiles = $(addsuffix /.dir,$(DIRS) $(BUILDTIME_DIRS))
+
MAINTAINERCLEANFILES = \
$(docpng) \
$(maninput) \
CLEANFILES = \
$(addsuffix /*.py[co],$(DIRS)) \
+ $(all_dirfiles) \
$(PYTHON_BOOTSTRAP) \
autotools/replace_vars.sed \
daemons/daemon-util \
doc/examples/hooks/ipsec \
$(man_MANS) \
$(manhtml) \
- stamp-directories \
stamp-srclinks \
$(nodist_pkgpython_PYTHON)
+# BUILT_SOURCES should only be used as a dependency on phony targets. Otherwise
+# it'll cause the target to rebuild every time.
BUILT_SOURCES = \
ganeti \
stamp-srclinks \
- stamp-directories \
lib/_autoconf.py \
+ $(all_dirfiles) \
$(PYTHON_BOOTSTRAP)
-$(RUN_IN_TEMPDIR): $(BUILT_SOURCES)
-
nodist_pkgpython_PYTHON = \
lib/_autoconf.py
doc/security.rst \
doc/walkthrough.rst
-doc/html/.stamp: $(docrst) $(docpng) doc/conf.py configure.ac $(RUN_IN_TEMPDIR)
+$(RUN_IN_TEMPDIR): | $(all_dirfiles)
+
+doc/html/index.html: $(docrst) $(docpng) doc/conf.py configure.ac \
+ $(RUN_IN_TEMPDIR) | doc/html/.dir
@test -n "$(SPHINX)" || \
{ echo 'sphinx-build' not found during configure; exit 1; }
PYTHONPATH=. $(RUN_IN_TEMPDIR) $(SPHINX) -q -W -b html \
rm -f doc/html/.buildinfo doc/html/objects.inv
touch $@
-doc/html: doc/html/.stamp
+doc/html: doc/html/index.html
doc/news.rst: NEWS
set -e; \
sed -f $(REPLACE_VARS_SED) < $< > $@
chmod u+x $@
-daemons/%: daemons/%.in \
- $(REPLACE_VARS_SED)
+daemons/%: daemons/%.in $(REPLACE_VARS_SED)
sed -f $(REPLACE_VARS_SED) < $< > $@
chmod +x $@
-doc/examples/%: doc/examples/%.in \
- $(REPLACE_VARS_SED)
+doc/examples/%: doc/examples/%.in $(REPLACE_VARS_SED)
sed -f $(REPLACE_VARS_SED) < $< > $@
-doc/examples/hooks/%: doc/examples/hooks/%.in \
- $(REPLACE_VARS_SED)
+doc/examples/hooks/%: doc/examples/hooks/%.in $(REPLACE_VARS_SED)
sed -f $(REPLACE_VARS_SED) < $< > $@
doc/examples/bash_completion: $(BUILD_BASH_COMPLETION) $(RUN_IN_TEMPDIR) \
$(MAKE) vcs-version; \
fi
-lib/_autoconf.py: Makefile stamp-directories vcs-version
+lib/_autoconf.py: Makefile vcs-version | lib/.dir
set -e; \
VCSVER=`cat $(abs_top_srcdir)/vcs-version`; \
{ echo '# This file is automatically generated, do not edit!'; \
echo 's#@GNTDAEMONSGROUP@#$(DAEMONS_GROUP)#g'; \
} > $@
-$(PYTHON_BOOTSTRAP): Makefile
+$(PYTHON_BOOTSTRAP): Makefile | $(all_dirfiles)
set -e; \
- test -e $(dir $@) || mkdir $(dir $@); \
module='$(subst -,_,$(notdir $@))'; \
{ echo '#!/usr/bin/python'; \
echo '# This file is automatically generated, do not edit!'; \
# We need to create symlinks because "make distcheck" will not install Python
# files when building.
-stamp-srclinks: Makefile stamp-directories
+stamp-srclinks: Makefile | $(all_dirfiles)
set -e; \
for i in $(srclink_files); do \
if test ! -f $$i -a -f $(abs_top_srcdir)/$$i; then \
$(CHECK_PYTHON_CODE) $(check_python_code)
.PHONY: lint
-lint: ganeti $(BUILT_SOURCES)
+lint: $(BUILT_SOURCES)
@test -n "$(PYLINT)" || { echo 'pylint' not found during configure; exit 1; }
$(PYLINT) $(LINT_OPTS) $(lint_python_code)
"$(DESTDIR)${localstatedir}/log/ganeti" \
"$(DESTDIR)${localstatedir}/run/ganeti"
-stamp-directories: Makefile
- @mkdir_p@ $(DIRS)
- touch $@
+# To avoid conflicts between directory names and other targets, a file inside
+# the directory is used to ensure its existence.
+%.dir:
+ @mkdir_p@ $* && touch $@
.PHONY: apidoc
apidoc: epydoc.conf $(RUN_IN_TEMPDIR) $(BUILT_SOURCES)
- test -e doc/api || mkdir doc/api
$(RUN_IN_TEMPDIR) epydoc -v \
--conf $(CURDIR)/epydoc.conf \
--output $(CURDIR)/doc/api
.PHONY: coverage
coverage: $(BUILT_SOURCES) $(python_tests)
set -e; \
- @mkdir_p@ doc/coverage; \
COVERAGE_FILE=$(CURDIR)/doc/coverage/data \
TEXT_COVERAGE=$(CURDIR)/doc/coverage/report.txt \
HTML_COVERAGE=$(CURDIR)/doc/coverage \