#/******************************************************************************
 #* Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/
 #*   All rights reserved.
 #*
 #*   Redistribution and use in source and binary forms, with or without
 #*   modification, are permitted provided that the following conditions are met:
 #*       * Redistributions of source code must retain the above copyright
 #*         notice, this list of conditions and the following disclaimer.
 #*       * Redistributions in binary form must reproduce the above copyright
 #*         notice, this list of conditions and the following disclaimer in the
 #*         documentation and/or other materials provided with the distribution.
 #*       * Neither the name of Texas Instruments Incorporated nor the
 #*         names of its contributors may be used to endorse or promote products
 #*         derived from this software without specific prior written permission.
 #*
 #*   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 #*   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 #*   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 #*   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 #*   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 #*   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 #*   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 #*   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 #*   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 #*   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 #*   THE POSSIBILITY OF SUCH DAMAGE.
 #*****************************************************************************/

.PHONY: all cross clean

BOOST_ROOT_X86  =../boost/boost_x86
BOOST_ROOT_ARM  =../boost/boost_arm
PACKAGE_VERSION = `cat ../version.txt`

UNAME_M :=$(shell uname -m)
ifneq (,$(findstring x86_64, $(UNAME_M)))
  CXX        	= g++ -m32
  EXE 			:= clacc_x86
  EXE_ARM  		:= clacc_arm
  BOOST_ROOT 	:= $(BOOST_ROOT_X86)
  all   		: $(EXE) cross
else ifneq (,$(findstring 86, $(UNAME_M)))
  CXX        	= g++ -m32
  EXE 			:= clacc_x86
  EXE_ARM  		:= clacc_arm
  BOOST_ROOT 	:= $(BOOST_ROOT_X86)
  all   		: $(EXE) cross
else ifneq (,$(findstring arm, $(UNAME_M)))
  CXX        	= g++
  EXE_ARM  		:= clacc_arm
  BOOST_ROOT 	:= /usr
  all   		: $(EXE_ARM)
endif

# Temporary object file build directories
OBJ_BUILD_DIR_X86 	= x86objs
OBJ_BUILD_DIR_ARM 	= armobjs

LDFLAGS     = -Wl,-Bdynamic -lelf
LDFLAGS_ARM = -Wl,-Bdynamic $(LINUX_DEVKIT_ROOT)/usr/lib/libelf.so

OBJS    = clacc.o compiler.o elfutils.o
MANSRC  = clacc.pod
MANPAGE = clacc.1

BUILD_DATE = $(shell date)

# Overrides for ARM cross compile
cross: override CXX=arm-linux-gnueabihf-g++
cross: override BOOST_ROOT=$(BOOST_ROOT_ARM)
cross: override LDFLAGS=$(LDFLAGS_ARM)
cross: override INCLUDES= -I$(BOOST_ROOT)/include -I${LINUX_DEVKIT_ROOT}/usr/include

LIBS += -L${BOOST_ROOT}/lib -Wl,-Bstatic
LIBS += -lboost_program_options
LIBS += -lboost_filesystem
LIBS += -lboost_system
INCLUDES = -I${BOOST_ROOT}/include

BUILT_OBJS_ARM 	= $(addprefix $(OBJ_BUILD_DIR_ARM)/, $(OBJS))
BUILT_OBJS_X86 	= $(addprefix $(OBJ_BUILD_DIR_X86)/, $(OBJS))
CXXFLAGS   	= -O3 -std=c++0x -Wall -Wextra $(INCLUDES) -DBUILD_DATE="$(BUILD_DATE)" -DPACKAGE_VERSION="$(PACKAGE_VERSION)" 

$(EXE): man-page $(OBJ_BUILD_DIR_X86) $(BUILT_OBJS_X86)
	$(CXX) $(BUILT_OBJS_X86) $(LIBS) $(LDFLAGS) -o $@

$(EXE_ARM): man-page $(OBJ_BUILD_DIR_ARM) $(BUILT_OBJS_ARM)
	$(CXX) $(BUILT_OBJS_ARM) $(LIBS) $(LDFLAGS) -o $@

cross: $(EXE_ARM)

man-page:
	pod2man --release $(PACKAGE_VERSION) --name clacc --center="TI OpenMP Accelerator Model Documentation" $(MANSRC) $(MANPAGE)

%.o: ../%.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@ 

$(OBJ_BUILD_DIR_ARM):
	mkdir -p $@

$(OBJ_BUILD_DIR_X86):
	mkdir -p $@

clean: 
	rm -rf $(EXE) $(EXE_ARM) $(MANPAGE) $(OBJ_BUILD_DIR_X86) $(OBJ_BUILD_DIR_ARM)
