#!/usr/bin/make -f
#
ifeq (nil,null)   ## this is to allow for text without comments
#
# This file is part of mySTEP-SDK-1.10
# last Change: 14 Dec 2004
#
# You should not edit this file as it affects all projects you will compile!
#
# Copyright, H. Nikolaus Schaller <hns@computer.org>, 2003-2004
# This document is put under LGPL licence conditions
#
# to use this makefile in Xcode 1.1 with Zaurus-X-gcc:
#
#  1. open the xcode project
#  2. select the intended target in the Targets group
#  3. select from the menu Build/New Build Phase/New Shell Script Build Phase
#  4. select the "Shell Script Files" phase in the target
#  5. open the information (i) or (Apple-I)
#  6. copy the following code into the "Script" area

export SOURCES=*.m                  # all source codes
export LIBS=						# add any additional libraries ike -ltiff etc.
export FRAMEWORKS=					# add any additional Frameworks (e.g. AddressBook) etc. (adds -I and -L)
#export STRIP_Framework=false        # set to true if you want to strip headers etc.
export STRIP_MacOS=false            # set to true if you want a Linux-ARM only bundle
export INSTALL=true                 # true will try to install on the Zaurus (using ssh)
export INSTALL_PATH=/Applications   # override INSTALL_PATH for MacOS X for the Zaurus
export RUN=true                     # true will try to run with mySTEP/myPDA on the Zaurus and X11 on MacOS
/usr/bin/make -f $SYSTEM_DEVELOPER_DIR/Zaurus-X-gcc/SDKs/mySTEP.sdk/usr/mySTEP/etc/cross-makefile $ACTION

#  7. change the SRC= line to include all required source files (e.g. main.m other/*.m)
#  8. change the LIBS= line to add any non-standard libraries (e.g. -lAddressBook -lPreferencePane -lWebKit)
#  9. Build the project (either in deployment or development mode - that affects only the MacOS version)
#
endif

#
ifeq ($(ZAURUS),)
ZAURUS=192.168.129.201
endif

# allow overriding when using xcodebuild
ifeq ($(BUILD_FOR_PACKAGE),true)
RUN := false
INSTALL := false
endif

# as expected my the Foundation library in the application bundle
ifeq ($(WRAPPER_EXTENSION),framework)
	CONTENTS=Versions
else
	CONTENTS=Contents
endif

# change only if needed
# tools
TOOLCHAIN := $(SYSTEM_DEVELOPER_DIR)/Zaurus-X-gcc/opt/Embedix/tools/arm-linux
SDK := $(SYSTEM_DEVELOPER_DIR)/Zaurus-X-gcc/SDKs/mySTEP.sdk
MYSTEP := $(SDK)/usr/mySTEP
CC := $(TOOLCHAIN)/bin/gcc
LS := $(TOOLCHAIN)/bin/ld
AS := $(TOOLCHAIN)/bin/as
NM := $(TOOLCHAIN)/bin/nm
STRIP := $(TOOLCHAIN)/bin/strip

# header search paths
INCLUDES := \
-I$(SDK)/usr/ffcall/include \
-I$(SDK)/usr/X11R6/include \
-I$(SDK)/usr/mySTEP/include \
-I$(SDK)/usr/graphics/include \
-I$(SDK)/usr/sqlite/include

# standard libraries (incl. search path)
LIBS := $(LIBS) \
-L$(SDK)/usr/mySTEP/lib -lFoundation -lGdo \
-L$(SDK)/usr/ffcall/lib -lavcall \
-lm -ldl -lpthread \
-lobjc

# process all FRAMEWORKS and translate into -I and -L

FRAMEWORKSPATH=/System/Library/PrivateFrameworks /System/Library/Frameworks

