# -*- encoding: utf-8 -*-
#
# $Id $
#
# Copyright © 2003 Keith Packard
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of the author(s) not be used in
# advertising or publicity pertaining to distribution of the software without
# specific, written prior permission.  The authors make no
# representations about the suitability of this software for any purpose.  It
# is provided "as is" without express or implied warranty.
#
# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#

INCLUDES=-I${top_srcdir}/src -I${top_srcdir} $(WARN_CFLAGS)

TMPL=fclang.tmpl.h
STMPL=${top_srcdir}/fc-lang/fclang.tmpl.h
TARG=fclang.h

noinst_PROGRAMS=fc-lang

noinst_MANS=fc-lang.man

EXTRA_DIST = $(TARG) $(TMPL) $(ORTH)

if CROSS_COMPILING
$(TARG):$(ORTH) fc-lang.c $(STMPL)
	@echo Warning: cannot rebuild $(TARG) when cross-compiling
else
$(TARG):$(ORTH) fc-lang${EXEEXT} $(STMPL)
	$(AM_V_GEN) $(RM) $(TARG); \
	./fc-lang${EXEEXT} -d ${srcdir} $(ORTH) < $(STMPL) > $(TARG).tmp && \
	mv $(TARG).tmp $(TARG)
endif

ALIAS_FILES = fcalias.h fcaliastail.h

BUILT_SOURCES = $(ALIAS_FILES) $(TARG)

$(ALIAS_FILES):
	touch $(ALIAS_FILES)

CLEANFILES = $(ALIAS_FILES)

DISTCLEANFILES = $(TARG)

MAINTAINERCLEANFILES = $(TARG)

# NOTE:
#
# The order of the orth files here is extremely important (part of the cache
# format) and should not be modified.  New orth files should be added at the
# end.  No files should be removed either.
#
ORTH = \
	aa.orth \
	ab.orth \
	af.orth \
	am.orth \
	ar.orth \
	as.orth \
	ast.orth \
	av.orth \
	ay.orth \
	az_az.orth \
	az_ir.orth \
	ba.orth \
	bm.orth \
	be.orth \
	bg.orth \
	bh.orth \
	bho.orth \
	bi.orth \
	bin.orth \
	bn.orth \
	bo.orth \
	br.orth \
	bs.orth \
	bua.orth \
	ca.orth \
	ce.orth \
	ch.orth \
	chm.orth \
	chr.orth \
	co.orth \
	cs.orth \
	cu.orth \
	cv.orth \
	cy.orth \
	da.orth \
	de.orth \
	dz.orth \
	el.orth \
	en.orth \
	eo.orth \
	es.orth \
	et.orth \
	eu.orth \
	fa.orth \
	fi.orth \
	fj.orth \
	fo.orth \
	fr.orth \
	ff.orth \
	fur.orth \
	fy.orth \
	ga.orth \
	gd.orth \
	gez.orth \
	gl.orth \
	gn.orth \
	gu.orth \
	gv.orth \
	ha.orth \
	haw.orth \
	he.orth \
	hi.orth \
	ho.orth \
	hr.orth \
	hu.orth \
	hy.orth \
	ia.orth \
	ig.orth \
	id.orth \
	ie.orth \
	ik.orth \
	io.orth \
	is.orth \
	it.orth \
	iu.orth \
	ja.orth \
	ka.orth \
	kaa.orth \
	ki.orth \
	kk.orth \
	kl.orth \
	km.orth \
	kn.orth \
	ko.orth \
	kok.orth \
	ks.orth \
	ku_am.orth \
	ku_ir.orth \
	kum.orth \
	kv.orth \
	kw.orth \
	ky.orth \
	la.orth \
	lb.orth \
	lez.orth \
	ln.orth \
	lo.orth \
	lt.orth \
	lv.orth \
	mg.orth \
	mh.orth \
	mi.orth \
	mk.orth \
	ml.orth \
	mn_cn.orth \
	mo.orth \
	mr.orth \
	mt.orth \
	my.orth \
	nb.orth \
	nds.orth \
	ne.orth \
	nl.orth \
	nn.orth \
	no.orth \
	nr.orth \
	nso.orth \
	ny.orth \
	oc.orth \
	om.orth \
	or.orth \
	os.orth \
	pa.orth \
	pl.orth \
	ps_af.orth \
	ps_pk.orth \
	pt.orth \
	rm.orth \
	ro.orth \
	ru.orth \
	sa.orth \
	sah.orth \
	sco.orth \
	se.orth \
	sel.orth \
	sh.orth \
	shs.orth \
	si.orth \
	sk.orth \
	sl.orth \
	sm.orth \
	sma.orth \
	smj.orth \
	smn.orth \
	sms.orth \
	so.orth \
	sq.orth \
	sr.orth \
	ss.orth \
	st.orth \
	sv.orth \
	sw.orth \
	syr.orth \
	ta.orth \
	te.orth \
	tg.orth \
	th.orth \
	ti_er.orth \
	ti_et.orth \
	tig.orth \
	tk.orth \
	tl.orth \
	tn.orth \
	to.orth \
	tr.orth \
	ts.orth \
	tt.orth \
	tw.orth \
	tyv.orth \
	ug.orth \
	uk.orth \
	ur.orth \
	uz.orth \
	ve.orth \
	vi.orth \
	vo.orth \
	vot.orth \
	wa.orth \
	wen.orth \
	wo.orth \
	xh.orth \
	yap.orth \
	yi.orth \
	yo.orth \
	zh_cn.orth \
	zh_hk.orth \
	zh_mo.orth \
	zh_sg.orth \
	zh_tw.orth \
	zu.orth \
	ak.orth \
	an.orth \
	ber_dz.orth \
	ber_ma.orth \
	byn.orth \
	crh.orth \
	csb.orth \
	dv.orth \
	ee.orth \
	fat.orth \
	fil.orth \
	hne.orth \
	hsb.orth \
	ht.orth \
	hz.orth \
	ii.orth \
	jv.orth \
	kab.orth \
	kj.orth \
	kr.orth \
	ku_iq.orth \
	ku_tr.orth \
	kwm.orth \
	lg.orth \
	li.orth \
	mai.orth \
	mn_mn.orth \
	ms.orth \
	na.orth \
	ng.orth \
	nv.orth \
	ota.orth \
	pa_pk.orth \
	pap_an.orth \
	pap_aw.orth \
	qu.orth \
	rn.orth \
	rw.orth \
	sc.orth \
	sd.orth \
	sg.orth \
	sid.orth \
	sn.orth \
	su.orth \
	ty.orth \
	wal.orth \
	za.orth \
	lah.orth \
	nqo.orth \
	brx.orth \
	sat.orth \
	doi.orth \
	mni.orth
#	^-------------- Add new orth files here
