From df8ec00c45f822ef53a6f29fd354fb0fb91804dc Mon Sep 17 00:00:00 2001 From: DoumanAsh Date: Sat, 2 May 2026 20:04:30 +0900 Subject: [PATCH 1/3] Add test to use decoder and disable LTO flags when these are detected --- .github/workflows/rust.yml | 2 ++ build.rs | 18 +++++++++++++++++- tests/version.rs | 14 +++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 242f57c..06d768c 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -10,6 +10,7 @@ on: - 'tests/**' - 'Cargo.toml' - 'opus/**/*' + - 'build.rs' pull_request: types: [opened, synchronize, reopened, ready_for_review] branches: @@ -20,6 +21,7 @@ on: - 'tests/**' - 'Cargo.toml' - 'opus/**/*' + - 'build.rs' jobs: check: strategy: diff --git a/build.rs b/build.rs index d19667e..dcf4761 100644 --- a/build.rs +++ b/build.rs @@ -100,7 +100,9 @@ fn build() { .define("CMAKE_INSTALL_INCLUDEDIR", "include") .define("CMAKE_INSTALL_OLDINCLUDEDIR", "include") .define("CMAKE_INSTALL_LIBDIR", "lib") - .define("CMAKE_TRY_COMPILE_TARGET_TYPE", "STATIC_LIBRARY"); + .define("CMAKE_TRY_COMPILE_TARGET_TYPE", "STATIC_LIBRARY") + //Ensure opus's CMake never enables LTO + .define("CMAKE_INTERPROCEDURAL_OPTIMIZATION", "off"); //Keep this up to date with Cargo.toml if cfg!(feature = "dred") { @@ -125,6 +127,20 @@ fn build() { cmake.define("OPUS_FIXED_POINT", "ON"); } + //Disable LTO if someone tries to force it (e.g. Arch makepkg) + if let Ok(cflags) = std::env::var("CFLAGS") { + if cflags.contains("-flto") { + println!("cargo:warning=LTO detected in CFLAGS. Overriding..."); + cmake.cflag("-fno-lto"); + } + } + if let Ok(cflags) = std::env::var("CXXFLAGS") { + if cflags.contains("-flto") { + println!("cargo:warning=LTO detected in CXXFLAGS. Overriding..."); + cmake.cxxflag("-fno-lto"); + } + } + if let Some((toolchain_file, abi)) = get_android_vars() { cmake.define("CMAKE_TOOLCHAIN_FILE", toolchain_file); cmake.define("ANDROID_ABI", abi); diff --git a/tests/version.rs b/tests/version.rs index ccaaa45..e692f41 100644 --- a/tests/version.rs +++ b/tests/version.rs @@ -1,5 +1,6 @@ -use opusic_sys::opus_get_version_string; +use opusic_sys::{opus_get_version_string, opus_decoder_create, opus_decoder_destroy}; +use core::ptr; use core::ffi::CStr; #[test] @@ -10,3 +11,14 @@ fn check_version() { let version = version.to_str().expect("utf-8 string"); assert_eq!("libopus 1.6.1", version); } + +#[test] +fn check_decoder_symbols() { + let result = unsafe { + opus_decoder_create(8000, 2, ptr::null_mut()) + }; + assert!(!result.is_null()); + unsafe { + opus_decoder_destroy(result); + } +} From f0d294645c5a343b13d39b1125bcbbe15e328f9d Mon Sep 17 00:00:00 2001 From: DoumanAsh Date: Sat, 2 May 2026 20:26:34 +0900 Subject: [PATCH 2/3] use set_var --- build.rs | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/build.rs b/build.rs index dcf4761..0fbf6c0 100644 --- a/build.rs +++ b/build.rs @@ -86,10 +86,31 @@ fn set_cmake_define_if_present(config: &mut cmake::Config, name: &str) { } } +//Disable LTO if someone tries to force it (e.g. Arch makepkg) +//This is necessary because cmake crate doesn't pass env variables at configure step +fn fix_build_env() { + for var in ["CFLAGS", "CXXFLAGS"] { + if let Ok(value) = std::env::var(var) { + if value.contains("-flto") { + let filtered: String = value + .split_whitespace() + .filter(|f| !f.starts_with("-flto")) + .collect::>() + .join(" "); + unsafe { std::env::set_var(var, filtered); } + } + } + } +} + #[cfg(feature = "bundled")] fn build() { const CURRENT_DIR: &str = "opus"; + + //TODO: make PR to cmake crate to work it around properly + fix_build_env(); + let mut cmake = cmake::Config::new(CURRENT_DIR); cmake.define("OPUS_INSTALL_PKG_CONFIG_MODULE", "OFF") .define("OPUS_INSTALL_CMAKE_CONFIG_MODULE", "OFF") @@ -127,20 +148,6 @@ fn build() { cmake.define("OPUS_FIXED_POINT", "ON"); } - //Disable LTO if someone tries to force it (e.g. Arch makepkg) - if let Ok(cflags) = std::env::var("CFLAGS") { - if cflags.contains("-flto") { - println!("cargo:warning=LTO detected in CFLAGS. Overriding..."); - cmake.cflag("-fno-lto"); - } - } - if let Ok(cflags) = std::env::var("CXXFLAGS") { - if cflags.contains("-flto") { - println!("cargo:warning=LTO detected in CXXFLAGS. Overriding..."); - cmake.cxxflag("-fno-lto"); - } - } - if let Some((toolchain_file, abi)) = get_android_vars() { cmake.define("CMAKE_TOOLCHAIN_FILE", toolchain_file); cmake.define("ANDROID_ABI", abi); From c1e8bcfbee2b79e2acfbe160228b77f188cb284a Mon Sep 17 00:00:00 2001 From: DoumanAsh Date: Sat, 2 May 2026 21:07:26 +0900 Subject: [PATCH 3/3] Finalize --- build.rs | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/build.rs b/build.rs index 0fbf6c0..2861369 100644 --- a/build.rs +++ b/build.rs @@ -86,32 +86,33 @@ fn set_cmake_define_if_present(config: &mut cmake::Config, name: &str) { } } -//Disable LTO if someone tries to force it (e.g. Arch makepkg) -//This is necessary because cmake crate doesn't pass env variables at configure step -fn fix_build_env() { - for var in ["CFLAGS", "CXXFLAGS"] { - if let Ok(value) = std::env::var(var) { - if value.contains("-flto") { - let filtered: String = value - .split_whitespace() - .filter(|f| !f.starts_with("-flto")) - .collect::>() - .join(" "); - unsafe { std::env::set_var(var, filtered); } - } - } - } -} - #[cfg(feature = "bundled")] fn build() { const CURRENT_DIR: &str = "opus"; - - //TODO: make PR to cmake crate to work it around properly - fix_build_env(); + //Disable LTO if someone tries to force it (e.g. Arch makepkg) + //This is necessary because cmake crate doesn't pass env variables at configure step, so we will + //adjust both configure variables and general build env (just in case) + fn fix_build_env(cmake: &mut cmake::Config) { + for (var, cmake_var) in [("CFLAGS", "CMAKE_C_FLAGS"), ("CXXFLAGS", "CMAKE_CXX_FLAGS")] { + if let Ok(value) = std::env::var(var) { + if value.contains("-flto") { + println!("cargo:warning=env::{var} contains LTO option. Overriding it..."); + let filtered: String = value + .split_whitespace() + .filter(|f| !f.starts_with("-flto")) + .collect::>() + .join(" "); + cmake + .configure_arg(format!("-D{cmake_var}={filtered}")) + .env(var, filtered); + } + } + } + } let mut cmake = cmake::Config::new(CURRENT_DIR); + fix_build_env(&mut cmake); cmake.define("OPUS_INSTALL_PKG_CONFIG_MODULE", "OFF") .define("OPUS_INSTALL_CMAKE_CONFIG_MODULE", "OFF") //Defining these variables disable GNUInstallDirs so in addition to /lib