FRAMEWORKINCLUDES=$(addprefix -I,$(wildcard $(foreach fm,Foundation AppKit $(FRAMEWORKS),$(foreach sp,$(FRAMEWORKSPATH), $(SDK)$(sp)/$(fm).framework/Versions/Linux-ARM/Headers*))))
FRAMEWORKLIBS=$(wildcard $(foreach fm,Foundation AppKit $(FRAMEWORKS),$(foreach sp,$(FRAMEWORKSPATH), $(SDK)$(sp)/$(fm).framework/Versions/Linux-ARM/$(fm).so)))
FRAMEWORKRPATHS=-Wl,-rpath,$(wildcard $(foreach fm,Foundation AppKit $(FRAMEWORKS),$(foreach sp,$(FRAMEWORKSPATH), $(SDK)$(sp)/$(fm).framework/Versions/Linux-ARM/)))

APPLIBS := \
-L$(SDK)/usr/X11R6/lib -lX11 -lXext \
-L$(SDK)/usr/mySTEP/lib -lXraw -lAppKit -lMib \
-L$(SDK)/usr/graphics/lib -ltiff -lpng -lz -ljpeg -lgif \
-L$(SDK)/usr/sqlite/lib \
$(LIBS)
# -rpath-link $(subst \ ,:,$(wildcard $(SDK)/usr/*/lib)) \

#if generating frameworks, default to <Productname/file.h>

FRAMEWORKHEADER?=$(PRODUCT_NAME)

# combine to CFLAGS

### FIXME: we should replace all the -Wl,-rpath by FRAMEWORKRPATHS but have to substitute the /Developer... by /home/myPDA...

CFLAGS=-g -Wall -Wno-shadow -Wpointer-arith -Wno-import \
		-Os -fPIC -rdynamic \
        -DLinux_ARM \
		-D__mySTEP__ -DUSE_BITFIELDS=0 \
		-I$(TOOLCHAIN)/../lib/gcc-lib/arm-linux/2.95.3/include \
		$(INCLUDES) \
		$(FRAMEWORKINCLUDES) \
		-Wl,-rpath,/home/myPDA/System/Library/Frameworks/AddressBook.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/Frameworks/AppKit.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/Frameworks/Cocoa.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/Frameworks/Foundation.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/Frameworks/Message.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/Frameworks/PreferencePanes.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/Frameworks/WebKit.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/PrivateFrameworks/Calendar.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/PrivateFrameworks/Installation.framework/Versions/Linux-ARM \
		-Wl,-rpath,/home/myPDA/System/Library/PrivateFrameworks/Mail.framework/Versions/Linux-ARM \
        $(OTHER_CFLAGS)

ifeq ($(WRAPPER_EXTENSION),app)
	CFLAGS := -DFAKE_MAIN $(CFLAGS)
else
ifeq ($(WRAPPER_EXTENSION),framework)
	CFLAGS := -shared -Wl,-soname,$(PRODUCT_NAME).so \
				-I$(BUILD_DIR)/$(PRODUCT_NAME).framework/Versions/Linux-ARM/Headers \
				$(CFLAGS)
else
	CFLAGS := -shared -Wl,-soname,$(PRODUCT_NAME).$(WRAPPER_EXTENSION).so $(CFLAGS)
endif
endif

# ifeq($(GCC_WARN_ABOUT_MISSING_PROTOTYPES, YES))
# CFLAGS :=  -Wxyz $(CFLAGS)
# endif

## add $(HEADER_SEARCH_PATHS) to CFLAGS -I
## add $(LIBRARY_SEARCH_PATHS) to CFLAGS -L

PKG=$(BUILT_PRODUCTS_DIR)/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)
EXEC=$(PKG)/$(CONTENTS)/Linux-ARM
ifeq ($(WRAPPER_EXTENSION),framework)
	BINARY=$(EXEC)/$(EXECUTABLE_NAME).so
else
	BINARY=$(EXEC)/$(EXECUTABLE_NAME)
endif

