#
# Copyright 2005 The Apache Software Foundation
#
# Licensed 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.
#

#
# Note: This makefile depends on 5 environment variables to funtion correctly:
# a) WORD_SIZE
# b) THRIFT_HOME
# c) HIVE_ROOT
# d) BASE_DIR
# e) BOOST_HOME
# All these are passed by build.xml.
#

WORD_SIZE ?= 64
ifeq ($(WORD_SIZE),32)
  ARCH_FLAGS = -m32 -DARCH32
else
  ARCH_FLAGS = -m64 -DARCH64
endif

OS=$(shell uname -s)

ifeq ($(OS),Darwin)
  LDFLAGS = -dynamiclib
else
  LDFLAGS = -shared
endif


AR = ar
ARFLAGS = rcs
ARXFLAGS = -x
CC = gcc
CFLAGS = -Wall -g -fPIC
CXX = g++
CXXFLAGS = -Wall -g -fPIC
LD = g++
INSTALL = /usr/bin/install -c
SHELL = /bin/sh
LIBTOOL = $(SHELL) /usr/bin/libtool
LINK = ln -sf

BUILD_DIR = $(BASE_DIR)/target
ODBC_BUILD_DIR = $(BUILD_DIR)/odbc
OBJ_SERVICE_BUILD_DIR = $(BUILD_DIR)/service/objs
OBJ_QL_BUILD_DIR = $(BUILD_DIR)/ql/objs
OBJ_METASTORE_BUILD_DIR = $(BUILD_DIR)/metastore/objs
OBJ_ODBC_BUILD_DIR = $(ODBC_BUILD_DIR)/objs
LIB_ODBC_BUILD_DIR = $(ODBC_BUILD_DIR)/lib
TEST_ODBC_BUILD_DIR = $(ODBC_BUILD_DIR)/test
THRIFT_INCLUDE_PATH=$(THRIFT_HOME)/include/thrift
FB303_INCLUDE_PATH=$(THRIFT_INCLUDE_PATH)/fb303
INSTALL_PATH = /usr/local
INSTALL_LIB_PATH = $(INSTALL_PATH)/lib
INSTALL_INCLUDE_PATH = $(INSTALL_PATH)/include
BOOST_INCLUDE_PATH = $(BOOST_HOME)/include

LIB_NAME = hiveclient
SHLIB_VERSION = 1.0.0
SO_LINK_NAME = lib$(LIB_NAME).so
SO_NAME = $(SO_LINK_NAME).$(SHLIB_VERSION)
SO_LINK_TARGET = $(LIB_ODBC_BUILD_DIR)/$(SO_LINK_NAME)
SO_TARGET = $(LIB_ODBC_BUILD_DIR)/$(SO_NAME)
SO_INSTALL_LINK_TARGET = $(INSTALL_LIB_PATH)/$(SO_LINK_NAME)
SO_INSTALL_TARGET = $(INSTALL_LIB_PATH)/$(SO_NAME)
AR_NAME = lib$(LIB_NAME).a
AR_TARGET = $(LIB_ODBC_BUILD_DIR)/$(AR_NAME)
AR_INSTALL_TARGET = $(INSTALL_LIB_PATH)/$(AR_NAME)

SERVICE_SRC_DIR = $(HIVE_ROOT)/service/src/gen/thrift/gen-cpp
SERVICE_SOURCES = ThriftHive.cpp \
                  hive_service_constants.cpp \
                  hive_service_types.cpp
SERVICE_OBJS = $(addprefix $(OBJ_SERVICE_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(SERVICE_SOURCES))))

QL_SRC_DIR = $(HIVE_ROOT)/ql/src/gen/thrift/gen-cpp
QL_SOURCES = queryplan_types.cpp queryplan_constants.cpp
QL_OBJS = $(addprefix $(OBJ_QL_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(QL_SOURCES))))


METASTORE_SRC_DIR = $(HIVE_ROOT)/metastore/src/gen/thrift/gen-cpp
METASTORE_SOURCES = ThriftHiveMetastore.cpp \
                    hive_metastore_constants.cpp \
                    hive_metastore_types.cpp
METASTORE_OBJS = $(addprefix $(OBJ_METASTORE_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(METASTORE_SOURCES))))

ODBC_SRC_DIR = $(BASE_DIR)/src/cpp

ODBC_SOURCES = hiveclient.cpp \
               HiveResultSet.cpp \
               HiveColumnDesc.cpp \
               HiveRowSet.cpp \
               hiveclienthelper.cpp

ODBC_OBJS = $(addprefix $(OBJ_ODBC_BUILD_DIR)/,$(patsubst %,%.o,$(basename $(ODBC_SOURCES))))

ODBC_TEST_SRC_DIR = $(BASE_DIR)/src/test
ODBC_TEST_DATA_DIR = $(BASE_DIR)/testdata
TEST_FLAGS = -DTEST_DATA_DIR=$(ODBC_TEST_DATA_DIR)
HIVE_CLIENT_TEST = $(TEST_ODBC_BUILD_DIR)/HiveClientTestC

INCLUDE_PATHS = -I$(THRIFT_INCLUDE_PATH) \
                -I$(FB303_INCLUDE_PATH) \
                -I$(BOOST_INCLUDE_PATH) \
                -I$(SERVICE_SRC_DIR) \
                -I$(QL_SRC_DIR) \
                -I$(METASTORE_SRC_DIR) \
                -I$(ODBC_SRC_DIR)

INSTALL_HEADERS = hiveclient.h \
                  hiveconstants.h
