# Variables
STD_CC      := g++
STD_DEF     :=
STD_BIN     := $(PWD)/bin
STD_OBJ     := $(PWD)/.obj_std
HARCH=linux-x86_64
CROSS_ARCH=linuxRT-x86_64

BOOST=/afs/slac/g/lcls/package/boost/1.57.0
CPSW=$(PWD)/cpsw
YAML=/afs/slac/g/lcls/package/yaml-cpp/yaml-cpp-0.5.3
#############################
# Linux RT Cross Compile
RT_BOOSTINCP=-I$(BOOST)/linuxRT_glibc-x86_64/include
RT_BOOSTLIBP=-L$(BOOST)/linuxRT_glibc-x86_64/lib

RT_CPSWINC=-I$(CPSW)
RT_CPSWLIB=-L$(CPSW)/O.$(CROSS_ARCH)

RT_YAMLINC=-I$(YAML)/buildroot-2015.02-x86_64/include
RT_YAMLLIB=-L$(YAML)/buildroot-2015.02-x86_64/lib

RT_CC      := /afs/slac/package/linuxRT/buildroot-2015.02/host/linux-x86_64/x86_64/usr/bin/x86_64-linux-g++
RT_BIN     := $(PWD)/bin_rt
RT_CFLAGS  := -Wall -g -I/afs/slac/g/lcls/package/libxml/libxml2-2.9.2/include -I$(PWD)/generic -I$(PWD)/src $(RT_BOOSTINCP) $(RT_CPSWINC) $(RT_YAMLINC) -L/afs/slac/g/lcls/package/libxml2/2.9.3/buildroot-2015.02-x86_64/lib -L/afs/slac/g/lcls/package/zlib/1.2.8/buildroot-2015.02-x86_64/lib -L/afs/slac/g/lcls/package/xz/5.2.2/buildroot-2015.02-x86_64/lib -fpermissive -DTARGET=RT
RT_LFLAGS  :=  -L/afs/slac/package/linuxRT/vol3/buildroot-2015.02/buildroot-2015.02-x86_64/output/staging/lib $(RT_BOOSTLIBP) $(RT_CPSWLIB) $(RT_YAMLLIB) -Wl,-Bstatic -lxml2 -Wl,-Bstatic -lz -Wl,-Bstatic -lm -Wl,-Bstatic -llzma -Wl,-Bdynamic -lpthread -Wl,-Bdynamic -lrt -Wl,-Bstatic -lcpsw -Wl,-Bstatic -lboost_system -Bstatic -lyaml-cpp -Wl,-Bstatic -Wl,-Bdynamic -lgcc
RT_OBJ     := $(PWD)/.obj_rt

#############################

BOOSTINCP=-I$(BOOST)/$(HARCH)/include
BOOSTLIBP=-L$(BOOST)/$(HARCH)/lib

CPSWINC=-I$(CPSW)
CPSWLIB=-L$(CPSW)/O.linux-x86_64


YAMLINC=-I$(YAML)/linux-x86_64/include
YAMLLIB=-L$(YAML)/linux-x86_64/lib

COMMON_INCL := -I$(PWD)/generic
COMMON_INCL += $(BOOSTINCP) $(CPSWINC) $(YAMLINC) 
STD_CFLAGS := -Wall `xml2-config --cflags` $(COMMON_INCL) -I$(PWD)/src
STD_LFLAGS := $(BOOSTLIBP) $(CPSWLIB) $(YAMLLIB) `xml2-config --libs` -pthread -lrt -lbz2 -Bstatic -lcpsw -lboost_system -lyaml-cpp
#LFLAGS := $(BOOSTLIBP) $(CPSWLIB) `xml2-config --libs` -pthread -lrt -lbz2 -Bstatic -lcpsw -Bdynamic -lboost_system -Bstatic

