Cabal flags for controlling bounds checks and internal checks
[darcs-mirrors/vector.git] / vector.cabal
1 Name:           vector
2 Version:        0.5
3 License:        BSD3
4 License-File:   LICENSE
5 Author:         Roman Leshchinskiy <rl@cse.unsw.edu.au>
6 Maintainer:     Roman Leshchinskiy <rl@cse.unsw.edu.au>
7 Copyright:      (c) Roman Leshchinskiy 2008-2009
8 Homepage:       http://darcs.haskell.org/vector
9 Category:       Data, Data Structures
10 Synopsis:       Efficient Arrays
11 Description:
12         .
13         An efficient implementation of Int-indexed arrays with a powerful loop
14         fusion framework.
15         .
16         It is structured as follows:
17         .
18         [@Data.Vector@] boxed vectors of arbitrary types
19         .
20         [@Data.Vector.Primitive@] unboxed vectors of primitive types as
21                 defined by the @primitive@ package
22         .
23         [@Data.Vector.Storable@] unboxed vectors of 'Storable' types
24         .
25         [@Data.Vector.Generic@] generic interface to the vector types
26         .
27
28 Cabal-Version:  >= 1.2
29 Build-Type:     Simple
30
31 Extra-Source-Files:
32       tests/vector-tests.cabal
33       tests/LICENSE
34       tests/Setup.hs
35       tests/Main.hs
36       tests/Boilerplater.hs
37       tests/Utilities.hs
38       tests/Tests/Stream.hs
39       tests/Tests/Vector.hs
40
41 Flag EnableAssertions
42   Description: Enable assertions that check parameters to functions are reasonable.
43                These will impose a moderate performance cost on users of the library,
44                with the benefit that you get reasonable errors rather than segmentation faults!
45   Default:     True
46
47 Flag BoundsChecks
48   Description: Enables bounds checking
49   Default: True
50
51 Flag InternalChecks
52   Description: Enables internal consistency checks at the cost of a
53                significant performance penalty
54   Default: False
55
56
57 Library
58   Extensions: CPP
59   Exposed-Modules:
60         Data.Vector.Fusion.Util
61         Data.Vector.Fusion.Stream.Size
62         Data.Vector.Fusion.Stream.Monadic
63         Data.Vector.Fusion.Stream
64
65         Data.Vector.Internal.Check
66
67         Data.Vector.Generic.Mutable
68         Data.Vector.Generic.New
69         Data.Vector.Generic
70
71         Data.Vector.Primitive.Mutable
72         Data.Vector.Primitive
73
74         Data.Vector.Storable.Internal
75         Data.Vector.Storable.Mutable
76         Data.Vector.Storable
77
78         Data.Vector.Mutable
79         Data.Vector
80   Include-Dirs:
81         include
82
83   Install-Includes:
84         vector.h
85
86   Build-Depends: base >= 2 && < 5, ghc >= 6.9, primitive
87
88 -- -finline-if-enough-args is ESSENTIAL. If we don't have this the partial application
89 -- of e.g. Stream.Monadic.++ to the monad dictionary at the use site in Stream.++ causes
90 -- it to be fruitlessly inlined. This in turn leads to a huge RHS for Stream.++, so it
91 -- doesn't get inlined at the final call site and fusion fails to occur.
92   if impl(ghc<6.13)
93     Ghc-Options: -finline-if-enough-args
94   
95 -- It's probably a good idea to compile the library with -O2 as well. However, it's probably
96 -- not as essential as you think because most of the optimisation occurs when the library
97 -- functions from here are inlined into the user programs (which SHOULD be compiled with -O2!).
98 --
99 -- We have to fiddle with the assertion stuff at this point too because -O2 implies -fno-ignore-asserts,
100 -- meaning that their relative ordering is CRUCIAL. Setting them together guarantees it.
101   if flag(enableassertions)
102     -- Asserts are ignored by default at -O1 or higher
103     Ghc-Options: -O2 -fno-ignore-asserts
104   else
105     Ghc-Options: -O2
106
107   if flag(BoundsChecks)
108     cpp-options: -DVECTOR_BOUNDS_CHECKS
109
110   if flag(InternalChecks)
111     cpp-options: -DVECTOR_INTERNAL_CHECKS
112