if(($ACT == 'edit' || $ACT == 'preview') && $INFO['editable']){ ?> } else { ?> } ?>
Some handy commandlines for building and deploying applications and libraries on Mac/OSX
Multiple architecture build flags for autoconf projects on OSX:
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH \ CFLAGS="-arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5" \ CXXFLAGS="-arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5" \ LDFLAGS="$CFLAGS" \ ./configure --disable-dependency-tracking
workaround for some buggy configure/libtool scripts:
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH \ CFLAGS="-I/usr/local/include" CXXFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" \ CC="gcc -arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5" \ CXX="gcc -arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5" \ CPP='cpp' CXXCPP='cpp' LDFLAGS="$CFLAGS" \ ./configure --disable-dependency-tracking --enable-shared
for gtk+: set PKG_CONFIG_PATH
./configure --prefix /Users/rgareus/gtk/inst --libdir /Users/rgareus/gtk/inst/lib --disable-static --disable-dependency-tracking CFLAGS="-arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -I/Users/rgareus/gtk/inst/include/" CXXFLAGS="-arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5" LDFLAGS="-arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -L/Users/rgareus/gtk/inst/lib/"
find out compiler defines: eg __ppc, __i386, or __x86_64:
gcc -dM -E - < /dev/null
strace on Mac is called dtruss :)
update library paths:
see also: http://doc.trolltech.com/qq/qq09-mac-deployment.html
for file in $(ls *); do \ echo "$file --"; \ for dest in $(otool -L $file | grep local/| cut -f 1 -d ' '); do\ new=$(basename $dest); \ test "$file" = "$new" || echo "install_name_tool -change $dest $new $file";\ done ;\ done
Debugging/leak detection:
export MallocStackLogging=1 export MallocCheckHeapStart=1000 export MallocCheckHeapEach=100 ./myapp
leaks -nocontext `ps x | grep myapp | grep -v grep | awk '{print $1;}'` | less
auto-update lib-paths aka post-install script:
export INSTALLED=""
export LIBS_PATH="$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks"
mkdir -p $LIBS_PATH
export TARGET="$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/MacOS/$PRODUCT_NAME"
follow_dependencies () {
libname=$1
cd "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks"
dependencies=`otool -arch all -L "$libname" | egrep '\/(opt|usr)\/local\/lib' | awk '{print $1}'`
for l in $dependencies; do
depname=`basename $l`
deppath=`dirname $l`
if [ ! -f "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks/$depname" ]; then
deploy_lib $depname "$deppath"
fi
done
}
update_links () {
libname=$1
libpath=$2
for n in `ls $LIBS_PATH/*`; do
install_name_tool \
-change "$libpath/$libname" \
@executable_path/../Frameworks/$libname \
"$n"
done
}
deploy_lib () {
libname=$1
libpath=$2
check=`echo $INSTALLED | grep $libname`
if [ "X$check" = "X" ]; then
if [ ! -f "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks/$libname" ]; then
cp -f "$libpath/$libname" "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks/$libname"
install_name_tool \
-id @executable_path/../Frameworks/$libname \
"$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Contents/Frameworks/$libname"
follow_dependencies $libname
fi
export INSTALLED="$INSTALLED $libname"
fi
update_links $libname $libpath
}
update_executable() {
LIBS=`otool -arch all -L "$TARGET" | egrep '\/(opt|usr)\/local\/lib' | awk '{print $1}'`
for l in $LIBS; do
libname=`basename $l`
libpath=`dirname $l`
deploy_lib $libname $libpath
echo "install_name_tool -change $libpath/$libname @executable_path/../Frameworks/$libname \"$TARGET\""
install_name_tool \
-change $libpath/$libname \
@executable_path/../Frameworks/$libname \
"$TARGET"
done
}
update_executable
cd $LIBS_PATH && MORELIBS=`otool -arch all -L * | egrep '\/(opt|usr)\/local\/lib' | awk '{print $1}'` && cd -
while [ "X$MORELIBS" != "X" ]; do
for l in $MORELIBS; do
libname=`basename $l`
libpath=`dirname $l`
deploy_lib "$libname" "$libpath"
done
cd $LIBS_PATH && MORELIBS=`otool -arch all -L * | egrep '\/(opt|usr)\/local\/lib' | awk '{print $1}'` && cd -
done
update_executable
Roll a DMG:
#!/bin/sh
VERSION=2.0
DMGFILE=/tmp/oggzcap-$VERSION.dmg
echo $DMGFILE
BUILD=build/Release/OggZCap.app
xcodebuild clean \
&& xcodebuild \
||exit
#roll a DMG
TMPFILE=/tmp/ogztmp.dmg
MNTPATH=/tmp/mnt/
VOLNAME=OggZCap
mkdir -p $MNTPATH
if [ -e $TMPFILE -o -e $DMGFILE -o ! -d $MNTPATH ]; then
echo "could not make DMG.."
exit;
fi
hdiutil create -megabytes 100 $TMPFILE
DiskDevice=$(hdid -nomount "${TMPFILE}" | grep Apple_HFS | cut -f 1 -d ' ')
newfs_hfs -v "${VOLNAME}" "${DiskDevice}"
mount -t hfs "${DiskDevice}" "${MNTPATH}"
cp -r ${BUILD} ${MNTPATH}/
ln -s /Applications ${MNTPATH}/Applications
# Umount the image
umount "${DiskDevice}"
hdiutil eject "${DiskDevice}"
# Create a read-only version, use zlib compression
hdiutil convert -format UDZO "${TMPFILE}" -o "${DMGFILE}"
# Delete the temporary files
rm $TMPFILE
rmdir $MNTPATH