[FFmpeg-user] Configure error with Android NDK clang compiler

Marco Pracucci marco.pracucci at spreaker.com
Fri Jan 15 11:21:40 CET 2016


I successfully build and run in production ffmpeg on Android (arm and x86)
compiled with Android NDK's gcc. Recently, Android deprecated gcc and is
pushing every dev to migrate to clang.

I'm getting some issues while compiling ffmpeg with Android NDK's clang and
this is the first one I encounter:
*GNU assembler not found, install/update gas-preprocessor*

Despite the message, looks that error is more subtle, because it fails
while running "check_as" but if I run the same exact check command on the
terminal, *it works*.

Below you can find the full instructions to reproduce it (it fixes with
--disable-asm but with gcc I'm able to compile with asm support).

Versions:
- ffmpeg 2.8.4
- Compile on OSX 10.9.5

*Download Android NDK*
You can download the Android NDK from here:
​http://developer.android.com/ndk/downloads/index.html

*Install Android NDK*
Follow the installation instructions in the download and then set the
environment variable NDK_DIR to the directory where you extracted the NDK.

*Build NDK standalone toolchain*
Define an environment variable TOOLCHAIN_DIR with the full path of the
directory where the standalone toolchain should be installed. For example:
export TOOLCHAIN_DIR=/tmp/toolchain

Then build the toolchain:
${NDK_DIR}/build/tools/make-standalone-toolchain.sh \
--toolchain=arm-linux-androideabi-clang3.6 \
--platform=android-9 \
--install-dir=${TOOLCHAIN_DIR}

*Compile ffmpeg*
I use the following configure script:
./configure \
--enable-shared \
--disable-static \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-runtime-cpudetect \
--disable-all \
--disable-doc \
--enable-avcodec \
--enable-avformat \
--enable-avutil \
--enable-swresample \
--disable-w32threads \
--disable-os2threads \
--disable-network \
--disable-dxva2 \
--disable-vaapi \
--disable-vda \
--disable-vdpau \
--enable-protocol="file" \
--enable-decoder="aac" \
--enable-decoder="cook" \
--enable-decoder="flac" \
--enable-decoder="mp3" \
--enable-decoder="mp3adu" \
--enable-decoder="mp3adufloat" \
--enable-decoder="mp3float" \
--enable-decoder="mp3on4" \
--enable-decoder="mp3on4float" \
--enable-decoder="pcm_alaw" \
--enable-decoder="pcm_bluray" \
--enable-decoder="pcm_dvd" \
--enable-decoder="pcm_f32be" \
--enable-decoder="pcm_f32le" \
--enable-decoder="pcm_f64be" \
--enable-decoder="pcm_f64le" \
--enable-decoder="pcm_lxf" \
--enable-decoder="pcm_mulaw" \
--enable-decoder="pcm_s16be" \
--enable-decoder="pcm_s16be_planar" \
--enable-decoder="pcm_s16le" \
--enable-decoder="pcm_s16le_planar" \
--enable-decoder="pcm_s24be" \
--enable-decoder="pcm_s24daud" \
--enable-decoder="pcm_s24le" \
--enable-decoder="pcm_s24le_planar" \
--enable-decoder="pcm_s32be" \
--enable-decoder="pcm_s32le" \
--enable-decoder="pcm_s32le_planar" \
--enable-decoder="pcm_s8" \
--enable-decoder="pcm_s8_planar" \
--enable-decoder="pcm_u16be" \
--enable-decoder="pcm_u16le" \
--enable-decoder="pcm_u24be" \
--enable-decoder="pcm_u24le" \
--enable-decoder="pcm_u32be" \
--enable-decoder="pcm_u32le" \
--enable-decoder="pcm_u8" \
--enable-decoder="pcm_zork" \
--enable-decoder="ra_144" \
--enable-decoder="ra_288" \
--enable-decoder="ralf" \
--enable-decoder="vorbis" \
--enable-decoder="wmav1" \
--enable-decoder="wmav2" \
--enable-decoder="wmavoice" \
--enable-decoder="wmalossless" \
--enable-decoder="wmapro" \
--enable-parser="aac" \
--enable-parser="flac" \
--enable-parser="mpegaudio" \
--enable-parser="vorbis" \
--enable-demuxer="aac" \
--enable-demuxer="aiff" \
--enable-demuxer="asf" \
--enable-demuxer="flac" \
--enable-demuxer="ogg" \
--enable-demuxer="mp3" \
--enable-demuxer="mov" \
--enable-demuxer="pcm_alaw" \
--enable-demuxer="pcm_f32be" \
--enable-demuxer="pcm_f32le" \
--enable-demuxer="pcm_f64be" \
--enable-demuxer="pcm_f64le" \
--enable-demuxer="pcm_mulaw" \
--enable-demuxer="pcm_s16be" \
--enable-demuxer="pcm_s16le" \
--enable-demuxer="pcm_s24be" \
--enable-demuxer="pcm_s24le" \
--enable-demuxer="pcm_s32be" \
--enable-demuxer="pcm_s32le" \
--enable-demuxer="pcm_s8" \
--enable-demuxer="pcm_u16be" \
--enable-demuxer="pcm_u16le" \
--enable-demuxer="pcm_u24be" \
--enable-demuxer="pcm_u24le" \
--enable-demuxer="pcm_u32be" \
--enable-demuxer="pcm_u32le" \
--enable-demuxer="rm" \
--enable-demuxer="wav" \
--enable-cross-compile \
--toolchain=clang-usan \
--cross-prefix=${TOOLCHAIN_DIR}/bin/arm-linux-androideabi- \
--cc=${TOOLCHAIN_DIR}/bin/arm-linux-androideabi-clang \
--cxx=${TOOLCHAIN_DIR}/bin/arm-linux-androideabi-clang \
--sysroot=${TOOLCHAIN_DIR}/sysroot \
--target-os=android \
--extra-cflags="-I${TOOCHAIN_DIR}/sysroot/usr/include -ffast-math
-funroll-loops -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16" \
--extra-ldflags="-L${TOOCHAIN_DIR}/sysroot/usr/lib" \
--arch="arm" \
--logfile="/tmp/ffmpeg.log"

*The configure script fails with*:
GNU assembler not found, install/update gas-preprocessor

It fails while running check_as (extracted from the fail of ffmpeg.log):
check_as
BEGIN /var/folders/zn/45tzvzd15tnfvp4g5847x2dm0000gn/Tffconf.a7i3f9zc.S

1 .altmacro
END /var/folders/zn/45tzvzd15tnfvp4g5847x2dm0000gn/Tffconf.a7i3f9zc.S
/tmp/toolchain/bin/arm-linux-androideabi-clang
--sysroot=/tmp/toolchain/sysroot -isysroot /tmp/toolchain/sysroot
-D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-Dstrtod=avpriv_strtod -DPIC -I/sysroot/usr/include -ffast-math
-funroll-loops -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
-march=armv7-a -fPIC -c -o
/var/folders/zn/45tzvzd15tnfvp4g5847x2dm0000gn/Tffconf.Ct6YZsBn.o
/var/folders/zn/45tzvzd15tnfvp4g5847x2dm0000gn/Tffconf.a7i3f9zc.S
/var/folders/zn/45tzvzd15tnfvp4g5847x2dm0000gn/Tffconf.a7i3f9zc.S:1:1:
error: unknown directive
.altmacro
GNU assembler not found, install/update gas-preprocessor


The weird thing is that *if I create a file containing .altmacro and run
the same exact command it actually works*. For example:

$ echo ".altmacro" > test.as
$ /tmp/toolchain/bin/arm-linux-androideabi-clang
--sysroot=/tmp/toolchain/sysroot -isysroot /tmp/toolchain/sysroot
-D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-Dstrtod=avpriv_strtod -DPIC -I/sysroot/usr/include -ffast-math
-funroll-loops -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
-march=armv7-a -fPIC -c -o /tmp/test.o test.as
$ echo $?
0


After digging for an hour in the configure script I can't actually realize
why it fails. Do you have any hint?

Thank you,
Marco


More information about the ffmpeg-user mailing list