ifeq ($(WRAPPER_EXTENSION),framework)
build: "$(PKG)/$(CONTENTS)/Linux-ARM/Headers" "$(BINARY)"
else
build: "$(BINARY)"
endif
ifeq ($(INSTALL),true)
	# install on $(ZAURUS) at /home/myPDA$(INSTALL_PATH) 
	- gnutar czf - --exclude MacOS --owner 500 --group 1 -C "$(BUILT_PRODUCTS_DIR)" "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)" | ssh -l root $(ZAURUS) "cd; mkdir -p '/home/myPDA$(INSTALL_PATH)' && cd '/home/myPDA$(INSTALL_PATH)' && tar xzvf -"
	# try to launch
	if $(RUN) && [ $(WRAPPER_EXTENSION) = app ] ; then \
                export DISPLAY=:0.0; /usr/X11R6/bin/xhost +$(ZAURUS) && \
		ssh -l zaurus $(ZAURUS) \
		"cd; PATH=\$$PATH:/home/myPDA/bin; echo \$$PATH; export LOGNAME=zaurus; export HOST=\$$(expr \"\$$SSH_CONNECTION\" : '\\(.*\\) .* .* .*'); export DISPLAY=\$$HOST:0.0; echo \$$DISPLAY; cd '/home/myPDA$(INSTALL_PATH)' && run '$(PRODUCT_NAME)'" ;\
	fi
endif
	# $(BINARY) built.

clean:
	# ignored

# generic bundle
"$(BINARY)":: $(SOURCES)
	echo FRAMEWORKRPATHS: $(FRAMEWORKRPATHS)
	# compile $(SOURCES) into $(BINARY)
	[ -d "$(EXEC)" ] || mkdir "$(EXEC)"
	$(CC) $(CFLAGS) -o "$(BINARY)" $(SOURCES) $(APPLIBS) $(FRAMEWORKLIBS)
	# make dependent on development style
#	$(NM) "$(BINARY)"
	$(STRIP) -xg "$(BINARY)"
#	$(NM) "$(BINARY)"
	- find "$(PKG)/$(CONTENTS)" -name "*.nib" -exec $(MYSTEP)/etc/nib2mib -b {} \; -prune -print
	- if $(STRIP_MacOS); then rm -rf "$(PKG)/Contents/MacOS" "$(PKG)/Contents/Frameworks" "$(PKG)/Versions/Current/$(PRODUCT_NAME)" "$(PKG)/$(PRODUCT_NAME)"; find "$(PKG)/Contents" -name "*.nib" -exec rm -r {} \; -prune ; fi
ifeq ($(WRAPPER_EXTENSION),framework)
	- mkdir -p "$(SDK)$(INSTALL_PATH)"
	- rm -rf "$(SDK)$(INSTALL_PATH)/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)"
	- cp -Rf "$(PKG)" "$(SDK)$(INSTALL_PATH)" # install on SDK to mirror mySTEP runtime location
endif
	- [ "$(DEVELOPMENT_INSTALL_ROOT)" != "" ] && mkdir -p "$(DEVELOPMENT_INSTALL_ROOT)$(INSTALL_PATH)" && rm -rf "$(DEVELOPMENT_INSTALL_ROOT)$(INSTALL_PATH)" && cp "$(PKG)" "$(DEVELOPMENT_INSTALL_ROOT)$(INSTALL_PATH)"
	# compiled.

# make headers
"$(PKG)/$(CONTENTS)/Linux-ARM/Headers":
	- mkdir -p "$(PKG)/$(CONTENTS)/Linux-ARM/Headers"
	- rm -f "$(PKG)/$(CONTENTS)/Linux-ARM/Headers/$(PRODUCT_NAME)"
	- ln -s ../../../Headers "$(PKG)/$(CONTENTS)/Linux-ARM/Headers/$(PRODUCT_NAME)"	# add link to allow for <Framework/Header.h> --- should this really be PRODUCT_NAME to e.g. allow for AppKit additions
