Makefile.am 17 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 \
139 140
	lib/hypervisor/hv_xen.py

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

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

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

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

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

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

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

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

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

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

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

224 225 226 227 228 229 230 231
# 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 \
232
	doc/examples/gnt-config-backup \
233 234
	doc/examples/hooks/ipsec \
	$(manhtml)
235

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

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

253 254 255
nodist_sbin_SCRIPTS = \
	daemons/ganeti-cleaner

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

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

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

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

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

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

TEST_FILES = \
	test/data/bdev-both.txt \
352
	test/data/bdev-8.3-both.txt \
353 354
	test/data/bdev-disk.txt \
	test/data/bdev-net.txt \
355
	test/data/cert1.pem \
356
	test/data/proc_drbd8.txt \
357
	test/data/proc_drbd80-emptyline.txt \
358 359
	test/data/proc_drbd83.txt \
	test/import-export_unittest-helper
360

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

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

401 402 403 404
nodist_TESTS =

TESTS = $(dist_TESTS) $(nodist_TESTS)

405 406 407 408 409
# Environment for all tests
PLAIN_TESTS_ENVIRONMENT = \
	PYTHONPATH=. TOP_SRCDIR=$(abs_top_srcdir) PYTHON=$(PYTHON) $(RUN_IN_TEMPDIR)

# Environment for tests run by automake
410
TESTS_ENVIRONMENT = \
411
	$(PLAIN_TESTS_ENVIRONMENT) $(abs_top_srcdir)/autotools/testrunner
412

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

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

check_python_code = \
436
	$(BUILD_BASH_COMPLETION) \
437 438
	$(all_python_code)

439
lint_python_code = \
440 441 442
	ganeti \
	$(dist_sbin_SCRIPTS) \
	$(dist_tools_SCRIPTS) \
443
	$(pkglib_python_scripts) \
444
	$(BUILD_BASH_COMPLETION)
445

446 447
test/daemon-util_unittest.bash: daemons/daemon-util

448 449
test/ganeti-cleaner_unittest.bash: daemons/ganeti-cleaner

450
devel/upload: devel/upload.in $(REPLACE_VARS_SED)
451 452 453
	sed -f $(REPLACE_VARS_SED) < $< > $@
	chmod u+x $@

454
daemons/%: daemons/%.in \
455 456
		$(REPLACE_VARS_SED)
	sed -f $(REPLACE_VARS_SED) < $< > $@
457
	chmod +x $@
458

459
doc/examples/%: doc/examples/%.in \
460 461 462
		$(REPLACE_VARS_SED)
	sed -f $(REPLACE_VARS_SED) < $< > $@

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

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

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

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

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

486
man/%.7: man/%.7.in $(REPLACE_VARS_SED)
Iustin Pop's avatar
Iustin Pop committed
487
	sed -f $(REPLACE_VARS_SED) < $< > $@
488

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

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

495 496 497 498
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
499 500 501 502 503 504 505 506 507
	  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 ''; \
508 509 510 511
	  echo '# pylint: disable-msg=C0301,C0324'; \
	  echo '# because this is autogenerated, we do not want'; \
	  echo '# style warnings' ; \
	  echo ''; \
512 513 514 515 516 517 518 519
	  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)'"; \
520
	  echo "SSH_CONFIG_DIR = '$(SSH_CONFIG_DIR)'"; \
521 522
	  echo "EXPORT_DIR = '$(EXPORT_DIR)'"; \
	  echo "OS_SEARCH_PATH = [$(OS_SEARCH_PATH)]"; \
523
	  echo "XEN_BOOTLOADER = '$(XEN_BOOTLOADER)'"; \
524 525 526
	  echo "XEN_KERNEL = '$(XEN_KERNEL)'"; \
	  echo "XEN_INITRD = '$(XEN_INITRD)'"; \
	  echo "FILE_STORAGE_DIR = '$(FILE_STORAGE_DIR)'"; \
527
	  echo "ENABLE_FILE_STORAGE = $(ENABLE_FILE_STORAGE)"; \
528
	  echo "IALLOCATOR_SEARCH_PATH = [$(IALLOCATOR_SEARCH_PATH)]"; \
529
	  echo "KVM_PATH = '$(KVM_PATH)'"; \
530 531
	  echo "SOCAT_PATH = '$(SOCAT)'"; \
	  echo "SOCAT_USE_ESCAPE = $(SOCAT_USE_ESCAPE)"; \
532 533
	  echo "LVM_STRIPECOUNT = $(LVM_STRIPECOUNT)"; \
	  echo "TOOLSDIR = '$(toolsdir)'"; \
534
	  echo "GNT_SCRIPTS = [$(foreach i,$(notdir $(gnt_scripts)),'$(i)',)]"; \
535
	  echo "PKGLIBDIR = '$(pkglibdir)'"; \
536
	  echo "DRBD_BARRIERS = $(DRBD_BARRIERS)"; \
537
	  echo "SYSLOG_USAGE = '$(SYSLOG_USAGE)'"; \
538 539 540
	  echo "DAEMONS_GROUP = '$(DAEMONS_GROUP)'"; \
	  echo "MASTERD_USER = '$(MASTERD_USER)'"; \
	  echo "RAPI_USER = '$(RAPI_USER)'"; \
541 542
	} > $@

543
$(REPLACE_VARS_SED): Makefile
544 545 546 547
	set -e; \
	{ echo 's#@PREFIX@#$(prefix)#g'; \
	  echo 's#@SYSCONFDIR@#$(sysconfdir)#g'; \
	  echo 's#@LOCALSTATEDIR@#$(localstatedir)#g'; \
548
	  echo 's#@BINDIR@#$(bindir)#g'; \
549 550
	  echo 's#@SBINDIR@#$(sbindir)#g'; \
	  echo 's#@GANETI_VERSION@#$(PACKAGE_VERSION)#g'; \
551
	  echo 's#@CUSTOM_XEN_BOOTLOADER@#$(XEN_BOOTLOADER)#g'; \
552 553
	  echo 's#@CUSTOM_XEN_KERNEL@#$(XEN_KERNEL)#g'; \
	  echo 's#@CUSTOM_XEN_INITRD@#$(XEN_INITRD)#g'; \
554
	  echo 's#@RPL_FILE_STORAGE_DIR@#$(FILE_STORAGE_DIR)#g'; \
555
	  echo 's#@RPL_SSH_INITD_SCRIPT@#$(SSH_INITD_SCRIPT)#g'; \
Iustin Pop's avatar
Iustin Pop committed
556
	  echo 's#@PKGLIBDIR@#$(pkglibdir)#g'; \
557 558 559 560 561 562 563 564
	  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'; \
565
	  echo 's#@GNTDAEMONSGROUP@#$(DAEMONS_GROUP)#g'; \
566 567 568 569
	} > $@

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

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

583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
.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
607 608
	$(CHECK_PYTHON_CODE) $(check_python_code)

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

Iustin Pop's avatar
Iustin Pop committed
614 615
# a dist hook rule for catching revision control directories
distcheck-hook:
616 617 618 619 620 621 622 623 624 625
	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
626 627 628
		exit 1; \
	fi

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

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

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

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

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

Guido Trotter's avatar
Guido Trotter committed
662 663
commit-check: distcheck lint apidoc

664 665
-include ./Makefile.local

666
# vim: set noet :