Intel cross-compile for Synology NAS on Ubuntu Desktop 12.04 64bit (VirtualBox VM running on a Macbook Air):
#-----set up Synology toolchain cd ~/Downloads PART1="http://sourceforge.net/projects/dsgpl/files/DSM%204.0%20Tool%20Chains/" PART2="Intel%20x86%20Linux%202.6.32%20%28Pineview%29/gcc420_glibc236_x64-GPL.tgz" wget "${PART1}${PART2}" tar xvzf gcc420_glibc236_x64-GPL.tgz sudo mv x86_64-linux-gnu /usr/local export PATH="/usr/local/x86_64-linux-gnu/bin:${PATH}" #-----libz static lib wget http://zlib.net/zlib-1.2.7.tar.gz tar xvzf zlib-1.2.7.tar.gz cd zlib-1.2.7 ./configure --prefix=/usr/local/x86_64-linux-gnu --static make libz.a cp libz.a /usr/local/x86_64-linux-gnu/lib cp *.h /usr/local/x86_64-linux-gnu/include/ cd .. #-----libbz2 static lib #-----seem to need 32bit libraries to build bzip2 #-----http://maketecheasier.com/run-32-bit-apps-in-64-bit-linux/2009/08/10 sudo apt-get install ia32-libs wget http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz tar xvfz bzip2-1.0.6.tar.gz cd bzip2-1.0.6 sed -i 's/^CC=gcc/CC=x86_64-linux-gnu-gcc/g' Makefile sed -i 's/^AR=ar rc/AR=x86_64-linux-gnu-ar rc/g' Makefile sed -i 's/^RANLIB=ranlib/RANLIB=x86_64-linux-gnu-ranlib/g' Makefile make make install PREFIX=/usr/local/x86_64-linux-gnu cd .. #-----libmp3lame static lib sudo apt-get install nasm wget http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz tar xvzf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --prefix=/usr/local/x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --build=x86_64-linux-gnu --enable-static --disable-shared --disable-decoder --enable-nasm make make install cd.. #-----libssl & libcrypto static libs wget http://www.openssl.org/source/openssl-0.9.8v.tar.gz tar xvzf openssl-0.9.8v.tar.gz cd openssl-0.9.8v ./config --prefix=/usr/local/x86_64-linux-gnu no-shared sed -i 's/^CC= gcc/CC= x86_64-linux-gnu-gcc/g' Makefile sed -i 's/^AR= ar /AR= x86_64-linux-gnu-ar /g' Makefile sed -i 's/^ARD=ar /ARD=x86_64-linux-gnu-ar /g' Makefile sed -i 's/^RANLIB= \/usr\/bin\/ranlib/RANLIB=x86_64-linux-gnu-ranlib/g' Makefile sed -i 's/^MAKEDEPPROG= gcc/MAKEDEPPROG= x86_64-linux-gnu-gcc /g' Makefile make make install cd .. #-----librtmp 2.4 static lib wget http://download.serviio.org/opensource/rtmpdump-c58cfb3e9208c6e6bc1aa18f1b1d650d799084e5.tar.gz tar xvfz rtmpdump-c58cfb3e9208c6e6bc1aa18f1b1d650d799084e5.tar.gz cd rtmpdump #-----move all static libs to a separate folder to force compiler to use them #-----http://www.gossamer-threads.com/lists/apache/dev/265052 mkdir /tmp/lib cp /usr/local/x86_64-linux-gnu/lib/*.a /tmp/lib #-----fix Makefile (won't compile without libdl linked) #-----http://forum.luahub.com/index.php?topic=2390.0 sed -i.bak -e '/^LIB_OPENSSL\=/s/lcrypto/lcrypto \-ldl/' Makefile make CROSS_COMPILE=x86_64-linux-gnu- SYS=posix prefix=/usr/local/x86_64-linux-gnu INC=-I/usr/local/x86_64-linux-gnu XLDFLAGS=-L/tmp/lib SHARED= make install prefix=/usr/local/x86_64-linux-gnu SHARED= cd .. #-----gather all static libs again ready for FFmpeg compile cp /usr/local/x86_64-linux-gnu/lib/*.a /tmp/lib #-----remove unsupported URL line from pkgconfig/librtmp.pc #-----pkg-config --exists --print-errors librtmp sed -i -e '/^URL/d' /usr/local/x86_64-linux-gnu/lib/pkgconfig/librtmp.pc export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/local/x86_64-linux-gnu/lib/pkgconfig" #-----FFmpeg 0.11.1 wget http://download.serviio.org/opensource/ffmpeg-N-41860-g6fd0b55.tar.gz tar xvzf ffmpeg-N-41860-g6fd0b55.tar.gz cd ffmpeg echo N-41860-g6fd0b55 > RELEASE #-----Intel CPU-specific options #-----pkg-config needs to be defined because with cross-prefix it assumes x86_64-linux-gnu-pkg-config which doesn't exist, and then librtmp won't be detected sudo apt-get install yasm ./configure --arch=x86_64 --enable-ssse3 --cross-prefix=x86_64-linux-gnu- --target-os=linux --prefix=/usr/local/x86_64-linux-gnu --extra-cflags='-I/usr/local/x86_64-linux-gnu/include' --extra-ldflags='-L/tmp/lib' --enable-static --disable-shared --disable-ffplay --disable-ffserver --enable-pthreads --enable-libmp3lame --enable-librtmp --pkg-config=pkg-config --extra-version=Serviio make ./ffmpeg
ARM cross-compile for Synology NAS on Ubuntu Desktop 12.04 64bit (VirtualBox VM running on a Macbook Air):
#-----set up Synology toolchain cd ~/Downloads PART1="http://sourceforge.net/projects/dsgpl/files/DSM%204.1%20Tool%20Chains/" PART2="Marvell%2088F628x%20Linux%202.6.32/gcc421_glibc25_88f6281-GPL.tgz" wget "${PART1}${PART2}" tar xvzf gcc421_glibc25_88f6281-GPL.tgz sudo mv arm-none-linux-gnueabi /usr/local export PATH=/usr/local/arm-none-linux-gnueabi/bin:$PATH export AR=arm-none-linux-gnueabi-ar export CC=arm-none-linux-gnueabi-gcc export CXX=arm-none-linux-gnueabi-g++ export LD=arm-none-linux-gnueabi-ld export RANLIB=arm-none-linux-gnueabi-ranlib export CFLAGS="-I/usr/local/arm-none-linux-gnueabi/include" export LDFLAGS="-L/usr/local/arm-none-linux-gnueabi/lib" #-----libz static lib wget http://zlib.net/zlib-1.2.7.tar.gz tar xvzf zlib-1.2.7.tar.gz cd zlib-1.2.7 ./configure --prefix=/usr/local/arm-none-linux-gnueabi --static make libz.a cp libz.a /usr/local/arm-none-linux-gnueabi/lib cp *.h /usr/local/arm-none-linux-gnueabi/include/ cd .. #-----libbz2 static lib wget http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz tar xvfz bzip2-1.0.6.tar.gz cd bzip2-1.0.6 sed -i 's/^CC=gcc/CC=arm-none-linux-gnueabi-gcc/g' Makefile sed -i 's/^AR=ar/AR=arm-none-linux-gnueabi-ar/g' Makefile sed -i 's/^RANLIB=ranlib/RANLIB=arm-none-linux-gnueabi-ranlib/g' Makefile #remove the tests - we can't run the native binaries sed -i 's/^\(all: libbz2\.a bzip2 bzip2recover\) test/\1/' Makefile make make install PREFIX=/usr/local/arm-none-linux-gnueabi cd .. #-----libmp3lame static lib wget http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz tar xvzf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --prefix=/usr/local/arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --build=x86_64-linux-gnu --enable-static --disable-shared --disable-decoder make make install cd .. #-----libssl & libcrypto static libs wget http://www.openssl.org/source/openssl-0.9.8v.tar.gz tar xvzf openssl-0.9.8v.tar.gz cd openssl-0.9.8v #Some kind of strange issue where cross compilation parameters are ignored #unless this fix is used http://marc.waeckerlin.org/computer/blog/openssl_fuer_windows_mingw_unter_linux_crosscomilieren sed -i 's/\(die \"target already defined - \$target (offending arg\)/#\1/' Configure ./config --prefix=/usr/local/arm-none-linux-gnueabi no-shared linux-generic32 make make install cd .. #-----librtmp 2.4 static lib wget http://download.serviio.org/opensource/rtmpdump-c58cfb3e9208c6e6bc1aa18f1b1d650d799084e5.tar.gz tar xvfz rtmpdump-c58cfb3e9208c6e6bc1aa18f1b1d650d799084e5.tar.gz cd rtmpdump #-----move all static libs to a separate folder to force compiler to use them #-----http://www.gossamer-threads.com/lists/apache/dev/265052 mkdir /tmp/lib cp /usr/local/arm-none-linux-gnueabi/lib/*.a /tmp/lib #-----fix Makefile (won't compile without libdl linked) #-----http://forum.luahub.com/index.php?topic=2390.0 sed -i.bak -e '/^LIB_OPENSSL\=/s/lcrypto/lcrypto \-ldl/' Makefile make CROSS_COMPILE=arm-none-linux-gnueabi- SYS=posix prefix=/usr/local/arm-none-linux-gnueabi INC=-I/usr/local/arm-none-linux-gnueabi XLDFLAGS=-L/tmp/lib SHARED= make install prefix=/usr/local/arm-none-linux-gnueabi SHARED= cd .. #-----gather all static libs again ready for FFmpeg compile cp /usr/local/arm-none-linux-gnueabi/lib/*.a /tmp/lib #-----remove unsupported URL line from pkgconfig/librtmp.pc #-----pkg-config --exists --print-errors librtmp sed -i -e '/^URL/d' /usr/local/arm-none-linux-gnueabi/lib/pkgconfig/librtmp.pc export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/local/arm-none-linux-gnueabi/lib/pkgconfig" #-----FFmpeg wget http://download.serviio.org/opensource/ffmpeg-N-42368-gbf53863.tar.gz tar xvzf ffmpeg-N-42368-gbf53863.tar.gz cd ffmpeg #-----fixed point maths modification for mpeg audio encoder sed -i "s/^#define USE_FLOATS//" libavcodec/mpegaudioenc.c #-----Marvell Kirkwood mv6282 CPU is based on the ARMv5TE core which has DSP and thumb instruction support #-----http://www.arm.com/products/processors/technologies/dsp-simd.php #-----http://www.marvell.com/embedded-processors/kirkwood/assets/88f6282-3_pb.pdf #-----ARMv5TE CPU-specific options (based on inspecting 'configure' source https://github.com/FFmpeg/FFmpeg/blob/master/configure) #-----pkg-config needs to be defined because with cross-prefix it assumes arm-none-linux-gnueabi-pkg-config which doesn't exist, and then librtmp won't be detected #-----zmbv encoder refuses to cross compile here so it's disabled ./configure --arch=arm --cpu=armv5te --cross-prefix=arm-none-linux-gnueabi- --target-os=linux --prefix=/usr/local/arm-none-linux-gnueabi --extra-cflags='-I/usr/local/arm-none-linux-gnueabi/include' --extra-ldflags='-L/tmp/lib' --enable-static --disable-shared --disable-ffplay --disable-ffserver --enable-pthreads --enable-libmp3lame --enable-librtmp --disable-encoder=zmbv --pkg-config=pkg-config --extra-version=Serviio make ./ffmpeg
Freescale QorIQ P1022 PowerPC cross-compile for Synology NAS on Ubuntu Desktop 12.04 64bit (VirtualBox VM running on a Macbook Air):
#-----set up Synology toolchain cd ~/Downloads PART1="http://sourceforge.net/projects/dsgpl/files/DSM%204.1%20Tool%20Chains/" PART2="PowerPC%20QorIQ%20Linux%202.6.32/gcc4374_eglibc2874_qoriq-GPL.tgz" wget "${PART1}${PART2}" tar xvzf gcc4374_eglibc2874_qoriq-GPL.tgz sudo mv powerpc-none-linux-gnuspe /usr/local export PATH=/usr/local/powerpc-none-linux-gnuspe/bin:$PATH export AR=powerpc-none-linux-gnuspe-ar export CC=powerpc-none-linux-gnuspe-gcc export CXX=powerpc-none-linux-gnuspe-g++ export LD=powerpc-none-linux-gnuspe-ld export RANLIB=powerpc-none-linux-gnuspe-ranlib export CFLAGS="-I/usr/local/powerpc-none-linux-gnuspe/include" export LDFLAGS="-L/usr/local/powerpc-none-linux-gnuspe/lib" #-----libz static lib wget http://zlib.net/zlib-1.2.7.tar.gz tar xvzf zlib-1.2.7.tar.gz cd zlib-1.2.7 ./configure --prefix=/usr/local/powerpc-none-linux-gnuspe --static make libz.a cp libz.a /usr/local/powerpc-none-linux-gnuspe/lib cp *.h /usr/local/powerpc-none-linux-gnuspe/include/ cd .. #-----libbz2 static lib wget http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz tar xvfz bzip2-1.0.6.tar.gz cd bzip2-1.0.6 sed -i 's/^CC=gcc/CC=powerpc-none-linux-gnuspe-gcc/g' Makefile sed -i 's/^AR=ar/AR=powerpc-none-linux-gnuspe-ar/g' Makefile sed -i 's/^RANLIB=ranlib/RANLIB=powerpc-none-linux-gnuspe-ranlib/g' Makefile #remove the tests - we can't run the native binaries sed -i 's/^\(all: libbz2\.a bzip2 bzip2recover\) test/\1/' Makefile make make install PREFIX=/usr/local/powerpc-none-linux-gnuspe cd .. #-----libmp3lame static lib wget http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz tar xvzf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --prefix=/usr/local/powerpc-none-linux-gnuspe --host=powerpc-none-linux-gnuspe --build=x86_64-linux-gnu --enable-static --disable-shared --disable-decoder make make install cd.. #-----libssl & libcrypto static libs wget http://www.openssl.org/source/openssl-0.9.8v.tar.gz tar xvzf openssl-0.9.8v.tar.gz cd openssl-0.9.8v #Some kind of strange issue where cross compilation parameters are ignored #unless this fix is used http://marc.waeckerlin.org/computer/blog/openssl_fuer_windows_mingw_unter_linux_crosscomilieren sed -i 's/\(die \"target already defined - \$target (offending arg\)/#\1/' Configure ./config --prefix=/usr/local/powerpc-none-linux-gnuspe no-shared linux-ppc make make install cd .. #-----librtmp 2.4 static lib wget http://download.serviio.org/opensource/rtmpdump-c58cfb3e9208c6e6bc1aa18f1b1d650d799084e5.tar.gz tar xvfz rtmpdump-c58cfb3e9208c6e6bc1aa18f1b1d650d799084e5.tar.gz cd rtmpdump #-----move all static libs to a separate folder to force compiler to use them #-----http://www.gossamer-threads.com/lists/apache/dev/265052 mkdir /tmp/lib cp /usr/local/powerpc-none-linux-gnuspe/lib/*.a /tmp/lib #-----fix Makefile (won't compile without libdl linked) #-----http://forum.luahub.com/index.php?topic=2390.0 sed -i.bak -e '/^LIB_OPENSSL\=/s/lcrypto/lcrypto \-ldl/' Makefile make CROSS_COMPILE=powerpc-none-linux-gnuspe- SYS=posix prefix=/usr/local/powerpc-none-linux-gnuspe INC=-I/usr/local/powerpc-none-linux-gnuspe XLDFLAGS=-L/tmp/lib SHARED= make install prefix=/usr/local/powerpc-none-linux-gnuspe SHARED= cd .. #-----gather all static libs again ready for FFmpeg compile cp /usr/local/powerpc-none-linux-gnuspe/lib/*.a /tmp/lib #-----remove unsupported URL line from pkgconfig/librtmp.pc #-----pkg-config --exists --print-errors librtmp sed -i -e '/^URL/d' /usr/local/powerpc-none-linux-gnuspe/lib/pkgconfig/librtmp.pc export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/local/powerpc-none-linux-gnuspe/lib/pkgconfig" #-----FFmpeg wget http://download.serviio.org/opensource/ffmpeg-N-42368-gbf53863.tar.gz tar xvzf ffmpeg-N-42368-gbf53863.tar.gz cd ffmpeg #-----QorIQ P1022 CPU is based on the PowerPC e500v2 core which has Signal Processing Engine which is not a classic FPU design #-----some QorIQ models have e500mc cores with true FPUs but these are not used in 2013 series Synology NAS #-----http://en.wikipedia.org/wiki/QorIQ #-----http://cache.freescale.com/files/32bit/doc/fact_sheet/QP1022FS.pdf?fpsp=1 #-----PowerPC e500v2 CPU-specific options (based on inspecting source https://github.com/FFmpeg/FFmpeg/blob/master/configure) #-----pkg-config needs to be defined because with cross-prefix it assumes powerpc-none-linux-gnuspe-pkg-config which doesn't exist, and then librtmp won't be detected ./configure --arch=ppc --cpu=e500v2 --cross-prefix=powerpc-none-linux-gnuspe- --target-os=linux --prefix=/usr/local/powerpc-none-linux-gnuspe --extra-cflags='-I/usr/local/powerpc-none-linux-gnuspe/include' --extra-ldflags='-L/tmp/lib' --enable-static --disable-shared --disable-ffplay --disable-ffserver --enable-pthreads --enable-libmp3lame --enable-librtmp --pkg-config=pkg-config --extra-version=Serviio make ./ffmpeg
Hi man,
Could you make your binaries availeble for download please? Much appriciated!
Regards,
Bastiaan
They are implemented in the serviio packages ;)
There is a new version of lame out
wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.3.tar.gz
and change the version numbers in the lines below.
and a new open ssl version
wget http://www.openssl.org/source/openssl-0.9.8s.tar.gz
and ffmpeg
wget http://ffmpeg.org/releases/ffmpeg-0.9.1.tar.gz
Thanks again for this guide. =)
Eric
No worries. I specifically kept OpenSSL at that particular version to match the one that ships with Synology DSM (in case there was a particular reason). For Serviio, I need to follow the prescribed versions of FFmpeg and certain libraries because the developers have a nasty habit of changing command syntax which then breaks the application depending on it.
Hi I followed your tutorial and tried to also crosscompile ffmpeg like above for my synology 712+.
I installed unbuntu 10.04 in virtualbox and so on.
compiled every libary needed. but when i wanted to compile ffmpeg i get the following error
“librtmp not found”
why do i get this?
i have a
librtmpdump executable in /usr/local/x86_64-linux-gnu/bin
“librtmp.a” in /tmp/lib
header files in /usr/local/x86_64-linux-gnu/include/librtmp
librtmp.pc in in /usr/local/x86_64-linux-gnu/lib/pkgconfig
what could be the problem?
what see in my config.log
check_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
ERROR: librtmp not found
if i leave out librtmp ffmpeg is successfully compiled.
thx in advance for any hints.
hmm found my problem pkg-config wasn’t installed doh’
I have another problem. I wanted to crosscompile also x264 into ffmpeg. but failed :(
can you maybe also give there some help?
tried to compile with
./configure –prefix=/usr/local/x86_64-linux-gnu –host=x86_64-linux-gnu –enable-static –enable-shared –bindir=/usr/local/x86_64-linux-gnu/bin –libdir=/usr/local/x86_64-linux-gnu/lib –includedir=/usr/local/x86_64-linux-gnu/include
That’s not something I have tried yet I’m afraid. If it’s anything like the other libs I’m sure there will be a few gotchas. I have found that you can usually find clues by selectively Googling bits of the error message (sometimes the whole error doesn’t get you much). I find it useful to keep a note of the solution URL, since it’s likely you’ll run into the same issue later on when you want to compile a newer version of FFmpeg.
THANKS A LOT!!!! :)
I have got the same error but pkg-config is installed and updated
all the files are there
./configure: 2761: x86_64-linux-gnu-nm: not found
ERROR: librtmp not found
there is a “nm” file in /usr/bin
config.log:
a lot of “no such file or directory” eg “/tmp/ffconf.pnLpLjVR.c:1:42: fatal error: libcrystalhd/libcrystalhd_if.h: No such file or directory
compilation terminated.”
and on the last lines:
/usr/local/x86_64-linux-gnu/lib/libdl.so: undefined reference to `_dl_open@GLIBC_PRIVATE’
/usr/local/x86_64-linux-gnu/lib/libdl.so: undefined reference to `_dl_close@GLIBC_PRIVATE’
collect2: ld returned 1 exit status
ERROR: librtmp not found
I think there is just another package missing but I can’t figure out, which one.
the arm compilation works fine for me =)
thanks, Eric
Hi Eric, maybe you need to create a symlink from x86_64-linux-gnu-nm to /bin/nm. Is it the FFmpeg configure that causes this error? Or some lib you’re compiling first?
When cross compiling, the target architecture prefix is typically prepended automatically to the toolchain tools’ filenames, but sometimes the scripts aren’t quite right (you’ll see from the sed commands that I had similar issues, where I had to directly edit OpenSSL’s Makefile).
What is libcrystalhd? Is that an extra thing you’re adding?
I had this error when pkgconfig wasn’t installed. As i only tested it in my netinstall version of unbuntu 10.04 which i installed in Virtualbox on win7.
type pkgconfig to test if you have it installed
sudo apt-get install pkgconfig to install.
On CenOS 5 and 6, before compiling ffmpeg,
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure passed with no warning of “ERROR: librtmp not found”
it is possible to compile VLC 2.0 on Synology NAS ?