Equinox2000
Equinox2000

Reputation: 576

How to use pkgbuild to create a kext installer from within Xcode

I understand PackageMaker is now deprecated. We're now supposed to use pkgbuild/productbuild.

However, I can't seem to find an example for creating an installer for a kext. I was hoping to build the package as part of a build step from my kext Xcode project. So any bash/script files would be great.

Upvotes: 2

Views: 2993

Answers (1)

pmdj
pmdj

Reputation: 23428

This answer is a seriously good guide for the general case.

For a kext specifically, after the Product -> Archive step, to generate the component plist, I found that I needed to 'cd' into the built archive package directory:

cd ~/Library/Developer/Xcode/Archives/2013-12-22/my-kext\ 22-12-2013\ 22.57.xcarchive

Then, the pkgbuild --analyze step looks like this:

pkgbuild --analyze --root ./Products/ my-kext.plist

The produced plist should contain a sensible-looking install destination for your kext under the RootRelativeBundlePath key. (typically /System/Library/Extensions/my.kext, or if codesigned and for 10.9+ it should be /Library/Extensions/my.kext) If not, fix the install location for your kext target in Xcode.

The main thing to watch out for when installing kexts is to get permissions right and to refresh the kext cache. pkgbuild seems to install the kext as root by default, so that's good. To force refreshing the kext cache, you need to update the modified time on /System/Library/Extensions (or /Library/Extensions if that's where you're installing to). You want to do this after your kext has been fully installed, so you'll need a postinstall script. Create a directory for it, e.g. ./scripts and create a file called 'postinstall' with the contents:

#!/bin/sh
touch /System/Library/Extensions

Then make it executable:

chmod +x postinstall

You can now build a generic package for your kext using:

pkgbuild --root ./Products/ --scripts ./scripts/ --component-plist my-kext.plist my-kext.pkg

For customisation, codesigning, etc., follow the instructions in catlan's linked answer - you can't beat them!

Upvotes: 4

Related Questions