Makefile.am 56.5 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
13
14
15
16
# Helper values for calling builtin functions
empty :=
space := $(empty) $(empty)
comma := ,

17
18
19
# Helper function to strip src/ and test/hs/ from a list
strip_hsroot = $(patsubst src/%,%,$(patsubst test/hs/%,%,$(1)))

20
21
22
# Use bash in order to be able to use pipefail
SHELL=/bin/bash

23
ACLOCAL_AMFLAGS = -I autotools
24
BUILD_BASH_COMPLETION = $(top_srcdir)/autotools/build-bash-completion
25
RUN_IN_TEMPDIR = $(top_srcdir)/autotools/run-in-tempdir
26
CHECK_PYTHON_CODE = $(top_srcdir)/autotools/check-python-code
27
CHECK_HEADER = $(top_srcdir)/autotools/check-header
Iustin Pop's avatar
Iustin Pop committed
28
CHECK_MAN_DASHES = $(top_srcdir)/autotools/check-man-dashes
29
CHECK_MAN_REFERENCES = $(top_srcdir)/autotools/check-man-references
30
CHECK_MAN_WARNINGS = $(top_srcdir)/autotools/check-man-warnings
31
CHECK_VERSION = $(top_srcdir)/autotools/check-version
32
CHECK_NEWS = $(top_srcdir)/autotools/check-news
33
CHECK_IMPORTS = $(top_srcdir)/autotools/check-imports
34
DOCPP = $(top_srcdir)/autotools/docpp
35
REPLACE_VARS_SED = autotools/replace_vars.sed
36
CONVERT_CONSTANTS = $(top_srcdir)/autotools/convert-constants
37
BUILD_RPC = $(top_srcdir)/autotools/build-rpc
38
SHELL_ENV_INIT = autotools/shell-env-init
39

40
41
# Note: these are automake-specific variables, and must be named after
# the directory + 'dir' suffix
42
clientdir = $(pkgpythondir)/client
43
hypervisordir = $(pkgpythondir)/hypervisor
44
httpdir = $(pkgpythondir)/http
Michael Hanselmann's avatar
Michael Hanselmann committed
45
masterddir = $(pkgpythondir)/masterd
Guido Trotter's avatar
Guido Trotter committed
46
confddir = $(pkgpythondir)/confd
47
rapidir = $(pkgpythondir)/rapi
48
serverdir = $(pkgpythondir)/server
49
watcherdir = $(pkgpythondir)/watcher
50
impexpddir = $(pkgpythondir)/impexpd
51
utilsdir = $(pkgpythondir)/utils
52
toolsdir = $(pkglibdir)/tools
53
iallocatorsdir = $(pkglibdir)/iallocators
54
pytoolsdir = $(pkgpythondir)/tools
55
docdir = $(datadir)/doc/$(PACKAGE)
56
myexeclibdir = $(pkglibdir)
57

58
59
60
# Delete output file if an error occurred while building it
.DELETE_ON_ERROR:

61
HS_DIRS = \
Iustin Pop's avatar
Iustin Pop committed
62
63
64
65
66
67
68
69
70
71
	src \
	src/Ganeti \
	src/Ganeti/Block \
	src/Ganeti/Block/Drbd \
	src/Ganeti/Confd \
	src/Ganeti/DataCollectors \
	src/Ganeti/HTools \
	src/Ganeti/HTools/Backend \
	src/Ganeti/HTools/Program \
	src/Ganeti/Query \
72
73
74
75
76
77
78
79
80
	test/hs \
	test/hs/Test \
	test/hs/Test/Ganeti \
	test/hs/Test/Ganeti/Block \
	test/hs/Test/Ganeti/Block/Drbd \
	test/hs/Test/Ganeti/Confd \
	test/hs/Test/Ganeti/HTools \
	test/hs/Test/Ganeti/HTools/Backend \
	test/hs/Test/Ganeti/Query
81

82
83
84
# Haskell directories without the roots (src, test/hs)
HS_DIRS_NOROOT = $(filter-out src,$(filter-out test/hs,$(HS_DIRS)))

85
DIRS = \
86
	$(HS_DIRS) \
87
88
89
90
	autotools \
	daemons \
	devel \
	doc \
91
	doc/css \
92
	doc/examples \
93
	doc/examples/gnt-debug \
Iustin Pop's avatar
Iustin Pop committed
94
	doc/examples/hooks \
95
96
97
	test/data/htools \
	test/data/htools/rapi \
	test/hs/shelltests \
98
	lib \
99
	lib/build \
Iustin Pop's avatar
Iustin Pop committed
100
	lib/client \
101
	lib/confd \
102
	lib/http \
103
	lib/hypervisor \
104
	lib/impexpd \
Michael Hanselmann's avatar
Michael Hanselmann committed
105
	lib/masterd \
106
	lib/rapi \
107
	lib/server \
108
	lib/tools \
109
	lib/utils \
110
	lib/watcher \
111
112
113
114
	man \
	qa \
	test \
	test/data \
115
	test/data/bdev-rbd \
Agata Murawska's avatar
Agata Murawska committed
116
	test/data/ovfdata \
