default: build

datadir = /usr/lib/jvm-bridge/share
libdir = /usr/lib/jvm-bridge/lib
bindir = /usr/lib/jvm-bridge/bin
JVMFILE			= $(datadir)/current.jvm

ShowClasses.cabal: cabal.m4
	m4 -DPROGRAM=ShowClasses $< > $@

stage2.cabal: cabal.m4
	m4 -DPROGRAM= $< > $@

cabals: ShowClasses.cabal stage2.cabal

cabal-clean-%:
	rm -f *.cabal
	make $*.cabal
	make cabal-clean
	rm $*.cabal

cabal-build-%:
	rm -f *.cabal
	make $*.cabal
	make cabal-build
	rm $*.cabal

cabal-haddock-%:
	rm -f *.cabal
	make $*.cabal
	make cabal-haddock
	rm $*.cabal

cabal-install-%:
	rm -f *.cabal
	make $*.cabal
	make cabal-install
	rm $*.cabal

dist/build/ShowClasses/ShowClasses: cabal-build-ShowClasses

cabal-clean:
	cabal clean

cabal-configure:
	cabal configure

cabal-build: cabal-configure
	cabal build

cabal-haddock: cabal-configure
	-cabal haddock

cabal-install: cabal-build cabal-haddock
	cabal install --user

clean: cabal-clean-ShowClasses cabal-clean-stage2
	rm -rf Foreign/JavaVM/Invocation.hs Foreign/JavaVM/Lib/Header/* Foreign/JavaVM/Lib/Class_* ShowClasses *.hi *.o *.inplace *.classlist MakeClassModule MakeHeaderModule MakeJVMModule

ShowClasses: dist/build/ShowClasses/ShowClasses
	ln -sf $< $@

.SECONDARY:

MakeHeaderModule.inplace: MakeHeaderModule.m4
	m4 -Ddatadir=. $< > $@
	chmod a+x $@

MakeClassModule.inplace: MakeClassModule.m4
	. $(JVMFILE); m4 -Dbindir=. -Ddatadir=. -Djardir=$(datadir) -Dlibdirs="$(libdir)/:$${JVM_LIBDIRS}" $< > $@
	chmod a+x $@

MakeClassModule: MakeClassModule.m4
	. $(JVMFILE); m4 -Dbindir=$(bindir) -Ddatadir=$(datadir) -Djardir=$(datadir) -Dlibdirs="$(libdir)/:$${JVM_LIBDIRS}" $< > $@
	chmod a+x $@

MakeHeaderModule: MakeHeaderModule.m4
	m4 -Ddatadir=$(datadir) $< > $@
	chmod a+x $@

MakeJVMModule: MakeJVMModule.m4
	m4 -Ddatadir=$(datadir) $< > $@
	chmod a+x $@

%.classlist: All.classlist %.allowedclasses
	sed -n -e "`sed -e 's|\.|\\\.|g; s|^|/^|; s|$$|/ p;|' < $*.allowedclasses`" < $< > $@

All.classlist: $(JVMFILE)
	. $(JVMFILE); for ff in `echo $${JVM_CLASSES}`; do $${JAR} tf $${ff}; done | sed -n -e 's/^\([^-]*\).class$$/\1/ p' | sort -u | tr / . > $@

Foreign/JavaVM/Lib/Header/%.hs: %.classlist MakeHeaderModule.inplace Header.m4
	./MakeHeaderModule.inplace -module Foreign.JavaVM.Lib.Header.$* $< > $@

Foreign/JavaVM/Lib/Class_%.hs: MakeClassModule.inplace Java.classlist ShowClasses Class.m4
	./MakeClassModule.inplace -import Foreign.JavaVM.Lib.Header.Java `echo $* | sed -e 's/_/\./g; s/\.\./_/g'` > $@

Foreign/JavaVM/Invocation.hs: Foreign/JavaVM/Invocation.hs.m4
	m4 -DBRIDGEJAR="$(datadir)/JVMBridge.jar" $< > $@

otherstuff:	\
	Foreign/JavaVM/Lib/Header/Java.hs	\
	Foreign/JavaVM/Lib/Header/JavaX.hs	\
	Foreign/JavaVM/Lib/Header/OMG.hs	\
	Foreign/JavaVM/Lib/Header/Misc.hs	\
	Foreign/JavaVM/Lib/Class_java_lang_Thread.hs	\
	Foreign/JavaVM/Lib/Class_java_lang_Object.hs	\
	Foreign/JavaVM/Lib/Class_java_lang_Class.hs	\
	Foreign/JavaVM/Invocation.hs

extrastuff: MakeClassModule ShowClasses Class.m4 MakeJVMModule JVM.m4 MakeHeaderModule Header.m4 otherstuff

build: extrastuff cabal-build-stage2

haddock: otherstuff cabal-haddock-stage2

install: extrastuff cabal-install-stage2
	sudo install -D -s ShowClasses $(bindir)/ShowClasses
	sudo install -D Class.m4 $(datadir)/Class.m4
	sudo install -D MakeClassModule $(bindir)/MakeClassModule
	sudo install -D JVM.m4 $(datadir)/JVM.m4
	sudo install -D MakeJVMModule $(bindir)/MakeJVMModule
	sudo install -D Header.m4 $(datadir)/Header.m4
	sudo install -D MakeHeaderModule $(bindir)/MakeHeaderModule
