#                                                     -*- Makefile -*-
# Copyright (c) 1999, 2000  Motoyuki Kasahara
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#

#
# 注意: この Makefile の断片は、GNU make でないと正しく扱えません。
#

######################################################################
# 変数の定義
######################################################################

# Bourne 互換シェル
SHELL = /bin/sh

# Makefile 中で起動されるスクリプト群が置かれているディレクトリ
ifndef FPWLIBEXECDIR
FPWLIBEXECDIR = /usr/pkg/libexec/freepwing
endif

# 作業ファイルを書き込むディレクトリ
ifndef WORKDIR
WORKDIR = work
endif

# perl コマンド
ifndef PERL
PERL = ${FPWLIBEXECDIR}/perl.sh
endif

# perl コマンドに渡す *.pm ファイルの検索オプション
ifndef PERLINCFLAGS
PERLINCFLAGS = 
endif

# perl コマンドに渡す引数
ifndef PERLFLAGS
PERLFLAGS = 
endif

# fpwhalfchar コマンド
ifndef FPWHALFCHAR
FPWHALFCHAR = ${FPWLIBEXECDIR}/fpwhalfchar
endif

# fpwhalfchar コマンドに渡す外字定義ファイル
ifndef HALFCHARS
HALFCHARS = 
endif

# fpwfullchar コマンド
ifndef FPWFULLCHAR
FPWFULLCHAR = ${FPWLIBEXECDIR}/fpwfullchar
endif

# fpwhalfchar コマンドに渡す外字定義ファイル
ifndef FULLCHARS
FULLCHARS = 
endif

# fpwcgraph コマンド
ifndef FPWCGRAPH
FPWCGRAPH = ${FPWLIBEXECDIR}/fpwcgraph
endif

# fpwcgraph コマンドに渡すカラー図版ファイル
ifndef CGRAPHS
CGRAPHS = 
endif

# fpwsound コマンド
ifndef FPWSOUND
FPWSOUND = ${FPWLIBEXECDIR}/fpwsound
endif

# fpwsound コマンドに渡すカラー図版ファイル
ifndef SOUNDS
SOUNDS = 
endif

# パーサコマンド
# (通常、ユーザ側の Makefile で上書きされる。)
ifndef FPWPARSER
FPWPARSER = ${FPWLIBEXECDIR}/fpwparser
endif

# パーサコマンドに渡す引数
# (通常、ユーザ側の Makefile で上書きされる。)
ifndef FPWPARSERFLAGS
FPWPARSERFLAGS = 
endif

# fpwsort サブコマンド
ifndef FPWSORT
FPWSORT = ${FPWLIBEXECDIR}/fpwsort
endif

# fpwindex サブコマンド
ifndef FPWINDEX
FPWINDEX = ${FPWLIBEXECDIR}/fpwindex
endif

# fpwcontrol サブコマンド
ifndef FPWCONTROL
FPWCONTROL = ${FPWLIBEXECDIR}/fpwcontrol
endif

# fpwlink サブコマンド
ifndef FPWLINK
FPWLINK = ${FPWLIBEXECDIR}/fpwlink
endif

# mkdirhier コマンド
ifndef MKDIRHIER
MKDIRHIER = ${FPWLIBEXECDIR}/mkdirhier
endif

# cphier コマンド
ifndef CPHIER
CPHIER = ${FPWLIBEXECDIR}/cphier
endif

# make の進行を記録するファイル群
ifndef USERCHAR_DEP
USERCHAR_DEP = ${WORKDIR}/userchar.dep
endif
ifndef CGRAPH_DEP
CGRAPH_DEP = ${WORKDIR}/cgraph.dep
endif
ifndef SOUND_DEP
SOUND_DEP = ${WORKDIR}/sound.dep
endif
ifndef PARSE_DEP
PARSE_DEP = ${WORKDIR}/parse.dep
endif
ifndef SORT_DEP
SORT_DEP = ${WORKDIR}/sort.dep
endif
ifndef INDEX_DEP
INDEX_DEP = ${WORKDIR}/index.dep
endif
ifndef CONTROL_DEP
CONTROL_DEP = ${WORKDIR}/control.dep
endif
ifndef LINK_DEP
LINK_DEP = ${WORKDIR}/link.dep
endif

# gzip コマンド
ifndef GZIPCMD
GZIPCMD = gzip
endif

# zip コマンド
ifndef ZIP
ZIP = zip
endif

# bzip2 コマンド
ifndef BZIP2
BZIP2 = bzip2
endif

# catdump コマンド
ifndef CATDUMP
CATDUMP = ${FPWLIBEXECDIR}/catdump
endif

# catdump コマンドに渡す引数
ifndef CATDUMPFLAGS
CATDUMPFLAGS = 
endif

