Skip to content

Commit c38da98

Browse files
committed
feat(build): support building without --fetch enabled
This eliminates the reqwest dependency and the heavy TLS library and such. Reduces the binary size by about a third. Signed-off-by: Steven Noonan <steven@uplinklabs.net>
1 parent 66e69fa commit c38da98

5 files changed

Lines changed: 29 additions & 7 deletions

File tree

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@ rust-version = "1.88"
1111
name = "gloam"
1212
path = "src/main.rs"
1313

14+
[features]
15+
default = ["fetch"]
16+
fetch = ["dep:reqwest"]
17+
1418
[dependencies]
1519
anyhow = "1"
1620
clap = { version = "4", features = ["derive"] }
1721
indexmap = { version = "2", features = ["serde"] }
1822
minijinja = "2"
19-
reqwest = { version = "0.13", features = ["blocking", "rustls"], default-features = false }
23+
reqwest = { version = "0.13", features = ["blocking", "rustls"], default-features = false, optional = true}
2024
roxmltree = "0.21"
2125
serde = { version = "1", features = ["derive"] }
2226
xxhash-rust = { version = "0.8", features = ["xxh3"] }

src/cli.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ pub struct Cli {
6767
pub quiet: bool,
6868

6969
/// Fetch XML specs from Khronos remote URLs instead of bundled copies.
70+
#[cfg(feature = "fetch")]
7071
#[arg(long)]
7172
pub fetch: bool,
7273

@@ -99,6 +100,17 @@ impl Cli {
99100
.collect()
100101
}
101102

103+
pub fn use_fetch(&self) -> bool {
104+
#[cfg(feature = "fetch")]
105+
{
106+
self.fetch
107+
}
108+
#[cfg(not(feature = "fetch"))]
109+
{
110+
false
111+
}
112+
}
113+
102114
/// Parse the --extensions argument into an `ExtensionFilter`.
103115
pub fn extension_filter(&self) -> Result<ExtensionFilter> {
104116
let Some(ref spec) = self.extensions else {

src/fetch.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
//! XML and auxiliary header loading. Default mode uses compile-time-embedded
22
//! bundled copies; `--fetch` downloads from remote Khronos URLs.
33
4+
// In case we built without features=fetch
5+
#![allow(dead_code, unused)]
6+
47
use anyhow::{Context, Result};
58

69
use crate::bundled;
@@ -36,14 +39,15 @@ pub struct SpecSources {
3639
// ---------------------------------------------------------------------------
3740

3841
pub fn load_spec(spec_name: &str, use_fetch: bool) -> Result<SpecSources> {
42+
#[cfg(feature = "fetch")]
3943
if use_fetch {
40-
fetch_spec(spec_name)
41-
} else {
42-
bundled_spec(spec_name)
44+
return fetch_spec(spec_name);
4345
}
46+
bundled_spec(spec_name)
4447
}
4548

4649
pub fn load_auxiliary_header(path: &str, use_fetch: bool) -> Result<String> {
50+
#[cfg(feature = "fetch")]
4751
if use_fetch {
4852
if let Some(url) = auxiliary_url(path) {
4953
return fetch_text(&url)
@@ -116,6 +120,7 @@ fn bundled_auxiliary(path: &str) -> Result<&'static str> {
116120
// Fetch mode
117121
// ---------------------------------------------------------------------------
118122

123+
#[cfg(feature = "fetch")]
119124
fn fetch_spec(spec_name: &str) -> Result<SpecSources> {
120125
let primary_url = match spec_name {
121126
"gl" => format!("{}gl.xml", BASE_GL),
@@ -160,6 +165,7 @@ fn auxiliary_url(path: &str) -> Option<String> {
160165
}
161166
}
162167

168+
#[cfg(feature = "fetch")]
163169
fn fetch_text(url: &str) -> Result<String> {
164170
let resp = reqwest::blocking::get(url)
165171
.with_context(|| format!("GET {}", url))?

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn run() -> Result<()> {
4949
eprintln!("gloam: generating C loader...");
5050
}
5151
for fs in &feature_sets {
52-
generator::c::generate(fs, c_args, out, cli.fetch, &command_line)?;
52+
generator::c::generate(fs, c_args, out, cli.use_fetch(), &command_line)?;
5353
}
5454
}
5555
}

src/resolve.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ pub fn build_feature_sets(cli: &Cli) -> Result<Vec<FeatureSet>> {
292292
.push(req);
293293
}
294294
for (spec_name, reqs) in &by_spec {
295-
let sources = fetch::load_spec(spec_name, cli.fetch)?;
295+
let sources = fetch::load_spec(spec_name, cli.use_fetch())?;
296296
let raw = parse::parse(&sources, spec_name)?;
297297
let fs = resolve_feature_set(
298298
&raw,
@@ -309,7 +309,7 @@ pub fn build_feature_sets(cli: &Cli) -> Result<Vec<FeatureSet>> {
309309
} else {
310310
for req in &requests {
311311
let spec_name = req.spec_name();
312-
let sources = fetch::load_spec(spec_name, cli.fetch)?;
312+
let sources = fetch::load_spec(spec_name, cli.use_fetch())?;
313313
let raw = parse::parse(&sources, spec_name)?;
314314
let fs = resolve_feature_set(
315315
&raw,

0 commit comments

Comments
 (0)