Makefile 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. CC = gcc
  2. CFLAGS = -O2 -fPIC -Wall
  3. AR = ar rc
  4. BUILD = build
  5. .PHONY : all lib clean tool
  6. LIBSRCS = context.c varint.c array.c pattern.c register.c proto.c map.c alloc.c rmessage.c wmessage.c bootstrap.c stringpool.c decode.c
  7. LIBNAME = libpbc.a
  8. TESTSRCS = addressbook.c pattern.c pbc.c float.c map.c test.c decode.c
  9. PROTOSRCS = addressbook.proto descriptor.proto float.proto test.proto
  10. BUILD_O = $(BUILD)/o
  11. all : lib test
  12. lib : $(LIBNAME)
  13. clean :
  14. rm -rf $(BUILD)
  15. $(BUILD) : $(BUILD_O)
  16. $(BUILD_O) :
  17. mkdir -p $@
  18. TOOL := $(BUILD)/dump
  19. tool : $(TOOL)
  20. $(TOOL) : | $(BUILD)
  21. $(TOOL) : $(LIBNAME)
  22. $(TOOL) : tool/dump.c
  23. cd $(BUILD) && $(CC) $(CFLAGS) -I.. -L. -o dump ../$< -lpbc
  24. LIB_O :=
  25. define BUILD_temp
  26. TAR := $(BUILD_O)/$(notdir $(basename $(1)))
  27. LIB_O := $(LIB_O) $$(TAR).o
  28. $$(TAR).o : | $(BUILD_O)
  29. -include $$(TAR).d
  30. $$(TAR).o : src/$(1)
  31. $(CC) $(CFLAGS) -c -Isrc -I. -o $$@ -MMD $$<
  32. endef
  33. $(foreach s,$(LIBSRCS),$(eval $(call BUILD_temp,$(s))))
  34. $(LIBNAME) : $(LIB_O)
  35. cd $(BUILD) && $(AR) $(LIBNAME) $(addprefix ../,$^)
  36. TEST :=
  37. define TEST_temp
  38. TAR := $(BUILD)/$(notdir $(basename $(1)))
  39. TEST := $(TEST) $$(TAR)
  40. $$(TAR) : | $(BUILD)
  41. $$(TAR) : $(LIBNAME)
  42. $$(TAR) : test/$(1)
  43. cd $(BUILD) && $(CC) $(CFLAGS) -I.. -L. -o $$(notdir $$@) ../$$< -lpbc
  44. endef
  45. $(foreach s,$(TESTSRCS),$(eval $(call TEST_temp,$(s))))
  46. test : $(TEST) proto
  47. PROTO :=
  48. define PROTO_temp
  49. TAR := $(BUILD)/$(notdir $(basename $(1)))
  50. PROTO := $(PROTO) $$(TAR).pb
  51. $$(TAR).pb : | $(BUILD)
  52. $$(TAR).pb : test/$(1)
  53. protoc -o$$@ $$<
  54. endef
  55. $(foreach s,$(PROTOSRCS),$(eval $(call PROTO_temp,$(s))))
  56. proto : $(PROTO)
  57. .PHONY : all lib test proto clean