# 入力データファイル群
# (通常、ユーザ側の Makefile で設定される。)
ifndef SOURCES
SOURCES = 
endif

# honmon を作成する際 (fpwmake all) に、依存するファイル
# (通常、ユーザ側の Makefile で設定される。)
ifndef ALLDEPS
ALLDEPS = 
endif

# パッケージの名前
# (通常、ユーザ側の Makefile で設定される。)
ifndef PACKAGE
PACKAGE = package
endif

# 書籍のディレクトリ名
# (通常、ユーザ側の Makefile で設定される。)
ifndef DIR
DIR = subdir
endif

# バイナリパッケージに添付するファイル
# (通常、ユーザ側の Makefile で設定される。)
ifndef PACKAGEEXTRA
PACKAGEEXTRA = 
endif

# バイナリパッケージを作成する際 (fpwmake package) に、依存するファイル
# (通常、ユーザ側の Makefile で設定される。)
ifndef PACKAGEDEPS
PACKAGEDEPS = 
endif

# ソースアーカイブに添付するファイル
# (通常、ユーザ側の Makefile で設定される。)
ifndef ARCHIVEEXTRA
ARCHIVEEXTRA = 
endif

# clean 実行時に一緒に削除されるファイル
# (通常、ユーザ側の Makefile で設定される。)
ifndef CLEANEXTRA
CLEANEXTRA = 
endif

# インストール先のディレクトリ
ifndef INSTALLDIR
INSTALLDIR = /usr/pkg/share/dict
endif

######################################################################
# 生成ルール
######################################################################

#
# all (デフォルトターゲット)
#	 
.PHONY: all 
all: ${ALLDEPS} link

#
# 外字の作成
#
.PHONY: userchar userchar-recursive 

ifneq ($(strip ${SUBDIRS}),)
userchar: userchar-recursive
else
userchar: ${USERCHAR_DEP}
endif

userchar-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir userchar ; \
	done

${USERCHAR_DEP}: ${HALFCHARS} ${FULLCHARS}
	@rm -f ${USERCHAR_DEP}
	test -d ${WORKDIR} || ${MKDIRHIER} ${WORKDIR}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWHALFCHAR} \
	   -workdir ${WORKDIR} ${HALFCHARS}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWFULLCHAR} \
	   -workdir ${WORKDIR} ${FULLCHARS}
	@echo timestamp > ${USERCHAR_DEP}

#
# カラー図版の作成
#
.PHONY: cgraph cgraph-recursive 

ifneq ($(strip ${SUBDIRS}),)
cgraph: cgraph-recursive
else
cgraph: ${CGRAPH_DEP}
endif

cgraph-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir cgraph ; \
	done

${CGRAPH_DEP}: ${CGRAPHS}
	@rm -f ${CGRAPH_DEP}
ifneq ($(strip ${CGRAPHS}),)
	test -d ${WORKDIR} || ${MKDIRHIER} ${WORKDIR}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWCGRAPH} \
	   -workdir ${WORKDIR} ${CGRAPHS}
endif
	@echo timestamp > ${CGRAPH_DEP}

#
# 音声データの作成
#
.PHONY: sound sound-recursive 

ifneq ($(strip ${SUBDIRS}),)
sound: sound-recursive
else
sound: ${SOUND_DEP}
endif

sound-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir sound ; \
	done

${SOUND_DEP}: ${SOUNDS}
	@rm -f ${SOUND_DEP}
ifneq ($(strip ${SOUNDS}),)
	test -d ${WORKDIR} || ${MKDIRHIER} ${WORKDIR}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWSOUND} \
	   -workdir ${WORKDIR} ${SOUNDS}
endif
	@echo timestamp > ${SOUND_DEP}

#
# ユーザが用意した解析プログラムの実行
#
.PHONY: parse parse-recursive

ifneq ($(strip ${SUBDIRS}),)
parse: parse-recursive
else
parse: ${PARSE_DEP}
endif

parse-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir parse ; \
	done

${PARSE_DEP}: ${USERCHAR_DEP} ${CGRAPH_DEP} ${SOUND_DEP} ${SOURCES}
	@rm -f ${PARSE_DEP}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWPARSER} \
	   -workdir ${WORKDIR} ${FPWPARSERFLAGS}
	@echo timestamp > ${PARSE_DEP}

#
# 単語一覧のソート
#
.PHONY: sort sort-recursive

ifneq ($(strip ${SUBDIRS}),)
sort: sort-recursive
else
sort: ${SORT_DEP}
endif

sort-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir sort ; \
	done

${SORT_DEP}: ${PARSE_DEP}
	@rm -f ${SORT_DEP}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWSORT} -workdir ${WORKDIR} 
	@echo timestamp > ${SORT_DEP}

#
# インデックスの作成
#
.PHONY: index index-recursive

