Cabal- A framework for packaging Haskell software

Safe HaskellNone




Note: Buildable versus requested versus enabled components

What's the difference between a buildable component (ala componentBuildable), a requested component (ala componentNameRequested), and an enabled component (ala componentEnabled)?

A component is buildable if, after resolving flags and conditionals, there is no buildable: False property in it. This is a static property that arises from the Cabal file and the package description flattening; once we have a PackageDescription buildability is known.

A component is requested if a user specified, via a the flags and arguments passed to configure, that it should be built. E.g., --enable-tests or --enable-benchmarks request all tests and benchmarks, if they are provided. What is requested can be read off directly from ComponentRequestedSpec. A requested component is not always buildable; e.g., a user may --enable-tests but one of the test suites may have buildable: False.

A component is enabled if it is BOTH buildable and requested. Once we have a LocalBuildInfo, whether or not a component is enabled is known.

Generally speaking, most Cabal API code cares if a component is enabled. (For example, if you want to run a preprocessor on each component prior to building them, you want to run this on each enabled component.)

Note that post-configuration, you will generally not see a non-buildable Component. This is because flattenPD will drop any such components from PackageDescription. See #3858 for an example where this causes problems.

data ComponentRequestedSpec Source #

Describes what components are enabled by user-interaction. See also this note in Distribution.Types.ComponentRequestedSpec.



Eq ComponentRequestedSpec Source # 
Read ComponentRequestedSpec Source # 
Show ComponentRequestedSpec Source # 
Generic ComponentRequestedSpec Source # 
Binary ComponentRequestedSpec Source # 
type Rep ComponentRequestedSpec Source # 
type Rep ComponentRequestedSpec = D1 (MetaData "ComponentRequestedSpec" "Distribution.Types.ComponentRequestedSpec" "Cabal-" False) ((:+:) (C1 (MetaCons "ComponentRequestedSpec" PrefixI True) ((:*:) (S1 (MetaSel (Just Symbol "testsRequested") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Bool)) (S1 (MetaSel (Just Symbol "benchmarksRequested") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Bool)))) (C1 (MetaCons "OneComponentRequestedSpec" PrefixI False) (S1 (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 ComponentName))))

data ComponentDisabledReason Source #

A reason explaining why a component is disabled.


defaultComponentRequestedSpec :: ComponentRequestedSpec Source #

The default set of enabled components. Historically tests and benchmarks are NOT enabled by default.


componentNameRequested :: ComponentRequestedSpec -> ComponentName -> Bool Source #

Is this component name enabled? See also this note in Distribution.Types.ComponentRequestedSpec.


componentEnabled :: ComponentRequestedSpec -> Component -> Bool Source #

Is this component enabled? See also this note in Distribution.Types.ComponentRequestedSpec.


componentDisabledReason :: ComponentRequestedSpec -> Component -> Maybe ComponentDisabledReason Source #

Is this component disabled, and if so, why?