1
1
use regex:: Regex ;
2
2
use std:: env;
3
3
use std:: fs;
4
+ use std:: io:: BufRead ;
4
5
use std:: io:: { self , Write } ;
5
6
use std:: path;
6
7
use std:: process:: Command ;
7
8
8
9
const WEBRTC_TAG : & str = "webrtc-beb0471" ;
10
+ const IGNORE_DEFINES : [ & str ; 2 ] = [ "CR_CLANG_REVISION" , "CR_XCODE_VERSION" ] ;
9
11
10
12
fn download_prebuilt_webrtc (
11
13
out_path : path:: PathBuf ,
12
14
) -> Result < path:: PathBuf , Box < dyn std:: error:: Error > > {
13
15
let target_arch = env:: var ( "CARGO_CFG_TARGET_ARCH" ) . unwrap ( ) ;
14
16
let target_os = env:: var ( "CARGO_CFG_TARGET_OS" ) . unwrap ( ) ;
17
+
18
+ // This is not yet supported on all platforms.
19
+ // On Windows, we need Rust to link against libcmtd.
15
20
let use_debug = {
16
21
let var = env:: var ( "LK_DEBUG_WEBRTC" ) ;
17
22
var. is_ok ( ) && var. unwrap ( ) == "true"
@@ -95,19 +100,26 @@ fn main() {
95
100
let var = env:: var ( "LK_CUSTOM_WEBRTC" ) ;
96
101
var. is_ok ( ) && var. unwrap ( ) == "true"
97
102
} ;
103
+ println ! ( "cargo:rerun-if-env-changed=LK_CUSTOM_WEBRTC" ) ;
98
104
99
- let ( webrtc_include, webrtc_lib) = if use_custom_webrtc {
105
+ let ( webrtc_dir , webrtc_include, webrtc_lib) = if use_custom_webrtc {
100
106
// Use a local WebRTC version (libwebrtc folder)
101
107
let webrtc_dir = path:: PathBuf :: from ( "./libwebrtc" ) ;
102
- ( webrtc_dir. join ( "src" ) , webrtc_dir. join ( "src/out/Dev/obj" ) )
108
+ (
109
+ webrtc_dir. clone ( ) ,
110
+ webrtc_dir. join ( "include" ) ,
111
+ webrtc_dir. join ( "lib" ) ,
112
+ )
103
113
} else {
104
114
// Download a prebuilt version of WebRTC
105
115
let download_dir = env:: var ( "OUT_DIR" ) . unwrap ( ) + "/webrtc-sdk" ;
106
116
let webrtc_dir = download_prebuilt_webrtc ( path:: PathBuf :: from ( download_dir) ) . unwrap ( ) ;
107
-
108
- ( webrtc_dir. join ( "include" ) , webrtc_dir. join ( "lib" ) )
117
+ (
118
+ webrtc_dir. clone ( ) ,
119
+ webrtc_dir. join ( "include" ) ,
120
+ webrtc_dir. join ( "lib" ) ,
121
+ )
109
122
} ;
110
- println ! ( "cargo:rerun-if-env-changed=LK_CUSTOM_WEBRTC" ) ;
111
123
112
124
// Just required for the bridge build to succeed.
113
125
let includes = & [
@@ -140,23 +152,25 @@ fn main() {
140
152
"src/helper.rs" ,
141
153
] ) ;
142
154
143
- builder. file ( "src/peer_connection.cpp" ) ;
144
- builder. file ( "src/peer_connection_factory.cpp" ) ;
145
- builder. file ( "src/media_stream.cpp" ) ;
146
- builder. file ( "src/data_channel.cpp" ) ;
147
- builder. file ( "src/jsep.cpp" ) ;
148
- builder. file ( "src/candidate.cpp" ) ;
149
- builder. file ( "src/rtp_receiver.cpp" ) ;
150
- builder. file ( "src/rtp_sender.cpp" ) ;
151
- builder. file ( "src/rtp_transceiver.cpp" ) ;
152
- builder. file ( "src/rtp_parameters.cpp" ) ;
153
- builder. file ( "src/rtc_error.cpp" ) ;
154
- builder. file ( "src/webrtc.cpp" ) ;
155
- builder. file ( "src/video_frame.cpp" ) ;
156
- builder. file ( "src/video_frame_buffer.cpp" ) ;
157
- builder. file ( "src/video_encoder_factory.cpp" ) ;
158
- builder. file ( "src/video_decoder_factory.cpp" ) ;
159
- builder. file ( "src/audio_device.cpp" ) ;
155
+ builder. files ( & [
156
+ "src/peer_connection.cpp" ,
157
+ "src/peer_connection_factory.cpp" ,
158
+ "src/media_stream.cpp" ,
159
+ "src/data_channel.cpp" ,
160
+ "src/jsep.cpp" ,
161
+ "src/candidate.cpp" ,
162
+ "src/rtp_receiver.cpp" ,
163
+ "src/rtp_sender.cpp" ,
164
+ "src/rtp_transceiver.cpp" ,
165
+ "src/rtp_parameters.cpp" ,
166
+ "src/rtc_error.cpp" ,
167
+ "src/webrtc.cpp" ,
168
+ "src/video_frame.cpp" ,
169
+ "src/video_frame_buffer.cpp" ,
170
+ "src/video_encoder_factory.cpp" ,
171
+ "src/video_decoder_factory.cpp" ,
172
+ "src/audio_device.cpp" ,
173
+ ] ) ;
160
174
161
175
for include in includes {
162
176
builder. include ( include) ;
@@ -167,6 +181,20 @@ fn main() {
167
181
webrtc_lib. canonicalize( ) . unwrap( ) . to_str( ) . unwrap( )
168
182
) ;
169
183
184
+ // Read preprocessor definitions from webrtc.ninja
185
+ let webrtc_gni = fs:: File :: open ( webrtc_dir. join ( "webrtc.ninja" ) ) . unwrap ( ) ;
186
+ let mut reader = io:: BufReader :: new ( webrtc_gni) . lines ( ) ;
187
+ let defines_line = reader. next ( ) . unwrap ( ) . unwrap ( ) ; // The first line contains the defines
188
+ let defines_re = Regex :: new ( r"-D(\w+)(?:=([^\s]+))?" ) . unwrap ( ) ;
189
+ for cap in defines_re. captures_iter ( & defines_line) {
190
+ let define_name = & cap[ 1 ] ;
191
+ let define_value = cap. get ( 2 ) . map ( |m| m. as_str ( ) ) ;
192
+ if IGNORE_DEFINES . contains ( & define_name) {
193
+ continue ;
194
+ }
195
+ builder. define ( define_name, define_value) ;
196
+ }
197
+
170
198
let target_os = env:: var ( "CARGO_CFG_TARGET_OS" ) . unwrap ( ) ;
171
199
match target_os. as_str ( ) {
172
200
"windows" => {
@@ -186,12 +214,7 @@ fn main() {
186
214
println ! ( "cargo:rustc-link-lib=dylib=dwmapi" ) ;
187
215
println ! ( "cargo:rustc-link-lib=static=webrtc" ) ;
188
216
189
- builder
190
- . flag ( "/std:c++17" )
191
- . flag ( "/EHsc" )
192
- . define ( "WEBRTC_WIN" , None )
193
- //.define("WEBRTC_ENABLE_SYMBOL_EXPORT", None) Not necessary when using WebRTC as a static library
194
- . define ( "NOMINMAX" , None ) ;
217
+ builder. flag ( "/std:c++17" ) . flag ( "/EHsc" ) ;
195
218
}
196
219
"linux" => {
197
220
println ! ( "cargo:rustc-link-lib=dylib=Xext" ) ;
@@ -203,10 +226,7 @@ fn main() {
203
226
println ! ( "cargo:rustc-link-lib=dylib=m" ) ;
204
227
println ! ( "cargo:rustc-link-lib=static=webrtc" ) ;
205
228
206
- builder
207
- . flag ( "-std=c++17" )
208
- . define ( "WEBRTC_POSIX" , None )
209
- . define ( "WEBRTC_LINUX" , None ) ;
229
+ builder. flag ( "-std=c++17" ) ;
210
230
}
211
231
"macos" => {
212
232
println ! ( "cargo:rustc-link-lib=framework=Foundation" ) ;
@@ -254,19 +274,10 @@ fn main() {
254
274
builder
255
275
. flag ( "-stdlib=libc++" )
256
276
. flag ( "-std=c++17" )
257
- . flag ( format ! ( "-isysroot{}" , sysroot) . as_str ( ) )
258
- . define ( "WEBRTC_ENABLE_OBJC_SYMBOL_EXPORT" , None )
259
- . define ( "WEBRTC_POSIX" , None )
260
- . define ( "WEBRTC_MAC" , None ) ;
277
+ . flag ( format ! ( "-isysroot{}" , sysroot) . as_str ( ) ) ;
261
278
}
262
279
"ios" => {
263
- builder
264
- . flag ( "-std=c++17" )
265
- . file ( "src/objc_test.mm" )
266
- . define ( "WEBRTC_ENABLE_OBJC_SYMBOL_EXPORT" , None )
267
- . define ( "WEBRTC_MAC" , None )
268
- . define ( "WEBRTC_POSIX" , None )
269
- . define ( "WEBRTC_IOS" , None ) ;
280
+ builder. flag ( "-std=c++17" ) ;
270
281
}
271
282
"android" => {
272
283
let ndk_env = env:: var ( "ANDROID_NDK_HOME" ) . expect (
@@ -330,11 +341,7 @@ fn main() {
330
341
vs_path. to_str( ) . unwrap( )
331
342
) ;
332
343
333
- builder
334
- . flag ( "-std=c++17" )
335
- . define ( "WEBRTC_LINUX" , None )
336
- . define ( "WEBRTC_POSIX" , None )
337
- . define ( "WEBRTC_ANDROID" , None ) ;
344
+ builder. flag ( "-std=c++17" ) ;
338
345
}
339
346
_ => {
340
347
panic ! ( "Unsupported target, {}" , target_os) ;
0 commit comments