Skip to content

Commit 838f8ba

Browse files
committed
Pick some statically linking library from CCExtractor#129
1 parent f7ebfd2 commit 838f8ba

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

build.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,38 @@ static LIBS: Lazy<[&str; 7]> = Lazy::new(|| {
1818
]
1919
});
2020

21+
static SYS_STATIC_LIBS: Lazy<HashMap<&str, Vec<&str>>> = Lazy::new(|| {
22+
if cfg!(target_os = "windows") {
23+
// Statically linking FFmpeg on Windows requires additional dependencies. This is a map
24+
// of FFmpeg library name to system libraries. In the future, if
25+
// https://github.com/CCExtractor/rusty_ffmpeg/issues/128 is addressed, we will want to
26+
// selectively choose which system libraries to link based on chosen FFmpeg features.
27+
//
28+
// Note that the values were obtained by building FFmpeg using vcpkg with the
29+
// x64-windows-static triplet, and then examining the generated .pc files in the pkgconfig
30+
// directory.
31+
HashMap::from([
32+
(
33+
"avcodec",
34+
vec!["mfuuid", "ole32", "strmiids", "ole32", "user32"],
35+
),
36+
(
37+
"avdevice",
38+
vec![
39+
"psapi", "ole32", "strmiids", "uuid", "oleaut32", "shlwapi", "gdi32", "vfw32",
40+
],
41+
),
42+
("avfilter", vec![]),
43+
("avformat", vec!["secur32", "ws2_32"]),
44+
("avutil", vec!["user32", "bcrypt"]),
45+
("swresample", vec![]),
46+
("swscale", vec![]),
47+
])
48+
} else {
49+
HashMap::new()
50+
}
51+
});
52+
2153
/// Whitelist of the headers we want to generate bindings
2254
static HEADERS: Lazy<Vec<PathBuf>> = Lazy::new(|| {
2355
[
@@ -399,6 +431,16 @@ fn dynamic_linking(env_vars: &EnvVars) {
399431
fn static_linking(env_vars: &EnvVars) {
400432
let output_binding_path = &env_vars.out_dir.as_ref().unwrap().join("binding.rs");
401433

434+
fn static_link_sys_libs() {
435+
// Statically linking to FFmpeg may also require us to link to some system libraries.
436+
let mut sys_libs: Vec<_> = SYS_STATIC_LIBS.values().flatten().collect();
437+
sys_libs.sort();
438+
sys_libs.dedup();
439+
for sys_lib in sys_libs {
440+
println!("cargo:rustc-link-lib={sys_lib}");
441+
}
442+
}
443+
402444
#[cfg(not(target_os = "windows"))]
403445
{
404446
fn static_linking_with_pkg_config_and_bindgen(
@@ -419,6 +461,7 @@ fn static_linking(env_vars: &EnvVars) {
419461
.write_to_file(output_binding_path)
420462
.expect("Cannot write binding to file.");
421463
}
464+
static_link_sys_libs();
422465
Ok(())
423466
}
424467
// Hint: set PKG_CONFIG_PATH to some placeholder value will let pkg_config probing system library.
@@ -491,6 +534,7 @@ Enable `link_vcpkg_ffmpeg` feature if you want to link ffmpeg libraries installe
491534
{
492535
if let Some(ffmpeg_libs_dir) = env_vars.ffmpeg_libs_dir.as_ref() {
493536
static_linking_with_libs_dir(&*LIBS, ffmpeg_libs_dir);
537+
static_link_sys_libs();
494538
if let Some(ffmpeg_binding_path) = env_vars.ffmpeg_binding_path.as_ref() {
495539
use_prebuilt_binding(ffmpeg_binding_path, output_binding_path);
496540
} else if let Some(ffmpeg_include_dir) = env_vars.ffmpeg_include_dir.as_ref() {

0 commit comments

Comments
 (0)