Opened 17 years ago

Closed 16 years ago

Last modified 15 years ago

#12504 closed enhancement (fixed)

RFE: a possible build process for a universal libjpeg

Reported by: nmb@… Owned by: waqar@…
Priority: Normal Milestone:
Component: ports Version: 1.5.2
Keywords: universal Cc: nmb@…, waqar@…, ryandesign (Ryan Carsten Schmidt), gtoso@…, mww@…
Port:

Description (last modified by jmpp@…)

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

Attachments (1)

patch-patch-makefile.cfg (975 bytes) - added by mww@… 16 years ago.
Patch for patch-makefile.cfg for universal build

Download all attachments as: .zip

Change History (9)

comment:1 Changed 17 years ago by nox@…

Version: 1.5.0

First, someone should really modify the description of this ticket. Second, do have you authorization from the script author to distribute it? Is the script license compatible with ours?

comment:2 Changed 17 years ago by ryandesign (Ryan Carsten Schmidt)

Cc: nmb@… added
Milestone: Port Enhancements

comment:3 Changed 17 years ago by ryandesign (Ryan Carsten Schmidt)

Cc: ryandesign@… gtoso@… added

See also #12320 which simply reports that the +universal variant currently does not work. See also a mailing list thread with a different potential solution.

comment:4 Changed 16 years ago by waqar@…

Status: newassigned

Changed 16 years ago by mww@…

Attachment: patch-patch-makefile.cfg added

Patch for patch-makefile.cfg for universal build

comment:5 Changed 16 years ago by mww@…

Cc: mww@… added
Keywords: universal added
Version: 1.5.2

here you go: This makes the

reinplace   "s|(prefix)/man|(prefix)/share/man|g" makefile.cfg

line superfluous and makes universal builds work.

comment:6 Changed 16 years ago by ryandesign (Ryan Carsten Schmidt)

Resolution: fixed
Status: assignedclosed

I committed mww's patch in r32007 because it's straightforward and it works for me. Hope the maintainer doesn't mind.

comment:7 Changed 16 years ago by jmpp@…

Description: modified (diff)

comment:8 Changed 15 years ago by (none)

Milestone: Port Enhancements

Milestone Port Enhancements deleted

Note: See TracTickets for help on using tickets.