]> git.proxmox.com Git - rustc.git/blob - debian/README.source
Update changelogs and other documentation
[rustc.git] / debian / README.source
1 Document by Ximin Luo, Luca Bruno & Sylvestre Ledru
2
3 This source package is unfortunately quite tricky and with several cutting
4 edges, due to the complexity of rust-lang bootstrapping system and the high
5 rate of language changes still ongoing.
6
7 We try to describe here inner packaging details and the reasons behind them.
8
9 If you are looking to help maintain this package, be sure to read the "Notes
10 for package maintainers" section further below.
11
12
13 Embedded libraries
14 ==================
15
16 This source package embeds several external libraries (foeked and managed
17 by rust upstream as git submodules).
18 In early stages, many more libraries were forked/emebedded but we are steadily
19 progressing in splitting them out.
20
21 Here below the remaining ones, with the technical reasons.
22
23 * jemalloc from https://github.com/rust-lang/jemalloc
24 -> system-wide one can't be used due to rust using a "je_" prefix.
25
26 This is intentional upstream design and won't change soon, see:
27 - https://github.com/rust-lang/rust/pull/18678
28 - http://smallcultfollowing.com/babysteps/blog/2014/11/14/allocators-in-rust/
29
30 * compiler-rt from https://github.com/rust-lang/compiler-rt
31 -> system-wide compiler-rt fails during linkage
32
33 Bug reported upstream, still to be fixed, see:
34 - https://github.com/rust-lang/rust/issues/15054
35 - https://github.com/rust-lang/rust/issues/15708
36
37 As a summary, we plan to:
38 * keep embedding jemalloc (probably forever)
39 * work with upstream to fix compiler-rt linkage soon.
40
41 -- Sylvestre Ledru <sylvestre@debian.org> Sat, 06 May 2017 13:26:08 +0200
42
43
44 Building from source
45 ====================
46
47 The Debian rustc package will use the system rustc to bootstrap itself from.
48 The system rustc has to be either the previous or the same version as the rustc
49 being built; the build will fail if this is not the case.
50
51 sudo apt-get build-dep ./
52 dpkg-buildpackage
53 # Or, to directly use what's in the Debian FTP archive
54 sudo apt-get build-dep rustc
55 apt-get source --compile rustc
56
57 Alternatively, you may give the "pkg.rustc.dlstage0" DEB_BUILD_PROFILE to
58 instead use the process defined by Rust upstream. This downloads the "official"
59 stage0 compiler for the version being built from rust-lang.org. At the time of
60 writing "official" means "the previous stable version".
61
62 sudo apt-get build-dep -P pkg.rustc.dlstage0 ./
63 dpkg-buildpackage
64 # Or, to directly use what's in the Debian FTP archive
65 sudo apt-get build-dep -P pkg.rustc.dlstage0 rustc
66 apt-get source --compile -P pkg.rustc.dlstage0 rustc
67
68 After [1] is fixed, both of these should in theory give identical results.
69
70 If neither of these options are acceptable to you, e.g. because your distro
71 does not have rustc already and your build process cannot access the network,
72 see "Bootstrapping" below.
73
74 [1] https://github.com/rust-lang/rust/issues/34902
75
76
77 Bootstrapping
78 =============
79
80 To bootstrap rustc on a distro that does not have it or cargo available on any
81 architecture (so cross-compiling is not an option) you can run `debian/rules
82 source_orig-stage0`. This creates a .dsc that does not Build-Depend on rustc or
83 cargo. Instead, it includes an extra orig-stage0 source tarball that contains
84 the official stage0 compiler, pre-downloaded from rust-lang.org so that your
85 build daemons don't need to access the network during the build.
86
87 debian/rules source_orig-stage0
88 # Follow the final manual instructions that it outputs. Then:
89 sbuild ../rustc_*.dsc && dput ../rustc_*.dsc
90
91 To only bootstrap specific architectures, run this instead:
92
93 upstream_bootstrap_arch="arm64 armhf" debian/rules source_orig-stage0
94
95 This way, other architectures will be omitted from the orig-stage0 tarball. You
96 might want to do this e.g. if these other architectures are already present in
97 your distro, but the $upstream_bootstrap_arch ones are not yet present.
98
99 Notes
100 -----
101
102 The approach bundles the upstream bootstrapping binaries inside the Debian
103 source package. This is a nasty hack that stretches the definition of "source
104 package", but has a few advantages explained below.
105
106 The traditional Debian way of bootstrapping compilers - and other distros have
107 similar approaches - is some variant of the following:
108
109 1. A developer locally installs some upstream bootstrapping binaries.
110 2. They locally build a Debian package, using these binaries as undeclared
111 build dependencies.
112 3. They upload these binary packages to Debian, which can be used as declared
113 Build-Depends in the future, including by the same package.
114
115 The problem with this is, Debian does not have any policy nor infrastructure
116 that can try to reproduce what this developer supposedly did.
117
118 Using bootstrapping binary blobs *at some point of the process* is unavoidable.
119 Rather than pretending we didn't do this, it is better to record *which blobs*
120 we used, so it can be audited later. If we bundle non-Debian build-dependencies
121 inside the source package, then we can do a *source-only upload*, and the
122 building of the binary packages can be done by the normal build infrastructure.
123
124 If the build process is reproducible [1] then we can be sure that *you* (as the
125 developer that prepared the source-only upload) didn't backdoor the binaries,
126 nor did the build daemons even if they were compromised during the build.
127
128 The bootstrapping binaries may still have been backdoored, but this is true in
129 both scenarios. So our arrangement is still a strict improvement in security,
130 because it reduces the set of "things that may have been backdoored". Also,
131 more people use the upstream binaries than the "magical original Debian
132 package", so backdoors have a greater chance of being detected in the former.
133
134 In the long run, this process is laying the foundations for doing Diverse
135 Double-Compilation [2], where we use *many independent* bootstrapping binaries
136 to reproduce bit-for-bit identical output compilers, giving confidence that
137 nothing was backdoored along the way.
138
139 [1] The build process for rustc is currently *not* reproducible but we're
140 working towards it. https://github.com/rust-lang/rust/issues/34902
141 [2] http://www.dwheeler.com/trusting-trust/
142
143
144 Maintaining this package
145 ========================
146
147 Import of a new upstream version
148 --------------------------------
149
150 $ uscan --verbose
151 $ ver=UPDATE-ME # whatever it is, X.YY.0 probably
152 $ tar xf ../rustc-$ver-src.tar.gz && ( cd rustc-$ver-src/ && ../debian/prune-unused-deps ) && rm -rf rustc-$ver-src/
153 # ^ If this fails, you probably need to refresh patches or edit debian/prune-unused-deps
154 $ git commit -m "Update Files-Excluded for new upstream version $ver" debian/copyright
155 $ uscan --verbose # yes, again, to pick up the new Files-Excluded stuff
156
157 # Keep running this and follow its instructions, until it gives no output:
158 $ debian/check-orig-suspicious.sh $ver
159 # When you are satisfied with the above, proceed:
160
161 $ gbp import-orig ../rustc_$ver+dfsg1.orig.tar.xz
162 $ dch -v $ver+dfsg1-1 -m "New upstream release."
163 $ debian/rules update-version
164 # might also need to bump the version of the cargo Build-Depends
165 # then refresh patches, etc etc
166
167 # If you need to repack again, bump the 'repacksuffix' in d/watch then run
168 $ uscan --verbose --force-download
169 # This will do a local repack using the new Files-Excluded rules, without
170 # redownloading the orig tarball (despite the slightly misleading flag).
171
172
173 Proceeding after build failure
174 ------------------------------
175
176 If your build fails, don't run `./x.py` directly as that will detect it's being
177 run with different settings, and run the build from scratch all over again.
178 overwriting all intermediate files. Instead, do:
179
180 $ debian/rules run_rustbuild X_CMD="build|test|install" X_FLAGS="whatever"
181
182 Hopefully, this will directly proceed to the step that failed, without
183 rebuilding everything in between.
184
185
186 Comparing Debian rustc vs upstream rustc
187 ----------------------------------------
188
189 This package does things the Debian way, which differs significantly from
190 upstream practices. If you find a bug, you might want to check if it is present
191 in the upstream package. Run "debian/rules debian/configure-upstream" to
192 generate a script, that you can then run in an unpacked upstream directory.
193
194 This will configure it in a "halfway" style between upstream and Debian.
195 Specifically, it will not build LLVM nor download stuff from crates.io, yet
196 Debian patches are *not* applied. These specific settings were chosen as a
197 tradeoff between convenience vs being close to what upstream does - so that the
198 chances of a bug here being a genuine upstream issue rather than a Debian bug,
199 is much higher. Also, with the exception of LLVM, these are non-default modes
200 *supported by* upstream so they would be happy to receive bug reports about it
201 even if your issue only occurs here.
202
203 OTOH if you need to test a completely clean upstream build, including all the
204 annoying stuff like building LLVM and downloading dependencies from crates.io,
205 simply unpack the tarball and run `./configure && ./x.py build` etc as normal.
206 This can be useful for confirming that an issue is caused by Debian's LLVM.
207
208 If you need to test a LLVM patch, do something like this:
209
210 # build your patched LLVM debs, then:
211 $ mkdir -p llvm-destdir && cd llvm-destdir
212 $ for i in llvm-4.0 llvm-4.0-dev llvm-4.0-runtime llvm-4.0-tools libllvm4.0; do \
213 dpkg -x ../"$i"_*${VERSION}_*.deb .; done
214 $ cd ../rustc
215 $ debian/rules LLVM_DESTDIR=$PWD/../llvm-destdir build
216
217
218 Useful links
219 ------------
220
221 The Fedora rust team is more active than the Debian one. Here are their links:
222
223 Source code
224 https://src.fedoraproject.org/cgit/rpms/rust.git/tree/
225
226 Binary packages and test logs
227 https://kojipkgs.fedoraproject.org//packages/rust/
228 If the same test fails both on Fedora and Debian it's a good indication that
229 we're not Doing It Wrong and can file a valid bug upstream.
230
231 Package metadata
232 https://admin.fedoraproject.org/pkgdb/package/rpms/rust/