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