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 :