Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- makefile := $(abspath $(firstword $(MAKEFILE_LIST)))
- srcdir ?= $(dir $(makefile))/src
- ifneq ($(realpath $(dir $(makefile))),$(realpath $(CURDIR)))
- builddir ?= .
- else
- builddir ?= ./build
- endif
- proc_srcdir := $(abspath $(srcdir))
- proc_builddir := $(abspath $(builddir))
- incdirs := include
- CC := gcc
- CX := g++
- LD := g++
- RM ?= rm
- CFLAGS := -O2
- CXFLAGS := $(CFLAGS)
- override CFLAGS += -std=gnu99 -Wall -Werror -pedantic
- override CXFLAGS += -std=gnu++0x -Wall -Werror -pedantic
- override LIBS +=
- override LINKFLAGS +=
- override CPPFLAGS += $(patsubst %,-I%,$(incdirs))
- quiet ?= 1
- ifeq ($(quiet),1)
- .SILENT:
- endif
- PROGRAMS = irc
- #$(notdir $(basename $(shell find $(proc_srcdir) -maxdepth 1 -type d -and -not -wholename $(proc_srcdir))))
- .DEFAULT_GOAL = all
- define program_template
- $(1)_SRC := $$(shell find $(proc_srcdir)/ -type f -name '*.cpp')
- $(1)_OBJ := $$(patsubst $(proc_srcdir)/%,$(proc_builddir)/%.o,$$($(1)_SRC))
- $(1)_DEP := $$(patsubst %.o,%.d,$$($(1)_OBJ))
- ifneq (,$$(findstring $(1),$$(MAKECMDGOALS)))
- -include $$($(1)_DEP)
- else
- ifeq (,$$(MAKECMDGOALS))
- -include $$($(1)_DEP)
- else
- ifeq (test,$$(MAKECMDGOALS))
- -include $$($(1)_DEP)
- else
- ifeq (all,$$(MAKECMDGOALS))
- -include $$($(1)_DEP)
- endif
- endif
- endif
- endif
- $(1)_CFLAGS := $$(CFLAGS)
- $(1)_LINKFLAGS := $$(LINKFLAGS)
- $(1)_CPPFLAGS := $$(CPPFLAGS)
- $(1)_LIBS := $$(LIBS)
- ifneq (,$$(wildcard $$(proc_srcdir)/$(1)/config.mk))
- -include $$(proc_srcdir)/$(1)/config.mk
- endif
- $(1): $$($(1)_OBJ)
- @echo ' LD $$@'
- $$(LD) $$(LINKFLAGS) $$(patsubst %,-l%,$$($(1)_LIBS)) -o $$@ $$($(1)_OBJ)
- $$($(1)_DEP) : $(proc_builddir)/%.d : $(proc_srcdir)/%
- mkdir -p $$(dir $$@)
- @echo 'Generating dependencies for $$(subst $(proc_srcdir)/,,$$<)'
- $$(CC) -MM $$(CPPFLAGS) -MT $$@ -MT $$(patsubst %.d,%.o,$$@) $$< -o $$@
- .PHONY: test-$(1)
- test-$(1): $(1)
- ./$(1)
- endef
- $(foreach p,$(PROGRAMS),$(eval $(call program_template,$(p))))
- .PHONY: all
- all: $(PROGRAMS)
- $(proc_builddir)/%.c.o : $(proc_srcdir)/%.c
- @echo ' CC $(subst $(proc_builddir)/,,$@)'
- $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
- $(proc_builddir)/%.cpp.o : $(proc_srcdir)/%.cpp
- @echo ' CX $(subst $(proc_builddir)/,,$@)'
- $(CX) -c $(CPPFLAGS) $(CXFLAGS) $< -o $@
- .PHONY: clean
- clean:
- -$(RM) $(PROGRAMS)
- ifneq ($(builddir),.)
- -$(RM) -r $(builddir)
- else
- -$(RM) -r $(shell find $(builddir) -maxdepth 1 -type d -not -name '.')
- endif
- .PHONY: distclean
- distclean: clean
- .PHONY: test
- test: $(PROGRAMS)
- $(addsuffix ;,$(addprefix ./,$(PROGRAMS)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement