This one is a relatively simple mechanism for automatic build numbers. This increments the build number every time a successful build is made in Xcode.
Step 1: Create a new Run Script
In the target setting, add a new Run Script after the Link Binary With Libraries. Change the shell to /usr/bin/perl -w and paste the following script:
# Auto increment version number from build common file use strict; die "$0: Must be run from Xcode" unless $ENV{"BUILT_PRODUCTS_DIR"}; # Get the current revision number and use it to set the CFBundleVersion value open FH, "build.count" or die; my $version = join("",); close(FH); ++$version; print "Build $versionn"; open FH, ">build.count" or die; print FH $version; close(FH); $version = "1.0 ($version)"; # Update info.plist in build product. Use defaults command my $INFO = "$ENV{BUILT_PRODUCTS_DIR}/$ENV{WRAPPER_NAME}/Info"; my @defaults = ( 'defaults', 'write', $INFO, 'CFBundleVersion', "'$version'" ); exec @defaults;
Note: If this is for a MacOS X application instead of an iPhone application, then the third to last line should be:
my $INFO = "$ENV{BUILT_PRODUCTS_DIR}/$ENV{WRAPPER_NAME}/Contents/Info";
Step 2: Create the Build Count file.
Note that this Perl script pulls the version number from a file “build.count” which is at the same directory level as the project file. You should create a file containing the single character “0”.
Step 3: Build
Now you can test to make sure that the CFBundleVersion setting in the Info file is updated to “1.0 (1)”, “1.0 (2)”, etc. (The “1.0 ” part is set by the build script; change there to update the major/minor build numbers, or prefix the build with anything you want.)
This works by incrementing the build number in the build.count file, then using the defaults command-line tool (‘man defaults’ for more) to update the info.plist file after it is copied into the executable bundle.
The original concept came from Red Sweater Blog: Automatic Build Sub-Versioning in Xcode. However, in my case I wanted to do the build version count between check-ins, and we are currently using GIT. (But that’s another horror story.)
Pretty cool trick. One thing you might want to do to throttle the sheer size of the number, without (probably) impacting the usefulness of the build number, is to only increment on Release builds.
Something like:
if [[ ${CONFIGURATION} == “Release” ]]
then
# Your increment script here…
fi
LikeLike
Pingback: Development Chaos Theory » Blog Archive » Automatic build numbers … | IPhoneMate
This is a good script and the use of defaults to modify the plist is inspired. Note that according to the man entry for defaults it is slated to loose its ability to operate on plist files directly.
Unfortunately there is a typo which renders the script almost completely ineffective (it will increment from 0 to 1 and that’s it)!
my $version = join(“”,);
should read
my $version = join(“”,);
Another way to limit the build number would be to click the run script only when installing option in the script panel window. This would only run the script when the deployment build setting was enabled.
LikeLike
It’s not a typo, it’s a rendering issue regarding <FH>
my $version = join(””,);
should read
my $version = join(””,<FH>);
LikeLike
As this this script can clobber your app for standard users/non owners. On 10.6 at least using defaults changes the plist permissions to 600. This denies non owners read access to the file and the principal class doesn’t get loaded – hence no launch.
So either fix up the permissions or better use /usr/libexec/PlistBuddy to do the plist manipulation.
see http://davedelong.com/blog/2009/04/15/incrementing-build-numbers-xcode
LikeLike
And so the script evolves.
LikeLike