Skip to content

Instantly share code, notes, and snippets.

@jvcleave
Forked from dulacp/libpng.sh
Created January 1, 2017 05:49
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jvcleave/9d78de9bb27434bde2b0c3a1af355d9c to your computer and use it in GitHub Desktop.
Save jvcleave/9d78de9bb27434bde2b0c3a1af355d9c to your computer and use it in GitHub Desktop.
Download & Compile Libpng for iOS (all architectures)
# Builds a Libpng framework for the iPhone and the iPhone Simulator.
# Creates a set of universal libraries that can be used on an iPhone and in the
# iPhone simulator. Then creates a pseudo-framework to make using libpng in Xcode
# less painful.
#
# To configure the script, define:
# IPHONE_SDKVERSION: iPhone SDK version (e.g. 8.1)
#
# Then go get the source tar.bz of the libpng you want to build, shove it in the
# same directory as this script, and run "./libpng.sh". Grab a cuppa. And voila.
#===============================================================================
: ${LIB_VERSION:=1.6.27}
# Current iPhone SDK
: ${IPHONE_SDKVERSION:=`xcodebuild -showsdks | grep iphoneos | egrep "[[:digit:]]+\.[[:digit:]]+" -o | tail -1`}
# Specific iPhone SDK
# : ${IPHONE_SDKVERSION:=8.1}
: ${XCODE_ROOT:=`xcode-select -print-path`}
: ${TARBALLDIR:=`pwd`}
: ${SRCDIR:=`pwd`/src}
: ${IOSBUILDDIR:=`pwd`/ios/build}
: ${OSXBUILDDIR:=`pwd`/osx/build}
: ${PREFIXDIR:=`pwd`/ios/prefix}
: ${IOSFRAMEWORKDIR:=`pwd`/ios/framework}
: ${OSXFRAMEWORKDIR:=`pwd`/osx/framework}
LIB_TARBALL=$TARBALLDIR/libpng-$LIB_VERSION.tar.xz
LIB_SRC=$SRCDIR/libpng-${LIB_VERSION}
#===============================================================================
ARM_DEV_CMD="xcrun --sdk iphoneos"
SIM_DEV_CMD="xcrun --sdk iphonesimulator"
#===============================================================================
# Functions
#===============================================================================
abort()
{
echo
echo "Aborted: $@"
exit 1
}
doneSection()
{
echo
echo "================================================================="
echo "Done"
echo
}
#===============================================================================
cleanEverythingReadyToStart()
{
echo Cleaning everything before we start to build...
rm -rf iphone-build iphonesim-build
rm -rf $IOSBUILDDIR
rm -rf $PREFIXDIR
rm -rf $IOSFRAMEWORKDIR/$FRAMEWORK_NAME.framework
doneSection
}
#===============================================================================
downloadLibpng()
{
if [ ! -s $LIB_TARBALL ]; then
echo "Downloading libpng ${LIB_VERSION}"
curl -L -o $LIB_TARBALL http://sourceforge.net/projects/libpng/files/libpng16/${LIB_VERSION}/libpng-${LIB_VERSION}.tar.xz
fi
doneSection
}
#===============================================================================
unpackLibpng()
{
[ -f "$LIB_TARBALL" ] || abort "Source tarball missing."
echo Unpacking libpng into $SRCDIR...
[ -d $SRCDIR ] || mkdir -p $SRCDIR
[ -d $LIB_SRC ] || ( cd $SRCDIR; tar xfj $LIB_TARBALL )
[ -d $LIB_SRC ] && echo " ...unpacked as $LIB_SRC"
doneSection
}
#===============================================================================
buildLibpngForIPhoneOS()
{
export CC=$XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
export CC_BASENAME=clang
export CXX=$XCODE_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
export CXX_BASENAME=clang++
# avoid the `LDFLAGS` env to include the homebrew Cellar
export LDFLAGS=""
cd $LIB_SRC
echo Building Libpng for iPhoneSimulator
export CFLAGS="-O3 -arch i386 -arch x86_64 -isysroot $XCODE_ROOT/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator${IPHONE_SDKVERSION}.sdk -mios-simulator-version-min=${IPHONE_SDKVERSION} -Wno-error-implicit-function-declaration"
make distclean
./configure --prefix=$PREFIXDIR/iphonesim-build --disable-dependency-tracking --enable-static=yes --enable-shared=no
make
make install
doneSection
echo Building Libpng for iPhone
export CFLAGS="-O3 -arch armv7 -arch armv7s -arch arm64 -isysroot $XCODE_ROOT/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${IPHONE_SDKVERSION}.sdk -mios-version-min=${IPHONE_SDKVERSION}"
make distclean
./configure --host=arm-apple-darwin --prefix=$PREFIXDIR/iphone-build --disable-dependency-tracking --enable-static=yes --enable-shared=no
make
make install
doneSection
}
#===============================================================================
scrunchAllLibsTogetherInOneLibPerPlatform()
{
cd $PREFIXDIR
# iOS Device
mkdir -p $IOSBUILDDIR/armv7
mkdir -p $IOSBUILDDIR/armv7s
mkdir -p $IOSBUILDDIR/arm64
# iOS Simulator
mkdir -p $IOSBUILDDIR/i386
mkdir -p $IOSBUILDDIR/x86_64
ALL_LIBS=""
echo Splitting all existing fat binaries...
$ARM_DEV_CMD lipo "iphone-build/lib/libpng.a" -thin armv7 -o $IOSBUILDDIR/armv7/libpng.a
$ARM_DEV_CMD lipo "iphone-build/lib/libpng.a" -thin armv7s -o $IOSBUILDDIR/armv7s/libpng.a
$ARM_DEV_CMD lipo "iphone-build/lib/libpng.a" -thin arm64 -o $IOSBUILDDIR/arm64/libpng.a
$SIM_DEV_CMD lipo "iphonesim-build/lib/libpng.a" -thin i386 -o $IOSBUILDDIR/i386/libpng.a
$SIM_DEV_CMD lipo "iphonesim-build/lib/libpng.a" -thin x86_64 -o $IOSBUILDDIR/x86_64/libpng.a
echo Build an universal library
}
#===============================================================================
buildFramework()
{
: ${1:?}
FRAMEWORKDIR=$1
BUILDDIR=$2
VERSION_TYPE=Alpha
FRAMEWORK_NAME=libpng
FRAMEWORK_VERSION=A
FRAMEWORK_CURRENT_VERSION=$LIB_VERSION
FRAMEWORK_COMPATIBILITY_VERSION=$LIB_VERSION
FRAMEWORK_BUNDLE=$FRAMEWORKDIR/$FRAMEWORK_NAME.framework
echo "Framework: Building $FRAMEWORK_BUNDLE from $BUILDDIR..."
rm -rf $FRAMEWORK_BUNDLE
echo "Framework: Setting up directories..."
mkdir -p $FRAMEWORK_BUNDLE
mkdir -p $FRAMEWORK_BUNDLE/Versions
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Resources
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Headers
mkdir -p $FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Documentation
echo "Framework: Creating symlinks..."
ln -s $FRAMEWORK_VERSION $FRAMEWORK_BUNDLE/Versions/Current
ln -s Versions/Current/Headers $FRAMEWORK_BUNDLE/Headers
ln -s Versions/Current/Resources $FRAMEWORK_BUNDLE/Resources
ln -s Versions/Current/Documentation $FRAMEWORK_BUNDLE/Documentation
ln -s Versions/Current/$FRAMEWORK_NAME $FRAMEWORK_BUNDLE/$FRAMEWORK_NAME
FRAMEWORK_INSTALL_NAME=$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/$FRAMEWORK_NAME
echo "Lipoing library into $FRAMEWORK_INSTALL_NAME..."
$ARM_DEV_CMD lipo -create $BUILDDIR/*/libpng.a -o "$FRAMEWORK_INSTALL_NAME" || abort "Lipo $1 failed"
echo "Framework: Copying includes..."
cp -r $PREFIXDIR/iphone-build/include/* $FRAMEWORK_BUNDLE/Headers/
echo "Framework: Creating plist..."
cat > $FRAMEWORK_BUNDLE/Resources/Info.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${FRAMEWORK_NAME}</string>
<key>CFBundleIdentifier</key>
<string>org.libpng</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${FRAMEWORK_CURRENT_VERSION}</string>
</dict>
</plist>
EOF
doneSection
}
#===============================================================================
# Execution starts here
#===============================================================================
mkdir -p $IOSBUILDDIR
# cleanEverythingReadyToStart #may want to comment if repeatedly running during dev
echo "LIB_VERSION: $LIB_VERSION"
echo "LIB_SRC: $LIB_SRC"
echo "IOSBUILDDIR: $IOSBUILDDIR"
echo "PREFIXDIR: $PREFIXDIR"
echo "IOSFRAMEWORKDIR: $IOSFRAMEWORKDIR"
echo "IPHONE_SDKVERSION: $IPHONE_SDKVERSION"
echo "XCODE_ROOT: $XCODE_ROOT"
echo
downloadLibpng
unpackLibpng
buildLibpngForIPhoneOS
scrunchAllLibsTogetherInOneLibPerPlatform
buildFramework $IOSFRAMEWORKDIR $IOSBUILDDIR
echo "Completed successfully"
#===============================================================================
@jvcleave
Copy link
Author

jvcleave commented Jan 1, 2017

I was able to compile 1.6.27 but in order to get around zlib errors I removed

# Include the zlib header so that the defaults below are known
@#  include <zlib.h>

from:
scripts/pnglibconf.dfa

@jvcleave
Copy link
Author

Simulator is not built under Sierra with errors

configure: error: cannot run C compiled programs.

@nodag
Copy link

nodag commented Jul 9, 2017

For the simulator, you should also add --host=arm-apple-darwin to the ./configure line of the simulator.

However, it still does not build for me due to some arm neon related compiler problem:
libtool: compile: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -DHAVE_CONFIG_H -I. -O3 -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk -mios-simulator-version-min=10.3 -Wno-error-implicit-function-declaration -c arm/filter_neon.S -o arm/filter_neon.o arm/../pngpriv.h:476:24: error: unexpected token in argument list typedef unsigned long png_ptruint; ^ make[1]: *** [arm/filter_neon.lo] Error 1 make: *** [all] Error 2

Update: seems to be a bug in libpng 1.6.30. See:
https://sourceforge.net/p/libpng/bugs/266/

@JarlenJohn
Copy link

I was able to compile 1.6.27 but in order to get around zlib errors I removed

# Include the zlib header so that the defaults below are known
@#  include <zlib.h>

from: scripts/pnglibconf.dfa

I compile on mac m1, first I delete arch arm7, armv7s, then same error as you, It help me very much!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment