Revision 21a5e56c
b/INSTALL | ||
---|---|---|
113 | 113 |
Haskell requirements |
114 | 114 |
~~~~~~~~~~~~~~~~~~~~ |
115 | 115 |
|
116 |
If you want to enable the `htools` component, which is recommended on |
|
117 |
bigger deployments (this give you automatic instance placement, cluster |
|
118 |
balancing, etc.), then you need to have a Haskell compiler installed on |
|
119 |
your build machine (but this is not required on the machines which are |
|
120 |
just going to run Ganeti). More specifically: |
|
116 |
Starting with Ganeti 2.7, the Haskell GHC compiler and a few base |
|
117 |
libraries are required in order to build Ganeti (but not to run and |
|
118 |
deploy Ganeti on production machines). More specifically: |
|
121 | 119 |
|
122 | 120 |
- `GHC <http://www.haskell.org/ghc/>`_ version 6.12 or higher |
123 | 121 |
- or even better, `The Haskell Platform |
... | ... | |
128 | 126 |
network library |
129 | 127 |
- `parallel <http://hackage.haskell.org/package/parallel>`_, a parallel |
130 | 128 |
programming library (note: tested with up to version 3.x) |
131 |
- `curl <http://hackage.haskell.org/package/curl>`_, bindings for the |
|
132 |
curl library, only needed if you want these tools to connect to remote |
|
133 |
clusters (as opposed to the local one) |
|
134 | 129 |
- `bytestring <http://hackage.haskell.org/package/bytestring>`_ and |
135 | 130 |
`utf8-string <http://hackage.haskell.org/package/utf8-string>`_ |
136 | 131 |
libraries; these usually come with the GHC compiler |
137 |
- `regex-pcre <http://hackage.haskell.org/package/regex-pcre>`_, |
|
138 |
bindings for the ``pcre`` library |
|
132 |
- `deepseq <http://hackage.haskell.org/package/deepseq>`_ |
|
139 | 133 |
|
140 | 134 |
Some of these are also available as package in Debian/Ubuntu:: |
141 | 135 |
|
142 | 136 |
$ apt-get install ghc6 libghc6-json-dev libghc6-network-dev \ |
143 |
libghc6-parallel-dev libghc6-curl-dev |
|
144 |
|
|
145 |
Or in Fedora running:: |
|
137 |
libghc6-parallel-dev libghc6-deepseq-dev |
|
146 | 138 |
|
147 |
$ yum install ghc ghc-json-devel ghc-network-devel ghc-parallel-devel
|
|
139 |
Or in newer versions of these distributions (using GHC 7.x)::
|
|
148 | 140 |
|
149 |
The most recent Fedora doesn't provide ``ghc-curl``. So this needs to be
|
|
150 |
installed using ``cabal`` or alternatively htools can be build without
|
|
151 |
curl support.
|
|
141 |
$ apt-get install ghc libghc-json-dev libghc-network-dev \
|
|
142 |
libghc-parallel-dev libghc-deepseq-dev \
|
|
143 |
libghc-utf8-string-dev
|
|
152 | 144 |
|
153 |
Note that more recent versions have switched to GHC 7.x and the packages |
|
154 |
were renamed:: |
|
145 |
In Fedora, they are available via packages as well:: |
|
155 | 146 |
|
156 |
$ apt-get install ghc libghc-json-dev libghc-network-dev \ |
|
157 |
libghc-parallel-dev libghc-curl-dev \ |
|
158 |
libghc-regex-pcre-dev libghc-utf8-string-dev |
|
147 |
$ yum install ghc ghc-json-devel ghc-network-devel \ |
|
148 |
ghc-parallel-devel ghc-deepseq-devel |
|
159 | 149 |
|
160 | 150 |
If using a distribution which does not provide them, first install |
161 |
the Haskell platform. You can also install ``cabal`` manualy:: |
|
151 |
the Haskell platform. You can also install ``cabal`` manually::
|
|
162 | 152 |
|
163 | 153 |
$ apt-get install cabal-install |
164 | 154 |
|
165 | 155 |
Then install the additional libraries via |
166 | 156 |
``cabal``:: |
167 | 157 |
|
168 |
$ cabal install json network parallel curl regex-pcre utf8-string
|
|
158 |
$ cabal install json network parallel utf8-string |
|
169 | 159 |
|
170 | 160 |
The compilation of the htools components is automatically enabled when |
171 | 161 |
the compiler and the requisite libraries are found. You can use the |
172 | 162 |
``--enable-htools`` configure flag to force the selection (at which |
173 | 163 |
point ``./configure`` will fail if it doesn't find the prerequisites). |
174 | 164 |
|
175 |
In Ganeti version 2.6, one of the daemons (``ganeti-confd``) is shipped |
|
176 |
in two versions: the Python default version (which has no extra |
|
177 |
dependencies), and an experimental Haskell version. This latter version |
|
178 |
can be enabled via the ``./configure`` flag ``--enable-confd=haskell`` |
|
179 |
and a few has extra dependencies: |
|
180 | 165 |
|
166 |
Haskell optional features |
|
167 |
~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
168 |
|
|
169 |
Optionally, more functionality can be enabled if your build machine has |
|
170 |
a few more Haskell libraries enabled: RAPI access to remote cluster from |
|
171 |
htools (``--enable-htools-rapi``) and enabling the ``ganeti-confd`` |
|
172 |
daemon (``--enable-confd``). The list of extra dependencies for these |
|
173 |
is: |
|
174 |
|
|
175 |
- `curl <http://hackage.haskell.org/package/curl>`_, tested with |
|
176 |
versions 1.3.4 and above |
|
181 | 177 |
- `hslogger <http://software.complete.org/hslogger>`_, version 1.1 and |
182 | 178 |
above (note that Debian Squeeze only has version 1.0.9) |
183 | 179 |
- `Crypto <http://hackage.haskell.org/package/Crypto>`_, tested with |
184 | 180 |
version 4.2.4 |
185 | 181 |
- `text <http://hackage.haskell.org/package/text>`_ |
186 | 182 |
- `hinotify <http://hackage.haskell.org/package/hinotify>`_ |
183 |
- `regex-pcre <http://hackage.haskell.org/package/regex-pcre>`_, |
|
184 |
bindings for the ``pcre`` library |
|
187 | 185 |
|
188 |
These libraries are available in Debian Wheezy (but not in Squeeze), so
|
|
189 |
you can use either apt:: |
|
186 |
These libraries are available in Debian Wheezy (but not in Squeeze, with
|
|
187 |
the exception of curl), so you can use either apt::
|
|
190 | 188 |
|
191 | 189 |
$ apt-get install libghc-hslogger-dev libghc-crypto-dev libghc-text-dev \ |
192 |
libghc-hinotify-dev |
|
190 |
libghc-hinotify-dev libghc-regex-pcre-dev libghc-curl-dev
|
|
193 | 191 |
|
194 | 192 |
or ``cabal``:: |
195 | 193 |
|
196 |
$ cabal install hslogger Crypto text hinotify |
|
194 |
$ cabal install hslogger Crypto text hinotify regex-pcre curl
|
|
197 | 195 |
|
198 | 196 |
to install them. |
199 | 197 |
|
198 |
The most recent Fedora doesn't provide ``curl``, ``crypto``, |
|
199 |
``inotify``. So these need to be installed using ``cabal``, if |
|
200 |
desired. The other packages can be installed via ``yum``:: |
|
201 |
|
|
202 |
$ yum install ghc-hslogger-devel ghc-text-devel \ |
|
203 |
ghc-regex-pcre-devel |
|
204 |
|
|
200 | 205 |
.. _cabal-note: |
201 | 206 |
.. note:: |
202 | 207 |
If one of the cabal packages fails to install due to unfulfilled |
b/Makefile.am | ||
---|---|---|
601 | 601 |
endif |
602 | 602 |
|
603 | 603 |
$(HS_ALL_PROGS): %: %.hs $(HS_LIBTEST_SRCS) $(HS_BUILT_SRCS) Makefile |
604 |
@if [ -z "$(HTOOLS)" ]; then \ |
|
605 |
echo "Error: htools compilation disabled at configure time" 1>&2 ;\ |
|
606 |
exit 1; \ |
|
607 |
fi |
|
608 |
@if [ "$(notdir $@)" = "test" ] && [ -z "$(GHC_PKG_QUICKCHECK)" ]; then \ |
|
609 |
echo "Error: cannot run unittests without the QuickCheck library (see devnotes.rst)" 1>&2; \ |
|
604 |
@if [ "$(notdir $@)" = "test" ] && [ "$(HTOOLS_NODEV)" ]; then \ |
|
605 |
echo "Error: cannot run unittests without the development" \ |
|
606 |
" libraries (see devnotes.rst)" 1>&2; \ |
|
610 | 607 |
exit 1; \ |
611 | 608 |
fi |
612 | 609 |
@rm -f $(notdir $@).tix |
613 | 610 |
$(GHC) --make \ |
614 | 611 |
$(HFLAGS) \ |
615 |
$(HTOOLS_NOCURL) $(HTOOLS_PARALLEL3) \ |
|
612 |
$(HTOOLS_NOCURL) $(HTOOLS_PARALLEL3) $(HTOOLS_REGEX_PCRE) \
|
|
616 | 613 |
-osuf $(notdir $@).o -hisuf $(notdir $@).hi \ |
617 | 614 |
$(HEXTRA) $(HEXTRA_INT) $@ |
618 | 615 |
@touch "$@" |
... | ... | |
1234 | 1231 |
echo "NODED_GROUP = '$(NODED_GROUP)'"; \ |
1235 | 1232 |
echo "DISK_SEPARATOR = '$(DISK_SEPARATOR)'"; \ |
1236 | 1233 |
echo "QEMUIMG_PATH = '$(QEMUIMG_PATH)'"; \ |
1237 |
if [ "$(HTOOLS)" ]; then \ |
|
1238 |
echo "HTOOLS = True"; \ |
|
1239 |
else \ |
|
1240 |
echo "HTOOLS = False"; \ |
|
1241 |
fi; \ |
|
1234 |
echo "HTOOLS = True"; \ |
|
1242 | 1235 |
echo "ENABLE_CONFD = $(ENABLE_CONFD)"; \ |
1243 | 1236 |
echo "XEN_CMD = '$(XEN_CMD)'"; \ |
1244 | 1237 |
echo "ENABLE_SPLIT_QUERY = $(ENABLE_SPLIT_QUERY)"; \ |
... | ... | |
1593 | 1586 |
if [ "$(HTOOLS_PARALLEL3)" ]; \ |
1594 | 1587 |
then OPTGHC="$$OPTGHC --optghc=$(HTOOLS_PARALLEL3)"; \ |
1595 | 1588 |
fi; \ |
1589 |
if [ "$(HTOOLS_REGEX_PCRE)" ]; \ |
|
1590 |
then OPTGHC="$$OPTGHC --optghc=$(HTOOLS_REGEX_PCRE)"; \ |
|
1591 |
fi; \ |
|
1596 | 1592 |
RELSRCS="$(HS_LIB_SRCS:htools/%=%) $(patsubst htools/%,%,$(filter htools/%,$(HS_BUILT_SRCS)))"; \ |
1597 | 1593 |
for file in $$RELSRCS; do \ |
1598 | 1594 |
hfile=`echo $$file|sed 's/\\.hs$$//'`.html; \ |
... | ... | |
1610 | 1606 |
rm -f TAGS |
1611 | 1607 |
$(GHC) -e ":etags" -v0 \ |
1612 | 1608 |
$(filter-out -O -Werror,$(HFLAGS)) \ |
1613 |
$(HTOOLS_NOCURL) $(HTOOLS_PARALLEL3) \ |
|
1609 |
$(HTOOLS_NOCURL) $(HTOOLS_PARALLEL3) $(HTOOLS_REGEX_PCRE) \
|
|
1614 | 1610 |
$(HS_LIBTEST_SRCS) |
1615 | 1611 |
find . -path './lib/*.py' -o -path './scripts/gnt-*' -o \ |
1616 | 1612 |
-path './daemons/ganeti-*' -o -path './tools/*' -o \ |
b/autotools/ac_ghc_pkg.m4 | ||
---|---|---|
1 |
##### |
|
2 |
|
|
3 |
# Copyright (C) 2012 Google Inc. |
|
4 |
# |
|
5 |
# This program is free software; you can redistribute it and/or modify |
|
6 |
# it under the terms of the GNU General Public License as published by |
|
7 |
# the Free Software Foundation; either version 2 of the License, or |
|
8 |
# (at your option) any later version. |
|
9 |
# |
|
10 |
# This program is distributed in the hope that it will be useful, but |
|
11 |
# WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
13 |
# General Public License for more details. |
|
14 |
# |
|
15 |
# You should have received a copy of the GNU General Public License |
|
16 |
# along with this program; if not, write to the Free Software |
|
17 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
18 |
# 02110-1301, USA. |
|
19 |
|
|
20 |
##### |
|
21 |
# |
|
22 |
# SYNOPSIS |
|
23 |
# |
|
24 |
# AC_GHC_PKG_CHECK(modname, action_found, action_not_found, extended) |
|
25 |
# |
|
26 |
# DESCRIPTION |
|
27 |
# |
|
28 |
# Checks for a Haskell (GHC) module. If found, execute the second |
|
29 |
# argument, if not found, the third one. |
|
30 |
# |
|
31 |
# If the fourth argument is non-empty, then the check will be some |
|
32 |
# via 'ghc-pkg list' (which supports patterns), otherwise it will |
|
33 |
# use just 'ghc-pkg latest'. |
|
34 |
# |
|
35 |
# |
|
36 |
##### |
|
37 |
|
|
38 |
AC_DEFUN([AC_GHC_PKG_CHECK],[ |
|
39 |
if test -z $GHC_PKG; then |
|
40 |
AC_MSG_ERROR([GHC_PKG not defined]) |
|
41 |
fi |
|
42 |
AC_MSG_CHECKING([haskell library $1]) |
|
43 |
if test -n "$4"; then |
|
44 |
GHC_PKG_RESULT=$($GHC_PKG --simple-output list '$1'|tail -n1) |
|
45 |
else |
|
46 |
GHC_PKG_RESULT=$($GHC_PKG latest '$1' 2>/dev/null) |
|
47 |
fi |
|
48 |
if test -n "$GHC_PKG_RESULT"; then |
|
49 |
AC_MSG_RESULT($GHC_PKG_RESULT) |
|
50 |
$2 |
|
51 |
else |
|
52 |
AC_MSG_RESULT([no]) |
|
53 |
$3 |
|
54 |
fi |
|
55 |
]) |
|
56 |
|
|
57 |
##### |
|
58 |
# |
|
59 |
# SYNOPSIS |
|
60 |
# |
|
61 |
# AC_GHC_PKG_REQUIRE(modname, extended) |
|
62 |
# |
|
63 |
# DESCRIPTION |
|
64 |
# |
|
65 |
# Checks for a Haskell (GHC) module, and abort if not found. If the |
|
66 |
# second argument is non-empty, then the check will be some via |
|
67 |
# 'ghc-pkg list' (which supports patterns), otherwise it will use |
|
68 |
# just 'ghc-pkg latest'. |
|
69 |
# |
|
70 |
# |
|
71 |
##### |
|
72 |
|
|
73 |
AC_DEFUN([AC_GHC_PKG_REQUIRE],[ |
|
74 |
AC_GHC_PKG_CHECK($1, [], |
|
75 |
[AC_MSG_FAILURE([Required Haskell module $1 not found])], |
|
76 |
$2) |
|
77 |
]) |
b/configure.ac | ||
---|---|---|
310 | 310 |
fi |
311 | 311 |
AC_SUBST(SYSLOG_USAGE, $SYSLOG) |
312 | 312 |
|
313 |
# --enable-htools |
|
314 |
HTOOLS= |
|
315 |
AC_ARG_ENABLE([htools], |
|
316 |
[AS_HELP_STRING([--enable-htools], |
|
317 |
[enable use of htools (needs GHC and libraries, default: check)])], |
|
318 |
[], |
|
319 |
[enable_htools=check]) |
|
320 |
|
|
321 |
# --enable-htools-rapi |
|
322 |
HTOOLS_RAPI= |
|
323 |
AC_ARG_ENABLE([htools-rapi], |
|
324 |
[AS_HELP_STRING([--enable-htools-rapi], |
|
325 |
[enable use of RAPI in htools (needs curl, default: no)])], |
|
326 |
[], |
|
327 |
[enable_htools_rapi=check]) |
|
328 |
|
|
329 |
# --enable-confd |
|
330 |
ENABLE_CONFD= |
|
331 |
AC_ARG_ENABLE([confd], |
|
332 |
[AS_HELP_STRING([--enable-confd], |
|
333 |
[enable the ganeti-confd daemon (default: yes)])], |
|
334 |
[[case "$enableval" in |
|
335 |
no) |
|
336 |
enable_confd=False |
|
337 |
;; |
|
338 |
yes|haskell) |
|
339 |
enable_confd=True |
|
340 |
;; |
|
341 |
*) |
|
342 |
echo "Invalid value for enable-confd '$enableval'" |
|
343 |
exit 1 |
|
344 |
;; |
|
345 |
esac |
|
346 |
]], |
|
347 |
[enable_confd=True]) |
|
348 |
AC_SUBST(ENABLE_CONFD, $enable_confd) |
|
349 |
|
|
350 |
AM_CONDITIONAL([ENABLE_CONFD], [test x$enable_confd = xTrue]) |
|
351 |
|
|
352 | 313 |
# --with-disk-separator=... |
353 | 314 |
AC_ARG_WITH([disk-separator], |
354 | 315 |
[AS_HELP_STRING([--with-disk-separator=STRING], |
... | ... | |
430 | 391 |
AC_MSG_WARN([qemu-img not found, using ovfconverter will not be possible]) |
431 | 392 |
fi |
432 | 393 |
|
433 |
if test "$enable_htools" != "no"; then |
|
394 |
# --enable-htools-rapi |
|
395 |
HTOOLS_RAPI= |
|
396 |
AC_ARG_ENABLE([htools-rapi], |
|
397 |
[AS_HELP_STRING([--enable-htools-rapi], |
|
398 |
[enable use of curl in the Haskell code (default: check)])], |
|
399 |
[], |
|
400 |
[enable_htools_rapi=check]) |
|
401 |
|
|
402 |
# --enable-confd |
|
403 |
ENABLE_CONFD= |
|
404 |
AC_ARG_ENABLE([confd], |
|
405 |
[AS_HELP_STRING([--enable-confd], |
|
406 |
[enable the ganeti-confd daemon (default: check)])], |
|
407 |
[], |
|
408 |
[enable_confd=check]) |
|
434 | 409 |
|
435 | 410 |
# Check for ghc |
436 | 411 |
AC_ARG_VAR(GHC, [ghc path]) |
437 | 412 |
AC_PATH_PROG(GHC, [ghc], []) |
438 | 413 |
if test -z "$GHC"; then |
439 |
if test "$enable_htools" != "check"; then |
|
440 |
AC_MSG_FAILURE([ghc not found, htools compilation will not possible]) |
|
441 |
fi |
|
414 |
AC_MSG_FAILURE([ghc not found, compilation will not possible]) |
|
442 | 415 |
fi |
443 | 416 |
|
444 | 417 |
# Check for ghc-pkg |
445 |
HTOOLS_MODULES= |
|
446 | 418 |
AC_ARG_VAR(GHC_PKG, [ghc-pkg path]) |
447 | 419 |
AC_PATH_PROG(GHC_PKG, [ghc-pkg], []) |
448 | 420 |
if test -z "$GHC_PKG"; then |
449 |
if test "$enable_htools" != "check"; then |
|
450 |
AC_MSG_FAILURE([ghc-pkg not found, htools compilation will not be possible]) |
|
451 |
fi |
|
452 |
else |
|
453 |
# check for modules |
|
454 |
AC_MSG_NOTICE([checking for required haskell modules]) |
|
455 |
HTOOLS_NOCURL=-DNO_CURL |
|
456 |
if test "$enable_htools_rapi" != "no"; then |
|
457 |
AC_MSG_CHECKING([curl]) |
|
458 |
GHC_PKG_CURL=$($GHC_PKG latest curl) |
|
459 |
if test -z "$GHC_PKG_CURL"; then |
|
460 |
if test "$enable_htools_rapi" = "check"; then |
|
461 |
AC_MSG_WARN(m4_normalize([The curl library not found, htools will be |
|
462 |
compiled without RAPI support])) |
|
463 |
else |
|
464 |
AC_MSG_FAILURE(m4_normalize([The curl library was not found, but it has |
|
465 |
been requested])) |
|
466 |
fi |
|
421 |
AC_MSG_FAILURE([ghc-pkg not found, compilation will not be possible]) |
|
422 |
fi |
|
423 |
|
|
424 |
# check for modules, first custom/special checks |
|
425 |
AC_MSG_NOTICE([checking for required haskell modules]) |
|
426 |
HTOOLS_NOCURL=-DNO_CURL |
|
427 |
if test "$enable_htools_rapi" != "no"; then |
|
428 |
AC_GHC_PKG_CHECK([curl], [HTOOLS_NOCURL=], []) |
|
429 |
if test -n "$HTOOLS_NOCURL"; then |
|
430 |
if test "$enable_htools_rapi" = "check"; then |
|
431 |
AC_MSG_WARN(m4_normalize([The curl library was not found, Haskell |
|
432 |
code will be compiled without RAPI support])) |
|
467 | 433 |
else |
468 |
HTOOLS_NOCURL= |
|
434 |
AC_MSG_FAILURE(m4_normalize([The curl library was not found, but it has |
|
435 |
been requested])) |
|
469 | 436 |
fi |
470 |
AC_MSG_RESULT($GHC_PKG_CURL) |
|
471 |
fi |
|
472 |
AC_SUBST(GHC_PKG_CURL) |
|
473 |
AC_SUBST(HTOOLS_NOCURL) |
|
474 |
AC_MSG_CHECKING([parallel]) |
|
475 |
GHC_PKG_PARALLEL=$($GHC_PKG --simple-output list 'parallel-3.*') |
|
476 |
if test -n "$GHC_PKG_PARALLEL" |
|
477 |
then |
|
478 |
HTOOLS_PARALLEL3=-DPARALLEL3 |
|
479 | 437 |
else |
480 |
GHC_PKG_PARALLEL=$($GHC_PKG --simple-output list 'parallel-2.*') |
|
481 |
fi |
|
482 |
if test -z "$GHC_PKG_PARALLEL" |
|
483 |
then |
|
484 |
GHC_PKG_PARALLEL=$($GHC_PKG --simple-output list 'parallel-1.*') |
|
485 |
fi |
|
486 |
AC_SUBST(GHC_PKG_PARALLEL) |
|
487 |
AC_SUBST(HTOOLS_PARALLEL3) |
|
488 |
AC_MSG_RESULT($GHC_PKG_PARALLEL) |
|
489 |
AC_MSG_CHECKING([json]) |
|
490 |
GHC_PKG_JSON=$($GHC_PKG latest json) |
|
491 |
AC_MSG_RESULT($GHC_PKG_JSON) |
|
492 |
AC_MSG_CHECKING([network]) |
|
493 |
GHC_PKG_NETWORK=$($GHC_PKG latest network) |
|
494 |
AC_MSG_RESULT($GHC_PKG_NETWORK) |
|
495 |
AC_MSG_CHECKING([QuickCheck 2.x]) |
|
496 |
GHC_PKG_QUICKCHECK=$($GHC_PKG --simple-output list 'QuickCheck-2.*') |
|
497 |
AC_MSG_RESULT($GHC_PKG_QUICKCHECK) |
|
498 |
if test -z "$GHC_PKG_PARALLEL" || test -z "$GHC_PKG_JSON" || \ |
|
499 |
test -z "$GHC_PKG_NETWORK"; then |
|
500 |
if test "$enable_htools" != "check"; then |
|
501 |
AC_MSG_FAILURE(m4_normalize([Required Haskell modules not found, htools |
|
502 |
compilation disabled])) |
|
503 |
fi |
|
504 |
else |
|
505 |
# we leave the other modules to be auto-selected |
|
506 |
HTOOLS_MODULES="-package $GHC_PKG_PARALLEL" |
|
507 |
fi |
|
508 |
if test -z "$GHC_PKG_QUICKCHECK"; then |
|
509 |
AC_MSG_WARN(m4_normalize([The QuickCheck 2.x module was not found, |
|
510 |
you won't be able to run Haskell unittests])) |
|
438 |
AC_MSG_NOTICE([Enabling curl/RAPI/RPC usage in Haskell code]) |
|
511 | 439 |
fi |
512 | 440 |
fi |
513 |
AC_SUBST(HTOOLS_MODULES) |
|
514 |
AC_SUBST(GHC_PKG_QUICKCHECK) |
|
515 |
|
|
516 |
if test "$enable_htools" != "no"; then |
|
517 |
if test -z "$GHC" || test -z "$HTOOLS_MODULES"; then |
|
518 |
AC_MSG_WARN(m4_normalize([Haskell compiler/required libraries not found, |
|
519 |
htools compilation disabled])) |
|
441 |
AC_SUBST(HTOOLS_NOCURL) |
|
442 |
|
|
443 |
HTOOLS_PARALLEL3= |
|
444 |
AC_GHC_PKG_CHECK([parallel-3.*], [HTOOLS_PARALLEL3=-DPARALLEL3], |
|
445 |
[AC_GHC_PKG_REQUIRE(parallel)], t) |
|
446 |
AC_SUBST(HTOOLS_PARALLEL3) |
|
447 |
|
|
448 |
# and now standard modules |
|
449 |
AC_GHC_PKG_REQUIRE(json) |
|
450 |
AC_GHC_PKG_REQUIRE(network) |
|
451 |
AC_GHC_PKG_REQUIRE(mtl) |
|
452 |
AC_GHC_PKG_REQUIRE(bytestring) |
|
453 |
AC_GHC_PKG_REQUIRE(utf8-string) |
|
454 |
|
|
455 |
# extra modules for confd functionality |
|
456 |
HTOOLS_REGEX_PCRE=-DNO_REGEX_PCRE |
|
457 |
has_confd=False |
|
458 |
if test "$enable_confd" != "no"; then |
|
459 |
CONFD_PKG= |
|
460 |
AC_GHC_PKG_CHECK([regex-pcre], [HTOOLS_REGEX_PCRE=], |
|
461 |
[CONFD_PKG="$CONFD_PKG regex-pcre"]) |
|
462 |
AC_GHC_PKG_CHECK([hslogger], [], [CONFD_PKG="$CONFD_PKG hslogger"]) |
|
463 |
AC_GHC_PKG_CHECK([Crypto], [], [CONFD_PKG="$CONFD_PKG Crypto"]) |
|
464 |
AC_GHC_PKG_CHECK([text], [], [CONFD_PKG="$CONFD_PKG text"]) |
|
465 |
AC_GHC_PKG_CHECK([hinotify], [], [CONFD_PKG="$CONFD_PKG hinotify"]) |
|
466 |
if test -z "$CONFD_PKG"; then |
|
467 |
has_confd=True |
|
520 | 468 |
else |
521 |
HTOOLS=yes |
|
469 |
if test "$enable_confd" = "check"; then |
|
470 |
AC_MSG_WARN(m4_normalize([The required extra libraries for confd were |
|
471 |
not found ($CONFD_PKG), confd disabled])) |
|
472 |
else |
|
473 |
AC_MSG_FAILURE(m4_normalize([The confd functionality was requested, but |
|
474 |
required libraries were not found: |
|
475 |
$CONFD_PKG])) |
|
476 |
fi |
|
522 | 477 |
fi |
523 | 478 |
fi |
479 |
AC_SUBST(HTOOLS_REGEX_PCRE) |
|
480 |
if test "$has_confd" = "True"; then |
|
481 |
AC_MSG_NOTICE([Enabling confd usage]) |
|
482 |
fi |
|
483 |
AC_SUBST(ENABLE_CONFD, $has_confd) |
|
484 |
AM_CONDITIONAL([ENABLE_CONFD], [test x$has_confd = xTrue]) |
|
485 |
|
|
486 |
# development modules |
|
487 |
HTOOLS_NODEV= |
|
488 |
AC_GHC_PKG_CHECK([QuickCheck-2.*], [], [HTOOLS_NODEV=1], t) |
|
489 |
AC_GHC_PKG_CHECK([test-framework-0.6*], [], [HTOOLS_NODEV=1], t) |
|
490 |
AC_GHC_PKG_CHECK([test-framework-hunit], [], [HTOOLS_NODEV=1]) |
|
491 |
AC_GHC_PKG_CHECK([test-framework-quickcheck2], [], [HTOOLS_NODEV=1]) |
|
492 |
if test -n "$HTOOLS_NODEV"; then |
|
493 |
AC_MSG_WARN(m4_normalize([Required development modules were not found, |
|
494 |
you won't be able to run Haskell unittests])) |
|
495 |
else |
|
496 |
AC_MSG_NOTICE([Haskell development modules found, unittests enabled]) |
|
497 |
fi |
|
498 |
AC_SUBST(HTOOLS_NODEV) |
|
499 |
|
|
500 |
HTOOLS=yes |
|
524 | 501 |
AC_SUBST(HTOOLS) |
525 | 502 |
|
526 | 503 |
# --enable-split-query |
... | ... | |
541 | 518 |
;; |
542 | 519 |
esac |
543 | 520 |
]], |
544 |
[[case "x${enable_confd}x${HTOOLS_NOCURL}x" in
|
|
521 |
[[case "x${has_confd}x${HTOOLS_NOCURL}x" in
|
|
545 | 522 |
xTruexx) |
546 | 523 |
enable_split_query=True |
547 | 524 |
;; |
... | ... | |
551 | 528 |
esac]]) |
552 | 529 |
AC_SUBST(ENABLE_SPLIT_QUERY, $enable_split_query) |
553 | 530 |
|
554 |
if test x$enable_split_query = xTrue -a x$enable_confd != xTrue; then
|
|
531 |
if test x$enable_split_query = xTrue -a x$has_confd != xTrue; then
|
|
555 | 532 |
AC_MSG_ERROR([Split queries require the confd daemon]) |
556 | 533 |
fi |
557 | 534 |
|
... | ... | |
592 | 569 |
AC_MSG_WARN([hlint not found, checking code will not be possible]) |
593 | 570 |
fi |
594 | 571 |
|
595 |
fi # end if enable_htools, define automake conditions |
|
596 |
|
|
597 | 572 |
if test "$HTOOLS" != "yes" && test "$ENABLE_CONFD" = "True"; then |
598 | 573 |
AC_MSG_ERROR(m4_normalize([cannot enable ganeti-confd if |
599 | 574 |
htools support is not enabled])) |
b/doc/devnotes.rst | ||
---|---|---|
86 | 86 |
|
87 | 87 |
Or alternatively via ``cabal``:: |
88 | 88 |
|
89 |
$ cabal install quickcheck hscolour hlint shelltestrunner |
|
89 |
$ cabal install QuickCheck HUnit \ |
|
90 |
test-framework test-framework-quickcheck2 test-framework-hunit \ |
|
91 |
hscolour hlint shelltestrunner |
|
90 | 92 |
|
91 | 93 |
|
92 | 94 |
Configuring for development |
Also available in: Unified diff