# Generic Sources
GEN_DIR := $(PWD)/generic
GEN_SRC := $(wildcard $(GEN_DIR)/*.cpp)
GEN_HDR := $(wildcard $(GEN_DIR)/*.h)
GEN_OBJ_STD := $(patsubst $(GEN_DIR)/%.cpp,$(STD_OBJ)/%.o,$(GEN_SRC))
GEN_OBJ_RT  := $(patsubst $(GEN_DIR)/%.cpp,$(RT_OBJ)/%.o,$(GEN_SRC))

# Device Sources
#DEVICE_SRC := $(wildcard $(DEVICE_DIR)/*.cpp)
#DEVICE_HDR := $(wildcard $(DEVICE_DIR)/*.h)
#DEV_OBJ_STD := $(patsubst $(DEV_DIR)/%.cpp,$(STD_OBJ)/%.o,$(DEV_SRC))
#DEV_OBJ_RT  := $(patsubst $(DEV_DIR)/%.cpp,$(RT_OBJ)/%.o,$(DEV_SRC))

# Local Sources
LOC_DIR := $(PWD)/src
LOC_SRC := $(wildcard $(LOC_DIR)/*.cpp)
LOC_HDR := $(wildcard $(LOC_DIR)/*.h)
LOC_OBJ_STD := $(patsubst $(LOC_DIR)/%.cpp,$(STD_OBJ)/%.o,$(LOC_SRC))
LOC_OBJ_RT  := $(patsubst $(LOC_DIR)/%.cpp,$(RT_OBJ)/%.o,$(LOC_SRC))

# Util Sources
UTL_DIR := $(PWD)/util
UTL_SRC := $(wildcard $(UTL_DIR)/*.cpp)
UTL_BIN_STD := $(patsubst $(UTL_DIR)/%.cpp,$(STD_BIN)/%,$(UTL_SRC))
UTL_BIN_RT  := $(patsubst $(UTL_DIR)/%.cpp,$(RT_BIN)/%,$(UTL_SRC))

# Default
.PHONY: cpsw
all: cpsw dir all_std all_rt 

# Standard
all_std: $(GEN_OBJ_STD) $(DEV_OBJ_STD) $(LOC_OBJ_STD) $(UTL_BIN_STD) gui

# RT
all_rt: $(GEN_OBJ_RT) $(DEV_OBJ_RT) $(LOC_OBJ_RT) $(UTL_BIN_RT)

cpsw:
	cd cpsw && $(MAKE)

cpsw_clean:
	cd cpsw && make clean


# Object directory
dir:
	test -d $(STD_OBJ) || mkdir $(STD_OBJ)
	test -d $(RT_OBJ)  || mkdir $(RT_OBJ)

# Clean
clean: cpsw_clean
	rm -rf $(STD_OBJ)
	rm -rf $(RT_OBJ)
	rm -f $(UTL_BIN_STD)
	rm -f $(UTL_BIN_RT)
	cd cntrlGui; qmake; gmake clean   
	# cd root; gmake dir; gmake clean

# Compile Common Sources, STD
$(STD_OBJ)/%.o: $(GEN_DIR)/%.cpp $(GEN_DIR)/%.h
	$(STD_CC) -c $(STD_CFLAGS) $(DEF) -o $@ $<

# Compile Common Sources, RT
$(RT_OBJ)/%.o: $(GEN_DIR)/%.cpp $(GEN_DIR)/%.h
	$(RT_CC) -c $(RT_CFLAGS) $(DEF) -o $@ $<

# Compile Common Sources, STD
$(STD_OBJ)/%.o: $(DEV_DIR)/%.cpp $(DEV_DIR)/%.h
	$(STD_CC) -c $(STD_CFLAGS) $(DEF) -o $@ $<

# Compile Common Sources, RT
$(RT_OBJ)/%.o: $(DEV_DIR)/%.cpp $(DEV_DIR)/%.h
	$(RT_CC) -c $(RT_CFLAGS) $(DEF) -o $@ $<

# Compile Local Sources, STD
$(STD_OBJ)/%.o: $(LOC_DIR)/%.cpp $(LOC_DIR)/%.h
	$(STD_CC) -c $(STD_CFLAGS) $(DEF) -o $@ $<

# Compile Local Sources, RT
$(RT_OBJ)/%.o: $(LOC_DIR)/%.cpp $(LOC_DIR)/%.h
	$(RT_CC) -c $(RT_CFLAGS) $(DEF) -o $@ $<

# Comile utilities, STD
$(STD_BIN)/%: $(UTL_DIR)/%.cpp $(GEN_OBJ_STD) $(LOC_OBJ_STD) $(DEV_OBJ_STD)
	$(STD_CC) $(STD_CFLAGS) $(DEF) $(STD_OBJ)/* -o $@ $< $(STD_LFLAGS) 

# Comile utilities, RT
$(RT_BIN)/%: $(UTL_DIR)/%.cpp $(GEN_OBJ_RT) $(LOC_OBJ_RT) $(DEV_OBJ_RT)
	$(RT_CC) $(RT_CFLAGS) $(DEF) $(RT_OBJ)/* -o $@ $< $(RT_LFLAGS) 

# Compile gui
gui:
	cd cntrlGui; qmake
	cd cntrlGui; gmake

# root
ana:
	cd root; gmake
