|
OBJPREFIX := __objs_
|
|
|
|
.SECONDEXPANSION:
|
|
# -------------------- function begin --------------------
|
|
|
|
# list all files in some directories: (#directories, #types)
|
|
listf = $(filter $(if $(2),$(addprefix %.,$(2)),%),\
|
|
$(wildcard $(addsuffix $(SLASH)*,$(1))))
|
|
|
|
# get .o obj files: (#files[, packet])
|
|
toobj = $(addprefix $(OBJDIR)$(SLASH)$(if $(2),$(2)$(SLASH)),\
|
|
$(addsuffix .o,$(basename $(1))))
|
|
|
|
# get .d dependency files: (#files[, packet])
|
|
todep = $(patsubst %.o,%.d,$(call toobj,$(1),$(2)))
|
|
|
|
totarget = $(addprefix $(BINDIR)$(SLASH),$(1))
|
|
|
|
# change $(name) to $(OBJPREFIX)$(name): (#names)
|
|
packetname = $(if $(1),$(addprefix $(OBJPREFIX),$(1)),$(OBJPREFIX))
|
|
|
|
# cc compile template, generate rule for dep, obj: (file, cc[, flags, dir])
|
|
define cc_template
|
|
$$(call todep,$(1),$(4)): $(1) | $$$$(dir $$$$@)
|
|
@$(2) -I$$(dir $(1)) $(3) -MM $$< -MT "$$(patsubst %.d,%.o,$$@) $$@"> $$@
|
|
$$(call toobj,$(1),$(4)): $(1) | $$$$(dir $$$$@)
|
|
@echo + cc $$<
|
|
$(V)$(2) -I$$(dir $(1)) $(3) -c $$< -o $$@
|
|
ALLOBJS += $$(call toobj,$(1),$(4))
|
|
endef
|
|
|
|
# compile file: (#files, cc[, flags, dir])
|
|
define do_cc_compile
|
|
$$(foreach f,$(1),$$(eval $$(call cc_template,$$(f),$(2),$(3),$(4))))
|
|
endef
|
|
|
|
# add files to packet: (#files, cc[, flags, packet, dir])
|
|
define do_add_files_to_packet
|
|
__temp_packet__ := $(call packetname,$(4))
|
|
ifeq ($$(origin $$(__temp_packet__)),undefined)
|
|
$$(__temp_packet__) :=
|
|
endif
|
|
__temp_objs__ := $(call toobj,$(1),$(5))
|
|
$$(foreach f,$(1),$$(eval $$(call cc_template,$$(f),$(2),$(3),$(5))))
|
|
$$(__temp_packet__) += $$(__temp_objs__)
|
|
endef
|
|
|
|
# add objs to packet: (#objs, packet)
|
|
define do_add_objs_to_packet
|
|
__temp_packet__ := $(call packetname,$(2))
|
|
ifeq ($$(origin $$(__temp_packet__)),undefined)
|
|
$$(__temp_packet__) :=
|
|
endif
|
|
$$(__temp_packet__) += $(1)
|
|
endef
|
|
|
|
# add packets and objs to target (target, #packes, #objs[, cc, flags])
|
|
define do_create_target
|
|
__temp_target__ = $(call totarget,$(1))
|
|
__temp_objs__ = $$(foreach p,$(call packetname,$(2)),$$($$(p))) $(3)
|
|
TARGETS += $$(__temp_target__)
|
|
ifneq ($(4),)
|
|
$$(__temp_target__): $$(__temp_objs__) | $$$$(dir $$$$@)
|
|
$(V)$(4) $(5) $$^ -o $$@
|
|
else
|
|
$$(__temp_target__): $$(__temp_objs__) | $$$$(dir $$$$@)
|
|
endif
|
|
endef
|
|
|
|
# finish all
|
|
define do_finish_all
|
|
ALLDEPS = $$(ALLOBJS:.o=.d)
|
|
$$(sort $$(dir $$(ALLOBJS)) $(BINDIR)$(SLASH) $(OBJDIR)$(SLASH)):
|
|
@$(MKDIR) $$@
|
|
endef
|
|
|
|
# -------------------- function end --------------------
|
|
# compile file: (#files, cc[, flags, dir])
|
|
cc_compile = $(eval $(call do_cc_compile,$(1),$(2),$(3),$(4)))
|
|
|
|
# add files to packet: (#files, cc[, flags, packet, dir])
|
|
add_files = $(eval $(call do_add_files_to_packet,$(1),$(2),$(3),$(4),$(5)))
|
|
|
|
# add objs to packet: (#objs, packet)
|
|
add_objs = $(eval $(call do_add_objs_to_packet,$(1),$(2)))
|
|
|
|
# add packets and objs to target (target, #packes, #objs, cc, [, flags])
|
|
create_target = $(eval $(call do_create_target,$(1),$(2),$(3),$(4),$(5)))
|
|
|
|
read_packet = $(foreach p,$(call packetname,$(1)),$($(p)))
|
|
|
|
add_dependency = $(eval $(1): $(2))
|
|
|
|
finish_all = $(eval $(call do_finish_all))
|
|
|