Makefile 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. target = uart
  2. lib_name = uart
  3. build_type ?= release
  4. build_type_dir ?= release
  5. example_dir ?= examples
  6. ifeq (${build_type}, release)
  7. build_type_dir := release
  8. DRFLAGS := -O3 -w
  9. else
  10. build_type_dir = debug
  11. DRFLAGS := -g3 -DDEBUG=1 -Wall -v
  12. endif
  13. build_dir = build/${build_type_dir}
  14. obj_dir := ${build_dir}/obj
  15. bin_dir := ${build_dir}/bin
  16. lib_dir := ${build_dir}/lib
  17. gcc_std := -std=gnu99
  18. g++_std := -std=c++11
  19. includes = src
  20. CFLAGS := -fPIC ${DRFLAGS} ${gcc_std} ${addprefix -I,${includes}}
  21. CXXFLAGS := -fPIC ${DRFLAGS} ${g++_std} ${addprefix -I,${includes}}
  22. ARFLAGS := rcsD
  23. LDFLAGS :=
  24. LDLIBS :=
  25. src_sources := $(shell find src -name '*.cpp' -or -name '*.c')
  26. example_sources := $(shell find examples -name '*.cpp' -or -name '*.c')
  27. sources := ${src_sources} ${example_sources}
  28. objects := $(sources:%=$(obj_dir)/%.o)
  29. static_lib = lib${lib_name}.a
  30. shared_lib = lib${lib_name}.so
  31. define collect_source_object
  32. $(patsubst ${example_dir}/%,${obj_dir}/${example_dir}/%.o, $(shell find ${example_dir} -name '*.cpp' -or -name '*.c' -or -name '*.s'))
  33. endef
  34. # 默认目标:构建最终的可执行文件
  35. all: ${lib_dir}/${static_lib} $(bin_dir)/$(target)
  36. # $(foreach m,${binary_name},$(eval ${bin_dir}/$m: $(call collect_source_object,$m)))
  37. ${bin_dir}/$(target): $(call collect_source_object, $(target))
  38. # 链接目标:将所有.o文件链接成可执行文件
  39. # $(bin_dir)/$(target): $(objects)
  40. # @mkdir -p $(dir $@)
  41. # ${CC} $^ -o $@
  42. $(bin_dir)/$(target):
  43. mkdir -p $(dir $@)
  44. ${CC} ${LDFLAGS} $^ ${LDLIBS} -o $@ -L./$(lib_dir) -l$(lib_name)
  45. # c source
  46. $(obj_dir)/%.c.o: %.c
  47. @mkdir -p $(dir $@)
  48. ${CC} ${CFLAGS} -c $< -o $@
  49. # c++ source
  50. $(obj_dir)/%.cpp.o: %.cpp
  51. @mkdir -p $(dir $@)
  52. ${CXX} ${CXXFLAGS} -c $< -o $@
  53. # static lib
  54. ${lib_dir}%.a: $(src_sources:%=$(obj_dir)/%.o)
  55. @mkdir -p $(dir $@)
  56. ${AR} ${ARFLAGS} $@ $^
  57. # shared lib
  58. $(lib_dir)/%.so: $(src_sources:%=$(obj_dir)/%.o)
  59. @mkdir -p $(dir $@)
  60. ${CC} -shared $^ ${LDFLAGS} ${LDLIBS} -o $@
  61. .PHONY: clean rebuild
  62. clean:
  63. rm -r build
  64. rebuild: clean all