MAKEFLAGS += --no-builtin-rules MAKEFLAGS += --no-builtin-variables MAKEFLAGS += --no-print-directory MAKEFLAGS += --warn-undefined-variables srcdir := . builddir := tmp LIBUNIT_PREFIX := /opt/local/unit LIBUNIT_CPPFLAGS := -isystem$(LIBUNIT_PREFIX)/include LIBUNIT_LIBS := -L$(LIBUNIT_PREFIX)/lib -lunit DEFAULT_CPPFLAGS := -D_GNU_SOURCE $(LIBUNIT_CPPFLAGS) EXTRA_CPPFLAGS := CPPFLAGS := $(DEFAULT_CPPFLAGS) $(EXTRA_CPPFLAGS) DEFAULT_CFLAGS := -Wall -Wextra -Werror -std=gnu2x -O3 EXTRA_CFLAGS := CFLAGS := $(DEFAULT_CFLAGS) $(EXTRA_CFLAGS) DEFAULT_ASFLAGS := EXTRA_ASFLAGS := ASFLAGS := $(DEFAULT_ASFLAGS) $(EXTRA_ASFLAGS) DEFAULT_LDFLAGS := EXTRA_LDFLAGS := LDFLAGS := $(DEFAULT_LDFLAGS) $(EXTRA_LDFLAGS) DEFAULT_LIBS := $(LIBUNIT_LIBS) -lpthread -lc -lgcc EXTRA_LIBS := LIBS := $(DEFAULT_LIBS) $(EXTRA_LIBS) AR := ar AS := as CC := cc CPP := $(CC) -E $(CFLAGS) LD := $(CC) $(CFLAGS) FIND := find GREP := grep MKDIR := mkdir SED := sed SORT := sort SRCDIR := $(srcdir)/src SRC := $(shell $(FIND) $(SRCDIR) -type f | $(GREP) '\.c$$' | $(SORT)) I := $(patsubst $(srcdir)/%.c,$(builddir)/%.i,$(SRC)) ASM := $(patsubst $(srcdir)/%.c,$(builddir)/%.s,$(SRC)) OBJ := $(patsubst %.s,%.o,$(ASM)) BIN := $(builddir)/unit_c_app SRCDIRS := $(shell $(FIND) $(SRCDIR) -type d | $(SED) 's,$$,/,') BUILDDIRS := $(patsubst $(srcdir)/%, $(builddir)/%, $(SRCDIRS)) .PHONY: all all: $(BIN) .SECONDEXPANSION: $(I): $(builddir)/%.i: $(srcdir)/%.c Makefile | $$(@D)/ $(info CPP $@) $(CPP) $(CPPFLAGS) -o $@ $< $(ASM): %.s: %.i Makefile | $$(@D)/ $(info CC $@) $(CC) -S $(CFLAGS) -o $@ $< $(OBJ): %.o: %.s Makefile | $$(@D)/ $(info AS $@) $(AS) $(ASFLAGS) -o $@ $< $(BIN): $(OBJ) Makefile | $$(@D)/ $(info LD $@) $(LD) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) $(BUILDDIRS): %/: | $$(dir %) $(info MKDIR $@) $(MKDIR) $@ $(builddir)/: $(info MKDIR $@) $(MKDIR) $@ ifdef V else .SILENT: endif