User:Solar/Makefile
Jump to navigation
Jump to search
. ├── bar │ ├── build.mk │ ├── includes │ │ └── global.h │ ├── obj │ └── src │ ├── bar_local.h │ └── bar_test.c ├── bin ├── foo │ ├── build.mk │ ├── includes │ │ └── global.h │ ├── obj │ └── src │ ├── foo_local.h │ ├── foo_test.c │ └── main.c ├── includes ├── lib └── Makefile
MODULES := foo bar
CFLAGS := -MMD -I includes
ARFLAGS := rc
.PHONY: clean mrproper
all:
@echo "Default target."
define MK_template
include $(1)/build.mk
endef
define RULES_template
$(1)/obj/%.o: $(1)/src/%.c
$$(CC) $$(CFLAGS) $$(CFLAGS_$(1)) -c $$< -o $$@
endef
define PROGRAM_template
DEPENDENCIES := $(DEPENDENCIES) $(patsubst %,$(2)/obj/%.d,$(basename $($(1)_SOURCES)))
bin/$(1): $(patsubst %,$(2)/obj/%.o,$(basename $($(1)_SOURCES))) $(foreach library,$($(1)_LIBRARIES),lib/$(library))
$$(LD) $$(LDFLAGS) $$(LDFLAGS_$(2)) $$^ -o $$@
endef
define ARCHIVE_template
DEPENDENCIES := $(DEPENDENCIES) $(patsubst %,$(2)/obj/%.d,$(basename $($(1)_SOURCES)))
lib/$(1): $(patsubst %,$(2)/obj/%.o,$(basename $($(1)_SOURCES)))
$$(AR) $$(ARFLAGS) $$@ $$?
endef
define INCLUDE_template
ifeq ($(wildcard includes/$(1)),)
$$(shell ln -s ../$(1)/includes includes/$(1))
endif
endef
$(foreach module,$(MODULES),$(eval include $(module)/build.mk))
$(foreach module,$(MODULES),$(eval $(call RULES_template,$(module))))
$(foreach module,$(MODULES),$(eval $(foreach binary,$($(module)_PROGRAMS),$(call PROGRAM_template,$(binary),$(module)))))
$(foreach module,$(MODULES),$(eval $(foreach library,$($(module)_ARCHIVES),$(call ARCHIVE_template,$(library),$(module)))))
$(foreach module,$(MODULES),$(eval $(call INCLUDE_template,$(module))))
-include $(sort $(DEPENDENCIES))
clean:
$(RM) $(foreach mod,$(MODULES),$(mod)/obj/*.o)
mrproper: clean
$(RM) $(foreach mod,$(MODULES),$(mod)/obj/*.d) includes/* bin/* lib/*
CFLAGS_foo := -Wall foo_PROGRAMS := foo foo_ARCHIVES := foolib.a foo_SOURCES := main.c foo_LIBRARIES := foolib.a foolib.a_SOURCES := foo_test.c