#!/bin/sh # $Id$ # Copyright (c) 2007-2008 Eric Hameleers # All rights reserved. # # Permission to use, copy, modify, and distribute this software for # any purpose with or without fee is hereby granted, provided that # the above copyright notice and this permission notice appear in all # copies. # # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ----------------------------------------------------------------------------- # # Slackware SlackBuild script # =========================== # By: Eric Hameleers # For: ffmpeg # Descr: software to record, convert and stream audio and video # URL: http://ffmpeg.mplayerhq.hu/ # Needs: # Changelog: # 20070519-1: 19/May/2007 by Eric Hameleers # * Initial build. # Note that the version is set to the current date # (using `date +%Y%d%m` output) when you build ffmpeg # from source using this SlackBuild. # You can override this behaviour by prepending a specific # value for VERSION to the build command, like so: # VERSION=20070519 ./ffmpeg.SlackBuild # 20070612-1: 12/jun/2007 by Eric Hameleers # * Update. Also, make sure that the script actually works # for newer snapshots if they should be downloaded. # 20071006-1: 06/oct/2007 by Eric Hameleers # * Update. Added documentation of the included libraries. # 20071209-1: 09/dec/2007 by Eric Hameleers # * Update of ffmpeg snapshot plus several of the support libs. # Re-added AMR libraries, added libgsm and 1394 (firewire) # support, and messed up the SlackBuild script pretty good. # Added a download function for checking out SVN/CVS snapshots, # which can easily be expanded for multiple snapshots. # 20080303-1: 03/mar/2008 by Eric Hameleers # * Update of ffmpeg and x264 snapshots to their latest versions. # Added dirac codec support. Internally use variable FFMPEG # instead of VERSION to determine the version of ffmpeg to use # (allows me to use a SVN revision number instead of timestamp). # # Run 'sh ffmpeg.SlackBuild --cleanup' to build a Slackware package. # The package (.tgz) plus descriptive .txt file are created in /tmp . # Install using 'installpkg'. # # ----------------------------------------------------------------------------- # Set initial variables: # -- PATENT ALERT! -- # FFmpeg can be built with MP3 audio encoder (needed for FLV videos) # and AMR audio encoder (needed for 3GGP videos) but these libraries are # 'contaminated' with patents from Fraunhofer and GGP. # You can build these patended algorithms into ffmpeg, and if you are an # ordinary end user, no one will bother you for using them. # For the binaries based on this SlackBuild that I distribute, it is a # different story. I am not allowed to distribute binary packages that # incorporate patented code. So here you go. My Slackware package was built # with "USE_PATENTS=NO" i.e. without using the lame mp3 libary and without the # AMR libraries. #USE_PATENTS="NO" USE_PATENTS=${USE_PATENTS:-"YES"} PRGNAM=ffmpeg VERSION=${VERSION:-20080303} ARCH=${ARCH:-i486} BUILD=${BUILD:-1} DOCS="COPYING* CREDITS Changelog MAINTAINERS README* \ doc/TODO doc/*.txt doc/*.html" DOCS_A52="AUTHORS COPYING* ChangeLog HISTORY NEWS README* TODO" DOCS_AMRNB="AUTHORS COPYING ChangeLog INSTALL NEWS README TODO" DOCS_AMRWB="AUTHORS COPYING ChangeLog INSTALL NEWS README TODO" DOCS_DC1394="AUTHORS COPYING ChangeLog INSTALL NEWS README" DOCS_DIRAC="AUTHORS COPYING ChangeLog INSTALL NEWS README TODO" DOCS_FAAC="AUTHORS COPYING* ChangeLog NEWS README* TODO" DOCS_FAAD2="AUTHORS COPYING* ChangeLog NEWS README* TODO" DOCS_GSM="COPYRIGHT ChangeLog* INSTALL MACHINES MANIFEST README" DOCS_LAME="API COPYING ChangeLog HACKING LICENSE README STYLEGUIDE TODO USAGE" DOCS_RAW1394="AUTHORS COPYING ChangeLog INSTALL NEWS README" DOCS_X264="AUTHORS COPYING" DOCS_XVID="AUTHORS ChangeLog* CodingStyle LICENSE README TODO" # Support libraries: A52=0.7.4 AMRNB=7.0.0.0 AMRWB=7.0.0.2 DC1394=1.2.2 DIRAC=0.9.1 FAAC=1.26 FAAD2=2.6.1 FFMPEG=r12291 GSM=1.0.12 LAME=3.97 RAW1394=1.3.0 X264=20080302-2245 XVID=1.1.3 # Where do we look for sources? CWD=`pwd` SRCDIR=`dirname $0` [ "${SRCDIR:0:1}" == "." ] && SRCDIR=${CWD}/${SRCDIR} # Place to build (TMP) package (PKG) and output (OUTPUT) the program: TMP=${TMP:-/tmp/build} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} # --------------------------------------------------------------------------- # Source tarballs and source URLs. # Sources which are not patented should have SRCPAT[n]="NO" # Sources which are patented should have SRCPAT[n]="YES" which prevents then # from being downloaded and used if we build a patent-free package. # --------------------------------------------------------------------------- SOURCE[0]="$SRCDIR/ffmpeg-${FFMPEG}.tar.bz2" # We get ffmpeg sources directly from SVN, see below. #SRCURL[0]="http://ffmpeg.mplayerhq.hu/${PRGNAM}-export-snapshot.tar.bz2" SRCURL[0]="" SRCPAT[0]="NO" # XVIDcore library, will be statically linked against with ffmpeg SOURCE[1]="$SRCDIR/xvidcore-$XVID.tar.gz" SRCURL[1]="http://downloads.xvid.org/downloads/xvidcore-$XVID.tar.gz" SRCPAT[1]="NO" # FAAC library, will be statically linked with ffmpeg SOURCE[2]="$SRCDIR/faac-$FAAC.tar.gz" SRCURL[2]="http://dl.sourceforge.net/faac/faac-$FAAC.tar.gz" SRCPAT[2]="NO" # The A52 decoder - aka AC3, will be statically linked SOURCE[3]="$SRCDIR/a52dec-$A52.tar.gz" SRCURL[3]="http://liba52.sourceforge.net/files/a52dec-$A52.tar.gz" SRCPAT[3]="NO" # X264 encoder - for H264/AVC video streams, for static linking SOURCE[4]="$SRCDIR/x264-snapshot-${X264}.tar.bz2" SRCURL[4]="ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-${X264}.tar.bz2" SRCPAT[4]="NO" # FAAD2 support: SOURCE[5]="$SRCDIR/faad2-$FAAD2.tar.gz" SRCURL[5]="http://dl.sourceforge.net/faac/faad2-$FAAD2.tar.gz" SRCPAT[5]="NO" # GSM support: SOURCE[6]="$SRCDIR/gsm-$GSM.tar.gz" SRCURL[6]="http://kbs.cs.tu-berlin.de/~jutta/gsm/gsm-$GSM.tar.gz" SRCPAT[6]="NO" # Lame is used for the audio in FLV videos; will statically link with ffmpeg SOURCE[7]="$SRCDIR/lame-$LAME.tar.gz" SRCURL[7]="http://dl.sourceforge.net/lame/lame-$LAME.tar.gz" SRCPAT[7]="YES" # AMR encoder libraries used in ffmpeg to encode 3GPP audio # amr narrowband wrapper: SOURCE[8]="$SRCDIR/amrnb-${AMRNB}.tar.bz2" SRCURL[8]="http://ftp.penguin.cz/pub/users/utx/amr/amrnb-${AMRNB}.tar.bz2" SRCPAT[8]="YES" # amr narrowband library: SOURCE[9]="$SRCDIR/26104-700.zip" SRCURL[9]="http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-700.zip" SRCPAT[9]="YES" # amr wideband wrapper: SOURCE[10]="$SRCDIR/amrwb-${AMRWB}.tar.bz2" SRCURL[10]="http://ftp.penguin.cz/pub/users/utx/amr/amrwb-${AMRWB}.tar.bz2" SRCPAT[10]="YES" # amr wideband library: SOURCE[11]="$SRCDIR/26204-700.zip" SRCURL[11]="http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-700.zip" SRCPAT[11]="YES" # Library needed to control IEEE 1394 (firewire-) based cameras SOURCE[12]="$SRCDIR/libraw1394-${RAW1394}.tar.gz" SRCURL[12]="http://www.linux1394.org/dl/libraw1394-${RAW1394}.tar.gz" SRCPAT[12]="NO" SOURCE[13]="$SRCDIR/libdc1394-${DC1394}.tar.gz" SRCURL[13]="http://downloads.sourceforge.net/libdc1394/libdc1394-${DC1394}.tar.gz" SRCPAT[13]="NO" # Dirac encoder/decoder SOURCE[14]="$SRCDIR/dirac-${DIRAC}.tar.gz" SRCURL[14]="http://downloads.sourceforge.net/dirac/dirac-${DIRAC}.tar.gz" SRCPAT[14]="NO" #SOURCE[15]="$SRCDIR/ffmpegsvn_trunk_revision_11612-dirac-0.9.x.patch.tgz" #SRCURL[15]="http://downloads.sourceforge.net/dirac/ffmpegsvn_trunk_revision_11612-dirac-0.9.x.patch.tgz" #SRCPAT[15]="NO" # Use the src_checkout() function if no downloadable tarball exists. # This function checks out sources from SVN/CVS and creates a tarball of them. src_checkout() { # Param #1 : index in the SOURCE[] array. # Param #2 : full path to where SOURCE[$1] tarball should be created. case ${1} in 0) # ffmpeg-${FFMPEG} if [ "$(echo ${FFMPEG}|cut -c1)" == 'r' ]; then # revision instead of date REV=$(echo ${FFMPEG} | cut -c2-) else REV="{${FFMPEG}}" fi mkdir ffmpeg-${FFMPEG} \ && cd ffmpeg-${FFMPEG} \ && svn checkout --revision $REV svn://svn.mplayerhq.hu/ffmpeg/trunk . \ && chown -R root:root . \ && cd .. \ && tar -jcf ${2} ffmpeg-${FFMPEG} \ && rm -rf ffmpeg-${FFMPEG} ;; *) # Do nothing ;; esac } if [ "${USE_PATENTS}" == "YES" ]; then echo "" echo "**" echo "** This build uses patented code (MP3 / AMR encoders)" echo "** Run the command 'USE_PATENTS=NO $0 $*' to avoid patent issues." echo "**" echo "" sleep 1 fi ## ## --- with a little luck, you won't have to edit below this point --- ## ## # Exit the script on errors: set -e trap 'echo "$0 FAILED at line $LINENO!" | tee $OUTPUT/error-${PRGNAM}.log' ERR # Catch unitialized variables: set -u P1=${1:-1} # Slackware 11 and up need other option (gcc > 3.3.x) if [ `gcc -dumpversion | tr -d '.' |cut -c 1-2` -gt 33 ]; then MOPT=tune else MOPT=cpu fi case "$ARCH" in i386) SLKCFLAGS="-O2 -march=i386 -m${MOPT}=i686" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; i486) SLKCFLAGS="-O2 -march=i486 -m${MOPT}=i686" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; s390) SLKCFLAGS="-O2" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; powerpc) SLKCFLAGS="-O2" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; x86_64) SLKCFLAGS="-O2 -fPIC" SLKLDFLAGS="-L/usr/lib64"; LIBDIRSUFFIX="64" ;; athlon-xp) SLKCFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer" SLKLDFLAGS=""; LIBDIRSUFFIX="" ;; esac # Create working directories: mkdir -p $TMP/tmp-$PRGNAM # location to build the source if [ "$P1" != "--oldbuild" ]; then # If the "--oldbuild" parameter is present, we keep # the old build files and continue; # By default we remove the remnants of previous build and continue: rm -rf $TMP/tmp-$PRGNAM/* $OUTPUT/*${PRGNAM}*.log fi mkdir -p $PKG # place for the package to be built rm -rf $PKG/* # We always erase old package's contents: mkdir -p $OUTPUT # place for the package to be saved # Source file availability: # Regular URL downloads follow: for (( i = 0; i < ${#SOURCE[*]}; i++ )) ; do # Only download patented code if we are allowing it: if [ "${USE_PATENTS}" == "YES" -o "${SRCPAT[$i]}" != "YES" ]; then if ! [ -f ${SOURCE[$i]} ]; then echo "Source '`basename ${SOURCE[$i]}`' not available yet..." # Check if the $SRCDIR is writable at all - if not, download to $OUTPUT [ -w "$SRCDIR" ] || SOURCE[$i]="$OUTPUT/`basename ${SOURCE[$i]}`" if ! [ "x${SRCURL[$i]}" == "x" ]; then echo "Will download file to `dirname $SOURCE[$i]`" if ! $(wget -nv -T 20 -O "${SOURCE[$i]}" "${SRCURL[$i]}"); then echo "Downloading '`basename ${SOURCE[$i]}`' failed.. aborting the build." mv -f "${SOURCE[$i]}" "${SOURCE[$i]}".FAIL exit 1 fi else # Try if we have a SVN/CVS download routine for ${SOURCE[$i]} echo "Will checkout sources to `dirname $SOURCE[$i]`" src_checkout $i "${SOURCE[$i]}" fi if [ ! -f "${SOURCE[$i]}" -o ! -s "${SOURCE[$i]}" ]; then echo "File '`basename ${SOURCE[$i]}`' not available.. aborting the build." exit 1 fi fi fi done if [ "$P1" == "--download" ]; then echo "Download complete." exit 0 fi # --- PACKAGE BUILDING --- echo "++" echo "|| $PRGNAM-$VERSION" echo "++" cd $TMP/tmp-$PRGNAM if [ "$P1" != "--oldbuild" ]; then echo "Extracting the source archive(s) for $PRGNAM..." for (( i = 0; i < ${#SOURCE[*]}; i++ )) ; do # Only extract patented code if we are allowing it: if [ "${USE_PATENTS}" == "YES" -o "${SRCPAT[$i]}" != "YES" ]; then if `file ${SOURCE[$i]} | grep -q ": bzip2"`; then tar -xjvf ${SOURCE[$i]} elif `file ${SOURCE[$i]} | grep -q ": gzip"`; then tar -xzvf ${SOURCE[$i]} elif `file ${SOURCE[$i]} | grep -iq ": zip"`; then unzip ${SOURCE[$i]} fi fi done fi chown -R root:root * chmod -R u+w,go+r-w,a-s * # --- BUILDING --- echo Building ... # We will be installing static libs into the following directory: # (when linking ffmpeg together, these libs will be found & used) mkdir -p $TMP/tmp-$PRGNAM/ffmpegdeps/usr/{bin,include,lib,man} # ----------------------------------------------------------------------------- # Compile lame libraries # The ffmpeg will use these # ----------------------------------------------------------------------------- make_lame() { echo -e "**\n** lame ...\n**" cd $TMP/tmp-$PRGNAM/lame-${LAME} CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_lame.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_lame.log # Install lame into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_lame.log cd - } # ----------------------------------------------------------------------------- # Compile amr narrowband library # The ffmpeg will use these # ----------------------------------------------------------------------------- make_amrnb() { echo -e "**\n** amrnb ...\n**" cd $TMP/tmp-$PRGNAM/amrnb-${AMRNB} # Copy the amrnb-float libraries to prevent the makefile downloading them: cp ${SOURCE[9]} . CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_amrnb.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_amrnb.log # Install amrnb into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_amrnb.log cd - } # ----------------------------------------------------------------------------- # Compile amr wideband library # The ffmpeg will use these # ----------------------------------------------------------------------------- make_amrwb() { echo -e "**\n** amrwb ...\n**" cd $TMP/tmp-$PRGNAM/amrwb-${AMRWB} # Copy the amrwb-float libraries to prevent the makefile downloading them: cp ${SOURCE[11]} . CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_amrwb.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_amrwb.log # Install amrwb into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_amrwb.log cd - } # ----------------------------------------------------------------------------- # Compile xvidcore libraries # The ffmpeg will use these # ----------------------------------------------------------------------------- make_xvid() { echo -e "**\n** xvid ...\n**" cd $TMP/tmp-$PRGNAM/xvidcore-${XVID}/build/generic CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_xvid.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_xvid.log # Install xvidcore into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_xvid.log cd - } # ----------------------------------------------------------------------------- # Compile dc1394 and raw1394 libraries # The ffmpeg will use these # ----------------------------------------------------------------------------- make_1394() { echo -e "**\n** 1394 ...\n**" OLDDIR=`pwd` cd $TMP/tmp-$PRGNAM/libraw1394-${RAW1394} CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --mandir=/usr/man \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_raw1394.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_raw1394.log # Install libraw1394 into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_raw1394.log echo -e "**\n**" cd $TMP/tmp-$PRGNAM/libdc1394-${DC1394} # Make sure that the static libraw1394 is found in the ffmpegdeps: CFLAGS="$SLKCFLAGS -I`pwd`/../ffmpegdeps/usr/include" \ CPPFLAGS="$SLKCFLAGS -I`pwd`/../ffmpegdeps/usr/include" \ LDFLAGS="$SLKLDFLAGS -L`pwd`/../ffmpegdeps/usr/lib" \ PKG_CONFIG_PATH="`pwd`/../ffmpegdeps/usr/lib/pkgconfig" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_dc1394.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_dc1394.log # Install libdc1394 into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_dc1394.log cd $OLDDIR } # ----------------------------------------------------------------------------- # Compile faac library # The ffmpeg will use these # ----------------------------------------------------------------------------- make_faac() { echo -e "**\n** faac ...\n**" mv $TMP/tmp-$PRGNAM/faac $TMP/tmp-$PRGNAM/faac-${FAAC} cd $TMP/tmp-$PRGNAM/faac-${FAAC} sh bootstrap CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_faac.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_faac.log # Install faac into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_faac.log cd - } # ----------------------------------------------------------------------------- # Compile faad2 # ----------------------------------------------------------------------------- make_faad2() { echo -e "**\n** faad2 ...\n**" mv $TMP/tmp-$PRGNAM/faad2 $TMP/tmp-$PRGNAM/faad2-${FAAD2} cd $TMP/tmp-$PRGNAM/faad2-${FAAD2} #patch -p1 < $SRCDIR/faad2-remove-bmp.patch autoreconf -vif CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --with-drm \ --with-mp4v2 \ --without-xmms \ --enable-static \ --disable-shared \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_faad2.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_faad2.log # Install faad2 into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_faad2.log cd - } # ----------------------------------------------------------------------------- # Compile a52 libraries # ----------------------------------------------------------------------------- make_a52() { echo -e "**\n** a52 ...\n**" cd $TMP/tmp-$PRGNAM/a52dec-${A52} CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --libdir=/usr/lib${LIBDIRSUFFIX} \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_a52.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_a52.log # Install a52 into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_a52.log cd - } # ----------------------------------------------------------------------------- # Compile x264 # ----------------------------------------------------------------------------- make_x264() { echo -e "**\n** x264 ...\n**" mv $TMP/tmp-$PRGNAM/x264-snapshot-${X264} $TMP/tmp-$PRGNAM/x264-${X264} cd $TMP/tmp-$PRGNAM/x264-${X264} CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_x264.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_x264.log # Install x264 into a temp location so ffmpeg can pickup the library make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_x264.log cd - } # ----------------------------------------------------------------------------- # Compile gsm # ----------------------------------------------------------------------------- make_gsm() { echo -e "**\n** gsm ...\n**" GSMMAJ=$(echo $GSM | cut -d. -f1,2) GSMPL=$(echo $GSM | cut -d. -f3) mv $TMP/tmp-$PRGNAM/gsm-${GSMMAJ}-pl${GSMPL} $TMP/tmp-$PRGNAM/gsm-${GSM} cd $TMP/tmp-$PRGNAM/gsm-${GSM} CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ make 2>&1 | tee $OUTPUT/make-${PRGNAM}_gsm.log # Install gsm into a temp location so ffmpeg can pickup the library make install 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_gsm.log mkdir -p $TMP/tmp-$PRGNAM/ffmpegdeps/usr/{bin,include,lib} cp bin/* $TMP/tmp-$PRGNAM/ffmpegdeps/usr/bin/ cp inc/gsm.h $TMP/tmp-$PRGNAM/ffmpegdeps/usr/include/ cp lib/* $TMP/tmp-$PRGNAM/ffmpegdeps/usr/lib/ cd - } make_dirac() { echo -e "**\n** dirac ...\n**" cd $TMP/tmp-$PRGNAM/dirac-$DIRAC CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --disable-debug \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_dirac.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_dirac.log # Install dirac into a temp location so ffmpeg can pickup the library echo -e "\n**\n**\n" make install DESTDIR=$TMP/tmp-$PRGNAM/ffmpegdeps \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_dirac.log # Or else the ffmpeg build wil fail: mv $TMP/tmp-$PRGNAM/ffmpegdeps/usr/include/dirac/libdirac* \ $TMP/tmp-$PRGNAM/ffmpegdeps/usr/include/ cd - } # ----------------------------------------------------------------------------- # Compile ffmpeg with additional support for - # LAME, XVID, FAAC, FAAD2 , A52 (AC3), X264, GSM, DIRAC # ----------------------------------------------------------------------------- make_ffmpeg() { echo -e "**\n** ffmpeg ...\n**" OLDDIR=`pwd` cd $TMP/tmp-$PRGNAM # Take care of snaphot directory: if [ -d ffmpeg-export-* ]; then rm -rf ffmpeg-${FFMPEG} mv ffmpeg-export-* ffmpeg-${FFMPEG} fi # Only use patented code if we are allowing it: if [ "${USE_PATENTS}" == "YES" ]; then USE_PATENTED="--enable-libmp3lame --enable-libamr-nb --enable-libamr-wb --enable-nonfree" else USE_PATENTED=" " fi cd ffmpeg-${FFMPEG} # Apply the patch to enable dirac support (use my re-engineered patch): #patch -p1 < ../ffmpeg*-dirac-*.patch \ cat $SRCDIR/ffmpeg*-dirac-*.patch | patch -p1 \ 2>&1 | tee $OUTPUT/patch-${PRGNAM}_ffmpeg.log CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ PKG_CONFIG_PATH="`pwd`/../ffmpegdeps/usr/lib/pkgconfig" \ ./configure --prefix=/usr \ --mandir=/usr/man \ ${USE_PATENTED} \ --enable-libvorbis \ --enable-libtheora \ --enable-libfaac \ --enable-libfaad \ --enable-liba52 \ --enable-libx264 \ --enable-libxvid \ --enable-libgsm \ --enable-dirac \ --enable-libdc1394 \ --enable-swscaler \ --enable-gpl \ --enable-pp \ --enable-pthreads \ --enable-memalign-hack \ --enable-x11grab \ --disable-debug \ --disable-shared \ --enable-static \ --log=$OUTPUT/ffmpeg_conf.log \ --extra-cflags="-I`pwd`/../ffmpegdeps/usr/include" \ --extra-ldflags="-L`pwd`/../ffmpegdeps/usr/lib" \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_ffmpeg.log # --enable-libogg \ No longer needed make 2>&1 | tee $OUTPUT/make-${PRGNAM}_ffmpeg.log cd $OLDDIR } # # OK, we packaged the compile process for the various software libraries # into convenient functions... let's call them one by one now: # # Needed before ffmpeg: # Based on the value of $USE_PATENTS enable or disable patented code: if [ "${USE_PATENTS}" = "YES" ]; then make_lame make_amrnb make_amrwb fi make_xvid make_1394 make_faac make_faad2 make_a52 make_x264 make_gsm make_dirac # ffmpeg uses the above static libraries: make_ffmpeg # End of compilation, proceed to packaging the binaries: cd $TMP/tmp-${PRGNAM}/ffmpeg-${FFMPEG} # Install all the needed stuff to the package dir # Use installwatch if available, to produce a logfile of the installation # process that is more easily readable: if `which installwatch > /dev/null 2>&1`; then installwatch -o $OUTPUT/install-${PRGNAM}.log make DESTDIR=$PKG install else make DESTDIR=$PKG install 2>&1 |tee $OUTPUT/install-${PRGNAM}.log fi # Add a configuration file for the ffserver: mkdir -p $PKG/etc cp -a doc/ffserver.conf $PKG/etc/ffserver.conf.new # Add this to the doinst.sh: ! [ -d $PKG/install ] && mkdir -p $PKG/install cat <> $PKG/install/doinst.sh # Handle the incoming configuration files: config() { for infile in \$1; do NEW="\$infile" OLD="\`dirname \$NEW\`/\`basename \$NEW .new\`" # If there's no config file by that name, mv it over: if [ ! -r \$OLD ]; then mv \$NEW \$OLD elif [ "\`cat \$OLD | md5sum\`" = "\`cat \$NEW | md5sum\`" ]; then # toss the redundant copy rm \$NEW fi # Otherwise, we leave the .new copy for the admin to consider... done } config etc/ffserver.conf.new EOINS # Add documentation (for all the deps as well) - docs for patented code are # only added if we build a package that actually uses them: mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/{a52dec,dc1394,dirac,faac,faad2,gsm,raw1394,x264,xvidcore} cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION || true # And the included libraries: ( cd ../a52dec-${A52} cp -a $DOCS_A52 $PKG/usr/doc/$PRGNAM-$VERSION/a52dec || true ) ( cd ../libdc1394-${DC1394} cp -a $DOCS_DC1394 $PKG/usr/doc/$PRGNAM-$VERSION/dc1394 || true ) ( cd ../dirac-${DIRAC} cp -a $DOCS_DIRAC $PKG/usr/doc/$PRGNAM-$VERSION/dirac || true ) ( cd ../faac-${FAAC} cp -a $DOCS_FAAC $PKG/usr/doc/$PRGNAM-$VERSION/faac || true ) ( cd ../faad2-${FAAD2} cp -a $DOCS_FAAD2 $PKG/usr/doc/$PRGNAM-$VERSION/faad2 || true ) ( cd ../gsm-${GSM} cp -a $DOCS_GSM $PKG/usr/doc/$PRGNAM-$VERSION/gsm || true ) ( cd ../libraw1394-${RAW1394} cp -a $DOCS_RAW1394 $PKG/usr/doc/$PRGNAM-$VERSION/raw1394 || true ) ( cd ../x264-${X264} cp -a $DOCS_X264 $PKG/usr/doc/$PRGNAM-$VERSION/x264 || true ) ( cd ../xvidcore-${XVID} cp -a $DOCS_XVID $PKG/usr/doc/$PRGNAM-$VERSION/xvidcore || true ) if [ "${USE_PATENTS}" = "YES" ]; then mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION/{amrnb,amrwb,lame} ( cd ../amrnb-${AMRNB} cp -a $DOCS_AMRNB $PKG/usr/doc/$PRGNAM-$VERSION/amrnb || true ) ( cd ../amrwb-${AMRWB} cp -a $DOCS_AMRWB $PKG/usr/doc/$PRGNAM-$VERSION/amrwb || true ) ( cd ../lame-${LAME} cp -a $DOCS_LAME $PKG/usr/doc/$PRGNAM-$VERSION/lame || true ) fi # Compress the man page(s) if [ -d $PKG/usr/man ]; then find $PKG/usr/man -type f -name "*.?" -exec gzip -9f {} \; for i in `find $PKG/usr/man -type l -name "*.?"` ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done fi # Strip binaries cd $PKG find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true cd - # Add package description: mkdir -p $PKG/install cat $SRCDIR/slack-desc > $PKG/install/slack-desc if [ -f $SRCDIR/doinst.sh ]; then cat $SRCDIR/doinst.sh >> $PKG/install/doinst.sh fi # Build the package: cd $PKG makepkg --linkadd y --chown n $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.tgz 2>&1 | tee $OUTPUT/makepkg-${PRGNAM}.log cd $OUTPUT md5sum ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.tgz > ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.tgz.md5 cd - cat $PKG/install/slack-desc | grep "^${PRGNAM}" > $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}.txt # Clean up the extra stuff: if [ "$P1" = "--cleanup" ]; then rm -rf $TMP/tmp-$PRGNAM rm -rf $PKG fi