# This file is part of Netpbm Formats, a File Format plugin for Adobe Photoshop
# Copyright (C) 2004-2010 Toby Thain, toby@telegraphics.com.au

# 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 of the License, 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.

# You should have received a copy of the GNU General Public License  
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# GNU Makefile
# builds Win32 DLL and CS2/Mac Mach-O plugin bundle

# by Toby Thain <toby@telegraphics.com.au>


# ---------- variables & flags ----------

EXEC = NetpbmFormats

VERSION := $(shell perl -n -e 'm/^.*VERSION_STR[[:blank:]]+\"([^"]*)\"/ && print $$1;' version.h)

MINGW_CC = i386-mingw32msvc-gcc
DLLWRAP  = i386-mingw32msvc-dllwrap
WINDRES  = i386-mingw32msvc-windres

SAMPLES = peace.pbm mandel.pgm t100.pgm

PSAPI = "../adobe_photoshop_cs5_sdk_mac/photoshopapi"

CFLAGS += -O2 -W -Wall
CPPFLAGS += -I$(PSAPI)/Pica_sp -I$(PSAPI)/Photoshop -I$(PSAPI)/General \
	-I../common/adobeplugin -I../common/tt

REZFLAGS = $(ARCH) -d CS3SDK

# ---------- source & object files ----------

# where to find .c source files
# *** Note: Depends on files in "sgiformat" project.
# *** sgiformat should also be checked out before trying to build.
vpath %.c ../common/tt ../common/adobeplugin ../sgiformat
vpath %.m cocoa

# list of source files
OBJ_COMMON = main.o read.o write.o util.o bufio.o str.o file_io.o

# object files, separate for each platform
OBJ_OSX := $(addprefix obj/, $(OBJ_COMMON) \
				ui_mac.o ui_compat_mac.o dbg_mac.o largefiles_forks.o \
				ui_cocoa.o )
OBJ_W32 := $(addprefix obj_w32/, $(OBJ_COMMON) \
				ui_win.o ui_compat_win.o dbg_win.o file_compat_win.o \
				dllmain.o res.o )


# ---------- executables ----------

# parts of Mac OS X plugin bundle to build
# Adobe's plugs use .plugin extension
BUNDLE = $(EXEC).plugin
PLUGIN_OSX  = $(BUNDLE)/Contents/MacOS/$(EXEC)
PLUGIN_RSRC = $(BUNDLE)/Contents/Resources/$(EXEC).rsrc
PLUGIN_PARTS = $(PLUGIN_OSX) $(PLUGIN_RSRC) $(BUNDLE)/Contents/Info.plist \
			   $(BUNDLE)/Contents/PkgInfo
DISTDMG = dist/$(EXEC)-$(VERSION).dmg

# -DMAC_ENV is for the Adobe SDK
# -DMACMACHO is for this plugin's use (to detect Mach-O build)
# -Dmacintosh is for anyone who STILL doesn't get it
$(PLUGIN_OSX) : CFLAGS   += $(ARCH)
$(PLUGIN_OSX) : LDFLAGS  += $(ARCH)
$(PLUGIN_OSX) : CPPFLAGS += -DMAC_ENV -DMACMACHO -Dmacintosh -DWANT_LARGE_FILES \
                            -I/Developer/Headers/FlatCarbon

# Win32 plugin DLL to build
PLUGIN_W32 = $(EXEC).8bi
DISTARCHIVE = dist/$(EXEC)-win.zip

$(PLUGIN_W32) : CPPFLAGS += -DWIN_ENV


# ---------- targets ----------

# Notes: If building on OS X 10.4, 
#   - if using older Xcode (e.g. 2.1), the option '-mmmacosx-version-min' must be removed.
#   - older Rez does not support -arch, you need to upgrade to Xcode 2.5 to build Universal (for CS3/4)
#   - the cs5 target cannot be built on OS X 10.4.

.PHONY : thin cs2 cs3 cs5 dll zip dmg clean samples

# targets for OS X Mach-O (bundle) format runtimes:
# 'thin' - single architecture, of build host
# 'cs2' - PowerPC only
# 'cs3' - Universal (PPC & Intel architectures; CS3 and CS4)
# 'cs5' - 32-bit and 64-bit Intel
thin cs2 cs3 cs5 : $(PLUGIN_PARTS) 

