#12504: RFE: a possible build process for a universal libjpeg -------------------------------+-------------------------------------------- Reporter: nmb@wartburg.edu | Owner: waqar@macports.org Type: enhancement | Status: closed Priority: Normal | Milestone: Port Enhancements Component: ports | Version: 1.5.2 Resolution: fixed | Keywords: universal -------------------------------+-------------------------------------------- Old description:
I found the following script which builds a universal version of libjpeg. It does this by building a PPC and a i386 version and lipo'ing them together. This came from http://www.omnigroup.com/mailman/archive /macosx-dev/2007-May.txt
#!/bin/sh # # jpeg-build-univ # # Script to crteate universal binary version of libjpeg. # # ? 2006 Alan Staniforth # # Version 2.0 # # Invoke thus: # # jpeg-build-univ [-h] | [-v] | [-i] [-p prefix] [-s sdk] [-n] [-k] # # where prefix is the install root for the libraries. # # Version 2.0: # Source download incorporated. # Reverted to using MacOSX10.3.9.sdk as the default SDK for PPC # Targets 10.2 for ppc, 10.4 for i386.
### Set up. # Set trap to allow abort on signal: trap 'echo "Interrupted by signal" >&2; exit' 1 2 3 15 # Defaults BUILD_UNIV_VERS=2.0 INSTALL_PREFIX="/usr/local" SDK_PPC="MacOSX10.3.9.sdk" DO_INSTALL=0 DO_DLOAD=1 NO_SUDO=0
### Handle optional parameters if test $# -ne 0 ; then ### Options while test $# -gt 0; do case "$1" in -*) FLAG="$1" case "$FLAG" in -h) ### Usage information echo "Usage: jpeg-build-univ [-h]" echo "Usage: jpeg-build-univ [-v]" echo "Usage: jpeg-build-univ [-i] [-p prefix] [-s sdk]" echo "" echo "Options:" echo " -h : Print this usage summary." echo " -v : Print tool version." echo " -i : Install as well as build." echo " -k : Skip download of source." echo " -n : Don't use sudo when installing." echo " -p prefix : install root for the built libraries and support" echo " files. Default is /usr/local" echo " -s sdk : the Mac OS X SDK you want GCC to use for PPC code. " echo " Default is MacOSX10.3.9.sdk" echo "" exit ;; -v) ### version echo "$BUILD_UNIV_VERS" ;; -p) ### install prefix specified shift if test "${1##*/}" = "" ; then INSTALL_PREFIX="${1%*/}" else INSTALL_PREFIX="${1}" fi if !(test -d "${INSTALL_PREFIX}") ; then echo "${INSTALL_PREFIX} does not exist or is not a directory" exit fi ;; -s) ### ppc sdk specified shift SDK_PPC="${1}" ;; -i) ### install the built libray and headers (make can't be used) DO_INSTALL=1 ;; -n) ### No sudo NO_SUDO=1 ;; -k) ### skip download DO_DLOAD=0 ;; -*) echo "Usage: "$1" not understood!" echo "Use jpeg-build-univ -h for usage information" break ;; esac ;; esac shift done fi
### Get the source: if test $DO_DLOAD -ne 0 ; then ### Download source from uunet. echo "jpeg-build-univ: Getting the libjpeg source..." curl ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz -o "jpegsrc.v6b.tar.gz" else echo "jpeg-build-univ: Skipping source download..." fi
### Extract the source: echo "jpeg-build-univ: Expanding the source tarball..." tar -zxpf jpegsrc.v6b.tar.gz
### Do set-up echo "jpeg-build-univ: Setting up..." # Change to the directory cd jpeg-6b cp /usr/share/libtool/config.sub . cp /usr/share/libtool/config.guess . # check if a relative install path was passed FIRSTCHAR=${INSTALL_PREFIX:0:1} if test $FIRSTCHAR != "/" ; then INSTALL_PREFIX="../${INSTALL_PREFIX}" fi # Ensure the support dirs exits mkdir -p build/ppc mkdir -p build/i386
### Tidy up echo "jpeg-build-univ: Cleaning..." rm -f build/ppc/* rm -f build/i386/* if test -f Makefile ; then make distclean >/dev/null ; fi if test -f Makefile.ppc ; then rm -f Makefile.ppc ; fi if test -f Makefile.i386 ; then rm -f Makefile.i386 ; fi
### Configure echo "jpeg-build-univ: Configuring..." env CFLAGS="-O3 -g -isysroot /Developer/SDKs/$SDK_PPC -arch ppc" LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/$SDK_PPC" ./configure --prefix="${INSTALL_PREFIX}" --enable-shared --disable-dependency- tracking >/dev/null
### Create the PPC Makefile echo "jpeg-build-univ: Creating PPC Makefile..." sed -e s/"CC= gcc"/"CC= \${ENVP} gcc"/ \ -e '21i\ ENVP= GCC_VERSION=3.3 MACOSX_DEPLOYMENT_TARGET=10.2 ' \ Makefile > Makefile.ppc
### Create the i386 Makefile echo "jpeg-build-univ: Creating i386 Makefile..." sed -e s/"-arch ppc"/"-arch i386"/ \ -e s/"CC= gcc"/"CC= \${ENVP} gcc"/ \ -e s/"${SDK_PPC}"/"MacOSX10.4u.sdk"/ \ -e '21i\ ENVP= MACOSX_DEPLOYMENT_TARGET=10.4 ' \ Makefile > Makefile.i386 rm ./Makefile
### Generate the i386 code echo "jpeg-build-univ: Generating i386..." cp Makefile.i386 Makefile #make clean >/dev/null #make libjpeg.la >/dev/null make >/dev/null mv .libs/*.a build/i386/
### Generate the PPC code echo "jpeg-build-univ: Generating PPC..." cp Makefile.ppc Makefile make clean >/dev/null #make libjpeg.la >/dev/null make >/dev/null mv .libs/*.a build/ppc/
### Build the universal libs echo "jpeg-build-univ: Building universal library..."
### Build a list of actual libraries cd ./build/ppc FLIST=`ls *.a` LIBLIST="" for f in $FLIST ; do if !(test -L $f) ; then LIBLIST="$LIBLIST $f" fi done cd ../..
for f in $LIBLIST ; do if test -f ./build/i386/$f ; then lipo -create ./build/*/$f -output .libs/$f echo "jpeg-build-univ: `file $f`" echo "jpeg-build-univ: $f is now universal." else echo "jpeg-build-univ: $f is missing from build/i386, no universal binary built." fi done
if test $DO_INSTALL -ne 0 ; then echo "jpeg-build-univ: Installing..." if test $NO_SUDO -ne 0 ; then make install else sudo make install fi else echo "jpeg-build-univ: type \"make install\" to install." fi
### And exit... exit
New description: I found the following script which builds a universal version of libjpeg. It does this by building a PPC and a i386 version and lipo'ing them together. This came from http://www.omnigroup.com/mailman/archive/macosx- dev/2007-May.txt {{{ #!/bin/sh # # jpeg-build-univ # # Script to crteate universal binary version of libjpeg. # # ? 2006 Alan Staniforth # # Version 2.0 # # Invoke thus: # # jpeg-build-univ [-h] | [-v] | [-i] [-p prefix] [-s sdk] [-n] [-k] # # where prefix is the install root for the libraries. # # Version 2.0: # Source download incorporated. # Reverted to using MacOSX10.3.9.sdk as the default SDK for PPC # Targets 10.2 for ppc, 10.4 for i386. ### Set up. # Set trap to allow abort on signal: trap 'echo "Interrupted by signal" >&2; exit' 1 2 3 15 # Defaults BUILD_UNIV_VERS=2.0 INSTALL_PREFIX="/usr/local" SDK_PPC="MacOSX10.3.9.sdk" DO_INSTALL=0 DO_DLOAD=1 NO_SUDO=0 ### Handle optional parameters if test $# -ne 0 ; then ### Options while test $# -gt 0; do case "$1" in -*) FLAG="$1" case "$FLAG" in -h) ### Usage information echo "Usage: jpeg-build-univ [-h]" echo "Usage: jpeg-build-univ [-v]" echo "Usage: jpeg-build-univ [-i] [-p prefix] [-s sdk]" echo "" echo "Options:" echo " -h : Print this usage summary." echo " -v : Print tool version." echo " -i : Install as well as build." echo " -k : Skip download of source." echo " -n : Don't use sudo when installing." echo " -p prefix : install root for the built libraries and support" echo " files. Default is /usr/local" echo " -s sdk : the Mac OS X SDK you want GCC to use for PPC code. " echo " Default is MacOSX10.3.9.sdk" echo "" exit ;; -v) ### version echo "$BUILD_UNIV_VERS" ;; -p) ### install prefix specified shift if test "${1##*/}" = "" ; then INSTALL_PREFIX="${1%*/}" else INSTALL_PREFIX="${1}" fi if !(test -d "${INSTALL_PREFIX}") ; then echo "${INSTALL_PREFIX} does not exist or is not a directory" exit fi ;; -s) ### ppc sdk specified shift SDK_PPC="${1}" ;; -i) ### install the built libray and headers (make can't be used) DO_INSTALL=1 ;; -n) ### No sudo NO_SUDO=1 ;; -k) ### skip download DO_DLOAD=0 ;; -*) echo "Usage: "$1" not understood!" echo "Use jpeg-build-univ -h for usage information" break ;; esac ;; esac shift done fi ### Get the source: if test $DO_DLOAD -ne 0 ; then ### Download source from uunet. echo "jpeg-build-univ: Getting the libjpeg source..." curl ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz -o "jpegsrc.v6b.tar.gz" else echo "jpeg-build-univ: Skipping source download..." fi ### Extract the source: echo "jpeg-build-univ: Expanding the source tarball..." tar -zxpf jpegsrc.v6b.tar.gz ### Do set-up echo "jpeg-build-univ: Setting up..." # Change to the directory cd jpeg-6b cp /usr/share/libtool/config.sub . cp /usr/share/libtool/config.guess . # check if a relative install path was passed FIRSTCHAR=${INSTALL_PREFIX:0:1} if test $FIRSTCHAR != "/" ; then INSTALL_PREFIX="../${INSTALL_PREFIX}" fi # Ensure the support dirs exits mkdir -p build/ppc mkdir -p build/i386 ### Tidy up echo "jpeg-build-univ: Cleaning..." rm -f build/ppc/* rm -f build/i386/* if test -f Makefile ; then make distclean >/dev/null ; fi if test -f Makefile.ppc ; then rm -f Makefile.ppc ; fi if test -f Makefile.i386 ; then rm -f Makefile.i386 ; fi ### Configure echo "jpeg-build-univ: Configuring..." env CFLAGS="-O3 -g -isysroot /Developer/SDKs/$SDK_PPC -arch ppc" LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/$SDK_PPC" ./configure --prefix="${INSTALL_PREFIX}" --enable-shared --disable-dependency-tracking
/dev/null
### Create the PPC Makefile echo "jpeg-build-univ: Creating PPC Makefile..." sed -e s/"CC= gcc"/"CC= \${ENVP} gcc"/ \ -e '21i\ ENVP= GCC_VERSION=3.3 MACOSX_DEPLOYMENT_TARGET=10.2 ' \ Makefile > Makefile.ppc ### Create the i386 Makefile echo "jpeg-build-univ: Creating i386 Makefile..." sed -e s/"-arch ppc"/"-arch i386"/ \ -e s/"CC= gcc"/"CC= \${ENVP} gcc"/ \ -e s/"${SDK_PPC}"/"MacOSX10.4u.sdk"/ \ -e '21i\ ENVP= MACOSX_DEPLOYMENT_TARGET=10.4 ' \ Makefile > Makefile.i386 rm ./Makefile ### Generate the i386 code echo "jpeg-build-univ: Generating i386..." cp Makefile.i386 Makefile #make clean >/dev/null #make libjpeg.la >/dev/null make >/dev/null mv .libs/*.a build/i386/ ### Generate the PPC code echo "jpeg-build-univ: Generating PPC..." cp Makefile.ppc Makefile make clean >/dev/null #make libjpeg.la >/dev/null make >/dev/null mv .libs/*.a build/ppc/ ### Build the universal libs echo "jpeg-build-univ: Building universal library..." ### Build a list of actual libraries cd ./build/ppc FLIST=`ls *.a` LIBLIST="" for f in $FLIST ; do if !(test -L $f) ; then LIBLIST="$LIBLIST $f" fi done cd ../.. for f in $LIBLIST ; do if test -f ./build/i386/$f ; then lipo -create ./build/*/$f -output .libs/$f echo "jpeg-build-univ: `file $f`" echo "jpeg-build-univ: $f is now universal." else echo "jpeg-build-univ: $f is missing from build/i386, no universal binary built." fi done if test $DO_INSTALL -ne 0 ; then echo "jpeg-build-univ: Installing..." if test $NO_SUDO -ne 0 ; then make install else sudo make install fi else echo "jpeg-build-univ: type \"make install\" to install." fi ### And exit... exit }}} -- Ticket URL: <http://trac.macports.org/ticket/12504#comment:7> MacPorts <http://www.macports.org/> Ports system for Mac OS