Opened 23 months ago
Closed 22 months ago
#11156 closed defect (fixed)
libavdevice fails to compile on Linux (musl libc)
| Reported by: | 2246c68 | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | avdevice |
| Version: | git-master | Keywords: | |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | no | |
| Analyzed by developer: | no |
Description
Summary of the bug:
libavdevice fails to build on Linux (musl libc).
How to reproduce:
% ../configure \
--cross-prefix="aarch64-unknown-linux-musl-" \
--target-os="linux" \
--arch="aarch64" \
--disable-alsa \
--disable-appkit \
--disable-asm \
--disable-audiotoolbox \
--disable-avfoundation \
--disable-bzlib \
--disable-coreimage \
--disable-debug \
--disable-doc \
--disable-iconv \
--disable-libxcb \
--disable-lzma \
--disable-neon \
--disable-schannel \
--disable-sdl2 \
--disable-securetransport \
--disable-static \
--disable-symver \
--disable-videotoolbox \
--disable-vulkan \
--disable-xlib \
--disable-zlib \
--disable-manpages \
--disable-htmlpages \
--disable-podpages \
--disable-txtpages \
--enable-pic \
--enable-shared \
--enable-small \
--enable-version3
% make
src/libavdevice/v4l2.c: In function 'device_open':
src/libavdevice/v4l2.c:137:17: error: assignment to 'int (*)(int, long unsigned int, ...)' from incompatible pointer type 'int (*)(int, int, ...)' [-Wincompatible-pointer-types]
137 | s->ioctl_f = prefix ## ioctl; \
| ^
src/libavdevice/v4l2.c:151:9: note: in expansion of macro 'SET_WRAPPERS'
151 | SET_WRAPPERS();
| ^~~~~~~~~~~~
git bisect points to 9e674b31606c805dd31b4bb754364a72a5877238 as the culprit.
There is one main issue with the changes implemented in that commit, specifically the use of the __musl__ macro to write musl-specific code:
... #if defined(__sun) || defined(__BIONIC__) || defined(__musl__) /* POSIX-like */ ...
It should be noted that musl does not currently provide any way to detect itself (see https://wiki.musl-libc.org/faq). That is, neither the __musl__ nor __MUSL__ macros exists. The #if defined(__musl__) condition will always evaluate to false, even on musl platforms, leading FFmpeg to use the wrong prototype.



Fixed in 00b64fca55a3a009c9d0e391c85f4fd3291e5d12.