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:
65
vendor/audiopus_sys/opus/update_version
vendored
Executable file
65
vendor/audiopus_sys/opus/update_version
vendored
Executable file
@@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Creates and updates the package_version information used by configure.ac
|
||||
# (or other makefiles). When run inside a git repository it will use the
|
||||
# version information that can be queried from it unless AUTO_UPDATE is set
|
||||
# to 'no'. If no version is currently known it will be set to 'unknown'.
|
||||
#
|
||||
# If called with the argument 'release', the PACKAGE_VERSION will be updated
|
||||
# even if AUTO_UPDATE=no, but the value of AUTO_UPDATE shall be preserved.
|
||||
# This is used to force a version update whenever `make dist` is run.
|
||||
#
|
||||
# The exit status is 1 if package_version is not modified, else 0 is returned.
|
||||
#
|
||||
# This script should NOT be included in distributed tarballs, because if a
|
||||
# parent directory contains a git repository we do not want to accidentally
|
||||
# retrieve the version information from it instead. Tarballs should ship
|
||||
# with only the package_version file.
|
||||
#
|
||||
# Ron <ron@debian.org>, 2012.
|
||||
|
||||
SRCDIR=$(dirname $0)
|
||||
|
||||
if [ -e "$SRCDIR/package_version" ]; then
|
||||
. "$SRCDIR/package_version"
|
||||
fi
|
||||
|
||||
if [ "$AUTO_UPDATE" = no ]; then
|
||||
[ "$1" = release ] || exit 1
|
||||
else
|
||||
AUTO_UPDATE=yes
|
||||
fi
|
||||
|
||||
# We run `git status` before describe here to ensure that we don't get a false
|
||||
# -dirty from files that have been touched but are not actually altered in the
|
||||
# working dir.
|
||||
GIT_VERSION=$(cd "$SRCDIR" && git status > /dev/null 2>&1 \
|
||||
&& git describe --tags --match 'v*' --dirty 2> /dev/null)
|
||||
GIT_VERSION=${GIT_VERSION#v}
|
||||
|
||||
if [ -n "$GIT_VERSION" ]; then
|
||||
|
||||
[ "$GIT_VERSION" != "$PACKAGE_VERSION" ] || exit 1
|
||||
PACKAGE_VERSION="$GIT_VERSION"
|
||||
|
||||
elif [ -z "$PACKAGE_VERSION" ]; then
|
||||
# No current package_version and no git ...
|
||||
# We really shouldn't ever get here, because this script should only be
|
||||
# included in the git repository, and should usually be export-ignored.
|
||||
PACKAGE_VERSION="unknown"
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat > "$SRCDIR/package_version" <<-EOF
|
||||
# Automatically generated by update_version.
|
||||
# This file may be sourced into a shell script or makefile.
|
||||
|
||||
# Set this to 'no' if you do not wish the version information
|
||||
# to be checked and updated for every build. Most people will
|
||||
# never want to change this, it is an option for developers
|
||||
# making frequent changes that they know will not be released.
|
||||
AUTO_UPDATE=$AUTO_UPDATE
|
||||
|
||||
PACKAGE_VERSION="$PACKAGE_VERSION"
|
||||
EOF
|
||||
Reference in New Issue
Block a user