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
	test/cfgupgrade_unittest.py \
392
393
	test/docs_unittest.py \
	test/tempfile_fork_unittest.py
394

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

402
403
404
405
nodist_TESTS =

TESTS = $(dist_TESTS) $(nodist_TESTS)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

665
666
-include ./Makefile.local

667
# vim: set noet :