August 31, 2014
Have you ever been in the situation, when you include two or more dependencies only to find out that there are
duplicates object file on your dependencies and a proprietary library included on your XCode Project? The
proprietary library, say
AFHTTPClient.o from open source AFNetworking version 1.3.0
for example. You want to update it to 1.3.3 but you can’t, you stuck with old version embedded in the proprietary
library. If this situation is familiar to you, then
choc is the right tool for you. Read on.
I’ve been in this situation on my last project maintaining legacy system. It includes proprietary, binary-only libraries from former developer. I’ve successfully migrated the dependencies using amazing CocoaPods. However the proprietary library already includes old versions of Facebook SDK and Google Analytics SDK which doesn’t work and crash the app. If I include the newer libs via CocoaPods, the app can’t be compiled because of duplicate object file name. Thus, this tool was born.
I hacked the tool for a couple of hours, and I came up with the name
choc. It just a wordplay of chocholate and
chop. This tool will remove unneeded object files from a universal library.
How to Install and Use
The tool is written in ruby and installed using gem.
gem install choc rbenv rehash # if you're using RBEnv
To use the tool, just invoke it with your proprietary library as the first parameters and the object list in the
next parameters, for example if you want to remove
choc libProprietary.a JSONKit.o AFHTTPClient.o
and it’ll remove both object files from the lib. If you want to list the object files inside a library, you can do
ar tools included in the XCode.
ar -t libProprietary.a
I learnt ruby in the same day I wrote this tool, so pardon if the code is messy, features are minimal, and unexpected bugs are many. But hey, you can’t always file an issue in the Github Repository. Pull Requests are welcome.