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