#
#  Carbon Emacs パッケージ
#  http://homepage.mac.com/zenitani/emacs-j.html
#  http://homepage.mac.com/zenitani/emacs-e.html
#  http://homepage.mac.com/zenitani/emacs-fr.html
#  http://homepage.mac.com/zenitani/emacs-es.html
#
#  Emacs 本体と同梱ライブラリの作成レシピです。
#  ネットワークインストール対応ライブラリも
#  ほぼ同じ書式で記述しています。
#
#  $Id: Makefile 704 2010-01-08 03:38:03Z zenitani $
#
###############################################################

# 作成手順は下記のWikiページを参照して下さい。
#
# http://www.emacswiki.org/cgi-bin/emacs-en/MakingOfCarbonEmacsPackage

# パッケージ制作者が手動で書き換える部分
#
# VERSION      : 短いバージョン名（Emacs 的なバージョン番号）
# LONG_VERSION : Carbon Emacs パッケージ全体のリリースバージョン名
#                Show Info ダイアログでも表示される

VERSION      := 22.3
#LONG_VERSION := Winter, 2010; Carbon Emacs Package by S. Zenitani et al.
LONG_VERSION := 2010; Carbon Emacs Package (Compatible)

OS_VERSION   := $(shell sw_vers -productVersion | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/')
UNAME        := $(shell uname -p)
DATE         := $(shell date "+%Y%m%d")

###############################################################

PACKAGE_DIR    := /Volumes/Emacs
#PACKAGE_DIR     = /Applications
PACKAGE_APP     = ${PACKAGE_DIR}/Emacs.app
PACKAGE_BIN     = ${PACKAGE_APP}/Contents/MacOS/bin
PACKAGE_EMACS   = ${PACKAGE_APP}/Contents/MacOS/Emacs
PACKAGE_PREFIX  = ${PACKAGE_APP}/Contents/Resources
PACKAGE_LIBRARY = ${PACKAGE_APP}/Contents/Library
PACKAGE_SITEDIR = ${PACKAGE_PREFIX}/site-lisp
PACKAGE_INFODIR = ${PACKAGE_PREFIX}/info
PACKAGE_DMG    := CarbonEmacs-${UNAME}-${DATE}.dmg
TEMP_DMG        = test.dmg

ELISP_CONFIGURE	= ./configure --with-emacs=${PACKAGE_EMACS} --prefix=${PACKAGE_PREFIX} --bindir=${PACKAGE_BIN} 
ELISP_MAKE     	= make EMACS=${PACKAGE_EMACS} prefix=${PACKAGE_PREFIX}
INSTALL	        = install -m 644

###############################################################

all: 
	@echo "[ src ]"
	@echo "patch"
	@echo "compile"
	@echo "dmg"
	@echo "install"
	@echo "pkg"
	@echo "icon"
	@echo "done"


###############################################################

# emacs のソースコードを取得します。
# ソースは日々更新されています。
src:
	if [ -e emacs ] ; then rm -rf emacs; fi
	export CVS_RSH="ssh" ; \
	cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co emacs
#	cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co -D "2007-01-01" emacs
	tar zcvf src/emacs-22.x.cvs${DATE}.tar.gz emacs
#	tar jcvf src/EmacsCVS-src-${DATE}.tbz emacs
	@echo "Be sure to apply im patch."

# パッチを当てます。
patch:
	if [ ! -e emacs ] ; then tar zxvf src/emacs-22.*.tar.gz ; fi
#	if [ ! -e emacs-${VERSION} ] ; then tar zxvf src/emacs-22.*.tar.gz ; fi
#	ln -s emacs-${VERSION} emacs
	cd emacs ; \
	patch -p0 < ../src/patch/transparency4.patch ; \
	patch -p0 < ../src/patch/emacs-inline.patch ; \
	patch -p0 < ../src/patch/mac-functions.patch ; \
	patch -p0 < ../src/patch/mac-fullscreen.patch ; \
	patch -p0 < ../src/patch/cep-internal.patch ; \
	patch -p0 < ../src/patch/dired-proxy-icon.patch ; \
	patch -p0 < ../src/patch/toolbar-png.patch ; \
	patch -p0 < ../src/patch/no-fink.patch
	diff -u Resources/Info.plist.orig-20070906 Resources/Info.plist \
		| patch -d emacs/mac/Emacs.app/Contents/
	cp -p Resources/*.icns emacs/mac/Emacs.app/Contents/Resources/
	rm -rf emacs/lisp/obsolete
	mkdir -p emacs/lisp/mac
	$(INSTALL) src/lisp/*.el emacs/lisp/mac
	mv emacs/lisp/mac/site-*.el emacs/lisp/
	mv emacs/lisp/mac/ruby-mode.el emacs/lisp/progmodes/
	perl -i -p -e 'if(/GetInfo/){s/\".*\"/\"${LONG_VERSION}\"/;}' \
	emacs/mac/Emacs.app/Contents/Resources/English.lproj/InfoPlist.strings
	perl -i -p -e 'if(/@@@@/){s/\".*\"/\"${LONG_VERSION}\"/;}' \
	emacs/lisp/mac/carbon-emacs-package.el

###############################################################

# コンパイル

# UNAME にあわせてビルド方法を変更する
compile: 
ifeq (${UNAME},i386)
# Intel 用
	cd emacs ; \
	env \
	CC=gcc-4.2 \
	CFLAGS="-O2 -arch i386 -arch ppc7400 -DUSE_ATSUI -DUSE_MAC_TSM" \
	./configure \
		--prefix=/Applications/Emacs.app/Contents/Resources \
		--with-carbon --without-x \
                --libexecdir=${PACKAGE_APP}/Contents/MacOS/libexec ; \
	env LANG=C make bootstrap
#	CFLAGS="-Os -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -DUSE_ATSUI -DUSE_MAC_TSM"
else
# powerpc 用
	cd emacs ; \
	env \
	CFLAGS="-O2 -mtune=G4 -arch ppc -DUSE_ATSUI -DUSE_MAC_TSM" \
	./configure \
		--prefix=/Applications/Emacs.app/Contents/Resources \
		--with-carbon --without-x \
                --libexecdir=${PACKAGE_APP}/Contents/MacOS/libexec ; \
	env LANG=C make bootstrap
#	CFLAGS="-Os -mtune=G4 -arch ppc -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -DUSE_ATSUI -DUSE_MAC_TSM"
endif
#	env PER_ARCH_CFLAGS_ppc="-fast -mcpu=7450" \
#	make bootstrap
#	STARTFLAGS="-Wl,-syslibroot,${SDK} -arch i386 -arch ppc" \
# ref. http://developer.apple.com/documentation/MacOSX/Conceptual/universal_binary/universal_binary_compiling/chapter_2_section_7.html#//apple_ref/doc/uid/TP40002217-CH206-BAJJFEAC



###############################################################

# dmg ファイルを作って
dmg: create-dmg-stamp
create-dmg-stamp:
	if mount |egrep -qs '^/dev/[[:alnum:]]+ on /Volumes/Emacs'; then \
	  touch create-dmg-stamp; \
	  echo "/Volumes/Emacs is already mounted" >&2; \
	  exit 1; \
	fi
	if [ -e ${TEMP_DMG}    ] ; then rm ${TEMP_DMG}    ; fi
	if [ -e ${PACKAGE_DMG} ] ; then rm ${PACKAGE_DMG} ; fi
	hdiutil create -size 256m -type UDIF -fs HFS+ -volname "Emacs" -layout NONE ${TEMP_DMG}
	hdid ${TEMP_DMG}
	touch create-dmg-stamp

# Emacs をインストールします。
install: dmg
	if [ -e ${PACKAGE_APP} ]; then rm -rf ${PACKAGE_APP}; fi
	if [ -e ${PACKAGE_DIR}/Documents ]; then rm -rf ${PACKAGE_DIR}/Documents; fi
	cd emacs; \
	/bin/cp -r mac/Emacs.app ${PACKAGE_APP}; \
	make install prefix=${PACKAGE_PREFIX} carbon_appdir=`${PACKAGE_DIR}` GZIP_PROG="" infodir=${PACKAGE_INFODIR} mandir=${PACKAGE_PREFIX}/man
#	Stop to compress *.el files in order to create smaller dmg file.
#	dmg ファイルの圧縮効率をあげるため、*.el を gzip 圧縮しないよう変更
#	chmod 755 ${PACKAGE_PREFIX}/bin/emacs ${PACKAGE_PREFIX}/bin/emacs-${VERSION}
#	see FAQ 1.10 <http://members.shaw.ca/akochoi-emacs/stories/faq.html>
	mv ${PACKAGE_PREFIX}/bin ${PACKAGE_BIN}
	mv ${PACKAGE_APP}/Contents/MacOS/libexec/emacs/${VERSION}/*/* ${PACKAGE_APP}/Contents/MacOS/libexec/
	rm -rf ${PACKAGE_APP}/Contents/MacOS/libexec/emacs
#	mv ${PACKAGE_PREFIX}/libexec/emacs/${VERSION}/powerpc-* ${PACKAGE_APP}/Contents/MacOS/libexec
#	rm -rf ${PACKAGE_PREFIX}/libexec
	for d in etc leim lisp site-lisp ; do \
	       mv ${PACKAGE_PREFIX}/share/emacs/${VERSION}/$$d ${PACKAGE_PREFIX} ; \
	done
# 	for d in etc leim lisp site-lisp ; do \
# 		cd ${PACKAGE_PREFIX} ; ln -s share/emacs/${VERSION}/$$d ; \
# 	done
	rm    ${PACKAGE_PREFIX}/share/emacs/site-lisp/subdirs.el
	rmdir ${PACKAGE_PREFIX}/share/emacs/site-lisp
	rmdir ${PACKAGE_PREFIX}/share/emacs/${VERSION}
	rmdir ${PACKAGE_PREFIX}/share/emacs
	rmdir ${PACKAGE_PREFIX}/share
#	容量削減のため、leim の日本語辞書の el ファイルを削除
	if [ -e ${PACKAGE_PREFIX}/leim/ja-dic/ja-dic.el ] ; then \
		rm ${PACKAGE_PREFIX}/leim/ja-dic/ja-dic.el  ; fi
#	容量削減のため、リファレンスカード類 (postscriptファイル) を削除
	rm -rf ${PACKAGE_PREFIX}/etc/*-ref.ps
	rm -rf ${PACKAGE_PREFIX}/etc/*card.ps
	rm -rf ${PACKAGE_PREFIX}/etc/fr-drdref.ps
	rm -rf ${PACKAGE_PREFIX}/etc/gnus-booklet.ps
	rm -rf ${PACKAGE_PREFIX}/etc/gnus-logo.eps
	rm -rf ${PACKAGE_PREFIX}/etc/*.tex
#	cd ${PACKAGE_APP}/Contents/MacOS; rm Emacs; ln -s bin/emacs Emacs
	rm ${PACKAGE_BIN}/emacs
	rm ${PACKAGE_BIN}/emacs-${VERSION}
#	chmod 0755 ${PACKAGE_BIN}/emacs
#	全ての CVS ディレクトリを削除
	find ${PACKAGE_APP} -type d -name CVS | xargs rm -rf
#	copy GNOME's png files
	cp Resources/gnome-icons/*.png ${PACKAGE_PREFIX}/etc/images/
#	remove etc/*.pbm files, if *.xpm exists
	for f in `find ${PACKAGE_PREFIX}/etc/ -name '*.pbm'` ; do \
		if [ -e $$f ] && [ -e $${f%.pbm}.xpm ] ; then rm $$f ; fi ; \
	done
#	remove etc/images/*.xpm files, if *.png exists
	for f in ${PACKAGE_PREFIX}/etc/images/*.xpm ; do \
		if [ -e $${f%.xpm}.png ] ; then rm $$f ; fi ; \
	done
	ln -s /Applications ${PACKAGE_DIR}/
	mkdir ${PACKAGE_DIR}/Documents
	cp -p emacs/COPYING  ${PACKAGE_DIR}/Documents/License.txt
	cp -p emacs/mac/README  ${PACKAGE_DIR}/Documents/ReadMe_Mac.txt
	cp -p Resources/ReadMe.txt  ${PACKAGE_DIR}/Documents/ReadMe.txt
	cp -p Resources/Background.png ${PACKAGE_DIR}/
	mkdir ${PACKAGE_DIR}/Documents/Included_Packages
	mkdir ${PACKAGE_SITEDIR}/site-start.d
	touch ${PACKAGE_SITEDIR}/site-start.d/.nosearch
	cd  ${PACKAGE_SITEDIR} ; ln -s ../lisp/mac
	xattr -d com.apple.quarantine ${PACKAGE_DIR}/Emacs.app


###############################################################
#
# いろいろなパッケージのインストール／コンパイル手順
#

site-start: 
	cp -p src/site-lisp/*.el ${PACKAGE_SITEDIR}/
	cp -p src/site-lisp/site-start.d/*.el ${PACKAGE_SITEDIR}/site-start.d/

###############################################################
#
#  aspell
#  小林さんの GETTEXT 対策を追加
#  ref. [Macemacsjp-users 956]

_aspell: ${PACKAGE_BIN}/aspell

${PACKAGE_BIN}/aspell:
	tar zxvf src/aspell-*.tar.gz
	cd aspell-* ; \
	autoconf ; \
	perl -pi -e 's@/usr/local/lib@/aspell/is/complicated@g' configure ; \
	perl -pi -e 's@/usr/local/include@/aspell/is/complicated@g' configure ; \
	${ELISP_CONFIGURE} --disable-shared --enable-static \
	--prefix=/usr --libdir=/usr/lib --includedir=/usr/include \
	--enable-pkgdatadir=${PACKAGE_PREFIX}/lib/aspell-${UNAME} \
	--enable-pkglibdir=${PACKAGE_PREFIX}/lib/aspell-${UNAME} \
	--with-libiconv-prefix=/usr --disable-nls ; \
	perl -pi -e 's@/usr/local/.*$$@@g;' Makefile ; \
	${ELISP_MAKE} all ; \
	${ELISP_MAKE} libdir=/tmp/aspell includedir=/tmp/aspell \
		infodir=${PACKAGE_INFODIR} mandir=${PACKAGE_PREFIX}/man install
	rm -rf /tmp/aspell
	cp -p aspell-*/COPYING  ${PACKAGE_DIR}/Documents/Included_Packages/aspell.txt

_aspell-en: ${PACKAGE_BIN}/aspell
	tar jxvf src/aspell6-en-*.tar.bz2
	cd aspell6-en-* ; \
	PATH="$$PATH:${PACKAGE_BIN}" ./configure ; \
	PATH="$$PATH:${PACKAGE_BIN}" make install datadir=${PACKAGE_PREFIX}/lib/aspell-${UNAME} \
		dictdir=${PACKAGE_PREFIX}/lib/aspell-${UNAME}
	cp -p aspell6-en-*/Copyright  ${PACKAGE_DIR}/Documents/Included_Packages/aspell6-en.txt

#  aspell
####################

## mew（Universal Binary 対応）
_mew: ${PACKAGE_SITEDIR}/mew

${PACKAGE_SITEDIR}/mew:
	tar zxvf src/mew-*.tar.gz
	cd mew-* ; \
	env \
	CFLAGS="-Os -arch i386 -arch ppc" \
	${ELISP_CONFIGURE} \
		--mandir=${PACKAGE_PREFIX}/man \
		--infodir=${PACKAGE_INFODIR} ; \
	${ELISP_MAKE} all info jinfo install install-jinfo \
	LDFLAGS="-arch i386 -arch ppc" \
		elispdir=${PACKAGE_SITEDIR}/mew \
		etcdir=${PACKAGE_SITEDIR}/mew/etc
	touch ${PACKAGE_SITEDIR}/mew/etc/.nosearch
	rm ${PACKAGE_SITEDIR}/mew/etc/Mew.{img,xbm,xpm}
#		etcdir=${PACKAGE_PREFIX}/etc/mew
	cp -p mew-*/00copyright  ${PACKAGE_DIR}/Documents/Included_Packages/mew.txt

## nxml-mode
_nxml-mode: ${PACKAGE_SITEDIR}/nxml-mode

${PACKAGE_SITEDIR}/nxml-mode:
	tar zxvf src/nxml-mode-*.tar.gz
	cd nxml-mode-* ; \
	${ELISP_MAKE} ; \
	install-info nxml-mode.info ${PACKAGE_INFODIR}/dir \
	--entry="* nXML Mode: (nxml-mode). Major mode for editing XML."
	cp -pR nxml-mode-* ${PACKAGE_SITEDIR}/nxml-mode
	touch ${PACKAGE_SITEDIR}/nxml-mode/char-name/.nosearch
	touch ${PACKAGE_SITEDIR}/nxml-mode/schema/.nosearch
	rm ${PACKAGE_SITEDIR}/nxml-mode/dir
	rm ${PACKAGE_SITEDIR}/nxml-mode/nxml-mode.texi
	mv ${PACKAGE_SITEDIR}/nxml-mode/nxml-mode.info ${PACKAGE_INFODIR}/
	if [ -e ${PACKAGE_SITEDIR}/nxhtml/etc/schema/ ] ; then \
		cp src/xhtml-loader.rnc ${PACKAGE_SITEDIR}/nxhtml/etc/schema/ ;\
	fi


###############################################################

## auctex
# ref. http://www.esm.psu.edu/mac-tex/installauctex.html (en)
# ref. http://pop-club.hp.infoseek.co.jp/emacs/auctex-jp.html (jp)
# preview-latex 対応のため、インストール時に最新の TeX + gs 環境が必要
# site-start.d にもファイルがインストールされる
# preview-latex 用のスタイルファイルを システムの TeX フォルダに
# インストールしたくないときに --without-texmf-dir を用いる

_auctex: ${PACKAGE_SITEDIR}/auctex

${PACKAGE_SITEDIR}/auctex:
	tar zxvf src/auctex-*.tar.gz
	cd auctex* ; \
	patch < ../src/patch/toolbar-auctex.patch ; \
	${ELISP_CONFIGURE} --without-texmf-dir \
		--with-lispdir=${PACKAGE_SITEDIR} \
		--infodir=${PACKAGE_INFODIR} ; \
	make all install
#	容量削減のため、マニュアル (preview.dvi) を削除
	if [ -e ${PACKAGE_SITEDIR}/auctex/doc ] ; then \
		rm -r ${PACKAGE_SITEDIR}/auctex/doc  ; fi
	perl -i -p -e 's@"${PACKAGE_PREFIX}/var/auctex"@\(concat carbon-emacs-package-prefix \"/var/auctex\"\)@;' ${PACKAGE_SITEDIR}/tex-site.el


## extra elisp pack
_extra: ${PACKAGE_PREFIX}/extra

${PACKAGE_PREFIX}/extra:
	tar zxvf src/extra-* -C ${PACKAGE_PREFIX}
	rsync -avz ${PACKAGE_PREFIX}/extra/lisp/* ${PACKAGE_SITEDIR}
	rm -rf ${PACKAGE_PREFIX}/extra/lisp
	mv ${PACKAGE_SITEDIR}/extra-autoloads.el ${PACKAGE_SITEDIR}/site-start.d/
	cp src/patch/flymake-css.el ${PACKAGE_SITEDIR}/nxhtml/related/


###############################################################

# 収録アプリケーション

# Coral
_coral:
	if [ ! -e ${PACKAGE_LIBRARY} ] ; then mkdir ${PACKAGE_LIBRARY} ; fi
	tar zxvf src/coral/coral_app.tar.gz -C ${PACKAGE_LIBRARY}
	cp -p Resources/coral-license.txt  ${PACKAGE_DIR}/Documents/Included_Packages/coral.txt


###############################################################


# 追加 lisp パッケージを作成、インストールする部分
pkg: site-start _aspell-en _auctex _extra _mew _nxml-mode _coral
	open ${PACKAGE_DIR}
	@echo "make icon"

# Universal 化のための簡易版バイナリ（Emacs 本体と aspell のみ必要）
pkg-mini: site-start _aspell-en _coral
	open ${PACKAGE_DIR}

icon:
	if [ -e ${PACKAGE_DIR}/.Background.png ] ; then \
		mv ${PACKAGE_DIR}/.Background.png ${PACKAGE_DIR}/Background.png ; \
	fi
	open ${PACKAGE_DIR}
	osascript Resources/Rakuchin.applescript
	osascript Resources/Rakuchin.applescript
	osascript Resources/Rakuchin.applescript
	if [ -e ${PACKAGE_DIR}/Background.png ] ; then \
		mv ${PACKAGE_DIR}/Background.png ${PACKAGE_DIR}/.Background.png ; \
	fi

###############################################################
#
# Build 終了手順
# Tiger 以降、圧縮率の高い bzip2 フォーマット( -format UDBZ の部分）を
# 使って、ファイルサイズを小さくしている。
#

done: 
#	ditto -rsrcFork /Applications/Emacs.app /Volumes/Emacs/Emacs.app
	if [ -e ${PACKAGE_DIR}/Background.png ] ; then \
		mv ${PACKAGE_DIR}/Background.png ${PACKAGE_DIR}/.Background.png ; \
	fi
	hdiutil eject `df | grep ${PACKAGE_DIR} | cut -f1 -d\ `
# 	hdiutil convert -format UDZO -imagekey zlib-level=9 \
# 		-o ${PACKAGE_DMG} ${TEMP_DMG}
	sleep 1
	hdiutil convert -format UDBZ -o ${PACKAGE_DMG} ${TEMP_DMG}
	rm create-dmg-stamp
	/usr/bin/openssl sha1 ${PACKAGE_DMG}
	open .

###############################################################
#
# Universal Binary を作成します。
#
# 手順）
# Emacs (test.dmg) を開いておく → /Volumes/Emacs
# 次に   Emacs (ppc) を開く     → /Volumes/Emacs 1
# 最後に Emacs (i386) を開く    → /Volumes/Emacs 2
# 
# Emacs (i386), Emacs (ppc) の中のバイナリファイルを
# ひとつの Universal Binary ファイルに接合して
# Emacs (test.dmg) の中に書き込みます。

universal:
	@echo "Emacs (Universal) - Emacs 1 (ppc) - Emacs 2 (i386)"
	for d in \
		Emacs.app/Contents/MacOS/Emacs \
		Emacs.app/Contents/MacOS/bin/aspell \
		Emacs.app/Contents/MacOS/bin/prezip-bin \
		Emacs.app/Contents/MacOS/bin/word-list-compress \
		; do \
		lipo -arch ppc /Volumes/Emacs\ 1/$$d -arch i386 /Volumes/Emacs\ 2/$$d \
			-create -output /Volumes/Emacs/$$d ;\
	done
	cp -pR /Volumes/Emacs\ 1/Emacs.app/Contents/Resources/lib/aspell-* \
		/Volumes/Emacs/Emacs.app/Contents/Resources/lib/aspell-powerpc

universal-done:
	if [ -e ${PACKAGE_DIR}/Background.png ] ; then \
		mv ${PACKAGE_DIR}/Background.png ${PACKAGE_DIR}/.Background.png ; \
	fi
	hdiutil eject `df | grep ${PACKAGE_DIR} | cut -f1 -d\ `
	sleep 1
	hdiutil convert -format UDBZ -o CarbonEmacs-Leopard-${DATE}.dmg ${TEMP_DMG}
	open .

# end
