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