ifneq ($(strip ${SUBDIRS}),)
index: index-recursive
else
index: ${INDEX_DEP}
endif

index-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir index ; \
	done

${INDEX_DEP}: ${SORT_DEP}
	@rm -f ${INDEX_DEP}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWINDEX} -workdir ${WORKDIR} 
	@echo timestamp > ${INDEX_DEP}

#
# 書籍管理情報の作成
#
.PHONY: control control-recursive

ifneq ($(strip ${SUBDIRS}),)
control: control-recursive
else
control: ${CONTROL_DEP}
endif

control-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir control ; \
	done

${CONTROL_DEP}: ${INDEX_DEP}
	@rm -f ${CONTROL_DEP}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWCONTROL} -workdir ${WORKDIR}
	@echo timestamp > ${CONTROL_DEP}

#
# 各データを結合して honmon の作成
#
.PHONY: link link-recursive

ifneq ($(strip ${SUBDIRS}),)
link: link-recursive
else
link: ${LINK_DEP}
endif

link-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir link ; \
	done

${LINK_DEP}: ${CONTROL_DEP}
	@rm -f ${LINK_DEP}
	${PERL} ${PERLINCFLAGS} ${PERLFLAGS} ${FPWLINK} -workdir ${WORKDIR}
	@echo timestamp > ${LINK_DEP}

#
# catalogs の作成
#
ifneq ($(strip ${SUBDIRS}),)
catalogs.txt: $(addsuffix /catalogs.txt,${SUBDIRS})
	rm -f $@
	echo "[Catalog]" > $@
	echo "FileName	= catalogs" >> $@
	echo "Type		= EPWING1" >> $@
	${PERL} -e 'printf "Books\t\t= %d\n", scalar(@ARGV)' ${SUBDIRS} >> $@
	for subdir in ${SUBDIRS} ; do \
	   echo "[Book]" >> $@ ; \
	   sed -n -e '/^Title[ 	]*=/p' ${SUBDIRS}/$@ >> $@ ; \
	   sed -n -e '/^BookType[ 	]*=/p' ${SUBDIRS}/$@ >> $@ ; \
	   echo "Directory	= \"$$subdir\"" >> $@ ; \
	done
endif

catalogs: catalogs.txt
	rm -f $@
	${CATDUMP} ${CATDUMPFLAGS} -u catalogs.txt $@

#
# 生成したファイルの削除
#
.PHONY: clean clean-recursive clean-directory

ifneq ($(strip ${SUBDIRS}),)
clean: clean-recursive clean-directory
else
clean: clean-directory
endif

clean-recursive:
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir clean ; \
	done
	rm -f catalogs.txt

clean-directory:
	rm -rf ${WORKDIR}
	rm -rf ${PACKAGE}
	rm -f catalogs honmon ${CLEANEXTRA}
	rm -f ${PACKAGE}.zip ${PACKAGE}.tar.gz ${PACKAGE}.tar.bz2
	rm -f ${PACKAGE}-src.tar.gz

#
# パッケージの作成 (*.zip 版)
#
package package-zip:
	rm -rf ${DIR}
	rm -f ${PACKAGE}.zip
	${MAKE} INSTALLDIR="." DIR="${DIR}" install
	chmod 777 ${DIR}
ifneq ($(strip ${SUBDIRS}),)
	for subdir in ${SUBDIRS} ; do \
	   chmod 777 ${DIR}/$${subdir}/data ; \
	done
else
	chmod 777 ${DIR}/${DIR}/data
endif
	${ZIP} -9rkq ${PACKAGE}.zip ${DIR}
	rm -rf ${DIR}

#
# パッケージの作成 (*.tar.gz 版)
#
.PHONY: package package-zip package-tar-gz package-tar-bz2

package-tar-gz:
	rm -rf ${DIR}
	rm -f ${PACKAGE}.tar.gz
	${MAKE} INSTALLDIR="." DIR="${DIR}" install
	chmod 777 ${DIR}
ifneq ($(strip ${SUBDIRS}),)
	for subdir in ${SUBDIRS} ; do \
	   chmod 777 ${DIR}/$${subdir}/data ; \
	done
else
	chmod 777 ${DIR}/${DIR}/data
endif
	tar cf - ${DIR} | ${GZIPCMD} -9 > ${PACKAGE}.tar.gz
	rm -rf ${DIR}

#
# パッケージの作成 (*.tar.bz2 版)
#
package-tar-bz2:
	rm -rf ${DIR}
	rm -f ${PACKAGE}.tar.bz2
	${MAKE} INSTALLDIR="." DIR="${DIR}" install
	chmod 777 ${DIR}
ifneq ($(strip ${SUBDIRS}),)
	for subdir in ${SUBDIRS} ; do \
	   chmod 777 ${DIR}/$${subdir}/data ; \
	done
else
	chmod 777 ${DIR}/${DIR}/data
