19bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#!/bin/bash 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# This script performs all of the steps needed to build a 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# universal binary libcurl.framework for Mac OS X 10.4 or greater. 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# Hendrik Visage: 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# Generalizations added since Snowleopard (10.6) do not include 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# the 10.4u SDK. 89bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# 99bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# Also note: 109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# 10.5 is the *ONLY* SDK that support PPC64 :( -- 10.6 do not have ppc64 support 119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#If you need to have PPC64 support then change below to 1 129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsPPC64_NEEDED=0 13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# Apple does not support building for PPC anymore in Xcode 4 and later. 14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# If you're using Xcode 3 or earlier and need PPC support, then change 15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# the setting below to 1 16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETPPC_NEEDED=0 179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# For me the default is to develop for the platform I am on, and if you 199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#desire compatibility with older versions then change USE_OLD to 1 :) 209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsUSE_OLD=0 219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsVERSION=`/usr/bin/sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' include/curl/curlver.h` 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsFRAMEWORK_VERSION=Versions/Release-$VERSION 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#I also wanted to "copy over" the system, and thus the reason I added the 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# version to Versions/Release-7.20.1 etc. 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# now a simple rsync -vaP libcurl.framework /Library/Frameworks will install it 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# and setup the right paths to this version, leaving the system version 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels# "intact", so you can "fix" it later with the links to Versions/A/... 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 31e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETDEVELOPER_PATH=`xcode-select --print-path` 32e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# Around Xcode 4.3, SDKs were moved from the Developer folder into the 33e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET# MacOSX.platform folder 34e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETif test -d "$DEVELOPER_PATH/Platforms/MacOSX.platform/Developer/SDKs"; then 35e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET SDK_PATH="$DEVELOPER_PATH/Platforms/MacOSX.platform/Developer/SDKs" 36e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETelse 37e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET SDK_PATH="$DEVELOPER_PATH/SDKs"; 38e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETfi 39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETOLD_SDK=`ls $SDK_PATH|head -1` 40e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETNEW_SDK=`ls -r $SDK_PATH|head -1` 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsif test "0"$USE_OLD -gt 0 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsthen 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels SDK32=$OLD_SDK 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelselse 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels SDK32=$NEW_SDK 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsfi 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsMACVER=`echo $SDK32|sed -e s/[a-zA-Z]//g -e s/.\$//` 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETSDK32_DIR=$SDK_PATH/$SDK32 529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsMINVER32='-mmacosx-version-min='$MACVER 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETif test $PPC_NEEDED -gt 0; then 54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ARCHES32='-arch i386 -arch ppc' 55e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETelse 56e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ARCHES32='-arch i386' 57e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETfi 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsif test $PPC64_NEEDED -gt 0 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsthen 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels SDK64=10.5 629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ARCHES64='-arch x86_64 -arch ppc64' 63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET SDK64=`ls $SDK_PATH|grep 10.5|head -1` 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelselse 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ARCHES64='-arch x86_64' 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels #We "know" that 10.4 and earlier do not support 64bit 67e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET OLD_SDK64=`ls $SDK_PATH|egrep -v "10.[0-4]"|head -1` 688f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo NEW_SDK64=`ls -r $SDK_PATH|egrep -v "10.[0-4][^0-9]" | head -1` 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if test $USE_OLD -gt 0 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels then 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels SDK64=$OLD_SDK64 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels SDK64=$NEW_SDK64 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fi 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsfi 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETSDK64_DIR=$SDK_PATH/$SDK64 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsMACVER64=`echo $SDK64|sed -e s/[a-zA-Z]//g -e s/.\$//` 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsMINVER64='-mmacosx-version-min='$MACVER64 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsif test ! -z $SDK32; then 839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "----Configuring libcurl for 32 bit universal framework..." 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels make clean 85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \ 86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET CFLAGS="-Os -isysroot $SDK32_DIR $ARCHES32" \ 87e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET LDFLAGS="-Wl,-syslibroot,$SDK32_DIR $ARCHES32 -Wl,-headerpad_max_install_names" \ 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CC=$CC 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "----Building 32 bit libcurl..." 91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET make -j `sysctl -n hw.logicalcpu_max` 929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "----Creating 32 bit framework..." 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rm -r libcurl.framework 959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Resources 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl 97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET install_name_tool -id @rpath/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl 989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/${FRAMEWORK_VERSION}/Resources/Info.plist 999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl 1009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cp include/curl/*.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl 1019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pushd libcurl.framework 1029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ln -fs ${FRAMEWORK_VERSION}/libcurl libcurl 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ln -fs ${FRAMEWORK_VERSION}/Resources Resources 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ln -fs ${FRAMEWORK_VERSION}/Headers Headers 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cd Versions 106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ln -fs $(basename "${FRAMEWORK_VERSION}") Current 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 108e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET echo Testing for SDK64 1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if test -d $SDK64_DIR; then 1109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo entering... 1119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels popd 1129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels make clean 1139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "----Configuring libcurl for 64 bit universal framework..." 114e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ./configure --disable-dependency-tracking --disable-static --with-gssapi --with-darwinssl \ 115e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET CFLAGS="-Os -isysroot $SDK64_DIR $ARCHES64" \ 116e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET LDFLAGS="-Wl,-syslibroot,$SDK64_DIR $ARCHES64 -Wl,-headerpad_max_install_names" \ 1179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CC=$CC 1189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "----Building 64 bit libcurl..." 120e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET make -j `sysctl -n hw.logicalcpu_max` 1219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "----Appending 64 bit framework to 32 bit framework..." 1239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 124e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET install_name_tool -id @rpath/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 1259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cp libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 1269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pwd 1279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels lipo libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 -create -output libcurl.framework/${FRAMEWORK_VERSION}/libcurl 1289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels rm libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 1299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cp libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild32.h 1309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cp include/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild64.h 1319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels cat >libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h <<EOF 1329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef __LP64__ 1339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "curl/curlbuild64.h" 1349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 1359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "curl/curlbuild32.h" 1369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 1379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas EckelsEOF 1389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fi 1399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pwd 1419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels lipo -info libcurl.framework/${FRAMEWORK_VERSION}/libcurl 1429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "libcurl.framework is built and can now be included in other projects." 1439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "Copy libcurl.framework to your bundle's Contents/Frameworks folder, ~/Library/Frameworks or /Library/Frameworks." 1449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelselse 1459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels echo "Building libcurl.framework requires Mac OS X 10.4 or later with the MacOSX10.4/5/6 SDK installed." 1469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsfi 147