Вам необходимо обновить OBJS
внутри ASSET_RULE
, потому что макрос сможет вернуть код make-файла только для $(eval)
. Я упустил все части вашего make-файла, которые не имеют отношения к рассматриваемой проблеме:
# $(1): source file name
define ASSET_RULE
_obj_name := $(addsuffix .o,$(basename $(1)))
$$(_obj_name): $(1)
$(LD) -r -b binary $$< -o $$@
OBJS += $$(_obj_name)
_obj_name :=
endef
# $(1): list of source files
BINARY_ASSETS = $(eval \
$(foreach _a,$(1), \
$(call ASSET_RULE,$(_a)) \
) \
)
ASSETS := \
avatar.jpg \
avatar2.png
OBJS :=
$(call BINARY_ASSETS,$(ASSETS))
.PHONY: all
all: $(OBJS)
Тестовый прогон, в котором я заменил eval
на info
, чтобы показать сгенерированный код:
$ make
_obj_name := avatar.o
$(_obj_name): avatar.jpg
ld -r -b binary $< -o $@
OBJS += $(_obj_name)
_obj_name :=
_obj_name := avatar2.o
$(_obj_name): avatar2.png
ld -r -b binary $< -o $@
OBJS += $(_obj_name)
_obj_name :=
make: Nothing to be done for 'all'.
Если вы хотите обновить различные переменные с помощью BINARY_ASSETS
, вам потребуется второй параметр для передачи имени переменной:
# $(1): source file name
# $(2): variable name to add object file name to
define ASSET_RULE
_obj_name := $(addsuffix .o,$(basename $(1)))
$$(_obj_name): $(1)
$(LD) -r -b binary $$< -o $$@
$(2) += $$(_obj_name)
_obj_name :=
endef
# $(1): list of source files
# $(2): variable name to add object file names to
BINARY_ASSETS = $(eval \
$(foreach _a,$(1), \
$(call ASSET_RULE,$(_a),$(2)) \
) \
)
$(call BINARY_ASSETS,$(ASSETS),OBJS)