##############################################################################
#
# XNap Makefile	
#
# This file is grouped in sections that contain logically connected targets.
# The targets are sorted alphabetically by name.
# 
# Some targets make extensive use of gnu tools like grep and sed. Only 
# tested on Debian GNU/Linux unstable.
#
##############################################################################

PLUGINS     = nap viewer/image viewer/mp3 viewer/text viewer/video
#PLUGINS     += gift
#PLUGINS     += gnutella

MAKE        = make
JAVAC       = jikes
JAVAC_OPTS  = -classpath $(CP) +D +P +F
#JAVAC       = javac
#JAVAC_OPTS  = -classpath $(CP)
JAR         = jar
JRE         = java
JDB         = jdb
JAVADOC     = javadoc -private
TAR         = tar

JAVAHOME14  = /usr/local/j2sdk1.4.0
JAVAHOME141 = /usr/local/j2sdk1.4.1_01
HTDOCS      = ../htdocs

TMPDIR	   = /tmp/$(shell id -un && test -x /tmp/$(shell id -un) || mkdir /tmp/$(shell id -un))
#TMPDIR	    = /tmp/$(shell id -un)

PREFIX	    = /usr/local	
DESTDIR     =

LIBS	    = lib/java_readline.jar 
LIBS        += lib/jd3lib.jar
LIBS	    += lib/gnu.getopt.jar
LIBS	    += lib/kunststoff.jar
LIBS	    += lib/libxnap.jar
LIBS	    += lib/log4j.jar
LIBS	    += lib/xnap-ziga.jar
#LIBS        += lib/HTTPClient.jar
#LIBS	     += lib/skinlf.jar

CP	    = .:$(shell echo $(LIBS) $(CPDIRS) | sed -e 's/ /:/g'):$(CLASSPATH)
CP14	    = .:$(shell echo $(LIBS) $(CPDIRS) | sed -e 's/ /:/g'):$(JAVAHOME14)/jre/lib/rt.jar

GREPKEYS    = xargs cat \
	       | perl -n -e 'while (/tr\("((\\"|[^"])*)"/) { print "$$1\n"; s/tr\("((\\"|[^"])*)"//; }' \
	       | sort -u 

SRCDIRS    = $(shell find xnap -type d -not -name CVS \
	               -not -path "xnap/plugin/*" \
	               -not -path "*resources*") \
	     $(shell for i in $(PLUGINS); do \
		       find xnap/plugin/$$i -type d -not -name CVS \
	                 -not -path "*resources*"; \
	             done)
DOC	   = AUTHORS NEWS COPYING COPYING.LIB README TODO
JARDOC     = AUTHORS COPYING README 
DIST       = $(JARDOC) $(ICONS) plugins.properties xnap/MANIFEST \
	     $(shell find xnap/ -name "*.properties")

ICONS      = icons/xnap_logo.png
ICONS      += $(shell find . -name "*.java" | xargs grep "XNapFrame\.getSmallIcon" \
	        | sed -e 's/.*(\"/icons\/16\//;s/\").*//' )
ICONS      += $(shell find . -name "*.java" | xargs grep "XNapFrame\.getIcon" \
	        | sed -e 's/.*(\"/icons\/22\//;s/\").*//' )
ICONS      += $(shell find . -name "*.java" | xargs grep "XNapFrame\.getBigIcon" \
	        | sed -e 's/.*(\"/icons\/32\//;s/\").*//' )

PROG	   = xnap
VER        = $(shell grep "String VERSION" xnap/XNap.java \
                          | sed -e 's/^.* \"//;s/\".*//')

UPLOADS	   = $(PROG)-$(VER).tar.* $(PROG)-$(VER)-installer.exe \
	     $(PROG)-$(VER)-src.tar.gz $(PROG)-$(VER).jar \
	     $(PROG)_$(VER)-1_all.deb $(PROG)-$(VER)-1.noarch.rpm \
	     $(PROG)-$(VER)-Mac-OS-X.tar.gz		

C_DEPENDS  = xnap/XNap.java xnap/XNapLoader.java \
	     $(shell for i in $(PLUGINS); do \
	               test -e xnap/plugin/$$i/Plugin.java \
			 && echo xnap/plugin/$$i/Plugin.java; \
	               test -e xnap/plugin/$$i/GUIPlugin.java \
			 && echo xnap/plugin/$$i/GUIPlugin.java; \
	             done)

ifeq ($(shell uname -s),Darwin)
  include Makefile-OSX
endif

ifeq ($(shell test -r Makefile.config && echo "true"),true)
  include Makefile.config
endif

##############################################################################
# DEVELOPMENT RULES
##############################################################################

%.class : %.java
	$(JAVAC) $(JAVAC_OPTS) $<

junit/% :
	$(JRE) -cp $(CP):junit/ junit.swingui.TestRunner `echo $@ | sed -e 's/junit\///'`

.PHONY : all clean install uninstall


all :
	$(JAVAC) $(JAVAC_OPTS) $(C_DEPENDS)

all-inc :
#	$(JAVAC) $(JAVAC_OPTS) ++ $(C_DEPENDS)
	java JikesWrapper $(JAVAC) $(JAVAC_OPTS) ++ $(C_DEPENDS)

clean :
	find xnap/ -type f \( -name "*.class" -o -name "*.[ou]" \) \
	  -exec rm -f {} \;
	rm -f README.txt COPYING.txt || true

dev : mrproper makefiles cvsignore tags 

distclean : clean
	rm -f Makefile.dep xnap/TAGS
	find xnap/ -name "Makefile" -exec rm -f {} \;
	rm -f xnap*.jar xnap*.gz xnap*.zip xnap*.deb xnap*.rpm xnap*.exe \
	xnap.bin *stamp xnap.1 xnap-snapshot.1
	rm -rf debian/xnap-snapshot debian/xnap || true

emacs-clean:
	find . -name ".#*" -exec rm -f {} \;

mrproper : distclean
	find . \( -type f -o -type l \) \
	\( -name "*~" -o -name "#*" -o -name ".#*" -o -name \
	"*.gz" -o -name "*.bz2" -o -name "*.mp3" -o -name "*.mpg" \) \
	 -exec rm -f {} \;
	rm -f debug.log
	rm -rf mac/Resources/Java/xnap.jar

run : xnap/XNap.class
	$(JRE) -classpath $(CP) xnap.XNap -d

run14: xnap/XNap.class
	$(JAVAHOME14)/bin/$(JRE) \
	  -classpath $(JAVAHOME14)/jre/lib/rt.jar:$(CP) xnap.XNap -d

run141: xnap/XNap.class
	$(JAVAHOME141)/bin/$(JRE) \
	  -classpath $(JAVAHOME141)/jre/lib/rt.jar:$(CP) xnap.XNap -d

run-cmdl : xnap/XNap.class
	$(JRE) -classpath $(CP) xnap.XNap -d -c

run-debug : xnap/XNap.class
	$(JRE) -classpath $(CP) -Xdebug -Xnoagent -Djava.compiler=NONE  \
	  -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n \
	  xnap.XNap -d

run-debug14 : xnap/XNap.class
	$(JAVAHOME14)/bin/$(JRE) -classpath $(CP14) -Xdebug -Xnoagent \
	-Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n  xnap.XNap -d

run-jar : xnap.jar
	$(JRE) -jar xnap.jar

run-jswat:
	jswat "load xnap.XNap"

run-loader : xnap/XNap.class
	$(JRE) -classpath $(CP) xnap.XNapLoader -d

##############################################################################
# DIST RULES
##############################################################################

bzipdist : tmpdist
	cp xnap.sh $(TMPDIR)/$(PROG)-$(VER)
	cd $(TMPDIR) && $(TAR) -cjf $(PROG)-$(VER).tar.bz2 $(PROG)-$(VER)
	mv $(TMPDIR)/$(PROG)-$(VER).tar.bz2 .

cvsdist: 
	rm -rf $(TMPDIR)/$(PROG)-$(VER)
	cd $(TMPDIR); cvs -z3 \
	  -d:pserver:anonymous@cvs.xnap.sourceforge.net:/cvsroot/xnap \
	  co -d $(PROG)-$(VER) -r `echo $(PROG)-$(VER) | sed 's/\./_/g'` xnap2
	cd $(TMPDIR); $(TAR) -czf $(PROG)-$(VER)-src.tar.gz $(PROG)-$(VER)
#	cd $(TMPDIR); $(TAR) -cjf $(PROG)-$(VER)-src.tar.bz2 $(PROG)-$(VER)
	mv  $(TMPDIR)/$(PROG)-$(VER)-src.tar.gz .
#	mv  $(TMPDIR)/$(PROG)-$(VER)-src.tar.bz2 .

docdist: javadoc
	$(TAR) -czvf xnap-doc.tgz doc/

deb:
	dpkg-buildpackage -sgpg -pagpg -rfakeroot
	cp ../$(PROG)_$(VER)-1_all.deb . || true

snapshot-deb: 
	cd debian && patch  -p1 < snapshot.diff 
	cp debian/changelog $(TMPDIR)
	cp debian/changelog.snapshot debian/changelog
	dpkg-buildpackage -sgpg -pagpg -rfakeroot
	cp ../$(PROG)-snapshot_$(VER)-1_all.deb .  || true
	cd debian && patch -R  -p1 < snapshot.diff		
	cp debian/changelog debian/changelog.snapshot
	cp $(TMPDIR)/changelog debian/

#dist : srcdist tgzdist jardist windist macdist
dist :  tgzdist jardist windist macdist cvsdist


htdist: 
	cp AUTHORS $(HTDOCS)/AUTHORS.txt
	cp DEVELOPMENT $(HTDOCS)/DEVELOPMENT.txt
	cp NEWS $(HTDOCS)/NEWS.txt
	cp README $(HTDOCS)/README.txt
	cp TRANSLATION $(HTDOCS)/TRANSLATION.txt

jar.stamp : jar

jar : 
	rm -rf $(TMPDIR)/xnap
	mkdir -p $(TMPDIR)/xnap
	$(JAVAC) $(JAVAC_OPTS) -d $(TMPDIR)/xnap $(C_DEPENDS)
	$(TAR) -cf - $(DIST) | $(TAR) -C $(TMPDIR)/xnap -xf -
	for i in $(LIBS); do \
	  unzip -q -o -d $(TMPDIR)/xnap $$i; \
	done
	rm -rf $(TMPDIR)/xnap/META-INF
	$(JAR) cvmf xnap/MANIFEST xnap.jar -C $(TMPDIR)/xnap . > /dev/null 2>&1
	touch jar.stamp

jardist : jar.stamp
	cp $(PROG).jar $(PROG)-$(VER).jar

macdist : jar.stamp
	rm -rf $(TMPDIR)/$(PROG)-$(VER)
	mkdir -p $(TMPDIR)/$(PROG)-$(VER)
	mkdir -p $(TMPDIR)/$(PROG)-$(VER)/XNap\ $(VER).app/Contents
	mkdir -p mac/Resources/Java/
	find i18n -name "XNap_*.i18n" \
	  | sed -e 's/i18n\/XNap_/mac\/Resources\//;s/i18n/lproj/' \
	  | xargs mkdir -p
	mkdir -p mac/Resources/en.lproj
	cp xnap.jar mac/Resources/Java/
	cp AUTHORS mac/Authors.txt
	cp COPYING mac/License\ 1\ \(GPL\).txt 
	cp COPYING.LIB mac/License\ 2\ \(LGPL\).txt
	cp NEWS mac/Changes.txt
	cp README mac/Read\ Me.txt
	cp TODO mac/To\ Do.txt
	cp -R mac/* $(TMPDIR)/$(PROG)-$(VER)/XNap\ $(VER).app/Contents/
	mv $(TMPDIR)/$(PROG)-$(VER)/XNap\ $(VER).app/Contents/*.txt \
	  $(TMPDIR)/$(PROG)-$(VER)/
	cd $(TMPDIR) && $(TAR) --exclude=CVS -cvzf \
	  $(PROG)-$(VER)-Mac-OS-X.tar.gz  $(PROG)-$(VER)/
	mv $(TMPDIR)/$(PROG)-$(VER)-Mac-OS-X.tar.gz .
	rm -f mac/*.txt && \
	cp $(TMPDIR)/$(PROG)-$(VER)/Mac\ OS\ X\ Tips.txt mac/
rpm:	
#	su -c "alien -r -k $(PROG)_$(VER)-1_all.deb"
	fakeroot alien -r -k $(PROG)_$(VER)-1_all.deb
	mv $(PROG)*.noarch.rpm $(PROG)-$(VER)-1.noarch.rpm || true

srcdist :
	$(MAKE) mrproper
	rm -rf $(TMPDIR)/$(PROG)-$(VER)
	mkdir $(TMPDIR)/$(PROG)-$(VER)
	cp $(DOC) $(SRCDIST) $(TMPDIR)/$(PROG)-$(VER)
	cp Makefile* xnap.sh xnap.bat $(TMPDIR)/$(PROG)-$(VER)
	find -type d -maxdepth 1 -not -path . \
		 -exec cp -a {} $(TMPDIR)/$(PROG)-$(VER) \;
	cd $(TMPDIR)/$(PROG)-$(VER) && find -type d -name "CVS" | xargs rm -rf
	cd $(TMPDIR) && tar -czf $(PROG)-$(VER)-src.tar.gz $(PROG)-$(VER)
	mv  $(TMPDIR)/$(PROG)-$(VER)-src.tar.gz .


tgzdist : tmpdist
	cp xnap.sh $(TMPDIR)/$(PROG)-$(VER)
	cd $(TMPDIR) && $(TAR) -czf $(PROG)-$(VER).tar.gz $(PROG)-$(VER)
	mv $(TMPDIR)/$(PROG)-$(VER).tar.gz .

tmpdist : jar.stamp
	rm -rf $(TMPDIR)/$(PROG)-$(VER)
	mkdir -p $(TMPDIR)/$(PROG)-$(VER)
	cp $(DOC) README xnap.jar $(TMPDIR)/$(PROG)-$(VER)

windist : jar.stamp
	rm -f $(PROG)-$(VER)-installer.exe || true
	cp COPYING COPYING.txt 
	recode lat1..ibmpc COPYING.txt
	cp README README.txt
	recode lat1..ibmpc README.txt
	export DISPLAY=:0.0; wine makensis.exe xnap.nsi
	mv xnap-installer.exe $(PROG)-$(VER)-installer.exe

wwwdist: tgzdist jardist macdist
#	mv $(PROG)-$(VER)* ..

##############################################################################
# RELEASE / INSTALL RULES
##############################################################################

distupload: 
	scp $(UPLOADS) \
	  $(shell cat CVS/Root | sed -e 's/\@.*//')@shell.sf.net:

wwwupload: 
	scp $(UPLOADS) \
	  $(shell cat CVS/Root | sed -e 's/\@.*//')@shell.sf.net:/home/groups/x/xn/xnap/htdocs/snapshot

wwwdoc: 
	scp -r doc/* \
	  $(shell cat CVS/Root | sed -e 's/\@.*//')@shell.sf.net:/home/groups/x/xn/xnap/htdocs/doc/

distsave: 
	rm -rf ../$(PROG)_$(VER)
	mkdir ../$(PROG)_$(VER)
	-cp $(UPLOADS) ../$(PROG)_$(VER)

debian-install : jar.stamp 
	install -d $(DESTDIR)/usr/share/java/
	install -d $(DESTDIR)/usr/bin/	
	install -d $(DESTDIR)/usr/share/doc/xnap/
	install -d $(DESTDIR)/usr/share/icons/
	install -m755 xnap.sh $(DESTDIR)/usr/bin/xnap
	install -m644 xnap.jar $(DESTDIR)/usr/share/java/
	install -m644 icons/16/xnap.xpm $(DESTDIR)/usr/share/icons/
	install -m644  $(DOC) $(DESTDIR)/usr/share/doc/xnap/

debian-install-cvs : jar.stamp 
	install -d $(DESTDIR)/usr/share/java/
	install -d $(DESTDIR)/usr/bin/	
	install -d $(DESTDIR)/usr/share/doc/xnap-snapshot/
	install -d $(DESTDIR)/usr/share/icons/
	sed -e s/xnap.jar/xnap-snapshot.jar/ < xnap.sh > \
					$(DESTDIR)/usr/bin/xnap-snapshot
	chmod a+x $(DESTDIR)/usr/bin/xnap-snapshot
	install -m644 icons/16/xnap.xpm \
			$(DESTDIR)/usr/share/icons/xnap-snapshot.xpm
	install -m644 xnap.jar $(DESTDIR)/usr/share/java/xnap-snapshot.jar
	install -m644  $(DOC) $(DESTDIR)/usr/share/doc/xnap-snapshot/

fetchreleases :
	test -d ../releases || mkdir ../releases 
	cd ../releases && wget -c http://dl.sf.net/xnap/*jar
	cd ../releases && wget -c http://dl.sf.net/xnap/*-src.tar.gz

install : jar.stamp
	install -d $(PREFIX)/share/xnap/
	install -d $(PREFIX)/bin/	
	install -d $(PREFIX)/share/doc/xnap/
	install -m755 xnap.sh $(PREFIX)/bin/xnap
	install -m644 xnap.jar $(PREFIX)/share/xnap/
	install -m644 $(DOC) $(PREFIX)/share/doc/xnap/

