
cc           := hipcc
name         := pro
workdir      := workspace
srcdir       := src
# export CUDA_VISIBLE_DEVICES=0
objdir       := objs
stdcpp       := c++17
dst_so_path  := libs/alg/libEXEC.so
project_name := EXEC
demodir		 := demo
defined      := 
pwd          := $(abspath .)
# 静态推理:0  动态推理:1
run_args     := 0
nvcc         := 
cuda_arch    := 


export pwd workdir srcdir objdir demodir

demo_srcs   := $(shell find $(demodir) -name "*.cpp")
demo_objs   := $(demo_srcs:.cpp=.o)
demo_objs   := $(demo_objs:$(demodir)/%=$(objdir)/%)

cpp_srcs := $(shell find $(srcdir) -name "*.cpp")
cpp_objs := $(cpp_srcs:.cpp=.o)
cpp_objs := $(cpp_objs:$(srcdir)/%=$(objdir)/%)

cc_srcs := $(shell find $(srcdir) -name "*.cc")
cc_objs := $(cc_srcs:.cc=.o)
cc_objs := $(cc_objs:$(srcdir)/%=$(objdir)/%)

cu_srcs  := $(shell find $(srcdir) -name "*.cu")
cu_objs  := $(cu_srcs:.cu=.cu.o)
cu_objs  := $(cu_objs:$(srcdir)/%=objs/%)


dtk_path  := $(shell find /opt -name "dtk-*")

include_paths := $(dtk_path)/cuda/include \
			$(pwd)/3rdparty/opencv_4.5_lean/include/opencv4   \
			$(srcdir)	\
			. \
			$(pwd)/3rdparty/ppl/include \
			$(dtk_path)/include \
			$(srcdir)/Utility


library_paths :=  \
			$(pwd)/3rdparty/opencv_4.5_lean/lib  \
			$(pwd)/3rdparty/opencv_4.5_lean/lib64  \
			$(pwd)/3rdparty/opencv_4.5_lean/lib/opencv4/3rdparty \
			$(pwd)/3rdparty/opencv_4.5_lean/lib64/opencv4/3rdparty \
			$(pwd)/3rdparty/ppl/lib \
			$(dtk_path)/cuda/lib64 \
			$(dtk_path)/hip/lib \
			$(dtk_path)/lib


empty := 
library_path_export := $(subst $(empty) $(empty),:,$(library_paths))

link_opencv := opencv_core opencv_imgproc opencv_imgcodecs opencv_dnn  
# link_3rd    := libprotobuf libtiff libjpeg-turbo IlmImf libpng libwebp quirc zlib ade ittnotify libopenjp2      
link_cuda   := cudart cuda cublas
link_trt    := migraphx migraphx_gpu migraphx_onnx
link_sys    := m stdc++ dl rt
link_cudnn  := 
link_librarys := $(link_opencv) $(link_trt) $(link_cuda) $(link_sys) 

run_paths     := $(foreach item,$(library_paths),-Wl,-rpath=$(item))
include_paths := $(foreach item,$(include_paths),-I$(item))
library_paths := $(foreach item,$(library_paths),-L$(item))
link_librarys := $(foreach item,$(link_librarys),-l$(item))
defined       := $(foreach item,$(defined),-D$(item))

link_librarys     += -pthread -fopenmp

# cpp_compile_flags := -std=$(stdcpp) -fPIC -m64 -O3 -w  $(defined) -fuse-ld=gold -fuse-ld=gold --offload-arch=gfx926 --offload-arch=gfx906
# cpp_compile_flags += $(include_paths)
# cu_compile_flags  := -std=c++17 -w -O1 -Xcompiler "$(cpp_compile_flags)" $(cuda_arch) $(support_define) --gpu-max-threads-per-block=1024 --offload-arch=gfx926 --offload-arch=gfx906 
# cu_compile_flags  += $(include_paths)

cpp_compile_flags := -std=$(stdcpp) -fPIC -m64 -O3 -w  $(defined) --gpu-max-threads-per-block=1024
cpp_compile_flags += $(include_paths)
cu_compile_flags  := -std=c++17 -w -O3 -Xcompiler "$(cpp_compile_flags)" $(cuda_arch) $(support_define) --gpu-max-threads-per-block=1024
cu_compile_flags  += $(include_paths)

link_flags 		  += $(library_paths) $(link_librarys) $(run_paths)

#pro         workspace/pro
$(name)   : $(workdir)/$(name)
all       : $(name)

run       : $(name)
	@echo Run_start
	@cd $(workdir) && ./$(name) $(run_args)

build_so : $(dst_so_path)
$(dst_so_path) : $(cpp_objs) $(cc_objs) $(cu_objs) 
	@echo Link $@
	@mkdir -p $(dir $@)
	@$(cc) $^ -shared -o $@ $(link_flags)

run_by_so : $(dst_so_path)
	@echo Compile demo.cpp
	@$(cc) -c $(demo_srcs)  -o objs/$(project_name).o $(cpp_compile_flags)
	@echo Link dst_so
	@$(cc) objs/$(project_name).o -o $(workdir)/$(name) -Llibs/alg -l$(project_name) $(link_flags)
	@./$(workdir)/$(name) $(run_args)

$(workdir)/$(name) : $(cpp_objs) $(cc_objs) $(cu_objs)
	@echo Link $@
	@mkdir -p $(dir $@)
	@$(cc) $^ -o $@ $(link_flags)

$(objdir)/%.o : $(srcdir)/%.cpp
	@echo Compile CXX $<
	@mkdir -p $(dir $@)
	@$(cc) -c $< -o $@ $(cpp_compile_flags)

$(objdir)/%.o : $(srcdir)/%.cc
	@echo Compile CUDA $<
	@mkdir -p $(dir $@)
	@$(cc) -c $< -o $@ $(cpp_compile_flags)

$(objdir)/%.cu.o : $(srcdir)/%.cu
	@echo Compile CUDA $<
	@mkdir -p $(dir $@)
	@$(nvcc) -c $< -o $@ $(cu_compile_flags)

$(objdir)/%.o : $(demodir)/%.cpp
	@echo Compile DEMO $<
	@mkdir -p $(dir $@)
	@$(cc) -c $< -o $@ $(cpp_compile_flags)

# 定义清理指令
clean :
	@rm -rf $(objdir) $(workdir)/$(name)
	@rm -f libs/alg/* ./*.o pro src/*.o demo/*.o workspace/core.* core.*

debug :
	@echo $(LD_LIBRARY_PATH):$(library_path_export)

.PHONY : clean run $(name) all build_so run_by_so
