<div dir="auto">Hello,<div dir="auto"><br></div><div dir="auto">As I promised on #<a href="http://rpm.org">rpm.org</a>, I'd like to describe here how we would like to use potential "dynamic subpackages" feature in Rust packaging.</div><div dir="auto"><br></div><div dir="auto">First of all, rust crates are packages as sources, so there is simply -devel subpackage containing source code.</div><div dir="auto"><br></div><div dir="auto">That includes Cargo.toml which is the manifest describing what (dev-)dependencies are, what "features" the crate has and so on.</div><div dir="auto"><br></div><div dir="auto">Those "features" usually mean let's say http2 support, or support for different compressions, or improved performance or anything what you can come up with. Apart from triggering some special code paths, most of the time they add new dependencies. These create dependency loops and huge bloat of unnecessary dependencies installed on user's systems.</div><div dir="auto"><br></div><div dir="auto">Some time ago I came up with patch for rpmfc which passes package name into a dependency generators and we were able to split those features into their own +feature -devel subpackages. This, however, added bunch of boilerplate into a spec because they have to have the %package, %description, %files for each feature. And this part can be easily generated from Cargo.toml manifest.</div><div dir="auto"><br></div><div dir="auto">So for example, if Cargo.toml has following:</div><div dir="auto"><br></div><div dir="auto">[dependencies]</div><div dir="auto">serde_json = { version = "1.0", optional = true }<br></div><div dir="auto">[features]</div><div dir="auto">json = ["serde_json"]</div><div dir="auto"><br></div><div dir="auto">Then spec should have:</div><div dir="auto"><div dir="auto"><br></div><div dir="auto">%package     -n %{name}+json-devel</div><div dir="auto">Summary:        %{summary}</div><div dir="auto">BuildArch:      noarch</div><div dir="auto"><br></div><div dir="auto">%description -n %{name}+json-devel %{_description}</div><div dir="auto"><br></div><div dir="auto">This package contains library source intended for building other packages</div><div dir="auto">which use "json" feature of "%{crate}" crate.</div><div dir="auto"><br></div><div dir="auto">%files       -n %{name}+json-devel</div><div dir="auto">%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml</div><div dir="auto"><br></div><div dir="auto"><div dir="auto" style="font-family:sans-serif">%package     -n %{name}+serde_json-devel</div><div dir="auto" style="font-family:sans-serif">Summary:        %{summary}</div><div dir="auto" style="font-family:sans-serif">BuildArch:      noarch</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">%description -n %{name}+serde_json-devel %{_description}</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">This package contains library source intended for building other packages</div><div dir="auto" style="font-family:sans-serif">which use "serde_json" feature of "%{crate}" crate.</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">%files       -n %{name}+serde_json-devel</div><div dir="auto" style="font-family:sans-serif">%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">All the requires/provides and such would be automatically generated by our dependency generators.</div><div dir="auto" style="font-family:sans-serif"><br></div><div dir="auto" style="font-family:sans-serif">This currently is being generated by rust2rpm which generates spec file. Would be nice if we would not have to do a pre-generation of these.</div></div></div></div>