> Кстати, какие сборочные инструменты нормально понимают генерацию сразу нескольких файлов?
> Все реализации make в этом месте сделаны через задницу, хотя стандарт не
> запрещает сделать правильно.реализация генерации сразу нескольких файлов на gnu make:
empty :=
define newline
$(empty)
$(empty)
endef
# processed multi-target rules
MULTI_TARGETS:=
# to count each call of $(MULTI_TARGET)
MULTI_TARGET_NUM:=
# when some tool generates many files, call the tool only once
# $1 - list of generated files
# $2 - prerequisites
# $3 - rule
define MULTI_TARGET_RULE
$1: $2;\
$$(if $$(filter $(words $(MULTI_TARGET_NUM)),$$(MULTI_TARGETS)),,$$(eval MULTI_TARGETS += $(words \
$(MULTI_TARGET_NUM)))$$(info generating: $$@)$$(subst $$$$(newline),$$(newline),$(subst \
$$(newline),$$$$(newline),$3$(foreach x,$1,$$(newline)touch $x))))
MULTI_TARGET_NUM += 1
endef
MULTI_TARGET_SEQ = $(if $(word 2,$1),$(word 2,$1): $(firstword $1)$(newline)$(call MULTI_TARGET_SEQ,$(wordlist 2,999999,$1)))
# NOTE: don't use $@ in rule because it may have different values,
# don't use $(lastword $^) - tail of list of prerequisites may have different values
MULTI_TARGET_CHECK = $(if $(filter-out $(words x$3x),$(words x$(subst $$@, ,$3)x)),$(info Warning: don't use $$@ in rule:$(newline)$3))$(if \
$(filter-out $(words x$(strip $3)x),$(words x$(subst $$(lastword $$^), 1 ,$(strip $3))x)),$(info Warning: don't use $$(lastword $$^) in rule:$(newline)$3))
# when some tool generates many files, call the tool only once
# $1 - list of generated files
# $2 - prerequisites
# $3 - rule
MULTI_TARGET = $(MULTI_TARGET_CHECK)$(eval $(MULTI_TARGET_SEQ)$(MULTI_TARGET_RULE))
$(call MULTI_TARGET,a1 a2 a3 a4 a5,dep1 dep2 dep3,echo 1 > a1; echo 2 > a2; echo 3 > a3; echo 4 > a4; echo 5 > a5)
dep1 dep2 dep3:; touch $@
all: a1 a2 a3 a4 a5
clean:; rm -f dep1 dep2 dep3 a1 a2 a3 a4 a5
Проверка:
$ make -f multi.mk -j5
touch dep1
touch dep2
touch dep3
generating: a1
echo 1 > a1; echo 2 > a2; echo 3 > a3; echo 4 > a4; echo 5 > a5
touch a1
touch a2
touch a3
touch a4
touch a5