release : i18n-dist deb rpm dist 

uninstall : 
	rm  -f $(PREFIX)/bin/xnap
	rm -rf $(PREFIX)/share/xnap/
	rm -rf $(PREFIX)/share/doc/xnap/

upload-jar: distsave
	lftp -u anonymous,xnap@sf.xnap.net -e \
          "lcd ../$(PROG)_$(VER) && cd incoming && mput *.jar" \
	  upload.sf.net

upload: distsave
	lftp -u anonymous,xnap@sf.xnap.net -e \
          "lcd ../$(PROG)_$(VER) && cd incoming && mput *" \
	  upload.sf.net

##############################################################################
# I18N RULES
##############################################################################

# extracts all keys from the sources.
get-keys: tools
	find xnap -name "*.java" | $(GREPKEYS) > i18n/keys

# merges the extracted keys into the existing translation files in i18n.
merge-keys: tools get-keys
	java -cp util/ MergeKeys i18n/XNap.i18n i18n/XNap_*.i18n < i18n/keys

# renames all keys if a keys has changed (read TRANSLATION on how to do this)
sync-keys: tools
	java -cp util/ SyncKeys i18n/XNap.i18n i18n/XNap_*.i18n
	java -cp util/ SyncKeys i18n/XNap.i18n i18n/XNap.i18n

#creates the final property files from the translation files in i18n
i18n-dist: tools
	mkdir -p $(TMPDIR)
	find xnap -name "*.java" | $(GREPKEYS) > $(TMPDIR)/keys
	@set -e; \
	for i in `find i18n -type f -name *.i18n`; do \
	  f=xnap/resources/`basename $$i | sed -e 's/i18n/properties/'`; \
	  java -cp util/:$(CLASSPATH) I18nToResource $$i $$f < $(TMPDIR)/keys; \
	done

##############################################################################
# MISC RULES
##############################################################################

cvsignore:
	@set -e; \
	for i in `find junit util xnap -type d \! -name CVS`; do \
	  m=$$i/.cvsignore; \
	  echo "writing $$m"; \
	  echo "*.class" > $$m; \
	  echo "Makefile" >>$$m; \
	  echo ".cvsignore" >>$$m; \
	done

javadoc:
	rm -rf doc/api
	mkdir doc/api
	$(JAVADOC) $(shell echo $(SRCDIRS) | sed -e 's/\//\./g') -d doc/api/ \
	  -windowtitle "XNap API" -doctitle "XNap API Documentation" \
	  -bottom "http://xnap.sourceforge.net/"

jlint:
	find xnap -name "*.class" | xargs jlint +all

makefiles :
	@set -e; \
	for i in `find xnap -type d \! -name CVS`; do \
	  m=$$i/Makefile; \
	  s=`echo $$i/ | sed 's/[^\/]//g;s/\//\.\.\//g'`; \
	  echo "writing $$m"; \
	  echo "ROOT_DIRECTORY=$$s" > $$m; \
	  echo "include $$s/Makefile.include" >> $$m; \
	done

# prints all files not currently in the repository
missing : 
	cvs up -Pd 2>&1 | egrep "^\?" \
	  | egrep -v "class|Makefile|doc\/api|xnap.*jar" \
	  | sed -e 's/^\?//' | xargs -i echo {} \\

sloc :
	sloccount util xnap/*

stats : 
	@echo -n "Number of java files         : "
	@find -name "*.java" | wc -l
	@echo -n "Total lines                  : "
	@find -name "*.java" | xargs cat | wc -l
	@echo -n "Non-empty, non-comment lines : "
	@find -name "*.java" | xargs cat \
	  | sed 's/^[ \t]*//;/./!d;/^[\/|\/\*]/d;' | wc -l
	@echo "SourceForge Stats: "
	@-lynx -dump "http://sourceforge.net/project/stats/?group_id=9285" \
	  -width=120 | grep -A 12 "Date"

stats-monthly :
	@echo "SourceForge Monthly Stats: "
	@-lynx -dump \
	"http://sf.net/project/stats/index.php?report=months&group_id=9285" \
	 -width=120 | grep -A 29 "months"

stats-weekly :
	@echo "SourceForge Weekly Stats: "
	@-lynx -dump \
	"http://sf.net/project/stats/index.php?report=last_30&group_id=9285" \
	 -width=120 | grep -A 31 "Date"

tags :
	rm -f TAGS
	find . -name '*.java' | xargs etags -a

tools:
	make -C util/
