# Dali Clock for MacOS X, Copyright (c) 2005-2011 by Jamie Zawinski.

XCODEBUILD = /usr/bin/xcodebuild
TARGETS    = -target DaliClock -target DaliClockSaver -target DaliClockWidget
ARCH       = -arch i386 -arch x86_64
CERT       = 'Jamie Zawinski'
CERT       = 'iPhone Developer: Jamie Zawinski (Y5M82TL69N)'
SETFILE    = /Applications/Xcode.app/Contents/Developer/Tools/SetFile
SETICON    = /usr/local/bin/seticon

default: release
all: debug release

clean:
	-rm -rf build
#	cd ..; $(XCODEBUILD) $(TARGETS) clean

distclean:
	-rm -f config.status config.cache config.log \
	  *.bak *.rej TAGS *~ "#"*
	-rm -rf autom4te*.cache
	-rm -rf build Sparkle.framework

distdepend:: Sparkle.framework
distdepend:: update_plist_version
distdepend:: update_bindist_version

debug: distdepend
	$(XCODEBUILD) $(ARCH) $(TARGETS) -configuration Debug   build

release:: distdepend
	$(XCODEBUILD) $(ARCH) $(TARGETS) -configuration Release build

release:: check_versions
release:: sign

Sparkle.framework:
	unzip "../archive/Sparkle 1.5b6.zip" \
	  "With Garbage Collection/Sparkle.framework/*"
	mv "With Garbage Collection/Sparkle.framework" .
	rmdir "With Garbage Collection"
	cd Sparkle.framework/Resources/ && ln -sf fr.lproj fr_CA.lproj


distdepend:: DaliClockPhone72.png DaliClockPhone57.png
distdepend:: DaliClockPhone50.png DaliClockPhone29.png
DaliClockPhone72.png: iTunesArtwork
	convert -resize '72x72!' $< $@
DaliClockPhone57.png: iTunesArtwork
	convert -resize '57x57!' $< $@
DaliClockPhone50.png: iTunesArtwork
	convert -resize '50x50!' $< $@
DaliClockPhone29.png: iTunesArtwork
	convert -resize '29x29!' $< $@


sign:
	codesign --deep -vfs $(CERT) build/Release/*.app
	codesign --deep -vfs $(CERT) build/Release/*.saver
	codesign --deep -vfs $(CERT) build/Release/*.wdgt/*.widgetplugin
	codesign --deep -vfs $(CERT) build/Release/*.wdgt
#	codesign --deep -vfs $(CERT) build/Release-iphoneos/*.app

check_versions:
	@\
  U=../version.h ;							\
  V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ;]*\).*/\1/p' < $$U` ;		\
  DIR=build/Release ;							\
  RESULT=0 ;								\
  for P in `find $$DIR -name Info.plist |				\
	    grep -v Sparkle.framework` ; do				\
     V2=`perl -0000 -n -e						\
	'm@<key>CFBundleVersion</key>\s*<string>(.*?)</string>@si 	\
	 && print $$1' < $$P` ;						\
     if [ "$$V2" != "$$V" ] ; then					\
       echo "Wrong version: $$P ($$V2)" ;				\
       RESULT=1 ;							\
     fi ;								\
  done ;								\
  if [ "$$RESULT" = 0 ]; then echo "Versions match ($$V2)" ; fi ;	\
  exit $$RESULT


echo_tarfiles:
	@echo `find . \
	  \( \( -name '.??*' -o -name build -o -name CVS -o -name '*~*' \
	     -o -name 'jwz.*' -o -name '*.widgetplugin' \
	     -o -name '*.psd' -o -name '*.ai' \) \
	     -prune \) \
	  -o \( -type f -o -type l \) -print \
	| sed 's@^\./@@' \
	| sort`

update_plist_version:
	@								      \
  SS="AppInfo.plist SaverInfo.plist PluginInfo.plist iPhoneInfo.plist *.wdgt/Info.plist" ;   \
  SRC=../version.h ;							      \
  V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ;		      \
  Y=`date +%Y` ;							      \
  T=/tmp/xs.$$$$ ;							      \
  for S in $$SS ; do							      \
    /bin/echo -n "Updating version number in $$S to \"$$V\"... " ;	      \
    KEYS1="CFBundleVersion|CFBundleShortVersionString" ;		      \
    KEYS2="NSHumanReadableCopyright|CFBundleLongVersionString|CFBundleGetInfoString" ; \
    perl -0777 -pne							      \
      "s@(<key>($$KEYS1)</key>\s*<string>)[^<>]+(</string>)@\$${1}$$V\$${3}@g; \
       s@(<key>($$KEYS2)</key>\s*<string>[^\d]+)[\d.]+(.*?</string>)@\$${1}$$V\$${3}@gs; \
       s@(<key>($$KEYS2)</key>\s*<string>.*?1991-)\d\d\d\d(.*?</string>)@\$${1}$$Y\$${3}@gs" \
    < $$S > $$T ;							    \
   if cmp -s $$S $$T ; then						    \
     echo "unchanged." ;						    \
   else									    \
    cat $$T > $$S ;							    \
    echo "done." ;							    \
   fi ;									    \
   rm $$T ;								    \
  done


