]> git.proxmox.com Git - debcargo-conf.git/blame - README.rst
Note about developing using Debian Rust packages
[debcargo-conf.git] / README.rst
CommitLineData
89606032
XL
1.. contents::
2
3Packaging a crate for Debian
4============================
d580884e 5
c9806f32 6To get set up, run at Debian unstable (recommended)::
1057693c 7
4333698e 8 apt update && apt install debcargo
1057693c
XL
9
10Then for each new package:
23db3623 11
8960a81d
XL
12To package a new crate, or to update an existing crate
13------------------------------------------------------
931eabc0 14
8960a81d
XL
15::
16
17 ./new-package.sh <rust-crate-name> # or
18 ./update.sh <rust-crate-name>
86e10bdd 19
6c1b3182
XL
20and follow its instructions.
21
8960a81d 22Note that ``new-package.sh`` is just a symlink to ``update.sh``, to help newcomers.
7b976234 23
1ff2ded3
XL
24To package a co-installable older version of a crate
25----------------------------------------------------
7b976234 26
6c1b3182 27To maintain an old version of a crate alongside the latest one, first make sure
8960a81d 28the latest version is packaged by doing all of the above, then run::
6c1b3182 29
8960a81d
XL
30 ./new-package.sh <rust-crate-name> <old-version> # or
31 ./update.sh <rust-crate-name> <old-version>
86e10bdd 32
fed17d69
XL
33and follow its instructions. To save time, you can first copy anything relevant
34from ``src/<rust-crate-name>`` to ``src/<rust-crate-name>-<old-version>``, then
35adapt it as needed.
999f9269 36
8960a81d
XL
37To prepare a release
38--------------------
39
40::
5cbe2f60 41
699de4ac
SL
42 ./release.sh <rust-crate-name> # or
43 ./release.sh <rust-crate-name> <old-version> # as appropriate
44 DISTRO=experimental ./release.sh <rust-crate-name> # to target another distro
86e10bdd 45
fed17d69
XL
46This prepares the necessary Debian files in ``build/``, and creates a git
47branch to manage the packaging until it is accepted in Debian itself. You need
48to run additional commands after this - more specific instructions are given to
49you about this, by the script after you run it.
6c1b3182 50
8960a81d
XL
51Holding packages at old versions
52--------------------------------
53
54If you need to keep the latest version in Debian at an older version than is
55released on crates.io, e.g. to upload an important bugfix without being blocked
56on having to package all the dependencies of the newest version, you can::
57
58 REALVER=<old-version> ./update.sh <rust-crate-name> # then
59 REALVER=<old-version> ./release.sh <rust-crate-name>
60
c6709bfe
XL
61Repackaging the existing revision
62---------------------------------
63
64In order to build a package A already in ``debcargo-conf/src``
65in the exact version which is present here, do the following::
66
67 $ ./repackage.sh A
68 $ cd build
69 $ ./build.sh A
70
71If this package is already in the archive and you want to recreate that
72exactly, you will need to use the exact same version of debcargo that was
73used previously. This version is mentioned in ``debian/changelog``.
74
d580884e 75
c6709bfe
XL
76Build environment
77=================
78
79To set up a suitable build environment for ``./build.sh``::
80
745a5a63 81 $ sudo apt-get install devscripts reprepro debootstrap sbuild dh-cargo schroot autopkgtest
c6709bfe
XL
82 $ sudo sbuild-createchroot --include=eatmydata,ccache,gnupg,dh-cargo,cargo,lintian,perl-openssl-defaults \
83 --chroot-prefix debcargo-unstable unstable \
84 /srv/chroot/debcargo-unstable-amd64-sbuild http://deb.debian.org/debian
85
1ff2ded3
XL
86An explanation of this, plus more recipes, can be found on the `sbuild wiki
87page <https://wiki.debian.org/sbuild>`_.
88
c6709bfe
XL
89Normally, ``./build.sh`` will fail early if not all the build dependencies are
90available in your local apt cache. If you are packaging a large dependency tree
91however, to avoid many round-trips through NEW it is possible to bypass this
92check and build all the packages together. Suppose package B depends on package
93A, then you can run something like::
94
95 $ export IGNORE_MISSING_BUILD_DEPS=1
96 $ ./release.sh A
97 $ ( cd build && ./build.sh A )
98 # push pending and checkout master
99 $ ./release.sh B
100 $ ( cd build && ./build.sh B librust-A*.deb )
101
102The extra arguments after ``./build.sh B <args>`` is extra deb files to pass to
103sbuild to use as dependencies. In this case, ``librust-A*.deb`` should have
104been built by the previous step.
105
106After everything is built successfully, you can ``dput`` all of them and then
107push all the ``pending-*`` branches as normal.
108
109
89606032
XL
110Repository structure
111====================
112
113``pending-*`` branches are managed by ``./release.sh``, so please don't manage
114them yourself as you will interfere with the working of that script. The
115intention is that they should only differ from the master branch by 1 commit,
116i.e. the ``dch -r`` commit created by ``./release.sh``.
117
118If you want to create separate non-master branches, that is fine - just don't
119call them ``pending-*`` and don't run ``./release.sh`` on those branches. If you
120want to test your crate, instead run::
121
122 cd build && [SOURCEONLY=1] ./build.sh <rust-crate-name> [<old-version>]
123
124omitting or not omitting the stuff in [] as needed.
125
126Like many other Debian git repositories, we don't follow "feature branch"
127practises here. We generally don't package just 1 or 2 rust crates at a time,
128but all of its dependencies and sometimes some reverse-dependencies too. So
129normally we'll be touching a few dozen packages at once. In this context, it's
130good to merge often, to avoid conflicts with someone else that might also need
131to touch those too in the next few days.
132
133To match a release (i.e. a ``.deb`` or a ``.dsc`` file) to a commit, find the
134commit message that actually says "Release package X". This will usually be a
135merge commit.
136
137
138Expert mode & packaging multiple packages
139=========================================
140
141You should get used to the single-packaging workflow a bit first, including
142doing a few `test builds <#build-environment>`_ of your package. Otherwise the
143instructions below may seem a bit opaque.
144
1451. ``rm -rf build/* && sbuild-update -udr debcargo-unstable-amd64-sbuild`` -
146 clears out your build directory, making the subsequent steps a bit faster.
1472. ``./update.sh <CRATE>`` for all your relevant packages
1483. Do any manual updates.
94d1ee96 1494. ``cd build`` then ``IGNORE_MISSING_BUILD_DEPS=1 ./build.sh <CRATE> *.deb``
89606032
XL
150 for all your relevant packages, in dependency order.
1515. Deal with any issues that come up.
1526. Push your updates to our git.
1537. Run ``dev/list-rdeps <CRATE> [<CRATE> ...]`` on all the crates you updated.
154 Any reverse-dependencies that are affected, also need to be updated and you
155 should repeat steps 1-7 (including this step) for them as well, until this
156 step lists no new packages that are affected.
1578. ``./release.sh <CRATE>`` for all the packages you updated, running the build
158 again if necessary. It may be possible to do this out of dependency order,
159 assuming you didn't have to make significant changes in step (5). If you
160 did, then this step also has to be done in dependency order.
1619. Push your ``pending-*`` branches to our git.
162
163I like to have 4 shell windows open for this:
164
1651. To do the manual updates.
1662. To explore git, to remember what step you're on and to lookup previous
167 reference material.
1683. To explore the build directory, e.g. logs and crate source code.
94d1ee96
XL
1694. To run a build. Try to have one running here at all times, for the next
170 package you didn't look at yet, to save time waiting.
89606032
XL
171
172There are also various scripts in ``dev/*`` that might help you. They should
173have a couple lines at the top of the source code describing their
174functionality and some brief usage instructions.
175
176Whew, thanks for all your work!
177
178
7f68b728
XL
179General packaging tips
180======================
181
182Dependencies on clippy
183----------------------
184
185Patch away dependencies on "clippy" unless it is a "real" dependency. Usually
186crates only use clippy to lint themselves and it is not a "real" dependency
187in the sense that they actually import clippy's code for what they do.
188
89606032
XL
189If you want to be sure, ``rg clippy`` and check that all the usages of it are
190inside ``cfg_attr`` declarations. If so, then just get rid of it.
7f68b728 191
738135f9
XL
192OS-specific crates
193------------------
194
195See redox-syscall for examples on how to deal with these.
196
197If this is unclear, ask on IRC.
198
7f68b728
XL
199Architecture-specific crates
200----------------------------
01f68998 201
738135f9 202This is a bit harder. Usually there are two options:
95399141 203
738135f9
XL
2041. The crate should build a dummy/no-op version of itself "out-of-the-box"
205 on the architectures it doesn't work on.
2062. Dependent crates should depend on it with a platform-specific dependency,
207 see https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies
208
209(1) involves less burden for others, both for dependent crates and for us
210packagers, since we don't have to override d/rules to ignore test failures on
211non-working architectures. You should communicate to upstream that this is
212the preferred approach.
213
214In the case of (2), the crate should document exactly what conditional should
215be used, and keep this documentation up-to-date. This allows us to easily
216determine if dependent crates are using the correct conditional. You will then
217have to override d/rules for this crate, see src/simd for an example.
218
219You should file a bug upstream if the crate does neither (1) nor document the
220conditions for (2), e.g. https://github.com/hsivonen/simd/issues/25
221
222(Actually the above applies even for "OS-specific crates" but then (2) is
223obvious so documentation is less necessary, and dependent crates all do it
224correctly already.)
95399141 225
a0c73b1a
XL
226Changed orig tarballs
227---------------------
228
229Sometimes the orig.tar generated by debcargo might change e.g. if you are using
230a newer version of debcargo and one of the dependencies relating to generating
231the tarball was updated and its behaviour changed - compression settings,
232tarball archive ordering, etc. This will cause your upload to get REJECTED by
233the Debian FTP archive for having a different orig.tar. In this case, set
1ff2ded3 234``REUSE_EXISTING_ORIG_TARBALL=1`` when running ``./release.sh``.
a0c73b1a 235
7f68b728
XL
236ITPs
237----
95399141 238
7f68b728 239Don't file ITPs for library crates, but do file them for binary crates.
01f68998 240
1ff2ded3
XL
241Generally we'll be uploading a dozen crates or so at once. Submitting ITPs for
242these is unnecessary since we're the only ones uploading and there is no chance
243of conflict. It would only be spam for the bug tracker. Please instead
244co-ordinate uploads on the ``#debian-rust`` IRC channel.
01f68998 245
0d1e2247
SL
246Testing
247-------
248
dc94b1d5
XL
249Debian has two types of tests:
250
1ff2ded3
XL
2511. pre-install tests run in ``debian/rules``
2522. post-install tests defined in ``debian/tests/control``
dc94b1d5
XL
253
254For Debian rust packages, in (1) we run the crate's test suite with default
255features but only if there are no dev-dependencies, and in (2) we run the whole
1ff2ded3
XL
256test suite with each feature enabled separately plus ``--no-default-features``
257and ``--all-features``.
dc94b1d5
XL
258
259Sometimes, tests require extra tweaks and settings to work. In this case, you
260can tweak ``debian/rules`` for (1), and for (2) you will simply have to mark
261the relevant tests as broken using ``test_is_broken = true``. See the existing
262crate configs for examples.
263
264Other times, the tests are simply broken or can't be run in Debian. In this
265case you should disable the test in (1) by running ``dh_auto_test -- build``
266instead of the default ``dh_auto_test -- test --all``, and for (2) again you
267should mark the relevant tests as broken.
b8798cdc
SL
268These tests are going to be marked as flaky in autopkgtest, still executed but
269won't fail the autopkgtest run.
dc94b1d5 270
ef62445b
SL
271Currently, using debcargo, it is not possible to add new dependencies as part
272of an autopkgtest run. See https://salsa.debian.org/rust-team/debcargo/-/merge_requests/24
273Instead, just override ``debian/tests/control``. See ``src/cbindgen/`` as
274example.
275
dc94b1d5
XL
276Please note that ``[packages.lib]\ntest_is_broken = true`` will transitively
277disable tests for all combinations of features. Sometimes this is correct e.g.
278if the test actually breaks for all features. Sometimes this is *not* correct,
279e.g. if the test only breaks for ``--no-default-features``. In the latter case
280you should instead patch the crate to ignore those tests when the relevant
1ff2ded3 281features are absent - e.g. ``src/regex-automata/debian/patches/ignore-std-tests.patch``.
01f68998 282
a1872536
XL
283Binary-crate has "required-features"
284------------------------------------
285
286See ``src/dotenv`` for an example on dealing with this.
287
288Binary-crate has conflicting name
289---------------------------------
290
291See ``src/fd-find`` for an example on dealing with this.
292
053e604c
SL
293Updating the dependencies
294-------------------------
295
ed1eaac5
XL
296In some cases, libraries/programs are forcing an old version of a library as
297dependencies. In order to limit the number of duplicated libraries in the
298archive, please try to evaluate if a newer version of the dependencies could be
299used.
300
1ff2ded3 301To achieve that, after ``./update.sh``, try::
ed1eaac5
XL
302
303 $ cd build/<package>/
304 $ rm -rf .pc # sometimes this is necessary due to minor debcargo bug
305 $ quilt push -a
306 $ quilt new relax-dep.diff
307 $ quilt edit Cargo.toml
16650581 308 $ quilt header -e --dep3
ed1eaac5
XL
309 $ quilt refresh
310 $ cargo build # check that it works. if it does, then
311 $ cp -R patches ../../src/<package>/debian
312
313Suppose you want to change the dependency from 0.3 to 0.5. If the crate builds
314with no further source changes, then we would change the required version in
315``Cargo.toml`` from ``0.3`` to ``>= 0.3, < 0.6`` or something like that. Then
316the convention is to put all these changes into a single patch called
317``relax-dep-versions.patch``.
318
319OTOH, if the cargo build fails, and you can fix it up by editing the source
320code in a minor way to use the new crate API, then: for each crate that needs
321to be updated, you should instead name the patch ``update-dep-<crate>.patch``
1ff2ded3
XL
322and add both the ``Cargo.toml`` and the source code changes to it. The change
323to ``Cargo.toml`` would then simply say (e.g.) ``0.5`` since the older versions
324actually don't work, and not the version range from the previous paragraph.
e4d0e3d6 325
870cacd0
RK
326If you want to make a crate work with an older dependency version than listed
327in ``Cargo.toml`` (for example 0.3 instead of 0.5), you cannot use a flexible
328version requirement like ``>= 0.3, < 0.6``. Instead you have to specify only
329the older version, in this example ``0.3`` (`explanation`_).
330
331.. _explanation: https://salsa.debian.org/rust-team/debcargo-conf/merge_requests/86#note_135456
332
16650581 333Information on patch headers is available in `dep3`_.
932e534e 334Use (some of) the headers to explain **why** the patch exists.
16650581 335
336.. _dep3: https://dep-team.pages.debian.net/deps/dep3/
337
e4d0e3d6
XL
338Help, something went wrong!
339---------------------------
340
341Sometimes, the error messages are not the most informative. In this case you
342can try re-running the command with ``RUST_BACKTRACE=1``. If you are using the
343``debcargo`` from Debian's own repositories, you should also install the
344``debcargo-dbgsym`` package, otherwise the stack trace will be next to useless.
345Make sure you have the `debug repository <https://wiki.debian.org/HowToGetABacktrace#Installing_the_debugging_symbols>`_
346enabled in your APT sources.
65c5dc9d
GS
347
348
349Some ramblings
350--------------
351
352In ``#debian-rust`` came these two blog posts along with the remark of _good read_
8c68fe9c
GS
353 * https://blog.hackeriet.no/packaging-a-rust-project-for-debian/
354 * https://blog.hackeriet.no/packaging-rust-part-II/
65c5dc9d 355
16650581 356Now are they, those two blog posts, parked here. Waiting for better integration.
901609d8
GS
357
358
359Developing Rust code using Debian-packaged crates
360=================================================
361
362While perhaps not the stated intention, the Rust ecosystem in Debian
363is actually quite usable for developing Rust code in general. Thanks
364to `source replacement
365<https://doc.rust-lang.org/cargo/reference/source-replacement.html>`_,
366Cargo can be configured to use only local, Debian-provided packages by
367placing something like the following in ``~/.cargo/config.toml``::
368
369 [net]
370 offline = true
371
372 [source]
373
374 [source.crates-io]
375 replace-with = "debian"
376
377 [source.debian]
378 directory = "/usr/share/cargo/registry
379
380In this state, Cargo will only look for crates installed as Debian
381packages on the local system.