summaryrefslogtreecommitdiff
path: root/contrib/ffmpeg-universal.sh
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ffmpeg-universal.sh')
-rwxr-xr-xcontrib/ffmpeg-universal.sh177
1 files changed, 177 insertions, 0 deletions
diff --git a/contrib/ffmpeg-universal.sh b/contrib/ffmpeg-universal.sh
new file mode 100755
index 000000000..6e27c56b8
--- /dev/null
+++ b/contrib/ffmpeg-universal.sh
@@ -0,0 +1,177 @@
+#!/bin/sh
+
+function usage {
+ echo "usage: $0 <action> <source path> <arch list>"
+ echo "where: <action> is one of:"
+ echo " -configure do initial configuration for each architecture"
+ echo " -avcodec build libavcodec.a for each architecture"
+ echo " -avutil build libavutil.a for each architecture"
+ echo " -postproc build libpostproc.a for each architecture"
+ echo " -clean clean for each architecture"
+ echo " -distclean distclean for each architecture"
+ echo ""
+ echo "Configuration must be done before any library builds. Options to be passed"
+ echo "to ffmpeg's configure command-line should be passed in the environment"
+ echo "using the FFMPEG_CONFIGURE_OPTIONS environment variable."
+ exit 1
+}
+
+function run_configure {
+ local arch=$1
+ local ffmpeg_topbuilddir="$2"
+
+ # start over from scratch
+ rm -rf "$ffmpeg_topbuilddir"
+ mkdir -p "$ffmpeg_topbuilddir"
+ pushd "$ffmpeg_topbuilddir" > /dev/null 2>&1
+
+ # The Makefile should be passing FFMPEG_CONFIGURE_OPTIONS without passing
+ # any --extra-cflags or --extra-ldflags options. Both CFLAGS and LDFLAGS
+ # should be in the environment in addition to FFMPEG_CONFIGURE_OPTIONS.
+
+ local CROSS_OPTIONS=
+ local EXTRA_CFLAGS=
+ local EXTRA_LDFLAGS=
+
+ if test $HOST_ARCH != $arch; then
+ EXTRA_CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch $arch"
+ EXTRA_LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch $arch"
+ if test $arch = i386; then
+ FFMPEG_ARCH=x86_32
+ else
+ FFMPEG_ARCH=$arch
+ fi
+ CROSS_OPTIONS="--cross-compile --arch=$FFMPEG_ARCH"
+ fi
+
+ echo "$SOURCE_PATH/configure" $CROSS_OPTIONS $FFMPEG_CONFIGURE_OPTIONS \
+ --extra-cflags="$EXTRA_CFLAGS" \
+ --extra-ldflags="$EXTRA_LDFLAGS"
+ "$SOURCE_PATH/configure" $CROSS_OPTIONS $FFMPEG_CONFIGURE_OPTIONS \
+ --extra-cflags="$EXTRA_CFLAGS" \
+ --extra-ldflags="$EXTRA_LDFLAGS"
+ local retval=$?
+
+ # We're building ffmpeg to put it into a shared library, but ffmpeg thinks
+ # it's building to put it into a static library or program image, so it
+ # adds -mdynamic-no-pic to its list of options as an optimization. This is
+ # fine in Tiger if later linked with -Wl,-read_only_relocs,warning, but it
+ # isn't fine on other versions of Mac OS X.
+ if test -f config.mak; then
+ cat config.mak | sed -e '/OPTFLAGS=/s/-mdynamic-no-pic//g' > config.tmp
+ mv -f config.tmp config.mak
+ fi
+
+ popd > /dev/null 2>&1
+ `exit $retval` || exit $retval
+}
+
+if test x"$*" = x""; then
+ usage
+fi
+case "$1" in
+ -configure)
+ MODE=configure
+ ;;
+ -avcodec)
+ MODE=avcodec
+ ;;
+ -avutil)
+ MODE=avutil
+ ;;
+ -postproc)
+ MODE=postproc
+ ;;
+ -clean)
+ MODE=clean
+ ;;
+ -distclean)
+ MODE=distclean
+ ;;
+ *)
+ echo "Unrecognized mode: $1"
+ usage
+ ;;
+esac
+shift
+
+if test x"$1" = x""; then
+ echo "No source path specified!"
+ usage
+fi
+if test ! -d "$1"; then
+ echo "Source path $1 does not exist!"
+ exit 1
+fi
+SOURCE_PATH="$1"
+shift
+
+TOP_BUILD_PATH="`pwd`/ffmpeg"
+if test -f "$TOP_BUILD_PATH/configure"; then
+ # Building in place. Create a temporary build directory and use that
+ # instead, but place the final output from lipo into the original
+ # build directory.
+ BUILD_PATH="$TOP_BUILD_PATH/build"
+else
+ BUILD_PATH="$TOP_BUILD_PATH"
+fi
+# This doesn't make sense for -configure, but it does for everything else.
+# The -configure mode won't ever use it anyway.
+OUTPUT_FILENAME="$BUILD_PATH/lib$MODE/lib$MODE.a"
+
+HOST_ARCH=`arch`
+UNIVERSAL_ARCHES=$*
+if test x"$UNIVERSAL_ARCHES" = x""; then
+ echo "No architecture(s) specified; using $HOST_ARCH only."
+ UNIVERSAL_ARCHES=$HOST_ARCH
+fi
+CONFIG_FILES=
+LIPO_CMDLINE="-create -output $OUTPUT_FILENAME"
+for arch in $UNIVERSAL_ARCHES; do
+ ffmpeg_topbuilddir="$BUILD_PATH/$arch"
+ LIPO_CMDLINE="$LIPO_CMDLINE -arch $arch $ffmpeg_topbuilddir/lib$MODE/lib$MODE.a"
+ case $MODE in
+ configure)
+ run_configure $arch "$ffmpeg_topbuilddir"
+ CONFIG_FILES="$CONFIG_FILES $ffmpeg_topbuilddir/config.h"
+ ;;
+ avcodec)
+ "$MAKE" -C "$ffmpeg_topbuilddir/libavcodec" libavcodec.a || exit $?
+ ;;
+ avutil)
+ "$MAKE" -C "$ffmpeg_topbuilddir/libavutil" libavutil.a || exit $?
+ ;;
+ postproc)
+ "$MAKE" -C "$ffmpeg_topbuilddir/libpostproc" libpostproc.a || exit $?
+ ;;
+ clean)
+ "$MAKE" -C "$ffmpeg_topbuilddir" clean || exit $?
+ ;;
+ distclean)
+ "$MAKE" -C "$ffmpeg_topbuilddir" distclean || exit $?
+ ;;
+ esac
+done
+
+case $MODE in
+ configure)
+ # Now that configuration is done, create config.h in the top-level
+ # ffmpeg directory. Pull out only what's needed by xine-lib, removing
+ # any possible platform conflicts
+ grep -h "define CONFIG_.*_DECODER" $CONFIG_FILES | uniq > "$BUILD_PATH/config.h"
+ touch "$BUILD_PATH/config.mak"
+ ;;
+ clean)
+ rm -f "$BUILD_PATH/libavcodec/libavcodec.a" "$BUILD_PATH/libavutil/libavutil.a" \
+ "$BUILD_PATH/libpostproc/libpostproc.a"
+ ;;
+ distclean)
+ rm -f "$BUILD_PATH/config.mak" "$BUILD_PATH/config.h"
+ rm -f "$BUILD_PATH/libavcodec/libavcodec.a" "$BUILD_PATH/libavutil/libavutil.a" \
+ "$BUILD_PATH/libpostproc/libpostproc.a"
+ ;;
+ *)
+ mkdir -p "`dirname "$OUTPUT_FILENAME"`"
+ lipo $LIPO_CMDLINE
+ ;;
+esac