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 :