# This file is part of icoformat, a Windows Icon (ICO) File Format # plugin for Adobe Photoshop # Copyright (C) 2002-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 plugin DLL, or Mac OS X Mach-O plugin bundle (CS2 and later) # by Toby Thain # ---------- pre-requisites ---------- # 0. You need Apple's Developer Tools installed, for Mac OS X builds. # or, you need MinGW installed to do Win32 builds (cross-builds # are possible from Linux, OS X, or any other system with MinGW). # (If you are using Micro$oft compilers on Windows or WINE, # e.g. for 64-bit builds, use NMAKE.MAK instead of this Makefile.) # 1. You need the 'common' project library checked out alongside icoformat: # $ svn checkout http://telegraphics.com.au/svn/common/trunk/ common # 2. You need a Photoshop SDK, appropriate to your target Photoshop runtime. # Obtain from Adobe: http://www.adobe.com/devnet/photoshop/sdk/index.html PSAPI = "../adobe_photoshop_cs5_sdk_mac/photoshopapi" # 3. libpng handles embedded PNG of Vista-format icons. # Download from: http://www.libpng.org/pub/png/libpng.html LIBPNG = ../lpng144 # 4. libpng in turn requires zlib. Download from http://www.zlib.net/ ZLIB = ../zlib-1.2.5 # Please see the file BUILDING for gotchas with specific SDKs or build systems. # On OS X, this program is compiled as Objective C++. # See: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html#//apple_ref/doc/uid/TP30001163-CH10-SW1 # ---------- variables & flags ---------- EXEC = ICOFormat 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 # in CS3(CS2?), PiPL FormatFlags added a 'fmtCannotCreateThumbnail' bit # older SDKs don't have this, so comment out this define if using them REZFLAGS = $(ARCH) -d CS3SDK CFLAGS += -Wall -O2 CPPFLAGS += -I$(PSAPI)/pica_sp -I$(PSAPI)/photoshop \ -I$(LIBPNG) -I../common/adobeplugin -I../common/tt # ---------- source & object files ---------- # where to find source files vpath %.c ../common/tt ../common/adobeplugin vpath %.m cocoa # list source files OBJ_COMMON = main.o ico_io.o read.o readpng.o write.o writepng.o \ ui.o estimate.o file_io.o str.o dprintf.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 IcoChooseMemberController.o IcoChooseFormatController.o ) \ $(LIBPNG)/libpng.a $(ZLIB)/libz.a 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 ---------- # constituent files of Mac OS X plugin bundle # 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 \ $(BUNDLE)/Contents/Resources/IcoChooseMember.nib \ $(BUNDLE)/Contents/Resources/IcoChooseFormat.nib 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 DISTZIP = dist/$(EXEC)-$(VERSION)-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 realclean # 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 cs2 : PSTARGET=Photoshop CS2 cs3 : PSTARGET=Photoshop CS3 and CS4 cs5 : PSTARGET=Photoshop CS5 $(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 > $@ # Copy the nib folders, without Svn metadata $(BUNDLE)/Contents/Resources/%.nib : cocoa/%.nib mkdir -p $@ cp $% %' \ -e 's%% %' > $@ 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) obj/IcoChooseMemberController.o : cocoa/IcoChooseMemberController.h obj/IcoChooseFormatController.o : cocoa/IcoChooseFormatController.h # note dependencies on version.h: obj_w32/res.o : plugin.rc PiPL.rc ui_win.rc version.h $(WINDRES) -i $< -o $@ $(CPPFLAGS) obj_w32/ui_win.o : version.h # compile Mac resources (into data fork of .rsrc file) # note egregious hack with case of .R + $(filter) to exclude include'd # pre-reqs from compilation $(PLUGIN_RSRC) : $(BUNDLE) PiPL_macho.r PiPL_ICO.R PiPL_CUR.R PiPL_common.R ui_mac.r version.h mkdir -p $(dir $@) /Developer/Tools/Rez -o $@ -useDF $(filter %.r,$^) \ $(REZFLAGS) \ -i /Developer/Headers/FlatCarbon \ -i $(PSAPI)/Resources \ -i $(PSAPI)/Photoshop ls -l $@ # ---------- build zlib ---------- $(ZLIB)/libz.a : $(ZLIB)/Makefile make -C $(ZLIB) libz.a $(ZLIB)/Makefile : $(ZLIB)/configure cd $(ZLIB) && CC="$(CC)" CFLAGS="$(CFLAGS) -DNO_GZIP" ./configure --static # ---------- build libpng ---------- $(LIBPNG)/libpng.a : $(LIBPNG)/Makefile CC="$(CC)" \ CFLAGS="$(CFLAGS)" \ CPPFLAGS="-DPNG_NO_STDIO -DPNG_NO_MNG_FEATURES \ -DPNG_USER_WIDTH_MAX=256 -DPNG_USER_HEIGHT_MAX=256 \ -DPNG_NO_PROGRESSIVE_READ" \ make -C $(LIBPNG) libpng.a $(LIBPNG)/Makefile : $(LIBPNG)/scripts/makefile.darwin sed -e 's%\.\./zlib%$(ZLIB)%' -e 's%^CC=.*%CC += $(CFLAGS) $$(CPPFLAGS)%' $< > $@ # ---------- 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) $(DLLWRAP) -o $@ -def $^ -mwindows -s ls -l $@ # --------------------