# Makefile for GTK version of Golly using wxWidgets.
# It assumes you've built and installed wxWidgets with commands like these:
#
# cd <wx-install-dir>
# mkdir buildgtk
# cd buildgtk
# ../configure --with-gtk --disable-shared --enable-unicode
# (depending on your g++ version you might also need --disable-precomp-headers)
# make
# su
# make install
# ldconfig

VERSION = 2.3
RELEASENAME = golly-$(VERSION)
SHAREDFILES = Help Patterns Scripts Rules README LICENSE
SRCFILES = BUILD TODO CMakeLists.txt makefile-gtk makefile-mac makefile-win \
   bitmaps golly.rc *.ico appicon.xpm Info.plist.in *.icns *.h *.cpp
BINFILES = golly bgolly RuleTableToTree

CXXC = g++
CXXFLAGS := -DVERSION=$(VERSION) -DGOLLYDIR="$(GOLLYDIR)" \
   -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES \
   -O5 -Wall -Wno-non-virtual-dtor -fno-strict-aliasing $(CXXFLAGS)
LDFLAGS := $(LDFLAGS)

# for Perl script support
PERL_INCLUDE = `perl -MExtUtils::Embed -e ccopts`
# note that we must link in the Perl library if the Perl version is older
# than 5.10 (this is necessary because boot_DynaLoader is in DynaLoader.a);
# if using 5.10 or later we can dynamically load the Perl library because
# it contains the boot_DynaLoader code
PERL_LINK = `perl -MExtUtils::Embed -e '$$]<5.010 && ldopts'`
PERL_SHLIB = libperl.so.5.10  # TODO: figure out how to do this dynamically
PERL_PREFS = -DPERL_SHLIB="$(PERL_SHLIB)"

# for Python script support
PYTHON_INCLUDE = -I`python -c "import distutils.sysconfig; print distutils.sysconfig.get_python_inc()"`
# we don't want to link against a specific library: PYTHON_LINK = -lpython2.3
# following generates "-Xlinker -export-dynamic" but doesn't seem to be needed
# PYTHON_LINK = `python -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('LINKFORSHARED')"`
PYTHON_LINK =
# the following determines the filename for the python dynamic library (e.g. libpython2.5.so)
PYTHON_SHLIB = `python -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('LDLIBRARY')"`
PYTHON_PREFS = -DPYTHON_SHLIB="$(PYTHON_SHLIB)"

# default settings for zlib support, so clear these to build without zlib
ZLIB_CXXFLAGS = -DZLIB
### ZLIB_LDFLAGS = -lz
### we statically link zlib because some Linux systems (eg. Ubuntu) have
### a non-standard zlib shared library that contains gzopen64
ZLIB_LDFLAGS = /usr/lib/libz.a

# for wxGTK support (required for GUI)
WX_CXXFLAGS = `wx-config --cxxflags`
WX_LDFLAGS = `wx-config --libs`

### put .o files in a GTK-specific subdir to avoid conflict with .o files created by X11 build
OBJDIR = ObjGTK
BASEH = bigint.h ghashbase.h hlifealgo.h jvnalgo.h ruletable_algo.h lifealgo.h lifepoll.h \
   liferender.h liferules.h platform.h qlifealgo.h readpattern.h util.h viewport.h \
   writepattern.h ruletreealgo.h generationsalgo.h
BASEOBJ = $(OBJDIR)/bigint.o $(OBJDIR)/lifealgo.o $(OBJDIR)/hlifealgo.o $(OBJDIR)/hlifedraw.o \
   $(OBJDIR)/qlifealgo.o $(OBJDIR)/qlifedraw.o $(OBJDIR)/jvnalgo.o \
   $(OBJDIR)/ruletreealgo.o $(OBJDIR)/ruletable_algo.o \
   $(OBJDIR)/ghashbase.o $(OBJDIR)/ghashdraw.o \
   $(OBJDIR)/readpattern.o $(OBJDIR)/writepattern.o $(OBJDIR)/liferules.o $(OBJDIR)/util.o \
   $(OBJDIR)/liferender.o $(OBJDIR)/viewport.o $(OBJDIR)/lifepoll.o \
   $(OBJDIR)/generationsalgo.o