Agata Murawska's avatar
Agata Murawska committed
117
	test/data/ovfdata/other \
Iustin Pop's avatar
Iustin Pop committed
118
	test/py \
119
120
	tools

121
ALL_APIDOC_HS_DIRS = \
122
	$(APIDOC_HS_DIR) \
123
	$(patsubst %,$(APIDOC_HS_DIR)/%,$(call strip_hsroot,$(HS_DIRS_NOROOT)))
124
125
126
127
128

BUILDTIME_DIR_AUTOCREATE = \
	scripts \
	$(APIDOC_DIR) \
	$(ALL_APIDOC_HS_DIRS) \
Iustin Pop's avatar
Iustin Pop committed
129
	$(APIDOC_PY_DIR) \
130
131
	$(COVERAGE_DIR) \
	$(COVERAGE_HS_DIR) \
Iustin Pop's avatar
Iustin Pop committed
132
	$(COVERAGE_PY_DIR) \
133
	.hpc
134
135
136

BUILDTIME_DIRS = \
	$(BUILDTIME_DIR_AUTOCREATE) \
137
138
	doc/html \
	doc/man-html
139
140
141
142

DIRCHECK_EXCLUDE = \
	$(BUILDTIME_DIRS) \
	ganeti-[0-9]*.[0-9]*.[0-9]* \
Iustin Pop's avatar
Iustin Pop committed
143
	doc/html/_* \
144
	doc/man-html/_* \
Iustin Pop's avatar
Iustin Pop committed
145
	autom4te.cache
146

147
148
149
150
151
152
153
154
# some helper vars
COVERAGE_DIR = doc/coverage
COVERAGE_PY_DIR = $(COVERAGE_DIR)/py
COVERAGE_HS_DIR = $(COVERAGE_DIR)/hs
APIDOC_DIR = doc/api
APIDOC_PY_DIR = $(APIDOC_DIR)/py
APIDOC_HS_DIR = $(APIDOC_DIR)/hs

Iustin Pop's avatar
Iustin Pop committed
155
MAINTAINERCLEANFILES = \
156
	$(maninput) \
157
	doc/install-quick.rst \
158
	doc/news.rst \
159
	doc/upgrade.rst \
160
	vcs-version
Iustin Pop's avatar
Iustin Pop committed
161

162
maintainer-clean-local:
163
	rm -rf $(BUILDTIME_DIRS)
164