endif
	tar cf - ${DIR} | ${BZIP2} -9 > ${PACKAGE}.tar.bz2
	rm -rf ${DIR}

#
# インストール
#
.PHONY: install install-directory

install: all catalogs ${PACKAGEDEPS}
	${MKDIRHIER} ${INSTALLDIR}/${DIR}
	for file in catalogs ; do \
	   ${CPHIER} $$file ${INSTALLDIR}/${DIR}/$$file ; \
	   chmod 0644 ${INSTALLDIR}/${DIR}/$$file ; \
	done
ifneq ($(strip ${SUBDIRS}),)
	for subdir in ${SUBDIRS} ; do \
	   case ${INSTALLDIR} in \
	   /*) ${MAKE} -C $$subdir \
	       INSTALLDIR="${INSTALLDIR}/${DIR}/$$subdir" \
	       install-directory ;; \
	   *)  ${MAKE} -C $$subdir \
	       INSTALLDIR="../${INSTALLDIR}/${DIR}/$$subdir" \
	       install-directory ;; \
	   esac ; \
	done
else
	${MAKE} INSTALLDIR="${INSTALLDIR}/${DIR}/${DIR}" install-directory
endif
	packageextra='${PACKAGEEXTRA}' ; \
	for file in $$packageextra ; do \
	   case $$file in \
	   *=*) srcfile="`echo $$file | sed 's/=.*//'`" ; \
	        dstfile="`echo $$file | sed 's/.*=//'`" ; \
	        ${CPHIER} $$srcfile ${INSTALLDIR}/${DIR}/$$dstfile ; \
		if [ -f ${INSTALLDIR}/${DIR}/$$dstfile ] ; then \
	           chmod 0644 ${INSTALLDIR}/${DIR}/$$dstfile ; \
		fi ;; \
	   *)   ${CPHIER} $$file ${INSTALLDIR}/${DIR}/$$file ; \
		if [ -f ${INSTALLDIR}/${DIR}/$$file ] ; then \
	           chmod 0644 ${INSTALLDIR}/${DIR}/$$file ; \
		fi ;; \
	   esac ; \
	done

install-directory:
	${MKDIRHIER} ${INSTALLDIR}/data
	for file in honmon ; do \
	   ${CPHIER} $$file ${INSTALLDIR}/data/$$file ; \
	   chmod 0644 ${INSTALLDIR}/data/$$file ; \
	done
	${MKDIRHIER} ${INSTALLDIR}/gaiji
	for file in gai16h gai24h gai30h gai48h gai16f gai24f gai30f gai48f ; do \
	   if test -f $$file ; then \
	      ${CPHIER} $$file ${INSTALLDIR}/gaiji/$$file ; \
	      chmod 0644 ${INSTALLDIR}/gaiji/$$file ; \
	   fi ; \
	done

#
# 変換スクリプトのアーカイブを作成
#
.PHONY: archive archive-directory

archive:
	rm -rf ${PACKAGE}
	rm -f ${PACKAGE}-src.tar.gz
	${MKDIRHIER} ${PACKAGE}
	chmod 777 ${PACKAGE}
ifneq ($(strip ${SUBDIRS}),)
	for subdir in ${SUBDIRS} ; do \
	   ${MAKE} -C $$subdir ARCHIVEDIR="../${PACKAGE}/$$subdir" \
	      archive-directory ; \
	   chmod 777 ${PACKAGE}/$${subdir} ; \
	done
endif
	${MAKE} ARCHIVEDIR="${PACKAGE}" archive-directory
	tar cf - ${PACKAGE} | ${GZIPCMD} -9 > ${PACKAGE}-src.tar.gz
	rm -rf ${PACKAGE}

archive-directory:
	for file in README Makefile catalogs.txt ${FPWPARSER} \
	   ${CGRAPHS} ${SOUNDS} ${HALFCHARS} ${FULLCHARS} ; do \
	   if test -f $$file ; then \
	      ${CPHIER} $$file ${ARCHIVEDIR}/$$file ; \
	   fi ; \
	done
	archiveextra='${ARCHIVEEXTRA}' ; \
	for file in $$archiveextra ; do \
	   case $$file in \
	   *=*) srcfile="`echo $$file | sed 's/=.*//'`" ; \
	        dstfile="`echo $$file | sed 's/.*=//'`" ; \
	        ${CPHIER} $$srcfile ${ARCHIVEDIR}/$$dstfile ;; \
	   *)   ${CPHIER} $$file ${ARCHIVEDIR}/$$file ;; \
	   esac ; \
	done

.SUFFIXES:

#
# バージョン [3.59, 3.63) の GNU make に対して、すべての変数を export
# しないように指示する。そうしないと、システム (少なくとも SysV) の
# 制限値を越えてしまう。
#
.NOEXPORT:
