try Apple AArch64 again
[cabal.git] / doc / how-to-source-packages.rst
blobcaecf7e90ac1d5959bad7d7bcd557ca161edbb00
1 How to deal with package *source code*
2 ======================================
4 We can leave a **"source"** marker in the package description that shows where
5 to find the *source code*. This marker is the ``source-repository`` field and is
6 described in the :ref:`package author<pkg-authors>` section.
8 We can direct Cabal to get (or **"source"**) the package *source code* for
9 dependencies from a **source code repository** by adding a
10 ``source-repository-package`` stanza to a project as explained in the
11 :ref:`package consumer<pkg-consumers>` section.
13 Getting package *source code* without Cabal
14 -------------------------------------------
16 There are two ways to grab the *source code* for a package manually; from a
17 **source code repository** such as GitHub [#]_ or from a **package repository**
18 such as Hackage.  Cabal automates these two ways of obtaining the *source code*.
19 This is described in the :ref:`package consumer<pkg-consumers>` section.
21 .. Note::
23    The *source code* for a package is not always available from a source code
24    repository. This will be the case for published packages where the
25    ``source-repository`` source marker was not added to the package's ``.cabal``
26    description before being published, when the source code repository no longer
27    exists or when it was never made available.  In those cases the only
28    available *source code* will be source archives on Hackage.
30    Each package on Hackage is available for download as a ``.tar.gz`` source
31    archive. Look for the "Downloads" section. One of these will be the "Package
32    description". That's the ``.cabal`` file. The other will be the "Cabal source
33    package". That's the ``.tar.gz`` archive containing all of the source for the
34    package.  For example, here's the direct link to download
35    `vector-0.13.1.0.tar.gz <vector-download_>`_.
37    Conversely, package *source code* may be only available from a source code
38    repository.  This is the case for all unpublished packages and for all
39    unpublished commits.
41 .. Warning::
43    Be careful with the term "revision". On Hackage this refers to an edited
44    version of the package description. With version control systems, a revision
45    is a commit. Thankfully, when telling Cabal about a "commit" or "revision",
46    the field name is something completely different, a ``tag``.
48 Fields pointing to *source code* repositories
49 ---------------------------------------------
51 Source [code] repositories are a way to specify where to find the source code
52 for a package, both for :ref:`package authors<pkg-authors>` and maintainers and
53 for :ref:`package consumers<pkg-consumers>`.
55 A relatively structured set of version control system (VCS) fields, that vary
56 depending on the :ref:`VCS kind<vcs-kind>`, enables Cabal commands and other
57 tools to interpret and make effective use of this information.
59 ``source-repository``
60    Says where to find the source for a package and is a metadata field of a
61    **package description**. This is the source marker.
63 ``source-repository-package``
64    Locates the source for one or more **project dependencies** that live in the
65    same **source code repository** but in separate folders. The root of the
66    repository is assumed when the ``subdir`` field is omitted.
68 .. Warning::
70    The ``source-repository`` field, the one without a "-package" suffix, belongs
71    to a package!  This actually makes perfect sense as it's within the package
72    description looking outwards.
74    .. code-block:: text
76        (package description)      source-repository         (Git repository)
77       solver-benchmarks.cabal ──────────────────────────> github/haskell/cabal
79       $ cat solver-benchmarks.cabal
80       ...
81       source-repository head
82          type:     git
83          location: https://github.com/haskell/cabal/
84          subdir:   solver-benchmarks
85       ...
86       library
87          build-depends: base, ..., vector
89    The ``source-repository-package`` field, the one with a "-package" suffix,
90    doesn't belong to a package! It's for a project dependency. This name is a
91    bit misleading being singular because it can describe multiple dependency
92    packages at the same location, each offset by a directory containing a
93    package description, a ``.cabal`` file.
95    This project stanza is like a redirect or override for dependencies of all
96    the packages in the project saying "use this source code repository" for this
97    package dependency, not Hackage.
99    .. code-block:: text
101         (project)       source-repository-package         (Git repository)
102       cabal.project ──────────────────────────────────> github/haskell/vector
104       $ tree
105       ...
106       └── solver-benchmarks
107          └── solver-benchmarks.cabal
109       $ cat cabal.project
110       packages: solver-benchmarks
111       ...
112       source-repository-package
113          type:     git
114          location: https://github.com/haskell/vector.git
115          subdir:   vector
117 .. Warning::
119    Cabal project files (``cabal.project``) don't declare dependencies!
121    The union of the dependencies of all project packages [#]_ declares the set
122    of project dependencies.  While the project can tighten version constraint
123    ranges with ``constraints`` or loosen them with ``allow-newer`` or
124    ``allow-older``, it cannot add package names to or remove package names from
125    the set of dependencies.
127 .. _pkg-consumers:
129 *Source code* when taking a package dependency
130 ----------------------------------------------
132 Cabal commands that work with dependencies actually need to have the source code
133 of each dependency and will download it as needed. Example of commands like this
134 are ``cabal build`` or ``cabal freeze``.
136 Dependencies of a project are sourced, by default, from Hackage if they've been
137 uploaded and published to this package repository. Cabal will download the
138 *source code* ``.tar.gz`` archive for each dependency from Hackage. While we can
139 depend on an exact version of a package, more often we'll accept a range of
140 versions and the dependency solver picks the exact version from the range to
141 download.
143 We can also :ref:`take a dependency from a source code
144 repository<pkg-consume-source>`. These are accessed via a version control system
145 (VCS) such as Git and set up in the project with ``source-package-repository``
146 stanzas. With these, we can take dependencies on packages not published to
147 Hackage, on revisions not yet published or on forks.  This is the easiest way to
148 work with a fork, much easier than using a Git submodule.  A dependency taken
149 this way, effectively adds a local package to the project much like listing the
150 package's source directory in the packages field, except that the source code is
151 downloaded by Cabal using the version control system.
153 For example, with a project that depends on the ``vector`` package from source
154 we can see that the source code repository has been cloned by ``cabal build``:
156 .. code-block:: text
158    $ cat cabal.project
159    ...
160    source-repository-package
161       type:     git
162       location: https://github.com/haskell/vector.git
163       subdir:   vector
165    $ cabal build all --dry-run
166    Cloning into '/.../dist-newstyle/src/vector-51ba9353b7a850a'...
167    remote: Enumerating objects: 9542, done.
168    remote: Counting objects: 100% (1800/1800), done.
169    remote: Compressing objects: 100% (652/652), done.
170    remote: Total 9542 (delta 1010), reused 1599 (delta 917), pack-reused 7742
171    Receiving objects: 100% (9542/9542), 2.52 MiB | 16.56 MiB/s, done.
172    Resolving deltas: 100% (5273/5273), done.
173    HEAD is now at 6b8bbc3 ...
174    Resolving dependencies...
176 Cabal makes an archive from the cloned source code repository and uses this as
177 the source for the dependency.
179 .. code-block:: text
181       $ find -name '*.tar.gz'
182       ...
183       ./dist-newstyle/src/vector-51ba9353b7a850a-vector-0.13.1.0.tar.gz
186 .. Warning::
188    The hash in the directory name of the clone is not the commit hash of the
189    cloned repository.
191    .. code-block:: text
193          $ cd dist-newstyle/src/vector-51ba9353b7a850a
195          $ git rev-parse HEAD
196          6b8bbc3a75b40451d8d225e30c576dfe89121c49
198 Setting up a *source code* dependency
199 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
201 It is easy to copy the fields of ``source-repository`` to set up a
202 ``source-repository-package`` as they share many of the same :ref:`VCS
203 fields<vcs-fields>`. Looking at vector's `package description
204 <vector-pkg-desc_>`_ on Hackage we see the ``source-repository`` stanza:
206 .. code-block:: cabal
208    source-repository head
209       type:     git
210       location: https://github.com/haskell/vector.git
211       subdir:   vector
213 To turn that into a dependency we'd make the following changes to prepare a
214 ``source-repository-package`` stanza for our project, using the Git commit hash
215 for the ``tag`` field:
217 .. code-block:: diff
219    - source-repository head
220    + source-repository-package
221          type:     git
222          location: https://github.com/haskell/vector.git
223    +     tag:      79bdd2edcfaf6b07f7fabc43a7d9c5a2ff93d3ca
224          subdir:   vector
226 .. code-block:: text
228    $ git ls-remote --tags
229    From git@github.com:haskell/vector.git
230    ...
231    79bdd2edcfaf6b07f7fabc43a7d9c5a2ff93d3ca     refs/tags/vector-0.13.1.0
233 .. Warning::
235    Only a commit hash pins to an exact version of the *source code* for Git
236    respositories.
238    - If the ``tag`` field is omitted then the latest commit on the Git default branch is used.
239    - If the ``tag`` field is a Git branch name then the latest commit on that branch is used.
240    - If the ``tag`` field is a Git tag then the current commit that tag points to is used.
243 *Source code* when dependency vendoring
244 ---------------------------------------
246 *Vendoring* is where you add the source code of an external package to your
247 project, either as a package ``.tar.gz`` archive or as unpacked package source
248 code.
250 Vendoring a *source code* archive
251 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
253 After manually downloading a source code archive from Hackage (or elsewhere),
254 you can add it to your project as a local package.
256    .. code-block:: shell
258       $ VER=0.13.1.0 \
259          curl -sSL https://hackage.haskell.org/package/vector-{$VER}/vector-{$VER}.tar.gz \
260          --output vector-{$VER}.tar.gz \
261       $ VER=0.13.1.0 echo "packages: vector-$VER.tar.gz" >> cabal.project
262       $ cabal build vector --dry-run
263       ...
264       Resolving dependencies...
265       Build profile: -w ghc-9.8.2 -O1
266       In order, the following would be built (use -v for more details):
267       - vector-0.13.1.0 (lib) (requires build)
269 Vendoring unpacked *source code*
270 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
272 You can use :ref:`cabal get<cabal-get>` and then add the unpack directory to the
273 ``packages`` field in the project's ``cabal.project`` file.  This downloads the
274 package's ``.tar.gz`` source code archive and extracts it to a directory named
275 after the package name and version.
277 - For an exact version of the package, use the package name and version.
279    .. code-block:: shell
281       $ VER=0.12.3.1 cabal get vector-{$VER}
282       Unpacking to vector-0.12.3.1/
283       $ VER=0.12.3.1 echo "packages: vector-$VER" >> cabal.project
285 - For the latest version of the package, use the package name only after a ``cabal update``.
287    .. code-block:: shell
289       $ cabal update
290       $ cabal get vector
291       Unpacking to vector-0.13.1.0/
292       $ echo "packages: vector-0.13.1.0" >> cabal.project
294 You can vendor unpacked source code obtained by other means, by means that
295 replace the ``cabal get`` unpacking step, in the same way.
297 Fork, don't vendor
298 ^^^^^^^^^^^^^^^^^^
299 There's no need to vendor packages on Hackage if you expect Hackage to always be
300 available, as packages cannot be deleted from Hackage. Source code repositories,
301 on the other hand, can disappear.
303 Rather than vendoring, it might be easier to take a
304 ``source-repository-package`` dependency on a fork of the upstream source code
305 repository, on a fork that you control, especially if you're going to be making
306 contributions to the upstream repository.
308 .. _pkg-authors:
310 *Source code* as a package author or maintainer
311 -----------------------------------------------
313 If you are authoring or maintaining a package and want to link to the
314 :ref:`package source<pkg-author-source>` you will be dealing with
315 ``source-repository``, a package description stanza that typically specifies
316 where upstream development of the package is happening.  A package published to
317 Hackage will be displayed with a link to the source repository if a
318 ``source-repository`` stanza is present in the package description.
320 This helps users find the source code for the package if they want to contribute
321 to it or if they want to try out the latest changes before they're published.
322 The simplest way to try out the latest changes is to add a
323 ``source-repository-package`` dependency on the package so that it will be
324 picked up from the source code repository instead of from Hackage.
326 *Source code* as a package publisher
327 ------------------------------------
329 If you are publishing a package to Hackage, you'll first need to create a
330 ``.tar.gz`` archive of your package's source code before `uploading it to
331 Hackage <hackage-upload_>`_. This is done with the :ref:`cabal-sdist` command
332 that names archives after package name and version.
334 .. [#] Also known as a version control system (VCS) repository.
336 .. [#] When the list of all packages is taken from the ``packages`` field(s) within a ``cabal.project``.
338 .. _vector-download: https://hackage.haskell.org/package/vector-0.13.1.0/vector-0.13.1.0.tar.gz
340 .. _vector-pkg-desc: https://hackage.haskell.org/package/vector-0.13.1.0/vector.cabal
342 .. _hackage-upload: https://hackage.haskell.org/upload