User:Solar/Makefile: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
Content deleted Content added
Solar (talk | contribs)
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: $(...
 
Solar (talk | contribs)
No edit summary
Line 2:
MODULES := foo bar
 
WARNINGSCFLAGS := -WallMMD -WextraI -Werrorincludes
AUTODEPSARFLAGS := -MMDrc
 
CFLAGS := $(WARNINGS) $(AUTODEPS) -I inc
 
.PHONY: clean mrproper
 
define MK_template
all:
include $(1)/build.mk
endef
 
define RULES_template
Line 16:
endef
 
define INC_templatePROGRAM_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 incincludes/$(1)),)
$$(shell ln -s ../$(1)/incincludes incincludes/$(1))
endif
endef
 
$(foreach modmodule,$(MODULES),$(eval include $(modmodule)/build.mk))
$(foreach modmodule,$(MODULES),$(eval $(call RULES_template,$(modmodule))))
$(foreach modmodule,$(MODULES),$(eval $(foreach binary,$($(module)_PROGRAMS),$(call INC_templatePROGRAM_template,$(modbinary),$(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:
Line 30 ⟶ 45:
 
mrproper: clean
$(RM) $(foreach mod,$(MODULES),$(mod)/obj/*.d) incincludes/* bin/* lib/*
</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 :=