Release/Makefile
author Peter Hosey <hg@boredzo.org>
Mon Jun 15 19:53:26 2009 -0700 (2009-06-15)
changeset 4216 803920185e34
parent 4215 bcc6b2ed2cd2
child 4217 cce8afc9fe17
permissions -rw-r--r--
When updating version numbers in Info.plist files, also update those of the GrowlSafariLoader bundle.
     1 ##########################
     2 ### Versioning:
     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
     7 #
     8 VERSION=1.1.5b3
     9 BETA=TRUE
    10 
    11 #
    12 #########################
    13 #
    14 # No changes should be needed below this line
    15 #
    16 #########################
    17 RELEASE_FILENAME=Growl-$(VERSION)
    18 RELEASE_NAME="Growl-$(VERSION)"
    19 RELEASE_SDK_NAME="Growl $(VERSION) SDK"
    20 
    21 SRC_DIR=$(PWD)/..
    22 BUILD_DIR=build
    23 GROWL_DIR=$(BUILD_DIR)/Growl
    24 SDK_DIR=$(BUILD_DIR)/SDK
    25 BUILDSTYLE=Deployment
    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)
    35 else
    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)
    43 endif
    44 DSYM_DIR=$(BUILD_DIR)/Growl-dSYM-$(VERSION)
    45 PACKAGE_MAKER=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
    46 ART_DIR=Artwork
    47 
    48 #########################
    49 
    50 .PHONY: all assertnochanges assertnoconflicts compile clean release source version
    51 
    52 all: assertnochanges version compile release
    53 all-withlocalchanges: assertnoconflicts version compile release
    54 
    55 assertnochanges:
    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; \
    58 		exit 1; \
    59 	fi
    60 assertnoconflicts:
    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; \
    63 		exit 2; \
    64 	fi
    65 
    66 version:
    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)'
    79 
    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)'
    92 
    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
   105 
   106 compile:
   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
   114 
   115 clean:
   116 	rm -rf $(BUILD_DIR)
   117 
   118 realclean: clean
   119 	../build.sh clean
   120 
   121 release:
   122 	@# clean build directory
   123 	rm -rf $(BUILD_DIR)
   124 	mkdir $(BUILD_DIR)
   125 	mkdir $(GROWL_DIR)
   126 	
   127 	@# Archive dSYM bundles.
   128 	mkdir $(DSYM_DIR)
   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))
   137 	
   138 	@# copy uninstaller
   139 	cp -R "Uninstall Growl.app" $(GROWL_DIR)
   140 	/Developer/Tools/SetFile -a E $(GROWL_DIR)/Uninstall\ Growl.app
   141 	
   142 	@# copy webloc files
   143 	cp "Growl Documentation.webloc" "Growl version history.webloc" "Get more styles.webloc" $(GROWL_DIR)
   144 	
   145 	@# hide extensions of webloc files
   146 	/Developer/Tools/SetFile -a E $(GROWL_DIR)/*.webloc
   147 	
   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
   150 	
   151 	@# copy the extras
   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
   164 	
   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
   169 	
   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
   174 	@echo
   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
   182 	
   183 	@# build the SDK
   184 	mkdir $(SDK_DIR)
   185 	
   186 	@# copy the webloc files
   187 	cp "Growl Developer Documentation.webloc" "Growl version history for developers.webloc" $(SDK_DIR)
   188 	
   189 	@# hide extensions of webloc files
   190 	/Developer/Tools/SetFile -a E $(SDK_DIR)/*.webloc
   191 	
   192 	@# copy the scripts
   193 	#cp -R $(SRC_DIR)/Scripts $(GROWL_DIR)
   194 	
   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
   212 	
   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
   216 	
   217 	@# copy the bindings
   218 	cp -R $(SRC_DIR)/Bindings $(SDK_DIR)
   219 	@# remove the AppleScript binding
   220 	rm -rf $(SDK_DIR)/Bindings/applescript
   221 	
   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
   226 	
   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
   230 
   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
   237 	
   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
   242 	
   243 	@echo Build finished
   244 	-growlnotify -n 'Growl Release Makefile' 'Growl disk image built successfully' -m $(RELEASE_FILENAME).dmg --iconpath $(BUILD_DIR)/$(RELEASE_FILENAME).dmg