Skip to content

Commit 9721fe5

Browse files
Bug 1943149 - refactor(swgl): use env vars. instead of cc::Build::target to avoid *C{,XX}FLAGS* r=gfx-reviewers,lsalzman
Newer versions of `cc` reject an unknown `target`, so we won't be able to use this approach any more. Differential Revision: https://phabricator.services.mozilla.com/D235480
1 parent fedbc93 commit 9721fe5

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

swgl/build.rs

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ fn process_imports(shader_dir: &str, shader: &str, included: &mut HashSet<String
5151
}
5252
}
5353

54-
fn translate_shader(shader_key: &str, shader_dir: &str) {
54+
fn translate_shader(
55+
shader_key: &str,
56+
shader_dir: &str,
57+
suppressed_env_vars: &mut Option<Vec<EnvVarGuard>>,
58+
) {
5559
let mut imported = String::from("#define SWGL 1\n#define __VERSION__ 150\n");
5660
let _ = write!(imported, "#define WR_MAX_VERTEX_TEXTURE_WIDTH {}U\n",
5761
webrender_build::MAX_VERTEX_TEXTURE_WIDTH);
@@ -72,6 +76,27 @@ fn translate_shader(shader_key: &str, shader_dir: &str) {
7276
let imp_name = format!("{}/{}.c", out_dir, shader);
7377
std::fs::write(&imp_name, imported).unwrap();
7478

79+
// We need to ensure that the C preprocessor does not pull compiler flags from the host or
80+
// target environment. Set all `CFLAGS` or `CXXFLAGS` env. vars. to empty to work around this.
81+
let _ = suppressed_env_vars.get_or_insert_with(|| {
82+
let mut env_vars = Vec::new();
83+
for (key, value) in std::env::vars_os() {
84+
if let Some(key_utf8) = key.to_str() {
85+
if ["CFLAGS", "CXXFLAGS"]
86+
.iter()
87+
.any(|opt_name| key_utf8.contains(opt_name))
88+
{
89+
std::env::set_var(&key, "");
90+
env_vars.push(EnvVarGuard {
91+
key,
92+
old_value: Some(value),
93+
});
94+
}
95+
}
96+
}
97+
env_vars
98+
});
99+
75100
let mut build = cc::Build::new();
76101
build.no_default_flags(true);
77102
if let Ok(tool) = build.try_get_compiler() {
@@ -86,8 +111,6 @@ fn translate_shader(shader_key: &str, shader_dir: &str) {
86111
build.flag("-xc").flag("-P").flag("-undef");
87112
}
88113
}
89-
// Use SWGLPP target to avoid pulling CFLAGS/CXXFLAGS.
90-
build.target("SWGLPP");
91114
build.file(&imp_name);
92115
let vs = build.clone()
93116
.define("WR_VERTEX_SHADER", Some("1"))
@@ -126,20 +149,11 @@ fn main() {
126149

127150
shaders.sort();
128151

129-
// We need to ensure that the C preprocessor does not pull compiler flags from
130-
// the host or target environment. Set up a SWGLPP target with empty flags to
131-
// work around this.
132-
if let Ok(target) = std::env::var("TARGET") {
133-
if let Ok(cc) = std::env::var(format!("CC_{}", target))
134-
.or(std::env::var(format!("CC_{}", target.replace("-", "_")))) {
135-
std::env::set_var("CC_SWGLPP", cc);
136-
}
137-
}
138-
std::env::set_var("CFLAGS_SWGLPP", "");
139-
152+
let mut suppressed_env_vars = None;
140153
for shader in &shaders {
141-
translate_shader(shader, &shader_dir);
154+
translate_shader(shader, &shader_dir, &mut suppressed_env_vars);
142155
}
156+
drop(suppressed_env_vars); // Restore env. vars. for further compilation.
143157

144158
write_load_shader(&shaders);
145159

@@ -203,3 +217,19 @@ fn main() {
203217
.include(std::env::var("OUT_DIR").unwrap())
204218
.compile("gl_cc");
205219
}
220+
221+
struct EnvVarGuard {
222+
key: std::ffi::OsString,
223+
old_value: Option<std::ffi::OsString>,
224+
}
225+
226+
impl Drop for EnvVarGuard {
227+
fn drop(&mut self) {
228+
let Self { key, old_value } = &*self;
229+
if let Some(old_value) = old_value.as_ref() {
230+
std::env::set_var(key, old_value);
231+
} else {
232+
std::env::remove_var(key);
233+
}
234+
}
235+
}

0 commit comments

Comments
 (0)