Makefile.am 17.1 KB
Newer Older
1 2 3 4 5
# Ganeti makefile
# - Indent with tabs only.
# - Keep files sorted; one line per file.
# - Directories in lib/ must have their own *dir variable (see hypervisor).
# - All directories must be listed DIRS.
Michael Hanselmann's avatar
Michael Hanselmann committed
6
# - Use autogen.sh to generate Makefile.in and configure script.
7 8 9 10 11

# Automake doesn't export these variables before version 1.10.
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@

12
ACLOCAL_AMFLAGS = -I autotools
13
DOCBOOK_WRAPPER = $(top_srcdir)/autotools/docbook-wrapper
14
BUILD_BASH_COMPLETION = $(top_srcdir)/autotools/build-bash-completion
15
RUN_IN_TEMPDIR = $(top_srcdir)/autotools/run-in-tempdir
16
CHECK_PYTHON_CODE = $(top_srcdir)/autotools/check-python-code
17
CHECK_MAN = $(top_srcdir)/autotools/check-man
18 19 20
REPLACE_VARS_SED = autotools/replace_vars.sed

hypervisordir = $(pkgpythondir)/hypervisor
21
httpdir = $(pkgpythondir)/http
Michael Hanselmann's avatar
Michael Hanselmann committed
22
masterddir = $(pkgpythondir)/masterd
Guido Trotter's avatar
Guido Trotter committed
23
confddir = $(pkgpythondir)/confd
24
rapidir = $(pkgpythondir)/rapi
25
impexpddir = $(pkgpythondir)/impexpd
26 27 28
toolsdir = $(pkglibdir)/tools
docdir = $(datadir)/doc/$(PACKAGE)

29 30 31
# Delete output file if an error occurred while building it
.DELETE_ON_ERROR:

32 33 34 35 36 37
DIRS = \
	autotools \
	daemons \
	devel \
	doc \
	doc/examples \
Guido Trotter's avatar
Guido Trotter committed
38
	doc/examples/hooks \
39
	doc/examples/gnt-debug \
40
	lib \
41
	lib/build \
42
	lib/confd \
43
	lib/http \
44
	lib/hypervisor \
45
	lib/impexpd \
Michael Hanselmann's avatar
Michael Hanselmann committed
46
	lib/masterd \
47
	lib/rapi \
48 49 50 51 52 53 54
	man \
	qa \
	scripts \
	test \
	test/data \
	tools

55 56 57 58 59 60 61 62 63 64
BUILDTIME_DIRS = \
	doc/api \
	doc/coverage \
	doc/html

DIRCHECK_EXCLUDE = \
	$(BUILDTIME_DIRS) \
	ganeti-[0-9]*.[0-9]*.[0-9]* \
	doc/html/_*

Iustin Pop's avatar
Iustin Pop committed
65
MAINTAINERCLEANFILES = \
66
	$(docpng) \
67
	$(maninput) \
68
	doc/install-quick.rst \
69
	doc/news.rst
Iustin Pop's avatar
Iustin Pop committed
70

71
maintainer-clean-local:
72
	rm -rf $(BUILDTIME_DIRS)
73

