User:Solar/Makefile: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
Content added Content deleted
m (New page: <pre> MODULES := foo bar WARNINGS := -Wall -Wextra -Werror AUTODEPS := -MMD CFLAGS := $(WARNINGS) $(AUTODEPS) -I inc .PHONY: clean mrproper all: define RULES_template $(1)/obj/%.o: $(...)
 
No edit summary
Line 2: Line 2:
MODULES := foo bar
MODULES := foo bar


WARNINGS := -Wall -Wextra -Werror
CFLAGS := -MMD -I includes
AUTODEPS := -MMD
ARFLAGS := rc

CFLAGS := $(WARNINGS) $(AUTODEPS) -I inc


.PHONY: clean mrproper
.PHONY: clean mrproper


define MK_template
all:
include $(1)/build.mk
endef


define RULES_template
define RULES_template
Line 16: Line 16:
endef
endef


define INC_template
define PROGRAM_template
bin/$(1): $(patsubst %,$(2)/obj/%.o,$(basename $($(1)_SOURCES))) $(foreach library,$($(1)_LIBRARIES),lib/$(library))
ifeq ($(wildcard inc/$(1)),)
$$(LD) $$(LDFLAGS) $$(LDFLAGS_$(2)) $$^ -o $$@
$$(shell ln -s ../$(1)/inc inc/$(1))
endef

define ARCHIVE_template
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
endif
endef
endef


$(foreach mod,$(MODULES),$(eval include $(mod)/build.mk))
$(foreach module,$(MODULES),$(eval include $(module)/build.mk))
$(foreach mod,$(MODULES),$(eval $(call RULES_template,$(mod))))
$(foreach module,$(MODULES),$(eval $(call RULES_template,$(module))))
$(foreach mod,$(MODULES),$(eval $(call INC_template,$(mod))))
$(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))))

all:
@echo "all"


clean:
clean:
Line 30: Line 45:


mrproper: clean
mrproper: clean
$(RM) $(foreach mod,$(MODULES),$(mod)/obj/*.d) inc/*
$(RM) $(foreach mod,$(MODULES),$(mod)/obj/*.d) includes/* bin/* lib/*
</pre>
</pre>



Revision as of 16:13, 24 November 2011

MODULES := foo bar

CFLAGS := -MMD -I includes
ARFLAGS := rc

.PHONY: clean mrproper

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
bin/$(1): $(patsubst %,$(2)/obj/%.o,$(basename $($(1)_SOURCES))) $(foreach library,$($(1)_LIBRARIES),lib/$(library))
	$$(LD) $$(LDFLAGS) $$(LDFLAGS_$(2)) $$^ -o $$@
endef

define ARCHIVE_template
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))))

all:
	@echo "all"

clean:
	$(RM) $(foreach mod,$(MODULES),$(mod)/obj/*.o)

mrproper: clean
	$(RM) $(foreach mod,$(MODULES),$(mod)/obj/*.d) includes/* bin/* lib/*

CFLAGS_foo :=