HEADER_SOURCES = $(addprefix $(ODBC_SRC_DIR)/, $(INSTALL_HEADERS))
HEADER_TARGETS = $(INSTALL_INCLUDE_PATH)/hiveclient.h \
                  $(INSTALL_INCLUDE_PATH)/hiveconstants.h

LIB_THRIFT_DIR = $(THRIFT_HOME)/lib
LIB_THRIFT_ADD = -L$(LIB_THRIFT_DIR) -lthrift
LIB_THRIFT_AR = $(LIB_THRIFT_DIR)/libthrift.a

LIB_FB303_DIR = $(THRIFT_HOME)/lib
LIB_FB303_ADD = -L$(LIB_FB303_DIR) -lfb303
LIB_FB303_AR  = $(LIB_FB303_DIR)/libfb303.a


all:: $(AR_TARGET) $(SO_TARGET) $(HIVE_CLIENT_TEST)

$(AR_TARGET): $(METASTORE_OBJS) $(SERVICE_OBJS) $(QL_OBJS) $(ODBC_OBJS)
	if test -z '$(THRIFT_HOME)'; then echo 'THRIFT_HOME directory?'; exit 1; else exit 0; fi
	mkdir -p $(LIB_ODBC_BUILD_DIR)
	$(AR) $(ARXFLAGS) $(LIB_THRIFT_AR) #Extract thrift archive
	$(AR) $(ARXFLAGS) $(LIB_FB303_AR)  #Extract fb303 archive
	$(AR) $(ARFLAGS) $@ $+ *.o #Include all object files into new archive
	rm *.o #Remove extracted archive object files

$(SO_TARGET): $(METASTORE_OBJS) $(SERVICE_OBJS) $(QL_OBJS) $(ODBC_OBJS)
	if test -z '$(THRIFT_HOME)'; then echo 'THRIFT_HOME directory?'; exit 1; else exit 0; fi
	mkdir -p $(LIB_ODBC_BUILD_DIR)
	$(LD) $(ARCH_FLAGS) $(LDFLAGS) $+ $(LIB_THRIFT_ADD) $(LIB_FB303_ADD) -o $@ \
        && $(LINK) $(SO_NAME) $(SO_LINK_TARGET)


$(OBJ_SERVICE_BUILD_DIR)/%.o: $(SERVICE_SRC_DIR)/%.cpp
	mkdir -p $(OBJ_SERVICE_BUILD_DIR)
	$(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@

$(OBJ_QL_BUILD_DIR)/%.o: $(QL_SRC_DIR)/%.cpp
	mkdir -p $(OBJ_QL_BUILD_DIR)
	$(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@

$(OBJ_METASTORE_BUILD_DIR)/%.o: $(METASTORE_SRC_DIR)/%.cpp
	mkdir -p $(OBJ_METASTORE_BUILD_DIR)
	$(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@

$(OBJ_ODBC_BUILD_DIR)/%.o: $(ODBC_SRC_DIR)/%.cpp
	mkdir -p $(OBJ_ODBC_BUILD_DIR)
	$(CXX) $(CXXFLAGS) $(ARCH_FLAGS) $(INCLUDE_PATHS) -c $< -o $@

$(HIVE_CLIENT_TEST): $(SO_TARGET) $(ODBC_TEST_SRC_DIR)/hiveclienttest.c
	mkdir -p $(TEST_ODBC_BUILD_DIR)
	$(CC) $(CFLAGS) $(ARCH_FLAGS) $(TEST_FLAGS) $(INCLUDE_PATHS) $(ODBC_TEST_SRC_DIR)/hiveclienttest.c -L$(LIB_ODBC_BUILD_DIR) -L$(LIB_THRIFT_DIR) -l$(LIB_NAME) -lthrift $(LIB_FB303_ADD) -o $@


install: $(AR_TARGET) $(SO_TARGET)
	test -z "$(INSTALL_LIB_PATH)" || mkdir -p -- "$(INSTALL_LIB_PATH)"
	$(LIBTOOL) --mode=install $(INSTALL) '$(AR_TARGET)' '$(AR_INSTALL_TARGET)'
	$(LIBTOOL) --mode=install $(INSTALL) '$(SO_TARGET)' '$(SO_INSTALL_TARGET)' \
	&& $(LINK) $(SO_NAME) $(SO_INSTALL_LINK_TARGET)
	PATH="$PATH:/sbin" ldconfig -n $(INSTALL_LIB_PATH)
	test -z "$(INSTALL_INCLUDE_PATH)" || mkdir -p -- "$(INSTALL_INCLUDE_PATH)"
	$(INSTALL) -m 644 $(HEADER_SOURCES) $(INSTALL_INCLUDE_PATH)

uninstall:
	$(LIBTOOL) --mode=uninstall rm -f '$(AR_INSTALL_TARGET)' '$(SO_INSTALL_LINK_TARGET)' '$(SO_INSTALL_TARGET)'
	rm -f $(HEADER_TARGETS)

clean:
	rm -rf $(ODBC_BUILD_DIR) $(OBJ_SERVICE_BUILD_DIR) $(OBJ_QL_BUILD_DIR) $(OBJ_METASTORE_BUILD_DIR)

test: $(AR_TARGET) $(SO_TARGET) $(HIVE_CLIENT_TEST)
	LD_LIBRARY_PATH=$(LIB_ODBC_BUILD_DIR):$(LIB_THRIFT_DIR):$(LIB_FB303_DIR):$(LD_LIBRARY_PATH) $(HIVE_CLIENT_TEST)
