#/*
#* Licensed to the Apache Software Foundation (ASF) under one or more
#* contributor license agreements.  See the NOTICE file distributed with
#* this work for additional information regarding copyright ownership.
#* The ASF licenses this file to You under the Apache License, Version 2.0
#* (the "License"); you may not use this file except in compliance with
#* the License.  You may obtain a copy of the License at
#*
#*     http://www.apache.org/licenses/LICENSE-2.0
#*
#* Unless required by applicable law or agreed to in writing, software
#* distributed under the License is distributed on an "AS IS" BASIS,
#* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#* See the License for the specific language governing permissions and
#* limitations under the License.
#*/

##====================================================================
# make release=0 debug版。
# make release=1 release版。
CXXFLAGS = -g -pthread -Wall -fPIC -Wno-deprecated -fno-strict-aliasing -fno-omit-frame-pointer -O0 -DNDEBUG

ifeq ($(shell uname -m),x86_64)
	CXXFLAGS += -m64
else
	CXXFLAGS += -m32
endif

##====================================================================
PREFIX:=/usr/local
TOPDIR := ..
STATIC_TARGET := $(TOPDIR)/bin/librocketmqclientpython.a
SHARED_TARGET := $(TOPDIR)/bin/librocketmqclientpython.so
SRCDIR:=$(TOPDIR)/src
INCFILES:=$(wildcard $(TOPDIR)/include/*.h)
CPP_SRCDIR := $(SRCDIR)

CPP_SRC := $(foreach dir,$(CPP_SRCDIR), $(wildcard $(dir)/*.cpp))
STATIC_OBJ := $(filter-out %/dllmain.o,$(patsubst %.cpp, %.o, $(CPP_SRC)))
SHARED_OBJ := $(filter-out %/dllmain.lo,$(patsubst %.cpp, %.lo, $(CPP_SRC)))
VPATH:=$(CPP_SRCDIR)

PYTHON_INCLUDE:=/usr/include/python2.7
ROCKETMQ_INCLUDE:=/usr/local/include/rocketmq
PYTHON_LIB:=/usr/python/bin
PYTHON_LIBD:=/usr/python/lib
ROCKETMQ_LIBD:=/usr/local/lib
CPPFLAGS := -I$(TOPDIR)/include \
		    $(addprefix -I,$(CPP_SRCDIR)) \
		    $(addprefix -I,$(ROCKETMQ_INCLUDE)) \
			$(addprefix -I,$(PYTHON_INCLUDE))

LDFLAGS := -shared -Wl,-soname=librocketmqclientpython.so -pthread -fPIC
LIBPATH := $(addprefix -L,$(ROCKETMQ_LIBD) $(PYTHON_LIBD))
LDLIBS := $(addprefix -l,rocketmq boost_python)

CXX := g++
AR := ar
ARFLAGS := rcs
LIBS:= $(foreach dir,$(ROCKETMQ_LIBD),$(wildcard $(dir)/*/lib/*.a))
##====================================================================
#include     tool.mak
##====================================================================
all:build-static  build-shared

build-static:$(STATIC_TARGET)

build-shared:$(SHARED_TARGET)

$(STATIC_TARGET):$(STATIC_OBJ) $(LIBS)

$(SHARED_TARGET):$(SHARED_OBJ)
	$(CXX) $(LDFLAGS) -o $@ $^ $(LIBPATH) $(LDLIBS)

%.o:%.cpp
	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<

%.lo:%.cpp
	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) -o $@ $<

rebuild:clean build

test:
	@echo $(LIBS)

clean:
	$(RM) -rf $(STATIC_OBJ)
	$(RM) -rf $(SHARED_OBJ)
	$(RM) -rf  ipch  *.sdf *.opensdf *.user *.suo

install: $(STATIC_TARGET) $(SHARED_TARGET)
	mkdir -p $(PREFIX)/lib
	rm -rf $(PREFIX)/lib/librocketmqclientpython.a
	rm -rf $(PREFIX)/lib/librocketmqclientpython.so
	#cp -rf $(STATIC_TARGET) $(PREFIX)/lib/
	cp -rf $(SHARED_TARGET) $(PREFIX)/lib/
	@echo
	@echo 'Install succeed, target directory is "'$(PREFIX)'".'
