diff options
Diffstat (limited to 'contrib/ffmpeg-universal.sh')
-rwxr-xr-x | contrib/ffmpeg-universal.sh | 177 |
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 |