@@ -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