#!/bin/sh # $Id: ffmpeg.SlackBuild,v 1.21 2008/08/06 20:59:59 root Exp root $ # 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). # r14080-1: 05/aug/2008 by Eric Hameleers # * Update of almost all composing libraries. The dirac reference # implementation library was replaced by schroedinger. # This version of the package includes shared libraries which # allows other programs to link to avcodec. # If you install yasm, the SlackBuild will be able to use a # very recent version of the x264 library, else it will fallback # to a version that compiles with Slackware's 'asm'. # # 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), # AMR audio encoder (needed for 3GGP videos) and AAC audio encoder (used in MP4) # but these libraries are 'contaminated' with patents from Fraunhofer, GGP etc. # 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 and aac libs and # without the AMR libraries. #USE_PATENTS="NO" USE_PATENTS=${USE_PATENTS:-"YES"} # If you set REQUIRE_YASM to "NO" then the script won't refuse to build # ffmpeg in case you don't have yasm installed (it is needed to build x264 # newer than the 20080301 snapshot). In this case, the script will # automatically 'downgrade' x264 to the 20080301-2245 snapshot. REQUIRE_YASM=${REQUIRE_YASM:-"YES"} PRGNAM=ffmpeg VERSION=${VERSION:-r14080} ARCH=${ARCH:-i486} BUILD=${BUILD:-1} TAG=${TAG:-"alien"} 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_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_OIL="AUTHORS BUG-REPORTING COPYING HACKING NEWS README" DOCS_RAW1394="AUTHORS COPYING ChangeLog INSTALL NEWS README" DOCS_SCHROEDINGER="AUTHORS COPYING* NEWS TODO" DOCS_X264="AUTHORS COPYING" # Support libraries: A52=0.7.4 AMRNB=7.0.0.2 AMRWB=7.0.0.3 DC1394=1.2.2 FAAC=1.26 FAAD2=2.6.1 FFMPEG=r14080 GSM=1.0.12 LAME=398 OIL=0.3.15 RAW1394=1.3.0 SCHROEDINGER=1.0.5 X264_SAFE=20080301-2245 # In later versions nasm complains # about 'function hidden' X264=20080804-2245 # Needs yasm installed #X264=20080618-2245 # Never snapshots show "fatal: ambiguous argument # 'origin/master': unknown revision or path not in # the working tree." # Where do we look for sources? SRCDIR=$(cd $(dirname $0); pwd) # Place to build (TMP) package (PKG) and output (OUTPUT) the program: TMP=${TMP:-/tmp/build} PKG=$TMP/package-$PRGNAM OUTPUT=${OUTPUT:-/tmp} # Check for yasm, use older x264 snapshot if not found: if ! which yasm >/dev/null 2>&1 ; then echo "##" echo "## The 'yasm' program does not seem to be installed." echo "## The X264 codec compilation needs yasm (nasm will not do)" if [ "$REQUIRE_YASM" != "YES" ]; then X264=$X264_SAFE echo "## Continuing the build anyway, but will use an older X264 ($X264)..." echo "##" else echo "## Aborting the build - set the internal script variable:" echo "## REQUIRE_YASM to 'NO' if you don't have yasm installed," echo "## and want to fall back to an old (but still useable)" echo "## version of X264 that builds with nasm instead." echo "##" exit 1 fi fi # --------------------------------------------------------------------------- # 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" # Liboil is a dependency for schroedinger SOURCE[1]="$SRCDIR/liboil-${OIL}.tar.gz" SRCURL[1]="http://liboil.freedesktop.org/download/liboil-${OIL}.tar.gz" SRCPAT[1]="NO" # Dirac video codec support by schroedinger: SOURCE[2]="$SRCDIR/schroedinger-${SCHROEDINGER}.tar.gz" SRCURL[2]="http://www.diracvideo.org/download/schroedinger/schroedinger-${SCHROEDINGER}.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://downloads.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://downloads.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" # FAAC library, will be statically linked with ffmpeg SOURCE[14]="$SRCDIR/faac-$FAAC.tar.gz" SRCURL[14]="http://downloads.sourceforge.net/faac/faac-$FAAC.tar.gz" SRCPAT[14]="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[$i] tarball should be created. # Determine the tarball extension: PEXT=$(echo "${2}" | sed -r -e 's/.*[^.].(tar.gz|tar.bz2|tgz).*/\1/') if [ "$PEXT" == "${2}" ]; then # we did not find a allowed extension echo "Archive can only have extension '.tar.gz' '.tar.bz2' or '.tgz'" exit 1 else [ "$PEXT" = "tar.bz2" ] && TARCOMP="j" || TARCOMP="z" fi 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 . \ && find . -type d -name '.svn' -depth | xargs rm -rf \ && chown -R root:root . \ && cd .. \ && tar -${TARCOMP}cf ${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 / AAC 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 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} FFMPEGDEPSDIR="$TMP/tmp-$PRGNAM/ffmpegdeps" # ----------------------------------------------------------------------------- # 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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_lame.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/lame cp -a $DOCS_LAME $FFMPEGDEPSDIR/doc/lame/ || true 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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_amrnb.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/amrnb cp -a $DOCS_AMRNB $FFMPEGDEPSDIR/doc/amrnb || true 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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_amrwb.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/amrwb cp -a $DOCS_AMRWB $FFMPEGDEPSDIR/doc/amrwb || true 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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_raw1394.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/libraw1394 cp -a $DOCS_RAW1394 $FFMPEGDEPSDIR/doc/libraw1394 || true echo -e "**\n**" cd $TMP/tmp-$PRGNAM/libdc1394-${DC1394} # Make sure that the static libraw1394 is found in the ffmpegdeps: CFLAGS="$SLKCFLAGS -I$FFMPEGDEPSDIR/usr/include" \ CPPFLAGS="$SLKCFLAGS -I$FFMPEGDEPSDIR/usr/include" \ LDFLAGS="$SLKLDFLAGS -L$FFMPEGDEPSDIR/usr/lib" \ PKG_CONFIG_PATH="$FFMPEGDEPSDIR/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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_dc1394.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/libdc1394 cp -a $DOCS_DC1394 $FFMPEGDEPSDIR/doc/libdc1394 || true 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 \ --with-mp4v2 \ --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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_faac.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/faac cp -a $DOCS_FAAC $FFMPEGDEPSDIR/doc/faac || true 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} 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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_faad2.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/faad2 cp -a $DOCS_FAAD2 $FFMPEGDEPSDIR/doc/faad2 || true 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=$FFMPEGDEPSDIR 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_a52.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/liba52 cp -a $DOCS_A52 $FFMPEGDEPSDIR/doc/liba52 || true cd - } # ----------------------------------------------------------------------------- # Compile x264 # ----------------------------------------------------------------------------- make_x264() { echo -e "**\n** x264 ...\n**" cd $TMP/tmp-$PRGNAM/x264-snapshot-${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=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_x264.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/x264 cp -a $DOCS_X264 $FFMPEGDEPSDIR/doc/x264 || true 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 $FFMPEGDEPSDIR/usr/{bin,include,lib} cp bin/* $FFMPEGDEPSDIR/usr/bin/ cp inc/gsm.h $FFMPEGDEPSDIR/usr/include/ cp lib/* $FFMPEGDEPSDIR/usr/lib/ # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/gsm cp -a $DOCS_GSM $FFMPEGDEPSDIR/doc/gsm || true cd - } # ----------------------------------------------------------------------------- # Compile liboil # ----------------------------------------------------------------------------- make_oil() { echo -e "**\n** oil ...\n**" cd $TMP/tmp-$PRGNAM/liboil-$OIL CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ ./configure --prefix=$FFMPEGDEPSDIR/usr \ --enable-static \ --disable-shared \ --disable-debug \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_oil.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_oil.log # Install liboil into a temp location so schroedinger can pickup the library echo -e "\n**\n**\n" # We used --prefix=$FFMPEGDEPSDIR/usr so that schroedinger's build will find the # headers in the $FFMPEGDEPSDIR instead of the filesystem root: make install 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_oil.log # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/liboil/ cp -a $DOCS_OIL $FFMPEGDEPSDIR/doc/liboil/ || true cd - } # ----------------------------------------------------------------------------- # Compile schroedinger # ----------------------------------------------------------------------------- make_schroedinger() { echo -e "**\n** schroedinger ...\n**" cd $TMP/tmp-$PRGNAM/schroedinger-$SCHROEDINGER CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ PKG_CONFIG_PATH="$FFMPEGDEPSDIR/usr/lib/pkgconfig" \ ./configure --prefix=/usr \ --enable-static \ --disable-shared \ --disable-debug \ --program-prefix="" \ --program-suffix="" \ --build=$ARCH-slackware-linux \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_schroedinger.log make 2>&1 | tee $OUTPUT/make-${PRGNAM}_schroedinger.log # Install schroedinger into a temp location so ffmpeg can pickup the library echo -e "\n**\n**\n" make install DESTDIR=$FFMPEGDEPSDIR \ 2>&1 | tee -a $OUTPUT/make-${PRGNAM}_schroedinger.log # Or else the ffmpeg build wil fail: ( cd $FFMPEGDEPSDIR/usr/include ln -sf schroedinger-1.0/schroedinger ) # Add DOCS to the ffmpegdeps to have it added to ffmpeg package later: mkdir -p $FFMPEGDEPSDIR/doc/schroedinger/ cp -a $DOCS_SCHROEDINGER $FFMPEGDEPSDIR/doc/schroedinger/ || true cd - } # ----------------------------------------------------------------------------- # Compile ffmpeg with additional support for - # LAME (MP3), XVID, FAAC (MP4), FAAD2 , A52 (AC3), X264, GSM, SCHROEDINGER # ----------------------------------------------------------------------------- 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-libfaac --enable-nonfree" else USE_PATENTED=" " fi cd $TMP/tmp-$PRGNAM/ffmpeg-${FFMPEG} # Stamp the version into the source: sed -i -e "s/UNKNOWN/$FFMPEG/" version.sh CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ LDFLAGS="$SLKLDFLAGS" \ PKG_CONFIG_PATH="$FFMPEGDEPSDIR/usr/lib/pkgconfig" \ ./configure --prefix=/usr \ --mandir=/usr/man \ ${USE_PATENTED} \ --enable-gpl \ --enable-postproc \ --enable-avfilter \ --enable-swscale \ --enable-libtheora \ --enable-libfaad \ --enable-liba52 \ --enable-libx264 \ --enable-libgsm \ --enable-libschroedinger \ --enable-libdc1394 \ --enable-pthreads \ --enable-memalign-hack \ --enable-x11grab \ --enable-shared \ --enable-static \ --disable-debug \ --logfile=$OUTPUT/ffmpeg_conf.log \ --extra-cflags="-I$FFMPEGDEPSDIR/usr/include -DRUNTIME_CPUDETECT" \ --extra-ldflags="-L$FFMPEGDEPSDIR/usr/lib" \ 2>&1 | tee $OUTPUT/configure-${PRGNAM}_ffmpeg.log 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: # #if [ 'xy' != 'xy' ]; then # use this block if you want to skip a lot # 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 make_faac fi make_1394 make_faad2 make_a52 make_gsm make_oil make_schroedinger make_x264 #fi # end of 'xy' # 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 # The pkg-config files are full of library dependencies which we built # statically, so we need to edit those out so that programs that try to link # against our ffmpeg will not get confused: for PCFILE in $(ls $PKG/usr/lib/pkgconfig/*.pc) ; do sed -i -e 's/libraw1394//' -e 's/-la52//' -e 's/-lamrnb//' -e 's/-lamrwb//' \ -e 's/-lfaac//' -e 's/-lfaad//' -e 's/-lgsm//' -e 's/-lmp3lame//' \ -e 's/-lschroedinger-[^ ]*//' -e 's/-loil-[^ ]*//' -e 's/-lx264//' \ -e 's/-ldc1394_control//' -e 's/-lraw1394//' $PCFILE done # 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) mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION || true # Add all the supporting packages' documentation too: cp -a $FFMPEGDEPSDIR/doc/* $PKG/usr/doc/$PRGNAM-$VERSION || true cp -a $SRCDIR/$(basename $0) $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild find $PKG/usr/doc -type f -exec chmod 644 {} \; chown -R root:root $PKG/usr/doc/$PRGNAM-$VERSION/* # 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}${TAG}.tgz 2>&1 | tee $OUTPUT/makepkg-${PRGNAM}.log cd $OUTPUT md5sum ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.tgz > ${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.tgz.md5 cd - cat $PKG/install/slack-desc | grep "^${PRGNAM}" > $OUTPUT/${PRGNAM}-${VERSION}-${ARCH}-${BUILD}${TAG}.txt # Clean up the extra stuff: if [ "$P1" = "--cleanup" ]; then rm -rf $TMP/tmp-$PRGNAM rm -rf $PKG fi