AGENT_INCLUDE = ./include
AGENT_LIB =  lib

AGENT_SRC =  src
AGENT_BIN =  bin
APR_INCLUDE = ./include/apr-1.0
AGENT_ND_CORE_OBJ_DIR=obj
TEST_DYNINST = test/dyninstexamples
CXX = g++
CXXFLAGS = -g -Wall -std=c++11 -I. -I $(AGENT_INCLUDE) -I $(APR_INCLUDE) -I../../../../thirdparty-core/dyninst/install/include/

DYNINST_DEPENDENCIES = -L $(AGENT_LIB) -lcommon \
		-ldyninstAPI \
		-lboost_system \
		-ltbbmalloc \
		-lapr-1 \
		-lsymtabAPI \
		-lstackwalk \
       -lpcontrol \
       -lpatchAPI \
       -lparseAPI \
       -linstructionAPI \
       -ldynDwarf \
       -ldynElf \
       -lcapstone


AGENT_DEPENDENCIES = -L $(AGENT_LIB) -lpthread \
		-lapr-1

COMMON_HEADER=$(AGENT_INCLUDE)/ndMain.h
export LD_LIBRARY_PATH=./go/lib
$(shell mkdir -p $(AGENT_ND_CORE_OBJ_DIR))
$(shell mkdir -p $(AGENT_BIN))

all: buildDyninst goAgent dyninstapp testapps go_package
testapps: accessFunctionVariables passVarToInstrumentFunc
iproute2 : cleaniproute2 createiproute2
compilego: goAgent dyninstapp
AGENT_ND_CORE_OBJS=$(AGENT_ND_CORE_OBJ_DIR)/ndMain.o \
	$(AGENT_ND_CORE_OBJ_DIR)/parson.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndConfig.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndAgent.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndMessage.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndProcessMonitor.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndSocket.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndUtility.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndAprLib.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndAprUtility.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndAprLog.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndGoProcess.o \

CAGENT_ND_CORE_OBJS=$(AGENT_ND_CORE_OBJ_DIR)/cprocessInstrument.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndUtility.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndAprLog.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndAprUtility.o \
	$(AGENT_ND_CORE_OBJ_DIR)/ndAprLib.o \

$(AGENT_ND_CORE_OBJ_DIR)/ndMain.o: $(AGENT_SRC)/ndMain.cpp $(COMMON_HEADER)
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndMain.o $(AGENT_SRC)/ndMain.cpp

$(AGENT_ND_CORE_OBJ_DIR)/parson.o: $(AGENT_SRC)/parson.cpp $(AGENT_INCLUDE)/parson.h
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/parson.o $(AGENT_SRC)/parson.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndConfig.o: $(AGENT_SRC)/ndConfig.cpp $(AGENT_INCLUDE)/ndConfig.h $(COMMON_HEADER)
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndConfig.o $(AGENT_SRC)/ndConfig.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndAgent.o: $(AGENT_SRC)/ndAgent.cpp $(AGENT_INCLUDE)/ndAgent.h $(COMMON_HEADER)
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndAgent.o $(AGENT_SRC)/ndAgent.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndMessage.o: $(AGENT_SRC)/ndMessage.cpp $(AGENT_INCLUDE)/ndMessage.h $(COMMON_HEADER)
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndMessage.o $(AGENT_SRC)/ndMessage.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndProcessMonitor.o: $(AGENT_SRC)/ndProcessMonitor.cpp $(AGENT_INCLUDE)/ndProcessMonitor.h $(COMMON_HEADER)
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndProcessMonitor.o $(AGENT_SRC)/ndProcessMonitor.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndSocket.o: $(AGENT_SRC)/ndSocket.cpp $(AGENT_INCLUDE)/ndSocket.h $(COMMON_HEADER)
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndSocket.o $(AGENT_SRC)/ndSocket.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndUtility.o: $(AGENT_SRC)/ndUtility.cpp $(AGENT_INCLUDE)/ndUtility.h
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndUtility.o $(AGENT_SRC)/ndUtility.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndAprLib.o: $(AGENT_SRC)/ndAprLib.cpp $(AGENT_INCLUDE)/ndAprLib.h
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndAprLib.o $(AGENT_SRC)/ndAprLib.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndAprUtility.o: $(AGENT_SRC)/ndAprUtility.cpp $(AGENT_INCLUDE)/ndAprUtility.h
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndAprUtility.o $(AGENT_SRC)/ndAprUtility.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndAprLog.o: $(AGENT_SRC)/ndAprLog.cpp $(AGENT_INCLUDE)/ndAprLog.h
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndAprLog.o $(AGENT_SRC)/ndAprLog.cpp

$(AGENT_ND_CORE_OBJ_DIR)/ndGoProcess.o: $(AGENT_SRC)/ndGoProcess.cpp $(AGENT_INCLUDE)/ndGoProcess.h
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/ndGoProcess.o $(AGENT_SRC)/ndGoProcess.cpp

$(AGENT_ND_CORE_OBJ_DIR)/cprocessInstrument.o: $(AGENT_SRC)/cprocessInstrument.cpp $(AGENT_INCLUDE)/cprocessInstrument.h $(COMMON_HEADER)
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/cprocessInstrument.o $(AGENT_SRC)/cprocessInstrument.cpp

$(AGENT_ND_CORE_OBJ_DIR)/accessFunctionVariables.o: $(TEST_DYNINST)/accessFunctionVariables.cpp
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/accessFunctionVariables.o $(TEST_DYNINST)/accessFunctionVariables.cpp

$(AGENT_ND_CORE_OBJ_DIR)/passVarToInstrumentFunc.o: $(TEST_DYNINST)/passVarToInstrumentFunc.cpp
	$(CXX) $(CXXFLAGS) -c -o $(AGENT_ND_CORE_OBJ_DIR)/passVarToInstrumentFunc.o $(TEST_DYNINST)/passVarToInstrumentFunc.cpp

goAgent: $(AGENT_ND_CORE_OBJS)
	$(CXX) -o $(AGENT_BIN)/goAgent $(AGENT_ND_CORE_OBJS) $(AGENT_DEPENDENCIES)

dyninstapp: $(CAGENT_ND_CORE_OBJS)
	$(CXX) -o $(AGENT_BIN)/dyninstapp $(CAGENT_ND_CORE_OBJS) $(DYNINST_DEPENDENCIES)

accessFunctionVariables: $(AGENT_ND_CORE_OBJ_DIR)/accessFunctionVariables.o
	$(CXX) -o $(AGENT_BIN)/accessFunctionVariables $(AGENT_ND_CORE_OBJ_DIR)/accessFunctionVariables.o $(DYNINST_DEPENDENCIES)

passVarToInstrumentFunc: $(AGENT_ND_CORE_OBJ_DIR)/passVarToInstrumentFunc.o
	$(CXX) -o $(AGENT_BIN)/passVarToInstrumentFunc $(AGENT_ND_CORE_OBJ_DIR)/passVarToInstrumentFunc.o $(DYNINST_DEPENDENCIES)

cleaniproute2:
	(cd iproute2; make clean)

createiproute2:
	(cd iproute2; make)

go_package:
	./go_build_script.sh

buildDyninst:
	./build_dynist.sh

clean:
	rm -f $(AGENT_ND_CORE_OBJ_DIR)/* $(AGENT_BIN)/*
	(cd iproute2; make clean)
