Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Make 2.54 KB | None | 0 0
  1. makefile := $(abspath $(firstword $(MAKEFILE_LIST)))
  2.  
  3. srcdir ?= $(dir $(makefile))/src
  4.  
  5. ifneq ($(realpath $(dir $(makefile))),$(realpath $(CURDIR)))
  6. builddir ?= .
  7. else
  8. builddir ?= ./build
  9. endif
  10.  
  11. proc_srcdir := $(abspath $(srcdir))
  12. proc_builddir := $(abspath $(builddir))
  13.  
  14. incdirs := include
  15.  
  16. CC := gcc
  17. CX := g++
  18. LD := g++
  19.  
  20. RM ?= rm
  21.  
  22. CFLAGS  := -O2
  23. CXFLAGS := $(CFLAGS)
  24.  
  25. override CFLAGS    += -std=gnu99 -Wall -Werror -pedantic
  26. override CXFLAGS   += -std=gnu++0x -Wall -Werror -pedantic
  27. override LIBS      +=
  28. override LINKFLAGS +=
  29. override CPPFLAGS  += $(patsubst %,-I%,$(incdirs))
  30.  
  31. quiet ?= 1
  32. ifeq ($(quiet),1)
  33. .SILENT:
  34. endif
  35.  
  36. PROGRAMS = irc
  37. #$(notdir $(basename $(shell find $(proc_srcdir) -maxdepth 1 -type d -and -not -wholename $(proc_srcdir))))
  38.  
  39. .DEFAULT_GOAL = all
  40.  
  41. define program_template
  42. $(1)_SRC := $$(shell find $(proc_srcdir)/ -type f -name '*.cpp')
  43. $(1)_OBJ := $$(patsubst $(proc_srcdir)/%,$(proc_builddir)/%.o,$$($(1)_SRC))
  44. $(1)_DEP := $$(patsubst %.o,%.d,$$($(1)_OBJ))
  45.  
  46. ifneq (,$$(findstring $(1),$$(MAKECMDGOALS)))
  47. -include $$($(1)_DEP)
  48. else
  49. ifeq (,$$(MAKECMDGOALS))
  50. -include $$($(1)_DEP)
  51. else
  52. ifeq (test,$$(MAKECMDGOALS))
  53. -include $$($(1)_DEP)
  54. else
  55. ifeq (all,$$(MAKECMDGOALS))
  56. -include $$($(1)_DEP)
  57. endif
  58. endif
  59. endif
  60. endif
  61.  
  62. $(1)_CFLAGS    := $$(CFLAGS)
  63. $(1)_LINKFLAGS := $$(LINKFLAGS)
  64. $(1)_CPPFLAGS  := $$(CPPFLAGS)
  65. $(1)_LIBS      := $$(LIBS)
  66.  
  67. ifneq (,$$(wildcard $$(proc_srcdir)/$(1)/config.mk))
  68. -include $$(proc_srcdir)/$(1)/config.mk
  69. endif
  70.  
  71. $(1): $$($(1)_OBJ)
  72.     @echo '  LD  $$@'
  73.     $$(LD) $$(LINKFLAGS) $$(patsubst %,-l%,$$($(1)_LIBS)) -o $$@ $$($(1)_OBJ)
  74.  
  75. $$($(1)_DEP) : $(proc_builddir)/%.d : $(proc_srcdir)/%
  76.     mkdir -p $$(dir $$@)
  77.     @echo 'Generating dependencies for $$(subst $(proc_srcdir)/,,$$<)'
  78.     $$(CC) -MM $$(CPPFLAGS) -MT $$@ -MT $$(patsubst %.d,%.o,$$@) $$< -o $$@
  79.  
  80. .PHONY: test-$(1)
  81. test-$(1): $(1)
  82.     ./$(1)
  83.  
  84. endef
  85.  
  86. $(foreach p,$(PROGRAMS),$(eval $(call program_template,$(p))))
  87.  
  88. .PHONY: all
  89. all: $(PROGRAMS)
  90.  
  91. $(proc_builddir)/%.c.o : $(proc_srcdir)/%.c
  92.     @echo '  CC  $(subst $(proc_builddir)/,,$@)'
  93.     $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
  94.  
  95. $(proc_builddir)/%.cpp.o : $(proc_srcdir)/%.cpp
  96.     @echo '  CX  $(subst $(proc_builddir)/,,$@)'
  97.     $(CX) -c $(CPPFLAGS) $(CXFLAGS) $< -o $@
  98.  
  99. .PHONY: clean
  100. clean:
  101.     -$(RM) $(PROGRAMS)
  102. ifneq ($(builddir),.)
  103.     -$(RM) -r $(builddir)
  104. else
  105.     -$(RM) -r $(shell find $(builddir) -maxdepth 1 -type d -not -name '.')
  106. endif
  107.  
  108. .PHONY: distclean
  109. distclean: clean
  110.  
  111. .PHONY: test
  112. test: $(PROGRAMS)
  113.     $(addsuffix ;,$(addprefix ./,$(PROGRAMS)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement