]> git.proxmox.com Git - debcargo-conf.git/blame - README.rst
update.sh: fix up auto-uploader logic
[debcargo-conf.git] / README.rst
CommitLineData
d580884e
XL
1Instructions
2============
3
1057693c
XL
4To get set up, run::
5
4333698e 6 apt update && apt install debcargo
1057693c
XL
7
8Then for each new package:
23db3623 9
8960a81d
XL
10To package a new crate, or to update an existing crate
11------------------------------------------------------
931eabc0 12
8960a81d
XL
13::
14
15 ./new-package.sh <rust-crate-name> # or
16 ./update.sh <rust-crate-name>
86e10bdd 17
6c1b3182
XL
18and follow its instructions.
19
8960a81d 20Note that ``new-package.sh`` is just a symlink to ``update.sh``, to help newcomers.
7b976234 21
1ff2ded3
XL
22To package a co-installable older version of a crate
23----------------------------------------------------
7b976234 24
6c1b3182 25To maintain an old version of a crate alongside the latest one, first make sure
8960a81d 26the latest version is packaged by doing all of the above, then run::
6c1b3182 27
8960a81d
XL
28 ./new-package.sh <rust-crate-name> <old-version> # or
29 ./update.sh <rust-crate-name> <old-version>
86e10bdd 30
fed17d69
XL
31and follow its instructions. To save time, you can first copy anything relevant
32from ``src/<rust-crate-name>`` to ``src/<rust-crate-name>-<old-version>``, then
33adapt it as needed.
999f9269 34
8960a81d
XL
35To prepare a release
36--------------------
37
38::
5cbe2f60 39
699de4ac
SL
40 ./release.sh <rust-crate-name> # or
41 ./release.sh <rust-crate-name> <old-version> # as appropriate
42 DISTRO=experimental ./release.sh <rust-crate-name> # to target another distro
86e10bdd 43
fed17d69
XL
44This prepares the necessary Debian files in ``build/``, and creates a git
45branch to manage the packaging until it is accepted in Debian itself. You need
46to run additional commands after this - more specific instructions are given to
47you about this, by the script after you run it.
6c1b3182 48
8960a81d
XL
49Holding packages at old versions
50--------------------------------
51
52If you need to keep the latest version in Debian at an older version than is
53released on crates.io, e.g. to upload an important bugfix without being blocked
54on having to package all the dependencies of the newest version, you can::
55
56 REALVER=<old-version> ./update.sh <rust-crate-name> # then
57 REALVER=<old-version> ./release.sh <rust-crate-name>
58
c6709bfe
XL
59Repackaging the existing revision
60---------------------------------
61
62In order to build a package A already in ``debcargo-conf/src``
63in the exact version which is present here, do the following::
64
65 $ ./repackage.sh A
66 $ cd build
67 $ ./build.sh A
68
69If this package is already in the archive and you want to recreate that
70exactly, you will need to use the exact same version of debcargo that was
71used previously. This version is mentioned in ``debian/changelog``.
72
d580884e 73
ed79d202
XL
74Repository structure
75====================
76
77`pending-*` branches are managed by `./release.sh`, so please don't manage them
78yourself as you will interfere with the working of that script. The intention
79is that they should only differ from the master branch by 1 commit, i.e. the
80`dch -r` commit created by `./release.sh`.
81
82If you want to create separate non-master branches, that is fine - just don't
83call them `pending-*` and don't run `./release.sh` on those branches. If you
84want to test your crate, instead run::
85
86 cd build && [SOURCEONLY=1] ./build.sh <rust-crate-name> [<old-version>]
87
88omitting or not omitting the stuff in [] as needed.
89
1ff2ded3
XL
90Like many other Debian git repositories, we don't follow "feature branch"
91practises here. We generally don't package just 1 or 2 rust crates at a time,
92but all of its dependencies and sometimes some reverse-dependencies too. So
93normally we'll be touching a few dozen packages at once. In this context, it's
94good to merge often, to avoid conflicts with someone else that might also need
95to touch those too in the next few days.
96
97To match a release (i.e. a ``.deb`` or a ``.dsc`` file) to a commit, find the
98commit message that actually says "Release package X". This will usually be a
99merge commit.
100
ed79d202 101
c6709bfe
XL
102Build environment
103=================
104
105To set up a suitable build environment for ``./build.sh``::
106
107 $ sudo apt-get install devscripts reprepro debootstrap sbuild dh-cargo
108 $ sudo sbuild-createchroot --include=eatmydata,ccache,gnupg,dh-cargo,cargo,lintian,perl-openssl-defaults \
109 --chroot-prefix debcargo-unstable unstable \
110 /srv/chroot/debcargo-unstable-amd64-sbuild http://deb.debian.org/debian
111
1ff2ded3
XL
112An explanation of this, plus more recipes, can be found on the `sbuild wiki
113page <https://wiki.debian.org/sbuild>`_.
114
c6709bfe
XL
115Normally, ``./build.sh`` will fail early if not all the build dependencies are
116available in your local apt cache. If you are packaging a large dependency tree
117however, to avoid many round-trips through NEW it is possible to bypass this
118check and build all the packages together. Suppose package B depends on package
119A, then you can run something like::
120
121 $ export IGNORE_MISSING_BUILD_DEPS=1
122 $ ./release.sh A
123 $ ( cd build && ./build.sh A )
124 # push pending and checkout master
125 $ ./release.sh B
126 $ ( cd build && ./build.sh B librust-A*.deb )
127
128The extra arguments after ``./build.sh B <args>`` is extra deb files to pass to
129sbuild to use as dependencies. In this case, ``librust-A*.deb`` should have
130been built by the previous step.
131
132After everything is built successfully, you can ``dput`` all of them and then
133push all the ``pending-*`` branches as normal.
134
135
7f68b728
XL
136General packaging tips
137======================
138
139Dependencies on clippy
140----------------------
141
142Patch away dependencies on "clippy" unless it is a "real" dependency. Usually
143crates only use clippy to lint themselves and it is not a "real" dependency
144in the sense that they actually import clippy's code for what they do.
145
146If you want to be sure, `rg clippy` and check that all the usages of it are
147inside `cfg_attr` declarations. If so, then just get rid of it.
148
738135f9
XL
149OS-specific crates
150------------------
151
152See redox-syscall for examples on how to deal with these.
153
154If this is unclear, ask on IRC.
155
7f68b728
XL
156Architecture-specific crates
157----------------------------
01f68998 158
738135f9 159This is a bit harder. Usually there are two options:
95399141 160
738135f9
XL
1611. The crate should build a dummy/no-op version of itself "out-of-the-box"
162 on the architectures it doesn't work on.
1632. Dependent crates should depend on it with a platform-specific dependency,
164 see https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies
165
166(1) involves less burden for others, both for dependent crates and for us
167packagers, since we don't have to override d/rules to ignore test failures on
168non-working architectures. You should communicate to upstream that this is
169the preferred approach.
170
171In the case of (2), the crate should document exactly what conditional should
172be used, and keep this documentation up-to-date. This allows us to easily
173determine if dependent crates are using the correct conditional. You will then
174have to override d/rules for this crate, see src/simd for an example.
175
176You should file a bug upstream if the crate does neither (1) nor document the
177conditions for (2), e.g. https://github.com/hsivonen/simd/issues/25
178
179(Actually the above applies even for "OS-specific crates" but then (2) is
180obvious so documentation is less necessary, and dependent crates all do it
181correctly already.)
95399141 182
a0c73b1a
XL
183Changed orig tarballs
184---------------------
185
186Sometimes the orig.tar generated by debcargo might change e.g. if you are using
187a newer version of debcargo and one of the dependencies relating to generating
188the tarball was updated and its behaviour changed - compression settings,
189tarball archive ordering, etc. This will cause your upload to get REJECTED by
190the Debian FTP archive for having a different orig.tar. In this case, set
1ff2ded3 191``REUSE_EXISTING_ORIG_TARBALL=1`` when running ``./release.sh``.
a0c73b1a 192
7f68b728
XL
193ITPs
194----
95399141 195
7f68b728 196Don't file ITPs for library crates, but do file them for binary crates.
01f68998 197
1ff2ded3
XL
198Generally we'll be uploading a dozen crates or so at once. Submitting ITPs for
199these is unnecessary since we're the only ones uploading and there is no chance
200of conflict. It would only be spam for the bug tracker. Please instead
201co-ordinate uploads on the ``#debian-rust`` IRC channel.
01f68998 202
0d1e2247
SL
203Testing
204-------
205
dc94b1d5
XL
206Debian has two types of tests:
207
1ff2ded3
XL
2081. pre-install tests run in ``debian/rules``
2092. post-install tests defined in ``debian/tests/control``
dc94b1d5
XL
210
211For Debian rust packages, in (1) we run the crate's test suite with default
212features but only if there are no dev-dependencies, and in (2) we run the whole
1ff2ded3
XL
213test suite with each feature enabled separately plus ``--no-default-features``
214and ``--all-features``.
dc94b1d5
XL
215
216Sometimes, tests require extra tweaks and settings to work. In this case, you
217can tweak ``debian/rules`` for (1), and for (2) you will simply have to mark
218the relevant tests as broken using ``test_is_broken = true``. See the existing
219crate configs for examples.
220
221Other times, the tests are simply broken or can't be run in Debian. In this
222case you should disable the test in (1) by running ``dh_auto_test -- build``
223instead of the default ``dh_auto_test -- test --all``, and for (2) again you
224should mark the relevant tests as broken.
225
226Please note that ``[packages.lib]\ntest_is_broken = true`` will transitively
227disable tests for all combinations of features. Sometimes this is correct e.g.
228if the test actually breaks for all features. Sometimes this is *not* correct,
229e.g. if the test only breaks for ``--no-default-features``. In the latter case
230you should instead patch the crate to ignore those tests when the relevant
1ff2ded3 231features are absent - e.g. ``src/regex-automata/debian/patches/ignore-std-tests.patch``.
01f68998 232
a1872536
XL
233Binary-crate has "required-features"
234------------------------------------
235
236See ``src/dotenv`` for an example on dealing with this.
237
238Binary-crate has conflicting name
239---------------------------------
240
241See ``src/fd-find`` for an example on dealing with this.
242
053e604c
SL
243Updating the dependencies
244-------------------------
245
ed1eaac5
XL
246In some cases, libraries/programs are forcing an old version of a library as
247dependencies. In order to limit the number of duplicated libraries in the
248archive, please try to evaluate if a newer version of the dependencies could be
249used.
250
1ff2ded3 251To achieve that, after ``./update.sh``, try::
ed1eaac5
XL
252
253 $ cd build/<package>/
254 $ rm -rf .pc # sometimes this is necessary due to minor debcargo bug
255 $ quilt push -a
256 $ quilt new relax-dep.diff
257 $ quilt edit Cargo.toml
258 $ quilt refresh
259 $ cargo build # check that it works. if it does, then
260 $ cp -R patches ../../src/<package>/debian
261
262Suppose you want to change the dependency from 0.3 to 0.5. If the crate builds
263with no further source changes, then we would change the required version in
264``Cargo.toml`` from ``0.3`` to ``>= 0.3, < 0.6`` or something like that. Then
265the convention is to put all these changes into a single patch called
266``relax-dep-versions.patch``.
267
268OTOH, if the cargo build fails, and you can fix it up by editing the source
269code in a minor way to use the new crate API, then: for each crate that needs
270to be updated, you should instead name the patch ``update-dep-<crate>.patch``
1ff2ded3
XL
271and add both the ``Cargo.toml`` and the source code changes to it. The change
272to ``Cargo.toml`` would then simply say (e.g.) ``0.5`` since the older versions
273actually don't work, and not the version range from the previous paragraph.