165
CLEANFILES = \
166
	$(addsuffix /*.py[co],$(DIRS)) \
167
168
	$(addsuffix /*.hi,$(HS_DIRS)) \
	$(addsuffix /*.o,$(HS_DIRS)) \
169
	$(PYTHON_BOOTSTRAP) \
170
	epydoc.conf \
Iustin Pop's avatar
Iustin Pop committed
171
	$(REPLACE_VARS_SED) \
172
	$(SHELL_ENV_INIT) \
173
	daemons/daemon-util \
174
	daemons/ganeti-cleaner \
175
176
	$(mandocrst) \
	doc/manpages-enabled.rst \
177
	$(BUILT_EXAMPLES) \
178
	doc/examples/bash_completion \
179
	doc/examples/bash_completion-debug \
180
	lib/_generated_rpc.py \
Iustin Pop's avatar
Iustin Pop committed
181
182
	$(man_MANS) \
	$(manhtml) \
183
	tools/kvm-ifup \
184
	tools/vcluster-setup \
185
	stamp-directories \
186
	stamp-srclinks \
187
	$(nodist_pkgpython_PYTHON) \
188
	$(HS_ALL_PROGS) $(HS_BUILT_SRCS) \
189
	$(HS_BUILT_TEST_HELPERS) \
Iustin Pop's avatar
Iustin Pop committed
190
	src/ganeti-confd \
191
	.hpc/*.mix src/*.tix test/hs/*.tix \
192
	doc/hs-lint.html
193

Iustin Pop's avatar
Iustin Pop committed
194
GENERATED_FILES = \
Iustin Pop's avatar
Iustin Pop committed
195
	$(built_base_sources) \
196
197
198
	$(BUILT_PYTHON_SOURCES) \
	$(PYTHON_BOOTSTRAP)

199
HS_GENERATED_FILES =
200
if WANT_HTOOLS
201
HS_GENERATED_FILES += $(HS_PROGS)
202
if ENABLE_CONFD
203
HS_GENERATED_FILES += src/hconfd src/ganeti-confd
204
205
206
endif
endif

207
built_base_sources = \
208
209
	stamp-directories \
	stamp-srclinks
210

211
built_python_base_sources = \
212
	lib/_autoconf.py \
213
214
215
216
	lib/_vcsversion.py

BUILT_PYTHON_SOURCES = \
	$(built_python_base_sources) \
217
	lib/_generated_rpc.py
218

Iustin Pop's avatar
Iustin Pop committed
219
220
# Generating the RPC wrappers depends on many things, so make sure
# it's built at the end of the built sources
221
222
lib/_generated_rpc.py: | $(built_base_sources) $(built_python_base_sources)

223
224
225
226
227
# these are all built from the underlying %.in sources
BUILT_EXAMPLES = \
	doc/examples/ganeti-kvm-poweroff.initd \
	doc/examples/ganeti.cron \
	doc/examples/ganeti.initd \
228
	doc/examples/ganeti-master-role.ocf \
229
	doc/examples/ganeti-node-role.ocf \
230
231
232
	doc/examples/gnt-config-backup \
	doc/examples/hooks/ipsec

233
234
235
nodist_pkgpython_PYTHON = \
	$(BUILT_PYTHON_SOURCES)

236
noinst_PYTHON = \
Michael Hanselmann's avatar
Michael Hanselmann committed
237
	lib/build/__init__.py \
Iustin Pop's avatar
Iustin Pop committed
238
239
	lib/build/shell_example_lexer.py \
	lib/build/sphinx_ext.py
240

241
242
pkgpython_PYTHON = \
	lib/__init__.py \
Guido Trotter's avatar
Guido Trotter committed
243
	lib/asyncnotifier.py \
244
245
246
247
248
	lib/backend.py \
	lib/bdev.py \
	lib/bootstrap.py \
	lib/cli.py \
	lib/cmdlib.py \
249
	lib/compat.py \
250
251
	lib/config.py \
	lib/constants.py \
252
	lib/daemon.py \
253
	lib/errors.py \
254
	lib/ht.py \
255
	lib/jqueue.py \
256
	lib/jstore.py \
257
258
259
	lib/locking.py \
	lib/luxi.py \
	lib/mcpu.py \
260
	lib/netutils.py \
261
262
	lib/objects.py \
	lib/opcodes.py \
263
	lib/outils.py \
264
	lib/ovf.py \
265
	lib/pathutils.py \
266
	lib/qlang.py \
267
	lib/query.py \
268
	lib/rpc.py \
269
	lib/rpc_defs.py \
270
	lib/runtime.py \
271
272
273
	lib/serializer.py \
	lib/ssconf.py \
	lib/ssh.py \
274
	lib/storage.py \
275
	lib/uidpool.py \
276
	lib/vcluster.py \
277
	lib/network.py \
278
	lib/workerpool.py
279

280
client_PYTHON = \
281
	lib/client/__init__.py \
282
	lib/client/gnt_backup.py \
283
	lib/client/gnt_cluster.py \
284
	lib/client/gnt_debug.py \
285
	lib/client/gnt_group.py \
286
	lib/client/gnt_instance.py \
287
	lib/client/gnt_job.py \
288
	lib/client/gnt_node.py \
289
	lib/client/gnt_network.py \
290
291
	lib/client/gnt_os.py \
	lib/client/gnt_storage.py
292

293
294
295
hypervisor_PYTHON = \
	lib/hypervisor/__init__.py \
	lib/hypervisor/hv_base.py \
296
	lib/hypervisor/hv_chroot.py \
297
	lib/hypervisor/hv_fake.py \
Guido Trotter's avatar
Guido Trotter committed
298
	lib/hypervisor/hv_kvm.py \
Iustin Pop's avatar
Iustin Pop committed
299
	lib/hypervisor/hv_lxc.py \
300
301
	lib/hypervisor/hv_xen.py

302
303
rapi_PYTHON = \
	lib/rapi/__init__.py \
304
	lib/rapi/baserlib.py \
David Knowles's avatar
David Knowles committed
305
	lib/rapi/client.py \
306
	lib/rapi/client_utils.py \
307
	lib/rapi/connector.py \
308
309
	lib/rapi/rlib2.py \
	lib/rapi/testutils.py
310

311
http_PYTHON = \
312
	lib/http/__init__.py \
313
	lib/http/auth.py \
314
315
	lib/http/client.py \
	lib/http/server.py
316

Guido Trotter's avatar
Guido Trotter committed
317
confd_PYTHON = \
Guido Trotter's avatar
Guido Trotter committed
318
	lib/confd/__init__.py \
319
	lib/confd/client.py
320

Michael Hanselmann's avatar
Michael Hanselmann committed
321
masterd_PYTHON = \
322
	lib/masterd/__init__.py \
René Nussbaumer's avatar
René Nussbaumer committed
323
	lib/masterd/iallocator.py \
324
	lib/masterd/instance.py
Michael Hanselmann's avatar
Michael Hanselmann committed
325

326
327
328
impexpd_PYTHON = \
	lib/impexpd/__init__.py

329
watcher_PYTHON = \
330
	lib/watcher/__init__.py \
331
332
	lib/watcher/nodemaint.py \
	lib/watcher/state.py
333

334
server_PYTHON = \
335
	lib/server/__init__.py \
336
	lib/server/masterd.py \
337
338
	lib/server/noded.py \
	lib/server/rapi.py
339

340
341
pytools_PYTHON = \
	lib/tools/__init__.py \
342
	lib/tools/burnin.py \
343
	lib/tools/ensure_dirs.py \
Michael Hanselmann's avatar
Michael Hanselmann committed
344
	lib/tools/node_cleanup.py \
345
	lib/tools/node_daemon_setup.py \
346
	lib/tools/prepare_node_join.py
347

348
utils_PYTHON = \
349
	lib/utils/__init__.py \
350
	lib/utils/algo.py \
351
	lib/utils/filelock.py \
352
	lib/utils/hash.py \
353
	lib/utils/io.py \
354
	lib/utils/log.py \
355
	lib/utils/lvm.py \
356
	lib/utils/mlock.py \
357
	lib/utils/nodesetup.py \
358
	lib/utils/process.py \
359
	lib/utils/retry.py \
360
	lib/utils/text.py \
361
362
	lib/utils/wrapper.py \
	lib/utils/x509.py
363

364
365
366
docinput = \
	doc/conf.py \
	doc/css/style.css \
367
	doc/admin.rst \
Iustin Pop's avatar
Iustin Pop committed
368
	doc/cluster-merge.rst \
369
	doc/design-2.0.rst \
370
	doc/design-2.1.rst \
371
	doc/design-2.2.rst \
Guido Trotter's avatar
Guido Trotter committed
372
	doc/design-2.3.rst \
373
	doc/design-2.4.rst \
374
	doc/design-2.5.rst \
375
	doc/design-2.6.rst \
376
	doc/design-2.7.rst \
Iustin Pop's avatar
Iustin Pop committed
377
378
379
	doc/design-autorepair.rst \
	doc/design-bulk-create.rst \
	doc/design-chained-jobs.rst \
Tsachy Shacham's avatar
Tsachy Shacham committed
380
	doc/design-cpu-pinning.rst \
Iustin Pop's avatar
Iustin Pop committed
381
382
	doc/design-draft.rst \
	doc/design-htools-2.3.rst \
383
	doc/design-http-server.rst \
384
	doc/design-impexp2.rst \
385
	doc/design-lu-generated-jobs.rst \
386
	doc/design-linuxha.rst \
387
	doc/design-multi-reloc.rst \
388
	doc/design-network.rst \
389
	doc/design-node-add.rst \
Iustin Pop's avatar
Iustin Pop committed
390
	doc/design-oob.rst \
391
	doc/design-ovf-support.rst \
392
	doc/design-opportunistic-locking.rst \
Iustin Pop's avatar
Iustin Pop committed
393
394
395
	doc/design-partitioned.rst \
	doc/design-query-splitting.rst \
	doc/design-query2.rst \
396
	doc/design-resource-model.rst \
397
	doc/design-restricted-commands.rst \
398
	doc/design-shared-storage.rst \
399
	doc/design-monitoring-agent.rst \
400
	doc/design-virtual-clusters.rst \
Iustin Pop's avatar
Iustin Pop committed
401
	doc/design-x509-ca.rst \
402
	doc/devnotes.rst \
403
	doc/glossary.rst \
404
	doc/hooks.rst \
405
	doc/iallocator.rst \
406
	doc/index.rst \
407
	doc/install-quick.rst \
408
	doc/install.rst \
409
	doc/locking.rst \
410
	doc/manpages-disabled.rst \
411
	doc/move-instance.rst \
Iustin Pop's avatar
Iustin Pop committed
412
	doc/news.rst \
413
	doc/ovfconverter.rst \
414
	doc/rapi.rst \
415
	doc/security.rst \
416
	doc/upgrade.rst \
417
	doc/virtual-cluster.rst \
Iustin Pop's avatar
Iustin Pop committed
418
	doc/walkthrough.rst
Michael Hanselmann's avatar
Michael Hanselmann committed
419

420
421
422
# Generates file names such as "doc/man-gnt-instance.rst"
mandocrst = $(addprefix doc/man-,$(notdir $(manrst)))

423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
# Haskell programs to be installed in $PREFIX/bin
HS_BIN_PROGS=src/htools

# Haskell programs to be installed in the MYEXECLIB dir
HS_MYEXECLIB_PROGS=src/mon-collector

# Haskell programs to compiled but not installed automatically
# Usually they have their own specific installation rules
HS_COMPILE_PROGS= \
	src/hconfd \
	src/rpc-test

# All Haskell non-test programs to be compiled but not automatically installed
HS_PROGS = $(HS_BIN_PROGS) $(HS_MYEXECLIB_PROGS)

Guido Trotter's avatar
Guido Trotter committed
438
HS_BIN_ROLES = hbal hscan hspace hinfo hcheck hroller
439
HS_HTOOLS_PROGS = $(HS_BIN_ROLES) hail
440

441
442
HS_ALL_PROGS = \
	$(HS_PROGS) \
443
444
	test/hs/hpc-htools \
	test/hs/hpc-mon-collector \
Iustin Pop's avatar
Iustin Pop committed
445
	test/hs/htest \
446
	$(HS_COMPILE_PROGS)
447

448
HS_PROG_SRCS = $(patsubst %,%.hs,$(HS_ALL_PROGS))
449
HS_BUILT_TEST_HELPERS = $(HS_BIN_ROLES:%=test/hs/%) test/hs/hail
450

451
HFLAGS = \
Iustin Pop's avatar
Iustin Pop committed
452
	-O -Wall -Werror -isrc \
453
454
455
456
	-fwarn-monomorphism-restriction \
	-fwarn-tabs \
	$(GHC_BYVERSION_FLAGS)

457
# extra flags that can be overriden on the command line (e.g. -Wwarn, etc.)
458
HEXTRA =
Iustin Pop's avatar
Iustin Pop committed
459
# internal extra flags (used for test/hs/htest mainly)
460
HEXTRA_INT =
461
# exclude options for coverage reports
462
HPCEXCL = --exclude Main \
463
	--exclude Ganeti.Constants \
464
	--exclude Ganeti.HTools.QC \
Iustin Pop's avatar
Iustin Pop committed
465
	--exclude Ganeti.THH \
466
	--exclude Ganeti.Version \
467
	--exclude Test.Ganeti.Attoparsec \
468
	--exclude Test.Ganeti.TestCommon \
469
470
	--exclude Test.Ganeti.TestHTools \
	--exclude Test.Ganeti.TestHelper \
471
	--exclude Test.Ganeti.TestImports \
Iustin Pop's avatar
Iustin Pop committed
472
	$(patsubst src.%,--exclude Test.%,$(subst /,.,$(patsubst %.hs,%, $(HS_LIB_SRCS))))
473

474
HS_LIB_SRCS = \
Iustin Pop's avatar
Iustin Pop committed
475
476
477
478
479
480
481
482
483
484
485
486
487
488
	src/Ganeti/Block/Drbd/Types.hs \
	src/Ganeti/Block/Drbd/Parser.hs \
	src/Ganeti/BasicTypes.hs \
	src/Ganeti/Common.hs \
	src/Ganeti/Compat.hs \
	src/Ganeti/Confd/Client.hs \
	src/Ganeti/Confd/Server.hs \
	src/Ganeti/Confd/Types.hs \
	src/Ganeti/Confd/Utils.hs \
	src/Ganeti/Config.hs \
	src/Ganeti/Daemon.hs \
	src/Ganeti/DataCollectors/CLI.hs \
	src/Ganeti/DataCollectors/Drbd.hs \
	src/Ganeti/DataCollectors/Program.hs \
489
	src/Ganeti/DataCollectors/Types.hs \
Iustin Pop's avatar
Iustin Pop committed
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
	src/Ganeti/Errors.hs \
	src/Ganeti/HTools/Backend/IAlloc.hs \
	src/Ganeti/HTools/Backend/Luxi.hs \
	src/Ganeti/HTools/Backend/Rapi.hs \
	src/Ganeti/HTools/Backend/Simu.hs \
	src/Ganeti/HTools/Backend/Text.hs \
	src/Ganeti/HTools/CLI.hs \
	src/Ganeti/HTools/Cluster.hs \
	src/Ganeti/HTools/Container.hs \
	src/Ganeti/HTools/ExtLoader.hs \
	src/Ganeti/HTools/Graph.hs \
	src/Ganeti/HTools/Group.hs \
	src/Ganeti/HTools/Instance.hs \
	src/Ganeti/HTools/Loader.hs \
	src/Ganeti/HTools/Node.hs \
	src/Ganeti/HTools/PeerMap.hs \
	src/Ganeti/HTools/Program/Hail.hs \
	src/Ganeti/HTools/Program/Hbal.hs \
	src/Ganeti/HTools/Program/Hcheck.hs \
	src/Ganeti/HTools/Program/Hinfo.hs \
	src/Ganeti/HTools/Program/Hscan.hs \
	src/Ganeti/HTools/Program/Hspace.hs \
	src/Ganeti/HTools/Program/Hroller.hs \
513
	src/Ganeti/HTools/Program/Main.hs \
Iustin Pop's avatar
Iustin Pop committed
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
	src/Ganeti/HTools/Types.hs \
	src/Ganeti/Hash.hs \
	src/Ganeti/JQueue.hs \
	src/Ganeti/JSON.hs \
	src/Ganeti/Jobs.hs \
	src/Ganeti/Logging.hs \
	src/Ganeti/Luxi.hs \
	src/Ganeti/Network.hs \
	src/Ganeti/Objects.hs \
	src/Ganeti/OpCodes.hs \
	src/Ganeti/OpParams.hs \
	src/Ganeti/Path.hs \
	src/Ganeti/Query/Common.hs \
	src/Ganeti/Query/Filter.hs \
	src/Ganeti/Query/Group.hs \
	src/Ganeti/Query/Job.hs \
	src/Ganeti/Query/Language.hs \
	src/Ganeti/Query/Node.hs \
	src/Ganeti/Query/Query.hs \
	src/Ganeti/Query/Server.hs \
	src/Ganeti/Query/Types.hs \
	src/Ganeti/Rpc.hs \
	src/Ganeti/Runtime.hs \
	src/Ganeti/Ssconf.hs \
	src/Ganeti/THH.hs \
	src/Ganeti/Types.hs \
	src/Ganeti/Utils.hs
541
542

HS_TEST_SRCS = \
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
	test/hs/Test/Ganeti/Attoparsec.hs \
	test/hs/Test/Ganeti/BasicTypes.hs \
	test/hs/Test/Ganeti/Block/Drbd/Parser.hs \
	test/hs/Test/Ganeti/Block/Drbd/Types.hs \
	test/hs/Test/Ganeti/Common.hs \
	test/hs/Test/Ganeti/Confd/Types.hs \
	test/hs/Test/Ganeti/Confd/Utils.hs \
	test/hs/Test/Ganeti/Daemon.hs \
	test/hs/Test/Ganeti/Errors.hs \
	test/hs/Test/Ganeti/HTools/Backend/Simu.hs \
	test/hs/Test/Ganeti/HTools/Backend/Text.hs \
	test/hs/Test/Ganeti/HTools/CLI.hs \
	test/hs/Test/Ganeti/HTools/Cluster.hs \
	test/hs/Test/Ganeti/HTools/Container.hs \
	test/hs/Test/Ganeti/HTools/Graph.hs \
	test/hs/Test/Ganeti/HTools/Instance.hs \
	test/hs/Test/Ganeti/HTools/Loader.hs \
	test/hs/Test/Ganeti/HTools/Node.hs \
	test/hs/Test/Ganeti/HTools/PeerMap.hs \
	test/hs/Test/Ganeti/HTools/Types.hs \
	test/hs/Test/Ganeti/JSON.hs \
	test/hs/Test/Ganeti/Jobs.hs \
	test/hs/Test/Ganeti/JQueue.hs \
	test/hs/Test/Ganeti/Luxi.hs \
	test/hs/Test/Ganeti/Network.hs \
	test/hs/Test/Ganeti/Objects.hs \
	test/hs/Test/Ganeti/OpCodes.hs \
	test/hs/Test/Ganeti/Query/Filter.hs \
	test/hs/Test/Ganeti/Query/Language.hs \
	test/hs/Test/Ganeti/Query/Query.hs \
	test/hs/Test/Ganeti/Rpc.hs \
574
	test/hs/Test/Ganeti/Runtime.hs \
575
576
577
578
579
580
581
	test/hs/Test/Ganeti/Ssconf.hs \
	test/hs/Test/Ganeti/THH.hs \
	test/hs/Test/Ganeti/TestCommon.hs \
	test/hs/Test/Ganeti/TestHTools.hs \
	test/hs/Test/Ganeti/TestHelper.hs \
	test/hs/Test/Ganeti/Types.hs \
	test/hs/Test/Ganeti/Utils.hs
582

583
HS_LIBTEST_SRCS = $(HS_LIB_SRCS) $(HS_TEST_SRCS)
584

585
HS_BUILT_SRCS = \
586
	test/hs/Test/Ganeti/TestImports.hs \
Iustin Pop's avatar
Iustin Pop committed
587
588
	src/Ganeti/Constants.hs \
	src/Ganeti/Version.hs
589
HS_BUILT_SRCS_IN = $(patsubst %,%.in,$(HS_BUILT_SRCS))
590

591
592
HS_LIBTESTBUILT_SRCS = $(HS_LIBTEST_SRCS) $(HS_BUILT_SRCS)

593
$(RUN_IN_TEMPDIR): | stamp-directories
594

595
596
597
598
doc/html/index.html: ENABLE_MANPAGES =
doc/man-html/index.html: ENABLE_MANPAGES = 1
doc/man-html/index.html: doc/manpages-enabled.rst $(mandocrst)

Iustin Pop's avatar
Iustin Pop committed
599
600
601
602
603
# Note: we use here an order-only prerequisite, as the contents of
# _autoconf.py are not actually influencing the html build output: it
# has to exist in order for the sphinx module to be loaded
# successfully, but we certainly don't want the docs to be rebuilt if
# it changes
604
605
doc/html/index.html doc/man-html/index.html: $(docinput) doc/conf.py \
	configure.ac $(RUN_IN_TEMPDIR) lib/build/sphinx_ext.py \
606
	lib/build/shell_example_lexer.py lib/opcodes.py lib/ht.py \
607
	doc/css/style.css \
608
	| $(BUILT_PYTHON_SOURCES)
609
610
	@test -n "$(SPHINX)" || \
	    { echo 'sphinx-build' not found during configure; exit 1; }
611
612
613
614
615
616
if !MANPAGES_IN_DOC
	if test -n '$(ENABLE_MANPAGES)'; then \
	  echo 'Man pages in documentation were disabled at configure time' >&2; \
	  exit 1; \
	fi
endif
617
618
619
620
621
622
## Sphinx provides little control over what content should be included. Some
## mechanisms exist, but they all have drawbacks or actual issues. Since we
## build two different versions of the documentation--once without man pages and
## once, if enabled, with them--some control is necessary. xmpp-wrapper provides
## us with this, but requires running in a temporary directory. It moves the
## correct files into place depending on environment variables.
623
624
	dir=$(dir $@) && \
	@mkdir_p@ $$dir && \
625
626
	PYTHONPATH=. ENABLE_MANPAGES=$(ENABLE_MANPAGES) COPY_DOC=1 \
	$(RUN_IN_TEMPDIR) autotools/sphinx-wrapper $(SPHINX) -q -W -b html \
627
	    -d . \
628
629
	    -D version="$(VERSION_MAJOR).$(VERSION_MINOR)" \
	    -D release="$(PACKAGE_VERSION)" \
630
	    -D graphviz_dot="$(DOT)" \
631
632
633
	    -D enable_manpages="$(ENABLE_MANPAGES)" \
	    doc $(CURDIR)/$$dir && \
	rm -f $$dir/.buildinfo $$dir/objects.inv
634
635
	touch $@

636
doc/html: doc/html/index.html
Iustin Pop's avatar
Iustin Pop committed
637

638
639
doc/man-html: doc/man-html/index.html

640
doc/install-quick.rst: INSTALL
641
doc/news.rst: NEWS
642
doc/upgrade.rst: UPGRADE
643

644
doc/install-quick.rst doc/news.rst doc/upgrade.rst:
645
646
647
648
649
650
651
	set -e; \
	{ echo '.. This file is automatically updated at build time from $<.'; \
	  echo '.. Do not edit.'; \
	  echo; \
	  cat $<; \
	} > $@

652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
doc/manpages-enabled.rst: Makefile | $(built_base_sources)
	{ echo '.. This file is automatically generated, do not edit!'; \
	  echo ''; \
	  echo 'Man pages'; \
	  echo '========='; \
	  echo; \
	  echo '.. toctree::'; \
	  echo '   :maxdepth: 1'; \
	  echo; \
	  for i in $(notdir $(mandocrst)); do \
	    echo "   $$i"; \
	  done | LC_ALL=C sort; \
	} > $@

doc/man-%.rst: man/%.gen Makefile $(REPLACE_VARS_SED) | $(built_base_sources)
if MANPAGES_IN_DOC
	{ echo '.. This file is automatically updated at build time from $<.'; \
	  echo '.. Do not edit.'; \
	  echo; \
	  echo "$*"; \
	  echo '=========================================='; \
	  tail -n +3 $< | sed -f $(REPLACE_VARS_SED); \
	} > $@
else
	echo 'Man pages in documentation were disabled at configure time' >&2; \
	exit 1;
endif

680
681
682
683
# Things to build but not to install (add it to EXTRA_DIST if it should be
# distributed)
noinst_DATA = \
	doc/html \
684
	$(BUILT_EXAMPLES) \
685
	doc/examples/bash_completion \
686
	doc/examples/bash_completion-debug \
687
	$(manhtml)
688

689
690
691
692
if MANPAGES_IN_DOC
noinst_DATA += doc/man-html
endif

693
gnt_scripts = \
694
695
696
	scripts/gnt-backup \
	scripts/gnt-cluster \
	scripts/gnt-debug \
697
	scripts/gnt-group \
698
699
	scripts/gnt-instance \
	scripts/gnt-job \
700
	scripts/gnt-network \
701
	scripts/gnt-node \
702
703
	scripts/gnt-os \
	scripts/gnt-storage
704

705
PYTHON_BOOTSTRAP_SBIN = \
706
	daemons/ganeti-masterd \
707
	daemons/ganeti-noded \
708
	daemons/ganeti-rapi \
Iustin Pop's avatar
Iustin Pop committed
709
	daemons/ganeti-watcher \
710
	$(gnt_scripts)
711

712
713
PYTHON_BOOTSTRAP = \
	$(PYTHON_BOOTSTRAP_SBIN) \
714
	tools/burnin \
715
	tools/ensure-dirs \
Michael Hanselmann's avatar
Michael Hanselmann committed
716
	tools/node-cleanup \
717
	tools/node-daemon-setup \
718
	tools/prepare-node-join
719

720
qa_scripts = \
721
	qa/__init__.py \
722
723
724
725
726
727
	qa/ganeti-qa.py \
	qa/qa_cluster.py \
	qa/qa_config.py \
	qa/qa_daemon.py \
	qa/qa_env.py \
	qa/qa_error.py \
Andrea Spadaccini's avatar
Andrea Spadaccini committed
728
	qa/qa_group.py \
729
	qa/qa_instance.py \
730
	qa/qa_job.py \
731
732
733
734
735
736
	qa/qa_node.py \
	qa/qa_os.py \
	qa/qa_rapi.py \
	qa/qa_tags.py \
	qa/qa_utils.py

737
738
bin_SCRIPTS =
if WANT_HTOOLS
739
bin_SCRIPTS += $(HS_BIN_PROGS)
740
741
install-exec-hook:
	@mkdir_p@ $(DESTDIR)$(iallocatorsdir)
742
743
# FIXME: this is a hardcoded logic, instead of auto-resolving
	$(LN_S) -f ../../../bin/htools \
Iustin Pop's avatar
Iustin Pop committed
744
	  $(DESTDIR)$(iallocatorsdir)/hail
745
	for role in $(HS_BIN_ROLES); do \
Iustin Pop's avatar
Iustin Pop committed
746
	  $(LN_S) -f htools $(DESTDIR)$(bindir)/$$role ; \
747
	done
748
749
endif

750
$(HS_ALL_PROGS): %: %.hs $(HS_LIBTESTBUILT_SRCS) Makefile
751
	@if [ "$(notdir $@)" = "test" ] && [ "$(HS_NODEV)" ]; then \
752
753
	  echo "Error: cannot run unittests without the development" \
	       " libraries (see devnotes.rst)" 1>&2; \
754
	  exit 1; \
755
	fi
Iustin Pop's avatar
Iustin Pop committed
756
757
	@rm -f $(notdir $@).tix
	$(GHC) --make \
Iustin Pop's avatar
Iustin Pop committed
758
	  $(HFLAGS) \
759
	  $(HS_NOCURL) $(HS_PARALLEL3) $(HS_REGEX_PCRE) \
Iustin Pop's avatar
Iustin Pop committed
760
	  -osuf $(notdir $@).o -hisuf $(notdir $@).hi \
761
	  $(HEXTRA) $(HEXTRA_INT) $@
762
763
	@touch "$@"

Iustin Pop's avatar
Iustin Pop committed
764
765
# for the test/hs/htest binary, we need to enable profiling/coverage
test/hs/htest: HEXTRA_INT=-fhpc -itest/hs
766

767
# we compile the hpc-htools binary with the program coverage
768
test/hs/hpc-htools: HEXTRA_INT=-fhpc
769

770
# we compile the hpc-mon-collector binary with the program coverage
771
test/hs/hpc-mon-collector: HEXTRA_INT=-fhpc
772

773
# test dependency
774
test/hs/offline-tests.sh: test/hs/hpc-htools test/hs/hpc-mon-collector
775

776
777
778
779
780
781
# rules for building profiling-enabled versions of the haskell
# programs: hs-prof does the full two-step build, whereas
# hs-prof-quick does only the final rebuild (hs-prof must have been
# run before)
.PHONY: hs-prof hs-prof-quick
hs-prof:
Iustin Pop's avatar
Iustin Pop committed
782
783
784
785
	@if [ -z "$(TARGET)" ]; then \
	  echo "You need to define TARGET when running this rule" 1>&2; \
	  exit 1; \
	fi
786
	$(MAKE) $(AM_MAKEFLAGS) clean
Iustin Pop's avatar
Iustin Pop committed
787
	$(MAKE) $(AM_MAKEFLAGS) $(TARGET) HEXTRA="-osuf o"
788
	rm -f $(HS_ALL_PROGS)
789
	$(MAKE) $(AM_MAKEFLAGS) hs-prof-quick
790
791

hs-prof-quick:
Iustin Pop's avatar
Iustin Pop committed
792
793
794
795
796
	@if [ -z "$(TARGET)" ]; then \
	  echo "You need to define TARGET when running this rule" 1>&2; \
	  exit 1; \
	fi
	$(MAKE) $(AM_MAKEFLAGS) $(TARGET) HEXTRA="-osuf prof_o -prof -auto-all"
797

798
799
dist_sbin_SCRIPTS = \
	tools/ganeti-listrunner
800

801
nodist_sbin_SCRIPTS = \
802
	$(PYTHON_BOOTSTRAP_SBIN) \
803
	daemons/ganeti-cleaner
804

805
if ENABLE_CONFD
Iustin Pop's avatar
Iustin Pop committed
806
src/ganeti-confd: src/hconfd
807
808
	cp -f $< $@

Iustin Pop's avatar
Iustin Pop committed
809
nodist_sbin_SCRIPTS += src/ganeti-confd
810
811
endif

812
python_scripts = \
813
814
	tools/cfgshell \
	tools/cfgupgrade \
815
	tools/cfgupgrade12 \
816
	tools/cluster-merge \
Iustin Pop's avatar
Iustin Pop committed
817
	tools/confd-client \
818
	tools/fmtjson \
Iustin Pop's avatar
Iustin Pop committed
819
	tools/lvmstrap \
820
	tools/move-instance \
821
	tools/ovfconverter \
Michael Hanselmann's avatar
Michael Hanselmann committed
822
	tools/sanitize-config
823

824
dist_tools_SCRIPTS = \
825
	$(python_scripts) \
826
	tools/kvm-console-wrapper \
Iustin Pop's avatar
Iustin Pop committed
827
	tools/master-ip-setup \
828
	tools/xen-console-wrapper
829

Michael Hanselmann's avatar
Michael Hanselmann committed
830
831
832
nodist_tools_python_scripts = \
	tools/node-cleanup

833
nodist_tools_SCRIPTS = \
Michael Hanselmann's avatar
Michael Hanselmann committed
834
	$(nodist_tools_python_scripts) \
835
836
	tools/vcluster-setup

837
pkglib_python_scripts = \
838
839
	daemons/import-export \
	tools/check-cert-expired
840

841
nodist_pkglib_python_scripts = \
842
	tools/burnin \
843
	tools/ensure-dirs \
844
	tools/node-daemon-setup \
845
	tools/prepare-node-join
846

847
myexeclib_SCRIPTS = \
848
	daemons/daemon-util \
849
	tools/kvm-ifup \
850
	$(pkglib_python_scripts) \
851
	$(HS_MYEXECLIB_PROGS)
852