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 \
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

TEST_FILES = \
Manuel Franceschini's avatar
Manuel Franceschini committed
351 352 353 354 355
	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 \
356
	test/data/cert1.pem \
357
	test/data/proc_drbd8.txt \
358
	test/data/proc_drbd80-emptyline.txt \
359 360
	test/data/proc_drbd83.txt \
	test/import-export_unittest-helper
361

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

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

403 404 405 406
nodist_TESTS =

TESTS = $(dist_TESTS) $(nodist_TESTS)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

666 667
-include ./Makefile.local

668
# vim: set noet :