WXH = wxalgos.h wxedit.h wxgolly.h wxhelp.h wxinfo.h wxlayer.h wxmain.h \
   wxperl.h wxprefs.h wxpython.h wxrender.h wxrule.h wxscript.h wxselect.h wxstatus.h \
   wxtimeline.h wxundo.h wxutils.h wxview.h
WXOBJ = $(OBJDIR)/wxutils.o $(OBJDIR)/wxprefs.o $(OBJDIR)/wxalgos.o $(OBJDIR)/wxrule.o \
   $(OBJDIR)/wxinfo.o $(OBJDIR)/wxhelp.o $(OBJDIR)/wxstatus.o $(OBJDIR)/wxview.o \
   $(OBJDIR)/wxrender.o $(OBJDIR)/wxscript.o $(OBJDIR)/wxperl.o $(OBJDIR)/wxpython.o \
   $(OBJDIR)/wxfile.o $(OBJDIR)/wxedit.o $(OBJDIR)/wxcontrol.o $(OBJDIR)/wxtimeline.o \
   $(OBJDIR)/wxundo.o $(OBJDIR)/wxselect.o $(OBJDIR)/wxlayer.o $(OBJDIR)/wxmain.o $(OBJDIR)/wxgolly.o

all: $(OBJDIR) golly bgolly RuleTableToTree

