Skip to content

Commit

Permalink
Document multiple public libraries
Browse files Browse the repository at this point in the history
  • Loading branch information
fgaz authored and mergify[bot] committed Aug 11, 2022
1 parent 2d65203 commit 27f9818
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 13 deletions.
11 changes: 11 additions & 0 deletions doc/buildinfo-fields-reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,17 @@ virtual-modules
\mathrm{commalist}\left({\left(\mathop{\mathit{upper}}{\left\{ \mathop{\mathit{alpha\text{-}num}}\mid[\mathop{\mathord{``}\mathtt{\text{'}}\mathord{"}}\mathop{\mathord{``}\mathtt{\text{_}}\mathord{"}}] \right\}}^\ast_{}\right)}^+_{\mathop{\mathord{``}\mathtt{\text{.}}\mathord{"}}}\right)
Library fields
--------------

visibility
* Optional field
* Documentation of :pkg-field:`library:visibility`

.. math::
\left\{ \mathop{\mathord{``}\mathtt{public}\mathord{"}}\mid\mathop{\mathord{``}\mathtt{private}\mathord{"}} \right\}
Package description fields
--------------------------

Expand Down
45 changes: 32 additions & 13 deletions doc/cabal-package.rst
Original file line number Diff line number Diff line change
Expand Up @@ -849,11 +849,18 @@ The library section should contain the following fields:

:since: 3.0

:default: ``private`` for internal libraries. Cannot be set for public library.
:default:
``private`` for internal libraries. Cannot be set for main
(unnamed) library, which is always public.

Cabal recognizes ``public`` and ``private`` here...
Can be ``public`` or ``private``.
Makes it possible to have multiple public libraries in a single package.
If set to ``public``, depending on this library from another package is
allowed. If set to ``private``, depending on this library is allowed only
from the same package.

Multiple public libraries...
See section on :ref:`Internal Libraries <sublibs>` for examples and more
information.

.. pkg-field:: reexported-modules: exportlist
:since: 1.22
Expand Down Expand Up @@ -991,6 +998,18 @@ a real-world use case:

default-language: Haskell2010

**Multiple public libraries**

Cabal 3.0 and later support exposing multiple libraries from a single package
through the field :pkg-field:`library:visibility`.
Having multiple public libraries is useful for separating the unit of
distribution (package) from the unit of buildable code (library).
For more information about the rationale and some examples, see
`this blog post <https://fgaz.me/posts/2019-11-14-cabal-multiple-libraries/>`__.

..
TODO inline the blog post

Opening an interpreter session
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down Expand Up @@ -1561,16 +1580,16 @@ system-dependent values for these fields.
**Library Names**

External libraries are identified by the package's name they're
provided by (currently a package can only publicly expose its
main library component; in future, packages with multiple exposed
public library components will be supported and a syntax for
referring to public sub-libraries will be provided).

In order to specify an intra-package dependency on an internal
library component you can use the unqualified name of the
library component. Note that locally defined sub-library
names shadow external package names of the same name. See section on
:ref:`Internal Libraries <sublibs>` for examples and more information.
provided by, optionally followed by a colon and the library name
(available from ``cabal-version: 3.0``).
If the library name is absent, the main (unnamed) library will be used.
To refer to the main (unnamed) library explicitly, use the name of the
package (``foo:foo``).
Multiple libraries from the same package can be specified with the shorthand
syntax ``pkg:{lib1,lib2}```.

See section on :ref:`Internal Libraries <sublibs>` for examples and more
information.

**Version Constraints**

Expand Down
5 changes: 5 additions & 0 deletions doc/file-format-changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ relative to the respective preceding *published* version.
``cabal-version: 3.0``
----------------------

* New :pkg-field:`library:visibility` for exposing sublibraries.

* New ``pkg:lib`` and ``pkg:{lib1,lib2}`` syntax in :pkg-field:`build-depends`
for depending on public sublibraries from other packages.

* Added the :pkg-field:`extra-dynamic-library-flavours` field to specify non-trivial
variants of dynamic flavours. It is :pkg-field:`extra-library-flavours` but for
shared libraries. Mainly useful for GHC's RTS library.
Expand Down

0 comments on commit 27f9818

Please sign in to comment.