The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#
# Finance::InteractiveBrokers::SWIG - Makefile for SWIG build
#
# Copyright (c) 2010-2013 Jason McManus
# Version: 0.08
#
# This is usually invoked by 'perl Makefile.PL && make', but if you need to
# run it separately, you can run it by:
#
#   make -fMakefile.swig [ OPTIONS ]
#
# OPTIONS:
#   IB_BUILD_PATH=/path/to/IBJts        # wherever your un-jar'ed API is
#   SWIG=/path/to/swig                  # path to SWIG binary program
#   IB_API_VERSION=X.XX                 # version of the IB API [def: 9.64]
#
# Pre-existing files:
#   Makefile.swig
#   IBAPI.i
#   IBAPI.cxx
#   IBAPI.h
#   ezembed.h
#   $IB_BUILD_PATH/cpp/PosixSocketClient/EClientSocketBase.cpp
#   $IB_BUILD_PATH/cpp/PosixSocketClient/EPosixClientSocket.cpp
# Intermediate files:
#   EClientSocketBase.o
#   EPosixClientSocket.o
#   IBAPI_wrap.cxx
#   IBAPI_wrap.o
#   IBAPI.o
# Final targets:
#   IBAPI.pm
#   IBAPI.so
#

###
### Options
###

CC=gcc
CXX=g++
LD=ld
CXXEXT=cxx

SWIGEXT=i
PMEXT=pm
OBJEXT=o

# May be different on OS-X, etc.
DLEXT = $(shell perl -MConfig -e'print $$Config{dlext}')
ifeq "$(DLEXT)" ""
DLEXT = so
endif

# These should be overridden on the command-line
SWIG=swig
IB_BUILD_PATH=$(PROJDIR)/lib/tws_api/IBJts
IB_API_VERSION=9.66
BUILD_TIME=0
IB_API_INTVER=$(subst .,,$(IB_API_VERSION))

ifdef DEBUG
DDEBUG=-DDEBUG
else
DDEBUG=
endif

OSNAME = $(shell perl -MConfig -le'print $$Config{osname}')

SOCKDIR = $(IB_BUILD_PATH)/cpp/PosixSocketClient
INCLUDES = -I$(IB_BUILD_PATH)/cpp/Shared -I$(SOCKDIR)

MODBASE = Finance::InteractiveBrokers::SWIG
MODNAME = IBAPI
MODFULL = $(MODBASE)::$(MODNAME)
LIBNAME = $(MODNAME).$(DLEXT)

# Get the perl C opts from perl itself, and clean them up for C++
PERLOPTS := $(shell perl -MExtUtils::Embed -e ccopts)
PERLOPTS := $(subst -Wdeclaration-after-statement,,$(PERLOPTS))
PERLOPTS := $(subst -fstack-protector,,$(PERLOPTS))

SWIGOPTS = -c++ -perl -Wall \
		   -DIB_API_VERSION=$(IB_API_VERSION) \
		   -DIB_API_INTVER=$(IB_API_INTVER) \
		   -DBUILD_TIME=$(BUILD_TIME)
#SWIG_INCL=
CFLAGS += -fPIC \
		  -DIB_API_VERSION=$(IB_API_VERSION) \
		  -DIB_API_INTVER=$(IB_API_INTVER) \
		  -DBUILD_TIME=$(BUILD_TIME)
LDFLAGS += $(shell perl -MConfig -le'print $$Config{lddlflags}')
LDFLAGS += $(shell perl -MExtUtils::Embed -e ldopts)
LDFLAGS := $(subst -fstack-protector,,$(LDFLAGS))

# Workaround for ExtUtils::Embed being made of lies
LIBPERL := $(shell perl -MConfig -le'print $$Config{libperl}')
DYNEXT := $(shell perl -MConfig -le'print $$Config{so}')
ifneq "$(LIBPERL)" "libperl.$(DYNEXT)"
LDFLAGS := $(subst -lperl,,$(LDFLAGS))
endif

ifeq "$(OSNAME)" "darwin"
LDFLAGS += -Wl,-no_arch_warnings
endif

IBSTRING=-DIB_USE_STD_STRING

###
### Build rules
###

.PHONY: all
all: lib

.PHONY: lib
lib: $(MODNAME).$(DLEXT)

.PHONY: swig
swig: $(MODNAME).$(PMEXT)

$(MODNAME).$(DLEXT): $(MODNAME).$(PMEXT)
	@echo --------------------------
	@echo Building module library...
	@echo --------------------------
	$(CXX) $(CFLAGS) $(DDEBUG) $(INCLUDES) $(IBSTRING) $(PERLOPTS) -c $(MODNAME).$(CXXEXT) -o $(MODNAME).$(OBJEXT)
	$(CXX) $(CFLAGS) $(DDEBUG) $(INCLUDES) $(IBSTRING) $(PERLOPTS) -c $(MODNAME)_wrap.cxx -o $(MODNAME)_wrap.$(OBJEXT)
	$(CXX) $(CFLAGS) $(DDEBUG) $(INCLUDES) $(IBSTRING) -c $(SOCKDIR)/EClientSocketBase.cpp -o EClientSocketBase.$(OBJEXT)
	$(CXX) $(CFLAGS) $(DDEBUG) $(INCLUDES) $(IBSTRING) -c $(SOCKDIR)/EPosixClientSocket.cpp -o EPosixClientSocket.$(OBJEXT)
	$(CXX) $(LDFLAGS) $(DDEBUG) -o $@ $(MODNAME).$(OBJEXT) $(MODNAME)_wrap.$(OBJEXT) EClientSocketBase.$(OBJEXT) EPosixClientSocket.$(OBJEXT)

$(MODNAME).$(PMEXT): $(MODNAME).$(SWIGEXT) $(MODNAME).$(CXXEXT) $(MODNAME).h
	@echo --------------------------------------------
	@echo Building SWIG interface for ${MODNAME}...
	@echo --------------------------------------------
	$(SWIG) $(SWIGOPTS) $(SWIG_INCL) $(INCLUDES) -o $(MODNAME)_wrap.$(CXXEXT) $<

.PHONY: clean
clean:
	rm -f $(MODNAME)_wrap.* $(MODNAME).$(PMEXT) *.$(OBJEXT) *.$(DLEXT)

# END