Back in 2008, I was working for Ames Labratory developing a cross-platform wxWidgets application called GamessQ. One of the problems with developing on MacOS is that you can’t really test your your application unless it is in a bundle. If you’re doing things the Apple way with XCode, this isn’t a problem because XCodw automatically builds a bundle for you. However, due to the cross-platform nature of the application, I was using Autotools for my build system. I needed to find a way to make Autotools build my bundle.
A MacOS app bundle is just a folder named something.app
containing your executables, loadable resources, and a few meta-data files in a structured folder hierarchy. The executables, built libraries, meta-data files, and resources can be easily added to the bundle by simply giving Autotools the right install paths and running make install
. The real issue is gathering up all of the external libraries your code is using. Since it’s frequently useful to delete the entire bundle and rebuild it, I wanted a way to do this automatically. My solution was a piece of unfortunately painful shell code that uses the MacOS otool
and install_name_tool
utilities to recursively find all library dependencies that are not installed system-wide and collect them into the bundle.
Fortunately, GamessQ is distributed under version 3 of the GPL, so you can go look at its source code if you’d like. The app bundling script itself can be found here. There are a few other neat things in GamessQ you may want to check out such as pausing and resuming processes on Windows.