# Min system for CS2: Mac OS X v.10.2.8 
cs2 : ARCH = -arch ppc
cs2 : CFLAGS   += -isysroot /Developer/SDKs/MacOSX10.2.8.sdk -mmacosx-version-min=10.2
cs2 : LDFLAGS  += -Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk -mmacosx-version-min=10.2

# See: http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/compiling/chapter_4_section_3.html#//apple_ref/doc/uid/TP40002850-BAJCFEBA
# gcc 4.2 (OS X 10.6) has trouble building the universal plugin:
# Min system for CS3: Mac OS X v.10.4.8
cs3 : CC = /usr/bin/gcc-4.0
cs3 : ARCH = -arch ppc -arch i386
cs3 : CFLAGS   += -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4
cs3 : LDFLAGS  += -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4

cs5 : ARCH = -arch i386 -arch x86_64
cs5 : CFLAGS   += -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5
cs5 : LDFLAGS  += -Wl,-syslibroot,/Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5

$(BUNDLE) :
	mkdir -p $@
	/Developer/Tools/SetFile -a B $@

# insert correct executable name and version string in bundle's Info.plist
$(BUNDLE)/Contents/Info.plist : Info.plist.tmpl $(BUNDLE) version.h
	mkdir -p $(dir $@)
	sed -e "s/%VERSION_STR%/$(VERSION)/" -e "s/%EXEC%/$(EXEC)/" -e "s/%PSTARGET%/$(PSTARGET)/" $< > $@

$(BUNDLE)/Contents/PkgInfo : $(BUNDLE)
	mkdir -p $(dir $@)
	printf 8BIF8BIM > $@

clean :
	rm -fr obj/* obj_w32/* $(PLUGIN_W32) $(BUNDLE) $(SAMPLES) peace mandelpgm target


zip : $(DISTARCHIVE)

$(DISTARCHIVE) : $(PLUGIN_W32) dist/README.html dist/gpl.html
	zip -j -9 $@ $^
	ls -l $@

dist/gpl.html : 
	curl http://www.gnu.org/licenses/gpl.html | \
		sed 's%</HEAD>%<BASE HREF="http://www.gnu.org/"> </HEAD>%' > $@


samples : $(SAMPLES)

% : %.c ; $(CC) -o $@ $<

peace.pbm  : peace ; -./peace > $@
mandel.pgm : mandelpgm ; -./mandelpgm > $@
t100.pgm   : target ; ./target 100 100 > $@


dmg : $(DISTDMG)

# create an Apple disk image (dmg) archive of the distribution kit
$(DISTDMG) : $(PLUGIN_PARTS) dist/README.html dist/gpl.html version.h
	DIR=`mktemp -d $(EXEC)-XXXX`; \
		cp -Rp dist/README.html dist/gpl.html $(BUNDLE) $$DIR; \
		hdiutil create -srcfolder $$DIR -ov -volname "$(EXEC) $(VERSION)" \
				-imagekey zlib-level=9 -fs HFS+ $@; \
		rm -fr $$DIR
	@ ls -l $@


# ---------- compile rules ----------

obj/%.o : %.c ; $(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS)
obj/%.o : %.m ; $(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS)
obj_w32/%.o : %.c ; $(MINGW_CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS)

# note dependencies on version.h:

obj_w32/res.o : PiPL.rc version.h
	$(WINDRES) -i $< -o $@

obj_w32/ui_win.o : version.h

# compile Mac resources (into data fork of .rsrc file)
$(PLUGIN_RSRC) : $(BUNDLE) PiPL_macho.r ui_mac.r version.h \
				 PiPL_PBM.R PiPL_PGM.R PiPL_PPM.R PiPL_PNM.R
	mkdir -p $(dir $@)
	/Developer/Tools/Rez -o $@ -useDF $(filter %.r,$^) \
		$(REZFLAGS) \
		-i /Developer/Headers/FlatCarbon \
		-i $(PSAPI)/Resources \
		-i $(PSAPI)/Photoshop
	ls -l $@


# ---------- link rules ----------

$(PLUGIN_OSX) : $(BUNDLE) exports.exp $(OBJ_OSX)
	mkdir -p $(dir $@)
	$(CC) -bundle -o $@ $(OBJ_OSX) $(LDFLAGS) \
		-exported_symbols_list exports.exp \
		-framework Carbon -framework System -framework AppKit
	ls -l $@
	file $@

# link Win32 DLL
$(PLUGIN_W32) : exports.def $(OBJ_W32) obj_w32/res.o
	$(DLLWRAP) -o $@ -def $^ -mwindows -s
	ls -l $@


# --------------------