When updating version numbers in Info.plist files, also update those of the GrowlSafariLoader bundle.
1 ##########################
3 ### * Set VERSION and BETA below. BETA should be TRUE or FALSE.
4 ### * Update the version struct in Core/Source/GrowlApplicationController.m
5 ### (needed for proper version checking)
6 ### * Update the version string in Extras/growlnotify/main.m
12 #########################
14 # No changes should be needed below this line
16 #########################
17 RELEASE_FILENAME=Growl-$(VERSION)
18 RELEASE_NAME="Growl-$(VERSION)"
19 RELEASE_SDK_NAME="Growl $(VERSION) SDK"
23 GROWL_DIR=$(BUILD_DIR)/Growl
24 SDK_DIR=$(BUILD_DIR)/SDK
26 BUILDFLAGS="BUILDCONFIGURATION=$(BUILDSTYLE)"
27 PRODUCT_DIR=$(shell defaults read com.apple.Xcode PBXApplicationwideBuildSettings 2> /dev/null | cat > XcodeBuildSettings.plist && defaults read $PWD/XcodeBuildSettings SYMROOT 2> /dev/null; rm XcodeBuildSettings.plist)
28 ifeq ($(strip $(PRODUCT_DIR)),)
29 GROWL_BUILD_DIR=$(SRC_DIR)/build/$(BUILDSTYLE)
30 GROWLNOTIFY_BUILD_DIR=$(SRC_DIR)/Extras/growlnotify/build/$(BUILDSTYLE)
31 GROWLTUNES_BUILD_DIR=$(SRC_DIR)/Extras/GrowlTunes/build/$(BUILDSTYLE)
32 HARDWAREGROWLER_BUILD_DIR=$(SRC_DIR)/Extras/HardwareGrowler/build/$(BUILDSTYLE)
33 GROWLMAIL_BUILD_DIR=$(SRC_DIR)/Extras/GrowlMail/build/$(BUILDSTYLE)
34 GROWLSAFARI_BUILD_DIR=$(SRC_DIR)/Extras/GrowlSafari/build/$(BUILDSTYLE)
36 TARGET_BUILD_DIR=$(PRODUCT_DIR)/$(BUILDSTYLE)
37 GROWL_BUILD_DIR=$(TARGET_BUILD_DIR)
38 GROWLNOTIFY_BUILD_DIR=$(TARGET_BUILD_DIR)
39 GROWLTUNES_BUILD_DIR=$(TARGET_BUILD_DIR)
40 HARDWAREGROWLER_BUILD_DIR=$(TARGET_BUILD_DIR)
41 GROWLMAIL_BUILD_DIR=$(TARGET_BUILD_DIR)
42 GROWLSAFARI_BUILD_DIR=$(TARGET_BUILD_DIR)
44 DSYM_DIR=$(BUILD_DIR)/Growl-dSYM-$(VERSION)
45 PACKAGE_MAKER=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
48 #########################
50 .PHONY: all assertnochanges assertnoconflicts compile clean release source version
52 all: assertnochanges version compile release
53 all-withlocalchanges: assertnoconflicts version compile release
56 if [[ 0 -ne `hg st | wc -l` ]]; then \
57 echo 'You have local changes. Please do not build releases from an unclean working copy. You must revert the changes, commit them, or clone your repository and build from that.' 1>&2; \
61 if [[ 0 -ne `hg resolve --list | grep -E '^U' | wc -l` ]]; then \
62 echo 'You have conflicts in your working copy. You will not be able to build until these are resolved. Also, remember that even after you have fixed all conflict marks, you must use "hg resolve" to re-try your last update or merge; otherwise, hg will still believe the files are conflicted.' 1>&2; \
67 @# update the CFBundleVersion
68 defaults write $(SRC_DIR)/Core/Resources/GrowlHelperApp-Info CFBundleVersion '$(VERSION)'
69 defaults write $(SRC_DIR)/Framework/Resources/Growl-WithInstaller.framework-Info CFBundleVersion '$(VERSION)'
70 defaults write $(SRC_DIR)/Framework/Resources/Growl.framework-Info CFBundleVersion '$(VERSION)'
71 defaults write $(SRC_DIR)/Core/Resources/Info CFBundleVersion '$(VERSION)'
72 defaults write $(SRC_DIR)/Extras/GrowlCode/Info CFBundleVersion '$(VERSION)'
73 defaults write $(SRC_DIR)/Extras/GrowlMail/Info CFBundleVersion '$(VERSION)'
74 defaults write $(SRC_DIR)/Extras/GrowlSafari/Info CFBundleVersion '$(VERSION)'
75 defaults write $(SRC_DIR)/Extras/GrowlSafari/GrowlSafariLoader-Info CFBundleVersion '$(VERSION)'
76 defaults write $(SRC_DIR)/Extras/GrowlTunes/Info CFBundleVersion '$(VERSION)'
77 defaults write $(SRC_DIR)/Extras/HardwareGrowler/Info CFBundleVersion '$(VERSION)'
78 defaults write $(SRC_DIR)/StatusItem/Resources/MenuExtra-Info CFBundleVersion '$(VERSION)'
80 @# update the CFBundleShortVersionString
81 defaults write $(SRC_DIR)/Core/Resources/GrowlHelperApp-Info CFBundleShortVersionString '$(VERSION)'
82 defaults write $(SRC_DIR)/Framework/Resources/Growl-WithInstaller.framework-Info CFBundleShortVersionString '$(VERSION)'
83 defaults write $(SRC_DIR)/Framework/Resources/Growl.framework-Info CFBundleShortVersionString '$(VERSION)'
84 defaults write $(SRC_DIR)/Core/Resources/Info CFBundleShortVersionString '$(VERSION)'
85 defaults write $(SRC_DIR)/Extras/GrowlCode/Info CFBundleShortVersionString '$(VERSION)'
86 defaults write $(SRC_DIR)/Extras/GrowlMail/Info CFBundleShortVersionString '$(VERSION)'
87 defaults write $(SRC_DIR)/Extras/GrowlSafari/Info CFBundleShortVersionString '$(VERSION)'
88 defaults write $(SRC_DIR)/Extras/GrowlSafari/GrowlSafariLoader-Info CFBundleShortVersionString '$(VERSION)'
89 defaults write $(SRC_DIR)/Extras/GrowlTunes/Info CFBundleShortVersionString '$(VERSION)'
90 defaults write $(SRC_DIR)/Extras/HardwareGrowler/Info CFBundleShortVersionString '$(VERSION)'
91 defaults write $(SRC_DIR)/StatusItem/Resources/MenuExtra-Info CFBundleShortVersionString '$(VERSION)'
93 @# Convert back to XML plist, since defaults creates binary plists
94 plutil -convert xml1 $(SRC_DIR)/Core/Resources/GrowlHelperApp-Info.plist
95 plutil -convert xml1 $(SRC_DIR)/Framework/Resources/Growl-WithInstaller.framework-Info.plist
96 plutil -convert xml1 $(SRC_DIR)/Framework/Resources/Growl.framework-Info.plist
97 plutil -convert xml1 $(SRC_DIR)/Core/Resources/Info.plist
98 plutil -convert xml1 $(SRC_DIR)/Extras/GrowlCode/Info.plist
99 plutil -convert xml1 $(SRC_DIR)/Extras/GrowlMail/Info.plist
100 plutil -convert xml1 $(SRC_DIR)/Extras/GrowlSafari/Info.plist
101 plutil -convert xml1 $(SRC_DIR)/Extras/GrowlSafari/GrowlSafariLoader-Info.plist
102 plutil -convert xml1 $(SRC_DIR)/Extras/GrowlTunes/Info.plist
103 plutil -convert xml1 $(SRC_DIR)/Extras/HardwareGrowler/Info.plist
104 plutil -convert xml1 $(SRC_DIR)/StatusItem/Resources/MenuExtra-Info.plist
107 find $(SRC_DIR) -name build -prune -print0 | xargs -0 rm -R
108 $(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)
109 $(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlMail
110 $(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlSafari
111 $(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/growlnotify
112 $(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/HardwareGrowler
113 $(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)/Extras/GrowlTunes
122 @# clean build directory
127 @# Archive dSYM bundles.
129 mv $(GROWL_BUILD_DIR)/*.dSYM $(DSYM_DIR)
130 mv $(GROWLNOTIFY_BUILD_DIR)/*.dSYM $(DSYM_DIR)
131 mv $(GROWLTUNES_BUILD_DIR)/*.dSYM $(DSYM_DIR)
132 mv $(HARDWAREGROWLER_BUILD_DIR)/*.dSYM $(DSYM_DIR)
133 mv $(GROWLMAIL_BUILD_DIR)/*.dSYM $(DSYM_DIR)
134 mv $(GROWLSAFARI_BUILD_DIR)/*.dSYM $(DSYM_DIR)
135 @# Note: -C only applies to the input names, not -f, so it is correct to use notdir on the directory name and leave it off of the tarball name.
136 tar -C $(dir $(DSYM_DIR)) -cjf $(DSYM_DIR).tbz $(notdir $(DSYM_DIR))
139 cp -R "Uninstall Growl.app" $(GROWL_DIR)
140 /Developer/Tools/SetFile -a E $(GROWL_DIR)/Uninstall\ Growl.app
143 cp "Growl Documentation.webloc" "Growl version history.webloc" "Get more styles.webloc" $(GROWL_DIR)
145 @# hide extensions of webloc files
146 /Developer/Tools/SetFile -a E $(GROWL_DIR)/*.webloc
148 @# build the prefpane package
149 $(PACKAGE_MAKER) --doc Growl/Growl\ Installer.pmdoc --out $(GROWL_DIR)/Growl.mpkg --version $(VERSION) --id com.growl.growl.mpkg -v
152 mkdir $(GROWL_DIR)/Extras
153 mkdir $(GROWL_DIR)/Extras/growlnotify
154 cp $(GROWLNOTIFY_BUILD_DIR)/growlnotify $(GROWL_DIR)/Extras/growlnotify
155 cp $(SRC_DIR)/Extras/growlnotify/growlnotify.1 $(GROWL_DIR)/Extras/growlnotify
156 cp $(SRC_DIR)/Extras/growlnotify/install.sh $(GROWL_DIR)/Extras/growlnotify
157 cp $(SRC_DIR)/Extras/growlnotify/*.txt $(GROWL_DIR)/Extras/growlnotify
158 mkdir $(GROWL_DIR)/Extras/GrowlTunes
159 cp -R $(GROWLTUNES_BUILD_DIR)/GrowlTunes.app $(GROWL_DIR)/Extras/GrowlTunes
160 cp -R $(SRC_DIR)/Extras/GrowlTunes/*.rtfd $(GROWL_DIR)/Extras/GrowlTunes
161 mkdir $(GROWL_DIR)/Extras/HardwareGrowler
162 cp -R $(HARDWAREGROWLER_BUILD_DIR)/HardwareGrowler.app $(GROWL_DIR)/Extras/HardwareGrowler
163 cp $(SRC_DIR)/Extras/HardwareGrowler/*.txt $(GROWL_DIR)/Extras/HardwareGrowler
165 @# build GrowlMail package
166 mkdir $(GROWL_DIR)/Extras/GrowlMail
167 $(PACKAGE_MAKER) --doc GrowlMail/GrowlMail\ Installer.pmdoc --out $(GROWL_DIR)/Extras/GrowlMail/GrowlMail.mpkg --version $(VERSION) --id com.growl.growlmail.mpkg -v
168 cp $(SRC_DIR)/Extras/GrowlMail/*.rtf $(GROWL_DIR)/Extras/GrowlMail
170 @# build GrowlSafari package
171 mkdir $(GROWL_DIR)/Extras/GrowlSafari
172 @# Set its ownership to root:admin and permissions to rwxr-xr-x so that Mac OS X 10.5.3 will load it.
173 chmod -R go-w $(GROWLSAFARI_BUILD_DIR)/GrowlSafari
175 @echo '*** IMPORTANT: If you want to build Growl as a regular (non-admin) user, hit CTRL-D here without entering a password. (Ctrl-C will stop the build.) Note that the GrowlSafari on the disk image will not be usable on Leopard and later if you do this.'
176 -(sudo chown -R root:admin $(GROWLSAFARI_BUILD_DIR)/GrowlSafari) || echo "WARNING: GrowlSafari will not work on Leopard and later from this disk image" > /dev/stderr
177 $(PACKAGE_MAKER) --doc GrowlSafari/GrowlSafari\ Installer.pmdoc --out $(GROWL_DIR)/Extras/GrowlSafari/GrowlSafari.pkg --version $(VERSION) --id com.growl.growlsafari.pkg -v
178 @# PackageMaker fails at obeying the permissions that we've set forth in the document. Specifically, it sets g+w on everything, in both the BOM and the archive, in direct contravention of what the document says (go-w).
179 @# Our workaround, then, is to create the BOM and archive ourselves, replacing the full-of-fail ones that PackageMaker creates.
180 mkbom $(GROWLSAFARI_BUILD_DIR)/GrowlSafari $(GROWL_DIR)/Extras/GrowlSafari/GrowlSafari.pkg/Contents/Archive.bom
181 (cd $(GROWLSAFARI_BUILD_DIR)/GrowlSafari && pax -w -x cpio -z .) > $(GROWL_DIR)/Extras/GrowlSafari/GrowlSafari.pkg/Contents/Archive.pax.gz
186 @# copy the webloc files
187 cp "Growl Developer Documentation.webloc" "Growl version history for developers.webloc" $(SDK_DIR)
189 @# hide extensions of webloc files
190 /Developer/Tools/SetFile -a E $(SDK_DIR)/*.webloc
193 #cp -R $(SRC_DIR)/Scripts $(GROWL_DIR)
195 @# copy over relevant files to compile directly into app
196 mkdir $(SDK_DIR)/Built-In
197 cp $(SRC_DIR)/Framework/Source/GrowlApplicationBridge.h $(SDK_DIR)/Built-In
198 cp $(SRC_DIR)/Framework/Source/GrowlApplicationBridge.m $(SDK_DIR)/Built-In
199 cp $(SRC_DIR)/Common/Source/GrowlDefines.h $(SDK_DIR)/Built-In
200 cp $(SRC_DIR)/Common/Source/GrowlDefinesInternal.h $(SDK_DIR)/Built-In
201 cp $(SRC_DIR)/Common/Source/GrowlPathUtilities.h $(SDK_DIR)/Built-In
202 cp $(SRC_DIR)/Common/Source/GrowlPathUtilities.m $(SDK_DIR)/Built-In
203 cp $(SRC_DIR)/Common/Source/CFGrowlAdditions.h $(SDK_DIR)/Built-In
204 cp $(SRC_DIR)/Common/Source/CFGrowlAdditions.c $(SDK_DIR)/Built-In
205 cp $(SRC_DIR)/Common/Source/CFGrowlDefines.h $(SDK_DIR)/Built-In
206 cp $(SRC_DIR)/Common/Source/CFURLAdditions.h $(SDK_DIR)/Built-In
207 cp $(SRC_DIR)/Common/Source/CFURLAdditions.c $(SDK_DIR)/Built-In
208 cp $(SRC_DIR)/Common/Source/CFMutableDictionaryAdditions.h $(SDK_DIR)/Built-In
209 cp $(SRC_DIR)/Common/Source/CFMutableDictionaryAdditions.c $(SDK_DIR)/Built-In
210 cp $(SRC_DIR)/Core/Source/GrowlPreferencesController.h $(SDK_DIR)/Built-In
211 cp $(SRC_DIR)/Core/Source/GrowlTicketController.h $(SDK_DIR)/Built-In
213 @# copy the frameworks
214 mkdir $(SDK_DIR)/Frameworks
215 cp -R $(GROWL_BUILD_DIR)/Growl.framework $(GROWL_BUILD_DIR)/Growl-WithInstaller.framework $(SDK_DIR)/Frameworks
218 cp -R $(SRC_DIR)/Bindings $(SDK_DIR)
219 @# remove the AppleScript binding
220 rm -rf $(SDK_DIR)/Bindings/applescript
222 @# remove some symlinks
223 rm $(SDK_DIR)/Bindings/tcl/GrowlDefines.h
224 rm $(SDK_DIR)/Bindings/tcl/GrowlApplicationBridge.h
225 rm $(SDK_DIR)/Bindings/tcl/GrowlApplicationBridge.m
227 @# delete svn and backup files
228 find $(BUILD_DIR) -name ".svn" -type d -exec rm -rf {} \; -prune
229 find $(BUILD_DIR) \( -name "*~" -or -name .DS_Store \) -type f -delete
231 @# make Growl disk image
232 mkdir $(GROWL_DIR)/.background
233 cp $(SRC_DIR)/images/dmg/growlDMGBackground.png $(GROWL_DIR)/.background
234 ./ensureCustomIconsExtracted $(ART_DIR)
235 ./make-diskimage.sh $(BUILD_DIR)/$(RELEASE_FILENAME).dmg $(GROWL_DIR) $(RELEASE_NAME) dmg_growl.applescript $(ART_DIR)
236 rm $(ART_DIR)/GrowlIcon
238 @# make SDK disk image
239 mkdir $(SDK_DIR)/.background
240 cp $(SRC_DIR)/images/dmg/growlSDK.png $(SDK_DIR)/.background
241 ./make-diskimage.sh $(BUILD_DIR)/$(RELEASE_FILENAME)-SDK.dmg $(SDK_DIR) $(RELEASE_SDK_NAME) dmg_sdk.applescript
244 -growlnotify -n 'Growl Release Makefile' 'Growl disk image built successfully' -m $(RELEASE_FILENAME).dmg --iconpath $(BUILD_DIR)/$(RELEASE_FILENAME).dmg