$(BASEOBJ): $(BASEH)
$(WXOBJ): $(BASEH) $(WXH) *.xpm bitmaps/*.xpm

$(OBJDIR):
	mkdir -p $(OBJDIR)

clean: 
	rm -f $(OBJDIR)/*.o
	rm -f golly bgolly RuleTableToTree

golly: $(OBJDIR) $(BASEOBJ) $(WXOBJ)
	$(CXXC) $(CXXFLAGS) -o golly $(BASEOBJ) $(WXOBJ) $(LDFLAGS) $(ZLIB_LDFLAGS) $(WX_LDFLAGS) $(PYTHON_LINK) $(PERL_LINK)

bgolly: $(OBJDIR) $(BASEOBJ) $(OBJDIR)/bgolly.o
	$(CXXC) $(CXXFLAGS) -o bgolly $(BASEOBJ) $(OBJDIR)/bgolly.o $(LDFLAGS) $(ZLIB_LDFLAGS)

RuleTableToTree: $(OBJDIR) $(BASEOBJ) $(OBJDIR)/RuleTableToTree.o
	$(CXXC) $(CXXFLAGS) -o RuleTableToTree $(BASEOBJ) $(OBJDIR)/RuleTableToTree.o $(LDFLAGS) $(ZLIB_LDFLAGS)

$(OBJDIR)/bgolly.o: bgolly.cpp
	$(CXXC) $(CXXFLAGS) $(ZLIB_CXXFLAGS) -c -o $@ bgolly.cpp

$(OBJDIR)/RuleTableToTree.o: RuleTableToTree.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ RuleTableToTree.cpp

$(OBJDIR)/bigint.o: bigint.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ bigint.cpp

$(OBJDIR)/lifealgo.o: lifealgo.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ lifealgo.cpp

$(OBJDIR)/hlifealgo.o: hlifealgo.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ hlifealgo.cpp

$(OBJDIR)/hlifedraw.o: hlifedraw.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ hlifedraw.cpp

$(OBJDIR)/qlifealgo.o: qlifealgo.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ qlifealgo.cpp

$(OBJDIR)/qlifedraw.o: qlifedraw.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ qlifedraw.cpp

$(OBJDIR)/jvnalgo.o: jvnalgo.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ jvnalgo.cpp

$(OBJDIR)/ruletable_algo.o: ruletable_algo.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ ruletable_algo.cpp

$(OBJDIR)/ruletreealgo.o: ruletreealgo.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ ruletreealgo.cpp

$(OBJDIR)/generationsalgo.o: generationsalgo.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ generationsalgo.cpp

$(OBJDIR)/ghashbase.o: ghashbase.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ ghashbase.cpp

$(OBJDIR)/ghashdraw.o: ghashdraw.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ ghashdraw.cpp

$(OBJDIR)/liferules.o: liferules.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ liferules.cpp

$(OBJDIR)/liferender.o: liferender.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ liferender.cpp

$(OBJDIR)/readpattern.o: readpattern.cpp
	$(CXXC) $(CXXFLAGS) $(ZLIB_CXXFLAGS) -c -o $@ readpattern.cpp

$(OBJDIR)/writepattern.o: writepattern.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ writepattern.cpp

$(OBJDIR)/util.o: util.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ util.cpp

$(OBJDIR)/viewport.o: viewport.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ viewport.cpp

$(OBJDIR)/lifepoll.o: lifepoll.cpp
	$(CXXC) $(CXXFLAGS) -c -o $@ lifepoll.cpp

$(OBJDIR)/wxutils.o: wxutils.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxutils.cpp

$(OBJDIR)/wxprefs.o: wxprefs.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) $(PERL_PREFS) $(PYTHON_PREFS) -c -o $@ wxprefs.cpp

$(OBJDIR)/wxalgos.o: wxalgos.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxalgos.cpp

$(OBJDIR)/wxrule.o: wxrule.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxrule.cpp

$(OBJDIR)/wxinfo.o: wxinfo.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxinfo.cpp

$(OBJDIR)/wxhelp.o: wxhelp.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxhelp.cpp

$(OBJDIR)/wxstatus.o: wxstatus.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxstatus.cpp

$(OBJDIR)/wxview.o: wxview.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxview.cpp

$(OBJDIR)/wxrender.o: wxrender.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxrender.cpp

$(OBJDIR)/wxperl.o: wxperl.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) $(PERL_INCLUDE) -c -o $@ wxperl.cpp

$(OBJDIR)/wxpython.o: wxpython.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) $(PYTHON_INCLUDE) -c -o $@ wxpython.cpp

$(OBJDIR)/wxscript.o: wxscript.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxscript.cpp

$(OBJDIR)/wxfile.o: wxfile.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxfile.cpp

$(OBJDIR)/wxedit.o: wxedit.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxedit.cpp

$(OBJDIR)/wxselect.o: wxselect.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxselect.cpp

$(OBJDIR)/wxcontrol.o: wxcontrol.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxcontrol.cpp

$(OBJDIR)/wxtimeline.o: wxtimeline.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxtimeline.cpp

$(OBJDIR)/wxundo.o: wxundo.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxundo.cpp

$(OBJDIR)/wxlayer.o: wxlayer.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxlayer.cpp

$(OBJDIR)/wxmain.o: wxmain.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxmain.cpp

$(OBJDIR)/wxgolly.o: wxgolly.cpp
	$(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxgolly.cpp

srcdist:
	-rm -rf $(RELEASENAME)-src
	mkdir $(RELEASENAME)-src
	cp -rp $(SRCFILES) $(SHAREDFILES) $(RELEASENAME)-src
	find $(RELEASENAME)-src -name CVS | xargs rm -rf
	find $(RELEASENAME)-src -name '.[^.]*' -delete
	find $(RELEASENAME)-src/Scripts/Python -name '*.pyc' -delete
	tar -cf - ./$(RELEASENAME)-src | gzip > $(RELEASENAME)-src.tar.gz

bindist: all
	-rm -rf $(RELEASENAME)-gtk
	mkdir $(RELEASENAME)-gtk
	cp -rp $(BINFILES) $(SHAREDFILES) $(RELEASENAME)-gtk
	find $(RELEASENAME)-gtk -name CVS | xargs rm -rf
	find $(RELEASENAME)-gtk -name '.[^.]*' -delete
	find $(RELEASENAME)-gtk/Scripts/Python -name '*.pyc' -delete
	tar -cf - ./$(RELEASENAME)-gtk | gzip > $(RELEASENAME)-gtk.tar.gz
