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 :