<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>cargo-feature-combinations</title><link>https://romnn.github.io/cargo-feature-combinations/</link><description>Recent content on cargo-feature-combinations</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://romnn.github.io/cargo-feature-combinations/index.xml" rel="self" type="application/rss+xml"/><item><title>Basics</title><link>https://romnn.github.io/cargo-feature-combinations/docs/configuration/basics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/configuration/basics/</guid><description>&lt;h1 id="configuration-basics"&gt;Configuration basics&lt;a class="anchor" href="#configuration-basics"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="where-configuration-lives"&gt;Where configuration lives&lt;a class="anchor" href="#where-configuration-lives"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Configuration goes in &lt;code&gt;Cargo.toml&lt;/code&gt; metadata tables. There are two scopes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Package&lt;/strong&gt; — &lt;code&gt;[package.metadata.cargo-fc]&lt;/code&gt;, in a crate&amp;rsquo;s &lt;code&gt;Cargo.toml&lt;/code&gt;. Shapes that package&amp;rsquo;s feature matrix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workspace&lt;/strong&gt; — &lt;code&gt;[workspace.metadata.cargo-fc]&lt;/code&gt;, in the workspace root &lt;code&gt;Cargo.toml&lt;/code&gt;. Applies across the workspace (package selection, targets, flag defaults).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# crate Cargo.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# workspace root Cargo.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_packages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;examples&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="excluding-workspace-packages"&gt;Excluding workspace packages&lt;a class="anchor" href="#excluding-workspace-packages"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Remove packages from every run in the workspace metadata:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_packages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;package-a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;package-b&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Package exclusion is a workspace-level decision — a package can&amp;rsquo;t exclude its siblings.&lt;/p&gt;</description></item><item><title>Configured targets</title><link>https://romnn.github.io/cargo-feature-combinations/docs/targets/configured-targets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/targets/configured-targets/</guid><description>&lt;h1 id="configured-targets"&gt;Configured targets&lt;a class="anchor" href="#configured-targets"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="declaring-a-target-list"&gt;Declaring a target list&lt;a class="anchor" href="#declaring-a-target-list"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Declare workspace-wide targets in the workspace &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;targets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;x86_64-unknown-linux-gnu&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;x86_64-pc-windows-msvc&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;aarch64-apple-darwin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now &lt;code&gt;cargo fc check&lt;/code&gt; visits every combination on every target.&lt;/p&gt;
&lt;h2 id="per-package-target-lists"&gt;Per-package target lists&lt;a class="anchor" href="#per-package-target-lists"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A package can override the workspace list, or opt out of it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Run this package only on wasm (overrides the workspace list, does not merge).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;targets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;wasm32-unknown-unknown&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The three states:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Value&lt;/th&gt;
					&lt;th&gt;Meaning&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;key missing&lt;/td&gt;
					&lt;td&gt;inherit the workspace target list&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;targets = []&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;opt out of the workspace list; use the single effective target&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;targets = [&amp;quot;…&amp;quot;]&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;this package&amp;rsquo;s own list (overrides, does not merge)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;targets&lt;/code&gt; only selects which targets are visited. The &lt;a href="https://romnn.github.io/cargo-feature-combinations/docs/configuration/per-target/"&gt;&lt;code&gt;target.'cfg(...)'&lt;/code&gt;&lt;/a&gt; overrides still shape the feature matrix for each concrete target.&lt;/p&gt;</description></item><item><title>GitHub Actions</title><link>https://romnn.github.io/cargo-feature-combinations/docs/ci/github-actions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/ci/github-actions/</guid><description>&lt;h1 id="github-actions"&gt;GitHub Actions&lt;a class="anchor" href="#github-actions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;GitHub Actions&amp;rsquo; &lt;a href="https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs"&gt;matrix&lt;/a&gt; feature pairs naturally with &lt;code&gt;cargo fc matrix&lt;/code&gt; to test feature combinations in parallel.&lt;/p&gt;
