target = uart
lib_name = uart

build_type ?= release
build_type_dir ?= release
example_dir ?= examples

ifeq (${build_type}, release)
	build_type_dir := release
	DRFLAGS := -O3 -w
else
	build_type_dir = debug
	DRFLAGS := -g3 -DDEBUG=1 -Wall -v
endif

build_dir = build/${build_type_dir}
obj_dir := ${build_dir}/obj
bin_dir := ${build_dir}/bin
lib_dir	:= ${build_dir}/lib

gcc_std := -std=gnu99
g++_std := -std=c++11
includes = src

CFLAGS := -fPIC ${DRFLAGS} ${gcc_std} ${addprefix -I,${includes}}
CXXFLAGS := -fPIC ${DRFLAGS} ${g++_std} ${addprefix -I,${includes}}
ARFLAGS := rcsD
LDFLAGS :=
LDLIBS	:= 

src_sources := $(shell find src -name '*.cpp' -or -name '*.c')
example_sources :=  $(shell find examples -name '*.cpp' -or -name '*.c')
sources := ${src_sources} ${example_sources}
objects := $(sources:%=$(obj_dir)/%.o)

static_lib = lib${lib_name}.a
shared_lib = lib${lib_name}.so

define collect_source_object
$(patsubst ${example_dir}/%,${obj_dir}/${example_dir}/%.o, $(shell find ${example_dir} -name '*.cpp' -or -name '*.c' -or -name '*.s'))
endef

# 默认目标：构建最终的可执行文件
all: ${lib_dir}/${static_lib}  $(bin_dir)/$(target)
# $(foreach m,${binary_name},$(eval ${bin_dir}/$m: $(call collect_source_object,$m)))
${bin_dir}/$(target): $(call collect_source_object, $(target))

# 链接目标：将所有.o文件链接成可执行文件
# $(bin_dir)/$(target): $(objects)
# 	@mkdir -p $(dir $@)
# 	${CC} $^ -o $@
$(bin_dir)/$(target):
	mkdir -p $(dir $@)
	${CC} ${LDFLAGS} $^ ${LDLIBS} -o $@  -L./$(lib_dir) -l$(lib_name)

# c source
$(obj_dir)/%.c.o: %.c
	@mkdir -p $(dir $@)
	${CC} ${CFLAGS} -c $< -o $@

# c++ source
$(obj_dir)/%.cpp.o: %.cpp
	@mkdir -p $(dir $@)
	${CXX} ${CXXFLAGS} -c $< -o $@

# static lib
${lib_dir}%.a: $(src_sources:%=$(obj_dir)/%.o)
	@mkdir -p $(dir $@)
	${AR} ${ARFLAGS} $@ $^

# shared lib
$(lib_dir)/%.so: $(src_sources:%=$(obj_dir)/%.o)
	@mkdir -p $(dir $@)
	${CC} -shared $^ ${LDFLAGS} ${LDLIBS} -o $@
	
.PHONY: clean rebuild

clean:
	rm -r build

rebuild: clean all