Makefile 1.6 KB

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