Release/Makefile
author Eric Richie
Mon Jan 16 20:21:03 2012 -0500 (4 months ago)
changeset 4517 1c62031359a1
parent 4481 f6191276f60e
child 4567 f1639fcfbc1e
permissions -rw-r--r--
Version up for rc1.
     1 ###########
     2 # What to do before running this script:
     3 # - openUp needs to be installed.
     4 # - Set VERSION, BUILD_IN_DEBUG_MODE, BETA, and OFFICIAL_BUILD below.
     5 #    * The Adium plists will automatically updated to match these values.
     6 #    * BETA should be TRUE for all beta builds and FALSE for all releases.
     7 #      It primarily affects the appcast used by Adium for detecting updates.
     8 #    * BUILD_IN_DEBUG_MODE should be set to FALSE for the last beta
     9 #      in addition to the release itself. If FALSE, debug logging is disabled
    10 #      and certain space optimizations for nibs and strings are done which
    11 #      also prevent modification.
    12 #    * OFFICIAL_BUILD is TRUE for the benefit of our Adium build machine, which signs 
    13 #      official release builds. When building a release yourself, set this to FALSE, 
    14 #      since you don't have the Adium certificate on your machine.
    15 #
    16 # How to run this script:
    17 # - make all
    18 ###########
    19 
    20 VERSION=1.5rc1
    21 BUILD_IN_DEBUG_MODE?=TRUE
    22 BETA?=TRUE
    23 OFFICIAL_BUILD?=TRUE
    24 
    25 # Always builds in debug mode.
    26 NIGHTLY?=FALSE
    27 NIGHTLY_REPO?=adium #change to adium-1.4 on the 1.4 branch
    28 NIGHTLY_BRANCH?=default
    29 
    30 ###########
    31 # To release!
    32 # Releasing requires cachefly access and adiumx.com access.
    33 #
    34 # First upload to cachefly. If you don't have access and need to do a release, get with Evan or Chris (tick).
    35 # Triggering the version checker once the release is up:
    36 # 1) Build Adium
    37 # 2) Get the number out of the 'buildnum' file in Adium.app/Contents/Resources
    38 # 3) Paste that number into the appropriate place (adium version or adium-beta version, depending on which you're triggering) in the version.plist file in our public_html folder.  *** (2) and (3) are to support the old version checker, in Adium 0.8x and earlier ***
    39 # 4) Update and commit the appcast.xml file in the adium checkout root
    40 # 5) Run the appcast update php script.
    41 ###########
    42 
    43 ###########
    44 # No need for changes below this point
    45 ###########
    46 
    47 ###########
    48 # Variables
    49 ###########
    50 SRC_DIR=..
    51 BUILD_DIR=build
    52 ART_DIR=Artwork
    53 ADIUM_DIR=$(BUILD_DIR)/Adium
    54 RELEASE_NAME=Adium_$(VERSION)
    55 VERSION_ESCAPED=$(VERSION)
    56 RELEASE_NAME_ESCAPED=Adium_$(VERSION_ESCAPED)
    57 TARBALL_DIR=adium-$(VERSION)
    58 
    59 REVISION = r$(shell hg parent --template {rev})
    60 
    61 ifeq ($(NIGHTLY),TRUE)
    62 	BETA=FALSE
    63 	ADIUM_DIR:=$(ADIUM_DIR)\ $(REVISION)
    64 	VERSION_ESCAPED:=$(VERSION_ESCAPED)\ $(REVISION)
    65 	VERSION:=$(VERSION)$(REVISION)
    66 	BUILD_IN_DEBUG_MODE=TRUE
    67 	BUILDFLAGS+="ADIUM_CFLAGS=-DNIGHTLY_RELEASE"
    68 	BUILDFLAGS+="ADIUM_NIGHTLY_FLAGS=CACHE_ROOT=/var/tmp/buildbot/com.apple.Xcode.$(strip $(shell id -u))/nightly/$(strip $(NIGHTLY_REPO))/$(strip $(NIGHTLY_BRANCH))" # Required, otherwise wrong precompiled headers are used.
    69 endif
    70 
    71 ifeq ($(BUILD_IN_DEBUG_MODE),TRUE)
    72     BUILDSTYLE=Release-Debug
    73 else
    74     BUILDSTYLE=Release
    75 endif
    76 
    77 BUILDFLAGS+="BUILDCONFIGURATION=$(BUILDSTYLE)"
    78 
    79 ifeq ($(BETA),TRUE)
    80 	BUILDFLAGS+="ADIUM_CFLAGS=-DBETA_RELEASE"
    81 endif
    82 
    83 PRODUCT_DIR=$(shell defaults read com.apple.Xcode PBXApplicationwideBuildSettings 2> /dev/null > XcodeBuildSettings.plist && defaults read $PWD/XcodeBuildSettings SYMROOT 2> /dev/null; rm XcodeBuildSettings.plist)
    84 
    85 ifeq ($(strip $(PRODUCT_DIR)),)
    86 	ADIUM_BUILD_DIR=$(SRC_DIR)/build/$(BUILDSTYLE)
    87 else
    88 	TARGET_BUILD_DIR=$(PRODUCT_DIR)/$(BUILDSTYLE)
    89 	ADIUM_BUILD_DIR=$(TARGET_BUILD_DIR)
    90 endif
    91 
    92 PLIST_DIR=`pwd`/../Plists
    93 ADIUM_PLIST=$(PLIST_DIR)/Info
    94 
    95 ###########
    96 # Targets
    97 ###########
    98 .PHONY: all all-withlocalchanges all-withlocalchanges-noclean all-nopackage-noclean all-nightly update assertnochanges assertnoconflicts version compile clean release source prepare-release-bundle createfolder diskimage nightly tarball
    99 
   100 all: update assertnochanges version clean compile release
   101 all-withlocalchanges: update assertnoconflicts version clean compile release
   102 all-withlocalchanges-noclean: update assertnoconflicts version compile release
   103 
   104 #doesn't bother putting things in a dmg
   105 #useful for builds not intended for distribution
   106 all-nopackage-noclean: update assertnoconflicts version compile createfolder prepare-release-bundle
   107 
   108 update:
   109 	hg pull -uf
   110 
   111 assertnochanges: assertnoconflicts
   112 	if [[ 0 -ne `hg st $(SRC_DIR) | egrep --invert-match '\?|Info\.plist' | wc -l` ]]; then \
   113 		echo 'You have local changes. Please do not build releases from an unclean checkout. You must revert the changes, commit them, or check out another working copy and build from that.' 1>&2; \
   114 		exit 1; \
   115 	fi
   116 assertnoconflicts:
   117 	if [[ 0 -ne `hg st $(SRC_DIR) | egrep '^C' | wc -l` ]]; then \
   118 		echo 'You have conflicts in your checkout. 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"; otherwise, hg will still believe the files are conflicted.' 1>&2; \
   119 		exit 2; \
   120 	fi
   121 
   122 version:
   123 	@# update the plists
   124 	defaults write $(ADIUM_PLIST) CFBundleGetInfoString "$(VERSION), Copyright 2001-$(shell date +"%Y") The Adium Team"
   125 	defaults write $(ADIUM_PLIST) CFBundleVersion "$(VERSION)"
   126 	defaults write $(ADIUM_PLIST) CFBundleShortVersionString "$(VERSION)"
   127 ifeq ($(NIGHTLY),TRUE)
   128 	defaults write $(ADIUM_PLIST) AINightlyRepo "$(NIGHTLY_REPO)"
   129 	defaults write $(ADIUM_PLIST) AINightlyBranch "$(NIGHTLY_BRANCH)"
   130 endif
   131 	plutil -convert xml1 $(ADIUM_PLIST).plist
   132 
   133 compile:
   134 	$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)
   135 
   136 testcompile:
   137 	$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR)
   138 
   139 clean:
   140 	rm -rf $(BUILD_DIR)
   141 	$(MAKE) $(BUILDFLAGS) -C $(SRC_DIR) clean
   142 
   143 release: createfolder prepare-release-bundle diskimage
   144 
   145 prepare-release-bundle:
   146 	@# Convert all nibs to the smaller binary format
   147 	@echo Converting nibs to binary format...
   148 	find $(BUILD_DIR) -name keyedobjects.nib -print0 | xargs -0 plutil -convert binary1
   149 
   150 	@# delete unneeded nib files for non-beta builds
   151 	@echo Cleaning Adium.app for release
   152 ifeq ($(BUILD_IN_DEBUG_MODE),FALSE)
   153 	find $(BUILD_DIR) \( -name classes.nib -or -name info.nib -or -name designable.nib \) -type f -delete
   154 endif
   155 
   156 	@# delete backup files
   157 	find $(BUILD_DIR) \( -name "*~" -or -name .DS_Store \) -type f -delete
   158 
   159 	@# delete header files
   160 	find $(BUILD_DIR) \( -name "*.h" \) -type f -delete
   161 
   162 	@# sign the executable
   163 ifeq ($(OFFICIAL_BUILD),TRUE)
   164 	if [ -e ~/adium-password ]; then \
   165 		security unlock-keychain -p `cat ~/adium-password`; \
   166 	fi
   167 	codesign -v -s Adium $(ADIUM_DIR)/Adium.app/Contents/MacOS/Adium
   168 endif
   169 
   170 createfolder:
   171 	@# clean build directory
   172 	rm -rf $(BUILD_DIR)
   173 	mkdir $(BUILD_DIR)
   174 
   175 	mkdir $(ADIUM_DIR)
   176 
   177 	@# copy the app
   178 	cp -R "$(ADIUM_BUILD_DIR)/Adium.app" $(ADIUM_DIR)
   179 
   180 	@# copy the text files
   181 	cp $(SRC_DIR)/ChangeLogs/Changes.txt $(ADIUM_DIR)
   182 	cp $(SRC_DIR)/License.txt $(ADIUM_DIR)
   183 
   184 	@# symlink /Applications
   185 	./mkalias -r /Applications $(ADIUM_DIR)/Applications
   186 
   187 diskimage:
   188 	rm "$(BUILD_DIR)/$(RELEASE_NAME).dmg" || true
   189 	@# make Adium disk image
   190 	mkdir -p $(ADIUM_DIR)/.background
   191 	cp $(ART_DIR)/dmgBackground.png $(ADIUM_DIR)/.background
   192 
   193 	./ensureCustomIconsExtracted $(ART_DIR)
   194 	./make-diskimage.sh $(BUILD_DIR)/$(RELEASE_NAME).dmg $(ADIUM_DIR) "Adium $(VERSION)" dmg_adium.scpt $(ART_DIR)
   195 
   196 ifeq ($(OFFICIAL_BUILD),TRUE)
   197 	@echo DSA for Sparkle: `ruby sign_update.rb $(BUILD_DIR)/$(RELEASE_NAME_ESCAPED).dmg ~/adium-dsa-sign/dsa_priv.pem`
   198 endif
   199 
   200 	@echo Build finished. `md5 $(BUILD_DIR)/$(RELEASE_NAME_ESCAPED).dmg`
   201 
   202 #This is what nightly builds use. Does not update because buildbot does.
   203 nightly: version clean compile createfolder prepare-release-bundle diskimage
   204 	echo $(RELEASE_NAME) > $(BUILD_DIR)/latest.info
   205 	echo $(REVISION) >> $(BUILD_DIR)/latest.info
   206 	md5 -q $(BUILD_DIR)/$(RELEASE_NAME).dmg >> $(BUILD_DIR)/latest.info
   207 	md5 -q $(BUILD_DIR)/$(RELEASE_NAME).dmg >> $(BUILD_DIR)/$(RELEASE_NAME).dmg.md5
   208 	ls -l $(BUILD_DIR)/$(RELEASE_NAME).dmg | awk '{print $$5}' >>$(BUILD_DIR)/latest.info
   209 	echo $(VERSION) >> $(BUILD_DIR)/latest.info
   210 ifeq ($(OFFICIAL_BUILD),TRUE)
   211 	ruby sign_update.rb $(BUILD_DIR)/$(RELEASE_NAME).dmg ~/adium-dsa-sign/dsa_priv.pem >> $(BUILD_DIR)/latest.info
   212 endif
   213 
   214 tarballapp:
   215 	rm $(BUILD_DIR)/$(RELEASE_NAME).tgz || true
   216 	cd $(BUILD_DIR) && tar zcf $(RELEASE_NAME).tgz Adium*/ && cd ..
   217 
   218 tarball:
   219 	hg archive -t tgz ($TARBALL_DIR).tgz