update_bindist_version:
	@								    \
  SS="bindist.rtf Credits.html" ;					    \
  U=../version.h ;							    \
  V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ;]*\).*/\1/p' < $$U` ;		    \
  D=`date '+%d-%b-%Y'` ;						    \
  Y=`date '+%Y'` ;							    \
  for S in $$SS ; do							    \
   T=/tmp/xs.$$$$ ;							    \
   sed -e "s/\(.*version \)[0-9][0-9]*\.[0-9]*[ab]*[0-9]*\(.*\)/\1$$V\2/"   \
       -e "s/\(1991-\)[0-9][0-9][0-9][0-9]/\1$$Y/"			    \
       -e "s/\([0-9][0-9]-[A-Z][a-z][a-z]-[0-9][0-9][0-9]*\)/$$D/"	    \
      < $$S > $$T ;							    \
   if cmp -s $$S $$T ; then						    \
    true ;								    \
   else									    \
    cat $$T > $$S ;							    \
    echo "updated $$S to $$V $$D" ;					    \
   fi ;									    \
  done ;								    \
  rm $$T


updates.xml::
	./updates.pl DaliClock ../README ../archive ~/www/xdaliclock
	@$(MAKE) test_sig

test_sig::
	@								    \
  U=../version.h ;							    \
  V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ;]*\).*/\1/p' < $$U` ;		    \
  V=`echo $$V | sed 's/\.//g'` ;					    \
  ZIP="../archive/DaliClock-$$V.dmg" ;					    \
  SIG=`sed -n 's/^.*dsaSignature="\(.*\)".*/\1/p' updates.xml` ;	    \
  PUB="sparkle_dsa_pub.pem" ;						    \
  NN="t.$$$$" ;								    \
  SIGB=/tmp/$$NN.sig ;							    \
  HASH=/tmp/$$NN.hash ;							    \
  rm -f "$$SIGB" "$$HASH" ;						    \
  echo "$$SIG " | base64 -D  > "$$SIGB" ;				    \
  set -e ;								    \
  for OPENSSL in /usr/bin/openssl /opt/local/bin/openssl ; do		    \
    $$OPENSSL dgst -sha1 -binary  < "$$ZIP"  > "$$HASH" ;		    \
    /bin/echo -n "$$OPENSSL	`$$OPENSSL version`:	" ;		    \
    $$OPENSSL dgst -dss1 -verify "$$PUB" -signature "$$SIGB" "$$HASH" ;	    \
  done ;								    \
  rm -f "$$SIGB" "$$HASH" ;						    \



# -format UDBZ saves 4% over UDZO, but that's only 8KB.
dmg:: distdepend check_versions
	@								      \
  set -e ;								      \
  SRC=../version.h ;							      \
  V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ;]*\).*/\1/p' $$SRC` ;		      \
  V2="$$V" ;								      \
  V=`echo $$V | sed 's/\.//g'` ;					      \
  TMPDIR="build" ;							      \
  SRC="build/Release" ;							      \
  BASE="DaliClock-$$V" ;						      \
  OUTDIR="../archive" ;							      \
  DMG="$$OUTDIR/$$BASE.dmg" ;						      \
  TMPDMG="$$TMPDIR/tmp.dmg" ;						      \
  VOLNAME="DaliClock $$V2" ;						      \
  STAGE="$$TMPDIR/dmg_stage" ;						      \
  rm -f "$$DMG" ;							      \
  rm -rf "$$STAGE" ;							      \
  echo + mkdir "$$STAGE" ;						      \
         mkdir "$$STAGE" ;						      \
  FILES="$$SRC/*.app $$SRC/*.saver $$SRC/*.wdgt" ;			      \
  echo + cp -pR $$FILES "$$STAGE" ;					      \
         cp -pR $$FILES "$$STAGE" ;					      \
  set -x ;								      \
  cp -p bindist.rtf "$$STAGE/ READ ME.rtf" ;				      \
  cp -p bindist-DS_Store "$$STAGE/.DS_Store" ;				      \
  cp -p bindist.webloc "$$STAGE/DaliClock for iPhone:iPad.webloc" ;	      \
  ${SETFILE} -a E "$$STAGE/ READ ME.rtf" ;				      \
  ${SETFILE} -a e $$STAGE/*.saver ;					      \
  ${SETFILE} -a e $$STAGE/*.wdgt ;					      \
  ${SETFILE} -a E $$STAGE/*.webloc ;					      \
  $(SETICON) -d daliclockSaver.icns $$STAGE/*.saver ;			      \
  $(SETICON) -d daliclockWidget.icns $$STAGE/*.wdgt ;			      \
  $(SETICON) -d daliclock.icns $$STAGE/*.webloc ;			      \
  hdiutil makehybrid -quiet -ov -hfs -hfs-volume-name "$$VOLNAME"	      \
    -hfs-openfolder "$$STAGE" "$$STAGE" -o "$$TMPDMG" ;			      \
  rm -rf "$$STAGE" ;							      \
  hdiutil convert -quiet -ov -format UDZO -imagekey zlib-level=9	      \
    "$$TMPDMG" -o "$$DMG" ;						      \
  rm -f "$$TMPDMG" ;							      \
  ls -ldhgF "$$DMG" ;							      \
  $(MAKE) updates.xml ;							      \

# Adding this is cute:
#    hdiutil internet-enable -yes -quiet "$$DMG"
# but means that nobody will ever see the display settings I used!
# When finder copies the .dmg to a folder, it doesn't preserve them.