&lt;h2 id="approach-1--fan-out-one-job-per-combination"&gt;Approach 1 — fan out one job per combination&lt;a class="anchor" href="#approach-1--fan-out-one-job-per-combination"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, a reusable workflow that computes the feature matrix:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# .github/workflows/feature-matrix.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;feature-matrix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;workflow_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;feature matrix&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ jobs.matrix.outputs.matrix }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Generate feature matrix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-24.04&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ steps.compute-matrix.outputs.matrix }}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;romnn/cargo-feature-combinations@main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Compute feature matrix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;compute-matrix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|-&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; MATRIX=&amp;#34;$(cargo fc matrix)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;${MATRIX}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;matrix=${MATRIX}&amp;#34; &amp;gt;&amp;gt; &amp;#34;$GITHUB_OUTPUT&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then consume it to build every combination in parallel:&lt;/p&gt;</description></item><item><title>Incompatible features</title><link>https://romnn.github.io/cargo-feature-combinations/docs/recipes/incompatible-features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/recipes/incompatible-features/</guid><description>&lt;h1 id="incompatible-features"&gt;Incompatible features&lt;a class="anchor" href="#incompatible-features"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; an HTTP client crate offers two TLS backends, &lt;code&gt;native-tls&lt;/code&gt; and &lt;code&gt;rustls&lt;/code&gt;. A consumer picks one — enabling both is a real conflict (here the code even &lt;code&gt;compile_error!&lt;/code&gt;s on it). You want the matrix to skip that combination.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http-client&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;native-tls&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;rustls&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# native-tls and rustls are two TLS backends — never both at once.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_feature_sets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;native-tls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rustls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Any generated combination that is a superset of &lt;code&gt;{native-tls, rustls}&lt;/code&gt; is removed. Every other combination — each backend alone, and neither — is still checked. &lt;code&gt;cargo fc check&lt;/code&gt; visits exactly three combinations; the &lt;code&gt;{native-tls, rustls}&lt;/code&gt; pair never appears:&lt;/p&gt;</description></item><item><title>Introduction</title><link>https://romnn.github.io/cargo-feature-combinations/docs/introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/introduction/</guid><description>&lt;h1 id="introduction"&gt;Introduction&lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;cargo-feature-combinations&lt;/code&gt; is a plugin for &lt;code&gt;cargo&lt;/code&gt; that runs a command against selected — or all — combinations of a crate&amp;rsquo;s features. You invoke it as &lt;strong&gt;&lt;code&gt;cargo fc&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;a class="anchor" href="#the-problem"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cargo features are meant to be additive, but real crates rarely behave that way. A crate can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compile with its &lt;code&gt;default&lt;/code&gt; features but fail with &lt;code&gt;--no-default-features&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;compile with each feature alone but fail when two are enabled together,&lt;/li&gt;
&lt;li&gt;pass &lt;code&gt;cargo build&lt;/code&gt; yet fail &lt;code&gt;cargo test&lt;/code&gt; for a particular combination,&lt;/li&gt;
&lt;li&gt;compile on your host but not when cross-compiled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Checking only the default set, or only &lt;code&gt;--all-features&lt;/code&gt;, hides every one of these cases. &lt;code&gt;--all-features&lt;/code&gt; in particular enables everything at once, which is exactly the combination least likely to expose a conflict between two mutually-exclusive features.&lt;/p&gt;</description></item><item><title>Running commands</title><link>https://romnn.github.io/cargo-feature-combinations/docs/commands/running-commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/commands/running-commands/</guid><description>&lt;h1 id="running-commands"&gt;Running commands&lt;a class="anchor" href="#running-commands"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Use &lt;code&gt;cargo fc&lt;/code&gt; as if it were &lt;code&gt;cargo&lt;/code&gt;. The command and its arguments are forwarded to each combination&amp;rsquo;s invocation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; check
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; clippy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; doc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="forwarded-arguments"&gt;Forwarded arguments&lt;a class="anchor" href="#forwarded-arguments"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Every cargo argument is passed through &lt;strong&gt;except&lt;/strong&gt; the three that would conflict with the matrix &lt;code&gt;cargo fc&lt;/code&gt; builds for you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--features&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--all-features&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-default-features&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything else is forwarded verbatim, so this works as expected:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; check -p my-crate --all-targets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; --release -- --nocapture&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Arguments after &lt;code&gt;--&lt;/code&gt; are passed to the invoked program (for example the test binary), never interpreted by &lt;code&gt;cargo fc&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Build drivers</title><link>https://romnn.github.io/cargo-feature-combinations/docs/targets/drivers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/targets/drivers/</guid><description>&lt;h1 id="build-drivers"&gt;Build drivers&lt;a class="anchor" href="#build-drivers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &amp;ldquo;driver&amp;rdquo; is the program &lt;code&gt;cargo fc&lt;/code&gt; invokes in place of &lt;code&gt;cargo&lt;/code&gt; for each build. The default depends on whether you&amp;rsquo;re cross-compiling.&lt;/p&gt;
&lt;h2 id="why-a-driver"&gt;Why a driver&lt;a class="anchor" href="#why-a-driver"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cross-compiling a crate with native-C build dependencies (for example &lt;code&gt;aws-lc-sys&lt;/code&gt;, pulled in via &lt;code&gt;rustls&lt;/code&gt;) needs a cross C toolchain — the host &lt;code&gt;cc&lt;/code&gt; can&amp;rsquo;t target another OS. To make that transparent, &lt;strong&gt;when any non-host target is planned, &lt;code&gt;cargo fc&lt;/code&gt; invokes &lt;a href="https://github.com/rust-cross/cargo-zigbuild"&gt;&lt;code&gt;cargo-zigbuild&lt;/code&gt;&lt;/a&gt; instead of plain &lt;code&gt;cargo&lt;/code&gt;&lt;/strong&gt;, so zig supplies the cross C compiler and linker for every target.&lt;/p&gt;</description></item><item><title>Installation</title><link>https://romnn.github.io/cargo-feature-combinations/docs/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/installation/</guid><description>&lt;h1 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;cargo-feature-combinations&lt;/code&gt; installs a &lt;code&gt;cargo&lt;/code&gt; subcommand. Once it&amp;rsquo;s on your &lt;code&gt;PATH&lt;/code&gt;, &lt;code&gt;cargo fc&lt;/code&gt; works from any crate or workspace.&lt;/p&gt;
&lt;h2 id="from-cratesio"&gt;From crates.io&lt;a class="anchor" href="#from-cratesio"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo install --locked cargo-feature-combinations&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--locked&lt;/code&gt; builds against the versions in the published &lt;code&gt;Cargo.lock&lt;/code&gt;, which is the most reproducible option.&lt;/p&gt;
&lt;h2 id="homebrew"&gt;Homebrew&lt;a class="anchor" href="#homebrew"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A prebuilt binary is available through the author&amp;rsquo;s tap, which avoids compiling from source:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install --cask romnn/tap/cargo-fc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nix"&gt;Nix&lt;a class="anchor" href="#nix"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is an &lt;strong&gt;unofficial&lt;/strong&gt;, community-maintained package (not maintained by the author of the tool):&lt;/p&gt;</description></item><item><title>Optional dependencies</title><link>https://romnn.github.io/cargo-feature-combinations/docs/recipes/optional-dependencies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/recipes/optional-dependencies/</guid><description>&lt;h1 id="optional-dependencies"&gt;Optional dependencies&lt;a class="anchor" href="#optional-dependencies"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; a &lt;code&gt;store&lt;/code&gt; crate has two optional storage backends and one real &lt;code&gt;compression&lt;/code&gt; feature. Cargo turns each optional dependency into an implicit feature (&lt;code&gt;redis-backend&lt;/code&gt;, &lt;code&gt;sled-backend&lt;/code&gt;), which would multiply the matrix — but you only want to vary &lt;code&gt;compression&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;store&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;compression&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;redis-backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../redis-backend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;optional&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sled-backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../sled-backend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;optional&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Don&amp;#39;t vary the implicit features of the optional backends.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;skip_optional_dependencies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With &lt;code&gt;skip_optional_dependencies = true&lt;/code&gt;, the implicit &lt;code&gt;redis-backend&lt;/code&gt; and &lt;code&gt;sled-backend&lt;/code&gt; features are removed from the matrix; only the real &lt;code&gt;compression&lt;/code&gt; feature is varied. Checking just the &lt;code&gt;store&lt;/code&gt; package shows two combinations:&lt;/p&gt;</description></item><item><title>Output modes</title><link>https://romnn.github.io/cargo-feature-combinations/docs/commands/output-modes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/commands/output-modes/</guid><description>&lt;h1 id="output-modes"&gt;Output modes&lt;a class="anchor" href="#output-modes"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A full matrix run can print a lot. These flags control how much you see. They are CLI flags, but most can also be set as &lt;a href="https://romnn.github.io/cargo-feature-combinations/docs/configuration/flags/"&gt;defaults in &lt;code&gt;Cargo.toml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="--diagnostics-only"&gt;&lt;code&gt;--diagnostics-only&lt;/code&gt;&lt;a class="anchor" href="#--diagnostics-only"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Show only warnings and errors per combination, suppressing build progress and &amp;ldquo;Finished&amp;rdquo; chatter.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; --diagnostics-only clippy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="cfc-term"&gt;&lt;pre class="cfc-term__body"&gt;&lt;span class="term-fg32 term-fg1"&gt;$&lt;/span&gt; cargo fc --diagnostics-only clippy --workspace
&amp;nbsp;
&lt;span class="term-fg36 term-fg1"&gt; Linting &lt;/span&gt;&lt;span class="term-fg2"&gt;[1&amp;#47;4]&lt;/span&gt; loader ( features = [] )
&lt;span class="term-fg33 term-fg1"&gt;warning&lt;/span&gt;&lt;span class="term-fg1"&gt;: function `checksum` is never used&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;--&amp;gt; &lt;/span&gt;crates&amp;#47;loader&amp;#47;src&amp;#47;lib.rs:12:4
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt;
&lt;span class="term-fgi94 term-fg1"&gt;12&lt;/span&gt; &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; fn checksum(bytes: &amp;amp;[u8]) -&amp;gt; usize {
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; &lt;span class="term-fg33 term-fg1"&gt;^^^^^^^^&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;= &lt;/span&gt;&lt;span class="term-fg1"&gt;note&lt;/span&gt;: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
&amp;nbsp;
&lt;span class="term-fg36 term-fg1"&gt; Linting &lt;/span&gt;&lt;span class="term-fg2"&gt;[2&amp;#47;4]&lt;/span&gt; loader ( features = [experimental] )
&lt;span class="term-fgi91 term-fg1"&gt;error[E0425]&lt;/span&gt;&lt;span class="term-fg1"&gt;: cannot find function `missing_helper` in this scope&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;--&amp;gt; &lt;/span&gt;crates&amp;#47;loader&amp;#47;src&amp;#47;lib.rs:32:5
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt;
&lt;span class="term-fgi94 term-fg1"&gt;32&lt;/span&gt; &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; missing_helper()
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; &lt;span class="term-fgi91 term-fg1"&gt;^^^^^^^^^^^^^^&lt;/span&gt; &lt;span class="term-fgi91 term-fg1"&gt;not found in this scope&lt;/span&gt;
&amp;nbsp;
&lt;span class="term-fg1"&gt;For more information about this error, try `rustc --explain E0425`.&lt;/span&gt;
&lt;span class="term-fg36 term-fg1"&gt; Linting &lt;/span&gt;&lt;span class="term-fg2"&gt;[3&amp;#47;4]&lt;/span&gt; loader ( features = [experimental, validation] )
&lt;span class="term-fgi91 term-fg1"&gt;error[E0425]&lt;/span&gt;&lt;span class="term-fg1"&gt;: cannot find function `missing_helper` in this scope&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;--&amp;gt; &lt;/span&gt;crates&amp;#47;loader&amp;#47;src&amp;#47;lib.rs:32:5
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt;
&lt;span class="term-fgi94 term-fg1"&gt;32&lt;/span&gt; &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; missing_helper()
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; &lt;span class="term-fgi91 term-fg1"&gt;^^^^^^^^^^^^^^&lt;/span&gt; &lt;span class="term-fgi91 term-fg1"&gt;not found in this scope&lt;/span&gt;
&amp;nbsp;
&lt;span class="term-fg1"&gt;For more information about this error, try `rustc --explain E0425`.&lt;/span&gt;
&lt;span class="term-fg36 term-fg1"&gt; Linting &lt;/span&gt;&lt;span class="term-fg2"&gt;[4&amp;#47;4]&lt;/span&gt; loader ( features = [validation] )
&lt;span class="term-fg33 term-fg1"&gt;warning&lt;/span&gt;&lt;span class="term-fg1"&gt;: function `checksum` is never used&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;--&amp;gt; &lt;/span&gt;crates&amp;#47;loader&amp;#47;src&amp;#47;lib.rs:12:4
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt;
&lt;span class="term-fgi94 term-fg1"&gt;12&lt;/span&gt; &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; fn checksum(bytes: &amp;amp;[u8]) -&amp;gt; usize {
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt; &lt;span class="term-fg33 term-fg1"&gt;^^^^^^^^&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;|&lt;/span&gt;
 &lt;span class="term-fgi94 term-fg1"&gt;= &lt;/span&gt;&lt;span class="term-fg1"&gt;note&lt;/span&gt;: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
&amp;nbsp;
&amp;nbsp;
&lt;span class="term-fg36 term-fg1"&gt; Finished &lt;/span&gt;4 feature combinations for 1 package in 0.00s
&amp;nbsp;
&lt;span class="term-fg33 term-fg1"&gt; WARN &lt;/span&gt;loader ( 0 errors, 1 warnings, features = [] )
&lt;span class="term-fg31 term-fg1"&gt; FAIL &lt;/span&gt;loader ( 1 errors, 0 warnings, features = [experimental] )
&lt;span class="term-fg31 term-fg1"&gt; FAIL &lt;/span&gt;loader ( 1 errors, 0 warnings, features = [experimental, validation] )
&lt;span class="term-fg33 term-fg1"&gt; WARN &lt;/span&gt;loader ( 0 errors, 1 warnings, features = [validation] )&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The command must accept &lt;code&gt;--message-format&lt;/code&gt; and emit rustc JSON diagnostics. That is true for &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, &lt;code&gt;clippy&lt;/code&gt;, and &lt;code&gt;doc&lt;/code&gt; — and any alias or wrapper that does the same. It is &lt;strong&gt;not&lt;/strong&gt; safe for &lt;code&gt;test&lt;/code&gt; or &lt;code&gt;run&lt;/code&gt;, which is why broad diagnostics defaults don&amp;rsquo;t apply to them automatically.&lt;/p&gt;</description></item><item><title>Shaping the feature matrix</title><link>https://romnn.github.io/cargo-feature-combinations/docs/configuration/feature-matrix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/configuration/feature-matrix/</guid><description>&lt;h1 id="shaping-the-feature-matrix"&gt;Shaping the feature matrix&lt;a class="anchor" href="#shaping-the-feature-matrix"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;By default the matrix is the powerset of a package&amp;rsquo;s features. These keys, all under &lt;code&gt;[package.metadata.cargo-fc]&lt;/code&gt;, change what gets generated.&lt;/p&gt;
&lt;h2 id="at-a-glance"&gt;At a glance&lt;a class="anchor" href="#at-a-glance"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Key&lt;/th&gt;
					&lt;th&gt;Effect&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#exclude_features"&gt;&lt;code&gt;exclude_features&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Remove features from the varied set.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#only_features"&gt;&lt;code&gt;only_features&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Restrict the varied set to an allowlist.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#include_features"&gt;&lt;code&gt;include_features&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Add features to &lt;em&gt;every&lt;/em&gt; generated combination.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#exclude_feature_sets"&gt;&lt;code&gt;exclude_feature_sets&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Drop specific combinations (e.g. incompatible pairs).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#include_feature_sets"&gt;&lt;code&gt;include_feature_sets&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Always add specific exact combinations.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#allow_feature_sets"&gt;&lt;code&gt;allow_feature_sets&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Replace the powerset with an exact list of sets.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#isolated_feature_sets"&gt;&lt;code&gt;isolated_feature_sets&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Build independent sub-matrices and merge them.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#skip_optional_dependencies"&gt;&lt;code&gt;skip_optional_dependencies&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Ignore implicit optional-dependency features.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#no_empty_feature_set"&gt;&lt;code&gt;no_empty_feature_set&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Never include the empty (no-features) combination.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#max_combinations"&gt;&lt;code&gt;max_combinations&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Raise the safety limit on generated combinations.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;a href="#matrix"&gt;&lt;code&gt;matrix&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;Attach custom metadata to &lt;code&gt;cargo fc matrix&lt;/code&gt; rows.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="exclude_features"&gt;&lt;code&gt;exclude_features&lt;/code&gt;&lt;a class="anchor" href="#exclude_features"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Features listed here are not varied in the matrix.&lt;/p&gt;</description></item><item><title>Installing targets</title><link>https://romnn.github.io/cargo-feature-combinations/docs/targets/installing-targets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/targets/installing-targets/</guid><description>&lt;h1 id="installing-missing-targets"&gt;Installing missing targets&lt;a class="anchor" href="#installing-missing-targets"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;By default &lt;code&gt;cargo fc&lt;/code&gt; does not mutate the Rust toolchain. If a configured target&amp;rsquo;s &lt;code&gt;rustup&lt;/code&gt; component isn&amp;rsquo;t installed, the build for that target fails as it normally would.&lt;/p&gt;
&lt;h2 id="opt-in-per-invocation"&gt;Opt in per invocation&lt;a class="anchor" href="#opt-in-per-invocation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; check --install-missing-targets&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This installs the missing target components with &lt;code&gt;rustup&lt;/code&gt; before running. It&amp;rsquo;s an explicit opt-in because it may mutate the toolchain and use the network. When a &lt;code&gt;+toolchain&lt;/code&gt; override is present, the same override is passed to &lt;code&gt;rustup&lt;/code&gt;, so components land in the right toolchain.&lt;/p&gt;</description></item><item><title>Quick start</title><link>https://romnn.github.io/cargo-feature-combinations/docs/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/quick-start/</guid><description>&lt;h1 id="quick-start"&gt;Quick start&lt;a class="anchor" href="#quick-start"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This walks through a first run and how to read the output. It assumes &lt;code&gt;cargo fc&lt;/code&gt; is &lt;a href="https://romnn.github.io/cargo-feature-combinations/docs/installation/"&gt;installed&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="1-run-a-command-across-the-matrix"&gt;1. Run a command across the matrix&lt;a class="anchor" href="#1-run-a-command-across-the-matrix"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From any crate or workspace, prefix a cargo command with &lt;code&gt;fc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; check&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cargo fc&lt;/code&gt; enumerates the combinations of your features, runs &lt;code&gt;cargo check&lt;/code&gt; against each, and prints a summary:&lt;/p&gt;
&lt;div class="cfc-term"&gt;&lt;pre class="cfc-term__body"&gt;&lt;span class="term-fg32 term-fg1"&gt;$&lt;/span&gt; cargo fc --summary-only check --workspace
&amp;nbsp;
&lt;span class="term-fg36 term-fg1"&gt; Checking &lt;/span&gt;&lt;span class="term-fg2"&gt;[1&amp;#47;6]&lt;/span&gt; cli ( features = [] )
&lt;span class="term-fg36 term-fg1"&gt; Checking &lt;/span&gt;&lt;span class="term-fg2"&gt;[2&amp;#47;6]&lt;/span&gt; cli ( features = [color] )
&lt;span class="term-fg36 term-fg1"&gt; Checking &lt;/span&gt;&lt;span class="term-fg2"&gt;[3&amp;#47;6]&lt;/span&gt; engine ( features = [] )
&lt;span class="term-fg36 term-fg1"&gt; Checking &lt;/span&gt;&lt;span class="term-fg2"&gt;[4&amp;#47;6]&lt;/span&gt; engine ( features = [metrics] )
&lt;span class="term-fg36 term-fg1"&gt; Checking &lt;/span&gt;&lt;span class="term-fg2"&gt;[5&amp;#47;6]&lt;/span&gt; engine ( features = [metrics, tracing] )
&lt;span class="term-fg36 term-fg1"&gt; Checking &lt;/span&gt;&lt;span class="term-fg2"&gt;[6&amp;#47;6]&lt;/span&gt; engine ( features = [tracing] )
&amp;nbsp;
&lt;span class="term-fg36 term-fg1"&gt; Finished &lt;/span&gt;6 feature combinations for 2 packages in 0.00s
&amp;nbsp;
&lt;span class="term-fg32 term-fg1"&gt; PASS &lt;/span&gt;cli ( 0 errors, 0 warnings, features = [] )
&lt;span class="term-fg32 term-fg1"&gt; PASS &lt;/span&gt;cli ( 0 errors, 0 warnings, features = [color] )
&lt;span class="term-fg32 term-fg1"&gt; PASS &lt;/span&gt;engine ( 0 errors, 0 warnings, features = [] )
&lt;span class="term-fg32 term-fg1"&gt; PASS &lt;/span&gt;engine ( 0 errors, 0 warnings, features = [metrics] )
&lt;span class="term-fg32 term-fg1"&gt; PASS &lt;/span&gt;engine ( 0 errors, 0 warnings, features = [metrics, tracing] )
&lt;span class="term-fg32 term-fg1"&gt; PASS &lt;/span&gt;engine ( 0 errors, 0 warnings, features = [tracing] )&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Each row is one combination: the package, whether it passed, its error/warning counts, and the exact feature set. A non-zero exit status means at least one combination failed.&lt;/p&gt;</description></item><item><title>Restrict the matrix</title><link>https://romnn.github.io/cargo-feature-combinations/docs/recipes/restrict-matrix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/recipes/restrict-matrix/</guid><description>&lt;h1 id="restrict-the-matrix-to-specific-configurations"&gt;Restrict the matrix to specific configurations&lt;a class="anchor" href="#restrict-the-matrix-to-specific-configurations"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; a web app can be built in three rendering modes — &lt;code&gt;hydrate&lt;/code&gt;, &lt;code&gt;ssr&lt;/code&gt;, &lt;code&gt;csr&lt;/code&gt; — but you only ever ship &lt;code&gt;hydrate&lt;/code&gt; and &lt;code&gt;ssr&lt;/code&gt;. You don&amp;rsquo;t want a powerset; you want exactly those two configurations.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;webapp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;hydrate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ssr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;csr&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Only ever test the two modes we ship — no powerset.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;allow_feature_sets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hydrate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When &lt;code&gt;allow_feature_sets&lt;/code&gt; is non-empty, the matrix is &lt;strong&gt;exactly&lt;/strong&gt; those sets — no powerset, no empty set, and &lt;code&gt;csr&lt;/code&gt; is never tested:&lt;/p&gt;</description></item><item><title>The matrix subcommand</title><link>https://romnn.github.io/cargo-feature-combinations/docs/commands/matrix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/commands/matrix/</guid><description>&lt;h1 id="the-matrix-subcommand"&gt;The &lt;code&gt;matrix&lt;/code&gt; subcommand&lt;a class="anchor" href="#the-matrix-subcommand"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;cargo fc matrix&lt;/code&gt; prints the feature matrix as JSON instead of running a command. It&amp;rsquo;s the bridge to CI: emit the matrix in one job, then fan out a build/test job per row.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; matrix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo &lt;span class="nb"&gt;fc&lt;/span&gt; matrix --pretty&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="output-shape"&gt;Output shape&lt;a class="anchor" href="#output-shape"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The matrix is a JSON array with one object per combination. Each object carries the package &lt;code&gt;name&lt;/code&gt;, the comma-joined &lt;code&gt;features&lt;/code&gt; string, the effective &lt;code&gt;target&lt;/code&gt;, and any configured &lt;code&gt;metadata&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>The override model</title><link>https://romnn.github.io/cargo-feature-combinations/docs/configuration/override-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/configuration/override-model/</guid><description>&lt;h1 id="the-override-model"&gt;The override model&lt;a class="anchor" href="#the-override-model"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every setting resolves along &lt;strong&gt;one precedence chain&lt;/strong&gt;, from broadest to narrowest. Once you know the chain and the three ways to write a value, per-target and per-command configuration are just the same rules applied at a narrower scope.&lt;/p&gt;
&lt;h2 id="the-precedence-chain"&gt;The precedence chain&lt;a class="anchor" href="#the-precedence-chain"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Broadest to narrowest:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;workspace → package
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; within each scope: base → subcommands.&amp;lt;cmd&amp;gt; → target.&amp;#39;cfg(...)&amp;#39; → target.&amp;#39;cfg(...)&amp;#39;.subcommands.&amp;lt;cmd&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A narrower scope overrides a broader one. So a &lt;code&gt;target.'cfg(...)'&lt;/code&gt; override beats a bare &lt;code&gt;subcommands.&amp;lt;cmd&amp;gt;&lt;/code&gt; one, and a package setting beats the workspace.&lt;/p&gt;</description></item><item><title>CLI reference</title><link>https://romnn.github.io/cargo-feature-combinations/docs/commands/cli-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/commands/cli-reference/</guid><description>&lt;h1 id="cli-reference"&gt;CLI reference&lt;a class="anchor" href="#cli-reference"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The authoritative reference is &lt;code&gt;cargo fc --help&lt;/code&gt;. This page mirrors it.&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage&lt;a class="anchor" href="#usage"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo fc [+toolchain] [SUBCOMMAND] [SUBCOMMAND_OPTIONS]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo fc [+toolchain] [OPTIONS] [CARGO_OPTIONS] [CARGO_SUBCOMMAND]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="subcommands"&gt;Subcommands&lt;a class="anchor" href="#subcommands"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Subcommand&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;matrix&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Print the JSON feature-combination matrix to stdout. Add &lt;code&gt;--pretty&lt;/code&gt; for indented JSON.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Print version information.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="options"&gt;Options&lt;a class="anchor" href="#options"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Flag&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-h&lt;/code&gt;, &lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Print help information.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-V&lt;/code&gt;, &lt;code&gt;--version&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Print version information.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--manifest-path &amp;lt;path&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Path to the &lt;code&gt;Cargo.toml&lt;/code&gt; to inspect.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;-p&lt;/code&gt;, &lt;code&gt;--package &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Include only this workspace package (repeatable).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--exclude &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Exclude a workspace package (repeatable). Pairs with &lt;code&gt;--workspace&lt;/code&gt; for Cargo-compatible selection.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--diagnostics-only&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Show only diagnostics (warnings/errors) per combination. Requires a command that emits rustc JSON diagnostics (&lt;code&gt;build&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, &lt;code&gt;clippy&lt;/code&gt;, &lt;code&gt;doc&lt;/code&gt;, or an equivalent alias/wrapper).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--dedupe&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Like &lt;code&gt;--diagnostics-only&lt;/code&gt;, but also deduplicate identical diagnostics across combinations.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--summary-only&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Hide cargo output; show only the final summary.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--fail-fast&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Stop on the first failing combination.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--errors-only&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Allow all warnings, show errors only (&lt;code&gt;-A warnings&lt;/code&gt;). Appends to &lt;code&gt;RUSTFLAGS&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--pedantic&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Treat warnings like errors in the summary and under &lt;code&gt;--fail-fast&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--show-pruned&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Show pruned (redundant) combinations in the summary.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--no-prune-implied&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Disable automatic pruning of redundant combinations.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--packages-only&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;In &lt;code&gt;matrix&lt;/code&gt; mode, emit one row per package-target instead of per combination.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--only-packages-with-lib-target&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Only consider packages that have a library target.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--aggregate-targets&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Batch a combination&amp;rsquo;s configured targets into a single Cargo invocation (one &lt;code&gt;--target&lt;/code&gt; each). Faster on many cores; falls back to serial for &lt;code&gt;run&lt;/code&gt; and pruned summaries.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--no-targets&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Ignore configured target lists for this run; use Cargo&amp;rsquo;s default single target.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--install-missing-targets&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Install missing Rust target components with &lt;code&gt;rustup&lt;/code&gt; before running. Explicit opt-in — may mutate the toolchain and use the network.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;--driver &amp;lt;bin&amp;gt;&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Program invoked in place of &lt;code&gt;cargo&lt;/code&gt; for each build (e.g. &lt;code&gt;cargo-zigbuild&lt;/code&gt;, &lt;code&gt;cross&lt;/code&gt;). See &lt;a href="https://romnn.github.io/cargo-feature-combinations/docs/targets/drivers/"&gt;Build drivers&lt;/a&gt;.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Most boolean flags can also be set as &lt;a href="https://romnn.github.io/cargo-feature-combinations/docs/configuration/flags/"&gt;defaults in &lt;code&gt;Cargo.toml&lt;/code&gt;&lt;/a&gt;; CLI flags always win for a single invocation.&lt;/p&gt;</description></item><item><title>Large feature sets</title><link>https://romnn.github.io/cargo-feature-combinations/docs/recipes/large-feature-sets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/recipes/large-feature-sets/</guid><description>&lt;h1 id="large-independent-feature-sets"&gt;Large, independent feature sets&lt;a class="anchor" href="#large-independent-feature-sets"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; a codec crate supports several serialization &lt;strong&gt;formats&lt;/strong&gt; and, independently, several &lt;strong&gt;compression&lt;/strong&gt; codecs. The two axes are orthogonal — the format code doesn&amp;rsquo;t care which codec is enabled — so a full powerset over all six features is mostly redundant.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;codec&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;yaml&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;msgpack&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gzip&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;zstd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;brotli&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Formats and compression codecs are independent axes — powerset within each&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# group, never across them.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;isolated_feature_sets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yaml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;msgpack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;gzip&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;zstd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;brotli&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Instead of one powerset over all six features, &lt;code&gt;cargo fc&lt;/code&gt; builds a &lt;strong&gt;sub-matrix per group&lt;/strong&gt; and merges them: the formats are varied among themselves, the codecs among themselves — but the two are never crossed. A combination appearing in more than one group is kept once.&lt;/p&gt;</description></item><item><title>Per-target configuration</title><link>https://romnn.github.io/cargo-feature-combinations/docs/configuration/per-target/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/configuration/per-target/</guid><description>&lt;h1 id="per-target-configuration"&gt;Per-target configuration&lt;a class="anchor" href="#per-target-configuration"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Override configuration for specific targets using Cargo-style &lt;code&gt;cfg(...)&lt;/code&gt; selectors. This uses the same forms and precedence as everything else — see &lt;a href="https://romnn.github.io/cargo-feature-combinations/docs/configuration/override-model/"&gt;the override model&lt;/a&gt; — applied at a narrower scope.&lt;/p&gt;
&lt;p&gt;Overrides live under:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cfg(...)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="example-different-features-per-os"&gt;Example: different features per OS&lt;a class="anchor" href="#example-different-features-per-os"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cfg(target_os = &amp;#34;linux&amp;#34;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;metal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cfg(target_os = &amp;#34;macos&amp;#34;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The base excludes &lt;code&gt;default&lt;/code&gt; everywhere. On Linux, &lt;code&gt;metal&lt;/code&gt; is &lt;em&gt;also&lt;/em&gt; excluded (the &lt;code&gt;add&lt;/code&gt; unions into the inherited value); on macOS, &lt;code&gt;cuda&lt;/code&gt; is. Remember: an array like &lt;code&gt;exclude_features = [&amp;quot;metal&amp;quot;]&lt;/code&gt; would have &lt;strong&gt;replaced&lt;/strong&gt; the base instead of extending it.&lt;/p&gt;</description></item><item><title>Per-command configuration</title><link>https://romnn.github.io/cargo-feature-combinations/docs/configuration/per-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/configuration/per-command/</guid><description>&lt;h1 id="per-command-configuration"&gt;Per-command configuration&lt;a class="anchor" href="#per-command-configuration"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Just as you can override configuration per target triple, you can override it per cargo subcommand:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subcommands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A subcommand override accepts the &lt;strong&gt;same feature-matrix keys as a target override&lt;/strong&gt; — &lt;code&gt;exclude_features&lt;/code&gt;, &lt;code&gt;include_features&lt;/code&gt;, &lt;code&gt;only_features&lt;/code&gt;, the &lt;code&gt;*_feature_sets&lt;/code&gt; keys, &lt;code&gt;skip_optional_dependencies&lt;/code&gt;, &lt;code&gt;no_empty_feature_set&lt;/code&gt;, and &lt;code&gt;matrix&lt;/code&gt; — with identical patch semantics.&lt;/p&gt;
&lt;h2 id="example-build-it-but-dont-test-it"&gt;Example: build it, but don&amp;rsquo;t test it&lt;a class="anchor" href="#example-build-it-but-dont-test-it"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Enable a heavy &lt;code&gt;gpu&lt;/code&gt; feature when building, but skip those combinations when testing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# `gpu` is part of the matrix by default (e.g. for `cargo fc build`).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subcommands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ...but never test the gpu combinations.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;gpu&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or restrict &lt;code&gt;cargo fc test&lt;/code&gt; to a single focused set:&lt;/p&gt;</description></item><item><title>Flags in config</title><link>https://romnn.github.io/cargo-feature-combinations/docs/configuration/flags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/configuration/flags/</guid><description>&lt;h1 id="cargo-fc-flags-in-config"&gt;&lt;code&gt;cargo fc&lt;/code&gt; flags in config&lt;a class="anchor" href="#cargo-fc-flags-in-config"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Most &lt;code&gt;cargo fc&lt;/code&gt; boolean flags can be set as defaults in &lt;code&gt;Cargo.toml&lt;/code&gt;, using the flag name with &lt;code&gt;_&lt;/code&gt; instead of &lt;code&gt;-&lt;/code&gt;. Explicit CLI flags still win for a single invocation.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;dedupe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;fail_fast&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;pedantic&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cfg(target_os = &amp;#34;windows&amp;#34;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;errors_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cfg(target_os = &amp;#34;windows&amp;#34;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subcommands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clippy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;dedupe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subcommands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;my-custom-cmd&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;dedupe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configurable-flag-keys"&gt;Configurable flag keys&lt;a class="anchor" href="#configurable-flag-keys"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;summary_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;diagnostics_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;dedupe&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;verbose&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;pedantic&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;errors_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;packages_only&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;fail_fast&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;prune_implied&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;show_pruned&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;aggregate_targets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;no_targets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;install_missing_targets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;only_packages_with_lib_target&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dedupe = true&lt;/code&gt; implies diagnostics-only output.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prune_implied = false&lt;/code&gt; turns off &lt;a href="https://romnn.github.io/cargo-feature-combinations/docs/configuration/feature-matrix/#automatic-pruning"&gt;automatic pruning&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="precedence"&gt;Precedence&lt;a class="anchor" href="#precedence"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Flags resolve broad-to-narrow, with CLI flags last:&lt;/p&gt;</description></item><item><title>Per-command differences</title><link>https://romnn.github.io/cargo-feature-combinations/docs/recipes/per-command-differences/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/recipes/per-command-differences/</guid><description>&lt;h1 id="build-a-feature-you-never-test"&gt;Build a feature you never test&lt;a class="anchor" href="#build-a-feature-you-never-test"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; a &lt;code&gt;renderer&lt;/code&gt; crate has a heavy &lt;code&gt;gpu&lt;/code&gt; feature. It should be compiled to catch build breakage, but its tests need a GPU that CI doesn&amp;rsquo;t have. You want &lt;code&gt;cargo fc build&lt;/code&gt; to include &lt;code&gt;gpu&lt;/code&gt;, but &lt;code&gt;cargo fc test&lt;/code&gt; to skip it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;renderer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;doctest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;gpu&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;simd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# gpu is part of the matrix by default (build, check, clippy).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subcommands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ...but never test the gpu combinations.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;gpu&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;cargo fc build&lt;/code&gt; varies both features — four combinations, including the &lt;code&gt;gpu&lt;/code&gt; ones:&lt;/p&gt;</description></item><item><title>Cross-compilation in CI</title><link>https://romnn.github.io/cargo-feature-combinations/docs/recipes/cross-compilation-ci/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/recipes/cross-compilation-ci/</guid><description>&lt;h1 id="cross-compilation-in-ci"&gt;Cross-compilation in CI&lt;a class="anchor" href="#cross-compilation-in-ci"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; you want to check every feature combination on several target triples, from a single CI job, without a matrix of GitHub Actions jobs.&lt;/p&gt;
&lt;h2 id="declare-the-targets"&gt;Declare the targets&lt;a class="anchor" href="#declare-the-targets"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Declare the target list in the workspace &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Workspace that checks every feature combination across multiple target triples.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;resolver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;members&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;crates/*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;package&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2024&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;publish&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cargo-fc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Check every feature combination on each of these targets.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;targets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;x86_64-unknown-linux-gnu&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;wasm32-unknown-unknown&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# `check` never links, so plain cargo cross-checks fine without a C toolchain.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# (Cross-compiling native-C deps would use the cargo-zigbuild default instead.)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cargo&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A single &lt;code&gt;cargo fc check&lt;/code&gt; then visits every feature combination on every target:&lt;/p&gt;</description></item><item><title>FAQ &amp; troubleshooting</title><link>https://romnn.github.io/cargo-feature-combinations/docs/faq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://romnn.github.io/cargo-feature-combinations/docs/faq/</guid><description>&lt;h1 id="faq--troubleshooting"&gt;FAQ &amp;amp; troubleshooting&lt;a class="anchor" href="#faq--troubleshooting"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="how-is-this-different-from---all-features"&gt;How is this different from &lt;code&gt;--all-features&lt;/code&gt;?&lt;a class="anchor" href="#how-is-this-different-from---all-features"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;--all-features&lt;/code&gt; enables every feature at once — a single configuration. &lt;code&gt;cargo fc&lt;/code&gt; runs &lt;em&gt;many&lt;/em&gt; configurations: the combinations of your features. That&amp;rsquo;s what catches a conflict between two features that each work alone but not together, or a crate that breaks with &lt;code&gt;--no-default-features&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="how-is-this-different-from-cargo-all-features"&gt;How is this different from &lt;code&gt;cargo-all-features&lt;/code&gt;?&lt;a class="anchor" href="#how-is-this-different-from-cargo-all-features"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Both explore feature combinations. &lt;code&gt;cargo fc&lt;/code&gt; adds a single readable summary, diagnostics de-duplication, automatic pruning of redundant combinations, a JSON &lt;code&gt;matrix&lt;/code&gt; for CI, per-target and per-command configuration, and driver-based cross-compilation. The &lt;code&gt;skip_optional_dependencies&lt;/code&gt; behavior is intentionally compatible.&lt;/p&gt;</description></item></channel></rss>