74
CLEANFILES = \
75
	$(addsuffix /*.py[co],$(DIRS)) \
76
	autotools/replace_vars.sed \
77
	daemons/daemon-util \
78
	daemons/ensure-dirs \
79
	daemons/ganeti-cleaner \
80
	devel/upload \
81
	doc/examples/bash_completion \
82 83
	doc/examples/ganeti.initd \
	doc/examples/ganeti.cron \
84
	doc/examples/gnt-config-backup \
Luca Bigliardi's avatar
Luca Bigliardi committed
85
	doc/examples/hooks/ipsec \
Iustin Pop's avatar
Iustin Pop committed
86 87
	$(man_MANS) \
	$(manhtml) \
88
	stamp-directories \
89
	stamp-srclinks \
90 91
	$(nodist_pkgpython_PYTHON)

92 93
BUILT_SOURCES = \
	ganeti \
94
	stamp-srclinks \
95
	stamp-directories \
96 97
	lib/_autoconf.py

98 99 100
nodist_pkgpython_PYTHON = \
	lib/_autoconf.py

101 102 103
noinst_PYTHON = \
	lib/build/__init__.py

104 105
pkgpython_PYTHON = \
	lib/__init__.py \
Guido Trotter's avatar
Guido Trotter committed
106
	lib/asyncnotifier.py \
107 108 109 110 111
	lib/backend.py \
	lib/bdev.py \
	lib/bootstrap.py \
	lib/cli.py \
	lib/cmdlib.py \
112
	lib/compat.py \
113 114
	lib/config.py \
	lib/constants.py \
115
	lib/daemon.py \
116 117
	lib/errors.py \
	lib/jqueue.py \
118
	lib/jstore.py \
119 120 121 122 123 124 125 126 127
	lib/locking.py \
	lib/luxi.py \
	lib/mcpu.py \
	lib/objects.py \
	lib/opcodes.py \
	lib/rpc.py \
	lib/serializer.py \
	lib/ssconf.py \
	lib/ssh.py \
128
	lib/storage.py \
129
	lib/utils.py \
130
	lib/uidpool.py \
131
	lib/workerpool.py
132 133 134 135

hypervisor_PYTHON = \
	lib/hypervisor/__init__.py \
	lib/hypervisor/hv_base.py \
136
	lib/hypervisor/hv_chroot.py \
137
	lib/hypervisor/hv_fake.py \
Guido Trotter's avatar
Guido Trotter committed
138
	lib/hypervisor/hv_kvm.py \
Iustin Pop's avatar
Iustin Pop committed
139
	lib/hypervisor/hv_lxc.py \
140 141
	lib/hypervisor/hv_xen.py

142 143
rapi_PYTHON = \
	lib/rapi/__init__.py \
144
	lib/rapi/baserlib.py \
David Knowles's avatar
David Knowles committed
145
	lib/rapi/client.py \
146
	lib/rapi/client_utils.py \
147 148
	lib/rapi/connector.py \
	lib/rapi/rlib2.py
149

150
http_PYTHON = \
151
	lib/http/__init__.py \
152
	lib/http/auth.py \
153 154
	lib/http/client.py \
	lib/http/server.py
155

Guido Trotter's avatar
Guido Trotter committed
156
confd_PYTHON = \
Guido Trotter's avatar
Guido Trotter committed
157
	lib/confd/__init__.py \
Guido Trotter's avatar
Guido Trotter committed
158
	lib/confd/client.py \
159 160
	lib/confd/querylib.py \
	lib/confd/server.py
161

Michael Hanselmann's avatar
Michael Hanselmann committed
162
masterd_PYTHON = \
163 164
	lib/masterd/__init__.py \
	lib/masterd/instance.py
Michael Hanselmann's avatar
Michael Hanselmann committed
165

166 167 168
impexpd_PYTHON = \
	lib/impexpd/__init__.py

Michael Hanselmann's avatar
Michael Hanselmann committed
169
docrst = \
170
	doc/admin.rst \
171
	doc/design-2.0.rst \
172
	doc/design-2.1.rst \
173
	doc/design-2.2.rst \
174
	doc/cluster-merge.rst \
175
	doc/devnotes.rst \
176
	doc/glossary.rst \
177
	doc/hooks.rst \
178
	doc/iallocator.rst \
179
	doc/index.rst \
180
	doc/install-quick.rst \
181
	doc/install.rst \
182
	doc/locking.rst \
183
	doc/move-instance.rst \
Iustin Pop's avatar
Iustin Pop committed
184
	doc/news.rst \
185
	doc/rapi.rst \
186
	doc/security.rst \
Iustin Pop's avatar
Iustin Pop committed
187
	doc/walkthrough.rst
Michael Hanselmann's avatar
Michael Hanselmann committed
188

189
doc/html/.stamp: $(docrst) $(docpng) doc/conf.py configure.ac
190 191
	@test -n "$(SPHINX)" || \
	    { echo 'sphinx-build' not found during configure; exit 1; }
192
	PYTHONPATH=. $(RUN_IN_TEMPDIR) $(SPHINX) -q -W -b html \
193
	    -d . \
194 195
	    -D version="$(VERSION_MAJOR).$(VERSION_MINOR)" \
	    -D release="$(PACKAGE_VERSION)" \
196 197 198 199 200
	    $(abs_top_srcdir)/doc $(CURDIR)/doc/html
	rm -f doc/html/.buildinfo doc/html/objects.inv
	touch $@

doc/html: doc/html/.stamp
Iustin Pop's avatar
Iustin Pop committed
201

202 203 204 205 206 207 208 209
doc/news.rst: NEWS
	set -e; \
	{ echo '.. This file is automatically updated at build time from $<.'; \
	  echo '.. Do not edit.'; \
	  echo; \
	  cat $<; \
	} > $@

210 211 212 213 214 215 216 217
doc/install-quick.rst: INSTALL
	set -e; \
	{ echo '.. This file is automatically updated at build time from $<.'; \
	  echo '.. Do not edit.'; \
	  echo; \
	  cat $<; \
	} > $@

218
docdot = \
219 220 221
	doc/arch-2.0.dot \
	doc/design-2.1-lock-acquire.dot \
	doc/design-2.1-lock-release.dot
222

223
docpng = $(patsubst %.dot,%.png,$(docdot))
224

225 226 227 228 229 230 231 232
# Things to build but not to install (add it to EXTRA_DIST if it should be
# distributed)
noinst_DATA = \
	devel/upload \
	doc/html \
	doc/examples/bash_completion \
	doc/examples/ganeti.cron \
	doc/examples/ganeti.initd \
233
	doc/examples/gnt-config-backup \
234 235
	doc/examples/hooks/ipsec \
	$(manhtml)
236

237
gnt_scripts = \
238 239 240 241 242 243 244 245
	scripts/gnt-backup \
	scripts/gnt-cluster \
	scripts/gnt-debug \
	scripts/gnt-instance \
	scripts/gnt-job \
	scripts/gnt-node \
	scripts/gnt-os

246 247 248 249 250 251 252 253
dist_sbin_SCRIPTS = \
	daemons/ganeti-noded \
	daemons/ganeti-watcher \
	daemons/ganeti-masterd \
	daemons/ganeti-confd \
	daemons/ganeti-rapi \
	$(gnt_scripts)

254 255 256
nodist_sbin_SCRIPTS = \
	daemons/ganeti-cleaner

257 258 259 260
dist_tools_SCRIPTS = \
	tools/burnin \
	tools/cfgshell \
	tools/cfgupgrade \
261
	tools/cfgupgrade12 \
262
	tools/cluster-merge \
Iustin Pop's avatar
Iustin Pop committed
263
	tools/lvmstrap \
264
	tools/move-instance \
Iustin Pop's avatar
Iustin Pop committed
265
	tools/sanitize-config
266

267
pkglib_python_scripts = \
268 269
	daemons/import-export \
	tools/check-cert-expired
270

271
pkglib_SCRIPTS = \
272
	daemons/daemon-util \
273
	daemons/ensure-dirs \
274
	$(pkglib_python_scripts)
275

276 277
EXTRA_DIST = \
	NEWS \
Michael Hanselmann's avatar
Michael Hanselmann committed
278
	pylintrc \
279
	autotools/build-bash-completion \
280
	autotools/check-python-code \
281
	autotools/check-man \
282
	autotools/docbook-wrapper \
283
	autotools/gen-coverage \
284
	autotools/testrunner \
285
	$(RUN_IN_TEMPDIR) \
286
	daemons/daemon-util.in \
287
	daemons/ensure-dirs.in \
288
	daemons/ganeti-cleaner.in \
289
	$(pkglib_python_scripts) \
290
	devel/upload.in \
291
	$(docdot) \
292
	$(docpng) \
293 294 295
	$(docrst) \
	doc/conf.py \
	doc/html \
296 297
	doc/examples/ganeti.initd.in \
	doc/examples/ganeti.cron.in \
298
	doc/examples/gnt-config-backup.in \
299
	doc/examples/dumb-allocator \
300 301
	doc/examples/ganeti.default \
	doc/examples/ganeti.default-debug \
Guido Trotter's avatar
Guido Trotter committed
302
	doc/examples/hooks/ethers \
Luca Bigliardi's avatar
Luca Bigliardi committed
303
	doc/examples/hooks/ipsec.in \
304 305 306
	doc/examples/gnt-debug/README \
	doc/examples/gnt-debug/delay0.json \
	doc/examples/gnt-debug/delay50.json \
307 308 309 310 311
	test/testutils.py \
	test/mocks.py \
	$(dist_TESTS) \
	$(TEST_FILES) \
	man/footer.sgml \
312 313
	$(mansgml) \
	$(maninput) \
314
	qa/ganeti-qa.py \
Michael Hanselmann's avatar
Michael Hanselmann committed
315
	qa/qa-sample.json \
316 317 318 319 320 321 322 323
	qa/qa_cluster.py \
	qa/qa_config.py \
	qa/qa_daemon.py \
	qa/qa_env.py \
	qa/qa_error.py \
	qa/qa_instance.py \
	qa/qa_node.py \
	qa/qa_os.py \
Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
324
	qa/qa_rapi.py \
325 326 327 328 329
	qa/qa_tags.py \
	qa/qa_utils.py

man_MANS = \
	man/ganeti.7 \
330
	man/ganeti-cleaner.8 \
Guido Trotter's avatar
Guido Trotter committed
331
	man/ganeti-confd.8 \
332
	man/ganeti-masterd.8 \
333 334
	man/ganeti-noded.8 \
	man/ganeti-os-interface.7 \
335
	man/ganeti-rapi.8 \
336 337 338
	man/ganeti-watcher.8 \
	man/gnt-backup.8 \
	man/gnt-cluster.8 \
339
	man/gnt-debug.8 \
340
	man/gnt-instance.8 \
341
	man/gnt-job.8 \
342 343 344
	man/gnt-node.8 \
	man/gnt-os.8

Iustin Pop's avatar
Iustin Pop committed
345 346
mansgml = $(patsubst %.7,%.sgml,$(patsubst %.8,%.sgml,$(man_MANS)))
manhtml = $(patsubst %.sgml,%.html,$(mansgml))
347 348 349
maninput = \
	$(patsubst %.7,%.7.in,$(patsubst %.8,%.8.in,$(man_MANS))) \
	$(patsubst %.html,%.html.in,$(manhtml))
350 351

TEST_FILES = \
Manuel Franceschini's avatar
Manuel Franceschini committed
352 353 354 355 356
	test/data/bdev-drbd-8.0.txt \
	test/data/bdev-drbd-8.3.txt \
	test/data/bdev-drbd-disk.txt \
	test/data/bdev-drbd-net-ip4.txt \
	test/data/bdev-drbd-net-ip6.txt \
357
	test/data/cert1.pem \
358
	test/data/proc_drbd8.txt \
359
	test/data/proc_drbd80-emptyline.txt \
360 361
	test/data/proc_drbd83.txt \
	test/import-export_unittest-helper
362

363
python_tests = \
Guido Trotter's avatar
Guido Trotter committed
364
	test/ganeti.asyncnotifier_unittest.py \
365
	test/ganeti.backend_unittest.py \
366 367
	test/ganeti.bdev_unittest.py \
	test/ganeti.cli_unittest.py \
Guido Trotter's avatar
Guido Trotter committed
368
	test/ganeti.daemon_unittest.py \
369
	test/ganeti.cmdlib_unittest.py \
370
	test/ganeti.compat_unittest.py \
371
	test/ganeti.confd.client_unittest.py \
372
	test/ganeti.config_unittest.py \
373
	test/ganeti.constants_unittest.py \
374
	test/ganeti.errors_unittest.py \
375
	test/ganeti.hooks_unittest.py \
376
	test/ganeti.http_unittest.py \
377
	test/ganeti.impexpd_unittest.py \
378
	test/ganeti.locking_unittest.py \
379
	test/ganeti.luxi_unittest.py \
380
	test/ganeti.masterd.instance_unittest.py \
381
	test/ganeti.mcpu_unittest.py \
382
	test/ganeti.objects_unittest.py \
383
	test/ganeti.opcodes_unittest.py \
David Knowles's avatar
David Knowles committed
384
	test/ganeti.rapi.client_unittest.py \
385
	test/ganeti.rapi.resources_unittest.py \
386
	test/ganeti.rapi.rlib2_unittest.py \
387 388
	test/ganeti.serializer_unittest.py \
	test/ganeti.ssh_unittest.py \
Balazs Lecz's avatar
Balazs Lecz committed
389
	test/ganeti.uidpool_unittest.py \
390
	test/ganeti.utils_unittest.py \
Luca Bigliardi's avatar
Luca Bigliardi committed
391
	test/ganeti.utils_mlockall_unittest.py \
392
	test/ganeti.workerpool_unittest.py \
393
	test/cfgupgrade_unittest.py \
394 395
	test/docs_unittest.py \
	test/tempfile_fork_unittest.py
396

397
dist_TESTS = \
398
	test/check-cert-expired_unittest.bash \
399
	test/daemon-util_unittest.bash \
400
	test/ganeti-cleaner_unittest.bash \
401
	test/import-export_unittest.bash \
402 403
	$(python_tests)

404 405 406 407
nodist_TESTS =

TESTS = $(dist_TESTS) $(nodist_TESTS)

408 409 410 411 412
# Environment for all tests
PLAIN_TESTS_ENVIRONMENT = \
	PYTHONPATH=. TOP_SRCDIR=$(abs_top_srcdir) PYTHON=$(PYTHON) $(RUN_IN_TEMPDIR)

# Environment for tests run by automake
413
TESTS_ENVIRONMENT = \
414
	$(PLAIN_TESTS_ENVIRONMENT) $(abs_top_srcdir)/autotools/testrunner
415

416
all_python_code = \
417 418
	$(dist_sbin_SCRIPTS) \
	$(dist_tools_SCRIPTS) \
419
	$(pkglib_python_scripts) \
420
	$(python_tests) \
421 422 423 424 425
	$(pkgpython_PYTHON) \
	$(hypervisor_PYTHON) \
	$(rapi_PYTHON) \
	$(http_PYTHON) \
	$(confd_PYTHON) \
Michael Hanselmann's avatar
Michael Hanselmann committed
426
	$(masterd_PYTHON) \
427
	$(impexpd_PYTHON) \
428 429
	$(noinst_PYTHON)

430 431
srclink_files = \
	man/footer.sgml \
432
	test/check-cert-expired_unittest.bash \
433
	test/daemon-util_unittest.bash \
434
	test/ganeti-cleaner_unittest.bash \
435
	test/import-export_unittest.bash \
436 437 438
	$(all_python_code)

check_python_code = \
439
	$(BUILD_BASH_COMPLETION) \
440 441
	$(all_python_code)

442
lint_python_code = \
443 444 445
	ganeti \
	$(dist_sbin_SCRIPTS) \
	$(dist_tools_SCRIPTS) \
446
	$(pkglib_python_scripts) \
447
	$(BUILD_BASH_COMPLETION)
448

449 450
test/daemon-util_unittest.bash: daemons/daemon-util

451 452
test/ganeti-cleaner_unittest.bash: daemons/ganeti-cleaner

453
devel/upload: devel/upload.in $(REPLACE_VARS_SED)
454 455 456
	sed -f $(REPLACE_VARS_SED) < $< > $@
	chmod u+x $@

457
daemons/%: daemons/%.in \
458 459
		$(REPLACE_VARS_SED)
	sed -f $(REPLACE_VARS_SED) < $< > $@
460
	chmod +x $@
461

462
doc/examples/%: doc/examples/%.in \
463 464 465
		$(REPLACE_VARS_SED)
	sed -f $(REPLACE_VARS_SED) < $< > $@

466
doc/examples/hooks/%: doc/examples/hooks/%.in \
Luca Bigliardi's avatar
Luca Bigliardi committed
467 468 469
		$(REPLACE_VARS_SED)
	sed -f $(REPLACE_VARS_SED) < $< > $@

470
doc/examples/bash_completion: $(BUILD_BASH_COMPLETION) $(RUN_IN_TEMPDIR) \
471
	lib/cli.py $(gnt_scripts) tools/burnin
472
	PYTHONPATH=. $(RUN_IN_TEMPDIR) $(CURDIR)/$(BUILD_BASH_COMPLETION) > $@
473

474
doc/%.png: doc/%.dot
Iustin Pop's avatar
Iustin Pop committed
475
	@test -n "$(DOT)" || { echo 'dot' not found during configure; exit 1; }
476 477
	$(DOT) -Tpng -o $@ $<

Iustin Pop's avatar
Iustin Pop committed
478
man/%.7.in man/%.8.in: man/%.sgml man/footer.sgml $(DOCBOOK_WRAPPER)
479 480
	@test -n "$(DOCBOOK2MAN)" || \
	  { echo 'docbook2man' not found during configure; exit 1; }
Michael Hanselmann's avatar
Michael Hanselmann committed
481
	$(DOCBOOK_WRAPPER) "$(DOCBOOK2MAN)" $< $(notdir $(@:.in=)) $@
482
	$(CHECK_MAN) $@
Iustin Pop's avatar
Iustin Pop committed
483 484

man/%.html.in: man/%.sgml man/footer.sgml $(DOCBOOK_WRAPPER)
485 486
	@test -n "$(DOCBOOK2HTML)" || \
	  { echo 'docbook2html' not found during configure; exit 1; }
Michael Hanselmann's avatar
Michael Hanselmann committed
487
	$(DOCBOOK_WRAPPER) "$(DOCBOOK2HTML) --nochunks" $< $(notdir $(@:.in=)) $@
Iustin Pop's avatar
Iustin Pop committed
488

489
man/%.7: man/%.7.in $(REPLACE_VARS_SED)
Iustin Pop's avatar
Iustin Pop committed
490
	sed -f $(REPLACE_VARS_SED) < $< > $@
491

492
man/%.8: man/%.8.in $(REPLACE_VARS_SED)
Iustin Pop's avatar
Iustin Pop committed
493
	sed -f $(REPLACE_VARS_SED) < $< > $@
494

495
man/%.html: man/%.html.in $(REPLACE_VARS_SED)
Iustin Pop's avatar
Iustin Pop committed
496
	sed -f $(REPLACE_VARS_SED) < $< > $@
497

498 499 500 501
lib/_autoconf.py: Makefile stamp-directories
	set -e; \
	{ echo '# This file is automatically generated, do not edit!'; \
	  echo '#'; \
Iustin Pop's avatar
Iustin Pop committed
502 503 504 505 506 507 508 509 510
	  echo ''; \
	  echo '"""Build-time configuration for Ganeti.'; \
	  echo '';\
	  echo 'This file is autogenerated by the build process.'; \
	  echo 'For any changes you need to re-run ./configure (and'; \
	  echo 'not edit by hand).'; \
	  echo ''; \
	  echo '"""'; \
	  echo ''; \
511 512 513 514
	  echo '# pylint: disable-msg=C0301,C0324'; \
	  echo '# because this is autogenerated, we do not want'; \
	  echo '# style warnings' ; \
	  echo ''; \
515 516 517 518 519 520 521 522
	  echo "PACKAGE_VERSION = '$(PACKAGE_VERSION)'"; \
	  echo "VERSION_MAJOR = '$(VERSION_MAJOR)'"; \
	  echo "VERSION_MINOR = '$(VERSION_MINOR)'"; \
	  echo "VERSION_REVISION = '$(VERSION_REVISION)'"; \
	  echo "VERSION_SUFFIX = '$(VERSION_SUFFIX)'"; \
	  echo "VERSION_FULL = '$(VERSION_FULL)'"; \
	  echo "LOCALSTATEDIR = '$(localstatedir)'"; \
	  echo "SYSCONFDIR = '$(sysconfdir)'"; \
523
	  echo "SSH_CONFIG_DIR = '$(SSH_CONFIG_DIR)'"; \
524 525
	  echo "EXPORT_DIR = '$(EXPORT_DIR)'"; \
	  echo "OS_SEARCH_PATH = [$(OS_SEARCH_PATH)]"; \
526
	  echo "XEN_BOOTLOADER = '$(XEN_BOOTLOADER)'"; \
527 528 529
	  echo "XEN_KERNEL = '$(XEN_KERNEL)'"; \
	  echo "XEN_INITRD = '$(XEN_INITRD)'"; \
	  echo "FILE_STORAGE_DIR = '$(FILE_STORAGE_DIR)'"; \
530
	  echo "ENABLE_FILE_STORAGE = $(ENABLE_FILE_STORAGE)"; \
531
	  echo "IALLOCATOR_SEARCH_PATH = [$(IALLOCATOR_SEARCH_PATH)]"; \
532
	  echo "KVM_PATH = '$(KVM_PATH)'"; \
533 534
	  echo "SOCAT_PATH = '$(SOCAT)'"; \
	  echo "SOCAT_USE_ESCAPE = $(SOCAT_USE_ESCAPE)"; \
535 536
	  echo "LVM_STRIPECOUNT = $(LVM_STRIPECOUNT)"; \
	  echo "TOOLSDIR = '$(toolsdir)'"; \
537
	  echo "GNT_SCRIPTS = [$(foreach i,$(notdir $(gnt_scripts)),'$(i)',)]"; \
538
	  echo "PKGLIBDIR = '$(pkglibdir)'"; \
539
	  echo "DRBD_BARRIERS = $(DRBD_BARRIERS)"; \
540
	  echo "SYSLOG_USAGE = '$(SYSLOG_USAGE)'"; \
541 542 543
	  echo "DAEMONS_GROUP = '$(DAEMONS_GROUP)'"; \
	  echo "MASTERD_USER = '$(MASTERD_USER)'"; \
	  echo "RAPI_USER = '$(RAPI_USER)'"; \
544 545
	} > $@

546
$(REPLACE_VARS_SED): Makefile
547 548 549 550
	set -e; \
	{ echo 's#@PREFIX@#$(prefix)#g'; \
	  echo 's#@SYSCONFDIR@#$(sysconfdir)#g'; \
	  echo 's#@LOCALSTATEDIR@#$(localstatedir)#g'; \
551
	  echo 's#@BINDIR@#$(bindir)#g'; \
552 553
	  echo 's#@SBINDIR@#$(sbindir)#g'; \
	  echo 's#@GANETI_VERSION@#$(PACKAGE_VERSION)#g'; \
554
	  echo 's#@CUSTOM_XEN_BOOTLOADER@#$(XEN_BOOTLOADER)#g'; \
555 556
	  echo 's#@CUSTOM_XEN_KERNEL@#$(XEN_KERNEL)#g'; \
	  echo 's#@CUSTOM_XEN_INITRD@#$(XEN_INITRD)#g'; \
557
	  echo 's#@RPL_FILE_STORAGE_DIR@#$(FILE_STORAGE_DIR)#g'; \
558
	  echo 's#@RPL_SSH_INITD_SCRIPT@#$(SSH_INITD_SCRIPT)#g'; \
Iustin Pop's avatar
Iustin Pop committed
559
	  echo 's#@PKGLIBDIR@#$(pkglibdir)#g'; \
560 561 562 563 564 565 566 567
	  echo 's#@GNTMASTERUSER@#$(MASTERD_USER)#g'; \
	  echo 's#@GNTRAPIUSER@#$(RAPI_USER)#g'; \
	  echo 's#@GNTCONFDUSER@#$(CONFD_USER)#g'; \
	  echo 's#@GNTNODEDUSER@#$(NODED_USER)#g'; \
	  echo 's#@GNTRAPIGROUP@#$(RAPI_GROUP)#g'; \
	  echo 's#@GNTADMINGROUP@#$(ADMIN_GROUP)#g'; \
	  echo 's#@GNTCONFDGROUP@#$(CONFD_GROUP)#g'; \
	  echo 's#@GNTMASTERDGROUP@#$(MASTERD_GROUP)#g'; \
568
	  echo 's#@GNTDAEMONSGROUP@#$(DAEMONS_GROUP)#g'; \
569 570 571 572
	} > $@

# We need to create symlinks because "make distcheck" will not install Python
# files when building.
573
stamp-srclinks: Makefile stamp-directories
574
	set -e; \
575
	for i in $(srclink_files); do \
576 577 578 579
		if test ! -f $$i -a -f $(abs_top_srcdir)/$$i; then \
			$(LN_S) $(abs_top_srcdir)/$$i $$i; \
		fi; \
	done
580
	touch $@
581

Michael Hanselmann's avatar
Michael Hanselmann committed
582 583
.PHONY: ganeti
ganeti:
584
	cd $(top_builddir) && test -h "$@" || { rm -f $@ && $(LN_S) lib $@; }
Michael Hanselmann's avatar
Michael Hanselmann committed
585

586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609
.PHONY: check-dirs
check-dirs: $(BUILT_SOURCES)
	set -e; \
	find . -type d \( \( -name . \) -o \( \
		-name .git -o \
		-name autom4te.cache \
		\) -prune -o -print \) | { \
		error=; \
		while read dir; do \
			case "$$dir" in \
				$(strip $(patsubst %,(./%) ;;,$(DIRCHECK_EXCLUDE) $(DIRS))) \
				*) error=1; echo "Directory $$dir not listed in Makefile" >&2 ;; \
			esac; \
		done; \
		for dir in $(DIRS); do \
			if ! test -d "$$dir"; then \
				echo "Directory $$dir listed in DIRS does not exist" >&2; \
				error=1; \
			fi \
		done; \
		if test -n "$$error"; then exit 1; else exit 0; fi; \
	}

check-local: check-dirs
610 611
	$(CHECK_PYTHON_CODE) $(check_python_code)

Iustin Pop's avatar
Iustin Pop committed
612
.PHONY: lint
613
lint: ganeti $(BUILT_SOURCES)
614 615
	@test -n "$(PYLINT)" || { echo 'pylint' not found during configure; exit 1; }
	$(PYLINT) $(LINT_OPTS) $(lint_python_code)
Iustin Pop's avatar
Iustin Pop committed
616

Iustin Pop's avatar
Iustin Pop committed
617 618
# a dist hook rule for catching revision control directories
distcheck-hook:
619 620 621 622 623 624 625 626 627 628
	if find $(top_distdir) -name .svn -or -name .git | grep .; then \
		echo "Found revision control files in final archive." 1>&2; \
		exit 1; \
	fi
	if find $(top_distdir) -name '*.py[co]' | grep .; then \
		echo "Found Python byte code in final archive." 1>&2; \
		exit 1; \
	fi
	if find $(top_distdir) -name '*~' | grep .; then \
		echo "Found backup files in final archive." 1>&2; \
Iustin Pop's avatar
Iustin Pop committed
629 630 631
		exit 1; \
	fi

Iustin Pop's avatar
Iustin Pop committed
632
install-exec-local:
633
	@mkdir_p@ "$(DESTDIR)${localstatedir}/lib/ganeti" \
634 635
	  "$(DESTDIR)${localstatedir}/log/ganeti" \
	  "$(DESTDIR)${localstatedir}/run/ganeti"
636 637 638 639 640

stamp-directories: Makefile
	@mkdir_p@ $(DIRS)
	touch $@

Iustin Pop's avatar
Iustin Pop committed
641
.PHONY: apidoc
642
apidoc: epydoc.conf $(RUN_IN_TEMPDIR) $(BUILT_SOURCES)
Iustin Pop's avatar
Iustin Pop committed
643
	test -e doc/api || mkdir doc/api
644 645 646
	$(RUN_IN_TEMPDIR) epydoc -v \
		--conf $(CURDIR)/epydoc.conf \
		--output $(CURDIR)/doc/api
Iustin Pop's avatar
Iustin Pop committed
647

648
.PHONY: TAGS
649
TAGS: $(BUILT_SOURCES)
650 651 652 653 654
	rm -f TAGS
	find . -path './lib/*.py' -o -path 'scripts/gnt-*' -o \
	  -path 'daemons/ganeti-*' -o -path 'tools/*' | \
	  etags -

655
.PHONY: coverage
656
coverage: $(BUILT_SOURCES) $(python_tests)
657 658 659 660 661
	set -e; \
	mkdir -p doc/coverage; \
	COVERAGE_FILE=$(CURDIR)/doc/coverage/data \
	TEXT_COVERAGE=$(CURDIR)/doc/coverage/report.txt \
	HTML_COVERAGE=$(CURDIR)/doc/coverage \
662 663
	$(PLAIN_TESTS_ENVIRONMENT) $(abs_top_srcdir)/autotools/gen-coverage \
	$(python_tests)
664

Guido Trotter's avatar
Guido Trotter committed
665 666
commit-check: distcheck lint apidoc

667 668
-include ./Makefile.local

669
# vim: set noet :