fix(windows): vendor audiopus_sys + patch libopus for clang-cl SIMD
cargo-xwin drives the Windows MSVC cross-compile via clang-cl, under which CMake sets MSVC=1 — causing libopus 1.3.1's `if(NOT MSVC)` guards to skip the per-file `-msse4.1` / `-mssse3` COMPILE_FLAGS that its x86 SIMD source files need. Clang-cl (unlike real cl.exe) still honors Clang's target-feature system, so those files then fail to compile with "always_inline function '_mm_cvtepi16_epi32' requires target feature 'sse4.1'" errors across silk/NSQ_sse4_1.c, NSQ_del_dec_sse4_1.c, and VQ_WMat_EC_sse4_1.c. Earlier attempts to fix this downstream (cargo-xwin toolchain file, override.cmake CMAKE_C_COMPILE_OBJECT <FLAGS> replace, CFLAGS env vars) all failed because cargo-xwin rewrites override.cmake from scratch on every `cargo xwin build` invocation and cmake-rs's -DCMAKE_C_FLAGS= assembly happens before toolchain FORCE sets propagate. Fixing it upstream at the source: vendor audiopus_sys 0.2.2 into vendor/audiopus_sys, patch its bundled opus/CMakeLists.txt to introduce an MSVC_CL var (true only when CMAKE_C_COMPILER_ID == "MSVC", i.e. real cl.exe), and flip the eight `if(NOT MSVC)` SIMD guards to `if(NOT MSVC_CL)`. Clang-cl then gets the GCC-style per-file flags and the SSE4.1 sources build cleanly. Also flip the `if(MSVC)` global /arch block at line 445 to `if(MSVC_CL)` so only cl.exe applies /arch:AVX and clang-cl relies purely on per-file flags (no global/per-file mixing). Wire via [patch.crates-io] in the workspace root Cargo.toml; the patch is resolved relative to the workspace root as `vendor/audiopus_sys`. Upstream context: xiph/opus#256, xiph/opus PR #257 (both stale). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
643
vendor/audiopus_sys/opus/CMakeLists.txt
vendored
Normal file
643
vendor/audiopus_sys/opus/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,643 @@
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||
|
||||
include(OpusPackageVersion)
|
||||
get_package_version(PACKAGE_VERSION PROJECT_VERSION)
|
||||
|
||||
project(Opus LANGUAGES C VERSION ${PROJECT_VERSION})
|
||||
|
||||
include(OpusFunctions)
|
||||
include(OpusBuildtype)
|
||||
include(OpusConfig)
|
||||
include(OpusSources)
|
||||
include(GNUInstallDirs)
|
||||
include(CMakeDependentOption)
|
||||
include(FeatureSummary)
|
||||
|
||||
set(OPUS_BUILD_SHARED_LIBRARY_HELP_STR "build shared library.")
|
||||
option(OPUS_BUILD_SHARED_LIBRARY ${OPUS_BUILD_SHARED_LIBRARY_HELP_STR} OFF)
|
||||
if(OPUS_BUILD_SHARED_LIBRARY OR BUILD_SHARED_LIBS OR OPUS_BUILD_FRAMEWORK)
|
||||
# Global flag to cause add_library() to create shared libraries if on.
|
||||
set(BUILD_SHARED_LIBS ON)
|
||||
set(OPUS_BUILD_SHARED_LIBRARY ON)
|
||||
endif()
|
||||
add_feature_info(OPUS_BUILD_SHARED_LIBRARY OPUS_BUILD_SHARED_LIBRARY ${OPUS_BUILD_SHARED_LIBRARY_HELP_STR})
|
||||
|
||||
set(OPUS_BUILD_TESTING_HELP_STR "build tests.")
|
||||
option(OPUS_BUILD_TESTING ${OPUS_BUILD_TESTING_HELP_STR} OFF)
|
||||
if(OPUS_BUILD_TESTING OR BUILD_TESTING)
|
||||
set(OPUS_BUILD_TESTING ON)
|
||||
set(BUILD_TESTING ON)
|
||||
endif()
|
||||
add_feature_info(OPUS_BUILD_TESTING OPUS_BUILD_TESTING ${OPUS_BUILD_TESTING_HELP_STR})
|
||||
|
||||
set(OPUS_CUSTOM_MODES_HELP_STR "enable non-Opus modes, e.g. 44.1 kHz & 2^n frames.")
|
||||
option(OPUS_CUSTOM_MODES ${OPUS_CUSTOM_MODES_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_CUSTOM_MODES OPUS_CUSTOM_MODES ${OPUS_CUSTOM_MODES_HELP_STR})
|
||||
|
||||
set(OPUS_BUILD_PROGRAMS_HELP_STR "build programs.")
|
||||
option(OPUS_BUILD_PROGRAMS ${OPUS_BUILD_PROGRAMS_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_BUILD_PROGRAMS OPUS_BUILD_PROGRAMS ${OPUS_BUILD_PROGRAMS_HELP_STR})
|
||||
|
||||
set(OPUS_DISABLE_INTRINSICS_HELP_STR "disable all intrinsics optimizations.")
|
||||
option(OPUS_DISABLE_INTRINSICS ${OPUS_DISABLE_INTRINSICS_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_DISABLE_INTRINSICS OPUS_DISABLE_INTRINSICS ${OPUS_DISABLE_INTRINSICS_HELP_STR})
|
||||
|
||||
set(OPUS_FIXED_POINT_HELP_STR "compile as fixed-point (for machines without a fast enough FPU).")
|
||||
option(OPUS_FIXED_POINT ${OPUS_FIXED_POINT_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_FIXED_POINT OPUS_FIXED_POINT ${OPUS_FIXED_POINT_HELP_STR})
|
||||
|
||||
set(OPUS_ENABLE_FLOAT_API_HELP_STR "compile with the floating point API (for machines with float library).")
|
||||
option(OPUS_ENABLE_FLOAT_API ${OPUS_ENABLE_FLOAT_API_HELP_STR} ON)
|
||||
add_feature_info(OPUS_ENABLE_FLOAT_API OPUS_ENABLE_FLOAT_API ${OPUS_ENABLE_FLOAT_API_HELP_STR})
|
||||
|
||||
set(OPUS_FLOAT_APPROX_HELP_STR "enable floating point approximations (Ensure your platform supports IEEE 754 before enabling).")
|
||||
option(OPUS_FLOAT_APPROX ${OPUS_FLOAT_APPROX_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_FLOAT_APPROX OPUS_FLOAT_APPROX ${OPUS_FLOAT_APPROX_HELP_STR})
|
||||
|
||||
set(OPUS_ASSERTIONS_HELP_STR "additional software error checking.")
|
||||
option(OPUS_ASSERTIONS ${OPUS_ASSERTIONS_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_ASSERTIONS OPUS_ASSERTIONS ${OPUS_ASSERTIONS_HELP_STR})
|
||||
|
||||
set(OPUS_HARDENING_HELP_STR "run-time checks that are cheap and safe for use in production.")
|
||||
option(OPUS_HARDENING ${OPUS_HARDENING_HELP_STR} ON)
|
||||
add_feature_info(OPUS_HARDENING OPUS_HARDENING ${OPUS_HARDENING_HELP_STR})
|
||||
|
||||
set(OPUS_FUZZING_HELP_STR "causes the encoder to make random decisions (do not use in production).")
|
||||
option(OPUS_FUZZING ${OPUS_FUZZING_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_FUZZING OPUS_FUZZING ${OPUS_FUZZING_HELP_STR})
|
||||
|
||||
set(OPUS_CHECK_ASM_HELP_STR "enable bit-exactness checks between optimized and c implementations.")
|
||||
option(OPUS_CHECK_ASM ${OPUS_CHECK_ASM_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_CHECK_ASM OPUS_CHECK_ASM ${OPUS_CHECK_ASM_HELP_STR})
|
||||
|
||||
set(OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR "install pkg-config module.")
|
||||
option(OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR} ON)
|
||||
add_feature_info(OPUS_INSTALL_PKG_CONFIG_MODULE OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR})
|
||||
|
||||
set(OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR "install CMake package config module.")
|
||||
option(OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR} ON)
|
||||
add_feature_info(OPUS_INSTALL_CMAKE_CONFIG_MODULE OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR})
|
||||
|
||||
if(APPLE)
|
||||
set(OPUS_BUILD_FRAMEWORK_HELP_STR "build Framework bundle for Apple systems.")
|
||||
option(OPUS_BUILD_FRAMEWORK ${OPUS_BUILD_FRAMEWORK_HELP_STR} OFF)
|
||||
add_feature_info(OPUS_BUILD_FRAMEWORK OPUS_BUILD_FRAMEWORK ${OPUS_BUILD_FRAMEWORK_HELP_STR})
|
||||
endif()
|
||||
|
||||
set(OPUS_FIXED_POINT_DEBUG_HELP_STR "debug fixed-point implementation.")
|
||||
cmake_dependent_option(OPUS_FIXED_POINT_DEBUG
|
||||
${OPUS_FIXED_POINT_DEBUG_HELP_STR}
|
||||
ON
|
||||
"OPUS_FIXED_POINT; OPUS_FIXED_POINT_DEBUG"
|
||||
OFF)
|
||||
add_feature_info(OPUS_FIXED_POINT_DEBUG OPUS_FIXED_POINT_DEBUG ${OPUS_FIXED_POINT_DEBUG_HELP_STR})
|
||||
|
||||
set(OPUS_VAR_ARRAYS_HELP_STR "use variable length arrays for stack arrays.")
|
||||
cmake_dependent_option(OPUS_VAR_ARRAYS
|
||||
${OPUS_VAR_ARRAYS_HELP_STR}
|
||||
ON
|
||||
"VLA_SUPPORTED; NOT OPUS_USE_ALLOCA; NOT OPUS_NONTHREADSAFE_PSEUDOSTACK"
|
||||
OFF)
|
||||
add_feature_info(OPUS_VAR_ARRAYS OPUS_VAR_ARRAYS ${OPUS_VAR_ARRAYS_HELP_STR})
|
||||
|
||||
set(OPUS_USE_ALLOCA_HELP_STR "use alloca for stack arrays (on non-C99 compilers).")
|
||||
cmake_dependent_option(OPUS_USE_ALLOCA
|
||||
${OPUS_USE_ALLOCA_HELP_STR}
|
||||
ON
|
||||
"USE_ALLOCA_SUPPORTED; NOT OPUS_VAR_ARRAYS; NOT OPUS_NONTHREADSAFE_PSEUDOSTACK"
|
||||
OFF)
|
||||
add_feature_info(OPUS_USE_ALLOCA OPUS_USE_ALLOCA ${OPUS_USE_ALLOCA_HELP_STR})
|
||||
|
||||
set(OPUS_NONTHREADSAFE_PSEUDOSTACK_HELP_STR "use a non threadsafe pseudostack when neither variable length arrays or alloca is supported.")
|
||||
cmake_dependent_option(OPUS_NONTHREADSAFE_PSEUDOSTACK
|
||||
${OPUS_NONTHREADSAFE_PSEUDOSTACK_HELP_STR}
|
||||
ON
|
||||
"NOT OPUS_VAR_ARRAYS; NOT OPUS_USE_ALLOCA"
|
||||
OFF)
|
||||
add_feature_info(OPUS_NONTHREADSAFE_PSEUDOSTACK OPUS_NONTHREADSAFE_PSEUDOSTACK ${OPUS_NONTHREADSAFE_PSEUDOSTACK_HELP_STR})
|
||||
|
||||
set(OPUS_FAST_MATH_HELP_STR "enable fast math (unsupported and discouraged use, as code is not well tested with this build option).")
|
||||
cmake_dependent_option(OPUS_FAST_MATH
|
||||
${OPUS_FAST_MATH_HELP_STR}
|
||||
ON
|
||||
"OPUS_FLOAT_APPROX; OPUS_FAST_MATH; FAST_MATH_SUPPORTED"
|
||||
OFF)
|
||||
add_feature_info(OPUS_FAST_MATH OPUS_FAST_MATH ${OPUS_FAST_MATH_HELP_STR})
|
||||
|
||||
set(OPUS_STACK_PROTECTOR_HELP_STR "use stack protection.")
|
||||
cmake_dependent_option(OPUS_STACK_PROTECTOR
|
||||
${OPUS_STACK_PROTECTOR_HELP_STR}
|
||||
ON
|
||||
"STACK_PROTECTOR_SUPPORTED"
|
||||
OFF)
|
||||
add_feature_info(OPUS_STACK_PROTECTOR OPUS_STACK_PROTECTOR ${OPUS_STACK_PROTECTOR_HELP_STR})
|
||||
|
||||
if(NOT MSVC)
|
||||
set(OPUS_FORTIFY_SOURCE_HELP_STR "add protection against buffer overflows.")
|
||||
cmake_dependent_option(OPUS_FORTIFY_SOURCE
|
||||
${OPUS_FORTIFY_SOURCE_HELP_STR}
|
||||
ON
|
||||
"FORTIFY_SOURCE_SUPPORTED"
|
||||
OFF)
|
||||
add_feature_info(OPUS_FORTIFY_SOURCE OPUS_FORTIFY_SOURCE ${OPUS_FORTIFY_SOURCE_HELP_STR})
|
||||
endif()
|
||||
|
||||
if(MINGW AND (OPUS_FORTIFY_SOURCE OR OPUS_STACK_PROTECTOR))
|
||||
# ssp lib is needed for security features for MINGW
|
||||
list(APPEND OPUS_REQUIRED_LIBRARIES ssp)
|
||||
endif()
|
||||
|
||||
if(OPUS_CPU_X86 OR OPUS_CPU_X64)
|
||||
set(OPUS_X86_MAY_HAVE_SSE_HELP_STR "does runtime check for SSE1 support.")
|
||||
cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE
|
||||
${OPUS_X86_MAY_HAVE_SSE_HELP_STR}
|
||||
ON
|
||||
"SSE1_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
add_feature_info(OPUS_X86_MAY_HAVE_SSE OPUS_X86_MAY_HAVE_SSE ${OPUS_X86_MAY_HAVE_SSE_HELP_STR})
|
||||
|
||||
set(OPUS_X86_MAY_HAVE_SSE2_HELP_STR "does runtime check for SSE2 support.")
|
||||
cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE2
|
||||
${OPUS_X86_MAY_HAVE_SSE2_HELP_STR}
|
||||
ON
|
||||
"SSE2_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
add_feature_info(OPUS_X86_MAY_HAVE_SSE2 OPUS_X86_MAY_HAVE_SSE2 ${OPUS_X86_MAY_HAVE_SSE2_HELP_STR})
|
||||
|
||||
set(OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR "does runtime check for SSE4.1 support.")
|
||||
cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE4_1
|
||||
${OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR}
|
||||
ON
|
||||
"SSE4_1_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
add_feature_info(OPUS_X86_MAY_HAVE_SSE4_1 OPUS_X86_MAY_HAVE_SSE4_1 ${OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR})
|
||||
|
||||
set(OPUS_X86_MAY_HAVE_AVX_HELP_STR "does runtime check for AVX support.")
|
||||
cmake_dependent_option(OPUS_X86_MAY_HAVE_AVX
|
||||
${OPUS_X86_MAY_HAVE_AVX_HELP_STR}
|
||||
ON
|
||||
"AVX_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
add_feature_info(OPUS_X86_MAY_HAVE_AVX OPUS_X86_MAY_HAVE_AVX ${OPUS_X86_MAY_HAVE_AVX_HELP_STR})
|
||||
|
||||
# PRESUME depends on MAY HAVE, but PRESUME will override runtime detection
|
||||
set(OPUS_X86_PRESUME_SSE_HELP_STR "assume target CPU has SSE1 support (override runtime check).")
|
||||
set(OPUS_X86_PRESUME_SSE2_HELP_STR "assume target CPU has SSE2 support (override runtime check).")
|
||||
if(OPUS_CPU_X64) # Assume x86_64 has up to SSE2 support
|
||||
cmake_dependent_option(OPUS_X86_PRESUME_SSE
|
||||
${OPUS_X86_PRESUME_SSE_HELP_STR}
|
||||
ON
|
||||
"OPUS_X86_MAY_HAVE_SSE; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
|
||||
cmake_dependent_option(OPUS_X86_PRESUME_SSE2
|
||||
${OPUS_X86_PRESUME_SSE2_HELP_STR}
|
||||
ON
|
||||
"OPUS_X86_MAY_HAVE_SSE2; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
else()
|
||||
cmake_dependent_option(OPUS_X86_PRESUME_SSE
|
||||
${OPUS_X86_PRESUME_SSE_HELP_STR}
|
||||
OFF
|
||||
"OPUS_X86_MAY_HAVE_SSE; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
|
||||
cmake_dependent_option(OPUS_X86_PRESUME_SSE2
|
||||
${OPUS_X86_PRESUME_SSE2_HELP_STR}
|
||||
OFF
|
||||
"OPUS_X86_MAY_HAVE_SSE2; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
endif()
|
||||
add_feature_info(OPUS_X86_PRESUME_SSE OPUS_X86_PRESUME_SSE ${OPUS_X86_PRESUME_SSE_HELP_STR})
|
||||
add_feature_info(OPUS_X86_PRESUME_SSE2 OPUS_X86_PRESUME_SSE2 ${OPUS_X86_PRESUME_SSE2_HELP_STR})
|
||||
|
||||
set(OPUS_X86_PRESUME_SSE4_1_HELP_STR "assume target CPU has SSE4.1 support (override runtime check).")
|
||||
cmake_dependent_option(OPUS_X86_PRESUME_SSE4_1
|
||||
${OPUS_X86_PRESUME_SSE4_1_HELP_STR}
|
||||
OFF
|
||||
"OPUS_X86_MAY_HAVE_SSE4_1; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
add_feature_info(OPUS_X86_PRESUME_SSE4_1 OPUS_X86_PRESUME_SSE4_1 ${OPUS_X86_PRESUME_SSE4_1_HELP_STR})
|
||||
|
||||
set(OPUS_X86_PRESUME_AVX_HELP_STR "assume target CPU has AVX support (override runtime check).")
|
||||
cmake_dependent_option(OPUS_X86_PRESUME_AVX
|
||||
${OPUS_X86_PRESUME_AVX_HELP_STR}
|
||||
OFF
|
||||
"OPUS_X86_MAY_HAVE_AVX; NOT OPUS_DISABLE_INTRINSICS"
|
||||
OFF)
|
||||
add_feature_info(OPUS_X86_PRESUME_AVX OPUS_X86_PRESUME_AVX ${OPUS_X86_PRESUME_AVX_HELP_STR})
|
||||
endif()
|
||||
|
||||
feature_summary(WHAT ALL)
|
||||
|
||||
set_package_properties(Git
|
||||
PROPERTIES
|
||||
TYPE
|
||||
REQUIRED
|
||||
DESCRIPTION
|
||||
"fast, scalable, distributed revision control system"
|
||||
URL
|
||||
"https://git-scm.com/"
|
||||
PURPOSE
|
||||
"required to set up package version")
|
||||
|
||||
set(Opus_PUBLIC_HEADER
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/opus.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/opus_defines.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/opus_multistream.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/opus_projection.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/opus_types.h)
|
||||
|
||||
if(OPUS_CUSTOM_MODES)
|
||||
list(APPEND Opus_PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_custom.h)
|
||||
endif()
|
||||
|
||||
add_library(opus ${opus_headers} ${opus_sources} ${opus_sources_float} ${Opus_PUBLIC_HEADER})
|
||||
add_library(Opus::opus ALIAS opus)
|
||||
|
||||
get_library_version(OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR)
|
||||
message(DEBUG "Opus library version: ${OPUS_LIBRARY_VERSION}")
|
||||
|
||||
set_target_properties(opus
|
||||
PROPERTIES SOVERSION
|
||||
${OPUS_LIBRARY_VERSION_MAJOR}
|
||||
VERSION
|
||||
${OPUS_LIBRARY_VERSION}
|
||||
PUBLIC_HEADER
|
||||
"${Opus_PUBLIC_HEADER}")
|
||||
|
||||
target_include_directories(
|
||||
opus
|
||||
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/opus>
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
celt
|
||||
silk)
|
||||
|
||||
target_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES})
|
||||
target_compile_definitions(opus PRIVATE OPUS_BUILD)
|
||||
|
||||
if(OPUS_FIXED_POINT_DEBUG)
|
||||
target_compile_definitions(opus PRIVATE FIXED_DEBUG)
|
||||
endif()
|
||||
|
||||
if(OPUS_FORTIFY_SOURCE AND NOT MSVC)
|
||||
target_compile_definitions(opus PRIVATE
|
||||
$<$<NOT:$<CONFIG:debug>>:_FORTIFY_SOURCE=2>)
|
||||
endif()
|
||||
|
||||
if(OPUS_FLOAT_APPROX)
|
||||
target_compile_definitions(opus PRIVATE FLOAT_APPROX)
|
||||
endif()
|
||||
|
||||
if(OPUS_ASSERTIONS)
|
||||
target_compile_definitions(opus PRIVATE ENABLE_ASSERTIONS)
|
||||
endif()
|
||||
|
||||
if(OPUS_HARDENING)
|
||||
target_compile_definitions(opus PRIVATE ENABLE_HARDENING)
|
||||
endif()
|
||||
|
||||
if(OPUS_FUZZING)
|
||||
target_compile_definitions(opus PRIVATE FUZZING)
|
||||
endif()
|
||||
|
||||
if(OPUS_CHECK_ASM)
|
||||
target_compile_definitions(opus PRIVATE OPUS_CHECK_ASM)
|
||||
endif()
|
||||
|
||||
if(OPUS_VAR_ARRAYS)
|
||||
target_compile_definitions(opus PRIVATE VAR_ARRAYS)
|
||||
elseif(OPUS_USE_ALLOCA)
|
||||
target_compile_definitions(opus PRIVATE USE_ALLOCA)
|
||||
elseif(OPUS_NONTHREADSAFE_PSEUDOSTACK)
|
||||
target_compile_definitions(opus PRIVATE NONTHREADSAFE_PSEUDOSTACK)
|
||||
else()
|
||||
message(ERROR "Need to set a define for stack allocation")
|
||||
endif()
|
||||
|
||||
if(OPUS_CUSTOM_MODES)
|
||||
target_compile_definitions(opus PRIVATE CUSTOM_MODES)
|
||||
endif()
|
||||
|
||||
if(OPUS_FAST_MATH)
|
||||
if(MSVC)
|
||||
target_compile_options(opus PRIVATE /fp:fast)
|
||||
else()
|
||||
target_compile_options(opus PRIVATE -ffast-math)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(OPUS_STACK_PROTECTOR)
|
||||
if(MSVC)
|
||||
target_compile_options(opus PRIVATE /GS)
|
||||
else()
|
||||
target_compile_options(opus PRIVATE -fstack-protector-strong)
|
||||
endif()
|
||||
elseif(STACK_PROTECTOR_DISABLED_SUPPORTED)
|
||||
target_compile_options(opus PRIVATE /GS-)
|
||||
endif()
|
||||
|
||||
if(BUILD_SHARED_LIBS)
|
||||
if(WIN32)
|
||||
target_compile_definitions(opus PRIVATE DLL_EXPORT)
|
||||
elseif(HIDDEN_VISIBILITY_SUPPORTED)
|
||||
set_target_properties(opus PROPERTIES C_VISIBILITY_PRESET hidden)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_sources_group(opus silk ${silk_headers} ${silk_sources})
|
||||
add_sources_group(opus celt ${celt_headers} ${celt_sources})
|
||||
|
||||
if(OPUS_FIXED_POINT)
|
||||
add_sources_group(opus silk ${silk_sources_fixed})
|
||||
target_include_directories(opus PRIVATE silk/fixed)
|
||||
target_compile_definitions(opus PRIVATE FIXED_POINT=1)
|
||||
else()
|
||||
add_sources_group(opus silk ${silk_sources_float})
|
||||
target_include_directories(opus PRIVATE silk/float)
|
||||
endif()
|
||||
|
||||
if(NOT OPUS_ENABLE_FLOAT_API)
|
||||
target_compile_definitions(opus PRIVATE DISABLE_FLOAT_API)
|
||||
endif()
|
||||
|
||||
# WZP: distinguish real cl.exe from clang-cl. libopus uses `if(NOT MSVC)`
|
||||
# to guard per-file `-msse4.1` / `-mssse3` / `-msse2` flags that GCC and
|
||||
# clang (GNU driver) accept. Under clang-cl (Clang running in MSVC driver
|
||||
# mode, as used by cargo-xwin cross-compiles), CMake sets MSVC=1 via
|
||||
# Platform/Windows-MSVC.cmake, so those guards become false and the
|
||||
# SIMD source files end up compiled WITHOUT the required target feature
|
||||
# — which then explodes in silk/x86/NSQ_sse4_1.c with
|
||||
# "always_inline function '_mm_cvtepi16_epi32' requires target feature
|
||||
# 'sse4.1'" errors. clang-cl, unlike real cl.exe, still honors Clang's
|
||||
# target-feature system, and accepts `-msse4.1` (LLVM 14+) to enable it.
|
||||
#
|
||||
# Split real cl.exe (which genuinely doesn't need per-feature gating
|
||||
# because its SIMD intrinsic headers are unconditionally available) from
|
||||
# clang-cl (which does need gating) using CMAKE_C_COMPILER_ID. Then the
|
||||
# `if(NOT MSVC)` guards below become `if(NOT MSVC_CL)` so clang-cl gets
|
||||
# the GCC-style per-file flags, and the `if(MSVC)` global /arch block at
|
||||
# the bottom becomes `if(MSVC_CL)` so only real cl.exe applies `/arch:AVX`
|
||||
# / `/arch:SSE2` globally (clang-cl relies on per-file `-msse` instead).
|
||||
#
|
||||
# Upstream tracking: xiph/opus#256, xiph/opus PR #257 (stale).
|
||||
set(MSVC_CL OFF)
|
||||
if(MSVC AND CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||
set(MSVC_CL ON)
|
||||
endif()
|
||||
|
||||
if(NOT OPUS_DISABLE_INTRINSICS)
|
||||
if((OPUS_X86_MAY_HAVE_SSE AND NOT OPUS_X86_PRESUME_SSE) OR
|
||||
(OPUS_X86_MAY_HAVE_SSE2 AND NOT OPUS_X86_PRESUME_SSE2) OR
|
||||
(OPUS_X86_MAY_HAVE_SSE4_1 AND NOT OPUS_X86_PRESUME_SSE4_1) OR
|
||||
(OPUS_X86_MAY_HAVE_AVX AND NOT OPUS_X86_PRESUME_AVX))
|
||||
target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD)
|
||||
endif()
|
||||
|
||||
if(SSE1_SUPPORTED)
|
||||
if(OPUS_X86_MAY_HAVE_SSE)
|
||||
add_sources_group(opus celt ${celt_sources_sse})
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE)
|
||||
if(NOT MSVC_CL)
|
||||
set_source_files_properties(${celt_sources_sse} PROPERTIES COMPILE_FLAGS -msse)
|
||||
endif()
|
||||
endif()
|
||||
if(OPUS_X86_PRESUME_SSE)
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE)
|
||||
if(NOT MSVC_CL)
|
||||
target_compile_options(opus PRIVATE -msse)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(SSE2_SUPPORTED)
|
||||
if(OPUS_X86_MAY_HAVE_SSE2)
|
||||
add_sources_group(opus celt ${celt_sources_sse2})
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE2)
|
||||
if(NOT MSVC_CL)
|
||||
set_source_files_properties(${celt_sources_sse2} PROPERTIES COMPILE_FLAGS -msse2)
|
||||
endif()
|
||||
endif()
|
||||
if(OPUS_X86_PRESUME_SSE2)
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE2)
|
||||
if(NOT MSVC_CL)
|
||||
target_compile_options(opus PRIVATE -msse2)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(SSE4_1_SUPPORTED)
|
||||
if(OPUS_X86_MAY_HAVE_SSE4_1)
|
||||
add_sources_group(opus celt ${celt_sources_sse4_1})
|
||||
add_sources_group(opus silk ${silk_sources_sse4_1})
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE4_1)
|
||||
if(NOT MSVC_CL)
|
||||
set_source_files_properties(${celt_sources_sse4_1} ${silk_sources_sse4_1} PROPERTIES COMPILE_FLAGS -msse4.1)
|
||||
endif()
|
||||
|
||||
if(OPUS_FIXED_POINT)
|
||||
add_sources_group(opus silk ${silk_sources_fixed_sse4_1})
|
||||
if(NOT MSVC_CL)
|
||||
set_source_files_properties(${silk_sources_fixed_sse4_1} PROPERTIES COMPILE_FLAGS -msse4.1)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
if(OPUS_X86_PRESUME_SSE4_1)
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE4_1)
|
||||
if(NOT MSVC_CL)
|
||||
target_compile_options(opus PRIVATE -msse4.1)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(AVX_SUPPORTED)
|
||||
# mostly placeholder in case of avx intrinsics is added
|
||||
if(OPUS_X86_MAY_HAVE_AVX)
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_AVX)
|
||||
endif()
|
||||
if(OPUS_X86_PRESUME_AVX)
|
||||
target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_AVX)
|
||||
if(NOT MSVC_CL)
|
||||
target_compile_options(opus PRIVATE -mavx)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MSVC_CL)
|
||||
if(AVX_SUPPORTED AND OPUS_X86_PRESUME_AVX) # on 64 bit and 32 bits
|
||||
add_definitions(/arch:AVX)
|
||||
elseif(OPUS_CPU_X86) # if AVX not supported then set SSE flag
|
||||
if((SSE4_1_SUPPORTED AND OPUS_X86_PRESUME_SSE4_1)
|
||||
OR (SSE2_SUPPORTED AND OPUS_X86_PRESUME_SSE2))
|
||||
target_compile_definitions(opus PRIVATE /arch:SSE2)
|
||||
elseif(SSE1_SUPPORTED AND OPUS_X86_PRESUME_SSE)
|
||||
target_compile_definitions(opus PRIVATE /arch:SSE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm|aarch64)")
|
||||
add_sources_group(opus celt ${celt_sources_arm})
|
||||
endif()
|
||||
|
||||
if(COMPILER_SUPPORT_NEON)
|
||||
if(OPUS_MAY_HAVE_NEON)
|
||||
if(RUNTIME_CPU_CAPABILITY_DETECTION)
|
||||
message(STATUS "OPUS_MAY_HAVE_NEON enabling runtime detection")
|
||||
target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD)
|
||||
else()
|
||||
message(ERROR "Runtime cpu capability detection needed for MAY_HAVE_NEON")
|
||||
endif()
|
||||
# Do runtime check for NEON
|
||||
target_compile_definitions(opus
|
||||
PRIVATE
|
||||
OPUS_ARM_MAY_HAVE_NEON
|
||||
OPUS_ARM_MAY_HAVE_NEON_INTR)
|
||||
endif()
|
||||
|
||||
add_sources_group(opus celt ${celt_sources_arm_neon_intr})
|
||||
add_sources_group(opus silk ${silk_sources_arm_neon_intr})
|
||||
|
||||
# silk arm neon depends on main_Fix.h
|
||||
target_include_directories(opus PRIVATE silk/fixed)
|
||||
|
||||
if(OPUS_FIXED_POINT)
|
||||
add_sources_group(opus silk ${silk_sources_fixed_arm_neon_intr})
|
||||
endif()
|
||||
|
||||
if(OPUS_PRESUME_NEON)
|
||||
target_compile_definitions(opus
|
||||
PRIVATE
|
||||
OPUS_ARM_PRESUME_NEON
|
||||
OPUS_ARM_PRESUME_NEON_INTR)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
target_compile_definitions(opus
|
||||
PRIVATE
|
||||
$<$<BOOL:${HAVE_LRINT}>:HAVE_LRINT>
|
||||
$<$<BOOL:${HAVE_LRINTF}>:HAVE_LRINTF>)
|
||||
|
||||
if(OPUS_BUILD_FRAMEWORK)
|
||||
set_target_properties(opus PROPERTIES
|
||||
FRAMEWORK TRUE
|
||||
FRAMEWORK_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_FRAMEWORK_IDENTIFIER org.xiph.opus
|
||||
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PROJECT_VERSION}
|
||||
MACOSX_FRAMEWORK_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
|
||||
OUTPUT_NAME Opus)
|
||||
endif()
|
||||
|
||||
install(TARGETS opus
|
||||
EXPORT OpusTargets
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus)
|
||||
|
||||
if(OPUS_INSTALL_PKG_CONFIG_MODULE)
|
||||
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||||
set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
|
||||
set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
|
||||
set(VERSION ${PACKAGE_VERSION})
|
||||
if(HAVE_LIBM)
|
||||
set(LIBM "-lm")
|
||||
endif()
|
||||
configure_file(opus.pc.in opus.pc)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||
endif()
|
||||
|
||||
if(OPUS_INSTALL_CMAKE_CONFIG_MODULE)
|
||||
set(CPACK_GENERATOR TGZ)
|
||||
include(CPack)
|
||||
set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
||||
install(EXPORT OpusTargets
|
||||
NAMESPACE Opus::
|
||||
DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/OpusConfig.cmake.in
|
||||
OpusConfig.cmake
|
||||
INSTALL_DESTINATION
|
||||
${CMAKE_INSTALL_PACKAGEDIR}
|
||||
PATH_VARS
|
||||
INCLUDE_INSTALL_DIR
|
||||
INSTALL_PREFIX
|
||||
${CMAKE_INSTALL_PREFIX})
|
||||
write_basic_package_version_file(OpusConfigVersion.cmake
|
||||
VERSION ${PROJECT_VERSION}
|
||||
COMPATIBILITY SameMajorVersion)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
|
||||
endif()
|
||||
|
||||
if(OPUS_BUILD_PROGRAMS)
|
||||
# demo
|
||||
if(OPUS_CUSTOM_MODES)
|
||||
add_executable(opus_custom_demo ${opus_custom_demo_sources})
|
||||
target_include_directories(opus_custom_demo
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||
target_link_libraries(opus_custom_demo PRIVATE opus)
|
||||
endif()
|
||||
|
||||
add_executable(opus_demo ${opus_demo_sources})
|
||||
target_include_directories(opus_demo PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||
target_include_directories(opus_demo PRIVATE silk) # debug.h
|
||||
target_include_directories(opus_demo PRIVATE celt) # arch.h
|
||||
target_link_libraries(opus_demo PRIVATE opus ${OPUS_REQUIRED_LIBRARIES})
|
||||
|
||||
# compare
|
||||
add_executable(opus_compare ${opus_compare_sources})
|
||||
target_include_directories(opus_compare PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||
target_link_libraries(opus_compare PRIVATE opus ${OPUS_REQUIRED_LIBRARIES})
|
||||
endif()
|
||||
|
||||
if(BUILD_TESTING)
|
||||
enable_testing()
|
||||
|
||||
# tests
|
||||
add_executable(test_opus_decode ${test_opus_decode_sources})
|
||||
target_include_directories(test_opus_decode
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||
target_link_libraries(test_opus_decode PRIVATE opus)
|
||||
if(OPUS_FIXED_POINT)
|
||||
target_compile_definitions(test_opus_decode PRIVATE DISABLE_FLOAT_API)
|
||||
endif()
|
||||
add_test(NAME test_opus_decode COMMAND $<TARGET_FILE:test_opus_decode> WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
||||
add_executable(test_opus_padding ${test_opus_padding_sources})
|
||||
target_include_directories(test_opus_padding
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||
target_link_libraries(test_opus_padding PRIVATE opus)
|
||||
add_test(NAME test_opus_padding COMMAND $<TARGET_FILE:test_opus_padding> WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
||||
if(NOT BUILD_SHARED_LIBS)
|
||||
# disable tests that depends on private API when building shared lib
|
||||
add_executable(test_opus_api ${test_opus_api_sources})
|
||||
target_include_directories(test_opus_api
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt)
|
||||
target_link_libraries(test_opus_api PRIVATE opus)
|
||||
if(OPUS_FIXED_POINT)
|
||||
target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API)
|
||||
endif()
|
||||
add_test(NAME test_opus_api COMMAND $<TARGET_FILE:test_opus_api> WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
||||
add_executable(test_opus_encode ${test_opus_encode_sources})
|
||||
target_include_directories(test_opus_encode
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt)
|
||||
target_link_libraries(test_opus_encode PRIVATE opus)
|
||||
add_test(NAME test_opus_encode COMMAND $<TARGET_FILE:test_opus_encode> WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
endif()
|
||||
endif()
|
||||
Reference in New Issue
Block a user