@@ -51,7 +51,11 @@ fn process_imports(shader_dir: &str, shader: &str, included: &mut HashSet<String
51
51
}
52
52
}
53
53
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
+ ) {
55
59
let mut imported = String :: from ( "#define SWGL 1\n #define __VERSION__ 150\n " ) ;
56
60
let _ = write ! ( imported, "#define WR_MAX_VERTEX_TEXTURE_WIDTH {}U\n " ,
57
61
webrender_build:: MAX_VERTEX_TEXTURE_WIDTH ) ;
@@ -72,6 +76,27 @@ fn translate_shader(shader_key: &str, shader_dir: &str) {
72
76
let imp_name = format ! ( "{}/{}.c" , out_dir, shader) ;
73
77
std:: fs:: write ( & imp_name, imported) . unwrap ( ) ;
74
78
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
+
75
100
let mut build = cc:: Build :: new ( ) ;
76
101
build. no_default_flags ( true ) ;
77
102
if let Ok ( tool) = build. try_get_compiler ( ) {
@@ -86,8 +111,6 @@ fn translate_shader(shader_key: &str, shader_dir: &str) {
86
111
build. flag ( "-xc" ) . flag ( "-P" ) . flag ( "-undef" ) ;
87
112
}
88
113
}
89
- // Use SWGLPP target to avoid pulling CFLAGS/CXXFLAGS.
90
- build. target ( "SWGLPP" ) ;
91
114
build. file ( & imp_name) ;
92
115
let vs = build. clone ( )
93
116
. define ( "WR_VERTEX_SHADER" , Some ( "1" ) )
@@ -126,20 +149,11 @@ fn main() {
126
149
127
150
shaders. sort ( ) ;
128
151
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 ;
140
153
for shader in & shaders {
141
- translate_shader ( shader, & shader_dir) ;
154
+ translate_shader ( shader, & shader_dir, & mut suppressed_env_vars ) ;
142
155
}
156
+ drop ( suppressed_env_vars) ; // Restore env. vars. for further compilation.
143
157
144
158
write_load_shader ( & shaders) ;
145
159
@@ -203,3 +217,19 @@ fn main() {
203
217
. include ( std:: env:: var ( "OUT_DIR" ) . unwrap ( ) )
204
218
. compile ( "gl_cc" ) ;
205
219
}
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