On Mac OS X frameworks provide a convenient way to package the dynamic libraries and header files into a single directory structure making it easier to include them in Xcode projects. Apple does not allow dynamic libraries (other than ones they provide) to be used with iOS so it may appear the third-party frameworks are not possible, however it is possible to create a pseudo-framework using a static library giving many of benefits of a real framework. In this tutorial you will combine the static libraries you created in the previous tutorial in a single pseudo-framework that will contain binaries for both the device and simulator.
Creating Ogg.framework
First ensure that you are in the directory where you built libogg.
cd $IDZ_BUILD_ROOT/libogg/1.3.0
Now make a directory to hold the framework files.
mkdir Ogg.framework
Copy the header file from one of the install directories to the Headers sub-directory within the framework.
cp -R install-iPhoneSimulator-i386/include/ogg Ogg.framework/Headers
Finally create a fat static library in the framework directory with the same name as the framework
lipo -create -output Ogg.framework/Ogg \ -arch i386 install-iPhoneSimulator-i386/lib/libogg.a \ -arch armv7 install-iPhoneOS-armv7/lib/libogg.a
A script for creating frameworks idz_fw
The steps in the above section can be generalized and made into a script. Using a text editor create the file $IDZ_BUILD_ROOT/bin/idz_fw with the following contents:
#!/bin/bash
#
# Script to create a pseudo-framework
#
idz_usage()
{
IDZ_SCRIPT_NAME=`basename $0`
echo "Usage: $IDZ_SCRIPT_NAME <name> <lib_name> <header_dir>"
exit 1
}
IDZ_NAME=$1 # Name of the framework (e.g. Ogg)
IDZ_LIBNAME=$2 # Name of .a file (e.g. libogg.a)
IDZ_HEADERS_SRC=$3 # Name of the directory to copy to Headers
IDZ_FW=$IDZ_NAME.framework
IDZ_HEADERS=$IDZ_FW/Headers
if [ -e $IDZ_FW ] ; then
echo "Backing up existing framework to $IDZ_FW.bak"
mv $IDZ_FW $IDZ_FW.bak
fi
mkdir -p $IDZ_FW
cp -R $IDZ_HEADERS_SRC $IDZ_HEADERS
for IDZ_ARCH in i386 armv6 armv7 armv7s; do
case $IDZ_ARCH in
i386 )
IDZ_PLATFORM=iPhoneSimulator
;;
armv6 | armv7 | armv7s )
IDZ_PLATFORM=iPhoneOS
;;
* )
echo "Unrecognised architecture $IDZ_ARCH"
idz_usage
;;
esac
IDZ_INSTALL_DIR=install-$IDZ_PLATFORM-$IDZ_ARCH
IDZ_LIB=$IDZ_INSTALL_DIR/lib/$IDZ_LIBNAME
if [ -e $IDZ_LIB ] ; then
IDZ_LIPO_ARCH="$IDZ_LIPO_ARCH -arch $IDZ_ARCH $IDZ_LIB"
fi
done
lipo -create -output $IDZ_FW/$IDZ_NAME $IDZ_LIPO_ARCH
Don’t forget to make it executable.
The arguments to this script are the framework name without the .framework extension, the library name and directory containing the include files to be copied to Headers. The script assumes the build naming convention used in the previous tutorial.
Using this script all the steps of the previous section can accomplished with the command:
idz_fw Ogg libogg.a install-iPhoneSimulator/include/ogg
The Ogg.framework is now ready to use, however without a codec it is not all that interesting. In the next tutorial you will use the scripts developed so far to compile libvorbis an open source audio codec.