User:Solar/Makefile: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
No edit summary
Line 6: Line 6:


.PHONY: clean mrproper
.PHONY: clean mrproper

all:
@echo "Default target."


define MK_template
define MK_template
Line 17: Line 20:


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


define ARCHIVE_template
define ARCHIVE_template
DEPENDENCIES := $(DEPENDENCIES) $(patsubst %,$(2)/obj/%.d,$(basename $($(1)_SOURCES)))
lib/$(1): $(patsubst %,$(2)/obj/%.o,$(basename $($(1)_SOURCES)))
lib/$(1): $(patsubst %,$(2)/obj/%.o,$(basename $($(1)_SOURCES)))
$$(AR) $$(ARFLAGS) $$@ $$?
$$(AR) $$(ARFLAGS) $$@ $$?
Line 38: Line 43:
$(foreach module,$(MODULES),$(eval $(call INCLUDE_template,$(module))))
$(foreach module,$(MODULES),$(eval $(call INCLUDE_template,$(module))))


-include $(sort $(DEPENDENCIES))
all:
@echo "all"


clean:
clean:

Revision as of 16:41, 24 November 2011

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